thjNtf.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. package service
  2. import (
  3. "encoding/hex"
  4. "mtp20_assisted/global"
  5. "mtp20_assisted/model"
  6. "mtp20_assisted/res/pb"
  7. "mtp20_assisted/utils"
  8. "strconv"
  9. "time"
  10. "github.com/nguyenthenguyen/docx"
  11. "go.uber.org/zap"
  12. "google.golang.org/protobuf/proto"
  13. )
  14. // THJNtf 铁合通知处理模型
  15. type THJNtf struct{}
  16. func (t *THJNtf) Process(msg *[]byte) {
  17. // 分解总线包信息
  18. funcode := utils.BytesToUint32((*msg)[0:4])
  19. sessionId := utils.BytesToUint32((*msg)[4:8])
  20. bytes := (*msg)[8:]
  21. global.M2A_LOG.Info("[S->C]", zap.Any("funcode", funcode), zap.Any("sessionId", sessionId), zap.Any("count", len(bytes)))
  22. switch funcode {
  23. case uint32(global.THJPurchaseTradeNtf):
  24. // 等待两秒
  25. <-time.After(2 * time.Second)
  26. onTHJPurchaseTradeNtf(&bytes)
  27. }
  28. }
  29. // onTHJPurchaseTradeNtf 铁合金成交通知
  30. func onTHJPurchaseTradeNtf(bytes *[]byte) {
  31. // Read from docx file
  32. r, err := docx.ReadDocxFile("./static/现货预售合同.doc")
  33. if err != nil {
  34. global.M2A_LOG.Error("读取合同文件失败", zap.Error(err))
  35. return
  36. }
  37. var p pb.THJPurchaseTradeNtf
  38. if err := proto.Unmarshal(*bytes, &p); err != nil {
  39. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  40. return
  41. }
  42. // 铁合金采购成交扩展信息
  43. thjpurchasetradedetail := model.Thjpurchasetradedetail{WRTRADEDETAILID: int64(p.GetWRTradeDetailID())}
  44. if has, err := thjpurchasetradedetail.Get(); err != nil || !has {
  45. global.M2A_LOG.Error("[onTHJPurchaseTradeNtf] 获取铁合金采购成交扩展信息失败", zap.Error(err))
  46. return
  47. }
  48. // 交割方式
  49. thjdeliverymode := "否"
  50. if thjpurchasetradedetail.THJDELIVERYMODE == 1 {
  51. thjdeliverymode = "是"
  52. }
  53. // 现货商品信息
  54. wrstandard := model.Wrstandard{WRSTANDARDID: int64(thjpurchasetradedetail.WRSTANDARDID)}
  55. if has, err := wrstandard.Get(); err != nil || !has {
  56. global.M2A_LOG.Error("[onTHJPurchaseTradeNtf] 获取现货商品信息失败", zap.Error(err))
  57. return
  58. }
  59. // 仓单预售信息
  60. wrpresaleinfo := model.Wrpresaleinfo{PRESALEAPPLYID: thjpurchasetradedetail.PRESALEAPPLYID}
  61. if has, err := wrpresaleinfo.Get(); err != nil || !has {
  62. global.M2A_LOG.Error("[onTHJPurchaseTradeNtf] 获取仓单预售信息失败", zap.Error(err))
  63. return
  64. }
  65. // 甲方信息
  66. userinfo := model.Userinfo{USERID: thjpurchasetradedetail.BUYUSERID}
  67. if has, err := userinfo.Get(); err != nil || !has {
  68. global.M2A_LOG.Error("[onTHJPurchaseTradeNtf] 获取甲方信息失败", zap.Error(err))
  69. return
  70. }
  71. division := model.Division{AUTOID: int64(userinfo.DISTRICTID)}
  72. totalAddress, err := division.GetTotalAddressByDistrictID(userinfo.ADDRESS)
  73. if err != nil {
  74. global.M2A_LOG.Error("[onTHJPurchaseTradeNtf] 获取甲方地址信息失败", zap.Error(err))
  75. return
  76. }
  77. // 证件号码解密
  78. key, _ := hex.DecodeString(utils.AESSecretKey)
  79. if len(userinfo.CARDNUM) > 0 {
  80. if cardnum, err := hex.DecodeString(userinfo.CARDNUM); err == nil { // hex -> []byte
  81. if c, err := utils.AESDecrypt(cardnum, key); err == nil {
  82. userinfo.CARDNUM = string(c)
  83. }
  84. }
  85. }
  86. // 手机号码解密
  87. if len(userinfo.MOBILE) > 0 {
  88. if phonenum, err := hex.DecodeString(userinfo.MOBILE); err == nil { // hex -> []byte
  89. if mobile, err := utils.AESDecrypt(phonenum, key); err == nil {
  90. userinfo.MOBILE = string(mobile)
  91. }
  92. }
  93. }
  94. // 甲方签约信息
  95. bankaccountsign := model.Bankaccountsign{}
  96. if has, err := bankaccountsign.GetByUserID(uint64(thjpurchasetradedetail.BUYUSERID)); err != nil || !has {
  97. global.M2A_LOG.Error("[onTHJPurchaseTradeNtf] 获取甲方签约信息失败", zap.Error(err))
  98. return
  99. }
  100. // 银行信息
  101. bankinfo := model.Bankbankinfo{BANKID: bankaccountsign.BANKID}
  102. if has, err := bankinfo.Get(); err != nil || !has {
  103. global.M2A_LOG.Error("[onTHJPurchaseTradeNtf] 获取银行信息失败", zap.Error(err))
  104. return
  105. }
  106. // 生产厂家信息
  107. selluserinfo := model.Userinfo{USERID: thjpurchasetradedetail.SELLUSERID}
  108. if has, err := selluserinfo.Get(); err != nil || !has {
  109. global.M2A_LOG.Error("[onTHJPurchaseTradeNtf] 获取生产厂家信息失败", zap.Error(err))
  110. return
  111. }
  112. docx1 := r.Editable()
  113. docx1.Replace("${WRTRADEDETAILID}", strconv.Itoa(int(thjpurchasetradedetail.WRTRADEDETAILID)), -1)
  114. docx1.Replace("${TRADETIME}", thjpurchasetradedetail.TRADETIME.Format("2006年01月02日"), -1)
  115. docx1.Replace("${DESADDRESS}", totalAddress, -1)
  116. docx1.Replace("${CUSTOMERNAME}", userinfo.CUSTOMERNAME, -1)
  117. docx1.Replace("${CARDNUM}", userinfo.CARDNUM, -1)
  118. docx1.Replace("${MOBILE}", userinfo.MOBILE, -1)
  119. docx1.Replace("${BANK}", bankinfo.BANKNAME, -1)
  120. docx1.Replace("${BANKACCOUNTNO}", bankaccountsign.BANKACCOUNTNO, -1)
  121. docx1.Replace("${WRSTANDARDNAME}", wrstandard.WRSTANDARDNAME, -1)
  122. docx1.Replace("${SELLUSER}", selluserinfo.CUSTOMERNAME, -1)
  123. docx1.Replace("${LASTAMOUNT}", strconv.FormatFloat(thjpurchasetradedetail.LASTAMOUNT, 'f', -1, 64), -1)
  124. docx1.Replace("${DEPOSITRATE}", strconv.FormatFloat(thjpurchasetradedetail.DEPOSITRATE, 'f', -1, 64), -1)
  125. docx1.Replace("${TRADEQTY}", strconv.Itoa(int(thjpurchasetradedetail.TRADEQTY)), -1)
  126. docx1.Replace("${TRADEPRICE}", strconv.FormatFloat(thjpurchasetradedetail.TRADEPRICE, 'f', -1, 64), -1)
  127. docx1.Replace("${ENDDATEMONTH}", strconv.Itoa(int(wrpresaleinfo.ENDDATE.Local().Month())), -1)
  128. docx1.Replace("${THJDELIVERYMODE}", thjdeliverymode, -1)
  129. docx1.Replace("${ENDDATE}", wrpresaleinfo.ENDDATE.Format("2006年01月"), -1)
  130. docx1.Replace("${STORAGEFEE}", strconv.FormatFloat(wrstandard.STORAGEFEE, 'f', -1, 64), -1)
  131. docx1.WriteToFile("./new_result_1.doc")
  132. r.Close()
  133. }