package im import ( "crypto/rand" "encoding/base64" "encoding/json" "errors" "fmt" "math/big" "strings" "time" "github.com/astaxie/beego/client/orm" "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/baseapi/utils/errlist" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/baseapi/platformapi/ebaiapi" "git.rosy.net.cn/baseapi/platformapi/mtwmapi" "git.rosy.net.cn/baseapi/utils" push "git.rosy.net.cn/jx-callback/business/jxutils/unipush" ) func SendVendorV2(data SendData, vendorOrgCode string) (err error) { if data.VendorID == model.VendorIDMTWM { dataStr, _ := json.Marshal(data.Data) temp := string(dataStr) globals.SugarLogger.Debugf("SendVendorV2 mtwmtemp=%s", temp) if _, err = partner.CurAPIManager.GetAPI(model.VendorIDMTWM, vendorOrgCode).(*mtwmapi.API).MsgSend(string(dataStr)); err != nil { return err } } if data.VendorID == model.VendorIDEBAI { str, _ := json.Marshal(data.Data) param := &ebaiapi.BusinessSendMsgReq{} err = json.Unmarshal(str, ¶m) globals.SugarLogger.Debugf("SendVendorV2 ebaiparam=%s", utils.Format4Output(param, false)) err = partner.CurAPIManager.GetAPI(model.VendorIDEBAI, vendorOrgCode).(*ebaiapi.API).BusinessSendMsg(param) } err = ReadMsgFromClient(data.VendorID, vendorOrgCode, data.Data) if err != nil { globals.SugarLogger.Debugf("SendVendorV2:%v", err) } return nil } type GetPoiIMStatusReq struct { VendorID int `json:"vendorID"` VendorStoreID string `json:"vendorStoreID"` VendorOrgCode string `json:"vendorOrgCode"` } type GetPoiIMStatusResp struct { VendorID int `json:"vendorID"` ImStatus int `json:"imStatus"` ErrMsg string `json:"errMsg"` } // GetPoiIMStatus 查询门店IM单聊开关状态 func GetPoiIMStatus(param []GetPoiIMStatusReq) (retVal []*GetPoiIMStatusResp) { var ( ans1 = &GetPoiIMStatusResp{} ans2 = &GetPoiIMStatusResp{} ) if len(param) == 0 { return nil } for _, v := range param { switch v.VendorID { case model.VendorIDMTWM: temp, err := partner.CurAPIManager.GetAPI(model.VendorIDMTWM, v.VendorOrgCode).(*mtwmapi.API).GetPoiIMStatus(v.VendorStoreID) if err != nil { ans1.ErrMsg = fmt.Sprintf("1:%v", err) continue } ans1.VendorID = model.VendorIDMTWM ans1.ImStatus = temp.ImStatus case model.VendorIDEBAI: status, err := partner.CurAPIManager.GetAPI(model.VendorIDEBAI, v.VendorOrgCode).(*ebaiapi.API).GetStoreIMStatus(v.VendorStoreID) if err != nil { ans1.ErrMsg = fmt.Sprintf("3:%v", err) continue } ans2.VendorID = model.VendorIDEBAI ans2.ImStatus = utils.Str2Int(status) } } retVal = append(retVal, ans1, ans2) return retVal } type SetPoiIMStatusReq struct { VendorID int `json:"vendorID"` VendorStoreID string `json:"vendorStoreID"` VendorOrgCode string `json:"vendorOrgCode"` ImStatus int `json:"imStatus"` } // SetPoiIMStatus 设置平台门店im状态 func SetPoiIMStatus(param []SetPoiIMStatusReq) error { var errList errlist.ErrList if len(param) == 0 { return nil } for _, v := range param { switch v.VendorID { case model.VendorIDMTWM: if err := partner.CurAPIManager.GetAPI(model.VendorIDMTWM, v.VendorOrgCode).(*mtwmapi.API).SetPoiIMStatus(v.VendorStoreID, v.ImStatus); err != nil { errList.AddErr(fmt.Errorf("mtwm:%v", err)) } case model.VendorIDEBAI: if err := partner.CurAPIManager.GetAPI(model.VendorIDEBAI, v.VendorOrgCode).(*ebaiapi.API).UpdateIMStatus(v.VendorStoreID, v.ImStatus); err != nil { errList.AddErr(fmt.Errorf("ebai:%v", err)) } } } return errList.GetErrListAsOne() } // ReadMsgFromClient 存储客户端发送的消息 func ReadMsgFromClient(vendorID int, elmAppID string, msg interface{}) error { var ( err error elmTime int jxMsg = &JXMsg{} errList errlist.ErrList userList = &UserMessageList{} ) data, err := json.Marshal(msg) if err != nil { errList.AddErr(fmt.Errorf("json处理数据错误:%v", err)) } if vendorID == VendorIDMT { var pushContent = mtwmapi.PushContentReq{} err = json.Unmarshal(data, &pushContent) jxMsg = &JXMsg{ SendType: SendTypeJx, MsgContent: pushContent, } userList = &UserMessageList{ VendorID: VendorIDMT, UserID: utils.Int2Str(pushContent.OpenUserID), LatestMsg: pushContent.MsgContent, LatestTime: pushContent.Cts, OrderID: "", } if pushContent.OrderID != 0 { userList.OrderID = utils.Int2Str(pushContent.OrderID) } } if vendorID == VendorIDELM { var ElmData = ebaiapi.ImMessageSend{} err = json.Unmarshal(data, &ElmData) jxMsg = &JXMsg{ SendType: SendTypeJx, MsgContent: ElmData, } if ElmData.PayLoad.CreateTime == 0 { elmTime = int(time.Now().Unix()) } userList = &UserMessageList{ VendorID: VendorIDELM, UserID: ElmData.PayLoad.GroupID, LatestMsg: ElmData.PayLoad.Content, LatestTime: elmTime, } } //1 存储展示列表时单条数据 if err = SetMessageDetail(jxMsg, vendorID, elmAppID); err != nil { errList.AddErr(fmt.Errorf("存储详细聊天记录错误:%v", err)) } //2 存储详细聊天记录list if err = SetUserList(jxMsg, userList, vendorID, elmAppID); err != nil { errList.AddErr(fmt.Errorf("存储STU聊天记录错误:%v", err)) } if errList.GetErrListAsOne() != nil { return fmt.Errorf("ReadMsgFromClient:%v", errList.GetErrListAsOne()) } return nil } // ReadMsgFromVendor 读取数据并存储到redis func ReadMsgFromVendor(vendorID int, elmAppID string, msg []byte) error { var ( err error jxMsg = &JXMsg{} vendorStoreID string errList errlist.ErrList userList = &UserMessageList{} ) if len(string(msg)) == 0 { errList.AddErr(fmt.Errorf("读取平台数据为空,请检查")) } if vendorID == VendorIDMT { var PushContentReq = mtwmapi.PushContentReq{} err = json.Unmarshal(msg, &PushContentReq) if len(PushContentReq.MsgContent) != 0 || PushContentReq.MsgContent != "" { if FilterIm(PushContentReq.AppID, PushContentReq.MsgContent) { //自动回复消息过滤 return nil } } jxMsg = &JXMsg{ SendType: SendTypeMt, MsgContent: PushContentReq, } userList = &UserMessageList{ VendorID: VendorIDMT, UserID: utils.Int2Str(PushContentReq.OpenUserID), LatestMsg: PushContentReq.MsgContent, LatestTime: PushContentReq.Cts, OrderID: "", } vendorStoreID = PushContentReq.AppPoiCode if PushContentReq.OrderID != 0 { userList.OrderID = utils.Int2Str(PushContentReq.OrderID) } } if vendorID == VendorIDELM { var ElmData = ebaiapi.ImMessageSend{} err = json.Unmarshal(msg, &ElmData) jxMsg = &JXMsg{ SendType: SendTypeElm, MsgContent: ElmData, } userList = &UserMessageList{ VendorID: VendorIDELM, UserID: ElmData.PayLoad.GroupID, LatestMsg: ElmData.PayLoad.Content, LatestTime: int(ElmData.PayLoad.CreateTime / 1000), } globals.SugarLogger.Debugf("elm userList=%s", utils.Format4Output(userList, false)) } //1 存储详细聊天记录list if err = SetMessageDetail(jxMsg, vendorID, elmAppID); err != nil { errList.AddErr(fmt.Errorf("存储详细聊天记录错误:%v", err)) } //2 存储展示列表时单条数据 if err = SetUserList(jxMsg, userList, vendorID, elmAppID); err != nil { errList.AddErr(fmt.Errorf("存储STU聊天记录错误:%v", err)) } //3 cid推送新消息 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()) } return nil } // PushMsgByCid 通过cid push用户 func PushMsgByCid(vendorStoreID string, vendorID int, msg string) error { if err := push.NotifyImNewMessage(vendorStoreID, vendorID, msg); err != nil { return err } return nil } // SetMessageDetail 赋值 //格式 AppID:AppPoiCode:1:OpenUserID func SetMessageDetail(req *JXMsg, vendorID int, elmAppID string) error { if req == nil { return nil } //生成京西消息ID detail msgID := GenMsgDetailID(req, vendorID, elmAppID) if len(msgID) == 0 { return nil } data, _ := json.Marshal(req) globals.SugarLogger.Debugf("SetMessageDetail data=%s", string(data)) err := rdb.RPush(msgID, string(data)) ok, err := rdb.ExpireResult(msgID, ExpireTimeDay) if err != nil || !ok { return err } return nil } // SetUserList 赋值 //AppPoiCode:10 [userid1:{SingleChat},userid2:{}] func SetUserList(jxMsg *JXMsg, userList *UserMessageList, vendorID int, elmAppID string) error { //生成msgID msgID := GenMsgListID(jxMsg, vendorID, elmAppID) if len(msgID) == 0 { return nil } //获取未读消息条数并删除旧数据 cnt, err := GetNewAndTrim(msgID, userList.UserID) if cnt > 0 { userList.NewMessageNum = cnt } else { userList.NewMessageNum = 1 } //存储当前数据 data, _ := json.Marshal(userList) globals.SugarLogger.Debugf("SetUserList data=%s", string(data)) err = rdb.RPush(msgID, string(data)) ok, err := rdb.ExpireResult(msgID, ExpireTimeDay) if err != nil || !ok { return err } return nil } // GetNewAndTrim 获取未读条数并清除旧数据 func GetNewAndTrim(key string, flag string) (cnt int, err error) { cnt = 0 if n, err := rdb.Exists(key); n > 0 && err == nil { s2 := rdb.LRange(key) for i := 0; i < len(s2); i++ { v := UserMessageList{} _ = json.Unmarshal([]byte(s2[i]), &v) if v.UserID == flag { err = rdb.LSet(key, i, "del") err = rdb.LRem(key, 0, "del") s2 = append(s2[:i], s2[i+1:]...) i-- if v.NewMessageNum == 0 { //目前为首条 cnt++ //赋值1 } else { cnt = v.NewMessageNum } } } } else { return 0, nil } return cnt, err } // GenMsgDetailID 生成查询详细聊天记录ID func GenMsgDetailID(jxMsg *JXMsg, vendorID int, elmAppID string) (msgID string) { //globals.SugarLogger.Debugf("GenMsgDetailID test0124 jxMsg=%s", utils.Format4Output(jxMsg, false)) if jxMsg == nil { return "" } if vendorID == VendorIDMT { var d1 = jxMsg.MsgContent.(mtwmapi.PushContentReq) msgID = utils.Int2Str(d1.AppID) + ":" + d1.AppPoiCode + ":1:" + utils.Int2Str(d1.OpenUserID) } if vendorID == VendorIDELM { var ElmData = ebaiapi.ImMessageSend{} tempMsgContent, _ := json.Marshal(jxMsg.MsgContent) if err := json.Unmarshal(tempMsgContent, &ElmData); err != nil { return "" } //var d2 = jxMsg.MsgContent.(ebaiapi.ImMessageSend) //msgID = elmAppID + ":" + d2.PlatformShopID + ":3:" + d2.PayLoad.GroupID msgID = elmAppID + ":" + ElmData.PlatformShopID + ":3:" + ElmData.PayLoad.GroupID } return msgID } // GenMsgListID 生成展示列表时单条数据ID(部分) func GenMsgListID(jxMsg *JXMsg, vendorID int, elmAppID string) (msgID string) { //globals.SugarLogger.Debugf("GenMsgListID test0124 jxMsg=%s,vendorID=%d", utils.Format4Output(jxMsg, false), vendorID) if jxMsg == nil { return "" } if vendorID == VendorIDMT { var d1 = jxMsg.MsgContent.(mtwmapi.PushContentReq) msgID = utils.Int2Str(d1.AppID) + ":" + d1.AppPoiCode + ":1" } if vendorID == VendorIDELM { var ElmData = ebaiapi.ImMessageSend{} tempMsgContent, _ := json.Marshal(jxMsg.MsgContent) err := json.Unmarshal(tempMsgContent, &ElmData) fmt.Println(err) //var d2 = jxMsg.MsgContent.(ebaiapi.ImMessageSend) //msgID = elmAppID + ":" + d2.PlatformShopID + ":3" msgID = elmAppID + ":" + ElmData.PlatformShopID + ":3" } return msgID } // GetImUserList 获取门店用户聊天列表 func GetImUserList(req []RelInfo) (map[string][]interface{}, error) { retVal := make(map[string][]interface{}, 0) if len(req) == 0 { return nil, errors.New("msgID不允许为空") } var keys []string for _, i := range req { key := i.AppID + ":" + i.VendorStoreID + ":" + i.VendorID keys = append(keys, key) } for _, j := range keys { temp := rdb.LRange(j) for _, v := range temp { //过滤过期信息 if FilterUserList(v) { retVal[j] = append(retVal[j], v) } } } return retVal, nil } func FilterUserList(val string) bool { retVal := UserMessageList{} err := json.Unmarshal([]byte(val), &retVal) if err != nil || time.Now().Unix()-int64(retVal.LatestTime) >= 3600*6 { return false } return true } // FilterChatDetail 去重 func FilterChatDetail(req *JXMsg, vendorID int) { //if vendorID == VendorIDMT { // mt := req.MsgContent.(mtwmapi.PushContentReq) // temp, _ := GetImChatDetail([]UserRelInfo{{ // VendorStoreID: mt.AppPoiCode, // VendorID: "1", // AppID: utils.Int2Str(mt.AppID), // UserID: utils.Int2Str(mt.OpenUserID), // }}) // //} // //if vendorID == VendorIDELM { // elm := req.MsgContent.(ebaiapi.ImMessageSend) // temp, _ := GetImChatDetail([]UserRelInfo{{ // VendorStoreID: elm.PlatformShopID, // VendorID: "3", // AppID: "34665", // UserID: elm.PayLoad.SenderID, // }}) //} } // GetImChatDetail 获取门店用户聊天详情 func GetImChatDetail(req []UserRelInfo) (map[string][]interface{}, error) { retVal := make(map[string][]interface{}, 0) if len(req) == 0 { return nil, errors.New("msgID不允许为空") } var keys []string for _, i := range req { key := i.AppID + ":" + i.VendorStoreID + ":" + i.VendorID + ":" + i.UserID keys = append(keys, key) } for _, j := range keys { temp := rdb.LRange(j) for _, v := range temp { retVal[j] = append(retVal[j], v) //retVal["chatDetail"] = append(retVal["chatDetail"], v) } } return retVal, nil } // SetJxMsgRead 设置jx消息已读 userID(美团:openUserID;饿了么:groupID) func SetJxMsgRead(appID, vendorStoreID, vendorID, userID string) error { var ( temp = UserMessageList{} key = appID + ":" + vendorStoreID + ":" + vendorID ) if n, err := rdb.Exists(key); n > 0 && err == nil { s2 := rdb.LRange(key) for i := 0; i < len(s2); i++ { v := UserMessageList{} _ = json.Unmarshal([]byte(s2[i]), &v) if v.UserID == userID { //删除此条数据 err = rdb.LSet(key, i, "del") err = rdb.LRem(key, 0, "del") s2 = append(s2[:i], s2[i+1:]...) i-- //cnt=0 重新赋值 temp = UserMessageList{ VendorID: v.VendorID, UserID: v.UserID, OrderID: v.OrderID, NewMessageNum: 0, LatestMsg: v.LatestMsg, LatestTime: v.LatestTime, } } } str, _ := json.Marshal(temp) err = rdb.RPush(key, str) } return nil } // 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) { var ( key string flag = false vendorID int errList errlist.ErrList apply *AutoReply jxMsg = &JXMsg{} userList = &UserMessageList{} ) if req.SendType == SendTypeMt { vendorID = VendorIDMT mt := req.MsgContent.(mtwmapi.PushContentReq) key = utils.Int2Str(mt.AppID) + ":" + utils.Int2Str(mt.OpenUserID) + ":autoReply" //1 检测是否已自动回复 flag = GetIfReply(key) //判断flag状态 if !flag { apply = &AutoReply{ UserID: mt.AppID, MsgID: mt.MsgID, IsApply: true, Timestamp: mt.Cts, } temp := mt //获取自定义回复模板 if template := GetCustomTemplate(utils.Int2Str(mt.AppID), mt.AppPoiCode); len(template) > 0 { temp.MsgContent = template } else { temp.MsgContent, err = GetDefaultTemplate(utils.Int2Str(mt.AppID), mt.AppPoiCode, VendorIDMT) if err != nil { temp.MsgContent = AutoReplyByAppID[mt.AppID] } } temp.MsgSource = mtwmapi.MsgSourceStore 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) } else { jxMsg = &JXMsg{ SendType: SendTypeJx, MsgContent: temp, } userList = &UserMessageList{ VendorID: VendorIDMT, UserID: utils.Int2Str(mt.OpenUserID), LatestMsg: mt.MsgContent, LatestTime: mt.Cts, OrderID: "", } //1 存储详细聊天记录list if err = SetMessageDetail(jxMsg, vendorID, elmAppID); err != nil { errList.AddErr(fmt.Errorf("自动回复:存储详细聊天记录错误:%v", err)) } //2 存储展示列表时单条数据 if err = SetUserList(jxMsg, userList, vendorID, elmAppID); err != nil { errList.AddErr(fmt.Errorf("自动回复:存储STU聊天记录错误:%v", err)) } } //3 记录自动回复状态 if err = RecordAutoStatus(key, apply); err != nil { errList.AddErr(fmt.Errorf("自动回复:记录自动回复状态错误:%v", err)) } } } if req.SendType == SendTypeElm { vendorID = VendorIDELM elm := req.MsgContent.(ebaiapi.ImMessageSend) key = elmAppID + ":" + elm.PayLoad.SenderID + ":autoReply" //1 检测是否已自动回复 flag = GetIfReply(key) if !flag { apply = &AutoReply{ UserID: utils.Str2Int(elm.PayLoad.SenderID), MsgID: utils.Str2Int(elm.PayLoad.MsgID), IsApply: true, Timestamp: elm.PayLoad.CreateTime, } param := &ebaiapi.BusinessSendMsgReq{ PlatformShopId: elm.PlatformShopID, BizType: ebaiapi.IMType, SubBizType: ebaiapi.IMTypeSendMsg, PayLoad: ebaiapi.BusinessMsgPayload{ GroupId: elm.PayLoad.GroupID, MsgId: utils.Int2Str(RandTimeNumber()), ReceiverIds: elm.PayLoad.ReceiverIDs, ContentType: utils.Int2Str(ebaiapi.ContentTypeNormal), }, } temp := "" if template := GetCustomTemplate(elmAppID, elm.PlatformShopID); len(template) > 0 { temp = template } else { temp, err = GetDefaultTemplate(elmAppID, elm.PlatformShopID, VendorIDELM) if err != nil { temp = LastTemplate } } tempStr, _ := json.Marshal(temp) tempContent := ebaiapi.Content{ Text: string(tempStr), //Text: temp, } tempContentStr, _ := json.Marshal(tempContent) param.PayLoad.Content = string(tempContentStr) if err = partner.CurAPIManager.GetAPI(model.VendorIDEBAI, elmAppID).(*ebaiapi.API).BusinessSendMsg(param); err != nil { apply.IsApply = false globals.SugarLogger.Debugf("CheckAndReply mtSend err:%v", err) } else { //t1 := json.Unmarshal(param.Payload.Content) jxMsg = &JXMsg{ SendType: SendTypeJx, MsgContent: param, } userList = &UserMessageList{ VendorID: VendorIDELM, UserID: elm.PayLoad.SenderID, LatestMsg: elm.PayLoad.Content, LatestTime: elm.PayLoad.CreateTime, OrderID: "", } //1 存储详细聊天记录list if err = SetMessageDetail(jxMsg, vendorID, elmAppID); err != nil { errList.AddErr(fmt.Errorf("自动回复:存储详细聊天记录错误:%v", err)) } //2 存储展示列表时单条数据 if err = SetUserList(jxMsg, userList, vendorID, elmAppID); err != nil { errList.AddErr(fmt.Errorf("自动回复:存储STU聊天记录错误:%v", err)) } } //3 记录自动回复状态 if err = RecordAutoStatus(key, apply); err != nil { errList.AddErr(fmt.Errorf("自动回复:记录自动回复状态错误:%v", err)) } } } //if jxMsg != nil { // //1 存储详细聊天记录list // if err = SetMessageDetail(jxMsg, vendorID, elmAppID); err != nil { // errList.AddErr(fmt.Errorf("自动回复:存储详细聊天记录错误:%v", err)) // } // //2 存储展示列表时单条数据 // if err = SetUserList(jxMsg, userList, vendorID, elmAppID); err != nil { // errList.AddErr(fmt.Errorf("自动回复:存储STU聊天记录错误:%v", err)) // } //} // //if apply != nil { // //3 记录自动回复状态 // if err = RecordAutoStatus(key, apply); err != nil { // errList.AddErr(fmt.Errorf("自动回复:记录自动回复状态错误:%v", err)) // } //} if errList.GetErrListAsOne() != nil { return fmt.Errorf("CheckAndReply err=%v", errList.GetErrListAsOne()) } return nil } // GetIfReply 检查是否已回复 func GetIfReply(key string) (flag bool) { flag = false 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 } } } return flag } // RecordAutoStatus 记录是否已自动回复状态 func RecordAutoStatus(key string, apply *AutoReply) error { 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 } return nil } // GenCustomReplyID 生成门店自动回复模板ID func GenCustomReplyID(appID, vendorStoreID string) string { return BaseCusKey + ":" + appID + ":" + vendorStoreID } // GetCustomTemplate 获取自动回复模板 func GetCustomTemplate(appID, vendorStoreID string) (storeTemplate string) { key := GenCustomReplyID(appID, vendorStoreID) temp := rdb.Get(key) if temp != nil { storeTemplate = temp.(string) } return storeTemplate } // AddCustomReply 增加门店自定义回复模板 func AddCustomReply(appID, vendorStoreID, replyTemplate string) (storeTemplate string, err error) { if len(appID) == 0 || len(vendorStoreID) == 0 || len(replyTemplate) == 0 { return "", errors.New("参数错误请检查!") } key := GenCustomReplyID(appID, vendorStoreID) err = rdb.Del(key) if err == nil { err = rdb.Set(key, replyTemplate, 0) } return "", err } // GetDefaultTemplate 获取门店默认回复模板 func GetDefaultTemplate(appID, vendorStoreID string, vendorID int) (string, error) { var ( phoneNum = " " t string ) store, err := dao.GetStoreDetailByVendorStoreID(dao.GetDB(), vendorStoreID, vendorID, "") if err != nil && err != orm.ErrNoRows { return "", err } if err == orm.ErrNoRows || (len(store.Tel1) == 0 && len(store.Tel2) == 0) { t = BasePhoneNum } if len(store.Tel1) > 0 { t = store.Tel1 } phoneNum = t[:3] + "-" + t[3:7] + "-" + t[7:] temp := BaseTemplate + phoneNum if vendorID == VendorIDMT { data, err := EncryptIm(utils.Str2Int(appID), temp) if err != nil { return "", err } return data, nil } if vendorID == VendorIDELM { return temp, nil } return "", nil } /************************工具函数*/ // DelRedisByKey 清除redis数据 func DelRedisByKey(keys []string) { var errList errlist.ErrList for _, key := range keys { err := rdb.Del(key) if err != nil { errList.AddErr(err) } } if errList.GetErrListAsOne() != nil { globals.SugarLogger.Debugf("DelRedisByKey err=%v", errList.GetErrListAsOne()) } return } var rel = map[int]string{ 589: "a81eb3df418d83d6a1a4b7c572156d2f", 5873: "41c479790a76f86326f89e8048964739", 4123: "df2c88338b85f830cebce2a9eab56628", } // DecryptIm 解密操作 func DecryptIm(appID int, msg string) (string, error) { data, _ := base64.StdEncoding.DecodeString(msg) key := utils.LimitUTF8StringLen2(rel[appID], 16) res, err := utils.AESCBCDecpryt(data, []byte(key), []byte(key)) if len(string(res)) > 0 && err == nil { return string(res), nil } return "", err } // EncryptIm 加密操作 func EncryptIm(appID int, msg string) (retVal string, err error) { key := utils.LimitUTF8StringLen2(rel[appID], 16) if data, err := utils.AESCBCEncpryt([]byte(msg), []byte(key), []byte(key)); err == nil { retVal = base64.StdEncoding.EncodeToString(data) } return retVal, err } // FilterIm 过滤操作 func FilterIm(appID int, msg string) bool { var check = "[自动回复]" data, _ := DecryptIm(appID, msg) if len(data) > 0 && strings.Contains(data, check) { return true } 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) }