Merge branch 'jdshop' of e.coding.net:rosydev/jx-callback into jdshop
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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过期时间
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user