202 lines
6.1 KiB
Go
202 lines
6.1 KiB
Go
package daichongser
|
|
|
|
import (
|
|
"strconv"
|
|
"sync"
|
|
"time"
|
|
|
|
"91jd-server/app/appg"
|
|
"91jd-server/common"
|
|
"91jd-server/common/constant"
|
|
"91jd-server/common/constant/redisconst"
|
|
"91jd-server/common/crypt"
|
|
"91jd-server/common/daichong"
|
|
"91jd-server/common/httputil"
|
|
"91jd-server/common/log"
|
|
"91jd-server/common/stderr"
|
|
"91jd-server/models/commod"
|
|
"91jd-server/models/e/daichongmod"
|
|
"91jd-server/models/v/usermod"
|
|
)
|
|
|
|
// 全局的通知商人是否在线的时间点
|
|
var notifyPoint int64
|
|
|
|
const FixTime = 5 * 60 //单位为秒
|
|
|
|
// TakeChat 发起聊天
|
|
func TakeChat(uid uint64, proT int) (daichong.ChatResp, stderr.Code) {
|
|
u, err := usermod.FindUserByUID(uid)
|
|
if err != nil || u == nil {
|
|
return daichong.ChatResp{}, stderr.AuthIsNotExist
|
|
}
|
|
chatSign := daichong.ChatSign{
|
|
UID: strconv.FormatUint(uid, 10),
|
|
NickName: u.Name,
|
|
Avatar: common.BindUrl(appg.Conf.URL.OriginUrl, u.Portrait),
|
|
Channel: "ys",
|
|
}
|
|
sign, err := daichong.Convert2Sign(chatSign, appg.Conf.DaiChong.AppSecret)
|
|
if err != nil {
|
|
log.Warn("create sign data wrong", log.Any("warn", err))
|
|
return daichong.ChatResp{}, stderr.ErrTakeChatCode
|
|
}
|
|
chatReq := daichong.ChatReq{
|
|
AppId: appg.Conf.DaiChong.AppID,
|
|
Data: sign,
|
|
ProtoType: 1,
|
|
ProductType: proT,
|
|
}
|
|
chatResp, err := daichong.TakeChat(chatReq, appg.Conf.DaiChong.Domain)
|
|
if err != nil {
|
|
log.Warn("TakeChat send http wrong", log.Any("warn", err))
|
|
return chatResp, stderr.ErrTakeChatCode
|
|
}
|
|
return chatResp, chatResp.Code
|
|
}
|
|
|
|
// 获取订单信息
|
|
func GetOrderInfo(req daichongmod.GetOrderReq) (daichong.OrderResp, stderr.Code) {
|
|
sign, err := daichong.Convert2Sign(req, appg.Conf.DaiChong.AppSecret)
|
|
if err != nil {
|
|
log.Warn("create sign data wrong", log.Any("warn", err))
|
|
return daichong.OrderResp{}, stderr.ErrGetOrderInfoCode
|
|
}
|
|
orderReq := daichong.CommonReq{
|
|
AppId: appg.Conf.DaiChong.AppID,
|
|
Data: sign,
|
|
}
|
|
orderResp, err := daichong.GetOrder(orderReq, appg.Conf.DaiChong.Domain)
|
|
if err != nil {
|
|
log.Warn("GetOrderInfo send http wrong", log.Any("warn", err))
|
|
return orderResp, stderr.ErrGetOrderInfoCode
|
|
}
|
|
return orderResp, orderResp.Code
|
|
}
|
|
|
|
// 代充上传文件
|
|
func UploadFile(filename, sessionId, data string, userId uint64) (commod.Resp, stderr.Code) {
|
|
uploadFileReq := daichong.UploadFileReq{
|
|
FileName: filename,
|
|
AppId: appg.Conf.DaiChong.AppID,
|
|
UserID: strconv.FormatUint(userId, 10),
|
|
SessionId: sessionId,
|
|
File: data,
|
|
}
|
|
resp, err := daichong.UploadFile(uploadFileReq, appg.Conf.DaiChong.UploadUrl)
|
|
if err != nil {
|
|
log.Warn("UploadFile send http wrong", log.Any("warn", err))
|
|
return resp, stderr.ErrUploadError
|
|
}
|
|
return resp, resp.Code
|
|
}
|
|
|
|
// 获取代充信息
|
|
func GetDaichongInfo(uid uint64, userAgent string, proT int) (data daichong.ChatResp, code stderr.Code) {
|
|
var user *usermod.User
|
|
var err error
|
|
wg := sync.WaitGroup{}
|
|
wg.Add(2)
|
|
common.Go(func() {
|
|
defer wg.Done()
|
|
str, err := appg.Redis.Get(redisconst.TraderChatCacheKey(uid, proT))
|
|
if str != nil && err == nil {
|
|
_ = crypt.JSON2Struct(*str, &data)
|
|
} else {
|
|
data, code = TakeChat(uid, proT)
|
|
if code == stderr.Success {
|
|
normalstr, err := crypt.StructToStrNormal(data)
|
|
if normalstr != "" && err == nil {
|
|
_ = appg.Redis.Set(redisconst.TraderChatCacheKey(uid, proT), normalstr, redisconst.TraderChatCacheExpire)
|
|
}
|
|
if len(data.Data.Traders) == 0 {
|
|
//通知客服人员 代充商人匹配不到
|
|
common.Go(func() {
|
|
sendTg()
|
|
})
|
|
}
|
|
}
|
|
}
|
|
})
|
|
common.Go(func() {
|
|
defer wg.Done()
|
|
user, err = usermod.FindUserByUID(uid)
|
|
})
|
|
wg.Wait()
|
|
if user != nil && err == nil {
|
|
data.Data.UserInfo.Name = user.Name
|
|
data.Data.UserInfo.Portrait = common.BindUrl(appg.Conf.URL.OriginUrl, user.Portrait)
|
|
data.Data.UserInfo.Gender = user.Gender
|
|
}
|
|
data.Data.TraderUrl = "/api/app/daichong/traders"
|
|
data.Data.OrdUrl = "/api/app/daichong/orderInfo"
|
|
data.Data.Limit = appg.Conf.Base.DemarcatAmout
|
|
data.Data.UserInfo.UID = uid
|
|
data.Data.UserAgent = userAgent
|
|
return
|
|
}
|
|
|
|
func sendTg() {
|
|
now := time.Now().UTC().Unix()
|
|
if appg.Conf.Base.Env != constant.ReleaseRunmod || !(notifyPoint < time.Now().UTC().Unix()-FixTime) {
|
|
return
|
|
}
|
|
notifyPoint = now
|
|
resp := commod.Resp{}
|
|
params := map[string]interface{}{
|
|
"tgName": "ys_bot",
|
|
"msgPayload": "@gaochang1 @BA1219\n\r【短视频-正式-代充商人匹配丢失】\n\r",
|
|
"text": "【WARNING】: 代充商人现在无法匹配到了,请运营人员检查是否商人在线或余额足够",
|
|
"chatId": -228259065,
|
|
}
|
|
code, err := httputil.DefaultClientPostJsonWithResp(&resp, "http://uni.ztgba.com/api/tg/send", nil, params)
|
|
log.Info("http method TgSend response code ==>", log.Any("statusCode", code), log.Any("resp", resp))
|
|
if err != nil {
|
|
log.Error("TgSend failed", log.E(err))
|
|
}
|
|
}
|
|
|
|
// 根据订单ID获取聊天记录
|
|
func GetChatRecordsByOrderId(orderId string) (daichong.RecordResp, stderr.Code) {
|
|
var param struct {
|
|
OrderId string `json:"orderId"`
|
|
Time int64 `json:"time"`
|
|
}
|
|
param.OrderId = orderId
|
|
param.Time = time.Now().Unix()
|
|
sign, err := daichong.Convert2Sign(param, appg.Conf.DaiChong.AppSecret)
|
|
if err != nil {
|
|
log.Warn("create sign data wrong", log.Any("warn", err))
|
|
return daichong.RecordResp{}, stderr.Failure
|
|
}
|
|
orderReq := daichong.CommonReq{
|
|
AppId: appg.Conf.DaiChong.AppID,
|
|
Data: sign,
|
|
}
|
|
recordResp, err := daichong.GetChatRecordsByOrderId(orderReq, appg.Conf.DaiChong.Domain)
|
|
if err != nil {
|
|
log.Warn("GetChatRecordsByOrderId send http wrong", log.Any("warn", err))
|
|
return recordResp, stderr.Failure
|
|
}
|
|
return recordResp, recordResp.Code
|
|
}
|
|
|
|
// 获取商人支付信息
|
|
func GetTraderPayInfo(req daichongmod.PayInfoReq) (daichong.PayInfoResp, stderr.Code) {
|
|
sign, err := daichong.Convert2Sign(req, appg.Conf.DaiChong.AppSecret)
|
|
if err != nil {
|
|
log.Warn("create sign data wrong", log.Any("warn", err))
|
|
return daichong.PayInfoResp{}, stderr.Failure
|
|
}
|
|
commReq := daichong.CommonReq{
|
|
AppId: appg.Conf.DaiChong.AppID,
|
|
Data: sign,
|
|
}
|
|
payInfoResp, err := daichong.GetTraderPayInfo(commReq, appg.Conf.DaiChong.Domain)
|
|
if err != nil {
|
|
log.Warn("GetTraderPayInfo send http wrong", log.Any("warn", err))
|
|
return payInfoResp, stderr.Failure
|
|
}
|
|
return payInfoResp, payInfoResp.Code
|
|
}
|