Merge branch 'jdshop' of e.coding.net:rosydev/jx-callback into jdshop

This commit is contained in:
邹宗楠
2024-01-18 11:30:19 +08:00
2 changed files with 98 additions and 1 deletions

View File

@@ -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
}

View File

@@ -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过期时间
)