diff --git a/business/partner/im/im.go b/business/partner/im/im.go index 0acfd5876..99052b63b 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" @@ -221,6 +223,7 @@ func ReadMsgFromVendor(vendorID int, elmAppID string, msg []byte) error { userList.OrderID = utils.Int2Str(PushContentReq.OrderID) } } + if vendorID == VendorIDELM { var ElmData = ebaiapi.ImMessageSend{} err = json.Unmarshal(msg, &ElmData) @@ -250,6 +253,10 @@ func ReadMsgFromVendor(vendorID int, elmAppID string, msg []byte) error { if err = PushMsgByCid(vendorStoreID, vendorID, string(msg)); err != nil { errList.AddErr(fmt.Errorf("向商家cid推送新消息错误:%v", err)) } + //4 客服自动回复 + if err = CheckAndReply(jxMsg, elmAppID); err != nil { + errList.AddErr(fmt.Errorf("客服自动回复出错:%v", err)) + } if errList.GetErrListAsOne() != nil { return fmt.Errorf("ReadMsgFromVendor:%v", errList.GetErrListAsOne()) @@ -356,6 +363,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 +504,74 @@ 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, elmAppID 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.LRange(key) + for i := 0; i < len(str); i++ { + v := AutoReply{} + if err = json.Unmarshal([]byte(str[i]), &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, utils.Int2Str(mt.AppID)).(*mtwmapi.API).MsgSend(string(dataStr)); err != nil { + apply.IsApply = false + globals.SugarLogger.Debugf("CheckAndReply mtSend err:%v", err) + } + + //记录自动回复状态 + data, _ := json.Marshal(apply) + err := rdb.RPush(key, string(data)) + ok, err := rdb.ExpireResult(key, ExpireTimeDay) + if err != nil || !ok { + 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..576b88b36 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-饿了么 @@ -52,5 +58,5 @@ var ( ) const ( - ExpireTimeDay = 6 * time.Hour //redis过期时间 + ExpireTimeDay = 12 * time.Hour //redis过期时间 )