123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- 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()))
- }
|