helpUserOrderHandler.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. package controller
  2. import (
  3. . "app.yhyue.com/moapp/jybase/api"
  4. "app.yhyue.com/moapp/jybase/common"
  5. "app.yhyue.com/moapp/jybase/encrypt"
  6. "app.yhyue.com/moapp/jybase/mongodb"
  7. "context"
  8. "encoding/json"
  9. "fmt"
  10. "github.com/gogf/gf/v2/frame/g"
  11. "github.com/gogf/gf/v2/net/ghttp"
  12. "github.com/gogf/gf/v2/util/gconv"
  13. "github.com/pkg/errors"
  14. "jyOrderManager/internal/jyutil"
  15. "strings"
  16. "time"
  17. )
  18. func GetHelpUserCreateOrderParamHandler(r *ghttp.Request) {
  19. rData, err := func() (interface{}, error) {
  20. rj, err := r.GetJson()
  21. if err != nil {
  22. return nil, errors.Wrap(err, "请求参数格式异常")
  23. }
  24. var (
  25. phone = rj.Get("phone").String()
  26. cycleUnit = rj.Get("cycleUnit").String() //1:天、2:月
  27. cycleCount = rj.Get("cycleCount").String()
  28. ctx = r.Context()
  29. token string
  30. uMsg = jyutil.GetUserMsgFromCtx(ctx)
  31. )
  32. if uMsg == nil {
  33. return nil, errors.New("登陆身份异常")
  34. }
  35. uId, eMsg := func() (userId, errMsg string) {
  36. if len(phone) != 11 {
  37. return "", "手机号异常"
  38. }
  39. //查询当前销售是否有权限操作改用户
  40. if g.Cfg("global").MustGet(ctx, "helpUserOrder.open", true).Bool() { //测试环境不校验
  41. if err := sellerCheck(ctx, uMsg.PositionId, phone); err != nil {
  42. g.Log().Info(ctx, "代用户下单异常:%s %v\n", phone, err)
  43. return "", "不满足代用户下单条件,不支持下单"
  44. }
  45. }
  46. uData, _, _, err := jyutil.GetCreateUserData(phone, "", false)
  47. if err != nil {
  48. return "", "获取用户异常"
  49. }
  50. return mongodb.BsonIdToSId(uData["_id"]), ""
  51. }()
  52. deptId, deptName, name, err := jyutil.JyDepartmentManager.GetDeptInfoByEntId(ctx, gconv.Int(uMsg.EntUserId))
  53. if err != nil {
  54. eMsg = err.Error()
  55. }
  56. if uId != "" {
  57. token = GetSellerToken(uId, name, fmt.Sprint(uMsg.EntUserId), map[string]interface{}{
  58. "tt": cycleUnit,
  59. "tn": cycleCount,
  60. "ts": deptName,
  61. "ti": deptId,
  62. })
  63. }
  64. return map[string]interface{}{
  65. "tip": eMsg,
  66. "token": token,
  67. }, nil
  68. }()
  69. if err != nil {
  70. g.Log().Errorf(r.Context(), "待用户下单获取下单参数异常 %v", err)
  71. }
  72. r.Response.WriteJson(NewResult(rData, err))
  73. }
  74. // sellerCheck 查询当前销售是否有权限操作改用户
  75. // 规则 满足1和2中任意一条
  76. // 1.新增-管理后台与电销系统用户匹配:同步电销系统组织架构,根据手机号对管理后台用户与电销系统的人员进行匹配;
  77. // 2.“帮助用户下单”增加限制条件,即下单用户需在下单电销人员私海里,且近期电销人员与该用户有过沟通,“有过沟通”判断依据(满足以下任意1个条件即可):
  78. // (1)最近3天(可配置)该电销人员与用户存在通话时长≥60秒(可配置);
  79. // (2)最近3天(可配置)该电销人员与该用户存在已上传附件的跟进记录;
  80. // (3)该电销人员与该用户正在通话中。
  81. func sellerCheck(ctx context.Context, posId int64, UserPhone string) error {
  82. var (
  83. total int
  84. err error
  85. )
  86. 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)
  87. if err != nil {
  88. return err
  89. }
  90. if total == 0 {
  91. return fmt.Errorf("不满足代用户下单条件,不支持下单")
  92. }
  93. //2(1)
  94. var (
  95. uid string
  96. phoneArr []string
  97. phonesStr string
  98. )
  99. 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)
  100. if res.IsEmpty() {
  101. return fmt.Errorf("查询手机号异常")
  102. }
  103. for i, m := range res.List() {
  104. if i == 0 {
  105. uid = common.ObjToString(m["baseinfo_id"])
  106. }
  107. if p := common.ObjToString(m["phone"]); p != "" {
  108. phoneArr = append(phoneArr, p)
  109. }
  110. }
  111. phonesStr = strings.Join(phoneArr, "','")
  112. //(1)最近3天(可配置)该电销人员与用户存在通话时长≥60秒(可配置);
  113. if num, err := g.DB("subject").GetCount(ctx, fmt.Sprintf(`SELECT count(*)
  114. FROM Call_Accounting.voice_record
  115. WHERE CallTimeLength >= ?
  116. AND Ring > (SELECT DATE_SUB(NOW(), INTERVAL ? HOUR))
  117. AND Exten IN (
  118. SELECT seat_number
  119. FROM dwd_f_crm_personnel_management
  120. WHERE position_id = ?
  121. )
  122. 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 {
  123. return nil
  124. }
  125. //(2)最近3天(可配置)该电销人员与该用户存在已上传附件的跟进记录;
  126. if num, err := g.DB("subject").GetCount(ctx, `SELECT count(*)
  127. FROM dwd_f_crm_clue_info a
  128. INNER JOIN dwd_f_crm_trail_content b ON a.id =b.clue_id
  129. INNER JOIN attachment c ON b.id =c.change_id
  130. 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 {
  131. return nil
  132. }
  133. //(3)该电销人员与该用户正在通话中。
  134. if num, err := g.DB("subject").GetCount(ctx, `SELECT count(*) FROM dwd_f_userbase_contacts
  135. WHERE baseinfo_id=? AND is_talking=1
  136. AND is_talking_seat_number IN(
  137. SELECT seat_number
  138. FROM dwd_f_crm_personnel_management
  139. WHERE position_id = ?)`, uid, posId); err == nil && num > 0 {
  140. return nil
  141. }
  142. return fmt.Errorf("不满足代用户下单条件,不支持下单")
  143. }
  144. func GetSellerToken(uId, sName string, sid string, desc map[string]interface{}) (token string) {
  145. bytes, _ := json.Marshal(desc)
  146. return encrypt.SE.Encode2Hex(fmt.Sprintf("uid=%s&sName=%s&sid=%s&desc=%s&t=%d", uId, sName, sid, string(bytes), time.Now().Unix()))
  147. }