wangkaiyue 9 сар өмнө
parent
commit
671cc1e400

+ 2 - 2
saleFlush/config.yaml

@@ -3,8 +3,8 @@ database:
     link: "mysql:readuser:jyTi_R202403@tcp(192.168.3.71:4003)/jianyu"
     link: "mysql:readuser:jyTi_R202403@tcp(192.168.3.71:4003)/jianyu"
     debug: true
     debug: true
   default:
   default:
-    #link: "mysql:root:=PDT49#80Z!RVv52_z@tcp(192.168.3.14:4000)/jianyu"
-    link: "mysql:Wangkaiyue:Wky@20230316#@tcp(127.0.0.1:4000)/jianyu"
+    link: "mysql:root:=PDT49#80Z!RVv52_z@tcp(192.168.3.14:4000)/jianyu"
+    #link: "mysql:Wangkaiyue:Wky@20230316#@tcp(127.0.0.1:4000)/jianyu"
     debug: true
     debug: true
 
 
 logger:
 logger:

+ 90 - 423
saleFlush/main.go

@@ -6,462 +6,129 @@ import (
 	"github.com/gogf/gf/v2/frame/g"
 	"github.com/gogf/gf/v2/frame/g"
 	"github.com/gogf/gf/v2/os/gfile"
 	"github.com/gogf/gf/v2/os/gfile"
 	"github.com/gogf/gf/v2/util/gconv"
 	"github.com/gogf/gf/v2/util/gconv"
-	"github.com/google/uuid"
-	"strings"
 	"time"
 	"time"
+	"workTasks/saleFlush/util"
 )
 )
 
 
-var (
-	deptMapping = `[
-	{"oldCode":"010000","show":"销售一部","newId":"58435"},
-	{"oldCode":"010100","show":"销售一部/电销部","newId":"26820"},
-	{"oldCode":"010101","show":"销售一部/电销部/电销一组","newId":"26821"},
-	{"oldCode":"010102","show":"销售一部/电销部/电销二组","newId":"26822"},
-	{"oldCode":"010103","show":"销售一部/电销部/电销三组","newId":"26823"},
-	{"oldCode":"010104","show":"销售一部/电销部/电销四组","newId":"26824"},	
-	{"oldCode":"010200","show":"销售一部/大客户部","newId":"27275"},
-	{"oldCode":"010300","show":"销售一部/渠道部","newId":"-1"},	
-	{"oldCode":"020000","show":"产品部","newId":"26920"},
-	{"oldCode":"020100","show":"产品部/售后服务组","newId":"58437"},	
-	{"oldCode":"020200","show":"产品部/客户成功组","newId":"27777"},	
-	{"oldCode":"030000","show":"销售二部","newId":"58416"},
-	{"oldCode":"040000","show":"运营部","newId":"27103"},	
-	{"oldCode":"040100","show":"运营部/客户成功组","newId":"59005"},
-	{"oldCode":"040200","show":"运营部/运营组","newId":"59028"},
-	{"oldCode":"050000","show":"销售三部","newId":"27955"},
-	{"oldCode":"060000","show":"市场部","newId":"59010"},		
-	{"oldCode":"060100","show":"市场部/市场组","newId":"59011"},
-	{"oldCode":"060200","show":"市场部/大客组","newId":"59017"},
-	{"oldCode":"070000","show":"数据事业部","newId":"59006"},
-	{"oldCode":"070100","show":"数据事业部/销售组","newId":"59012"},
-	{"oldCode":"070200","show":"数据事业部/售前与售后组","newId":"59007"}
-	]`
-	codeDeptMapping = map[string]*newDept{}
-	beforeMoneyMap  = map[string]int{}  //红冲单子
-	hasSaleMap      = map[string]bool{} //已存在业绩
-	table           = "order_sale_record"
-
-	updateSaleTimeMapping = map[string]map[string]interface{}{}
-)
-
-type (
-	saleMoneyObj struct {
-		Data []struct {
-			Name  string  `json:"name"`
-			Money float64 `json:"money"`
-		} `json:"data"`
-	}
-	newDept struct {
-		Name string
-		Id   int
-	}
-)
-
-func init() {
-	//加载历史部门
-	for _, m := range gconv.Maps(deptMapping) {
-		codeDeptMapping[gconv.String(m["oldCode"])] = &newDept{
-			Name: gconv.String(m["show"]),
-			Id:   gconv.Int(m["newId"]),
-		}
-	}
-	//加载红冲记录
-	res, err := g.DB("release").Query(context.TODO(), "SELECT createTime,orderCode,payMoney from moneyCorrection WHERE redType='金额红冲' and payMoney!=0 AND createTime >'2024-01-01 00:00:00' and orderCode='153906243232'")
-	if err != nil {
-		panic(err)
-	}
-	//计算原金额
-	for _, row := range res.List() {
-		var (
-			orderCode = gconv.String(row["orderCode"])
-			payMoney  = gconv.Int(row["payMoney"])
-		)
-		beforeMoneyMap[orderCode] = beforeMoneyMap[orderCode] - payMoney
-	}
-	////加载已刷新过的业绩
-	//res2, err := g.DB().Query(context.TODO(), fmt.Sprintf("SELECT ordercode from %s ", table))
-	//if err != nil {
-	//	panic(err)
-	//}
-	//for _, row := range res2.List() {
-	//	var (
-	//		orderCode = gconv.String(row["ordercode"])
-	//	)
-	//	hasSaleMap[orderCode] = true
-	//}
-}
+const orderUpdateTime = "2024-10-10 00:00:00"
 
 
 func main() {
 func main() {
-	redRecord(context.TODO())
-	//CreateSaleRecord(context.TODO())
+	flushOrderSaleTime(false)
+	supplementFlush(false)
 }
 }
 
 
-func CreateSaleRecord(ctx context.Context) {
-	res, err := g.DB("release").Query(ctx, "SELECT order_status,order_money,order_code,pay_money,saleDep,salesperson_id,salesperson,saleMoney,is_backstage_order,sale_time,pay_time,refund_status,create_time FROM dataexport_order WHERE  order_code in ('153906243232')")
+// flushOrderSaleTime 订单表销售业绩同步
+func flushOrderSaleTime(flush bool) {
+	var (
+		ctx           = context.TODO()
+		updateMapping = map[string]string{}
+		start         = time.Now()
+	)
+
+	res, err := g.DB().Query(ctx, `SELECT ordercode,st,sale_time FROM
+				(SELECT ordercode,MIN(statistics_time)st FROM jianyu.order_sale_record
+				WHERE state IN (1,-1)
+				GROUP BY ordercode) ors
+				LEFT JOIN 
+				(SELECT order_code,sale_time FROM jianyu.dataexport_order) dco
+				ON ors.ordercode=dco.order_code
+				WHERE IF(LEFT(ors.st,10)=LEFT(sale_time,10),1,0)=0`)
 	if err != nil {
 	if err != nil {
 		panic(err)
 		panic(err)
 	}
 	}
-	var insertArr []map[string]interface{}
-	for _, m := range res.List() {
-		var (
-			pay_money          = gconv.Int(m["pay_money"])
-			order_money        = gconv.Int(m["order_money"])
-			is_backstage_order = gconv.Int(m["is_backstage_order"])
-			sale_time          = gconv.String(m["sale_time"])
-			order_code         = gconv.String(m["order_code"])
-			order_status       = gconv.Int(m["order_status"])
-			refund_status      = gconv.Int(m["refund_status"])
-			salesperson_id     = gconv.String(m["salesperson_id"])
-			salesperson        = gconv.String(m["salesperson"])
-			saleDep            = gconv.String(m["saleDep"])
-			create_time        = gconv.String(m["create_time"])
-
-			uuidStr         = uuid.New().String()
-			reason          = "" //协议归档
-			statistics_time = ""
-		)
-		//if _, ok := beforeMoneyMap[order_code]; ok {
-		//	continue
-		//}
-		//if _, ok := hasSaleMap[order_code]; ok {
-		//	continue
-		//}
-		if is_backstage_order == 1 {
-			//后台创建订单获取业绩时间
-			if (refund_status == 1 || refund_status == 2 || order_status == 1) && pay_money > 0 {
-				date, err := time.ParseInLocation(time.DateTime, sale_time, time.Local)
-				if err != nil {
-					g.Log().Printf(ctx, "格式化销售时间异常 %s %s", order_code, sale_time)
-					continue
-				}
-				if date.Month() > 3 && date.Year() == 2024 {
-					//管理后台创建的订单:协议归档时间和首笔回款时间的最小值。
-					res, _ := g.DB("release").GetOne(ctx, "SELECT * FROM (SELECT * FROM(SELECT contract_archive_time as t ,'0' as v  FROM contract WHERE order_code=? and contract_archive_time is NOT NULL) as t1 UNION ALL SELECT * FROM(SELECT return_time as t ,'1' as v FROM return_money_record WHERE order_code=? AND state=1) as t2) as d ORDER BY t asc LIMIT 1", order_code, order_code)
-					if !res.IsEmpty() {
-						var (
-							tStr = gconv.String(res.Map()["t"])
-							v    = gconv.String(res.Map()["v"])
-						)
-						if tStr != "" {
-							statistics_time = tStr
-						}
-						if v == "1" {
-							reason = "协议归档"
-						} else {
-							reason = "回款成功"
-						}
-					}
-				} else {
-					statistics_time = sale_time
-				}
-				if statistics_time == "" {
-					statistics_time = sale_time
-				}
-			}
-		} else {
-			//线上单子获取业绩时间
-			if pay_money > 0 {
-				reason = "回款成功"
-				statistics_time = gconv.String(m["pay_time"])
-			}
-		}
-		if statistics_time != sale_time && statistics_time != "" {
-			isSame := false
-			if sale_time != "" {
-				newData, old := "", ""
-				if arr := strings.Split(statistics_time, " "); len(arr) == 2 {
-					newData = arr[0]
-				}
-				if arr := strings.Split(sale_time, " "); len(arr) == 2 {
-					old = arr[0]
-				}
-				if newData == old && newData != "" {
-					isSame = true
-				}
-			}
-			if !isSame {
-				updateSaleTimeMapping[order_code] = map[string]interface{}{
-					"old_sale_time": sale_time,
-					"new_sale_time": statistics_time,
-				}
-			}
 
 
+	for i, m := range res.List() {
+		if i%1000 == 0 {
+			g.Log().Infof(ctx, "progress %d/%d", i, res.Len())
 		}
 		}
-
-		if salesperson_id != "" {
-			if strings.Contains(salesperson, ",") {
-				sale := saleMoneyObj{}
-				gconv.Struct(gconv.String(m["saleMoney"]), &sale)
-				idArr := strings.Split(salesperson_id, ",")
-				personArr := strings.Split(salesperson, ",")
-				depArr := strings.Split(saleDep, ",")
-				if len(sale.Data)-1 != len(idArr) || len(idArr) != len(personArr) {
-					g.Log().Errorf(ctx, "%s 数据格式异常 %d %d %d %d", order_code, len(sale.Data)-1, len(idArr), len(personArr), len(depArr))
-					continue
-				}
-				for index, name := range personArr {
-					var (
-						depCode string
-						money   int
-					)
-					if index > len(depArr)-1 {
-						depCode = depArr[0]
-					} else {
-						depCode = depArr[index]
-					}
-
-					dept, ok := codeDeptMapping[depCode]
-					if !ok {
-						g.Log().Errorf(ctx, "%s 未找到 %s 部门对应关系 ", order_code, depCode)
-						continue
-					}
-					for _, datum := range sale.Data {
-						if datum.Name == name {
-							money = gconv.Int(datum.Money * 100)
-						}
-					}
-					if money == 0 {
-						g.Log().Errorf(ctx, "%s 未找到 %s 对应业绩 ", order_code, name)
-						continue
-					}
-					m := map[string]interface{}{
-						"state":         2,
-						"ordercode":     order_code,
-						"saler_Id":      idArr[index],
-						"saler_name":    name,
-						"saler_dept":    dept.Name,
-						"saler_dept_id": dept.Id,
-						"change_value":  money,
-						"money":         money,
-						"group_uuid":    uuidStr,
-						"operator":      "系统自动",
-						"create_time":   create_time,
-					}
-					if statistics_time != "" {
-						m["statistics_time"] = statistics_time
-						m["state"] = 1
-						m["change_reason"] = reason
-					}
-					insertArr = append(insertArr, m)
-				}
-			} else {
-				dept, ok := codeDeptMapping[saleDep]
-				if !ok {
-					g.Log().Errorf(ctx, "%s 未找到 %s 部门对应关系 ", order_code, saleDep)
-					continue
-				}
-				var money = pay_money
-				if is_backstage_order == 0 {
-					money = order_money
-				}
-				m := map[string]interface{}{
-					"state":         2,
-					"ordercode":     order_code,
-					"saler_Id":      salesperson_id,
-					"saler_name":    salesperson,
-					"saler_dept":    dept.Name,
-					"saler_dept_id": dept.Id,
-					"change_value":  money,
-					"money":         money,
-					"group_uuid":    uuidStr,
-					"operator":      "系统自动",
-					"change_reason": reason,
-					"create_time":   create_time,
-				}
-				if statistics_time != "" {
-					m["statistics_time"] = statistics_time
-					m["state"] = 1
-					m["change_reason"] = reason
-				}
-				insertArr = append(insertArr, m)
-			}
-		} else {
-			money := order_money
-			if is_backstage_order == 1 {
-				money = pay_money
-			}
-			m := map[string]interface{}{
-				"state":         2,
-				"ordercode":     order_code,
-				"saler_Id":      -1,
-				"saler_name":    "-",
-				"saler_dept":    "运营部",
-				"saler_dept_id": 27103,
-				"change_value":  money,
-				"money":         money,
-				"group_uuid":    uuidStr,
-				"operator":      "系统自动",
-				"create_time":   create_time,
-			}
-			if statistics_time != "" {
-				m["statistics_time"] = statistics_time
-				m["state"] = 1
-				m["change_reason"] = "回款成功"
-			}
-			insertArr = append(insertArr, m)
+		var (
+			orderCode = gconv.String(m["ordercode"])
+			st        = gconv.String(m["st"])
+		)
+		if orderCode == "" || st == "" {
+			continue
 		}
 		}
-		//save
-		//if len(insertArr) >= 100 {
-		//	SaveDb(ctx, insertArr)
-		//	insertArr = []map[string]interface{}{}
-		//}
+		updateMapping[orderCode] = st
 	}
 	}
-	//save
-	//if len(insertArr) > 0 {
-	//	SaveDb(ctx, insertArr)
-	//	insertArr = []map[string]interface{}{}
-	//}
-	//UpdateSaleTime(context.TODO())
-
-	g.Log().Printf(ctx, "%d", len(updateSaleTimeMapping))
-	if err := gfile.PutContents("./aaa.json", gconv.String(updateSaleTimeMapping)); err != nil {
-		panic(err)
+	g.Log().Infof(ctx, "加载完成 耗时%v秒", time.Now().Sub(start).Seconds())
+	_ = gfile.PutContents("./update.json", gconv.String(updateMapping))
+	if !flush {
+		return
 	}
 	}
-}
-
-func SaveDb(ctx context.Context, data []map[string]interface{}) {
-	return
-	_, err := g.DB().Save(ctx, table, data, 10)
-	if err != nil {
-		g.Log().Errorf(ctx, "插入数据异常 %v", err)
-	}
-}
-
-func UpdateSaleTime(ctx context.Context) {
-	return
-	for orderCode, m := range updateSaleTimeMapping {
+	//更新销售时间
+	var (
+		total      = len(updateMapping)
+		index      = 0
+		updateTime = time.Now()
+	)
+	for orderCode, newTime := range updateMapping {
+		if index%1000 == 0 {
+			g.Log().Infof(ctx, "progress %d/%d", index, total)
+		}
 		_, err := g.DB().Update(ctx, "dataexport_order", map[string]interface{}{
 		_, err := g.DB().Update(ctx, "dataexport_order", map[string]interface{}{
-			"sale_time": m["new_sale_time"],
+			"sale_time":  newTime,
+			"autoUpdate": orderUpdateTime,
 		}, map[string]interface{}{
 		}, map[string]interface{}{
 			"order_code": orderCode,
 			"order_code": orderCode,
 		})
 		})
 		if err != nil {
 		if err != nil {
 			g.Log().Errorf(ctx, "%s err %v", orderCode, err)
 			g.Log().Errorf(ctx, "%s err %v", orderCode, err)
 		}
 		}
+		index++
 	}
 	}
+	g.Log().Infof(ctx, "更新完成 耗时%v秒", time.Now().Sub(updateTime).Seconds())
 }
 }
 
 
-// redRecord 红冲记录补全
-func redRecord(ctx context.Context) {
-
-	for orderCode, money := range beforeMoneyMap {
-		if _, ok := hasSaleMap[orderCode]; ok {
-			continue
-		}
-		var insertArr []map[string]interface{}
-		m, err := g.DB("release").GetOne(ctx, "SELECT order_status,order_money,order_code,pay_money,saleDep,salesperson_id,salesperson,saleMoney,is_backstage_order,sale_time,pay_time,refund_status,create_time FROM dataexport_order WHERE order_code=?", orderCode)
-		if err != nil || m.IsEmpty() {
-			g.Log().Errorf(ctx, "查询订单异常 %s", orderCode)
+// supplementFlush 销售业绩补录表部门
+func supplementFlush(flush bool) {
+	var (
+		ctx           = context.TODO()
+		updateMapping = map[string]int{}
+		start         = time.Now()
+	)
+	res, err := g.DB().Query(ctx, "SELECT id,salesperson_id FROM supplement_sale_person")
+	if err != nil {
+		panic(err)
+	}
+	for i, m := range res.List() {
+		if i%1000 == 0 {
+			g.Log().Infof(ctx, "progress %d/%d", i, res.Len())
 		}
 		}
 		var (
 		var (
-			is_backstage_order = gconv.Int(m["is_backstage_order"])
-			sale_time          = gconv.String(m["sale_time"])
-			order_code         = gconv.String(m["order_code"])
-			salesperson_id     = gconv.String(m["salesperson_id"])
-			salesperson        = gconv.String(m["salesperson"])
-			saleDep            = gconv.String(m["saleDep"])
-			create_time        = gconv.String(m["create_time"])
-			pay_money          = gconv.Int(m["pay_money"])
-
-			uuidStr         = uuid.New().String()
-			reason          = "" //协议归档
-			statistics_time = ""
+			orderId        = gconv.String(m["id"])
+			salesperson_id = gconv.Int64(m["salesperson_id"])
 		)
 		)
-
-		if is_backstage_order == 1 {
-			date, err := time.ParseInLocation(time.DateTime, sale_time, time.Local)
-			if err != nil {
-				g.Log().Printf(ctx, "格式化销售时间异常 %s %s", order_code, sale_time)
-				continue
-			}
-			if date.Month() > 3 && date.Year() == 2024 {
-				//管理后台创建的订单:协议归档时间和首笔回款时间的最小值。
-				res, _ := g.DB("release").GetOne(ctx, "SELECT * FROM (SELECT * FROM(SELECT contract_archive_time as t ,'0' as v  FROM contract WHERE order_code=? and contract_archive_time is NOT NULL) as t1 UNION ALL SELECT * FROM(SELECT return_time as t ,'1' as v FROM return_money_record WHERE order_code=? AND state=1) as t2) as d ORDER BY t asc LIMIT 1", order_code, order_code)
-				if !res.IsEmpty() {
-					var (
-						tStr = gconv.String(res.Map()["t"])
-						v    = gconv.String(res.Map()["v"])
-					)
-					if tStr != "" {
-						statistics_time = tStr
-					}
-					if v == "1" {
-						reason = "协议归档"
-					} else {
-						reason = "回款成功"
-					}
-				}
-			} else {
-				//用录入的业绩统计时间
-				statistics_time = sale_time
-			}
-			if statistics_time == "" {
-				statistics_time = sale_time
-			}
-		} else {
-			g.Log().Errorf(ctx, "线上单子", orderCode)
+		if orderId == "" || salesperson_id == 0 {
 			continue
 			continue
 		}
 		}
-
-		var lastRecord map[string]interface{}
-		if strings.Contains(salesperson, ",") {
-			g.Log().Errorf(ctx, "撞单单", orderCode)
-			continue
-		} else {
-			dept, ok := codeDeptMapping[saleDep]
-			if !ok {
-				g.Log().Errorf(ctx, "%s 未找到 %s 部门对应关系 ", order_code, saleDep)
-				continue
-			}
-			record := map[string]interface{}{
-				"state":           -1,
-				"ordercode":       order_code,
-				"saler_Id":        salesperson_id,
-				"saler_name":      salesperson,
-				"saler_dept":      dept.Name,
-				"saler_dept_id":   dept.Id,
-				"change_value":    pay_money + money,
-				"money":           pay_money + money,
-				"group_uuid":      uuidStr,
-				"operator":        "系统自动",
-				"change_reason":   reason,
-				"statistics_time": statistics_time,
-				"create_time":     create_time,
-			}
-			insertArr = append(insertArr, record)
-			lastRecord = record
+		deptId, _, _, _ := util.GetDeptInfoByAdminId(salesperson_id)
+		if deptId > 0 {
+			updateMapping[orderId] = deptId
 		}
 		}
+	}
+	g.Log().Infof(ctx, "supplementFlush 加载完成 耗时%v秒", time.Now().Sub(start).Seconds())
+	if !flush {
+		return
+	}
 
 
-		//红冲记录插入
-		res, err := g.DB("release").Query(ctx, "SELECT createTime,orderCode,payMoney from moneyCorrection WHERE redType='金额红冲' and payMoney!=0 AND orderCode=? order by createTime asc", orderCode)
-		if err != nil {
-			panic(err)
+	var (
+		total      = len(updateMapping)
+		index      = 0
+		updateTime = time.Now()
+	)
+	for orderId, deptId := range updateMapping {
+		if index%1000 == 0 {
+			g.Log().Infof(ctx, "progress %d/%d", index, total)
 		}
 		}
-
-		for index, row := range res.List() {
-			var (
-				createTime = gconv.String(row["createTime"])
-				payMoney   = gconv.Int(row["payMoney"])
-				newRecord  = map[string]interface{}{}
-			)
-			for key, value := range lastRecord {
-				newRecord[key] = value
-			}
-			lastUUid := lastRecord["group_uuid"]
-			newRecord["change_value"] = payMoney
-			newRecord["money"] = gconv.Int(lastRecord["money"]) + payMoney
-			newRecord["group_uuid"] = uuid.New().String()
-			newRecord["last_group_uuid"] = lastUUid
-			newRecord["operator"] = "系统自动"
-			newRecord["change_reason"] = "业绩红冲"
-			newRecord["statistics_time"] = createTime
-			newRecord["create_time"] = createTime
-			if index == res.Len()-1 {
-				newRecord["state"] = 1
-			}
-			lastRecord = newRecord
-			insertArr = append(insertArr, newRecord)
+		_, err := g.DB().Update(ctx, "supplement_sale_person", map[string]interface{}{
+			"saleDep": deptId,
+		}, map[string]interface{}{
+			"id": orderId,
+		})
+		if err != nil {
+			g.Log().Errorf(ctx, "%s err %v", orderId, err)
 		}
 		}
-		SaveDb(ctx, insertArr)
+		index++
 	}
 	}
+	g.Log().Infof(ctx, "supplementFlush 更新完成 耗时%v秒", time.Now().Sub(updateTime).Seconds())
 }
 }

+ 188 - 0
saleFlush/util/deptUtil.go

@@ -0,0 +1,188 @@
+package util
+
+import (
+	"app.yhyue.com/moapp/jybase/common"
+	"context"
+	"fmt"
+	"github.com/gogf/gf/v2/crypto/gmd5"
+	"github.com/gogf/gf/v2/frame/g"
+	"github.com/gogf/gf/v2/os/gcron"
+	"github.com/gogf/gf/v2/util/gconv"
+	"sync"
+)
+
+type (
+	DeptManager struct {
+		deptTree      *DeptStruct
+		idDeptMapping map[int]*DeptStruct
+		lock          *sync.RWMutex
+		lastMd5       string
+	}
+	DeptStruct struct {
+		IsRoot   bool          `json:"-"`
+		Id       int           `json:"value"`
+		Pid      int           `json:"-"`
+		FullName string        `json:"-"`
+		Name     string        `json:"label"`
+		Children []*DeptStruct `json:"children,omitempty"`
+	}
+)
+
+var (
+	JyDepartmentManager = &DeptManager{
+		lock: &sync.RWMutex{},
+	}
+	ctx = context.TODO()
+)
+
+func init() {
+	JyDepartmentManager.initAndUpdateDeptManager(ctx)
+	c, e := gcron.Add(ctx, g.Cfg().MustGet(ctx, "updateMiniProgram", "5 * * * * *").String(), JyDepartmentManager.initAndUpdateDeptManager)
+	if e != nil {
+		g.Log().Errorf(ctx, "initAndUpdateDeptManager cron任务异常 %v", e)
+	}
+	c.Status()
+}
+
+func (mge *DeptManager) initAndUpdateDeptManager(ctx context.Context) {
+	res, err := g.DB().Query(ctx, "SELECT id,pid,name FROM entniche_department where ent_id=? ", 25917)
+	if err != nil {
+		panic(err)
+	}
+	if res.IsEmpty() {
+		return
+	}
+	md5Str := gmd5.MustEncryptString(gconv.String(res))
+	if mge.lastMd5 != "" && mge.lastMd5 == md5Str {
+		return
+	}
+	var (
+		deptTree      *DeptStruct
+		allDept       []*DeptStruct
+		idDeptMapping = map[int]*DeptStruct{}
+
+		loopCount = 0
+	)
+
+	for _, m := range res.List() {
+		var (
+			id   = gconv.Int(m["id"])
+			pid  = gconv.Int(m["pid"])
+			name = gconv.String(m["name"])
+		)
+		deptObj := &DeptStruct{
+			Id:   id,
+			Pid:  pid,
+			Name: name,
+		}
+		if pid == 0 { //公司根部门id
+			deptObj.IsRoot = true
+			deptTree = deptObj
+			idDeptMapping[deptObj.Id] = deptObj
+		}
+
+		allDept = append(allDept, deptObj)
+	}
+	//拼接组织架构树
+	for len(idDeptMapping) != res.Len() {
+		for _, deptStruct := range allDept {
+			_, ok1 := idDeptMapping[deptStruct.Id]
+			if ok1 {
+				continue
+			}
+			p, ok2 := idDeptMapping[deptStruct.Pid]
+			if ok2 {
+				p.Children = append(p.Children, deptStruct)
+				idDeptMapping[deptStruct.Id] = deptStruct
+			}
+		}
+		loopCount++
+		if loopCount == 50 {
+			break
+		}
+	}
+	mge.lock.Lock()
+	defer mge.lock.Unlock()
+
+	mge.deptTree = deptTree
+	mge.idDeptMapping = idDeptMapping
+	mge.lastMd5 = md5Str
+	//递归获取部门全名
+	for _, deptStruct := range idDeptMapping {
+		deptStruct.FullName = mge.getDeptFullName(deptStruct.Id)
+	}
+}
+
+func (mge *DeptManager) getDeptFullName(deptId int) string {
+	node, ok := mge.idDeptMapping[deptId]
+	if !ok {
+		return ""
+	}
+	if pNode, _ := mge.idDeptMapping[node.Pid]; pNode != nil {
+		if pNode.IsRoot {
+			return node.Name
+		} else {
+			return fmt.Sprintf("%s/%s", mge.getDeptFullName(pNode.Id), node.Name)
+		}
+	}
+	return node.Name
+}
+
+// GetFullDeptName 通过部门id获取部门全名
+func (mge *DeptManager) GetFullDeptName(deptId int) string {
+	dept, ok := mge.idDeptMapping[deptId]
+	if !ok {
+		return ""
+	}
+	mge.lock.RLock()
+	defer mge.lock.RUnlock()
+	return dept.FullName
+}
+
+// GetShowDeptTree 根据部门名字获取展示根部门
+func (mge *DeptManager) GetShowDeptTree(deptName ...string) (rData []interface{}) {
+	mge.lock.RLock()
+	defer mge.lock.RUnlock()
+	for _, child := range mge.deptTree.Children {
+		var ok bool
+		for _, name := range deptName {
+			if child.Name == name {
+				ok = true
+				break
+			}
+		}
+		if ok {
+			rData = append(rData, child)
+		}
+	}
+	return rData
+}
+
+// GetDeptInfoByAdminId 通过管理后台用户id获取销售人员部分
+func GetDeptInfoByAdminId(adminId interface{}) (deptId int, deptName, userName string, err error) {
+	res, err := g.DB().Query(context.TODO(), `SELECT
+		d.name as deptName,
+		d.id as deptId,
+		u.name as userName
+	FROM
+		jianyu.entniche_user u
+		INNER JOIN jianyu.entniche_department_user e
+		INNER JOIN jianyu.entniche_department d
+		INNER JOIN cadmin.admin_user c
+		on
+		( u.id = e.user_id AND e.dept_id=d.id AND c.phone=u.phone ) 
+	WHERE
+		 u.ent_id = '25917'
+	 AND c.id=?`, adminId)
+	if res.IsEmpty() {
+		err = fmt.Errorf("查询部门信息异常")
+		return
+	}
+	deptName = common.ObjToString(res.List()[0]["deptName"])
+	userName = common.ObjToString(res.List()[0]["userName"])
+	deptId = common.IntAll(res.List()[0]["deptId"])
+	if allName := JyDepartmentManager.GetFullDeptName(deptId); allName != "" {
+		deptName = allName
+	}
+	return
+}

+ 467 - 0
saleFlush/历史业绩刷库.go_bak

@@ -0,0 +1,467 @@
+package main
+
+import (
+	"context"
+	_ "github.com/gogf/gf/contrib/drivers/mysql/v2"
+	"github.com/gogf/gf/v2/frame/g"
+	"github.com/gogf/gf/v2/os/gfile"
+	"github.com/gogf/gf/v2/util/gconv"
+	"github.com/google/uuid"
+	"strings"
+	"time"
+)
+
+var (
+	deptMapping = `[
+	{"oldCode":"010000","show":"销售一部","newId":"58435"},
+	{"oldCode":"010100","show":"销售一部/电销部","newId":"26820"},
+	{"oldCode":"010101","show":"销售一部/电销部/电销一组","newId":"26821"},
+	{"oldCode":"010102","show":"销售一部/电销部/电销二组","newId":"26822"},
+	{"oldCode":"010103","show":"销售一部/电销部/电销三组","newId":"26823"},
+	{"oldCode":"010104","show":"销售一部/电销部/电销四组","newId":"26824"},	
+	{"oldCode":"010200","show":"销售一部/大客户部","newId":"27275"},
+	{"oldCode":"010300","show":"销售一部/渠道部","newId":"-1"},	
+	{"oldCode":"020000","show":"产品部","newId":"26920"},
+	{"oldCode":"020100","show":"产品部/售后服务组","newId":"58437"},	
+	{"oldCode":"020200","show":"产品部/客户成功组","newId":"27777"},	
+	{"oldCode":"030000","show":"销售二部","newId":"58416"},
+	{"oldCode":"040000","show":"运营部","newId":"27103"},	
+	{"oldCode":"040100","show":"运营部/客户成功组","newId":"59005"},
+	{"oldCode":"040200","show":"运营部/运营组","newId":"59028"},
+	{"oldCode":"050000","show":"销售三部","newId":"27955"},
+	{"oldCode":"060000","show":"市场部","newId":"59010"},		
+	{"oldCode":"060100","show":"市场部/市场组","newId":"59011"},
+	{"oldCode":"060200","show":"市场部/大客组","newId":"59017"},
+	{"oldCode":"070000","show":"数据事业部","newId":"59006"},
+	{"oldCode":"070100","show":"数据事业部/销售组","newId":"59012"},
+	{"oldCode":"070200","show":"数据事业部/售前与售后组","newId":"59007"}
+	]`
+	codeDeptMapping = map[string]*newDept{}
+	beforeMoneyMap  = map[string]int{}  //红冲单子
+	hasSaleMap      = map[string]bool{} //已存在业绩
+	table           = "order_sale_record"
+
+	updateSaleTimeMapping = map[string]map[string]interface{}{}
+)
+
+type (
+	saleMoneyObj struct {
+		Data []struct {
+			Name  string  `json:"name"`
+			Money float64 `json:"money"`
+		} `json:"data"`
+	}
+	newDept struct {
+		Name string
+		Id   int
+	}
+)
+
+func init() {
+	//加载历史部门
+	for _, m := range gconv.Maps(deptMapping) {
+		codeDeptMapping[gconv.String(m["oldCode"])] = &newDept{
+			Name: gconv.String(m["show"]),
+			Id:   gconv.Int(m["newId"]),
+		}
+	}
+	//加载红冲记录
+	res, err := g.DB("release").Query(context.TODO(), "SELECT createTime,orderCode,payMoney from moneyCorrection WHERE redType='金额红冲' and payMoney!=0 AND createTime >'2024-01-01 00:00:00' and orderCode='153906243232'")
+	if err != nil {
+		panic(err)
+	}
+	//计算原金额
+	for _, row := range res.List() {
+		var (
+			orderCode = gconv.String(row["orderCode"])
+			payMoney  = gconv.Int(row["payMoney"])
+		)
+		beforeMoneyMap[orderCode] = beforeMoneyMap[orderCode] - payMoney
+	}
+	////加载已刷新过的业绩
+	//res2, err := g.DB().Query(context.TODO(), fmt.Sprintf("SELECT ordercode from %s ", table))
+	//if err != nil {
+	//	panic(err)
+	//}
+	//for _, row := range res2.List() {
+	//	var (
+	//		orderCode = gconv.String(row["ordercode"])
+	//	)
+	//	hasSaleMap[orderCode] = true
+	//}
+}
+
+func main() {
+	redRecord(context.TODO())
+	//CreateSaleRecord(context.TODO())
+}
+
+func CreateSaleRecord(ctx context.Context) {
+	res, err := g.DB("release").Query(ctx, "SELECT order_status,order_money,order_code,pay_money,saleDep,salesperson_id,salesperson,saleMoney,is_backstage_order,sale_time,pay_time,refund_status,create_time FROM dataexport_order WHERE  order_code in ('153906243232')")
+	if err != nil {
+		panic(err)
+	}
+	var insertArr []map[string]interface{}
+	for _, m := range res.List() {
+		var (
+			pay_money          = gconv.Int(m["pay_money"])
+			order_money        = gconv.Int(m["order_money"])
+			is_backstage_order = gconv.Int(m["is_backstage_order"])
+			sale_time          = gconv.String(m["sale_time"])
+			order_code         = gconv.String(m["order_code"])
+			order_status       = gconv.Int(m["order_status"])
+			refund_status      = gconv.Int(m["refund_status"])
+			salesperson_id     = gconv.String(m["salesperson_id"])
+			salesperson        = gconv.String(m["salesperson"])
+			saleDep            = gconv.String(m["saleDep"])
+			create_time        = gconv.String(m["create_time"])
+
+			uuidStr         = uuid.New().String()
+			reason          = "" //协议归档
+			statistics_time = ""
+		)
+		//if _, ok := beforeMoneyMap[order_code]; ok {
+		//	continue
+		//}
+		//if _, ok := hasSaleMap[order_code]; ok {
+		//	continue
+		//}
+		if is_backstage_order == 1 {
+			//后台创建订单获取业绩时间
+			if (refund_status == 1 || refund_status == 2 || order_status == 1) && pay_money > 0 {
+				date, err := time.ParseInLocation(time.DateTime, sale_time, time.Local)
+				if err != nil {
+					g.Log().Printf(ctx, "格式化销售时间异常 %s %s", order_code, sale_time)
+					continue
+				}
+				if date.Month() > 3 && date.Year() == 2024 {
+					//管理后台创建的订单:协议归档时间和首笔回款时间的最小值。
+					res, _ := g.DB("release").GetOne(ctx, "SELECT * FROM (SELECT * FROM(SELECT contract_archive_time as t ,'0' as v  FROM contract WHERE order_code=? and contract_archive_time is NOT NULL) as t1 UNION ALL SELECT * FROM(SELECT return_time as t ,'1' as v FROM return_money_record WHERE order_code=? AND state=1) as t2) as d ORDER BY t asc LIMIT 1", order_code, order_code)
+					if !res.IsEmpty() {
+						var (
+							tStr = gconv.String(res.Map()["t"])
+							v    = gconv.String(res.Map()["v"])
+						)
+						if tStr != "" {
+							statistics_time = tStr
+						}
+						if v == "1" {
+							reason = "协议归档"
+						} else {
+							reason = "回款成功"
+						}
+					}
+				} else {
+					statistics_time = sale_time
+				}
+				if statistics_time == "" {
+					statistics_time = sale_time
+				}
+			}
+		} else {
+			//线上单子获取业绩时间
+			if pay_money > 0 {
+				reason = "回款成功"
+				statistics_time = gconv.String(m["pay_time"])
+			}
+		}
+		if statistics_time != sale_time && statistics_time != "" {
+			isSame := false
+			if sale_time != "" {
+				newData, old := "", ""
+				if arr := strings.Split(statistics_time, " "); len(arr) == 2 {
+					newData = arr[0]
+				}
+				if arr := strings.Split(sale_time, " "); len(arr) == 2 {
+					old = arr[0]
+				}
+				if newData == old && newData != "" {
+					isSame = true
+				}
+			}
+			if !isSame {
+				updateSaleTimeMapping[order_code] = map[string]interface{}{
+					"old_sale_time": sale_time,
+					"new_sale_time": statistics_time,
+				}
+			}
+
+		}
+
+		if salesperson_id != "" {
+			if strings.Contains(salesperson, ",") {
+				sale := saleMoneyObj{}
+				gconv.Struct(gconv.String(m["saleMoney"]), &sale)
+				idArr := strings.Split(salesperson_id, ",")
+				personArr := strings.Split(salesperson, ",")
+				depArr := strings.Split(saleDep, ",")
+				if len(sale.Data)-1 != len(idArr) || len(idArr) != len(personArr) {
+					g.Log().Errorf(ctx, "%s 数据格式异常 %d %d %d %d", order_code, len(sale.Data)-1, len(idArr), len(personArr), len(depArr))
+					continue
+				}
+				for index, name := range personArr {
+					var (
+						depCode string
+						money   int
+					)
+					if index > len(depArr)-1 {
+						depCode = depArr[0]
+					} else {
+						depCode = depArr[index]
+					}
+
+					dept, ok := codeDeptMapping[depCode]
+					if !ok {
+						g.Log().Errorf(ctx, "%s 未找到 %s 部门对应关系 ", order_code, depCode)
+						continue
+					}
+					for _, datum := range sale.Data {
+						if datum.Name == name {
+							money = gconv.Int(datum.Money * 100)
+						}
+					}
+					if money == 0 {
+						g.Log().Errorf(ctx, "%s 未找到 %s 对应业绩 ", order_code, name)
+						continue
+					}
+					m := map[string]interface{}{
+						"state":         2,
+						"ordercode":     order_code,
+						"saler_Id":      idArr[index],
+						"saler_name":    name,
+						"saler_dept":    dept.Name,
+						"saler_dept_id": dept.Id,
+						"change_value":  money,
+						"money":         money,
+						"group_uuid":    uuidStr,
+						"operator":      "系统自动",
+						"create_time":   create_time,
+					}
+					if statistics_time != "" {
+						m["statistics_time"] = statistics_time
+						m["state"] = 1
+						m["change_reason"] = reason
+					}
+					insertArr = append(insertArr, m)
+				}
+			} else {
+				dept, ok := codeDeptMapping[saleDep]
+				if !ok {
+					g.Log().Errorf(ctx, "%s 未找到 %s 部门对应关系 ", order_code, saleDep)
+					continue
+				}
+				var money = pay_money
+				if is_backstage_order == 0 {
+					money = order_money
+				}
+				m := map[string]interface{}{
+					"state":         2,
+					"ordercode":     order_code,
+					"saler_Id":      salesperson_id,
+					"saler_name":    salesperson,
+					"saler_dept":    dept.Name,
+					"saler_dept_id": dept.Id,
+					"change_value":  money,
+					"money":         money,
+					"group_uuid":    uuidStr,
+					"operator":      "系统自动",
+					"change_reason": reason,
+					"create_time":   create_time,
+				}
+				if statistics_time != "" {
+					m["statistics_time"] = statistics_time
+					m["state"] = 1
+					m["change_reason"] = reason
+				}
+				insertArr = append(insertArr, m)
+			}
+		} else {
+			money := order_money
+			if is_backstage_order == 1 {
+				money = pay_money
+			}
+			m := map[string]interface{}{
+				"state":         2,
+				"ordercode":     order_code,
+				"saler_Id":      -1,
+				"saler_name":    "-",
+				"saler_dept":    "运营部",
+				"saler_dept_id": 27103,
+				"change_value":  money,
+				"money":         money,
+				"group_uuid":    uuidStr,
+				"operator":      "系统自动",
+				"create_time":   create_time,
+			}
+			if statistics_time != "" {
+				m["statistics_time"] = statistics_time
+				m["state"] = 1
+				m["change_reason"] = "回款成功"
+			}
+			insertArr = append(insertArr, m)
+		}
+		//save
+		//if len(insertArr) >= 100 {
+		//	SaveDb(ctx, insertArr)
+		//	insertArr = []map[string]interface{}{}
+		//}
+	}
+	//save
+	//if len(insertArr) > 0 {
+	//	SaveDb(ctx, insertArr)
+	//	insertArr = []map[string]interface{}{}
+	//}
+	//UpdateSaleTime(context.TODO())
+
+	g.Log().Printf(ctx, "%d", len(updateSaleTimeMapping))
+	if err := gfile.PutContents("./aaa.json", gconv.String(updateSaleTimeMapping)); err != nil {
+		panic(err)
+	}
+}
+
+func SaveDb(ctx context.Context, data []map[string]interface{}) {
+	return
+	_, err := g.DB().Save(ctx, table, data, 10)
+	if err != nil {
+		g.Log().Errorf(ctx, "插入数据异常 %v", err)
+	}
+}
+
+func UpdateSaleTime(ctx context.Context) {
+	return
+	for orderCode, m := range updateSaleTimeMapping {
+		_, err := g.DB().Update(ctx, "dataexport_order", map[string]interface{}{
+			"sale_time": m["new_sale_time"],
+		}, map[string]interface{}{
+			"order_code": orderCode,
+		})
+		if err != nil {
+			g.Log().Errorf(ctx, "%s err %v", orderCode, err)
+		}
+	}
+}
+
+// redRecord 红冲记录补全
+func redRecord(ctx context.Context) {
+
+	for orderCode, money := range beforeMoneyMap {
+		if _, ok := hasSaleMap[orderCode]; ok {
+			continue
+		}
+		var insertArr []map[string]interface{}
+		m, err := g.DB("release").GetOne(ctx, "SELECT order_status,order_money,order_code,pay_money,saleDep,salesperson_id,salesperson,saleMoney,is_backstage_order,sale_time,pay_time,refund_status,create_time FROM dataexport_order WHERE order_code=?", orderCode)
+		if err != nil || m.IsEmpty() {
+			g.Log().Errorf(ctx, "查询订单异常 %s", orderCode)
+		}
+		var (
+			is_backstage_order = gconv.Int(m["is_backstage_order"])
+			sale_time          = gconv.String(m["sale_time"])
+			order_code         = gconv.String(m["order_code"])
+			salesperson_id     = gconv.String(m["salesperson_id"])
+			salesperson        = gconv.String(m["salesperson"])
+			saleDep            = gconv.String(m["saleDep"])
+			create_time        = gconv.String(m["create_time"])
+			pay_money          = gconv.Int(m["pay_money"])
+
+			uuidStr         = uuid.New().String()
+			reason          = "" //协议归档
+			statistics_time = ""
+		)
+
+		if is_backstage_order == 1 {
+			date, err := time.ParseInLocation(time.DateTime, sale_time, time.Local)
+			if err != nil {
+				g.Log().Printf(ctx, "格式化销售时间异常 %s %s", order_code, sale_time)
+				continue
+			}
+			if date.Month() > 3 && date.Year() == 2024 {
+				//管理后台创建的订单:协议归档时间和首笔回款时间的最小值。
+				res, _ := g.DB("release").GetOne(ctx, "SELECT * FROM (SELECT * FROM(SELECT contract_archive_time as t ,'0' as v  FROM contract WHERE order_code=? and contract_archive_time is NOT NULL) as t1 UNION ALL SELECT * FROM(SELECT return_time as t ,'1' as v FROM return_money_record WHERE order_code=? AND state=1) as t2) as d ORDER BY t asc LIMIT 1", order_code, order_code)
+				if !res.IsEmpty() {
+					var (
+						tStr = gconv.String(res.Map()["t"])
+						v    = gconv.String(res.Map()["v"])
+					)
+					if tStr != "" {
+						statistics_time = tStr
+					}
+					if v == "1" {
+						reason = "协议归档"
+					} else {
+						reason = "回款成功"
+					}
+				}
+			} else {
+				//用录入的业绩统计时间
+				statistics_time = sale_time
+			}
+			if statistics_time == "" {
+				statistics_time = sale_time
+			}
+		} else {
+			g.Log().Errorf(ctx, "线上单子", orderCode)
+			continue
+		}
+
+		var lastRecord map[string]interface{}
+		if strings.Contains(salesperson, ",") {
+			g.Log().Errorf(ctx, "撞单单", orderCode)
+			continue
+		} else {
+			dept, ok := codeDeptMapping[saleDep]
+			if !ok {
+				g.Log().Errorf(ctx, "%s 未找到 %s 部门对应关系 ", order_code, saleDep)
+				continue
+			}
+			record := map[string]interface{}{
+				"state":           -1,
+				"ordercode":       order_code,
+				"saler_Id":        salesperson_id,
+				"saler_name":      salesperson,
+				"saler_dept":      dept.Name,
+				"saler_dept_id":   dept.Id,
+				"change_value":    pay_money + money,
+				"money":           pay_money + money,
+				"group_uuid":      uuidStr,
+				"operator":        "系统自动",
+				"change_reason":   reason,
+				"statistics_time": statistics_time,
+				"create_time":     create_time,
+			}
+			insertArr = append(insertArr, record)
+			lastRecord = record
+		}
+
+		//红冲记录插入
+		res, err := g.DB("release").Query(ctx, "SELECT createTime,orderCode,payMoney from moneyCorrection WHERE redType='金额红冲' and payMoney!=0 AND orderCode=? order by createTime asc", orderCode)
+		if err != nil {
+			panic(err)
+		}
+
+		for index, row := range res.List() {
+			var (
+				createTime = gconv.String(row["createTime"])
+				payMoney   = gconv.Int(row["payMoney"])
+				newRecord  = map[string]interface{}{}
+			)
+			for key, value := range lastRecord {
+				newRecord[key] = value
+			}
+			lastUUid := lastRecord["group_uuid"]
+			newRecord["change_value"] = payMoney
+			newRecord["money"] = gconv.Int(lastRecord["money"]) + payMoney
+			newRecord["group_uuid"] = uuid.New().String()
+			newRecord["last_group_uuid"] = lastUUid
+			newRecord["operator"] = "系统自动"
+			newRecord["change_reason"] = "业绩红冲"
+			newRecord["statistics_time"] = createTime
+			newRecord["create_time"] = createTime
+			if index == res.Len()-1 {
+				newRecord["state"] = 1
+			}
+			lastRecord = newRecord
+			insertArr = append(insertArr, newRecord)
+		}
+		SaveDb(ctx, insertArr)
+	}
+}