diff --git a/business/partner/im/im.go b/business/partner/im/im.go index 0acfd5876..dbaf765da 100644 --- a/business/partner/im/im.go +++ b/business/partner/im/im.go @@ -1,10 +1,12 @@ package im import ( + "crypto/rand" "encoding/base64" "encoding/json" "errors" "fmt" + "math/big" "strings" "time" @@ -220,6 +222,9 @@ func ReadMsgFromVendor(vendorID int, elmAppID string, msg []byte) error { if PushContentReq.OrderID != 0 { userList.OrderID = utils.Int2Str(PushContentReq.OrderID) } + + //todo 增加美团自动回复 + } if vendorID == VendorIDELM { var ElmData = ebaiapi.ImMessageSend{} @@ -356,6 +361,19 @@ func GenMsgListID(jxMsg *JXMsg, vendorID int, elmAppID string) (msgID string) { return msgID } +// GenIsAutoApplyID 生成获取消息自动回复状态 +func GenIsAutoApplyID(jxMsg *JXMsg, vendorID int) (msgID string) { + if vendorID == VendorIDMT { + var d1 = jxMsg.MsgContent.(mtwmapi.PushContentReq) + msgID = utils.Int2Str(d1.AppID) + ":" + utils.Int2Str(d1.OpenUserID) + ":" + utils.Int2Str(d1.MsgID) + } + if vendorID == VendorIDELM { + var d2 = jxMsg.MsgContent.(ebaiapi.ImMessageSend) + msgID = d2.PayLoad.MsgID + ":" + d2.PayLoad.SenderID + } + return msgID +} + // GetImUserList 获取门店用户聊天列表 func GetImUserList(req []RelInfo) (map[string][]interface{}, error) { retVal := make(map[string][]interface{}, 0) @@ -484,3 +502,70 @@ func FilterIm(appID int, msg string) bool { } return false } + +// RandTimeNumber 生成int类型 随机数+时间戳 +func RandTimeNumber() int { + num, _ := rand.Int(rand.Reader, big.NewInt(100000)) + str := utils.Int64ToStr(num.Int64()) + utils.Int2Str(int(time.Now().Unix())) + return utils.Str2Int(str) +} + +// AutoReply 是否已回复 +//key=AppID+:+UserID+:+msgID(mt) +//key=AppID+:+UserID+:+msgID(elm) +type AutoReply struct { + UserID int `json:"userID"` + MsgID int `json:"msgID"` //消息ID + IsApply bool `json:"IsApply"` //是否已回复 + Timestamp int `json:"timestamp"` //消息接收时间 +} + +// CheckAndReply 判断并回复 +func CheckAndReply(req *JXMsg, vendorOrgCode string) (err error) { + flag := false + if req.SendType == SendTypeMt { + mt := req.MsgContent.(mtwmapi.PushContentReq) + key := utils.Int2Str(mt.AppID) + ":" + utils.Int2Str(mt.OpenUserID) + ":autoReply" + //1 检测是否已有回复消息 + if n, err := rdb.Exists(key); n > 0 && err == nil { + str := rdb.Get(key).(string) + v := AutoReply{} + if err = json.Unmarshal([]byte(str), &v); err == nil { + flag = v.IsApply + } + } + + //判断flag状态 + if !flag { + apply := AutoReply{ + UserID: mt.AppID, + MsgID: mt.MsgID, + IsApply: true, + Timestamp: mt.Cts, + } + + temp := mt + temp.MsgContent = AutoReplyByAppID[mt.AppID] + temp.Cts = int(time.Now().Unix()) + temp.MsgID = RandTimeNumber() + + dataStr, _ := json.Marshal(temp) + if _, err = partner.CurAPIManager.GetAPI(model.VendorIDMTWM, vendorOrgCode).(*mtwmapi.API).MsgSend(string(dataStr)); err != nil { + apply.IsApply = false + globals.SugarLogger.Debugf("CheckAndReply mtSend err:%v", err) + } + + //记录自动回复状态 + data, _ := json.Marshal(apply) + if err := rdb.RPush(key, string(data)); err != nil { + globals.SugarLogger.Debugf("CheckAndReply apply err:%v", err) + return err + } + } + } + + //if req.SendType == SendTypeElm { + // + //} + return nil +} diff --git a/business/partner/im/im_model.go b/business/partner/im/im_model.go index 85acade5f..7c231d4c4 100644 --- a/business/partner/im/im_model.go +++ b/business/partner/im/im_model.go @@ -6,6 +6,12 @@ import ( "git.rosy.net.cn/jx-callback/globals/api" ) +var AutoReplyByAppID = map[int]string{ + 589: "QPMenQQVcXBZ4vbwAw6jJBHVBCB2jQCGOfR5yI1cSRbdvc6VMEW9G/zCvTY7YOeCeKuo8HbB03TQHS3Y4ygGPwW40ppeJ+D1+dUeOGwy+ik=", + 5873: "eCGDImGw4qAQDZPxzjVzKZUI+mRSnrPSjYo5iOVzcX3H4h1Y8F/J5SPahKARqLPDN9Ez7o46JgUMK997jTId6UVmA5VPtYjrM6Zqjlzf9EY=", + 4123: "fu4TXW2odzkbvVDZZZU0gZAOw/cI+7fSU/U9NRv5Q1JQpmeLPmrdgpDxHelGijuRfM+PD+5nmV7jrHqOXxzAiJBPcU50Da014sQHH/Tn/P8=", +} + // SendData 客户端写入参数 type SendData struct { VendorID int `json:"vendorID"` //消息来源平台ID 1-美团 3-饿了么