package controller import ( . "app.yhyue.com/moapp/jybase/api" "app.yhyue.com/moapp/jybase/common" "app.yhyue.com/moapp/jybase/encrypt" "app.yhyue.com/moapp/jybase/mongodb" "context" "encoding/json" "fmt" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/net/ghttp" "github.com/gogf/gf/v2/util/gconv" "github.com/pkg/errors" "jyOrderManager/internal/jyutil" "strings" "time" ) func GetHelpUserCreateOrderParamHandler(r *ghttp.Request) { rData, err := func() (interface{}, error) { rj, err := r.GetJson() if err != nil { return nil, errors.Wrap(err, "请求参数格式异常") } var ( phone = rj.Get("phone").String() cycleUnit = rj.Get("cycleUnit").String() //1:天、2:月 cycleCount = rj.Get("cycleCount").String() ctx = r.Context() token string uMsg = jyutil.GetUserMsgFromCtx(ctx) ) if uMsg == nil { return nil, errors.New("登陆身份异常") } uId, eMsg := func() (userId, errMsg string) { if len(phone) != 11 { return "", "手机号异常" } //查询当前销售是否有权限操作改用户 if g.Cfg("global").MustGet(ctx, "helpUserOrder.open", true).Bool() { //测试环境不校验 if err := sellerCheck(ctx, uMsg.PositionId, phone); err != nil { g.Log().Info(ctx, "代用户下单异常:%s %v\n", phone, err) return "", "不满足代用户下单条件,不支持下单" } } uData, _, _, err := jyutil.GetCreateUserData(phone, "", false) if err != nil { return "", "获取用户异常" } return mongodb.BsonIdToSId(uData["_id"]), "" }() deptId, deptName, name, err := jyutil.JyDepartmentManager.GetDeptInfoByEntId(ctx, gconv.Int(uMsg.EntUserId)) if err != nil { eMsg = err.Error() } if uId != "" { token = GetSellerToken(uId, name, fmt.Sprint(uMsg.EntUserId), map[string]interface{}{ "tt": cycleUnit, "tn": cycleCount, "ts": deptName, "ti": deptId, }) } return map[string]interface{}{ "tip": eMsg, "token": token, }, nil }() if err != nil { g.Log().Errorf(r.Context(), "待用户下单获取下单参数异常 %v", err) } r.Response.WriteJson(NewResult(rData, err)) } // sellerCheck 查询当前销售是否有权限操作改用户 // 规则 满足1和2中任意一条 // 1.新增-管理后台与电销系统用户匹配:同步电销系统组织架构,根据手机号对管理后台用户与电销系统的人员进行匹配; // 2.“帮助用户下单”增加限制条件,即下单用户需在下单电销人员私海里,且近期电销人员与该用户有过沟通,“有过沟通”判断依据(满足以下任意1个条件即可): // (1)最近3天(可配置)该电销人员与用户存在通话时长≥60秒(可配置); // (2)最近3天(可配置)该电销人员与该用户存在已上传附件的跟进记录; // (3)该电销人员与该用户正在通话中。 func sellerCheck(ctx context.Context, posId int64, UserPhone string) error { var ( total int err error ) total, err = g.DB("subject").GetCount(ctx, "SELECT COUNT(*) FROM dwd_f_crm_clue_info a inner join dwd_f_userbase_contacts b on a.uid=b.baseinfo_id WHERE b.phone=? and a.position_id=?", UserPhone, posId) if err != nil { return err } if total == 0 { return fmt.Errorf("不满足代用户下单条件,不支持下单") } //2(1) var ( uid string phoneArr []string phonesStr string ) res, err := g.DB("subject").Query(ctx, "SELECT baseinfo_id,phone FROM dwd_f_userbase_contacts WHERE baseinfo_id=(SELECT baseinfo_id FROM dwd_f_userbase_contacts WHERE phone=?)", UserPhone) if res.IsEmpty() { return fmt.Errorf("查询手机号异常") } for i, m := range res.List() { if i == 0 { uid = common.ObjToString(m["baseinfo_id"]) } if p := common.ObjToString(m["phone"]); p != "" { phoneArr = append(phoneArr, p) } } phonesStr = strings.Join(phoneArr, "','") //(1)最近3天(可配置)该电销人员与用户存在通话时长≥60秒(可配置); if num, err := g.DB("subject").GetCount(ctx, fmt.Sprintf(`SELECT count(*) FROM Call_Accounting.voice_record WHERE CallTimeLength >= ? AND Ring > (SELECT DATE_SUB(NOW(), INTERVAL ? HOUR)) AND Exten IN ( SELECT seat_number FROM dwd_f_crm_personnel_management WHERE position_id = ? ) AND (CallNo in ('%s') or CalledNo in ('%s'))`, phonesStr, phonesStr), g.Cfg().MustGet(ctx, "helpUserOrder.talkTimeLong", 60).Int64(), g.Cfg().MustGet(ctx, "helpUserOrder.talkHourLimit", 72).Int64(), posId); err == nil && num > 0 { return nil } //(2)最近3天(可配置)该电销人员与该用户存在已上传附件的跟进记录; if num, err := g.DB("subject").GetCount(ctx, `SELECT count(*) FROM dwd_f_crm_clue_info a INNER JOIN dwd_f_crm_trail_content b ON a.id =b.clue_id INNER JOIN attachment c ON b.id =c.change_id WHERE a.uid =? AND b.createtime >DATE_SUB(NOW(), INTERVAL ? HOUR) AND type='跟进记录附件'`, uid, g.Cfg().MustGet(ctx, "helpUserOrder.trailAttach", 72).Int64()); err == nil && num > 0 { return nil } //(3)该电销人员与该用户正在通话中。 if num, err := g.DB("subject").GetCount(ctx, `SELECT count(*) FROM dwd_f_userbase_contacts WHERE baseinfo_id=? AND is_talking=1 AND is_talking_seat_number IN( SELECT seat_number FROM dwd_f_crm_personnel_management WHERE position_id = ?)`, uid, posId); err == nil && num > 0 { return nil } return fmt.Errorf("不满足代用户下单条件,不支持下单") } func GetSellerToken(uId, sName string, sid string, desc map[string]interface{}) (token string) { bytes, _ := json.Marshal(desc) return encrypt.SE.Encode2Hex(fmt.Sprintf("uid=%s&sName=%s&sid=%s&desc=%s&t=%d", uId, sName, sid, string(bytes), time.Now().Unix())) }