xingzai 1 年間 前
コミット
c31123d4ce

+ 92 - 20
controllers/cygx/contract_allocation.go

@@ -12,6 +12,7 @@ import (
 	"hongze/hz_crm_api/models/system"
 	cygxService "hongze/hz_crm_api/services/cygx"
 	"hongze/hz_crm_api/utils"
+	"math"
 	"strconv"
 	"strings"
 	"time"
@@ -417,7 +418,7 @@ func (this *ContractAllocationController) CompanyContracDetail() {
 		resp.Money = resp.Money - moneyYx
 		respItemYx.Proportion = moneyYx
 		respItemYx.ChartPermissionName = utils.CHART_PERMISSION_NAME_MF_YANXUAN
-		respItemYx.List = append(respItemYx.List, &cygx.AllocationRealNameListResp{utils.CHART_PERMISSION_NAME_MF_YANXUAN, 0, 0})
+		respItemYx.List = append(respItemYx.List, &cygx.AllocationRealNameListResp{utils.CHART_PERMISSION_NAME_MF_YANXUAN, 0, moneyYx})
 	} else {
 		resp.TotalPointsContent = fmt.Sprint(resp.Money, "W")
 	}
@@ -460,7 +461,7 @@ func (this *ContractAllocationController) CompanyContracDetail() {
 			return
 		}
 		for _, v := range listUser {
-			if showDetail && v.Proportion == 0 {
+			if showDetail && v.Money == 0 {
 				continue
 			}
 			item := new(cygx.AllocationRealNameListResp)
@@ -476,7 +477,7 @@ func (this *ContractAllocationController) CompanyContracDetail() {
 			return
 		}
 		for _, v := range listPermission {
-			if showDetail && v.Proportion == 0 {
+			if showDetail && v.Money == 0 {
 				continue
 			}
 			respItem := new(cygx.AllocationPermissionListResp)
@@ -533,13 +534,56 @@ func (this *ContractAllocationController) CompanyContracUpdate() {
 		br.ErrMsg = "获取合同信息失败,Err:" + err.Error()
 		return
 	}
+	money := contractItem.Money / 10000 // 合同金额,万为单位
+	var moneyAvg float64                // 行业所占合同的平均金额
+	hasPermissions, e := company.GetCompanyContractPermissionByCompanyContractId(companyContractId)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取合同权限信息失败,Err:" + e.Error()
+		return
+	}
 
-	fmt.Println(contractItem.CompanyContractId)
+	hasMap := make(map[int]*company.CompanyContractPermission)
+	for _, p := range hasPermissions {
+		hasMap[p.ChartPermissionId] = p
+	}
+
+	raiPermissions, e := company.GetPermissionLookItemsExt("2", utils.COMPANY_PRODUCT_RAI_NAME)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取权益权限列表失败, Err: " + e.Error()
+		return
+	}
+	mapPermissionNameHave := make(map[string]bool) // 判断合同是否存在某一行业权限种类
+	for _, n := range raiPermissions {
+		//只计算,医药、消费、科技、智造、策略、买方研选的
+		if n.PermissionName != utils.YI_YAO_NAME && n.PermissionName != utils.XIAO_FEI_NAME && n.PermissionName != utils.KE_JI_NAME && n.PermissionName != utils.ZHI_ZAO_NAME && n.PermissionName != utils.CE_LUE_NAME && n.PermissionName != utils.CHART_PERMISSION_NAME_MF_YANXUAN {
+			continue
+		}
+		match := hasMap[n.ChartPermissionId]
+		if match == nil {
+			continue
+		}
+		mapPermissionNameHave[n.PermissionName] = true
+		// 买方研选(3w/5w)
+		if n.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN {
+			if match.ExpensiveYx == 1 {
+				money = money - 5
+			} else {
+				money = money - 3
+			}
+		}
+	}
+
+	if len(mapPermissionNameHave) > 0 {
+		moneyAvg = money / float64(len(mapPermissionNameHave))
+	}
 
 	list := req.List
 	var items []*cygx.CygxAllocationCompanyContract
 	var itemsPermission []*cygx.CygxAllocationCompanyContractPermission
 
+	var proportionSum float64 // 校验前端传过来的占比使用
 	for _, v := range list {
 		itemPermission := new(cygx.CygxAllocationCompanyContractPermission)
 		itemPermission.CompanyContractId = companyContractId
@@ -547,6 +591,7 @@ func (this *ContractAllocationController) CompanyContracUpdate() {
 		itemPermission.AdminName = sysUser.RealName
 		itemPermission.Proportion = v.Proportion
 		itemPermission.Money = v.Money
+		itemPermission.MoneyAvg = moneyAvg
 		itemPermission.ChartPermissionName = v.ChartPermissionName
 		itemPermission.CreateTime = time.Now()
 		itemPermission.ModifyTime = time.Now()
@@ -565,6 +610,16 @@ func (this *ContractAllocationController) CompanyContracUpdate() {
 			item.ModifyTime = time.Now()
 			items = append(items, item)
 		}
+		if v.ChartPermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN {
+			continue
+		}
+		proportionSum += v.Proportion
+	}
+
+	if proportionSum > 100.5 || proportionSum < 99.5 {
+		br.Msg = "操作失败,派点填写信息错误"
+		br.ErrMsg = "获取合同信息失败,Err:" + fmt.Sprint(proportionSum)
+		return
 	}
 
 	err = cygx.AddAndUpdateCygxAllocationCompanyContract(items, itemsPermission, companyContractId)
@@ -631,7 +686,7 @@ func (this *ContractAllocationController) CompanyContractStatistics() {
 
 	//默认只查询权益 2023-06-01 之后的合同
 	condition += ` AND c.product_id = ?  AND a.start_date > ? `
-	pars = append(pars, 2, "2023-06-01")
+	pars = append(pars, 2, "2023-01-01")
 
 	//列表页数据
 	listContract, err := cygx.GetCompanyContractListJoinCompany(condition, pars, 0, 1000)
@@ -650,19 +705,27 @@ func (this *ContractAllocationController) CompanyContractStatistics() {
 	mapUserMoney := make(map[string]float64)      // 派点金额
 	mapPermissionAllocation := make(map[string]float64)
 	mapPermissionMoney := make(map[string]float64)
+	mapPermissionMoneyAvg := make(map[string]float64)
 
 	totalContract := lenArr //所有的关联合同
 	var totalMoney float64  //所有的关联合同的金额 单位万
 	if lenArr > 0 {
 		var conditionAllocation string
 		var parsAllocation []interface{}
+		conditionAllocation = ` AND company_contract_id IN(` + utils.GetOrmInReplace(lenArr) + ` ) `
+		parsAllocation = append(parsAllocation, companyContractIds)
 		allocationCompanyContractList, err := cygx.GetCygxAllocationCompanyContractList(conditionAllocation, parsAllocation)
 		if err != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取失败,Err:" + err.Error()
 			return
 		}
-
+		allocationCompanyContractPermissionList, err := cygx.GetCygxAllocationCompanyContractPermissionList(conditionAllocation, parsAllocation)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
 		for _, v := range allocationCompanyContractList {
 			if v.Proportion != 0 {
 				mapUserAllocation[v.RealName] += 1
@@ -673,6 +736,9 @@ func (this *ContractAllocationController) CompanyContractStatistics() {
 				totalMoney += v.Money
 			}
 		}
+		for _, v := range allocationCompanyContractPermissionList {
+			mapPermissionMoneyAvg[v.ChartPermissionName] += v.MoneyAvg
+		}
 	}
 
 	sysUserList, err := cygx.GetAskEmailList()
@@ -693,19 +759,24 @@ func (this *ContractAllocationController) CompanyContractStatistics() {
 			item.TotalDispatchPoint = "0"
 		}
 		//组内占比
-		item.GroupProportion = fmt.Sprint(mapUserMoney[v.Name] / mapPermissionMoney[v.ChartPermissionName] * 100)
+		//utils.SubFloatToString(val, 4)
+		//item.GroupProportion = fmt.Sprint(mapUserMoney[v.Name] / mapPermissionMoney[v.ChartPermissionName] * 100)
+		if mapUserMoney[v.Name] == 0 {
+			item.GroupProportion = ""
+		} else {
+			item.GroupProportion = utils.SubFloatToString(mapUserMoney[v.Name]/mapPermissionMoney[v.ChartPermissionName]*100, 2)
+		}
 		if item.GroupProportion == "" {
 			item.GroupProportion = "0"
 		}
 		item.GroupProportion += "%"
 
 		//部门占比
-		item.DepartmentProportion = fmt.Sprint(mapUserMoney[v.Name] / totalMoney * 100)
+		item.DepartmentProportion = utils.SubFloatToString(mapUserMoney[v.Name]/totalMoney*100, 2)
 		if item.DepartmentProportion == "" {
 			item.DepartmentProportion = "0"
 		}
 		item.DepartmentProportion += "%"
-
 		mapPermissionUser[v.ChartPermissionName] = append(mapPermissionUser[v.ChartPermissionName], item)
 	}
 
@@ -714,45 +785,46 @@ func (this *ContractAllocationController) CompanyContractStatistics() {
 		item := new(cygx.AllocationRealNameStatisticsListResp)
 		item.RealName = "合计"
 		item.TotalRelatedContract = mapPermissionAllocation[k]
-
-		item.TotalDispatchPoint = fmt.Sprint(mapPermissionMoney[k], "/", "300")
+		item.TotalDispatchPoint = fmt.Sprint(mapPermissionMoney[k], "/", mapPermissionMoneyAvg[k])
 		item.GroupProportion = "100%"
 
 		// 部门占比
-		item.DepartmentProportion = fmt.Sprint(mapPermissionMoney[k] / totalMoney * 100)
+		item.DepartmentProportion = utils.SubFloatToString(mapPermissionMoney[k]/totalMoney*100, 2)
 		if item.DepartmentProportion == "" {
 			item.DepartmentProportion = "0"
 		}
 		item.DepartmentProportion += "%"
 
 		mapPermissionUser[k] = append(mapPermissionUser[k], item)
-
+		var ratio float64       // 使用一个变量作为精度范围, 比如 2 位小数时,精度范围应该为 100
+		ratio = math.Pow(10, 2) // 计算精度范围,2 位小数 = 100
 		item = new(cygx.AllocationRealNameStatisticsListResp)
 		item.RealName = "平均"
-		item.TotalRelatedContract = mapPermissionAllocation[k] / float64(lenUser)
-		item.TotalDispatchPoint = fmt.Sprint(mapPermissionMoney[k] / float64(lenUser))
+		item.TotalRelatedContract = math.Round(mapPermissionAllocation[k]/float64(lenUser)) * ratio / ratio
+		item.TotalDispatchPoint = utils.SubFloatToString(mapPermissionMoney[k]/float64(lenUser), 2)
 
 		//组内占比
-		item.GroupProportion = fmt.Sprint(float64(lenUser) / mapPermissionMoney[k] * 100)
+		if mapPermissionMoney[k] == 0 {
+			item.GroupProportion = ""
+		} else {
+			item.GroupProportion = utils.SubFloatToString(float64(lenUser)/mapPermissionMoney[k]*100, 2)
+		}
 		if item.GroupProportion == "" {
 			item.GroupProportion = "0"
 		}
 		item.GroupProportion += "%"
 
 		// 部门占比
-		item.DepartmentProportion = fmt.Sprint(mapPermissionMoney[k] / totalMoney * 100 / float64(len(mapPermissionUser[k])))
+		item.DepartmentProportion = utils.SubFloatToString(mapPermissionMoney[k]/totalMoney*100/float64(len(mapPermissionUser[k])), 2)
 		if item.DepartmentProportion == "" {
 			item.DepartmentProportion = "0"
 		}
 		item.DepartmentProportion += "%"
-
 		mapPermissionUser[k] = append(mapPermissionUser[k], item)
 	}
 
 	var list []*cygx.AllocationPermissionStatisticsListResp
-
 	permissionNameArr := []string{"医药", "消费", "科技", "智造", "策略"}
-
 	for _, v := range permissionNameArr {
 		item := new(cygx.AllocationPermissionStatisticsListResp)
 		item.ChartPermissionName = v

+ 16 - 0
models/cygx/allocation_company_contract.go

@@ -43,6 +43,7 @@ type CygxAllocationCompanyContractPermission struct {
 	AdminName                   string    `description:"内容"`
 	Proportion                  float64   `description:"占比"`
 	Money                       float64   `description:"金额"`
+	MoneyAvg                    float64   `description:"行业所占合同的平均金额"`
 	ChartPermissionName         string    `description:"行业名称"`
 }
 
@@ -56,6 +57,7 @@ type CygxAllocationCompanyContractPermissionLog struct {
 	AdminName                   string    `description:"内容"`
 	Proportion                  float64   `description:"占比"`
 	Money                       float64   `description:"金额"`
+	MoneyAvg                    float64   `description:"行业所占合同的平均金额"`
 	ChartPermissionName         string    `description:"行业名称"`
 }
 
@@ -86,6 +88,7 @@ func AddAndUpdateCygxAllocationCompanyContract(items []*CygxAllocationCompanyCon
 		item.ChartPermissionName = v.ChartPermissionName
 		item.Proportion = v.Proportion
 		item.Money = v.Money
+		item.Money = v.Money
 		item.CreateTime = time.Now()
 		item.ModifyTime = time.Now()
 		itemsLog = append(itemsLog, item)
@@ -102,6 +105,7 @@ func AddAndUpdateCygxAllocationCompanyContract(items []*CygxAllocationCompanyCon
 		item.ChartPermissionName = v.ChartPermissionName
 		item.Proportion = v.Proportion
 		item.Money = v.Money
+		item.MoneyAvg = v.MoneyAvg
 		item.CreateTime = time.Now()
 		item.ModifyTime = time.Now()
 		itemsPermissionLog = append(itemsPermissionLog, item)
@@ -167,6 +171,7 @@ type AllocationPermissionListResp struct {
 	ChartPermissionName string  `description:"行业名称"`
 	Proportion          float64 `description:"占比"`
 	Money               float64 `description:"金额(单位万)"`
+	MoneyAvg            float64 `description:"行业所占合同的平均金额"`
 	List                []*AllocationRealNameListResp
 }
 
@@ -212,6 +217,17 @@ func GetCygxAllocationCompanyContractPermissionListById(companyContractId int) (
 	return
 }
 
+// 行业列表
+func GetCygxAllocationCompanyContractPermissionList(condition string, pars []interface{}) (items []*AllocationPermissionListResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ` SELECT * FROM cygx_allocation_company_contract_permission  as art WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
 type CygxAllocationCompanyContractDetailStatisticsResp struct {
 	List          []*AllocationPermissionStatisticsListResp
 	TotalContract int     `description:"关联合同总计"`