Ver Fonte

分配加锁

xuzhiheng há 2 anos atrás
pai
commit
9042893571
3 ficheiros alterados com 56 adições e 29 exclusões
  1. 3 2
      api/internal/logic/distributecluelogic.go
  2. 12 11
      entity/entity.go
  3. 41 16
      service/clue.go

+ 3 - 2
api/internal/logic/distributecluelogic.go

@@ -8,6 +8,7 @@ import (
 	"bp.jydev.jianyu360.cn/BaseService/biService/api/internal/svc"
 	"bp.jydev.jianyu360.cn/BaseService/biService/api/internal/types"
 	"bp.jydev.jianyu360.cn/BaseService/biService/rpc/biservice"
+	"github.com/gogf/gf/v2/util/gconv"
 	"github.com/zeromicro/go-zero/core/logx"
 )
 
@@ -31,10 +32,10 @@ func (l *DistributeClueLogic) DistributeClue(req *types.DistributeClueReq) (resp
 	for _, v := range req.Datas {
 		data := &biservice.DistributeDatas{
 			Name:             common.ObjToString(v["name"]),
-			PositionId:       common.Int64All(v["positionId"]),
+			PositionId:       gconv.Int64(v["positionId"]),
 			TotalCount:       common.ObjToString(v["totalCount"]),
 			UncompletedCount: common.ObjToString(v["uncompletedCount"]),
-			DistributedCount: common.Int64All(v["distributedCount"]),
+			DistributedCount: gconv.Int64(v["distributedCount"]),
 		}
 		datas = append(datas, data)
 	}

+ 12 - 11
entity/entity.go

@@ -18,17 +18,18 @@ import (
 )
 
 var (
-	JyMysql    *mysql.Mysql
-	JyDocMysql *mysql.Mysql
-	JyBiMysql  *mysql.Mysql
-	JyTidb     *mysql.Mysql
-	JyBiTidb   *mysql.Mysql
-	Mgo        *mongodb.MongodbSim
-	Es         elastic.Es
-	AreaCode   = map[string]string{}
-	Hlyj       *HlyjS
-	DataLock   = sync.Mutex{}
-	CodeTrail  = map[string]string{
+	JyMysql        *mysql.Mysql
+	JyDocMysql     *mysql.Mysql
+	JyBiMysql      *mysql.Mysql
+	JyTidb         *mysql.Mysql
+	JyBiTidb       *mysql.Mysql
+	Mgo            *mongodb.MongodbSim
+	Es             elastic.Es
+	AreaCode       = map[string]string{}
+	Hlyj           *HlyjS
+	DataLock       = sync.Mutex{}
+	DistributeLock = sync.Mutex{}
+	CodeTrail      = map[string]string{
 		"00": "无意向客户",
 		"01": "商机线索",
 		"02": "空号停机",

+ 41 - 16
service/clue.go

@@ -15,29 +15,42 @@ import (
 )
 
 func DistributeClue(this *biservice.DistributeClueReq) *biservice.AddProjectResp {
-	saleMap, status, count := map[string]map[string]interface{}{}, int64(1), 0
-	saleData := JyBiTidb.SelectBySql("select * from jy_salesperson_info where is_complete = 1 or is_complete = 0")
-	if saleData != nil && len(*saleData) > 0 {
-		for _, v := range *saleData {
-			name := common.ObjToString(v["name"])
-			saleMap[name] = v
-		}
-	}
-	for _, data := range this.Datas {
-		seatNumber := common.ObjToString(saleMap[data.Name]["seatNumber"])
-		distributedCount := int(data.DistributedCount)
-		distributedArr := this.ClueIdList[count : count+distributedCount]
-		count += distributedCount
-		DistributeClueMore(saleMap, distributedArr, seatNumber, data.Name, data.PositionId, this.PositionId)
-	}
+
+	count, status := DistributeClueSync(this)
+	log.Println("分配数量 ", count)
 	return &biservice.AddProjectResp{
 		ErrorCode: 0,
 		Data: &biservice.AddProject{
-			Status: status,
+			Status: int64(status),
+			Count:  int64(count),
 		},
 	}
 }
 
+func DistributeClueSync(this *biservice.DistributeClueReq) (int, int) {
+	if DistributeLock.TryLock() {
+		defer DistributeLock.Unlock()
+		saleMap, count := map[string]map[string]interface{}{}, 0
+		saleData := JyBiTidb.SelectBySql("select * from jy_salesperson_info where is_complete = 1 or is_complete = 0")
+		if saleData != nil && len(*saleData) > 0 {
+			for _, v := range *saleData {
+				name := common.ObjToString(v["name"])
+				saleMap[name] = v
+			}
+		}
+		for _, data := range this.Datas {
+			seatNumber := common.ObjToString(saleMap[data.Name]["seatNumber"])
+			distributedCount := int(data.DistributedCount)
+			distributedArr := this.ClueIdList[count : count+distributedCount]
+			count += distributedCount
+			DistributeClueMore(saleMap, distributedArr, seatNumber, data.Name, data.PositionId, this.PositionId)
+		}
+		return count, 1
+	} else {
+		return 0, 2
+	}
+}
+
 func DistributeClueMore(saleMap map[string]map[string]interface{}, distributedArr []int64, seatNumber, name string, positionId, thispositionId int64) {
 	wg := new(sync.WaitGroup)
 	ch := make(chan bool, 20)
@@ -55,6 +68,7 @@ func DistributeClueMore(saleMap map[string]map[string]interface{}, distributedAr
 				isAssign := common.IntAll((*clueData)["is_assign"])
 				clueSeatNumber := common.ObjToString((*clueData)["seatNumber"])
 				oldName := ""
+				trailstatus := common.ObjToString((*clueData)["trailstatus"])
 				if clueSeatNumber != "" {
 					for _, s := range saleMap {
 						if common.ObjToString(s["seatNumber"]) == clueSeatNumber {
@@ -90,6 +104,17 @@ func DistributeClueMore(saleMap map[string]map[string]interface{}, distributedAr
 						log.Println("私海修改失败 ", v, positionId, seatNumber)
 					}
 				} else {
+					updateClue := map[string]interface{}{
+						"position_id": positionId,
+						"seatNumber":  seatNumber,
+						"is_assign":   1,
+						"updatetime":  nowTime,
+						"comeintime":  nowTime,
+					}
+					if trailstatus != "08" {
+						updateClue["trailstatus"] = "01"
+					}
+					JyBiTidb.Update("dwd_f_crm_clue_info", map[string]interface{}{"id": v}, updateClue)
 					seaId := JyBiTidb.Insert("dwd_f_crm_private_sea", map[string]interface{}{
 						"clue_id":      v,
 						"position_id":  positionId,