Przeglądaj źródła

Merge branch 'master' of http://8.136.199.33:3000/hongze/hz_crm_api into cygx/mfyx_2.0

xingzai 11 miesięcy temu
rodzic
commit
5808ca94d6

+ 6 - 1
controllers/company.go

@@ -1694,7 +1694,9 @@ func (this *CompanyController) List() {
 			} else if strings.Contains(v.TodoStatuss, "无任务") {
 				todoButtonColor = "gray"
 			}
-			//if str
+			//永续客户X类试用客户出参转换
+			v.StatusStr = strings.Replace(v.StatusStr, utils.COMPANY_STATUS_FOREVER, utils.COMPANY_STATUS_X_CLASS_TRY_OUT, -1)
+
 			companyList := &company.CompanyListItem{
 				CompanyId:        v.CompanyId,
 				CompanyName:      v.CompanyName,
@@ -2939,6 +2941,9 @@ func (this *CompanyController) Add() {
 			companyProduct.IsOverseas = 1
 		}
 	}
+	if productId == utils.COMPANY_PRODUCT_RAI_ID && req.Status == utils.COMPANY_STATUS_FOREVER { // 权益的永续客户给一个状态初始化的记录
+		companyProduct.InitStatus = req.Status
+	}
 	companyProductId, err := company.AddCompanyProduct(companyProduct)
 	if err != nil {
 		br.Msg = "新增失败"

+ 51 - 76
controllers/company_apply.go

@@ -470,6 +470,22 @@ func (this *CompanyApplyController) ApplyContractDetail() {
 		// 未选大套餐, 走老逻辑
 		var points float64
 		if detail.RaiPackageType == 0 {
+
+			totalForever, err := company.GetCompanyProductRaiForeverCount(companyId) //判断是否是权益的永续客户
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
+				return
+			}
+
+			if totalForever > 0 {
+				detail.Quarter, err = utils.GetQuarterStrStartDatesInRange(detail.StartDate, detail.EndDate) //通过开始时间,结束时间,获取对应季度的拼接字符串
+				if err != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取季度息失败,Err:" + err.Error()
+					return
+				}
+			}
 			mapUpgrade := make(map[int]bool) // 通过合同获取所勾选的升级行业权限
 
 			for _, v := range permissionList {
@@ -1997,11 +2013,28 @@ func (this *CompanyApplyController) ApplyContract() {
 			return
 		}
 
+		totalForever, err := company.GetCompanyProductRaiForeverCount(companyId) //判断是否是权益的永续客户
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
+			return
+		}
 		// 大套餐
 		bigPackage70, bigPackage45 := new(company.PermissionLookItem), new(company.PermissionLookItem)
-		bigPackage70.PermissionName = utils.CHART_PERMISSION_NAME_70W
-		bigPackage45.PermissionName = utils.CHART_PERMISSION_NAME_45W
-		plist.Items = append(plist.Items, bigPackage45, bigPackage70)
+		if totalForever > 0 {
+			//filterPermissionName := []string{"专家", "路演服务", "调研", "研选订阅", "研选扣点包"} //权益的永续客户这些不展示
+			//for _, v := range items {
+			//	if utils.InArrayByStr(filterPermissionName, v.PermissionName) {
+			//		continue
+			//	}
+			//	p.Items = append(p.Items, v)
+			//}
+
+		} else {
+			bigPackage70.PermissionName = utils.CHART_PERMISSION_NAME_70W
+			bigPackage45.PermissionName = utils.CHART_PERMISSION_NAME_45W
+			plist.Items = append(plist.Items, bigPackage45, bigPackage70)
+		}
 
 		// 是否为内部人员, 内部人员需要拆分行业主客观
 		isRai, e := services.CheckRaiAdmin(sysUser.AdminId)
@@ -2055,21 +2088,20 @@ func (this *CompanyApplyController) ApplyContract() {
 		}
 		//mapChartPermissionId := make(map[int]int)
 		mapChartPermissionName := make(map[string]string) // 行业主客观防止重复写入Items用的
+		filterPermissionName := []string{}
+		if totalForever == 0 {
+			filterPermissionName = []string{"专家", "路演服务"} // 需要过滤不展示的行业
+		} else {
+			filterPermissionName = []string{"专家", "路演服务", "调研", "研选订阅", "研选扣点包"} //权益的永续客户这些不展示
+		}
 		for _, n := range items {
-			//count, err := company.GetCompanyContractPermissionCheckByContractId(companyId, contractItem.CompanyContractId, n.ChartPermissionId)
-			//if err != nil {
-			//	br.Msg = "获取失败"
-			//	br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
-			//	return
-			//}
-
-			filterPermissionName := []string{"专家", "路演服务"} // 需要过滤不展示的行业
 			if utils.InArrayByStr(filterPermissionName, n.PermissionName) {
 				continue
 			}
-
+			if n.PermissionType == 2 && totalForever > 0 {
+				continue
+			}
 			if utils.InArrayByInt(permissionIds, n.ChartPermissionId) {
-				fmt.Println(1)
 				n.Checked = true
 				if _, ok := mapUpgrade[n.ChartPermissionId]; ok {
 					checkList = append(checkList, n.ChartPermissionId+utils.PERMISSION_ID_UPGRADE)
@@ -2092,7 +2124,6 @@ func (this *CompanyApplyController) ApplyContract() {
 						}
 					}
 				}
-				//mapChartPermissionId[n.ChartPermissionId] = n.ChartPermissionId
 			}
 
 			// 买方研选3w/5w/10w
@@ -2104,20 +2135,7 @@ func (this *CompanyApplyController) ApplyContract() {
 
 				continue
 			}
-
-			//if mapChartPermissionName[n.PermissionName] == "" {
-			//	plist.Items = append(plist.Items, n)
-			//	mapChartPermissionName[n.PermissionName] = n.PermissionName
-			//	if strings.Contains("医药消费科技智造", n.PermissionName) {
-			//		vS := new(company.PermissionLookItem)
-			//		vS.ChartPermissionId = n.ChartPermissionId + utils.PERMISSION_ID_UPGRADE
-			//		vS.PermissionName = n.PermissionName + "(升级)"
-			//		vS.PermissionType = n.PermissionType
-			//		vS.Checked = n.Checked
-			//		plist.Items = append(plist.Items, vS)
-			//	}
-			//}
-
+			//if totalForever == 0 {
 			// 四行业主客观/升级
 			if mapChartPermissionName[n.PermissionName] == "" {
 				mapChartPermissionName[n.PermissionName] = n.PermissionName
@@ -2126,7 +2144,7 @@ func (this *CompanyApplyController) ApplyContract() {
 					continue
 				}
 				// 内部人员需要拆分主客观权限
-				if isRai {
+				if isRai && totalForever == 0 {
 					n.Child = make([]*company.PermissionLookItem, 0)
 					n.Child = append(n.Child, &company.PermissionLookItem{
 						ChartPermissionId: childSubMap[n.PermissionName],
@@ -2138,9 +2156,11 @@ func (this *CompanyApplyController) ApplyContract() {
 						PermissionType:    2,
 					})
 				}
+			}
 
-				plist.Items = append(plist.Items, n)
+			plist.Items = append(plist.Items, n)
 
+			if totalForever == 0 {
 				t := new(company.PermissionLookItem)
 				t.ChartPermissionId = n.ChartPermissionId + utils.PERMISSION_ID_UPGRADE
 				t.PermissionName = n.PermissionName + "(升级)"
@@ -2149,52 +2169,6 @@ func (this *CompanyApplyController) ApplyContract() {
 				plist.Items = append(plist.Items, t)
 			}
 		}
-		//itemsType, err := company.GetPermissionSetItemsType(2, v)
-		//if err != nil {
-		//	br.Msg = "获取失败"
-		//	br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
-		//	return
-		//}
-		//含有主客观的权限处理
-		//mapChartPermission := make(map[string]int)
-		//pType := new(company.PermissionSetItemType)
-		//for _, v := range itemsType {
-		//	if mapChartPermission[v.PermissionName] == 0 {
-		//		mapChartPermission[v.PermissionName] = v.ChartPermissionId
-		//		pType = new(company.PermissionSetItemType)
-		//		pType.PermissionName = v.PermissionName
-		//	}
-		//	if mapChartPermissionId[v.ChartPermissionId] > 0 {
-		//		v.Checked = true
-		//	}
-		//	pType.Items = append(pType.Items, v)
-		//	if len(pType.Items) == 2 {
-		//		var checkedMinateBool bool
-		//		pType.Checked = true
-		//		for _, pv := range pType.Items {
-		//			if pv.Checked == false {
-		//				pType.Checked = false
-		//			} else {
-		//				checkedMinateBool = true
-		//				pType.NoClicking = true
-		//			}
-		//		}
-		//		if checkedMinateBool == true && pType.Checked == false {
-		//			pType.CheckedMinate = true
-		//		}
-		//		pListType.Items = append(pListType.Items, pType)
-		//	}
-		//}
-
-		////没有主客观的权限处理
-		//for _, v := range items {
-		//	fmt.Println(v)
-		//	if strings.Index(v.Remark, "主观") == -1 && strings.Index(v.Remark, "客观") == -1 {
-		//		if mapChartPermissionId[v.ChartPermissionId] > 0 {
-		//			v.Checked = true
-		//		}
-		//		plist.Items = append(plist.Items, v)
-		//	}
 		//}
 
 		// 如果checklist 里的值 没有在items里,则不返回给前端
@@ -2231,6 +2205,7 @@ func (this *CompanyApplyController) ApplyContract() {
 		//plist.CheckList = finalCheckList
 		plist.CheckList = checkList
 		contractItem.PermissionList = append(contractItem.PermissionList, plist)
+		contractItem.Quarter, _ = utils.GetQuarterStrStartDatesInRangeHaveYear(contractItem.StartDate, contractItem.EndDate) //季度信息
 	}
 
 	resp := new(company.ApplyContractResp)

+ 20 - 19
controllers/company_apply_v2.go

@@ -440,6 +440,22 @@ func (this *CompanyApplyController) ApplyTurnPositive() {
 			return
 		}
 	}
+	companyProduct, err := company.GetCompanyProductByCompanyIdAndProductId(req.CompanyId, productId)
+	if err != nil {
+		br.Msg = "获取客户信息失败"
+		br.ErrMsg = "获取客户信息失败"
+		return
+	}
+	if companyProduct == nil {
+		br.Msg = "获取客户信息失败"
+		br.ErrMsg = "客户不存在,不可提交审批:companyId:" + strconv.Itoa(req.CompanyId) + ";productId:" + strconv.Itoa(productId)
+		return
+	}
+	if companyProduct.Status != utils.COMPANY_STATUS_TRY_OUT && companyProduct.InitStatus != utils.COMPANY_STATUS_FOREVER {
+		br.Msg = "客户状态为:" + companyProduct.Status + ";不可进行转正申请"
+		br.ErrMsg = "客户状态为:" + companyProduct.Status + ";不可进行转正申请"
+		return
+	}
 
 	mapPermissionIdUpgrade := make(map[int]int) // 权益主客观、行业升级、买方研选的处理
 	permissionNameMap := make(map[int]string)   // 权益行业名称处理
@@ -460,11 +476,9 @@ func (this *CompanyApplyController) ApplyTurnPositive() {
 			br.ErrMsg = "获取行业主观对应的客观ID失败, Err: " + e.Error()
 			return
 		}
-
 		strPermissionIdArr := make([]string, 0) // 最终过滤后的权限IDs
 		for _, v := range permissionSlice {
 			permissionId, _ := strconv.Atoi(v)
-
 			// 研选5w的处理
 			if permissionId == expId {
 				//permissionIdsNew += strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN) + ","
@@ -495,6 +509,10 @@ func (this *CompanyApplyController) ApplyTurnPositive() {
 				strPermissionIdArr = append(strPermissionIdArr, v)
 				permissionIdOnly = permissionId
 			}
+			//权益的永续客户主客观权限都开
+			if companyProduct.InitStatus == utils.COMPANY_STATUS_FOREVER && subObjMap[permissionId] > 0 {
+				strPermissionIdArr = append(strPermissionIdArr, strconv.Itoa(subObjMap[permissionId]))
+			}
 			if _, ok := mapPermissionId[permissionIdOnly]; ok {
 				br.Msg = "权限设置有误,请重新选择"
 				br.ErrMsg = "升级权限与普通权限重复选择!" + req.PermissionIds
@@ -540,23 +558,6 @@ func (this *CompanyApplyController) ApplyTurnPositive() {
 		}
 	}
 
-	companyProduct, err := company.GetCompanyProductByCompanyIdAndProductId(req.CompanyId, productId)
-	if err != nil {
-		br.Msg = "获取客户信息失败"
-		br.ErrMsg = "获取客户信息失败"
-		return
-	}
-	if companyProduct == nil {
-		br.Msg = "获取客户信息失败"
-		br.ErrMsg = "客户不存在,不可提交审批:companyId:" + strconv.Itoa(req.CompanyId) + ";productId:" + strconv.Itoa(productId)
-		return
-	}
-	if companyProduct.Status != utils.COMPANY_STATUS_TRY_OUT {
-		br.Msg = "客户状态为:" + companyProduct.Status + ";不可进行转正申请"
-		br.ErrMsg = "客户状态为:" + companyProduct.Status + ";不可进行转正申请"
-		return
-	}
-
 	//客户归属判断
 	if companyProduct.SellerId != sysUser.AdminId && companyProduct.ShareSellerId != sysUser.AdminId {
 		br.Msg = "客户信息异常"

+ 4 - 0
controllers/company_approval.go

@@ -509,6 +509,10 @@ func (this *CompanyApprovalController) List() {
 				opButton.Cancel = true
 			}
 
+			if item.CompanyProductStatus == utils.COMPANY_STATUS_FOREVER {
+				item.CompanyProductStatus = utils.COMPANY_STATUS_X_CLASS_TRY_OUT
+			}
+
 			respTmp := &company.CompanyApprovalList{
 				CompanyId:         item.CompanyId,
 				ProductId:         item.ProductId,

+ 92 - 76
controllers/company_permission.go

@@ -21,6 +21,7 @@ type CompanyPermissionController struct {
 // @Title 获取权限设置基础信息
 // @Description 获取权限设置基础信息接口
 // @Param   CompanyType   query   string  true       "客户类型:传空字符串或者不传为全部,'ficc','权益'"
+// @Param   CompanyStatus   query   string  true       "客户状态"
 // @Param   NoUpgrade   query   bool  false       "是否不展示升级权限,默认为 false"
 // @Param   IsShowYanXuanKouDian   query   bool  false       "是否展示研选扣点包,默认为 false"
 // @Success 200 {object} company.PermissionSetResp
@@ -42,7 +43,11 @@ func (this *CompanyPermissionController) List() {
 
 	companyType := this.GetString("CompanyType")
 	noUpgrade, _ := this.GetBool("NoUpgrade", false)                       // 添加客户、领取客户=true; 申请转正、续约申请=false
-	isShowYanXuanKouDian, _ := this.GetBool("IsShowYanXuanKouDian", false) // 添加客户、领取客户=true; 申请转正、续约申请=false
+	isShowYanXuanKouDian, _ := this.GetBool("IsShowYanXuanKouDian", false) // 是否展示研选扣点
+	companyStatus := this.GetString("CompanyStatus")                       // 客户状态
+	if companyStatus == utils.COMPANY_STATUS_X_CLASS_TRY_OUT || strings.Contains(companyStatus, utils.COMPANY_STATUS_FOREVER) {
+		companyStatus = utils.COMPANY_STATUS_FOREVER
+	}
 	var productId int
 	resp := new(company.PermissionSetResp)
 
@@ -105,6 +110,7 @@ func (this *CompanyPermissionController) List() {
 		if isShowYanXuanKouDian {
 			filterPermissionName = []string{"专家"} //申请转正,或者申请续约的时候 调研 行业需要进行展示
 		}
+
 		// 原始版的权限
 		if noUpgrade {
 			for _, v := range items {
@@ -120,92 +126,102 @@ func (this *CompanyPermissionController) List() {
 
 		// 展示升级权限, 需要有套餐的展示, 行业可能需要拆分主客观, 买方研选需要分为3w和5w两种
 		if !noUpgrade {
-			p.Items = append(p.Items, &company.PermissionSetItem{
-				PermissionName: utils.CHART_PERMISSION_NAME_45W,
-			}, &company.PermissionSetItem{
-				PermissionName: utils.CHART_PERMISSION_NAME_70W,
-			})
-
-			// 是否为内部人员
-			isRai, e := services.CheckRaiAdmin(sysUser.AdminId)
-			if e != nil {
-				br.Msg = "获取失败"
-				br.ErrMsg = "判断是否为权益内部人员失败, GetRaiAdmin Err: " + e.Error()
-				return
-			}
-
-			// 获取行业主客观权限ID
-			childSubMap, childObjMap := make(map[string]int), make(map[string]int)
-			{
-				permissions, e := models.GetChartPermissionList()
+			//判断是不是永续类型的客户
+			if companyStatus == utils.COMPANY_STATUS_FOREVER {
+				filterPermissionName = []string{"专家", "路演服务", "调研", "研选订阅", "研选扣点包"} //权益的永续客户这些不展示
+				for _, v := range items {
+					if utils.InArrayByStr(filterPermissionName, v.PermissionName) {
+						continue
+					}
+					p.Items = append(p.Items, v)
+				}
+			} else {
+				p.Items = append(p.Items, &company.PermissionSetItem{
+					PermissionName: utils.CHART_PERMISSION_NAME_45W,
+				}, &company.PermissionSetItem{
+					PermissionName: utils.CHART_PERMISSION_NAME_70W,
+				})
+
+				// 是否为内部人员
+				isRai, e := services.CheckRaiAdmin(sysUser.AdminId)
 				if e != nil {
 					br.Msg = "获取失败"
-					br.ErrMsg = "获取权限列表失败, GetChartPermissionList Err: " + e.Error()
+					br.ErrMsg = "判断是否为权益内部人员失败, GetRaiAdmin Err: " + e.Error()
 					return
 				}
-				for _, v := range permissions {
-					if !strings.Contains("医药消费科技智造", v.PermissionName) {
+
+				// 获取行业主客观权限ID
+				childSubMap, childObjMap := make(map[string]int), make(map[string]int)
+				{
+					permissions, e := models.GetChartPermissionList()
+					if e != nil {
+						br.Msg = "获取失败"
+						br.ErrMsg = "获取权限列表失败, GetChartPermissionList Err: " + e.Error()
+						return
+					}
+					for _, v := range permissions {
+						if !strings.Contains("医药消费科技智造", v.PermissionName) {
+							continue
+						}
+						if strings.Contains(v.Remark, "主观") {
+							childSubMap[v.PermissionName] = v.ChartPermissionId
+							continue
+						}
+						childObjMap[v.PermissionName] = v.ChartPermissionId
+					}
+				}
+				for _, v := range items {
+					if !isShowYanXuanKouDian && v.ChartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID {
 						continue
 					}
-					if strings.Contains(v.Remark, "主观") {
-						childSubMap[v.PermissionName] = v.ChartPermissionId
+					if utils.InArrayByStr(filterPermissionName, v.PermissionName) {
 						continue
 					}
-					childObjMap[v.PermissionName] = v.ChartPermissionId
-				}
-			}
-
-			for _, v := range items {
-				if !isShowYanXuanKouDian && v.ChartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID {
-					continue
-				}
-				if utils.InArrayByStr(filterPermissionName, v.PermissionName) {
-					continue
-				}
-				// 处理四大行业的升级展示
-				if strings.Contains("医药消费科技智造", v.PermissionName) {
-					// 内部人员需要拆分主客观权限
-					if isRai {
-						v.Child = make([]*company.PermissionSetItem, 0)
-						v.Child = append(v.Child, &company.PermissionSetItem{
-							ChartPermissionId: childSubMap[v.PermissionName],
-							PermissionName:    "主观",
-							PermissionType:    1,
-						}, &company.PermissionSetItem{
-							ChartPermissionId: childObjMap[v.PermissionName],
-							PermissionName:    "客观",
-							PermissionType:    2,
-						})
+					// 处理四大行业的升级展示
+					if strings.Contains("医药消费科技智造", v.PermissionName) {
+						// 内部人员需要拆分主客观权限
+						if isRai {
+							v.Child = make([]*company.PermissionSetItem, 0)
+							v.Child = append(v.Child, &company.PermissionSetItem{
+								ChartPermissionId: childSubMap[v.PermissionName],
+								PermissionName:    "主观",
+								PermissionType:    1,
+							}, &company.PermissionSetItem{
+								ChartPermissionId: childObjMap[v.PermissionName],
+								PermissionName:    "客观",
+								PermissionType:    2,
+							})
+						}
+						p.Items = append(p.Items, v)
+
+						t := new(company.PermissionSetItem)
+						t.ChartPermissionId = v.ChartPermissionId + utils.PERMISSION_ID_UPGRADE
+						t.PermissionName = v.PermissionName + "(升级)"
+						t.PermissionType = v.PermissionType
+						t.Checked = v.Checked
+						p.Items = append(p.Items, t)
+						continue
 					}
-					p.Items = append(p.Items, v)
 
-					t := new(company.PermissionSetItem)
-					t.ChartPermissionId = v.ChartPermissionId + utils.PERMISSION_ID_UPGRADE
-					t.PermissionName = v.PermissionName + "(升级)"
-					t.PermissionType = v.PermissionType
-					t.Checked = v.Checked
-					p.Items = append(p.Items, t)
-					continue
-				}
-
-				// 买方研选划分为3w和5w,10W三种
-				//if v.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN {
-				//	m3, m5, m10 := new(company.PermissionSetItem), new(company.PermissionSetItem), new(company.PermissionSetItem)
-				//	m3.ChartPermissionId = v.ChartPermissionId
-				//	m3.PermissionName = fmt.Sprint(v.PermissionName, "(3w)")
-				//	p.Items = append(p.Items, m3)
-				//
-				//	m5.ChartPermissionId = v.ChartPermissionId + utils.PERMISSION_ID_YANXUAN_DIFF
-				//	m5.PermissionName = fmt.Sprint(v.PermissionName, "(5w)")
-				//	p.Items = append(p.Items, m5)
-				//
-				//	m10.ChartPermissionId = utils.PERMISSION_ID_YANXUAN_10W_DIFF
-				//	m10.PermissionName = fmt.Sprint(v.PermissionName, "(10w)")
-				//	p.Items = append(p.Items, m10)
-				//	continue
-				//}
+					// 买方研选划分为3w和5w,10W三种
+					//if v.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN {
+					//	m3, m5, m10 := new(company.PermissionSetItem), new(company.PermissionSetItem), new(company.PermissionSetItem)
+					//	m3.ChartPermissionId = v.ChartPermissionId
+					//	m3.PermissionName = fmt.Sprint(v.PermissionName, "(3w)")
+					//	p.Items = append(p.Items, m3)
+					//
+					//	m5.ChartPermissionId = v.ChartPermissionId + utils.PERMISSION_ID_YANXUAN_DIFF
+					//	m5.PermissionName = fmt.Sprint(v.PermissionName, "(5w)")
+					//	p.Items = append(p.Items, m5)
+					//
+					//	m10.ChartPermissionId = utils.PERMISSION_ID_YANXUAN_10W_DIFF
+					//	m10.PermissionName = fmt.Sprint(v.PermissionName, "(10w)")
+					//	p.Items = append(p.Items, m10)
+					//	continue
+					//}
 
-				p.Items = append(p.Items, v)
+					p.Items = append(p.Items, v)
+				}
 			}
 		}
 

+ 66 - 41
controllers/cygx/contract_allocation.go

@@ -507,6 +507,18 @@ func (this *ContractAllocationController) CompanyContracDetail() {
 		return
 	}
 
+	companyProduct, err := company.GetCompanyProductByCompanyIdAndProductId(contractItem.CompanyId, utils.COMPANY_PRODUCT_RAI_ID)
+	if err != nil {
+		br.Msg = "查询客户产品信息失败"
+		br.ErrMsg = "查询客户产品信息失败,Err:" + err.Error()
+		return
+	}
+
+	//判断客户是否是永续(X类试用客户)
+	if companyProduct.Status == utils.COMPANY_STATUS_FOREVER {
+		resp.IsXClass = true
+	}
+
 	//var contractPermissionList []*company.ContractPermissionList
 	//expMap := map[int]string{0: "(3w)", 1: "(5w)", 2: "(10w)"} // 买方研选价格
 	hasPermissions, e := company.GetCompanyContractPermissionByCompanyContractId(companyContractId)
@@ -538,7 +550,10 @@ func (this *ContractAllocationController) CompanyContracDetail() {
 		if match == nil {
 			continue
 		}
-
+		//研选订阅、研选扣点包 映射成买方研选
+		if n.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN || n.PermissionName == utils.YAN_XUAN_KOU_DIAN_BAO_NAME {
+			n.PermissionName = utils.CHART_PERMISSION_NAME_MAI_FANG_YANXUAN
+		}
 		mapPermissionNameHave[n.PermissionName] = true
 		// 买方研选(3w/5w/10w)
 		if n.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN {
@@ -547,7 +562,7 @@ func (this *ContractAllocationController) CompanyContracDetail() {
 			continue
 		}
 	}
-
+	fmt.Println(mapPermissionNameHave)
 	resp.Money = contractItem.Money / 10000
 	//有研选时,对研选套餐类型做文案处理
 	respItemYx := new(cygx.AllocationPermissionListResp)        // 研选订阅
@@ -633,14 +648,14 @@ func (this *ContractAllocationController) CompanyContracDetail() {
 			respItem.List = v
 			respList = append(respList, respItem)
 		}
-		//研选订阅
-		if respItemYx.ChartPermissionName != "" {
-			respList = append(respList, respItemYx)
-		}
-		//研选扣点
-		if respItemYxKouDian.ChartPermissionName != "" {
-			respList = append(respList, respItemYxKouDian)
-		}
+		////研选订阅
+		//if respItemYx.ChartPermissionName != "" {
+		//	respList = append(respList, respItemYx)
+		//}
+		////研选扣点
+		//if respItemYxKouDian.ChartPermissionName != "" {
+		//	respList = append(respList, respItemYxKouDian)
+		//}
 
 	} else {
 		listUser, err := cygx.GetCygxAllocationCompanyContractListById(companyContractId)
@@ -660,13 +675,13 @@ func (this *ContractAllocationController) CompanyContracDetail() {
 			item.ChartPermissionId = mapPermissionId[v.ChartPermissionName]
 			mapPermissionUser[v.ChartPermissionName] = append(mapPermissionUser[v.ChartPermissionName], item)
 		}
-		listPermission, err := cygx.GetCygxAllocationCompanyContractPermissionListById(companyContractId)
+		listPermissionContract, err := cygx.GetCygxAllocationCompanyContractPermissionListById(companyContractId)
 		if err != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取失败,GetCygxAllocationCompanyContractPermissionListById Err: " + err.Error()
 			return
 		}
-		for _, v := range listPermission {
+		for _, v := range listPermissionContract {
 			if showDetail && v.Money == 0 {
 				continue
 			}
@@ -687,7 +702,7 @@ func (this *ContractAllocationController) CompanyContracDetail() {
 		return
 	}
 
-	permissionNameArr := []string{"医药", "消费", "科技", "智造", "策略", utils.CHART_PERMISSION_NAME_MF_YANXUAN, utils.YAN_XUAN_KOU_DIAN_BAO_NAME}
+	permissionNameArr := []string{"医药", "消费", "科技", "智造", "策略", "固收", utils.CHART_PERMISSION_NAME_MAI_FANG_YANXUAN}
 	for _, v := range permissionNameArr {
 		for _, v2 := range respList {
 			if v2.ChartPermissionName == v {
@@ -753,6 +768,14 @@ func (this *ContractAllocationController) CompanyContracUpdate() {
 		br.ErrMsg = "获取合同信息失败,Err:" + err.Error()
 		return
 	}
+
+	companyProduct, err := company.GetCompanyProductByCompanyIdAndProductId(contractItem.CompanyId, utils.COMPANY_PRODUCT_RAI_ID)
+	if err != nil {
+		br.Msg = "查询客户产品信息失败"
+		br.ErrMsg = "查询客户产品信息失败,Err:" + err.Error()
+		return
+	}
+
 	money := contractItem.Money / 10000 // 合同金额,万为单位
 	var moneyAvg float64                // 行业所占合同的平均金额
 	hasPermissions, e := company.GetCompanyContractPermissionByCompanyContractId(companyContractId)
@@ -775,8 +798,8 @@ func (this *ContractAllocationController) CompanyContracUpdate() {
 	}
 	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 {
+		//只计算,医药、消费、科技、智造、策略、固收、买方研选的
+		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.GU_SHOU_NAME && n.PermissionName != utils.CHART_PERMISSION_NAME_MAI_FANG_YANXUAN {
 			continue
 		}
 		match := hasMap[n.ChartPermissionId]
@@ -785,17 +808,18 @@ func (this *ContractAllocationController) CompanyContracUpdate() {
 		}
 
 		// 买方研选(3w/5w/10W)
-		if n.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN {
-			if match.ExpensiveYx == 1 {
-				money = money - 5
-			} else if match.ExpensiveYx == 2 {
-				money = money - 10
-			} else {
-				money = money - 3
-			}
-		} else {
-			mapPermissionNameHave[n.PermissionName] = true
-		}
+		//if n.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN {
+		//	if match.ExpensiveYx == 1 {
+		//		money = money - 5
+		//	} else if match.ExpensiveYx == 2 {
+		//		money = money - 10
+		//	} else {
+		//		money = money - 3
+		//	}
+		//} else {
+		//	mapPermissionNameHave[n.PermissionName] = true
+		//}
+		mapPermissionNameHave[n.PermissionName] = true
 	}
 
 	if len(mapPermissionNameHave) > 0 {
@@ -816,7 +840,7 @@ func (this *ContractAllocationController) CompanyContracUpdate() {
 		itemPermission.Money = v.Money
 		if v.ChartPermissionName != utils.YAN_XUAN_KOU_DIAN_BAO_NAME {
 			itemPermission.MoneyAvg = moneyAvg
-			if v.Money < moneyAvg/2 {
+			if v.Money < moneyAvg/2 && companyProduct.Status == utils.COMPANY_STATUS_FOREVER { //永续客户不做这种限制
 				br.Msg = "单行业占比值不得低于平均值的一半"
 				br.ErrMsg = "单行业占比值不得低于平均值的一半,Err:" + fmt.Sprint(proportionSum)
 				return
@@ -829,7 +853,7 @@ func (this *ContractAllocationController) CompanyContracUpdate() {
 		var userProportionSum float64 // 校验前端传过来的占比使用
 
 		for _, v2 := range v.List {
-			if v2.Proportion < -20 {
+			if v2.Proportion < -20 && companyProduct.Status == utils.COMPANY_STATUS_FOREVER { //永续客户不做这种限制
 				br.Msg = "研究员占比值不得小于总额的-20%"
 				br.ErrMsg = "研究员占比值不得小于总额的20%,Err:" + fmt.Sprint(proportionSum)
 				return
@@ -986,19 +1010,20 @@ func (this *ContractAllocationController) CompanyContractStatistics() {
 		}
 		for _, v := range allocationCompanyContractList {
 
-			if v.Proportion != 0 && v.ChartPermissionName != utils.CHART_PERMISSION_NAME_MF_YANXUAN {
-				mapUserAllocation[v.RealName] += 1
-				mapUserMoney[v.RealName] += v.Money
-				mapPermissionAllocation[v.ChartPermissionName] += 1
-				mapPermissionMoney[v.ChartPermissionName] += v.Money
-				totalMoney += v.Money
-				companyContractIdBool[v.CompanyContractId] = true
-				//统计单个行业所关的合同数量
-				if !mapPermissionContractKey[fmt.Sprint("ChartPermissionName_", v.ChartPermissionName, "CompanyContractId_", v.CompanyContractId)] {
-					mapPermissionContract[v.ChartPermissionName] += 1
-					mapPermissionContractKey[fmt.Sprint("ChartPermissionName_", v.ChartPermissionName, "CompanyContractId_", v.CompanyContractId)] = true
-				}
+			//if v.Proportion != 0 && v.ChartPermissionName != utils.CHART_PERMISSION_NAME_MF_YANXUAN {
+			mapUserAllocation[v.RealName] += 1
+			mapUserMoney[v.RealName] += v.Money
+			mapPermissionAllocation[v.ChartPermissionName] += 1
+			mapPermissionMoney[v.ChartPermissionName] += v.Money
+			totalMoney += v.Money
+			companyContractIdBool[v.CompanyContractId] = true
+			//统计单个行业所关的合同数量
+			if !mapPermissionContractKey[fmt.Sprint("ChartPermissionName_", v.ChartPermissionName, "CompanyContractId_", v.CompanyContractId)] {
+				mapPermissionContract[v.ChartPermissionName] += 1
+				mapPermissionContractKey[fmt.Sprint("ChartPermissionName_", v.ChartPermissionName, "CompanyContractId_", v.CompanyContractId)] = true
 			}
+			//dd = decimal.NewFromFloat(v.Money).Add(dd)
+			//}
 		}
 		for _, v := range allocationCompanyContractPermissionList {
 			mapPermissionMoneyAvg[v.ChartPermissionName] += v.MoneyAvg
@@ -1097,7 +1122,7 @@ func (this *ContractAllocationController) CompanyContractStatistics() {
 	}
 
 	var list []*cygx.AllocationPermissionStatisticsListResp
-	permissionNameArr := []string{"医药", "消费", "科技", "智造", "策略"}
+	permissionNameArr := []string{"医药", "消费", "科技", "智造", "策略", "固收", "买方研选"}
 	for _, v := range permissionNameArr {
 		item := new(cygx.AllocationPermissionStatisticsListResp)
 		item.ChartPermissionName = v

+ 1533 - 0
controllers/cygx/enter_score.go

@@ -0,0 +1,1533 @@
+package cygx
+
+import (
+	"encoding/json"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"github.com/tealeg/xlsx"
+	"hongze/hz_crm_api/controllers"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/company"
+	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/models/system"
+	cygxService "hongze/hz_crm_api/services/cygx"
+	"hongze/hz_crm_api/utils"
+	"os"
+	"path/filepath"
+	"strings"
+	"time"
+)
+
+// X类客户录分模块
+type EnterScoreController struct {
+	controllers.BaseAuthController
+}
+
+// @Title X试用类客户检索
+// @Description X试用类客户检索接口
+// @Param   KeyWord   query   string  true       "搜索关键词"
+// @Success 200 {object} company.CompanyNameAndIdListResp
+// @router /enterScore/company/searchlist [get]
+func (this *EnterScoreController) CompanySearchList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	keyWord := this.GetString("KeyWord")
+	keyWord = strings.Trim(keyWord, " ")
+	keyWord = strings.Replace(keyWord, "'", "", -1)
+
+	resp := new(company.CompanyNameAndIdListResp)
+	var companyCondition string
+	var companypars []interface{}
+	var listResp []*company.CompanyNameAndId
+	companyCondition += ` AND b.product_name = ? `
+	companypars = append(companypars, "权益")
+	companyCondition += ` AND b.status = ? `
+	companypars = append(companypars, "永续")
+
+	if keyWord != "" {
+		companyCondition += ` AND a.company_name LIKE '%` + keyWord + `%' `
+	}
+
+	//权益申请销售只能看到自己名下的客户的申请
+	companyIds, err := cygxService.GetAdminLookUserCompanyIdsBySelf(sysUser)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,GetAdminLookUserCompanyIds Err:" + err.Error()
+		return
+	}
+	lencompanyIds := len(companyIds)
+	if lencompanyIds > 0 {
+		companyCondition += ` AND a.company_id IN (` + utils.GetOrmInReplace(lencompanyIds) + `)`
+		companypars = append(companypars, companyIds)
+	}
+
+	companyList, err := company.GetCompanyIdListByproductName(companyCondition, companypars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	if len(companyList) == 0 {
+		listResp = make([]*company.CompanyNameAndId, 0)
+	} else {
+		listResp = companyList
+	}
+	resp.List = listResp
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title  详情
+// @Description 获取详情接口
+// @Param   EnterScoreId   query   int  true       "录分ID"
+// @Success Ret=200 {object} cygx.CygxEnterScoreDetailResp
+// @router /enterScore/detail [get]
+func (this *EnterScoreController) EnterScoreDetail() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	AdminUser := this.SysUser
+	if AdminUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+
+	enterScoreId, _ := this.GetInt("EnterScoreId")
+	resp := new(cygx.CygxEnterScoreDetailResp)
+	var itemslistPermission []*cygx.EnterScorePermissionListResp       // 权益行业
+	var itemsFicclistPermission []*cygx.EnterScorePermissionListResp   // FICC行业
+	mapRaiUser := make(map[string][]*cygx.EnterScoreRealNameListResp)  //权益研究员
+	mapFiccUser := make(map[string][]*cygx.EnterScoreRealNameListResp) // FICC研究员
+	var itemsGroup []*cygx.EnterScoreGroupListResp                     //自定义分组
+	if enterScoreId == 0 {
+		//权益研究员
+		sysUserList, err := cygx.GetAskEmailList()
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetAskEmailList Err: " + err.Error()
+			return
+		}
+
+		for _, v := range sysUserList {
+			item := new(cygx.EnterScoreRealNameListResp)
+			item.RealName = v.Name
+			item.ChartPermissionName = v.ChartPermissionName
+			mapRaiUser[v.ChartPermissionName] = append(mapRaiUser[v.ChartPermissionName], item)
+		}
+
+		listPermission, err := cygx.GetChartPermissionAll()
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取品种信息失败,Err:" + err.Error()
+			return
+		}
+
+		permissionNameArr := []string{"医药", "消费", "科技", "智造", "策略", "固收"}
+		for _, v := range listPermission {
+			if !utils.InArrayByStr(permissionNameArr, v.PermissionName) {
+				continue
+			}
+			item := new(cygx.EnterScorePermissionListResp)
+			item.ChartPermissionName = v.PermissionName
+			item.List = mapRaiUser[v.PermissionName]
+			itemslistPermission = append(itemslistPermission, item)
+		}
+		resp.EnterScoreObj.ListRai = itemslistPermission
+
+		//ficc 研究员
+		ficcUserList, err := system.GetFiccEnterScoreAdmin()
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetFiccEnterScoreAdmin Err: " + err.Error()
+			return
+		}
+
+		for _, v := range ficcUserList {
+			item := new(cygx.EnterScoreRealNameListResp)
+			item.RealName = v.RealName
+			item.ChartPermissionName = v.GroupName
+			mapFiccUser[v.GroupName] = append(mapFiccUser[v.GroupName], item)
+		}
+
+		permissionFiccNameArr := []string{"宏观组", "建材组", "有色组", "能化组"}
+		for _, v := range permissionFiccNameArr {
+			item := new(cygx.EnterScorePermissionListResp)
+			item.ChartPermissionName = v
+			item.List = mapFiccUser[v]
+			itemsFicclistPermission = append(itemsFicclistPermission, item)
+		}
+		resp.EnterScoreObj.ListFicc = itemsFicclistPermission
+
+		groupNameArr := []string{"销售分", "专题分", "专家分", "云图大拓", "艾摩宏观"}
+		for _, v := range groupNameArr {
+			item := new(cygx.EnterScoreGroupListResp)
+			item.GroupName = v
+			itemsGroup = append(itemsGroup, item)
+		}
+		resp.EnterScoreObj.ListGroup = itemsGroup
+		resp.PercentageObj = resp.EnterScoreObj
+		resp.EnterScoreType = 1
+		resp.Quarter = make([]string, 0)
+	} else {
+		//初始化数据,方便前端渲染
+		var itemslistPermissionInit []*cygx.EnterScorePermissionListResp       // 权益行业
+		var itemsFicclistPermissionInit []*cygx.EnterScorePermissionListResp   // FICC行业
+		var itemsGroupInit []*cygx.EnterScoreGroupListResp                     //自定义分组
+		mapRaiUserInit := make(map[string][]*cygx.EnterScoreRealNameListResp)  //权益研究员
+		mapFiccUserInit := make(map[string][]*cygx.EnterScoreRealNameListResp) // FICC研究员
+
+		enterScoreDetail, err := cygx.GetCygxEnterScoreInfoById(enterScoreId)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetCygxEnterScoreInfoById Err: " + err.Error()
+			return
+		}
+
+		resp.EnterScoreId = enterScoreDetail.EnterScoreId
+		resp.CompanyId = enterScoreDetail.CompanyId
+		resp.CompanyName = enterScoreDetail.CompanyName
+		resp.StartDate = enterScoreDetail.StartDate
+		resp.EndDate = enterScoreDetail.EndDate
+		resp.Quarter = strings.Split(enterScoreDetail.Quarter, ",")
+		resp.EnterScoreType = enterScoreDetail.EnterScoreType
+		resp.Ranking = enterScoreDetail.Ranking
+		resp.IsMergeScoring = enterScoreDetail.IsMergeScoring
+		resp.SecuritiesFirmsName = enterScoreDetail.SecuritiesFirmsName
+		resp.MergeProportion = enterScoreDetail.MergeProportion
+		resp.ProportionTotal = enterScoreDetail.ProportionTotal
+		resp.RaiProportionTotal = enterScoreDetail.RaiProportionTotal
+		resp.FiccProportionTotal = enterScoreDetail.FiccProportionTotal
+
+		listResearcher, err := cygx.GeCygxEnterScoreResearcherListById(enterScoreId)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GeCygxEnterScoreResearcherListById Err: " + err.Error()
+			return
+		}
+		for _, v := range listResearcher {
+			item := new(cygx.EnterScoreRealNameListResp)
+			item.RealName = v.RealName
+			item.ChartPermissionName = v.ChartPermissionName
+			item.Proportion = v.Proportion
+			if v.ProductId == utils.COMPANY_PRODUCT_RAI_ID {
+				mapRaiUser[v.ChartPermissionName] = append(mapRaiUser[v.ChartPermissionName], item)
+			} else {
+				mapFiccUser[v.ChartPermissionName] = append(mapFiccUser[v.ChartPermissionName], item)
+			}
+		}
+
+		for _, v := range listResearcher {
+			item := new(cygx.EnterScoreRealNameListResp)
+			item.RealName = v.RealName
+			item.ChartPermissionName = v.ChartPermissionName
+			if v.ProductId == utils.COMPANY_PRODUCT_RAI_ID {
+				mapRaiUserInit[v.ChartPermissionName] = append(mapRaiUserInit[v.ChartPermissionName], item)
+			} else {
+				mapFiccUserInit[v.ChartPermissionName] = append(mapFiccUserInit[v.ChartPermissionName], item)
+			}
+		}
+
+		listPermission, err := cygx.GetCygxEnterScorePermissionListById(enterScoreId)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetCygxEnterScorePermissionListById Err: " + err.Error()
+			return
+		}
+		for _, v := range listPermission {
+			item := new(cygx.EnterScorePermissionListResp)
+			item.ChartPermissionName = v.ChartPermissionName
+			item.Proportion = v.Proportion
+			if v.ProductId == utils.COMPANY_PRODUCT_RAI_ID {
+				item.List = mapRaiUser[v.ChartPermissionName]
+				itemslistPermission = append(itemslistPermission, item)
+			} else {
+				item.List = mapFiccUser[v.ChartPermissionName]
+				itemsFicclistPermission = append(itemsFicclistPermission, item)
+			}
+		}
+
+		for _, v := range listPermission {
+			item := new(cygx.EnterScorePermissionListResp)
+			item.ChartPermissionName = v.ChartPermissionName
+			if v.ProductId == utils.COMPANY_PRODUCT_RAI_ID {
+				item.List = mapRaiUserInit[v.ChartPermissionName]
+				itemslistPermissionInit = append(itemslistPermissionInit, item)
+			} else {
+				item.List = mapFiccUserInit[v.ChartPermissionName]
+				itemsFicclistPermissionInit = append(itemsFicclistPermissionInit, item)
+			}
+		}
+
+		listGroup, err := cygx.GeCygxEnterScoreGroupListById(enterScoreId)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GeCygxEnterScoreGroupListById Err: " + err.Error()
+			return
+		}
+		for _, v := range listGroup {
+			item := new(cygx.EnterScoreGroupListResp)
+			item.GroupName = v.GroupName
+			item.Proportion = v.Proportion
+			itemsGroup = append(itemsGroup, item)
+		}
+
+		for _, v := range listGroup {
+			item := new(cygx.EnterScoreGroupListResp)
+			item.GroupName = v.GroupName
+			itemsGroupInit = append(itemsGroupInit, item)
+		}
+
+		if enterScoreDetail.EnterScoreType == 1 {
+			resp.EnterScoreObj.ListGroup = itemsGroup
+			resp.EnterScoreObj.ListRai = itemslistPermission
+			resp.EnterScoreObj.ListFicc = itemsFicclistPermission
+
+			resp.PercentageObj.ListGroup = itemsGroupInit
+			resp.PercentageObj.ListRai = itemslistPermissionInit
+			resp.PercentageObj.ListFicc = itemsFicclistPermissionInit
+		} else {
+			resp.PercentageObj.ListGroup = itemsGroup
+			resp.PercentageObj.ListRai = itemslistPermission
+			resp.PercentageObj.ListFicc = itemsFicclistPermission
+
+			resp.EnterScoreObj.ListGroup = itemsGroupInit
+			resp.EnterScoreObj.ListRai = itemslistPermissionInit
+			resp.EnterScoreObj.ListFicc = itemsFicclistPermissionInit
+		}
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 更新录分
+// @Description 更新录分接口
+// @Param	request	body cygx.UpdateEnterScoreReq true "type json string"
+// @Success 200 {object} "保存成功"
+// @router /enterScore/update [post]
+func (this *EnterScoreController) EnterScoreUpdate() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req cygx.UpdateEnterScoreReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	enterScoreId := req.EnterScoreId
+	companyId := req.CompanyId
+	if companyId == 0 {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误,companyId不可为空"
+		return
+	}
+
+	startDate := req.StartDate
+	endDate := req.EndDate
+	if startDate == "" || endDate == "" {
+		br.Msg = "请选择季度信息"
+		return
+	}
+
+	companyProduct, err := company.GetCompanyProductByCompanyIdAndProductId(companyId, utils.COMPANY_PRODUCT_RAI_ID)
+	if err != nil {
+		br.Msg = "查询客户产品信息失败"
+		br.ErrMsg = "查询客户产品信息失败,Err:" + err.Error()
+		return
+	}
+
+	item := new(cygx.CygxEnterScore)
+	item.EnterScoreId = enterScoreId
+	item.CompanyId = companyId
+	item.CompanyName = req.CompanyName
+	item.StartDate = req.StartDate
+	item.EndDate = req.EndDate
+	item.Quarter = strings.Join(req.Quarter, ",")
+
+	quarterDate, err := utils.GetQuarterStartDatesInRange(req.StartDate, req.EndDate)
+	if err != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取对应季度信息失败,Err:" + err.Error()
+		return
+	}
+
+	item.QuarterDate = strings.Join(quarterDate, ",")
+
+	item.EnterScoreType = req.EnterScoreType
+	item.Ranking = req.Ranking
+	item.IsMergeScoring = req.IsMergeScoring
+	item.SecuritiesFirmsName = req.SecuritiesFirmsName
+	item.MergeProportion = req.MergeProportion
+	item.RaiProportionTotal = req.RaiProportionTotal
+	item.FiccProportionTotal = req.FiccProportionTotal
+	item.ProportionTotal = req.ProportionTotal
+	item.SellerId = companyProduct.SellerId
+	item.SellerName = companyProduct.SellerName
+	item.AdminId = sysUser.AdminId
+	item.AdminName = sysUser.RealName
+	item.CreateTime = time.Now()
+	item.ModifyTime = time.Now()
+
+	var itemsPermission []*cygx.CygxEnterScorePermission //行业数组
+	var itemsResearcher []*cygx.CygxEnterScoreResearcher //研究员数组
+	var itemsGroup []*cygx.CygxEnterScoreGroup           //自定义分组
+	listRai := req.ListRai
+	listFicc := req.ListFicc
+	listGroup := req.ListGroup
+
+	for _, v := range listRai { // 权益数据
+		itemPermission := new(cygx.CygxEnterScorePermission)
+		itemPermission.ChartPermissionName = v.ChartPermissionName
+		itemPermission.Proportion = v.Proportion
+		itemPermission.EnterScoreId = v.EnterScoreId
+		itemPermission.CompanyId = companyId
+		itemPermission.AdminId = sysUser.AdminId
+		itemPermission.AdminName = sysUser.RealName
+		itemPermission.ProductId = utils.COMPANY_PRODUCT_RAI_ID
+		itemPermission.CreateTime = time.Now()
+		itemPermission.ModifyTime = time.Now()
+		itemsPermission = append(itemsPermission, itemPermission)
+		for _, vResearcher := range v.List {
+			itemResearcher := new(cygx.CygxEnterScoreResearcher)
+			itemResearcher.ChartPermissionName = v.ChartPermissionName
+			itemResearcher.EnterScoreId = v.EnterScoreId
+			itemResearcher.CompanyId = companyId
+			itemResearcher.RealName = vResearcher.RealName
+			itemResearcher.Proportion = vResearcher.Proportion
+			itemResearcher.AdminId = sysUser.AdminId
+			itemResearcher.AdminName = sysUser.RealName
+			itemResearcher.ProductId = utils.COMPANY_PRODUCT_RAI_ID
+			itemResearcher.CreateTime = time.Now()
+			itemResearcher.ModifyTime = time.Now()
+			itemsResearcher = append(itemsResearcher, itemResearcher)
+		}
+	}
+
+	for _, v := range listFicc { // FICC数据
+		itemPermission := new(cygx.CygxEnterScorePermission)
+		itemPermission.ChartPermissionName = v.ChartPermissionName
+		itemPermission.Proportion = v.Proportion
+		itemPermission.EnterScoreId = v.EnterScoreId
+		itemPermission.CompanyId = companyId
+		itemPermission.AdminId = sysUser.AdminId
+		itemPermission.AdminName = sysUser.RealName
+		itemPermission.ProductId = utils.COMPANY_PRODUCT_FICC_ID
+		itemPermission.CreateTime = time.Now()
+		itemPermission.ModifyTime = time.Now()
+		itemsPermission = append(itemsPermission, itemPermission)
+		for _, vResearcher := range v.List {
+			itemResearcher := new(cygx.CygxEnterScoreResearcher)
+			itemResearcher.ChartPermissionName = v.ChartPermissionName
+			itemResearcher.EnterScoreId = v.EnterScoreId
+			itemResearcher.CompanyId = companyId
+			itemResearcher.RealName = vResearcher.RealName
+			itemResearcher.Proportion = vResearcher.Proportion
+			itemResearcher.AdminId = sysUser.AdminId
+			itemResearcher.AdminName = sysUser.RealName
+			itemResearcher.ProductId = utils.COMPANY_PRODUCT_FICC_ID
+			itemResearcher.CreateTime = time.Now()
+			itemResearcher.ModifyTime = time.Now()
+			itemsResearcher = append(itemsResearcher, itemResearcher)
+		}
+	}
+
+	for _, v := range listGroup {
+		itemGroup := new(cygx.CygxEnterScoreGroup)
+		itemGroup.GroupName = v.GroupName
+		itemGroup.Proportion = v.Proportion
+		itemGroup.CompanyId = companyId
+		itemGroup.AdminId = sysUser.AdminId
+		itemGroup.AdminName = sysUser.RealName
+		itemGroup.CreateTime = time.Now()
+		itemGroup.ModifyTime = time.Now()
+		itemsGroup = append(itemsGroup, itemGroup)
+	}
+
+	if enterScoreId == 0 { // 新增
+		err = cygx.AddCygxEnterScore(item, itemsPermission, itemsResearcher, itemsGroup)
+	} else { // 修改
+		item.EnterScoreId = enterScoreId
+		err = cygx.UpdateCygxEnterScore(item, itemsPermission, itemsResearcher, itemsGroup)
+	}
+	if err != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "操作失败Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.IsAddLog = true
+	br.Msg = "操作成功"
+}
+
+// @Title 列表
+// @Description 列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   KeyWord   query   string  true       "搜索关键词"
+// @Param   CompanyName   query   string  true       "客户名称"
+// @Param   AdminId   query   string  true       "销售id,多个用英文逗号隔开,空字符串为全部"
+// @Param   IsExport   query   bool  false       "是否导出excel,默认是false"
+// @Success 200 {object} cygx.GetCygxEnterScoreListRep
+// @router /enterScore/list [get]
+func (this *EnterScoreController) EnterScoreList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	keyWord := this.GetString("KeyWord")
+	adminId := this.GetString("AdminId")
+	//是否导出报表
+	isExport, _ := this.GetBool("IsExport")
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	fmt.Println(isExport)
+	startSize = utils.StartIndex(currentIndex, pageSize)
+	if isExport {
+		startSize = 0
+		pageSize = 9999
+	}
+	var condition string
+	var pars []interface{}
+	//如果不是权益管理员和admin,就做可见权限限制
+	if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_RAI_ADMIN && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN {
+		var conditionAdmin string
+		var parsAdmin []interface{}
+		conditionAdmin = "  AND product_id = 2  AND   status = '永续'  AND seller_id =  ?  "
+		parsAdmin = append(parsAdmin, sysUser.AdminId)
+		listProduct, err := company.GetCompanyProductList(conditionAdmin, parsAdmin)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		var companyIds []int
+		for _, v := range listProduct {
+			companyIds = append(companyIds, v.CompanyId)
+		}
+		companyIds = append(companyIds, 0)
+		condition += ` AND company_id  IN (` + utils.GetOrmInReplace(len(companyIds)) + `) `
+		pars = append(pars, companyIds)
+	}
+
+	if keyWord != "" {
+		condition += ` AND company_name LIKE '%` + keyWord + `%' `
+	}
+	if adminId != "" {
+		condition += ` AND seller_id IN (` + adminId + `) `
+	}
+	total, err := cygx.GetCygxEnterScoreCount(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	list, err := cygx.GetCygxEnterScoreList(condition, pars, startSize, pageSize)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	resp := new(cygx.GetCygxEnterScoreListRep)
+	if len(list) == 0 {
+		resp.List = make([]*cygx.EnterScoreListResp, 0)
+	} else {
+		for _, v := range list {
+			item := new(cygx.EnterScoreListResp)
+			item.EnterScoreId = v.EnterScoreId
+			item.CompanyId = v.CompanyId
+			item.CompanyName = v.CompanyName
+			item.Quarter = strings.Split(v.Quarter, ",")
+			item.EnterScoreType = v.EnterScoreType
+			item.Ranking = v.Ranking
+			item.IsMergeScoring = v.IsMergeScoring
+			item.SecuritiesFirmsName = v.SecuritiesFirmsName
+			item.ProportionTotal = v.ProportionTotal
+			item.EnterScoreId = v.EnterScoreId
+			item.SellerId = v.SellerId
+			item.SellerName = v.SellerName
+			item.CreateTime = v.CreateTime.Format(utils.FormatDateTime)
+			item.ModifyTime = v.ModifyTime.Format(utils.FormatDateTime)
+			resp.List = append(resp.List, item)
+		}
+	}
+	//导出excel
+	if isExport {
+		EnterScoreScoreListExport(this, resp, br)
+		return
+	}
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp.Paging = page
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// EnterScoreScoreListExport 导出Excel
+func EnterScoreScoreListExport(this *EnterScoreController, resp *cygx.GetCygxEnterScoreListRep, br *models.BaseResponse) {
+	dir, err := os.Executable()
+	exPath := filepath.Dir(dir)
+	downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
+	xlsxFile := xlsx.NewFile()
+	if err != nil {
+		br.Msg = "生成文件失败"
+		br.ErrMsg = "生成文件失败"
+		return
+	}
+	style := xlsx.NewStyle()
+	alignment := xlsx.Alignment{
+		Horizontal: "center",
+		Vertical:   "center",
+		WrapText:   true,
+	}
+
+	style.Alignment = alignment
+	style.ApplyAlignment = true
+
+	sheel, err := xlsxFile.AddSheet("录分记录")
+	if err != nil {
+		br.Msg = "新增Sheet失败"
+		br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
+		return
+	}
+	sheel.SetColWidth(0, 0, 30)
+	sheel.SetColWidth(1, 1, 15)
+	sheel.SetColWidth(2, 2, 15)
+	sheel.SetColWidth(3, 3, 18)
+
+	titleRow := sheel.AddRow()
+
+	cellA := titleRow.AddCell()
+	cellA.SetStyle(style)
+	cellA.SetValue("客户名称")
+
+	cellB := titleRow.AddCell()
+	cellB.SetStyle(style)
+	cellB.SetValue("销售")
+
+	cellC := titleRow.AddCell()
+	cellC.SetStyle(style)
+	cellC.SetValue("季度")
+
+	cellD := titleRow.AddCell()
+	cellD.SetStyle(style)
+	cellD.SetValue("总分")
+
+	cellE := titleRow.AddCell()
+	cellE.SetStyle(style)
+	cellE.SetValue("排名")
+
+	cellF := titleRow.AddCell()
+	cellF.SetStyle(style)
+	cellF.SetValue("合并打分")
+
+	cellG := titleRow.AddCell()
+	cellG.SetStyle(style)
+	cellG.SetValue("券商名称")
+
+	for _, v := range resp.List {
+		dataRow := sheel.AddRow()
+		dataRow.SetHeight(20)
+
+		cellA := dataRow.AddCell()
+		cellA.SetStyle(style)
+		cellA.SetValue(v.CompanyName)
+
+		cellB := dataRow.AddCell()
+		cellB.SetStyle(style)
+		cellB.SetValue(v.SellerName)
+
+		cellC := dataRow.AddCell()
+		cellC.SetStyle(style)
+		cellC.SetValue(strings.Join(v.Quarter, ","))
+
+		cellD := dataRow.AddCell()
+		cellD.SetStyle(style)
+		cellD.SetValue(v.ProportionTotal)
+
+		cellE := dataRow.AddCell()
+		cellE.SetStyle(style)
+		cellE.SetValue(v.Ranking)
+
+		cellF := dataRow.AddCell()
+		cellF.SetStyle(style)
+		if v.IsMergeScoring == 1 {
+			cellF.SetValue("是")
+		} else {
+			cellF.SetValue("否")
+		}
+
+		cellG := dataRow.AddCell()
+		cellG.SetStyle(style)
+		cellG.SetValue(v.SecuritiesFirmsName)
+
+	}
+	err = xlsxFile.Save(downLoadnFilePath)
+	if err != nil {
+		br.Msg = "保存文件失败"
+		br.ErrMsg = "保存文件失败"
+		return
+	}
+	randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
+	downloadFileName := "录分记录导出数据_" + randStr + ".xlsx"
+	this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
+	defer func() {
+		os.Remove(downLoadnFilePath)
+	}()
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "导出成功"
+}
+
+// @Title 删除录分
+// @Description 删除录分接口
+// @Param	request	body cygx.UpdateEnterScoreReq true "type json string"
+// @Success 200 {object} "保存成功"
+// @router /enterScore/delete [post]
+func (this *EnterScoreController) EnterScoreDelete() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req cygx.EnterScoreIdReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	enterScoreId := req.EnterScoreId
+	if enterScoreId == 0 {
+		br.Msg = "参数错误!"
+		br.ErrMsg = "参数错误,EnterScoreId 不能为0"
+		return
+	}
+	err = cygx.DeleteEnterScore(enterScoreId)
+	if err != nil {
+		br.Msg = "删除失败"
+		br.ErrMsg = "操作失败Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.IsAddLog = true
+	br.Msg = "删除成功"
+}
+
+// @Title  评分总览
+// @Description 评分总览接口
+// @Param   KeyWord   query   string  true       "搜索关键词"
+// @Param   City   query   string  true       "城市"
+// @Param   StartDate   query   string  false       "开始日期"
+// @Param   EndDate   query   string  false       "结束日期"
+// @Param   EnterScoreType   query   string  false       "展示法方式 1:按评分录入、2:按比例录入,默认1"
+// @Param   IsExport   query   bool  false       "是否导出excel,默认是false"
+// @Success Ret=200 {object} cygx.ScoreOverviewListResp
+// @router /enterScore/scoreOverview [get]
+func (this *EnterScoreController) EnterScoreScoreOverview() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	AdminUser := this.SysUser
+	if AdminUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	resp := new(cygx.ScoreOverviewListResp)
+	keyWord := this.GetString("KeyWord")
+	city := this.GetString("City")
+	enterScoreType, _ := this.GetInt("EnterScoreType", 1)
+	startDate := this.GetString("StartDate")
+	endDate := this.GetString("EndDate")
+	//是否导出报表
+	isExport, _ := this.GetBool("IsExport")
+	if startDate == "" {
+		br.Msg = "请选择对应年份与季度"
+		return
+	}
+
+	var companyCondition string
+	var companypars []interface{}
+	companyCondition += ` AND b.product_name = ? `
+	companypars = append(companypars, "权益")
+	companyCondition += ` AND b.status = ? `
+	companypars = append(companypars, "永续")
+
+	if city != "" {
+		//传过来多个城市的时候的筛选
+		citySlice := strings.Split(city, ",")
+		city = strings.Join(citySlice, "','")
+		city = "'" + city + "'"
+		companyCondition += ` AND a.city  IN  (` + city + `) `
+	}
+
+	//权益申请销售只能看到自己名下的客户的申请
+	companyIds, err := cygxService.GetAdminLookUserCompanyIdsBySelf(AdminUser)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,GetAdminLookUserCompanyIds Err:" + err.Error()
+		return
+	}
+
+	var newcompanyIds []int
+	var searchcompanyIds []int
+	//如果机构搜索做了限制 ,那么公司列表的纵向展示也做限制
+	if keyWord != "" {
+		listSearchCompany, err := cygx.GetCygxEnterScoreListBySecuritiesFirmsName(keyWord)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		if len(listSearchCompany) > 0 {
+			for _, v := range listSearchCompany {
+				searchcompanyIds = append(searchcompanyIds, v.CompanyId)
+			}
+		} else {
+			searchcompanyIds = append(searchcompanyIds, 0)
+		}
+
+		if len(companyIds) > 0 {
+			newcompanyIds = utils.IntersectInt(searchcompanyIds, companyIds) //获取销售可见权限,与搜索权限的交集
+		} else {
+			newcompanyIds = searchcompanyIds
+		}
+	} else {
+		newcompanyIds = companyIds
+	}
+
+	newlencompanyIds := len(newcompanyIds)
+	if newlencompanyIds > 0 {
+		companyCondition += ` AND a.company_id IN (` + utils.GetOrmInReplace(newlencompanyIds) + `)`
+		companypars = append(companypars, newcompanyIds)
+	}
+	companyList, err := company.GetCompanyIdListByproductName(companyCondition, companypars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	var condition string
+	var pars []interface{}
+	if endDate != "" {
+		condition += ` AND start_date <= ? AND end_date >= ? `
+		pars = append(pars, startDate, endDate)
+	}
+
+	//if enterScoreType == 2 {
+	//condition += ` AND enter_score_type = 2 `
+	//}
+
+	if keyWord != "" {
+		condition += ` AND securities_firms_name LIKE '%` + keyWord + `%' `
+	}
+
+	if newlencompanyIds > 0 {
+		condition += ` AND company_id IN (` + utils.GetOrmInReplace(newlencompanyIds) + `)`
+		pars = append(pars, newcompanyIds)
+	}
+
+	total, err := cygx.GetCygxEnterScoreCount(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	if total > 0 {
+		list, err := cygx.GetCygxEnterScoreList(condition, pars, 0, 100)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetCygxEnterScoreListErr:" + err.Error()
+			return
+		}
+		mapenterScoreTypeCompanyIds := make(map[int]bool)
+		mapenterScoreProportionTotal := make(map[int]float64)
+		var enterScoreIds []int
+		mapenterScore := make(map[int]*cygx.CygxEnterScore) //录分详情放在map中
+		for _, v := range list {
+			mapenterScore[v.CompanyId] = v
+			mapenterScoreProportionTotal[v.CompanyId] = v.ProportionTotal
+			enterScoreIds = append(enterScoreIds, v.EnterScoreId)
+			if v.EnterScoreType == 2 {
+				mapenterScoreTypeCompanyIds[v.CompanyId] = true //记录按照百分比录入的公司
+			}
+		}
+		//fmt.Println(enterScoreIds)
+		listResearcher, err := cygx.GeCygxEnterScoreResearcherListByIds(enterScoreIds, newcompanyIds) //获取所有的研究员
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetCygxEnterScorePermissionListByIds Err:" + err.Error()
+			return
+		}
+		mapResearcher := make(map[string][]*cygx.EnterScoreRealNameListResp)
+		mapResearcherProportion := make(map[string]string)
+		//mapResearcherPermission := make(map[string][]map[string]string)
+		var researcherArr []string // 会出现的研究员姓名
+		mapResearcherbool := make(map[string]bool)
+		for _, v := range listResearcher {
+			if v.Proportion == 0 {
+				continue
+			}
+
+			if !mapResearcherbool[v.RealName] {
+				researcherArr = append(researcherArr, v.RealName)
+				mapResearcherbool[v.RealName] = true
+			}
+
+			if enterScoreType == 2 && !mapenterScoreTypeCompanyIds[v.CompanyId] {
+				mapResearcherProportion[fmt.Sprint(v.RealName, "_", v.CompanyId)] = utils.SubFloatToString(v.Proportion/mapenterScoreProportionTotal[v.CompanyId]*100, 2) //研究员姓名、公司ID,占比值对应关系绑定
+			} else {
+				mapResearcherProportion[fmt.Sprint(v.RealName, "_", v.CompanyId)] = fmt.Sprint(v.Proportion) //研究员姓名、公司ID,占比值对应关系绑定
+			}
+
+		}
+
+		mapResearcherProportionText := make(map[string][]string)
+		for _, vC := range companyList {
+			for _, vR := range researcherArr {
+				var proportionText string
+				if mapResearcherProportion[fmt.Sprint(vR, "_", vC.CompanyId)] != "" {
+					proportionText = mapResearcherProportion[fmt.Sprint(vR, "_", vC.CompanyId)]
+				} else {
+					if mapenterScoreProportionTotal[vC.CompanyId] > 0 {
+						proportionText = "0"
+					} else {
+						proportionText = ""
+					}
+				}
+				//0与空的展示逻辑处理
+				if mapenterScoreTypeCompanyIds[vC.CompanyId] || enterScoreType == 2 { //按照百分比展示的拼接 %
+					if proportionText != "" {
+						proportionText += "%"
+					}
+				}
+				mapResearcherProportionText[vR] = append(mapResearcherProportionText[vR], proportionText)
+			}
+		}
+
+		researcherArr = make([]string, 0)
+		for _, v := range listResearcher {
+			if v.Proportion == 0 {
+				continue
+			}
+			if utils.InArrayByStr(researcherArr, v.RealName) { //避免重复合并到数组
+				continue
+			}
+			item := new(cygx.EnterScoreRealNameListResp) // 研究员结构体数据
+			item.RealName = v.RealName
+			item.ChartPermissionName = v.ChartPermissionName
+			item.ProportionListText = mapResearcherProportionText[v.RealName]
+			mapResearcher[v.ChartPermissionName] = append(mapResearcher[v.ChartPermissionName], item)
+			researcherArr = append(researcherArr, v.RealName)
+		}
+
+		listPermission, err := cygx.GetCygxEnterScorePermissionListByIds(enterScoreIds) // 获取所有的行业名称
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetCygxEnterScorePermissionListByIds Err:" + err.Error()
+			return
+		}
+		mapPermissionProportion := make(map[string]string)
+		for _, v := range listPermission {
+			if v.Proportion == 0 {
+				continue
+			}
+			//mapPermissionProportion[fmt.Sprint(v.ChartPermissionName, "_", v.CompanyId)] = fmt.Sprint(v.Proportion) //行业名称、公司ID,占比值对应关系绑定
+
+			if enterScoreType == 2 && !mapenterScoreTypeCompanyIds[v.CompanyId] {
+				mapPermissionProportion[fmt.Sprint(v.ChartPermissionName, "_", v.CompanyId)] = utils.SubFloatToString(v.Proportion/mapenterScoreProportionTotal[v.CompanyId]*100, 2) //研究员姓名、公司ID,占比值对应关系绑定
+			} else {
+				mapPermissionProportion[fmt.Sprint(v.ChartPermissionName, "_", v.CompanyId)] = fmt.Sprint(v.Proportion) //行业名称、公司ID,占比值对应关系绑定
+			}
+		}
+
+		var permissionArr []string // 会出现的行业名称
+		mapPermissionbool := make(map[string]bool)
+		for _, v := range listPermission {
+			if mapPermissionbool[v.ChartPermissionName] {
+				continue
+			}
+			permissionArr = append(permissionArr, v.ChartPermissionName)
+			mapPermissionbool[v.ChartPermissionName] = true
+		}
+
+		mapPermissionProportionText := make(map[string][]string)
+		for _, vC := range companyList {
+			for _, vP := range permissionArr {
+				var proportionText string
+				if mapPermissionProportion[fmt.Sprint(vP, "_", vC.CompanyId)] != "" {
+					proportionText = mapPermissionProportion[fmt.Sprint(vP, "_", vC.CompanyId)]
+				} else {
+					if mapenterScoreProportionTotal[vC.CompanyId] > 0 {
+						proportionText = "0"
+					} else {
+						proportionText = ""
+					}
+				}
+
+				if mapenterScoreTypeCompanyIds[vC.CompanyId] || enterScoreType == 2 { //按照百分比展示的拼接 %
+					if proportionText != "" {
+						proportionText += "%"
+					}
+				}
+
+				mapPermissionProportionText[vP] = append(mapPermissionProportionText[vP], proportionText)
+			}
+		}
+
+		var itemsP []*cygx.EnterScorePermissionListResp
+		for _, v := range permissionArr {
+			itemP := new(cygx.EnterScorePermissionListResp) //行业结构体
+			itemP.ChartPermissionName = v
+			itemP.ProportionListText = mapPermissionProportionText[v]
+			itemP.List = mapResearcher[v]
+			itemsP = append(itemsP, itemP)
+		}
+
+		listGroup, err := cygx.GeCygxEnterScoreGroupListByIds(enterScoreIds) // 获取所有自定义分组名称
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GeCygxEnterScoreGroupListByIds Err:" + err.Error()
+			return
+		}
+		mapGroupProportion := make(map[string]string)
+		var groupArr []string // 会出现的自定义分组名称
+		mapGroupbool := make(map[string]bool)
+		for _, v := range listGroup {
+
+			if enterScoreType == 2 && !mapenterScoreTypeCompanyIds[v.CompanyId] {
+				mapGroupProportion[fmt.Sprint(v.GroupName, "_", v.CompanyId)] = utils.SubFloatToString(v.Proportion/mapenterScoreProportionTotal[v.CompanyId]*100, 2) //自定义分组名称、公司ID,占比值对应关系绑定
+			} else {
+				mapGroupProportion[fmt.Sprint(v.GroupName, "_", v.CompanyId)] = fmt.Sprint(v.Proportion) //自定义分组名称、公司ID,占比值对应关系绑定
+			}
+
+			//mapGroupProportion[fmt.Sprint(v.GroupName, "_", v.CompanyId)] = fmt.Sprint(v.Proportion) //自定义分组名称、公司ID,占比值对应关系绑定
+			if mapGroupbool[v.GroupName] {
+				continue
+			}
+			groupArr = append(groupArr, v.GroupName)
+			mapGroupbool[v.GroupName] = true
+		}
+		mapGroupProportionText := make(map[string][]string)
+		for _, vC := range companyList {
+			for _, vP := range groupArr {
+				var proportionText string
+				if mapGroupProportion[fmt.Sprint(vP, "_", vC.CompanyId)] != "" {
+					proportionText = mapGroupProportion[fmt.Sprint(vP, "_", vC.CompanyId)]
+				} else {
+					if mapenterScoreProportionTotal[vC.CompanyId] > 0 {
+						proportionText = "0"
+					} else {
+						proportionText = ""
+					}
+				}
+				if mapenterScoreTypeCompanyIds[vC.CompanyId] || enterScoreType == 2 { //按照百分比展示的拼接 %
+					if proportionText != "" {
+						proportionText += "%"
+					}
+				}
+				mapGroupProportionText[vP] = append(mapGroupProportionText[vP], proportionText)
+			}
+		}
+
+		var itemsG []*cygx.EnterScoreGroupListResp
+		for _, v := range groupArr {
+			itemG := new(cygx.EnterScoreGroupListResp) //行业结构体
+			itemG.GroupName = v
+			itemG.ProportionListText = mapGroupProportionText[v]
+			itemsG = append(itemsG, itemG)
+		}
+
+		var proportionTotalText []string      //总计
+		var rankingText []string              //排名
+		var securitiesFirmsNameText []string  //券商名称
+		var mergeProportionTotalText []string //占比
+
+		for _, vC := range companyList {
+			var ranking, securitiesFirmsName, proportionTotal, mergeProportionTotal string
+			item := mapenterScore[vC.CompanyId]
+			if item != nil {
+				ranking = item.Ranking
+				securitiesFirmsName = item.SecuritiesFirmsName
+				proportionTotal = fmt.Sprint(item.ProportionTotal)
+				mergeProportionTotal = fmt.Sprint(item.MergeProportion)
+			}
+			//if mapenterScoreTypeCompanyIds[vC.CompanyId] { //按照百分比展示的拼接 %
+			if mapenterScoreProportionTotal[vC.CompanyId] > 0 {
+				mergeProportionTotal += "%"
+			}
+			rankingText = append(rankingText, ranking)
+			securitiesFirmsNameText = append(securitiesFirmsNameText, securitiesFirmsName)
+			proportionTotalText = append(proportionTotalText, proportionTotal)
+			mergeProportionTotalText = append(mergeProportionTotalText, mergeProportionTotal)
+		}
+
+		itemproportionTotal := new(cygx.EnterScoreGroupListResp) //券商名称结构体
+		itemproportionTotal.GroupName = "合计"
+		itemproportionTotal.ProportionListText = proportionTotalText
+		itemsG = append(itemsG, itemproportionTotal)
+
+		itemranking := new(cygx.EnterScoreGroupListResp) //排名结构体
+		itemranking.GroupName = "排名"
+		itemranking.ProportionListText = rankingText
+		itemsG = append(itemsG, itemranking)
+
+		itemsecuritiesFirmsName := new(cygx.EnterScoreGroupListResp) //券商名称结构体
+		itemsecuritiesFirmsName.GroupName = "券商名称"
+		itemsecuritiesFirmsName.ProportionListText = securitiesFirmsNameText
+		itemsG = append(itemsG, itemsecuritiesFirmsName)
+
+		itemmergeProportionTotal := new(cygx.EnterScoreGroupListResp) //券商名称结构体
+		itemmergeProportionTotal.GroupName = "占比"
+		itemmergeProportionTotal.ProportionListText = mergeProportionTotalText
+		itemsG = append(itemsG, itemmergeProportionTotal)
+
+		resp.ListPermission = itemsP
+		resp.ListGroup = itemsG
+
+	} else {
+
+		listPermission, err := cygx.GetChartPermissionAll()
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取品种信息失败,Err:" + err.Error()
+			return
+		}
+
+		permissionNameArr := []string{"医药", "消费", "科技", "智造", "策略", "固收", "宏观组", "建材组", "有色组", "能化组"}
+		for _, v := range listPermission {
+			if !utils.InArrayByStr(permissionNameArr, v.PermissionName) {
+				continue
+			}
+			item := new(cygx.EnterScorePermissionListResp)
+			item.ChartPermissionName = v.PermissionName
+			item.ProportionListText = make([]string, len(companyList))
+			item.List = make([]*cygx.EnterScoreRealNameListResp, 0)
+			resp.ListPermission = append(resp.ListPermission, item)
+		}
+
+		groupNameArr := []string{"销售分", "专题分", "专家分", "云图大拓", "艾摩宏观", "合计", "排名", "券商名称", "占比"}
+		for _, v := range groupNameArr {
+			item := new(cygx.EnterScoreGroupListResp)
+			item.GroupName = v
+			item.ProportionListText = make([]string, len(companyList))
+			resp.ListGroup = append(resp.ListGroup, item)
+		}
+		//resp.ListPermission = make([]*cygx.EnterScorePermissionListResp, 0)
+		//resp.ListGroup = make([]*cygx.EnterScoreGroupListResp, 0)
+	}
+
+	if len(companyList) == 0 {
+		resp.ListCompany = make([]*company.CompanyNameAndId, 0)
+	} else {
+		resp.ListCompany = companyList
+	}
+	//导出excel
+	if isExport {
+		EnterScoreScoreOverviewExport(this, resp, br)
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// EnterScoreScoreOverviewExport 导出Excel
+func EnterScoreScoreOverviewExport(this *EnterScoreController, resp *cygx.ScoreOverviewListResp, br *models.BaseResponse) {
+	dir, err := os.Executable()
+	exPath := filepath.Dir(dir)
+	downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
+	xlsxFile := xlsx.NewFile()
+	if err != nil {
+		br.Msg = "生成文件失败"
+		br.ErrMsg = "生成文件失败"
+		return
+	}
+	style := xlsx.NewStyle()
+	alignment := xlsx.Alignment{
+		Horizontal: "center",
+		Vertical:   "center",
+		WrapText:   true,
+	}
+
+	style.Alignment = alignment
+	style.ApplyAlignment = true
+
+	sheel, err := xlsxFile.AddSheet("评分总览")
+	if err != nil {
+		br.Msg = "新增Sheet失败"
+		br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
+		return
+	}
+	sheel.SetColWidth(0, 0, 30)
+	sheel.SetColWidth(1, 1, 15)
+	sheel.SetColWidth(2, 2, 15)
+	sheel.SetColWidth(3, 3, 18)
+
+	companyList := resp.ListCompany
+	listPermission := resp.ListPermission
+	listGroup := resp.ListGroup
+	titleRow := sheel.AddRow()
+
+	cellNull := titleRow.AddCell()
+	cellNull.SetStyle(style)
+	cellNull.SetValue("")
+	for _, v := range companyList { //第一行公司
+		cellA := titleRow.AddCell()
+		cellA.SetStyle(style)
+		cellA.SetValue(v.CompanyName)
+	}
+	for _, v := range listPermission { // 行业排序名称
+		dataRow := sheel.AddRow()
+		dataRow.SetHeight(20)
+		cellA := dataRow.AddCell()
+		cellA.SetStyle(style)
+		cellA.SetValue(v.ChartPermissionName)
+
+		for _, vCp := range v.ProportionListText { // 行业对应的占比值
+			cellP := dataRow.AddCell()
+			cellP.SetStyle(style)
+			cellP.SetValue(vCp)
+		}
+
+		for _, vUser := range v.List { // 研究员姓名
+			dataRowName := sheel.AddRow()
+			dataRowName.SetHeight(20)
+			cellName := dataRowName.AddCell()
+			cellName.SetStyle(style)
+			cellName.SetValue(vUser.RealName)
+
+			for _, vUp := range vUser.ProportionListText { //研究员占比值
+				cellP := dataRowName.AddCell()
+				cellP.SetStyle(style)
+				cellP.SetValue(vUp)
+			}
+		}
+	}
+
+	for _, v := range listGroup { // 自定义名称
+		dataRow := sheel.AddRow()
+		dataRow.SetHeight(20)
+		cellA := dataRow.AddCell()
+		cellA.SetStyle(style)
+		cellA.SetValue(v.GroupName)
+
+		for _, vG := range v.ProportionListText { // 自定义名称所对应的值
+			cellP := dataRow.AddCell()
+			cellP.SetStyle(style)
+			cellP.SetValue(vG)
+		}
+	}
+
+	err = xlsxFile.Save(downLoadnFilePath)
+	if err != nil {
+		br.Msg = "保存文件失败"
+		br.ErrMsg = "保存文件失败"
+		return
+	}
+	randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
+	downloadFileName := "评分总览" + randStr + ".xlsx"
+	this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
+	defer func() {
+		os.Remove(downLoadnFilePath)
+	}()
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "导出成功"
+}
+
+// @Title  排名总览
+// @Description 排名总览接口
+// @Param   AdminId   query   string  true       "销售id,多个用英文逗号隔开,空字符串为全部"
+// @Param   City   query   string  true       "城市"
+// @Param   IsExport   query   bool  false       "是否导出excel,默认是false"
+// @Success Ret=200 {object} cygx.CompanyNameAndIdListResp
+// @router /enterScore/rankingOverview [get]
+func (this *EnterScoreController) EnterScoreRankingOverview() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	AdminUser := this.SysUser
+	if AdminUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	resp := new(cygx.RankingOverviewListResp)
+	city := this.GetString("City")
+	adminId := this.GetString("AdminId")
+	//是否导出报表
+	isExport, _ := this.GetBool("IsExport")
+
+	var companyCondition string
+	var companypars []interface{}
+	companyCondition += ` AND b.product_name = ? `
+	companypars = append(companypars, "权益")
+	companyCondition += ` AND b.status = ? `
+	companypars = append(companypars, "永续")
+
+	if adminId != "" {
+		companyCondition += ` AND b.seller_id IN (` + adminId + `) `
+	}
+	if city != "" {
+		//传过来多个城市的时候的筛选
+		citySlice := strings.Split(city, ",")
+		city = strings.Join(citySlice, "','")
+		city = "'" + city + "'"
+		companyCondition += ` AND a.city  IN  (` + city + `) `
+	}
+
+	//权益申请销售只能看到自己名下的客户的申请
+	companyIds, err := cygxService.GetAdminLookUserCompanyIdsBySelf(AdminUser)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,GetAdminLookUserCompanyIdsBySelf Err:" + err.Error()
+		return
+	}
+	lencompanyIds := len(companyIds)
+	if lencompanyIds > 0 {
+		companyCondition += ` AND a.company_id IN (` + utils.GetOrmInReplace(lencompanyIds) + `)`
+		companypars = append(companypars, companyIds)
+	}
+
+	companyList, err := company.GetCompanyIdListByproductName(companyCondition, companypars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	var condition string
+	var pars []interface{}
+
+	total, err := cygx.GetCygxEnterScoreCount(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	dataMd := []string{"10-01", "07-01", "04-01", "01-01"}
+	thisYear := time.Now().Year()
+	startYear := 2018 // 自定义开始时间
+	var quarterDate []string
+	for _, v := range dataMd {
+		dateTimeStr := fmt.Sprint(thisYear, "-", v)
+		dateTime, err := time.Parse("2006-01-02", dateTimeStr)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		if dateTime.After(time.Now()) {
+			continue
+		}
+		quarterDate = append(quarterDate, dateTimeStr)
+	}
+
+	for i := thisYear - 1; i >= startYear; i-- {
+		for _, v := range dataMd {
+			dateTimeStr := fmt.Sprint(i, "-", v)
+			quarterDate = append(quarterDate, dateTimeStr)
+		}
+	}
+
+	var itemsQuarter []*cygx.QuarterDateListResp
+
+	if total > 0 {
+		list, err := cygx.GetCygxEnterScoreList(condition, pars, 0, 9999)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetCygxEnterScoreList Err:" + err.Error()
+			return
+		}
+		mapQuarter := make(map[string]string)
+		for _, v := range list {
+			silicequarter := strings.Split(v.QuarterDate, ",")
+			for _, vQ := range silicequarter {
+				mapQuarter[fmt.Sprint(vQ, "_", v.CompanyId)] = v.Ranking //季度时间、公司ID,排名对应关系绑定
+			}
+		}
+		mapRankingText := make(map[string][]string)
+		for _, vC := range companyList {
+			for _, vQ := range quarterDate {
+				var ranking string
+				ranking = mapQuarter[fmt.Sprint(vQ, "_", vC.CompanyId)]
+				mapRankingText[vQ] = append(mapRankingText[vQ], ranking)
+			}
+		}
+		for _, v := range quarterDate {
+			itemQuarter := new(cygx.QuarterDateListResp)
+			quarter := v
+			//时间后面的月日替换成季度 Q几
+			quarter = strings.Replace(quarter, "-10-01", "Q4", -1)
+			quarter = strings.Replace(quarter, "-07-01", "Q3", -1)
+			quarter = strings.Replace(quarter, "-04-01", "Q2", -1)
+			quarter = strings.Replace(quarter, "-01-01", "Q1", -1)
+			itemQuarter.Quarter = quarter
+			itemQuarter.ProportionListText = mapRankingText[v]
+			itemsQuarter = append(itemsQuarter, itemQuarter)
+		}
+	} else {
+		for _, v := range quarterDate {
+			itemQuarter := new(cygx.QuarterDateListResp)
+			quarter := v
+			//时间后面的月日替换成季度 Q几
+			quarter = strings.Replace(quarter, "-10-01", "Q4", -1)
+			quarter = strings.Replace(quarter, "-07-01", "Q3", -1)
+			quarter = strings.Replace(quarter, "-04-01", "Q2", -1)
+			quarter = strings.Replace(quarter, "-01-01", "Q1", -1)
+			itemQuarter.Quarter = quarter
+			itemQuarter.ProportionListText = make([]string, len(companyList))
+			itemsQuarter = append(itemsQuarter, itemQuarter)
+		}
+	}
+
+	resp.ListCompany = companyList
+	resp.ListQuarterDate = itemsQuarter
+	//导出excel
+	if isExport {
+		RankingOverviewExport(this, resp, br)
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// RankingOverviewExport 导出Excel
+func RankingOverviewExport(this *EnterScoreController, resp *cygx.RankingOverviewListResp, br *models.BaseResponse) {
+	dir, err := os.Executable()
+	exPath := filepath.Dir(dir)
+	downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
+	xlsxFile := xlsx.NewFile()
+	if err != nil {
+		br.Msg = "生成文件失败"
+		br.ErrMsg = "生成文件失败"
+		return
+	}
+	style := xlsx.NewStyle()
+	alignment := xlsx.Alignment{
+		Horizontal: "center",
+		Vertical:   "center",
+		WrapText:   true,
+	}
+
+	style.Alignment = alignment
+	style.ApplyAlignment = true
+
+	sheel, err := xlsxFile.AddSheet("排名总览")
+	if err != nil {
+		br.Msg = "新增Sheet失败"
+		br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
+		return
+	}
+	sheel.SetColWidth(0, 0, 30)
+	sheel.SetColWidth(1, 1, 15)
+	sheel.SetColWidth(2, 2, 15)
+	sheel.SetColWidth(3, 3, 18)
+
+	companyList := resp.ListCompany
+	listQuarterDate := resp.ListQuarterDate
+
+	titleRow := sheel.AddRow()
+
+	cellNull := titleRow.AddCell()
+	cellNull.SetStyle(style)
+	cellNull.SetValue("")
+	for _, v := range companyList { //第一行公司
+		cellA := titleRow.AddCell()
+		cellA.SetStyle(style)
+		cellA.SetValue(v.CompanyName)
+	}
+	for _, v := range listQuarterDate { // 季度排序
+		dataRow := sheel.AddRow()
+		dataRow.SetHeight(20)
+		cellA := dataRow.AddCell()
+		cellA.SetStyle(style)
+		cellA.SetValue(v.Quarter)
+
+		for _, vCp := range v.ProportionListText { // 行业对应的占比值
+			cellP := dataRow.AddCell()
+			cellP.SetStyle(style)
+			cellP.SetValue(vCp)
+		}
+	}
+
+	err = xlsxFile.Save(downLoadnFilePath)
+	if err != nil {
+		br.Msg = "保存文件失败"
+		br.ErrMsg = "保存文件失败"
+		return
+	}
+	randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
+	downloadFileName := "排名总览" + randStr + ".xlsx"
+	this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
+	defer func() {
+		os.Remove(downLoadnFilePath)
+	}()
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "导出成功"
+}

+ 1 - 0
models/company/company_apply.go

@@ -105,6 +105,7 @@ type CompanyContractDetail struct {
 	ContractType      string    `description:"合同类型:枚举值:'新签合同','续约合同','补充协议'"`
 	StartDate         string    `description:"合同开始时间"`
 	EndDate           string    `description:"合同结束时间"`
+	Quarter           string    `description:"季度(X类试用客户使用)"`
 	Money             float64   `description:"合同金额"`
 	PayMethod         string    `description:"支付方式"`
 	PayChannel        string    `description:"支付渠道"`

+ 211 - 0
models/company/company_approval.go

@@ -280,6 +280,110 @@ func TryOutToFormal(companyId, productId, sellerId, companyApprovalId, companyCo
 	return
 }
 
+// TryOutToFormalXClassRai 权益客户试用转正式
+func TryOutToFormalXClassRai(companyId, productId, sellerId, companyApprovalId, companyContractId int, startDate, endDate, sellerName, productName string, raiPackageType int) (newCompanyReportPermissionList []*CompanyReportPermission, err error) {
+	o := orm.NewOrm()
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			tmpErr := to.Rollback()
+			if tmpErr != nil {
+				go alarm_msg.SendAlarmMsg("TryOutToFormalXClassRai 事务回滚失败,Err:"+tmpErr.Error(), 3)
+			}
+		} else {
+			err = to.Commit()
+		}
+	}()
+	//123月份申请转正通过时,将试用期限延长(更新)至4.30。456月份申请转正通过时,将试用期限延长至7.31。789月份申请转正通过时,将试用期限延长至10.31。101112月份申请转正通过时,将试用期限延长至次年1.31。
+	endDate = utils.GetLastDayOfQuarter(time.Now()).Format(utils.FormatDate)
+	// 套餐类型为0时, 不更新套餐类型,权益与FICC开始与结束时间一起修改
+	sql := `UPDATE company_product SET status='永续',try_out_time=NULL,last_description_time=NULL,freeze_time=NULL,renewal_intention=0,is_suspend=0,is_formal=1,approve_status='已审批',end_date=?,rai_package_type=?,modify_time=NOW(),formal_time=NOW(),try_stage=1  WHERE company_id=?  `
+	_, err = to.Raw(sql, endDate, raiPackageType, companyId).Exec()
+	if err != nil {
+		return
+	}
+	sql = `UPDATE company SET type=1,last_updated_time=NOW() WHERE company_id=? `
+	_, err = to.Raw(sql, companyId).Exec()
+	if err != nil {
+		return
+	}
+	sql = `UPDATE company_approval SET approve_status='已审批',approve_time=NOW(),modify_time=NOW() WHERE company_approval_id=? AND company_id=? AND product_id=? `
+	_, err = to.Raw(sql, companyApprovalId, companyId, productId).Exec()
+	if err != nil {
+		return
+	}
+	items := make([]*CompanyReportPermission, 0)
+	sql = `SELECT * FROM company_report_permission WHERE company_id=? AND product_id=? `
+	_, err = to.Raw(sql, companyId, productId).QueryRows(&items)
+	for _, pv := range items {
+		cpLog := new(CompanyPermissionLog)
+		cpLog.CompanyId = companyId
+		cpLog.ChartPermissionId = pv.ChartPermissionId
+		cpLog.CreateTime = time.Now()
+		cpLog.SysUserId = sellerId
+		cpLog.SysUserName = sellerName
+		cpLog.StartDate = pv.StartDate
+		cpLog.EndDate = pv.EndDate
+		cpLog.ProductId = productId
+		cpLog.ProductName = pv.ProductName
+		go AddCompanyPermissionLog(cpLog)
+	}
+
+	sql = `DELETE FROM company_report_permission WHERE company_id=? AND product_id=?`
+	_, err = to.Raw(sql, companyId, productId).Exec()
+	if err != nil {
+		return
+	}
+
+	contractPermission := make([]*CompanyReportPermission, 0)
+	sql = `SELECT * FROM company_contract_permission WHERE company_contract_id=? AND company_id=? `
+	_, err = to.Raw(sql, companyContractId, companyId).QueryRows(&contractPermission)
+	if err != nil {
+		return
+	}
+	for _, pv := range contractPermission {
+		tmpCompanyReportPermission := &CompanyReportPermission{
+			//CompanyReportPermissionId: 0,
+			CompanyId:          companyId,
+			ReportPermissionId: pv.ChartPermissionId,
+			CreatedTime:        time.Now(),
+			LastUpdatedTime:    time.Now(),
+			ChartPermissionId:  pv.ChartPermissionId,
+			StartDate:          pv.StartDate,
+			EndDate:            endDate,
+			ProductId:          productId,
+			ProductName:        productName,
+			CompanyContractId:  companyContractId,
+			Status:             "永续",
+			ModifyTime:         time.Now(),
+			IsUpgrade:          pv.IsUpgrade,
+			ExpensiveYx:        pv.ExpensiveYx,
+		}
+		newId, tmpErr := to.Insert(tmpCompanyReportPermission)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		tmpCompanyReportPermission.CompanyReportPermissionId = newId
+		newCompanyReportPermissionList = append(newCompanyReportPermissionList, tmpCompanyReportPermission)
+	}
+	sql = `UPDATE company_report_permission SET  status='永续', end_date=? WHERE  company_id=?  ` // 更改权限的开始时间结束时间
+	_, err = to.Raw(sql, endDate, companyId).Exec()
+	if err != nil {
+		return
+	}
+
+	sql = `UPDATE company_contract SET status=1 WHERE company_contract_id=? AND company_id=? AND product_id=? `
+	_, err = to.Raw(sql, companyContractId, companyId, productId).Exec()
+	if err != nil {
+		return
+	}
+	return
+}
+
 // FreezeToTryOut 冻结转试用
 func FreezeToTryOut(companyId, productId, sellerId, companyApprovalId, applyUserId int, sellerName, productName string) (newCompanyReportPermissionList []*CompanyReportPermission, startDate, endDate string, err error) {
 	o := orm.NewOrm()
@@ -402,6 +506,113 @@ func FreezeToTryOut(companyId, productId, sellerId, companyApprovalId, applyUser
 	return
 }
 
+// FreezeToTryOutXClassRai  权益冻结转X类试用
+func FreezeToTryOutXClassRai(companyId, productId, sellerId, companyApprovalId, applyUserId int, sellerName, productName string) (newCompanyReportPermissionList []*CompanyReportPermission, startDate, endDate string, err error) {
+	o := orm.NewOrm()
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			tmpErr := to.Rollback()
+			if tmpErr != nil {
+				go alarm_msg.SendAlarmMsg("FreezeToTryOutXClassRai 事务回滚失败,Err:"+tmpErr.Error(), 3)
+			}
+		} else {
+			err = to.Commit()
+		}
+	}()
+	startDate = time.Now().Format(utils.FormatDate)
+	endDate = time.Now().AddDate(0, 3, 0).Format(utils.FormatDate)
+
+	sellerItem, err := system.GetSysAdminById(applyUserId)
+	if err != nil {
+		return
+	}
+
+	//更新用户产品状态
+	sql := `UPDATE company_product SET status='永续',is_suspend=0,approve_status='已审批',freeze_start_date=null,freeze_end_date=null,
+            start_date=?,end_date=?,seller_id=?,seller_name=?,group_id=?,department_id=?,modify_time=NOW(),try_stage=1 WHERE company_id=? AND product_id=? `
+	_, err = to.Raw(sql, startDate, endDate, sellerItem.AdminId, sellerItem.RealName, sellerItem.GroupId, sellerItem.DepartmentId, companyId, productId).Exec()
+	if err != nil {
+		return
+	}
+	//更新用户状态
+	sql = `UPDATE company SET type=5,last_updated_time=NOW() WHERE company_id=? `
+	_, err = to.Raw(sql, companyId).Exec()
+	if err != nil {
+		return
+	}
+	//更新审批单
+	sql = `UPDATE company_approval SET approve_status='已审批',approve_time=NOW(),modify_time=NOW() WHERE company_approval_id=? AND company_id=? AND product_id=? `
+	_, err = to.Raw(sql, companyApprovalId, companyId, productId).Exec()
+	if err != nil {
+		return
+	}
+
+	//查询该用户所有产品权限,并把当前数据做日志(允许添加不修改的数据)
+	items := make([]*CompanyReportPermission, 0)
+	sql = `SELECT * FROM company_report_permission WHERE company_id=? AND product_id=? `
+	_, err = to.Raw(sql, companyId, productId).QueryRows(&items)
+	for _, pv := range items {
+		cpLog := new(CompanyPermissionLog)
+		cpLog.CompanyId = companyId
+		cpLog.ChartPermissionId = pv.ChartPermissionId
+		cpLog.CreateTime = time.Now()
+		cpLog.SysUserId = sellerId
+		cpLog.SysUserName = sellerName
+		cpLog.StartDate = pv.StartDate
+		cpLog.EndDate = pv.EndDate
+		cpLog.ProductId = productId
+		cpLog.ProductName = pv.ProductName
+		go AddCompanyPermissionLog(cpLog)
+	}
+
+	//查询原先是否已经存在权限,如果有权限了,那么需要先删除原有的权限
+	count, _ := GetCompanyReportPermissionCount(companyId, productId)
+	if count > 0 {
+		sql := ` DELETE FROM company_report_permission WHERE company_id=? AND product_id=? `
+		_, err = to.Raw(sql, companyId, productId).Exec()
+		if err != nil {
+			return
+		}
+	}
+	//获取需要试用的权限
+	delayPermissionItems, tmpErr := GetDelayPermissionItems(companyId, companyApprovalId)
+	if tmpErr != nil {
+		err = tmpErr
+		return
+	}
+	status := `永续`
+	for _, v := range delayPermissionItems {
+		tmpCompanyReportPermission := &CompanyReportPermission{
+			//CompanyReportPermissionId: 0,
+			CompanyId:          companyId,
+			ReportPermissionId: v.ChartPermissionId,
+			CreatedTime:        time.Now(),
+			LastUpdatedTime:    time.Now(),
+			ChartPermissionId:  v.ChartPermissionId,
+			StartDate:          v.StartDate,
+			EndDate:            v.EndDate,
+			ProductId:          productId,
+			ProductName:        productName,
+			//CompanyContractId:         companyContractId,
+			Status:     status,
+			ModifyTime: time.Now(),
+			//IsUpgrade:                 pv.IsUpgrade,
+		}
+		newId, tmpErr := to.Insert(tmpCompanyReportPermission)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		tmpCompanyReportPermission.CompanyReportPermissionId = newId
+		newCompanyReportPermissionList = append(newCompanyReportPermissionList, tmpCompanyReportPermission)
+	}
+	return
+}
+
 // TryOutDelay 试用延期
 func TryOutDelay(companyId, productId, sellerId, companyApprovalId int, sellerName, endDate, productName string) (newCompanyReportPermissionList []*CompanyReportPermission, newEndDate string, err error) {
 	o := orm.NewOrm()

+ 9 - 0
models/company/company_product.go

@@ -15,6 +15,7 @@ type CompanyProduct struct {
 	Source              string    `description:"来源"`
 	Reasons             string    `description:"新增理由"`
 	Status              string    `description:"客户状态"`
+	InitStatus          string    `description:"客户初始化状态(目前用来处理权益的永续客户使用)"`
 	IndustryId          int       `description:"行业id"`
 	IndustryName        string    `description:"行业名称"`
 	SellerId            int       `description:"销售id"`
@@ -665,3 +666,11 @@ func GetCompanyProductListByCompanyIds(companyIds []int, productId int) (items [
 	_, err = o.Raw(sql, companyIds, productId).QueryRows(&items)
 	return
 }
+
+// 获取权益用户客户数量
+func GetCompanyProductRaiForeverCount(companyId int) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count  FROM company_product  WHERE 1= 1  AND product_id  = 2  AND   status = '永续' AND company_id  = ?  `
+	o := orm.NewOrm()
+	err = o.Raw(sqlCount, companyId).QueryRow(&count)
+	return
+}

+ 77 - 1
models/cygx/allocation_company_contract.go

@@ -88,7 +88,6 @@ 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)
@@ -163,6 +162,7 @@ type CygxAllocationCompanyContractDetailResp struct {
 	Money              float64 `description:"金额(单位万)"`
 	TotalPointsContent string  `description:"总点数描述"`
 	IsGray             bool    `description:"是否置灰"`
+	IsXClass           bool    `description:"是否是X类试用客户"`
 	List               []*AllocationPermissionListResp
 }
 
@@ -173,6 +173,7 @@ type AllocationPermissionListResp struct {
 	Proportion          float64 `description:"占比"`
 	Money               float64 `description:"金额(单位万)"`
 	MoneyAvg            float64 `description:"行业所占合同的平均金额"`
+	CompanyContractId   int     `description:"合同ID"`
 	List                []*AllocationRealNameListResp
 }
 
@@ -250,3 +251,78 @@ type AllocationRealNameStatisticsListResp struct {
 	GroupProportion      string  `description:"组内占比"`
 	DepartmentProportion string  `description:"部门占比"`
 }
+
+// 行业列表
+func GetCygxAllocationCompanyContractPermissionListByIdInitYx(companyContractId int) (items []*CygxAllocationCompanyContractPermission, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ` SELECT * FROM cygx_allocation_company_contract_permission WHERE company_contract_id = ? AND  chart_permission_name  IN ('研选扣点包','研选订阅','买方研选')  `
+	_, err = o.Raw(sql, companyContractId).QueryRows(&items)
+	return
+}
+
+// 行业列表
+func GetCygxAllocationCompanyContractPermissionListByIdInit(companyContractId int) (items []*CygxAllocationCompanyContractPermission, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ` SELECT * FROM cygx_allocation_company_contract_permission WHERE company_contract_id = ?  `
+	_, err = o.Raw(sql, companyContractId).QueryRows(&items)
+	return
+}
+
+// 更新派点信息
+func AddAndUpdateCygxAllocationCompanyContractInit(items []*CygxAllocationCompanyContract, itemsPermission []*CygxAllocationCompanyContractPermission, companyContractId int) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	//删除原有的研究员派点信息
+	sql := `DELETE FROM cygx_allocation_company_contract WHERE company_contract_id = ? AND  chart_permission_name  IN ('研选扣点包','研选订阅','买方研选') `
+	_, err = to.Raw(sql, companyContractId).Exec()
+	if err != nil {
+		return
+	}
+	//删除原有的行业派点信息
+	sql = `	DELETE FROM cygx_allocation_company_contract_permission WHERE company_contract_id = ? AND  chart_permission_name  IN ('研选扣点包','研选订阅','买方研选') `
+	_, err = to.Raw(sql, companyContractId).Exec()
+	if err != nil {
+		return
+	}
+
+	//批量添加研究员派点信息
+	_, err = to.InsertMulti(len(items), items)
+	if err != nil {
+		return
+	}
+
+	//批量添加行业派点信息
+	_, err = to.InsertMulti(len(itemsPermission), itemsPermission)
+	if err != nil {
+		return
+	}
+
+	return
+}
+
+// 修改
+func Cygx_allocation_company_contractEdit(proportion float64, allocation_company_contract_id int) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `UPDATE cygx_allocation_company_contract SET proportion =?  WHERE allocation_company_contract_id=? `
+	_, err = o.Raw(sql, proportion, allocation_company_contract_id).Exec()
+	return
+}
+
+// 修改
+func Cygx_allocation_company_contract_permissionEdit(proportion, moneyAvg float64, allocation_company_contract_id int) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `UPDATE cygx_allocation_company_contract_permission SET proportion =?,money_avg = ?  WHERE allocation_company_contract_id=? `
+	_, err = o.Raw(sql, proportion, moneyAvg, allocation_company_contract_id).Exec()
+	return
+}

+ 476 - 0
models/cygx/enter_score.go

@@ -0,0 +1,476 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"hongze/hz_crm_api/models/company"
+	"hongze/hz_crm_api/utils"
+	"time"
+)
+
+// CygxEnterScore 结构体代表了 cygx_enter_score 表格
+type CygxEnterScore struct {
+	EnterScoreId        int       `orm:"column(enter_score_id);pk";comment:"主键"`
+	CompanyId           int       `comment:"公司ID"`
+	CompanyName         string    `comment:"客户名称"`
+	StartDate           string    `comment:"开始日期"`
+	EndDate             string    `comment:"结束日期"`
+	Quarter             string    `comment:"季度"`
+	QuarterDate         string    `comment:"季度带有年月日的多个数组转成的字符串"`
+	EnterScoreType      int       `comment:"录入方式 1:按评分录入、2:按比例录入"`
+	Ranking             string    `comment:"排名"`
+	IsMergeScoring      int       `comment:"是否合并打分"`
+	SecuritiesFirmsName string    `comment:"券商名称"`
+	MergeProportion     float64   `comment:"合并占比"`
+	RaiProportionTotal  float64   `comment:"权益研究员占比"`
+	FiccProportionTotal float64   `comment:"FICC研究员占比"`
+	ProportionTotal     float64   `comment:"合计总占比"`
+	SellerId            int       `comment:"所属销售id"`
+	SellerName          string    `comment:"所属销售名称"`
+	AdminId             int       `comment:"操作人ID"`
+	AdminName           string    `comment:"操作人姓名"`
+	CreateTime          time.Time `comment:"创建时间"`
+	ModifyTime          time.Time `comment:"更新时间"`
+}
+
+type CygxEnterScoreDetailResp struct {
+	EnterScoreId        int               `comment:"录分ID"`
+	CompanyId           int               `comment:"公司ID,公司标识符"`
+	CompanyName         string            `comment:"公司名称"`
+	StartDate           string            `comment:"开始日期"`
+	EndDate             string            `comment:"结束日期"`
+	Quarter             []string          `comment:"季度,评分季度"`
+	EnterScoreType      int               `comment:"录入方式 1:按评分录入、2:按比例录入"`
+	Ranking             string            `comment:"排名"`
+	IsMergeScoring      int               `comment:"是否合并打分"`
+	SecuritiesFirmsName string            `comment:"券商名称"`
+	MergeProportion     float64           `comment:"合并占比"`
+	ProportionTotal     float64           `comment:"合计总占比"`
+	RaiProportionTotal  float64           `comment:"权益研究员占比"`
+	FiccProportionTotal float64           `comment:"FICC研究员占比"`
+	EnterScoreObj       EnterScoreDateObj `comment:"按评分录入"`
+	PercentageObj       EnterScoreDateObj `comment:"按比例录入"`
+}
+
+// 行业
+type EnterScoreDateObj struct {
+	ListRai   []*EnterScorePermissionListResp //权益列表
+	ListFicc  []*EnterScorePermissionListResp //FICC列表
+	ListGroup []*EnterScoreGroupListResp      //其他配置信息
+}
+
+// 行业
+type EnterScorePermissionListResp struct {
+	ChartPermissionName string   `description:"行业名称"`
+	Proportion          float64  `description:"占比"`
+	ProportionListText  []string `description:"占比列表"`
+	EnterScoreId        int      `comment:"录分ID"`
+	List                []*EnterScoreRealNameListResp
+}
+
+// 占比描述
+type EnterScoreProportionTextResp struct {
+	ProportionText string
+}
+
+// 研究员
+type EnterScoreRealNameListResp struct {
+	RealName            string   `comment:"研究员姓名"`
+	Proportion          float64  `comment:"占比"`
+	ProportionListText  []string `description:"占比列表"`
+	ChartPermissionName string   `comment:"行业名称"`
+}
+
+// 其他分组
+type EnterScoreGroupListResp struct {
+	GroupName          string   `description:"组名"`
+	Proportion         float64  `description:"占比"`
+	ProportionListText []string `description:"占比列表"`
+}
+
+// 添加或修改录分时的入参结构体
+type UpdateEnterScoreReq struct {
+	EnterScoreId        int                             `comment:"录分ID"`
+	CompanyId           int                             `comment:"公司ID"`
+	CompanyName         string                          `comment:"客户名称"`
+	StartDate           string                          `comment:"开始日期"`
+	EndDate             string                          `comment:"结束日期"`
+	Quarter             []string                        `comment:"季度"`
+	EnterScoreType      int                             `comment:"录入方式 1:按评分录入、2:按比例录入"`
+	Ranking             string                          `comment:"排名"`
+	IsMergeScoring      int                             `comment:"是否合并打分"`
+	SecuritiesFirmsName string                          `comment:"券商名称"`
+	MergeProportion     float64                         `comment:"合并占比"`
+	RaiProportionTotal  float64                         `comment:"权益研究员占比"`
+	FiccProportionTotal float64                         `comment:"FICC研究员占比"`
+	ProportionTotal     float64                         `comment:"合计总占比"`
+	ListRai             []*EnterScorePermissionListResp //权益列表
+	ListFicc            []*EnterScorePermissionListResp //FICC列表
+	ListGroup           []*EnterScoreGroupListResp      //其他配置信息
+}
+
+type EnterScoreIdReq struct {
+	EnterScoreId int `comment:"录分ID"`
+}
+
+// CygxEnterScoreGroup 结构体代表 cygx_enter_score_group 表
+type CygxEnterScoreGroup struct {
+	EnterScoreGroupId int       `orm:"column(enter_score_group_id);pk";comment:"主键"`
+	EnterScoreId      int       `comment:"cygx_enter_score主键"`
+	CompanyId         int       `comment:"公司ID"`
+	GroupName         string    `comment:"名称"`
+	Proportion        float64   `comment:"占比"`
+	AdminId           int       `comment:"操作人ID"`
+	AdminName         string    `comment:"操作人姓名"`
+	CreateTime        time.Time `comment:"创建时间"`
+	ModifyTime        time.Time `comment:"更新时间"`
+}
+
+// CygxEnterScorePermission 结构体代表 cygx_enter_score_permission 表
+type CygxEnterScorePermission struct {
+	EnterScorePermissionId int       `orm:"column(enter_score_permission_id);pk";comment:"主键"`
+	EnterScoreId           int       `comment:"cygx_enter_score主键"`
+	CompanyId              int       `comment:"公司ID"`
+	ChartPermissionName    string    `comment:"名称"`
+	Proportion             float64   `comment:"占比"`
+	ProductId              float64   `comment:"产品id,1:FICC、2:权益"`
+	AdminId                int       `comment:"操作人ID"`
+	AdminName              string    `comment:"操作人姓名"`
+	CreateTime             time.Time `comment:"创建时间"`
+	ModifyTime             time.Time `comment:"更新时间"`
+}
+
+// CygxEnterScoreResearcher 结构体代表 cygx_enter_score_researcher 表
+type CygxEnterScoreResearcher struct {
+	EnterScoreDataId    int       `orm:"column(enter_score_data_id);pk";comment:"主键"`
+	EnterScoreId        int       `comment:"cygx_enter_score主键"`
+	CompanyId           int       `comment:"公司ID"`
+	Proportion          float64   `comment:"占比"`
+	RealName            string    `comment:"研究员姓名"`
+	ChartPermissionName string    `comment:"名称"`
+	ProductId           float64   `comment:"产品id,1:FICC、2:权益"`
+	AdminId             int       `comment:"操作人ID"`
+	AdminName           string    `comment:"操作人姓名"`
+	CreateTime          time.Time `comment:"创建时间"`
+	ModifyTime          time.Time `comment:"更新时间"`
+}
+
+// 更新派点信息
+func AddCygxEnterScore(item *CygxEnterScore, itemsPermission []*CygxEnterScorePermission, itemsResearcher []*CygxEnterScoreResearcher, itemsGroup []*CygxEnterScoreGroup) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	newId, err := to.Insert(item)
+	if err != nil {
+		return
+	}
+	enterScoreId := int(newId)
+
+	for _, v := range itemsPermission {
+		v.EnterScoreId = enterScoreId
+	}
+
+	for _, v := range itemsResearcher {
+		v.EnterScoreId = enterScoreId
+	}
+
+	for _, v := range itemsGroup {
+		v.EnterScoreId = enterScoreId
+	}
+
+	//批量添加行业信息
+	_, err = to.InsertMulti(len(itemsPermission), itemsPermission)
+	if err != nil {
+		return
+	}
+
+	//批量添加研究员信息
+	_, err = to.InsertMulti(len(itemsResearcher), itemsResearcher)
+	if err != nil {
+		return
+	}
+
+	//批量添加自定义分组信息
+	_, err = to.InsertMulti(len(itemsGroup), itemsGroup)
+	if err != nil {
+		return
+	}
+	return
+}
+
+// 更新派点信息
+func UpdateCygxEnterScore(item *CygxEnterScore, itemsPermission []*CygxEnterScorePermission, itemsResearcher []*CygxEnterScoreResearcher, itemsGroup []*CygxEnterScoreGroup) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	_, err = to.Update(item, "CompanyId", "CompanyName", "StartDate", "EndDate", "Quarter", "QuarterDate", "EnterScoreType", "Ranking", "IsMergeScoring", "SecuritiesFirmsName", "MergeProportion", "RaiProportionTotal", "FiccProportionTotal", "ProportionTotal", "SellerId", "SellerName", "AdminId", "AdminName", "ModifyTime")
+	if err != nil {
+		return
+	}
+	enterScoreId := item.EnterScoreId
+
+	//批量删除行业信息
+	sql := `DELETE FROM cygx_enter_score_permission WHERE enter_score_id = ?`
+	_, err = to.Raw(sql, enterScoreId).Exec()
+	if err != nil {
+		return
+	}
+
+	//批量删除研究员信息
+	sql = `	DELETE FROM cygx_enter_score_researcher WHERE enter_score_id = ?`
+	_, err = to.Raw(sql, enterScoreId).Exec()
+	if err != nil {
+		return
+	}
+
+	//批量删除自定义分组信息
+	sql = `	DELETE FROM cygx_enter_score_group WHERE enter_score_id = ?`
+	_, err = to.Raw(sql, enterScoreId).Exec()
+	if err != nil {
+		return
+	}
+
+	for _, v := range itemsPermission {
+		v.EnterScoreId = enterScoreId
+	}
+
+	for _, v := range itemsResearcher {
+		v.EnterScoreId = enterScoreId
+	}
+
+	for _, v := range itemsGroup {
+		v.EnterScoreId = enterScoreId
+	}
+
+	//批量添加行业信息
+	_, err = to.InsertMulti(len(itemsPermission), itemsPermission)
+	if err != nil {
+		return
+	}
+
+	//批量添加研究员信息
+	_, err = to.InsertMulti(len(itemsResearcher), itemsResearcher)
+	if err != nil {
+		return
+	}
+
+	//批量添加自定义分组信息
+	_, err = to.InsertMulti(len(itemsGroup), itemsGroup)
+	if err != nil {
+		return
+	}
+	return
+}
+
+// 通过ID获取详情
+func GetCygxEnterScoreInfoById(id int) (item *CygxEnterScore, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_enter_score  WHERE enter_score_id = ? `
+	err = o.Raw(sql, id).QueryRow(&item)
+	return
+}
+
+// 行业列表
+func GetCygxEnterScorePermissionListById(enterScoreId int) (items []*CygxEnterScorePermission, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_enter_score_permission WHERE enter_score_id = ? `
+	_, err = o.Raw(sql, enterScoreId).QueryRows(&items)
+	return
+}
+
+// 根据多个录分ID获取行业列表
+func GetCygxEnterScorePermissionListByIds(enterScoreIds []int) (items []*CygxEnterScorePermission, err error) {
+	lenArr := len(enterScoreIds)
+	if lenArr == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_enter_score_permission  WHERE  enter_score_id IN  (` + utils.GetOrmInReplace(lenArr) + `) `
+	_, err = o.Raw(sql, enterScoreIds).QueryRows(&items)
+	return
+}
+
+// 研究员列表
+func GeCygxEnterScoreResearcherListById(enterScoreId int) (items []*CygxEnterScoreResearcher, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_enter_score_researcher WHERE enter_score_id = ? `
+	_, err = o.Raw(sql, enterScoreId).QueryRows(&items)
+	return
+}
+
+// 根据多个录分ID获取研究员列表
+func GeCygxEnterScoreResearcherListByIds(enterScoreIds, newcompanyIds []int) (items []*CygxEnterScoreResearcher, err error) {
+	lenArr := len(enterScoreIds)
+	if lenArr == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_enter_score_researcher  WHERE  enter_score_id IN  (` + utils.GetOrmInReplace(lenArr) + `)  AND  proportion > 0  `
+
+	//过滤销售可见的公司与研究员
+	lenCompany := len(newcompanyIds)
+	if lenCompany > 0 {
+		sql += ` AND  company_id IN  (` + utils.GetOrmInReplace(lenCompany) + `) `
+		_, err = o.Raw(sql, enterScoreIds, newcompanyIds).QueryRows(&items)
+	} else {
+		_, err = o.Raw(sql, enterScoreIds).QueryRows(&items)
+	}
+	return
+}
+
+// 自定义分组列表
+func GeCygxEnterScoreGroupListById(enterScoreId int) (items []*CygxEnterScoreGroup, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_enter_score_group WHERE enter_score_id = ? `
+	_, err = o.Raw(sql, enterScoreId).QueryRows(&items)
+	return
+}
+
+// 根据多个录分ID获取自定义分组列表
+func GeCygxEnterScoreGroupListByIds(enterScoreIds []int) (items []*CygxEnterScoreGroup, err error) {
+	lenArr := len(enterScoreIds)
+	if lenArr == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_enter_score_group  WHERE  enter_score_id IN  (` + utils.GetOrmInReplace(lenArr) + `) `
+	_, err = o.Raw(sql, enterScoreIds).QueryRows(&items)
+	return
+}
+
+// 获取列表
+func GetCygxEnterScoreList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxEnterScore, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_enter_score  WHERE 1 = 1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` LIMIT ?,?`
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+// 根据券商名称获取列表
+func GetCygxEnterScoreListBySecuritiesFirmsName(keyWord string) (items []*CygxEnterScore, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT company_id  FROM cygx_enter_score  WHERE 1 = 1  `
+	sql += ` AND securities_firms_name LIKE '%` + keyWord + `%' `
+	sql += ` GROUP  BY company_id `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+// 获取数量
+func GetCygxEnterScoreCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_enter_score  WHERE 1= 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+type EnterScoreListResp struct {
+	EnterScoreId        int      `comment:"录分ID"`
+	CompanyId           int      `comment:"公司ID,公司标识符"`
+	CompanyName         string   `comment:"公司名称"`
+	Quarter             []string `comment:"季度,评分季度"`
+	EnterScoreType      int      `comment:"录入方式 1:按评分录入、2:按比例录入"`
+	Ranking             string   `comment:"排名"`
+	IsMergeScoring      int      `comment:"是否合并打分"`
+	SecuritiesFirmsName string   `comment:"券商名称"`
+	ProportionTotal     float64  `comment:"合计总占比"`
+	SellerId            int      `comment:"所属销售id"`
+	SellerName          string   `comment:"所属销售名称"`
+	CreateTime          string   `comment:"创建时间"`
+	ModifyTime          string   `comment:"更新时间"`
+}
+
+type GetCygxEnterScoreListRep struct {
+	Paging *paging.PagingItem `description:"分页数据"`
+	List   []*EnterScoreListResp
+}
+
+// 删除
+func DeleteEnterScore(enterScoreId int) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	//删除单条录分信息
+	sql := `DELETE FROM cygx_enter_score WHERE enter_score_id = ?`
+	_, err = to.Raw(sql, enterScoreId).Exec()
+	if err != nil {
+		return
+	}
+
+	//批量删除行业信息
+	sql = `DELETE FROM cygx_enter_score_permission WHERE enter_score_id = ?`
+	_, err = to.Raw(sql, enterScoreId).Exec()
+	if err != nil {
+		return
+	}
+
+	//批量删除研究员信息
+	sql = `	DELETE FROM cygx_enter_score_researcher WHERE enter_score_id = ?`
+	_, err = to.Raw(sql, enterScoreId).Exec()
+	if err != nil {
+		return
+	}
+
+	//批量删除自定义分组信息
+	sql = `	DELETE FROM cygx_enter_score_group WHERE enter_score_id = ?`
+	_, err = to.Raw(sql, enterScoreId).Exec()
+	if err != nil {
+		return
+	}
+
+	return
+}
+
+type ScoreOverviewListResp struct {
+	ListCompany    []*company.CompanyNameAndId
+	ListPermission []*EnterScorePermissionListResp
+	ListGroup      []*EnterScoreGroupListResp
+}
+
+type RankingOverviewListResp struct {
+	ListCompany     []*company.CompanyNameAndId
+	ListQuarterDate []*QuarterDateListResp
+}
+
+// 排名总览
+type QuarterDateListResp struct {
+	Quarter            string   `description:"季度"`
+	ProportionListText []string `description:"占比列表"`
+}

+ 4 - 0
models/db.go

@@ -472,6 +472,10 @@ func initCygx() {
 		new(cygx.CygxActivitySpecialPermissionPoints),
 		new(cygx.CygxUserYanxuanPermission),
 		new(cygx.CygxUserYanxuanPermissionLog),
+		new(cygx.CygxEnterScore),
+		new(cygx.CygxEnterScoreGroup),
+		new(cygx.CygxEnterScorePermission),
+		new(cygx.CygxEnterScoreResearcher),
 		new(cygx.CygxOrderRefund),
 		new(cygx.CygxOrder),
 		new(cygx.CygxOrderAction),

+ 8 - 0
models/system/sys_admin.go

@@ -512,6 +512,14 @@ func GetRaiAdmin() (items []*AdminItem, err error) {
 	return
 }
 
+// GetFiccEnterScoreAdmin 获取Ficc需要录分的研究员
+func GetFiccEnterScoreAdmin() (items []*AdminItem, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT   *  FROM admin WHERE group_name  IN('宏观组','建材组','有色组','能化组')`
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
 // SyncRoleData 同步角色数据
 type SyncRoleData struct {
 	Source int `description:"来源: 1-CRM; 2-ETA"`

+ 63 - 0
routers/commentsRouter.go

@@ -1456,6 +1456,69 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:EnterScoreController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:EnterScoreController"],
+        beego.ControllerComments{
+            Method: "CompanySearchList",
+            Router: `/enterScore/company/searchlist`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:EnterScoreController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:EnterScoreController"],
+        beego.ControllerComments{
+            Method: "EnterScoreDelete",
+            Router: `/enterScore/delete`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:EnterScoreController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:EnterScoreController"],
+        beego.ControllerComments{
+            Method: "EnterScoreDetail",
+            Router: `/enterScore/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:EnterScoreController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:EnterScoreController"],
+        beego.ControllerComments{
+            Method: "EnterScoreList",
+            Router: `/enterScore/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:EnterScoreController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:EnterScoreController"],
+        beego.ControllerComments{
+            Method: "EnterScoreRankingOverview",
+            Router: `/enterScore/rankingOverview`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:EnterScoreController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:EnterScoreController"],
+        beego.ControllerComments{
+            Method: "EnterScoreScoreOverview",
+            Router: `/enterScore/scoreOverview`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:EnterScoreController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:EnterScoreController"],
+        beego.ControllerComments{
+            Method: "EnterScoreUpdate",
+            Router: `/enterScore/update`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:IndustrialAnalystController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:IndustrialAnalystController"],
         beego.ControllerComments{
             Method: "IndustrialAnalystAdd",

+ 1 - 0
routers/router.go

@@ -160,6 +160,7 @@ func init() {
 				&cygx.QuestionnaireController{},
 				&cygx.AskserieVideoController{},
 				&cygx.UserAdminShareHistoryController{},
+				&cygx.EnterScoreController{},
 				&cygx.OrderController{},
 			),
 		),

+ 5 - 6
services/company.go

@@ -1146,7 +1146,7 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 
 			//如果是自己客户,那么拥有查看权限
 			if hasSellerId {
-				if sellerId == sysUserId ||utils.InArrayByStr(shareSellerIdArr, strconv.Itoa(sysUserId)) || shareSellerId == sysUserId {
+				if sellerId == sysUserId || utils.InArrayByStr(shareSellerIdArr, strconv.Itoa(sysUserId)) || shareSellerId == sysUserId {
 					button.BtnView = true                             //显示权限、详情
 					if productStatus == utils.COMPANY_STATUS_FORMAL { //正式
 						button.BtnUpdate = true
@@ -1173,9 +1173,8 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 						button.BtnRemarkView = true
 					} else if productStatus == utils.COMPANY_STATUS_LOSE { //流失
 						button.BtnApplyReceive = true
-					} else { //永续
-						//button.BtnDelete = true
-
+					} else if productStatus == utils.COMPANY_STATUS_FOREVER { //永续
+						button.BtnTurnPositive = true
 					}
 				} else {
 					if productStatus == utils.COMPANY_STATUS_LOSE { //流失
@@ -1205,7 +1204,7 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 					button.BtnModifySeller = true
 					button.BtnRemarkView = true
 				} else if productStatus == utils.COMPANY_STATUS_LOSE { //流失
-					if sellerId == sysUserId || groupId == sysUserGroupId ||utils.InArrayByStr(shareSellerIdArr, strconv.Itoa(sysUserId)) || shareSellerId == sysUserId {
+					if sellerId == sysUserId || groupId == sysUserGroupId || utils.InArrayByStr(shareSellerIdArr, strconv.Itoa(sysUserId)) || shareSellerId == sysUserId {
 						button.BtnApplyReceive = true
 					} else {
 						button.BtnReceive = true
@@ -2434,7 +2433,7 @@ func GetShareCompanyPermissionButton(roleTypeCode, statuses string, productId in
 	// 销售
 	sellerArr := []string{
 		utils.ROLE_TYPE_CODE_FICC_GROUP, utils.ROLE_TYPE_CODE_FICC_TEAM, utils.ROLE_TYPE_CODE_FICC_SELLER,
-		utils.ROLE_TYPE_CODE_RAI_GROUP,utils.ROLE_TYPE_CODE_RAI_SELLER,utils.ROLE_TYPE_CODE_RAI_ADMIN,
+		utils.ROLE_TYPE_CODE_RAI_GROUP, utils.ROLE_TYPE_CODE_RAI_SELLER, utils.ROLE_TYPE_CODE_RAI_ADMIN,
 	}
 	if !utils.InArrayByStr(sellerArr, roleTypeCode) {
 		return

+ 57 - 28
services/company_apply/company_approval.go

@@ -421,9 +421,9 @@ func Approved(approvalRecord *contract.ContractApprovalRecord, opUser *system.Ad
 				//客户研选行业转正时(王芳审批通过),模板消息提醒汪洋
 				services.AddCompanyApprovalMessageWangYang(recordInfo.CompanyId, recordInfo.CompanyContractId, recordInfo.ApplyRealName, companyInfo.CompanyName)
 				cygxService.YanXuanCompanyApproval(recordInfo.CompanyId, recordInfo.CompanyContractId) //研选审批通过的时候研选扣点更新
-				cygxService.HandleAllocationCompanyContractByYanXuan(recordInfo.CompanyContractId)     //如果合同只有研选的时候,自动处理派点
-				cygxService.HandleCompanyContractPackageDifference(recordInfo.CompanyContractId)       // 更新与上一份合同的金额的对比 '增加套餐','减少套餐','维持套餐'
-				cygxService.HandleCompanyContractPermissionContractType(recordInfo.CompanyContractId)  // 更新合同权限表中的权限名称,以及对应的行业权限类型(行业新签、行业续约)
+				//cygxService.HandleAllocationCompanyContractByYanXuan(recordInfo.CompanyContractId)     //如果合同只有研选的时候,自动处理派点
+				cygxService.HandleCompanyContractPackageDifference(recordInfo.CompanyContractId)      // 更新与上一份合同的金额的对比 '增加套餐','减少套餐','维持套餐'
+				cygxService.HandleCompanyContractPermissionContractType(recordInfo.CompanyContractId) // 更新合同权限表中的权限名称,以及对应的行业权限类型(行业新签、行业续约)
 			}
 		}()
 	} else {
@@ -630,7 +630,6 @@ func afterApproved(companyApprovalId int, opUserId int, opUserName string) (err
 		err = errors.New("获取信息客户产品失败2")
 		return
 	}
-
 	//recodeInfo.
 	logSellerId := recodeInfo.ApplyUserId
 	logSellerName := recodeInfo.ApplyRealName
@@ -669,40 +668,66 @@ func afterApproved(companyApprovalId int, opUserId int, opUserName string) (err
 		//	br.ErrMsg = "产品中合同结束时间转换失败,Err:" + err.Error()
 		//	return
 		//}
-		//如果合同时间小于等于今天,那么立马执行合同内容
-		if time.Now().After(contractStartDate) {
+		//如果是权益的用户客户转正审批单独走
+		if companyProduct.Status == utils.COMPANY_STATUS_FOREVER && companyProduct.ProductId == 2 {
+			//contractInfo.StartDate = contractStartDate.AddDate(0, 4, 0).Format(utils.FormatDate) // 开始时间与结束时间都加三个月
+			//contractInfo.EndDate = contractEndDate.AddDate(0, 4, 0).Format(utils.FormatDate)
 			startDate = contractInfo.StartDate
 			endDate = contractInfo.EndDate
-			companyReportPermissionList, tmpErr = company.TryOutToFormal(recodeInfo.CompanyId, recodeInfo.ProductId, opUser.AdminId, recodeInfo.CompanyApprovalId, contractInfo.CompanyContractId, contractInfo.StartDate, contractInfo.EndDate, opUser.RealName, companyProduct.ProductName, contractInfo.PackageType, contractInfo.RaiPackageType)
+			companyReportPermissionList, tmpErr = company.TryOutToFormalXClassRai(recodeInfo.CompanyId, recodeInfo.ProductId, opUser.AdminId, recodeInfo.CompanyApprovalId, contractInfo.CompanyContractId, contractInfo.StartDate, contractInfo.EndDate, opUser.RealName, companyProduct.ProductName, contractInfo.RaiPackageType)
 			if tmpErr != nil {
 				err = errors.New("试用转正式失败,Err:" + tmpErr.Error())
 				return
 			}
 		} else {
-			tmpErr = company.ApplyApproveContract(recodeInfo.CompanyId, recodeInfo.ProductId, recodeInfo.CompanyApprovalId, contractInfo.CompanyContractId)
-			if tmpErr != nil {
-				err = errors.New("试用转正式失败,Err:" + tmpErr.Error())
-				return
+			//如果合同时间小于等于今天,那么立马执行合同内容
+			if time.Now().After(contractStartDate) {
+				startDate = contractInfo.StartDate
+				endDate = contractInfo.EndDate
+				companyReportPermissionList, tmpErr = company.TryOutToFormal(recodeInfo.CompanyId, recodeInfo.ProductId, opUser.AdminId, recodeInfo.CompanyApprovalId, contractInfo.CompanyContractId, contractInfo.StartDate, contractInfo.EndDate, opUser.RealName, companyProduct.ProductName, contractInfo.PackageType, contractInfo.RaiPackageType)
+				if tmpErr != nil {
+					err = errors.New("试用转正式失败,Err:" + tmpErr.Error())
+					return
+				}
+			} else {
+				tmpErr = company.ApplyApproveContract(recodeInfo.CompanyId, recodeInfo.ProductId, recodeInfo.CompanyApprovalId, contractInfo.CompanyContractId)
+				if tmpErr != nil {
+					err = errors.New("试用转正式失败,Err:" + tmpErr.Error())
+					return
+				}
+				//不添加日志
+				isAddCompanyProductUpdateLog = false
+			}
+			//如果合同中的结束日期大于产品中的合同结束日期,那么就去修改产品中的合同结束日期
+			if contractEndDate.After(companyProduct.ContractEndDate) {
+				companyProduct.ContractEndDate = contractEndDate
+				cols := make([]string, 0)
+				cols = append(cols, "ContractEndDate")
+				_ = companyProduct.Update(cols)
 			}
-			//不添加日志
-			isAddCompanyProductUpdateLog = false
-		}
-		//如果合同中的结束日期大于产品中的合同结束日期,那么就去修改产品中的合同结束日期
-		if contractEndDate.After(companyProduct.ContractEndDate) {
-			companyProduct.ContractEndDate = contractEndDate
-			cols := make([]string, 0)
-			cols = append(cols, "ContractEndDate")
-			_ = companyProduct.Update(cols)
 		}
 	case 2: //冻结->试用
-		tmpCompanyReportPermissionList, tmpStartDate, tmpEndDate, tmpErr := company.FreezeToTryOut(recodeInfo.CompanyId, recodeInfo.ProductId, opUser.AdminId, recodeInfo.CompanyApprovalId, recodeInfo.ApplyUserId, opUser.RealName, companyProduct.ProductName)
-		if tmpErr != nil {
-			err = errors.New("冻结转试用失败,Err:" + tmpErr.Error())
-			return
+		//权益的 x类试用转冻结的申请解冻
+		if companyProduct.InitStatus == utils.COMPANY_STATUS_FOREVER && companyProduct.ProductId == utils.COMPANY_PRODUCT_RAI_ID {
+			tmpCompanyReportPermissionList, tmpStartDate, tmpEndDate, tmpErr := company.FreezeToTryOutXClassRai(recodeInfo.CompanyId, recodeInfo.ProductId, opUser.AdminId, recodeInfo.CompanyApprovalId, recodeInfo.ApplyUserId, opUser.RealName, companyProduct.ProductName)
+			if tmpErr != nil {
+				err = errors.New("冻结转试用失败,Err:" + tmpErr.Error())
+				return
+			}
+			companyReportPermissionList = tmpCompanyReportPermissionList
+			startDate = tmpStartDate
+			endDate = tmpEndDate
+		} else {
+			tmpCompanyReportPermissionList, tmpStartDate, tmpEndDate, tmpErr := company.FreezeToTryOut(recodeInfo.CompanyId, recodeInfo.ProductId, opUser.AdminId, recodeInfo.CompanyApprovalId, recodeInfo.ApplyUserId, opUser.RealName, companyProduct.ProductName)
+			if tmpErr != nil {
+				err = errors.New("冻结转试用失败,Err:" + tmpErr.Error())
+				return
+			}
+			companyReportPermissionList = tmpCompanyReportPermissionList
+			startDate = tmpStartDate
+			endDate = tmpEndDate
 		}
-		companyReportPermissionList = tmpCompanyReportPermissionList
-		startDate = tmpStartDate
-		endDate = tmpEndDate
+
 	case 3: //试用延期
 		tmpCompanyReportPermissionList, tmpEndDate, tmpErr := company.TryOutDelay(recodeInfo.CompanyId, recodeInfo.ProductId, opUser.AdminId, recodeInfo.CompanyApprovalId, opUser.RealName, companyProduct.EndDate, companyProduct.ProductName)
 		if tmpErr != nil {
@@ -830,7 +855,11 @@ func afterApproved(companyApprovalId int, opUserId int, opUserName string) (err
 		remark := "审批"
 		operation := "approve"
 		approveContent := "审批通过"
-
+		if companyProduct.Status == utils.COMPANY_STATUS_FOREVER && companyProduct.ProductId == 2 { //权益永续客户申请内容做变更
+			//123月份申请转正通过时,将试用期限延长(更新)至4.30。456月份申请转正通过时,将试用期限延长至7.31。789月份申请转正通过时,将试用期限延长至10.31。101112月份申请转正通过时,将试用期限延长至次年1.31。
+			endDateContent := utils.GetLastDayOfQuarter(time.Now()).Format(utils.FormatDate)
+			approveContent += ",试用延期至" + endDateContent
+		}
 		services.AddCompanyOperationRecord(recodeInfo.CompanyId, companyProduct.SellerId, opUserId, recodeInfo.ProductId, opUserId, companyProduct.CompanyName,
 			companyProduct.ProductName, opUserName, remark, operation, approveContent, opUserName, "", companyProduct.Status)
 	}

+ 161 - 0
services/cygx/contract_allocation.go

@@ -640,3 +640,164 @@ func initCrm13_2() {
 
 	fmt.Println(len(items))
 }
+
+func initCRM_15_4() {
+	var conditionAllocation string
+	var parsAllocation []interface{}
+	conditionAllocation = "  AND company_contract_id  IN  (SELECT   company_contract_id  FROM  cygx_allocation_company_contract_permission  WHERE chart_permission_name  LIKE '%研选%')  GROUP BY company_contract_id  "
+	allocationCompanyContractPermissionList, err := cygx.GetCygxAllocationCompanyContractPermissionList(conditionAllocation, parsAllocation)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+	var companyContractIds []int
+	for _, v := range allocationCompanyContractPermissionList {
+		companyContractIds = append(companyContractIds, v.CompanyContractId)
+	}
+	lenCon := len(companyContractIds)
+	for _, v := range companyContractIds {
+		UpdateInitAvg(v)
+	}
+	fmt.Println("lenCon", lenCon)
+	return
+}
+
+//func init() {
+//	UpdateInitAvg(1249)
+//}
+
+// 合并研选订阅与研选扣点包,为买方研选
+func UpdateInit(companyContractId int) {
+	fmt.Println(companyContractId)
+
+	allocationNames := []string{"董衡", "高亦文", "吴昂迪", "冯柯然", "汪洋"}
+	fmt.Println(allocationNames)
+	listPerssion, err := cygx.GetCygxAllocationCompanyContractPermissionListByIdInitYx(companyContractId)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+
+	//listUser, err := cygx.GetCygxAllocationCompanyContractListById(companyContractId)
+	//if err != nil {
+	//	fmt.Println(err)
+	//	return
+	//}
+
+	var totalMoney float64
+	var items []*cygx.CygxAllocationCompanyContract
+	var itemsPermission []*cygx.CygxAllocationCompanyContractPermission
+
+	//var proportionSum float64 // 校验前端传过来的占比使用
+	var AdminId int
+	var AdminName string
+	for _, v := range listPerssion {
+		totalMoney += v.Money
+		AdminId = v.AdminId
+		AdminName = v.AdminName
+	}
+
+	fmt.Println(totalMoney)
+	//return
+
+	itemPermission := new(cygx.CygxAllocationCompanyContractPermission)
+	itemPermission.CompanyContractId = companyContractId
+	itemPermission.AdminId = AdminId
+	itemPermission.AdminName = AdminName
+	//itemPermission.Proportion = v.Money / totalMoney * 100
+	itemPermission.Money = totalMoney
+	itemPermission.ChartPermissionName = utils.CHART_PERMISSION_NAME_MAI_FANG_YANXUAN
+	itemPermission.CreateTime = time.Now()
+	itemPermission.ModifyTime = time.Now()
+	itemsPermission = append(itemsPermission, itemPermission)
+	for _, v := range allocationNames {
+		item := new(cygx.CygxAllocationCompanyContract)
+		item.CompanyContractId = companyContractId
+		item.AdminId = AdminId
+		item.AdminName = AdminName
+		//item.Proportion =
+		item.Money = totalMoney / 5
+		item.RealName = v
+		item.ChartPermissionName = utils.CHART_PERMISSION_NAME_MAI_FANG_YANXUAN
+		item.CreateTime = time.Now()
+		item.ModifyTime = time.Now()
+		items = append(items, item)
+	}
+	fmt.Println(len(items))
+	fmt.Println(len(itemsPermission))
+	//return
+	err = cygx.AddAndUpdateCygxAllocationCompanyContractInit(items, itemsPermission, companyContractId)
+	fmt.Println(err)
+}
+
+func UpdateInitAvg(companyContractId int) {
+	fmt.Println(companyContractId)
+	listPerssion, err := cygx.GetCygxAllocationCompanyContractPermissionListByIdInit(companyContractId)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+
+	listUser, err := cygx.GetCygxAllocationCompanyContractListById(companyContractId)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+
+	var totalMoney float64
+	var items []*cygx.CygxAllocationCompanyContract
+	var itemsPermission []*cygx.CygxAllocationCompanyContractPermission
+
+	//var proportionSum float64 // 校验前端传过来的占比使用
+	for _, v := range listPerssion {
+		totalMoney += v.Money
+	}
+	moneyAvg := totalMoney / float64(len(listPerssion))
+	for _, v := range listPerssion {
+		itemPermission := new(cygx.CygxAllocationCompanyContractPermission)
+		itemPermission.CompanyContractId = companyContractId
+		itemPermission.AdminId = v.AdminId
+		itemPermission.AdminName = v.AdminName
+		itemPermission.Proportion = v.Money / totalMoney * 100
+		itemPermission.Money = v.Money
+		itemPermission.MoneyAvg = moneyAvg
+		itemPermission.ChartPermissionName = v.ChartPermissionName
+		itemPermission.CreateTime = time.Now()
+		itemPermission.ModifyTime = time.Now()
+		itemsPermission = append(itemsPermission, itemPermission)
+		fmt.Println(v.Money, "___", itemPermission.Proportion, "___", v.AllocationCompanyContractId)
+		err = cygx.Cygx_allocation_company_contract_permissionEdit(itemPermission.Proportion, itemPermission.MoneyAvg, v.AllocationCompanyContractId)
+		//fmt.Println("AllocationCompanyContractId", v.AllocationCompanyContractId)
+		if err != nil {
+			fmt.Println(err)
+			return
+		}
+	}
+
+	//return
+	fmt.Println("研究员修改")
+	//var userProportionSum float64 // 校验前端传过来的占比使用
+	for _, v2 := range listUser {
+		item := new(cygx.CygxAllocationCompanyContract)
+		item.CompanyContractId = companyContractId
+		item.AdminId = v2.AdminId
+		item.AdminName = v2.RealName
+		item.Proportion = v2.Money / totalMoney * 100
+		item.Money = v2.Money
+		item.RealName = v2.RealName
+		item.ChartPermissionName = v2.ChartPermissionName
+		item.CreateTime = time.Now()
+		item.ModifyTime = time.Now()
+		items = append(items, item)
+
+		err = cygx.Cygx_allocation_company_contractEdit(item.Proportion, v2.AllocationCompanyContractId)
+		fmt.Println("AllocationCompanyContractId", v2.AllocationCompanyContractId)
+		if err != nil {
+			fmt.Println(err)
+			return
+		}
+	}
+
+	//err = cygx.AddAndUpdateCygxAllocationCompanyContractInit(items, itemsPermission, companyContractId)
+	//fmt.Println(err)
+}

+ 118 - 0
utils/common.go

@@ -2201,3 +2201,121 @@ func GetLikeKeywordPars(pars []interface{}, keyword string, num int) (newPars []
 	}
 	return
 }
+
+// 通过开始时间,结束时间,获取对应季度的第一天数组
+func GetQuarterStartDatesInRange(startTimeStr, endTimeStr string) ([]string, error) {
+	startTime, err := time.Parse("2006-01-02", startTimeStr)
+	if err != nil {
+		return nil, fmt.Errorf("failed to parse start time: %v", err)
+	}
+
+	endTime, err := time.Parse("2006-01-02", endTimeStr)
+	if err != nil {
+		return nil, fmt.Errorf("failed to parse end time: %v", err)
+	}
+
+	adjustedStartTime := startTime.AddDate(0, -int(startTime.Month()-1)%3, -startTime.Day()+1)
+
+	startYear, _, _ := adjustedStartTime.Date()
+	endYear, _, _ := endTime.Date()
+
+	var quarters []string
+	//quarters := []string
+	for year := startYear; year <= endYear; year++ {
+		for quarter := 1; quarter <= 4; quarter++ {
+			firstMonth := (quarter-1)*3 + 1
+			quarterStartDate := time.Date(year, time.Month(firstMonth), 1, 0, 0, 0, 0, time.UTC)
+			if quarterStartDate.After(endTime) || quarterStartDate.AddDate(0, 3, -1).Before(adjustedStartTime) {
+				continue
+			}
+			quarters = append(quarters, quarterStartDate.Format(FormatDate))
+		}
+	}
+	return quarters, nil
+}
+
+// 通过开始时间,结束时间,获取对应季度的拼接字符串
+func GetQuarterStrStartDatesInRange(startTimeStr, endTimeStr string) (quartersStar string, err error) {
+	startTime, err := time.Parse("2006-01-02", startTimeStr)
+	if err != nil {
+		return
+	}
+
+	endTime, err := time.Parse("2006-01-02", endTimeStr)
+	if err != nil {
+		return
+	}
+
+	adjustedStartTime := startTime.AddDate(0, -int(startTime.Month()-1)%3, -startTime.Day()+1)
+
+	startYear, _, _ := adjustedStartTime.Date()
+	endYear, _, _ := endTime.Date()
+
+	var quarters []string
+	//quarters := []string
+	for year := startYear; year <= endYear; year++ {
+		for quarter := 1; quarter <= 4; quarter++ {
+			firstMonth := (quarter-1)*3 + 1
+			quarterStartDate := time.Date(year, time.Month(firstMonth), 1, 0, 0, 0, 0, time.UTC)
+			if quarterStartDate.After(endTime) || quarterStartDate.AddDate(0, 3, -1).Before(adjustedStartTime) {
+				continue
+			}
+			quartersYear := quarterStartDate.Year()
+			yearStr := strconv.Itoa(quartersYear)
+			yearStr = yearStr[len(yearStr)-2:]
+
+			quarters = append(quarters, fmt.Sprint(yearStr, "Q", quarter))
+		}
+	}
+
+	quartersStar = strings.Join(quarters, "+")
+	return quartersStar, nil
+}
+
+// 通过开始时间,结束时间,获取对应季度的拼接字符串 为啥一样的代码要写两遍,因为产品有的地方要求展示 2024Q1有的地方要求展示24Q1
+func GetQuarterStrStartDatesInRangeHaveYear(startTimeStr, endTimeStr string) (quartersStar string, err error) {
+	startTime, err := time.Parse("2006-01-02", startTimeStr)
+	if err != nil {
+		return
+	}
+
+	endTime, err := time.Parse("2006-01-02", endTimeStr)
+	if err != nil {
+		return
+	}
+
+	adjustedStartTime := startTime.AddDate(0, -int(startTime.Month()-1)%3, -startTime.Day()+1)
+
+	startYear, _, _ := adjustedStartTime.Date()
+	endYear, _, _ := endTime.Date()
+
+	var quarters []string
+	for year := startYear; year <= endYear; year++ {
+		for quarter := 1; quarter <= 4; quarter++ {
+			firstMonth := (quarter-1)*3 + 1
+			quarterStartDate := time.Date(year, time.Month(firstMonth), 1, 0, 0, 0, 0, time.UTC)
+			if quarterStartDate.After(endTime) || quarterStartDate.AddDate(0, 3, -1).Before(adjustedStartTime) {
+				continue
+			}
+			quartersYear := quarterStartDate.Year()
+			yearStr := strconv.Itoa(quartersYear)
+			quarters = append(quarters, fmt.Sprint(yearStr, "Q", quarter))
+		}
+	}
+	quartersStar = strings.Join(quarters, ",")
+	return quartersStar, nil
+}
+
+// 获取当前时间所属季度的最后一天,并往后推一个月
+func GetLastDayOfQuarter(t time.Time) time.Time {
+	month := (t.Month()-1)/3*3 + 1 // 计算当前季度的第一个月份
+	nextQuarter := month + 3
+	year := t.Year()
+	if nextQuarter > 12 {
+		nextQuarter -= 12
+		year++
+	}
+	// 构建当前季度的最后一天
+	lastDay := time.Date(year, time.Month(nextQuarter), 1, 0, 0, 0, 0, time.UTC).AddDate(0, 1, 0).Add(-time.Second)
+	return lastDay
+}

+ 1 - 0
utils/constants.go

@@ -378,6 +378,7 @@ const (
 	CHART_PERMISSION_NAME_MF_YANXUAN        string = "研选订阅"
 	LU_YAN_FU_WU                            string = "路演服务"
 	CHART_PERMISSION_NAME_YANXUAN           string = "研选"
+	CHART_PERMISSION_NAME_MAI_FANG_YANXUAN  string = "买方研选"
 	CHART_PERMISSION_ID_YANXUAN             int    = 31      //权限研选订阅id
 	YAN_XUAN_KOU_DIAN_BAO_ID                int    = 52      //研选扣点包ID
 	YAN_XUAN_KOU_DIAN_BAO_NAME              string = "研选扣点包" //研选扣点包名称