package service import ( "encoding/hex" "mtp20_assisted/global" "mtp20_assisted/model" "mtp20_assisted/res/pb" "mtp20_assisted/utils" "strconv" "time" "github.com/nguyenthenguyen/docx" "go.uber.org/zap" "google.golang.org/protobuf/proto" ) // THJNtf 铁合通知处理模型 type THJNtf struct{} func (t *THJNtf) Process(msg *[]byte) { // 分解总线包信息 funcode := utils.BytesToUint32((*msg)[0:4]) sessionId := utils.BytesToUint32((*msg)[4:8]) bytes := (*msg)[8:] global.M2A_LOG.Info("[S->C]", zap.Any("funcode", funcode), zap.Any("sessionId", sessionId), zap.Any("count", len(bytes))) switch funcode { case uint32(global.THJPurchaseTradeNtf): // 等待两秒 <-time.After(2 * time.Second) onTHJPurchaseTradeNtf(&bytes) } } // onTHJPurchaseTradeNtf 铁合金成交通知 func onTHJPurchaseTradeNtf(bytes *[]byte) { // Read from docx file r, err := docx.ReadDocxFile("./static/现货预售合同.doc") if err != nil { global.M2A_LOG.Error("读取合同文件失败", zap.Error(err)) return } var p pb.THJPurchaseTradeNtf if err := proto.Unmarshal(*bytes, &p); err != nil { global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err)) return } // 铁合金采购成交扩展信息 thjpurchasetradedetail := model.Thjpurchasetradedetail{WRTRADEDETAILID: int64(p.GetWRTradeDetailID())} if has, err := thjpurchasetradedetail.Get(); err != nil || !has { global.M2A_LOG.Error("[onTHJPurchaseTradeNtf] 获取铁合金采购成交扩展信息失败", zap.Error(err)) return } // 交割方式 thjdeliverymode := "否" if thjpurchasetradedetail.THJDELIVERYMODE == 1 { thjdeliverymode = "是" } // 现货商品信息 wrstandard := model.Wrstandard{WRSTANDARDID: int64(thjpurchasetradedetail.WRSTANDARDID)} if has, err := wrstandard.Get(); err != nil || !has { global.M2A_LOG.Error("[onTHJPurchaseTradeNtf] 获取现货商品信息失败", zap.Error(err)) return } // 仓单预售信息 wrpresaleinfo := model.Wrpresaleinfo{PRESALEAPPLYID: thjpurchasetradedetail.PRESALEAPPLYID} if has, err := wrpresaleinfo.Get(); err != nil || !has { global.M2A_LOG.Error("[onTHJPurchaseTradeNtf] 获取仓单预售信息失败", zap.Error(err)) return } // 甲方信息 userinfo := model.Userinfo{USERID: thjpurchasetradedetail.BUYUSERID} if has, err := userinfo.Get(); err != nil || !has { global.M2A_LOG.Error("[onTHJPurchaseTradeNtf] 获取甲方信息失败", zap.Error(err)) return } division := model.Division{AUTOID: int64(userinfo.DISTRICTID)} totalAddress, err := division.GetTotalAddressByDistrictID(userinfo.ADDRESS) if err != nil { global.M2A_LOG.Error("[onTHJPurchaseTradeNtf] 获取甲方地址信息失败", zap.Error(err)) return } // 证件号码解密 key, _ := hex.DecodeString(utils.AESSecretKey) if len(userinfo.CARDNUM) > 0 { if cardnum, err := hex.DecodeString(userinfo.CARDNUM); err == nil { // hex -> []byte if c, err := utils.AESDecrypt(cardnum, key); err == nil { userinfo.CARDNUM = string(c) } } } // 手机号码解密 if len(userinfo.MOBILE) > 0 { if phonenum, err := hex.DecodeString(userinfo.MOBILE); err == nil { // hex -> []byte if mobile, err := utils.AESDecrypt(phonenum, key); err == nil { userinfo.MOBILE = string(mobile) } } } // 甲方签约信息 bankaccountsign := model.Bankaccountsign{} if has, err := bankaccountsign.GetByUserID(uint64(thjpurchasetradedetail.BUYUSERID)); err != nil || !has { global.M2A_LOG.Error("[onTHJPurchaseTradeNtf] 获取甲方签约信息失败", zap.Error(err)) return } // 银行信息 bankinfo := model.Bankbankinfo{BANKID: bankaccountsign.BANKID} if has, err := bankinfo.Get(); err != nil || !has { global.M2A_LOG.Error("[onTHJPurchaseTradeNtf] 获取银行信息失败", zap.Error(err)) return } // 生产厂家信息 selluserinfo := model.Userinfo{USERID: thjpurchasetradedetail.SELLUSERID} if has, err := selluserinfo.Get(); err != nil || !has { global.M2A_LOG.Error("[onTHJPurchaseTradeNtf] 获取生产厂家信息失败", zap.Error(err)) return } docx1 := r.Editable() docx1.Replace("${WRTRADEDETAILID}", strconv.Itoa(int(thjpurchasetradedetail.WRTRADEDETAILID)), -1) docx1.Replace("${TRADETIME}", thjpurchasetradedetail.TRADETIME.Format("2006年01月02日"), -1) docx1.Replace("${DESADDRESS}", totalAddress, -1) docx1.Replace("${CUSTOMERNAME}", userinfo.CUSTOMERNAME, -1) docx1.Replace("${CARDNUM}", userinfo.CARDNUM, -1) docx1.Replace("${MOBILE}", userinfo.MOBILE, -1) docx1.Replace("${BANK}", bankinfo.BANKNAME, -1) docx1.Replace("${BANKACCOUNTNO}", bankaccountsign.BANKACCOUNTNO, -1) docx1.Replace("${WRSTANDARDNAME}", wrstandard.WRSTANDARDNAME, -1) docx1.Replace("${SELLUSER}", selluserinfo.CUSTOMERNAME, -1) docx1.Replace("${LASTAMOUNT}", strconv.FormatFloat(thjpurchasetradedetail.LASTAMOUNT, 'f', -1, 64), -1) docx1.Replace("${DEPOSITRATE}", strconv.FormatFloat(thjpurchasetradedetail.DEPOSITRATE, 'f', -1, 64), -1) docx1.Replace("${TRADEQTY}", strconv.Itoa(int(thjpurchasetradedetail.TRADEQTY)), -1) docx1.Replace("${TRADEPRICE}", strconv.FormatFloat(thjpurchasetradedetail.TRADEPRICE, 'f', -1, 64), -1) docx1.Replace("${ENDDATEMONTH}", strconv.Itoa(int(wrpresaleinfo.ENDDATE.Local().Month())), -1) docx1.Replace("${THJDELIVERYMODE}", thjdeliverymode, -1) docx1.Replace("${ENDDATE}", wrpresaleinfo.ENDDATE.Format("2006年01月"), -1) docx1.Replace("${STORAGEFEE}", strconv.FormatFloat(wrstandard.STORAGEFEE, 'f', -1, 64), -1) docx1.WriteToFile("./new_result_1.doc") r.Close() }