wkyuer 4 mēneši atpakaļ
vecāks
revīzija
01338c5b33

+ 3 - 0
config.yaml

@@ -19,6 +19,9 @@ database:
   base:
     link: "mysql:jianyu:Topnet123@tcp(172.20.45.129:4000)/base_service"
     debug: false
+  subject:
+    link: "mysql:jianyu:Topnet123@tcp(172.20.45.129:4000)/base_service"
+    debug: false
 
 redis:
   default: # 配置seo的redis

+ 3 - 2
internal/cmd/cmd.go

@@ -62,8 +62,9 @@ var (
 						group2.POST("/update", controller.SaleRecordUpdateHandler) //业绩更改
 					})
 
-					group.GET("/getContractPdf", controller.GetContractPdfHandler)   //pdf合同
-					group.GET("/getReturnOnline", controller.GetReturnOnlineHandler) //微信支付宝回款
+					group.GET("/getContractPdf", controller.GetContractPdfHandler)                           //pdf合同
+					group.GET("/getReturnOnline", controller.GetReturnOnlineHandler)                         //微信支付宝回款
+					group.GET("/getHelpUserCreateOrderParam", controller.GetHelpUserCreateOrderParamHandler) //帮助用户下单
 				})
 
 			})

+ 151 - 0
internal/controller/helpUserOrderHandler.go

@@ -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()))
+}

+ 3 - 0
internal/controller/orderHandler.go

@@ -345,6 +345,9 @@ func getProductNameByMasterKey(masterKey string) string {
 		if err != nil {
 			return ""
 		}
+		if mc.ClassName == "超级订阅" {
+			return "VIP订阅"
+		}
 		return mc.ClassName
 	}
 	return ""

+ 1 - 0
internal/logic/product/subvip/saveUpdate.go

@@ -28,6 +28,7 @@ func (p jySubVipProduct) SaveUpdate(ctx context.Context, masterKey string) error
 			"tactics":          p.OrderDetail.Tactics,
 			"linked_detail_id": p.OrderDetail.LinkedOrderId,
 			"service_type":     p.OrderDetail.ServiceType,
+			"returned_open":    common.If(p.OrderDetail.PaybackOpenServer, 1, 0),
 			"is_master":        common.If(fmt.Sprintf("%s_%d", p.OrderDetail.ProductCode, p.OrderDetail.Amount) == masterKey, 1, 0),
 		}