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 }