|
@@ -0,0 +1,151 @@
|
|
|
+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()))
|
|
|
+}
|