Browse Source

Merge branch 'master' into feature/pool381_fms_invice

# Conflicts:
#	models/company/company_product.go
xyxie 1 week ago
parent
commit
0b7f71abdc
73 changed files with 2402 additions and 1032 deletions
  1. 25 47
      controllers/company.go
  2. 40 15
      controllers/company_apply.go
  3. 14 18
      controllers/company_apply_v2.go
  4. 19 6
      controllers/company_permission.go
  5. 22 0
      controllers/company_renewal.go
  6. 10 1
      controllers/company_seller.go
  7. 40 1
      controllers/company_user.go
  8. 8 1
      controllers/cygx/activity.go
  9. 40 0
      controllers/cygx/activity_special.go
  10. 143 282
      controllers/cygx/activity_special_trip.go
  11. 6 2
      controllers/cygx/contract_allocation.go
  12. 111 35
      controllers/cygx/morning_meeting_review.go
  13. 167 9
      controllers/cygx/rai_serve.go
  14. 3 0
      controllers/cygx/report_selection.go
  15. 4 4
      controllers/cygx/search_keyword.go
  16. 30 3
      controllers/cygx/summary_manage.go
  17. 9 0
      controllers/cygx/user_rai_label.go
  18. 53 0
      controllers/roadshow/calendar.go
  19. 45 27
      controllers/roadshow/report.go
  20. 277 100
      controllers/statistic/rai_data_summary.go
  21. 5 1
      controllers/statistic_report.go
  22. 15 16
      controllers/sys_admin.go
  23. 12 0
      controllers/sys_role.go
  24. 33 26
      models/company/company_apply.go
  25. 3 1
      models/company/company_approval.go
  26. 8 0
      models/company/company_contract.go
  27. 23 0
      models/company/company_contract_no_renewed_ascribe.go
  28. 39 2
      models/company/company_history_remark.go
  29. 25 0
      models/company/company_history_remark_log.go
  30. 54 27
      models/company/company_permission.go
  31. 14 0
      models/company/company_product.go
  32. 3 0
      models/company/wx_user_op_log.go
  33. 4 0
      models/cygx/activity.go
  34. 5 5
      models/cygx/activity_special_permission_points.go
  35. 35 55
      models/cygx/activity_special_trip_bill.go
  36. 19 1
      models/cygx/cygx_morning_meeting_reviews.go
  37. 41 0
      models/cygx/morning_meeting_review_log.go
  38. 8 0
      models/cygx/report_selection.go
  39. 13 3
      models/cygx/search_keyword.go
  40. 6 4
      models/cygx/wx_user_rai_label.go
  41. 3 1
      models/db.go
  42. 20 18
      models/fms/invoice_payment_summary.go
  43. 5 0
      models/roadshow/calendar.go
  44. 33 11
      models/roadshow/report_record.go
  45. 2 1
      models/roadshow/rs_calendar_relation.go
  46. 7 5
      models/statistic_report.go
  47. 2 1
      models/statistic_report/rai_data_summary.go
  48. 14 4
      models/system/sys_admin.go
  49. 27 0
      routers/commentsRouter.go
  50. 6 6
      services/company.go
  51. 3 1
      services/company_apply/company_approval.go
  52. 72 0
      services/company_apply/company_history_remark.go
  53. 5 5
      services/company_ascribe.go
  54. 1 1
      services/company_permission.go
  55. 12 1
      services/contract/contract.go
  56. 20 18
      services/cygx/acitvity.go
  57. 110 11
      services/cygx/activity_points_set.go
  58. 1 1
      services/cygx/activity_poster.go
  59. 17 9
      services/cygx/activity_power_check.go
  60. 2 2
      services/cygx/activity_signup.go
  61. 195 190
      services/cygx/activity_special.go
  62. 51 0
      services/cygx/cygx_config.go
  63. 0 2
      services/cygx/mail.go
  64. 118 0
      services/cygx/morning_meeting.go
  65. 59 0
      services/cygx/report_selection.go
  66. 4 4
      services/cygx/resource_data.go
  67. 5 0
      services/cygx/user_rai_label.go
  68. 65 0
      services/roadshow/calendar.go
  69. 40 31
      services/roadshow/report.go
  70. 7 0
      services/user_login.go
  71. 26 0
      utils/common.go
  72. 6 0
      utils/config.go
  73. 33 17
      utils/constants.go

+ 25 - 47
controllers/company.go

@@ -3408,7 +3408,7 @@ func (this *CompanyController) Detail() {
 			}
 
 			// CRM8.8-权益权限列表调用较多、统一进行调整
-			plist, e := services.RaiCompanyPermissionAndCheckList(companyId, isEdit, []string{"调研"})
+			plist, e := services.RaiCompanyPermissionAndCheckList(companyId, isEdit, utils.FilterPermissionNameRai2)
 			if e != nil {
 				br.Msg = "获取客户权益权限列表信息失败"
 				br.ErrMsg = "获取客户权益权限列表信息失败,Err:" + e.Error()
@@ -3422,7 +3422,7 @@ func (this *CompanyController) Detail() {
 				return
 			}
 			//研选服务点数
-			item.Points = cygxService.GetCygxActivityPointsCompanyByCompanyId(companyId)
+			//item.Points = cygxService.GetCygxActivityPointsCompanyByCompanyId(companyId)
 
 			item.PermissionList = append(item.PermissionList, plist)
 			resp.RaiItem = item
@@ -4502,6 +4502,11 @@ func (this *CompanyController) Delete() {
 		br.Ret = 408
 		return
 	}
+	//禁止删除
+	br.Msg = "删除失败"
+	br.ErrMsg = "删除失败"
+	return
+
 	var req company.DeletePptReq
 	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
 	if err != nil {
@@ -7875,15 +7880,18 @@ func (this *CompanyController) PermissionList() {
 			}
 			//合并主观客观
 			mapPermissionName := make(map[string]int)
-			for _, v := range items {
-				if mapPermissionName[v.PermissionName] == 0 {
+			for _, n := range items {
+				if permissionProductId == utils.COMPANY_PRODUCT_RAI_ID && utils.InArrayByStr(utils.FilterPermissionNameRai, n.PermissionName) {
+					continue
+				}
+				if mapPermissionName[n.PermissionName] == 0 {
 					//plist.Items = append(plist.Items, v)
 					//mapPermissionName[v.PermissionName] = v.ChartPermissionId
 
 					// CRM8.8-只有客观的时候回显
-					if mapPermissionCheck[v.PermissionName] == 0 || (mapPermissionCheck[v.PermissionName] > 0 && v.ChartPermissionId == mapPermissionCheck[v.PermissionName]) {
-						plist.Items = append(plist.Items, v)
-						mapPermissionName[v.PermissionName] = v.ChartPermissionId
+					if mapPermissionCheck[n.PermissionName] == 0 || (mapPermissionCheck[n.PermissionName] > 0 && n.ChartPermissionId == mapPermissionCheck[n.PermissionName]) {
+						plist.Items = append(plist.Items, n)
+						mapPermissionName[n.PermissionName] = n.ChartPermissionId
 					}
 				}
 			}
@@ -9664,50 +9672,20 @@ func (this *CompanyTodoController) CompanyActivitySpecialPointsBill() {
 			ChartPermissionId:   v.ChartPermissionId,
 			ChartPermissionName: v.ChartPermissionName,
 			Total:               v.Total,
+			Content:             v.Content,
 		}
-		if v.ActivityId == 0 {
-			item.Content = v.Content
-		} else {
-			if v.DoType == 1 && v.Way != 4 && v.Way != 3 {
-				item.Content = item.ActivityName + "--报名"
-			} else if v.DoType == 2 && v.Way != 4 && v.Way != 3 {
-				item.Content = item.ActivityName + "--取消报名"
-			} else if v.Way == 4 {
-				item.Content = item.ActivityName + "--活动取消"
-			}
-		}
-		//if userType == 2 {
-		//	if i== 0 {
-		//		item.Total += strconv.Itoa(tripRemaining) + "次"
-		//	} else {
-		//		item.Total += strconv.Itoa(tripRemaining-list[i-1].BillDetailed) + "次"
-		//	}
-		//	//if v.BillDetailed < 4 {
-		//	//	item.Total += strconv.Itoa(lastTripRemaining-list[i-1].BillDetailed) + "次"
-		//	//} else {
-		//	//	item.Total += strconv.Itoa(lastTripRemaining) + "次"
-		//	//}
+		//if v.ActivityId == 0 {
+		//	item.Content = v.Content
 		//} else {
-		//	for k, num := range mapChartName {
-		//		if i== 0 {
-		//			item.Total += k + strconv.Itoa(num) + "次+"
-		//		} else {
-		//			if list[i-1].ActivityId == 0 {
-		//				item.Total += k + strconv.Itoa(num) + "次+"
-		//			} else {
-		//				item.Total += k + strconv.Itoa(num-list[i-1].BillDetailed) + "次+"
-		//			}
-		//		}
-		//		//if num > 0 {
-		//		//	if i== 0{
-		//		//		item.Total += k + strconv.Itoa(num) + "次+"
-		//		//	} else {
-		//		//		item.Total += k + strconv.Itoa(num-v.BillDetailed) + "次+"
-		//		//	}
-		//		//}
+		//	if v.DoType == 1 && v.Way != 4 && v.Way != 3 {
+		//		item.Content = item.ActivityName + "--报名"
+		//	} else if v.DoType == 2 && v.Way != 4 && v.Way != 3 {
+		//		item.Content = item.ActivityName + "--取消报名"
+		//	} else if v.Way == 4 {
+		//		item.Content = item.ActivityName + "--活动取消"
 		//	}
-		//	item.Total = strings.TrimRight(item.Total, "+")
 		//}
+
 		resp.List = append(resp.List, &item)
 	}
 

+ 40 - 15
controllers/company_apply.go

@@ -468,9 +468,9 @@ func (this *CompanyApplyController) ApplyContractDetail() {
 		//expMap := map[bool]string{false: "(3w)", true: "(5w)"} // 买方研选价格
 		//var expensiveYx int
 		// 未选大套餐, 走老逻辑
-		var points float64
+		//var points float64
+		mapPoints := make(map[int]float64) // 通过合同获取所勾选的升级行业权限
 		if detail.RaiPackageType == 0 {
-
 			totalForever, err := company.GetCompanyProductRaiForeverCount(companyId) //判断是否是权益的永续客户
 			if err != nil {
 				br.Msg = "获取失败"
@@ -496,15 +496,14 @@ func (this *CompanyApplyController) ApplyContractDetail() {
 					mapExpensive[v.ChartPermissionId] = true
 					//expensiveYx = v.ExpensiveYx
 				}
+				mapPoints[v.ChartPermissionId] = v.Points
+				//points = v.Points
 
-				if v.ChartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID {
-					points = v.Points
-				}
 				permissions = append(permissions, v.ChartPermissionId)
 			}
 			for _, n := range items {
-				if n.ChartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID {
-					n.PermissionName += fmt.Sprint("(", points, "点)")
+				if mapPoints[n.ChartPermissionId] > 0 {
+					n.PermissionName += fmt.Sprint("(", mapPoints[n.ChartPermissionId], "点)")
 				}
 				if utils.InArrayByInt(permissions, n.ChartPermissionId) {
 					checkList = append(checkList, n.ChartPermissionId)
@@ -553,6 +552,16 @@ func (this *CompanyApplyController) ApplyContractDetail() {
 
 		// 如果选择的是大套餐, 那么不再展示每个具体的权限, 除大套餐外还需遍历一下专家和研选3w/5w是否有选(这两个与大套餐不互斥, 可额外选择)
 		if detail.RaiPackageType > 0 {
+			itemsMenu, err := company.GetPermissionSetMenuItemsByType(utils.COMPANY_PRODUCT_RAI_ID)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
+				return
+			}
+			setMenuChartPermissionIdMap := make(map[int]bool) //权益大套餐所对应的行业
+			for _, m := range itemsMenu {
+				setMenuChartPermissionIdMap[m.ChartPermissionId] = true
+			}
 			// 大套餐
 			bigPackage := new(company.PermissionLookItem)
 			if detail.RaiPackageType == 1 {
@@ -571,14 +580,13 @@ func (this *CompanyApplyController) ApplyContractDetail() {
 				if v.ExpensiveYx == 1 {
 					mapExpensive[v.ChartPermissionId] = true
 				}
-				if v.ChartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID {
-					points = v.Points
-				}
+				mapPoints[v.ChartPermissionId] = v.Points
 				permissions = append(permissions, v.ChartPermissionId)
 			}
 			// 专家、研选订阅、研选扣点包
 			for _, n := range items {
-				if n.ChartPermissionId != utils.ZHUAN_JIA_ID && n.ChartPermissionId != utils.CHART_PERMISSION_ID_YANXUAN && n.ChartPermissionId != utils.YAN_XUAN_KOU_DIAN_BAO_ID {
+				//if n.ChartPermissionId != utils.ZHUAN_JIA_ID && n.ChartPermissionId != utils.CHART_PERMISSION_ID_YANXUAN && n.ChartPermissionId != utils.YAN_XUAN_KOU_DIAN_BAO_ID {
+				if setMenuChartPermissionIdMap[n.ChartPermissionId] {
 					continue
 				}
 				//if n.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
@@ -590,8 +598,8 @@ func (this *CompanyApplyController) ApplyContractDetail() {
 				//	}
 				//}
 
-				if n.ChartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID {
-					n.PermissionName += fmt.Sprint("(", points, "点)")
+				if mapPoints[n.ChartPermissionId] > 0 {
+					n.PermissionName += fmt.Sprint("(", mapPoints[n.ChartPermissionId], "点)")
 				}
 				if utils.InArrayByInt(permissions, n.ChartPermissionId) {
 					checkList = append(checkList, n.ChartPermissionId)
@@ -2015,7 +2023,7 @@ func (this *CompanyApplyController) ApplyContract() {
 		//pListType := new(company.PermissionSetListType)
 		//p.ClassifyName = name
 		//pListType.ClassifyName = v
-		items, err := company.GetPermissionLookItems(productId, name)
+		items, err := company.GetPermissionLookItems2(productId, name)
 		if err != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
@@ -2040,8 +2048,20 @@ func (this *CompanyApplyController) ApplyContract() {
 			//}
 
 		} else {
+			itemsMenu, err := company.GetPermissionSetMenuItemsByType(utils.COMPANY_PRODUCT_RAI_ID)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
+				return
+			}
+			var setMenuChartPermissionId []int //权益大套餐所对应的行业
+			for _, v := range itemsMenu {
+				setMenuChartPermissionId = append(setMenuChartPermissionId, v.ChartPermissionId)
+			}
 			bigPackage70.PermissionName = utils.CHART_PERMISSION_NAME_70W
+			bigPackage70.SetMenuChartPermissionId = setMenuChartPermissionId
 			bigPackage45.PermissionName = utils.CHART_PERMISSION_NAME_45W
+			bigPackage45.SetMenuChartPermissionId = setMenuChartPermissionId
 			plist.Items = append(plist.Items, bigPackage45, bigPackage70)
 		}
 
@@ -2077,6 +2097,7 @@ func (this *CompanyApplyController) ApplyContract() {
 		//升级
 		mapUpgrade := make(map[int]int)
 		mapExpensive := make(map[int]bool)
+		mapPoints := make(map[int]float64)
 		var expensiveYx int
 		permissionList, err := company.GetCompanyContractPermissionByCompanyContractId(contractItem.CompanyContractId)
 		if err != nil && err.Error() != utils.ErrNoRow() {
@@ -2093,6 +2114,7 @@ func (this *CompanyApplyController) ApplyContract() {
 				mapExpensive[v.ChartPermissionId] = true
 				expensiveYx = v.ExpensiveYx
 			}
+			mapPoints[v.ChartPermissionId] = v.Points
 			permissionIds = append(permissionIds, v.ChartPermissionId)
 		}
 		//mapChartPermissionId := make(map[int]int)
@@ -2111,6 +2133,7 @@ func (this *CompanyApplyController) ApplyContract() {
 			if n.PermissionType == 2 && totalForever > 0 {
 				continue
 			}
+			n.Points = mapPoints[n.ChartPermissionId]
 			if utils.InArrayByInt(permissionIds, n.ChartPermissionId) {
 				n.Checked = true
 				if _, ok := mapUpgrade[n.ChartPermissionId]; ok {
@@ -2167,7 +2190,6 @@ func (this *CompanyApplyController) ApplyContract() {
 					})
 				}
 			}
-
 			plist.Items = append(plist.Items, n)
 
 			if totalForever == 0 && !mapPermissionNameUpgrade[n.PermissionName] {
@@ -2199,6 +2221,9 @@ func (this *CompanyApplyController) ApplyContract() {
 				itemsIdExist[v.ChartPermissionId] = true
 			}
 		}
+		for _, v := range permissionList {
+			checkList = append(checkList, v.ChartPermissionId)
+		}
 		checkList = utils.IntersectInt(checkList, itemsIds)
 
 		//finalCheckList := make([]int, 0)

+ 14 - 18
controllers/company_apply_v2.go

@@ -123,6 +123,7 @@ func (this *CompanyApplyController) ApplyServiceUpdate() {
 
 	mapPermissionIdUpgrade := make(map[int]int, 0)
 	mapPermissionIdExpensive := make(map[int]int, 0)
+	mapPoints := make(map[int]float64)
 	var raicontractType string
 	if productId == 2 {
 		// CRM13.3改-是否为权益内部人员, 非权益内部人员只能勾选行业不能勾选单独的主客观, 勾选行业(即勾选主观的ID需要加入客观的权限ID)
@@ -132,7 +133,9 @@ func (this *CompanyApplyController) ApplyServiceUpdate() {
 			br.ErrMsg = "判断是否为权益内部人员失败, GetRaiAdmin Err: " + e.Error()
 			return
 		}
-
+		for _, v := range req.PointsArr {
+			mapPoints[v.ChartPermissionId] = v.Points
+		}
 		var permissionIdsNew string
 		permissionIdsNew, mapPermissionIdUpgrade, mapPermissionIdExpensive, err = services.CheckCompanyUpgradeV2(req.PermissionIds, isRai)
 		if err != nil {
@@ -144,7 +147,7 @@ func (this *CompanyApplyController) ApplyServiceUpdate() {
 
 		//权益的新签合同重新定义,如果合同起始时间在新签合同起始日期 1年之内的,仍为新签合同。
 		raicontractType = req.ContractType
-		if raicontractType != "新签合同" && companyProduct.Status != utils.COMPANY_STATUS_FOREVER {
+		if raicontractType != "新签合同" {
 			//startDateTime, _ := time.Parse(utils.FormatDate, req.StartDate)
 			//startDateTime = startDateTime.AddDate(-1, 0, 0)
 			totalLastYear, err := contractService.GetCompanyContractCountRaiByLastYear(req.CompanyId, req.StartDate)
@@ -333,13 +336,10 @@ func (this *CompanyApplyController) ApplyServiceUpdate() {
 				continue
 			}
 			permissionMap[chartPermissionId] = chartPermissionId
-
 			item.ChartPermissionId = chartPermissionId
 			item.PermissionName = permissionNameMap[chartPermissionId]
 			//如果是研选扣点包的权限,写入扣点点数
-			if chartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID {
-				item.Points = req.Points
-			}
+			item.Points = mapPoints[chartPermissionId]
 			item.StartDate = req.StartDate
 			item.EndDate = req.EndDate
 			item.IsUpgrade = mapPermissionIdUpgrade[chartPermissionId]
@@ -398,7 +398,7 @@ func (this *CompanyApplyController) ApplyServiceUpdate() {
 			br.ErrMsg = "获取审批记录失败,Err:" + err.Error()
 			return
 		}
-		err = company.ModifyCompanyApplyServiceUpdate(&req, productId, recode.CompanyContractId, companyProduct.IsFormal, mapPermissionIdUpgrade, mapPermissionIdExpensive)
+		err = company.ModifyCompanyApplyServiceUpdate(&req, productId, recode.CompanyContractId, companyProduct.IsFormal, mapPermissionIdUpgrade, mapPermissionIdExpensive, mapPoints)
 		if err != nil {
 			br.Msg = "申请失败"
 			br.ErrMsg = "申请失败,Err:" + err.Error()
@@ -522,7 +522,11 @@ func (this *CompanyApplyController) ApplyTurnPositive() {
 	permissionNameMap := make(map[int]string)   // 权益行业名称处理
 	permissionNames := req.PermissionNames
 	expensiveYx := 0
+	mapPoints := make(map[int]float64)
 	if productId == 2 {
+		for _, v := range req.PointsArr {
+			mapPoints[v.ChartPermissionId] = v.Points
+		}
 		// 给升级的产业ID加一个极大值判断处理
 		permissionSlice := strings.Split(req.PermissionIds, ",")
 		mapPermissionId := make(map[int]int)
@@ -677,7 +681,7 @@ func (this *CompanyApplyController) ApplyTurnPositive() {
 		if productId == 2 {
 			//权益的新签合同重新定义,如果合同起始时间在新签合同起始日期 1年之内的,仍为新签合同。
 			raicontractType = contractType
-			if raicontractType != "新签合同" && companyProduct.Status != utils.COMPANY_STATUS_FOREVER {
+			if raicontractType != "新签合同" {
 				//startDateTime, _ := time.Parse(utils.FormatDate, req.StartDate)
 				//startDateTime = startDateTime.AddDate(-1, 0, 0)
 				totalLastYear, err := contractService.GetCompanyContractCountRaiByLastYear(req.CompanyId, req.StartDate)
@@ -886,15 +890,7 @@ func (this *CompanyApplyController) ApplyTurnPositive() {
 			if chartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
 				item.ExpensiveYx = expensiveYx
 			}
-			//如果是研选扣点包,这个行业权限的ID;那么就对点数进行赋值。目前就研选扣点包 这一个行业有点数,先不用数组类型处理。v:查研观向13.2
-			if chartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID {
-				if req.Points <= 0 {
-					br.Msg = "点数不能为空"
-					return
-				}
-				item.Points = req.Points
-			}
-
+			item.Points = mapPoints[chartPermissionId]
 			item.PermissionName = permissionNameMap[chartPermissionId]
 
 			item.StartDate = req.StartDate
@@ -1298,7 +1294,7 @@ func (this *CompanyApplyController) ApplyBySystemContract() {
 	if productId == 2 {
 		//权益的新签合同重新定义,如果合同起始时间在新签合同起始日期 1年之内的,仍为新签合同。
 		raicontractType = contractType
-		if raicontractType != "新签合同" && companyProduct.Status != utils.COMPANY_STATUS_FOREVER {
+		if raicontractType != "新签合同" {
 			//startDateTime := contractDetail.StartDate.AddDate(-1, 0, 0)
 			totalLastYear, err := contractService.GetCompanyContractCountRaiByLastYear(req.CompanyId, contractDetail.StartDate.Format(utils.FormatDate))
 			if err != nil {

+ 19 - 6
controllers/company_permission.go

@@ -100,13 +100,23 @@ func (this *CompanyPermissionController) List() {
 	// 权益
 	if productId == utils.COMPANY_PRODUCT_RAI_ID || companyType == utils.COMPANY_PRODUCT_RAI_NAME {
 		p := new(company.PermissionSetList)
+		itemsMenu, err := company.GetPermissionSetMenuItemsByType(utils.COMPANY_PRODUCT_RAI_ID)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
+			return
+		}
+		var setMenuChartPermissionId []int //权益大套餐所对应的行业
+		for _, v := range itemsMenu {
+			setMenuChartPermissionId = append(setMenuChartPermissionId, v.ChartPermissionId)
+		}
 		items, err := company.GetPermissionSetItemsByType(utils.COMPANY_PRODUCT_RAI_ID, utils.COMPANY_PRODUCT_RAI_NAME)
 		if err != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
 			return
 		}
-		filterPermissionName := []string{"专家", "路演服务", "调研"} // 需要过滤不展示的行业
+		filterPermissionName := utils.FilterPermissionNameRai // 需要过滤不展示的行业
 		if isShowYanXuanKouDian {
 			filterPermissionName = []string{"专家"} //申请转正,或者申请续约的时候 调研 行业需要进行展示
 		}
@@ -137,9 +147,11 @@ func (this *CompanyPermissionController) List() {
 				}
 			} else {
 				p.Items = append(p.Items, &company.PermissionSetItem{
-					PermissionName: utils.CHART_PERMISSION_NAME_45W,
+					PermissionName:           utils.CHART_PERMISSION_NAME_45W,
+					SetMenuChartPermissionId: setMenuChartPermissionId,
 				}, &company.PermissionSetItem{
-					PermissionName: utils.CHART_PERMISSION_NAME_70W,
+					PermissionName:           utils.CHART_PERMISSION_NAME_70W,
+					SetMenuChartPermissionId: setMenuChartPermissionId,
 				})
 
 				// 是否为内部人员
@@ -282,7 +294,7 @@ func (this *CompanyPermissionController) ListByContract() {
 		for _, v := range allFiccPermissions {
 			if v.ParentId == 0 {
 				//合同这边市场策略不需要体现出来,所以调整返回
-				if v.PermissionName == "市场策略" {
+				if v.PermissionName == "市场策略" || v.PermissionName == "固定收益" {
 					continue
 				}
 				p := new(company.PermissionSetList)
@@ -470,9 +482,10 @@ func (this *CompanyPermissionController) PermissionLook() {
 
 	var filterPermissionName []string
 	if lookType == 1 {
-		filterPermissionName = []string{"专家", "路演服务", "研选扣点包", "调研"}
+		//filterPermissionName = []string{"专家", "路演服务", "研选扣点包", "调研"}
+		filterPermissionName = utils.FilterPermissionNameRai
 	} else {
-		filterPermissionName = []string{"调研"}
+		filterPermissionName = []string{"海外调研"}
 	}
 	//权益权限类目
 	for _, v := range permissionArr {

+ 22 - 0
controllers/company_renewal.go

@@ -478,6 +478,28 @@ func (this *CompanyRenewalController) CompanyContractNoRenewedAscribeAdd() {
 		br.ErrMsg = "新建失败,Err:" + err.Error()
 		return
 	}
+	//新增操作记录
+	if productId == utils.COMPANY_PRODUCT_RAI_ID {
+		cp, err := company.GetCompanyProductByCompanyIdAndProductId(companyId, productId)
+		if err != nil {
+			br.Msg = "获取客户信息失败"
+			br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
+			return
+		}
+		if cp.IsShare == 1 {
+			err = company.UpdateCompanyProductCancelisShare(companyId, productId)
+			if err != nil {
+				br.Msg = "取消共享失败"
+				br.ErrMsg = "取消共享失败,Err:" + err.Error()
+				return
+			}
+			remark := "确认不续约,自动取消共享"
+			operation := "no_renewed"
+			services.AddCompanyOperationRecord(companyId, cp.SellerId, sysUser.AdminId, productId, sysUser.AdminId, cp.CompanyName,
+				"权益", sysUser.RealName, remark, operation, "", sysUser.RealName, "", cp.Status)
+		}
+
+	}
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "新建成功"

+ 10 - 1
controllers/company_seller.go

@@ -7509,7 +7509,16 @@ func (this *CompanySellerController) CheckListRaiServerType() {
 	list := make([]company.DepartmentGroupSellers, 0)
 	listServer := make([]company.DepartmentGroupSellers, 0)
 
-	condition := " AND role_type_code IN ('rai_seller','rai_group') AND enabled = 1 AND  rai_enabled = 1 "
+	// 获取图片识别手机号的配置
+	crmConfig, err := company.GetConfigDetailByCode("rai_data_summary_seller")
+	if err != nil {
+		br.Msg = "获取配置失败"
+		br.ErrMsg = "获取配置失败"
+		br.IsSendEmail = false
+		return
+	}
+
+	condition := " AND role_type_code IN ('rai_seller','rai_group') AND enabled = 1 AND  rai_enabled = 1 OR   admin_id  IN( " + crmConfig.ConfigValue + ") "
 	var pars []interface{}
 	//名字带6 的属于服务组
 	//if serverType == "开拓" {

+ 40 - 1
controllers/company_user.go

@@ -1508,6 +1508,13 @@ func (this *CompanyUserController) DeleteUser() {
 		br.Ret = 408
 		return
 	}
+	if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN {
+		//非admin 禁止删除
+		br.Msg = "删除失败"
+		br.ErrMsg = "删除失败"
+		return
+	}
+
 	var req company.DeleteUserReq
 	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
 	if err != nil {
@@ -1528,6 +1535,13 @@ func (this *CompanyUserController) DeleteUser() {
 		br.ErrMsg = "获取联系人异常,Err:" + err.Error()
 		return
 	}
+	//获取企业客户信息
+	oldCompanyInfo, err := company.GetCompanyById(userInfo.CompanyId) //原来的客户信息
+	if err != nil {
+		br.Msg = "移动失败"
+		br.ErrMsg = "获取原来的客户信息失败"
+		return
+	}
 	//产品权限
 	productId := services.GetProductId(sysUser.RoleTypeCode)
 
@@ -1596,6 +1610,7 @@ func (this *CompanyUserController) DeleteUser() {
 		LogType:                "delete",
 		UserId:                 int(userInfo.UserId),
 		CompanyId:              userInfo.CompanyId,
+		CompanyName:            oldCompanyInfo.CompanyName,
 		Mobile:                 userInfo.Mobile,
 		Email:                  userInfo.Email,
 		OriginalUserInfo:       string(originalUserInfo),
@@ -2483,6 +2498,7 @@ func (this *CompanyController) PotentialUserDelete() {
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
+
 	var req models.PotentialUserDeleteReq
 	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
 	if err != nil {
@@ -2490,7 +2506,6 @@ func (this *CompanyController) PotentialUserDelete() {
 		br.ErrMsg = "参数解析失败,Err:" + err.Error()
 		return
 	}
-
 	sysUser := this.SysUser
 	if sysUser == nil {
 		br.Msg = "请登录"
@@ -2498,6 +2513,12 @@ func (this *CompanyController) PotentialUserDelete() {
 		br.Ret = 408
 		return
 	}
+	if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN {
+		//非admin 禁止删除
+		br.Msg = "删除失败"
+		br.ErrMsg = "删除失败"
+		return
+	}
 
 	//删除用户
 	err = services.DeleteWxUser(req.UserId)
@@ -2745,6 +2766,7 @@ func (this *CompanyController) PotentialUserMove() {
 		OpUserName:             sysUser.RealName,
 		CreateTime:             time.Now(),
 	})
+	wxUser.CompanyId = oldWxUser.CompanyId
 	go services.AddWxUserMoveLog(wxUser, sysUser, req.CompanyId) // 添加用户移动日志记录
 	br.Ret = 200
 	br.Success = true
@@ -2805,6 +2827,19 @@ func (this *CompanyController) UserMove() {
 		br.ErrMsg = "该联系人属于该客户"
 		return
 	}
+	//获取企业客户信息
+	oldCompanyInfo, err := company.GetCompanyById(oldWxUser.CompanyId) //原来的客户信息
+	if err != nil {
+		br.Msg = "移动失败"
+		br.ErrMsg = "获取原来的客户信息失败"
+		return
+	}
+	currentCompanyInfo, err := company.GetCompanyById(req.CompanyId) // 现在的客户信息
+	if err != nil {
+		br.Msg = "移动失败"
+		br.ErrMsg = "获取现在的客户信息失败"
+		return
+	}
 	//产品id
 	productId := services.GetProductId(sysUser.RoleTypeCode)
 	//操作权限校验
@@ -2843,10 +2878,14 @@ func (this *CompanyController) UserMove() {
 			userInfo, _ = json.Marshal(newWxUser)
 		}
 	}
+
 	go services.AddWxUserOpLog(company.WxUserOpLog{
 		LogType:                "move",
 		UserId:                 int(wxUser.UserId),
 		CompanyId:              wxUser.CompanyId,
+		CompanyName:            oldCompanyInfo.CompanyName,
+		CurrentCompanyId:       currentCompanyInfo.CompanyId,
+		CurrentCompanyName:     currentCompanyInfo.CompanyName,
 		Mobile:                 wxUser.Mobile,
 		Email:                  wxUser.Email,
 		OriginalUserInfo:       string(originalUserInfo),

+ 8 - 1
controllers/cygx/activity.go

@@ -618,6 +618,13 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 				}
 			}
 
+			userPointsNum, _ := strconv.Atoi(itemPointsSet.UserPointsNum)
+			if userPointsNum > 0 {
+				//扣点的研选活动,价格按照4000块一个点进行扣除
+				item.ActivityPrice = 4000 * float64(userPointsNum)
+				item.ActivityOriginalPrice = 4000 * float64(userPointsNum)
+			}
+
 			items = append(items, item)
 
 			var errAct error
@@ -1070,7 +1077,7 @@ func (this *ActivityCoAntroller) ActivityList() {
 		}
 		list[k].IsUpload = mapUpload[v.ActivityId]
 		//是否展示签到码
-		if (v.ActivityTypeId == 5 || v.ActivityTypeId == 6 || v.ActivityTypeId == 8) && v.SigninImg != "" && v.ActiveState == 1 && v.PublishStatus == 1 {
+		if utils.InArrayByInt(utils.SHOW_SIGNIN_BUTTON_ACTIVITY_TYPE_ID, v.ActivityTypeId) && v.SigninImg != "" && v.ActiveState == 1 && v.PublishStatus == 1 {
 			list[k].IsShowSigninButton = true
 		}
 	}

+ 40 - 0
controllers/cygx/activity_special.go

@@ -2,6 +2,7 @@ package cygx
 
 import (
 	"encoding/json"
+	"fmt"
 	"github.com/rdlucklib/rdluck_tools/paging"
 	"github.com/tealeg/xlsx"
 	"hongze/hz_crm_api/controllers"
@@ -1188,3 +1189,42 @@ func (this *ActivitySpecialCoAntroller) Offline() {
 	br.Msg = "操作成功"
 	br.IsAddLog = true
 }
+
+//func init() {
+//	initCygx14_5()
+//}
+
+// 查研观向14_5上线脚本
+func initCygx14_5() {
+	// 获取流水信息
+	var condition string
+	var pars []interface{}
+	condition += ` AND b.activity_id > 0  AND  	 b.table_source IS NULL  `
+	list, err := cygx.GetCygxActivitySpecialTripBillDetailListAllInit14_5(condition, pars)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+	var content string
+	for _, v := range list {
+		if v.ActivityId == 0 {
+			continue
+		} else {
+			if v.DoType == 1 && v.Way != 4 && v.Way != 3 {
+				content = v.ResearchTheme + "--报名"
+			} else if v.DoType == 2 && v.Way != 4 && v.Way != 3 {
+				content = v.ResearchTheme + "--取消报名"
+			} else if v.Way == 4 {
+				content = v.ResearchTheme + "--活动取消"
+			}
+		}
+		fmt.Println(v.Id, "content", content)
+
+		err = cygx.Updatecygx_activity_special_trip_bill(content, v.Id)
+		if err != nil {
+			fmt.Println(err)
+			return
+		}
+	}
+	fmt.Println("enddd145")
+}

+ 143 - 282
controllers/cygx/activity_special_trip.go

@@ -49,6 +49,7 @@ func (this *ActivitySpecialTripCoAntroller) AddUser() {
 	}
 	roleTypeCode := AdminUser.RoleTypeCode
 	var items []*cygx.CygxActivitySpecialTrip
+	var itemsRedis []*cygx.CygxActivitySpecialTrip
 	var itemsBill []*cygx.CygxActivitySpecialTripBill
 	var itemsMeet []*cygx.CygxActivitySpecialMeetingDetail
 	activityIds := req.ActivityIds
@@ -64,6 +65,16 @@ func (this *ActivitySpecialTripCoAntroller) AddUser() {
 		uids += strconv.Itoa(v.UserId) + ","
 	}
 	uids = strings.TrimRight(uids, ",")
+
+	if roleTypeCode != utils.ROLE_TYPE_CODE_ADMIN {
+		err = cygxService.CheckSpecialActivityPointsByUserIds(uids, len(activityIdList)) //根据用户ID,活动场次,校验用户是否有剩余点数报名专项调研活动
+		if err != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = "操作失败,Err:" + err.Error()
+			return
+		}
+	}
+
 	for _, v := range uidList {
 		uid := v.UserId
 		wxUser, userErr := models.GetWxUserByUserId(uid)
@@ -82,7 +93,7 @@ func (this *ActivitySpecialTripCoAntroller) AddUser() {
 			}
 			limitPeopleNum := activityInfo.LimitPeopleNum
 			if limitPeopleNum > 0 {
-				if AdminUser.RoleTypeCode != "admin" {
+				if AdminUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN {
 					havePower, err := cygxService.GetSpecialDetailUserPower(wxUser, activityInfo)
 					if err != nil {
 						br.Msg = "用户权限校验失败!"
@@ -116,12 +127,6 @@ func (this *ActivitySpecialTripCoAntroller) AddUser() {
 					return
 				}
 			}
-			//total, errtotal := cygx.GetActivitySpecialTripCount(uid, activityId)
-			//if errtotal != nil {
-			//	br.Msg = "获取失败"
-			//	br.ErrMsg = "获取失败,Err:" + errtotal.Error()
-			//	return
-			//}
 			infoUser, err := cygx.GetUserAndCompanyNameList(uid)
 			if err != nil {
 				br.Msg = "获取失败"
@@ -135,76 +140,38 @@ func (this *ActivitySpecialTripCoAntroller) AddUser() {
 				br.ErrMsg = "获取日程数量信息失败,Err:" + err.Error()
 				return
 			}
-			if totalAll > 0 {
-				continue
-			}
-			//流水记录表
-			itemBill := new(cygx.CygxActivitySpecialTripBill)
-			itemBill.UserId = infoUser.UserId
-			itemBill.ActivityId = activityInfo.ActivityId
-			itemBill.CreateTime = time.Now()
-			itemBill.Mobile = infoUser.Mobile
-			itemBill.Email = infoUser.Email
-			itemBill.CompanyId = infoUser.CompanyId
-			itemBill.CompanyName = infoUser.CompanyName
-			itemBill.RealName = infoUser.RealName
-			itemBill.Source = 2
-			itemBill.DoType = 1
-			itemBill.BillDetailed = -1 // 流水减一
-			itemBill.RegisterPlatform = 3
-			itemBill.ChartPermissionId = activityInfo.ChartPermissionId
-			itemBill.ChartPermissionName = activityInfo.ChartPermissionName
-			itemBill.AdminId = AdminUser.AdminId
 
-			//if activityInfo.ChartPermissionName == utils.CE_LUE_NAME || activityInfo.ChartPermissionName == utils.GU_SHOU_NAME {
-			if utils.InArrayByStr(utils.ACTIVITY_SPECIAL_TRIP_PERMISSION_NAME_OTHER, activityInfo.ChartPermissionName) {
-				//如果是策略、固收、周期行业,把代扣行业信息放入流水表,取消报名的时候,返点使用
-				maxChartPermissionId, maxChartPermissionName, err := cygxService.GetSpecialBillMaxChartPermissionId(infoUser)
-				if err != nil {
-					br.Msg = "操作失败"
-					br.ErrMsg = "获取销售信息失败,GetSpecialBillMaxChartPermissionId Err:" + err.Error()
-					return
+			item := new(cygx.CygxActivitySpecialTrip)
+			item.UserId = infoUser.UserId
+			item.RealName = infoUser.RealName
+			item.SellerName = infoUser.SellerName
+			item.ActivityId = activityId
+			item.CreateTime = time.Now()
+			item.Mobile = infoUser.Mobile
+			item.Email = infoUser.Email
+			item.CompanyId = infoUser.CompanyId
+			item.CompanyName = infoUser.CompanyName
+			item.AdminId = AdminUser.AdminId
+			item.Source = 2
+			//优先绑定用户修改过的外呼手机号
+			if infoUser.OutboundMobile != "" {
+				item.OutboundMobile = infoUser.OutboundMobile
+				if infoUser.OutboundCountryCode == "" {
+					item.CountryCode = "86"
+				} else {
+					item.CountryCode = infoUser.OutboundCountryCode
 				}
-				itemBill.ChartPermissionId = maxChartPermissionId
-				itemBill.ChartPermissionName = maxChartPermissionName
-			}
-
-			if totalAll == 0 {
-				item := new(cygx.CygxActivitySpecialTrip)
-				item.UserId = infoUser.UserId
-				item.RealName = infoUser.RealName
-				item.SellerName = infoUser.SellerName
-				item.ActivityId = activityId
-				item.CreateTime = time.Now()
-				item.Mobile = infoUser.Mobile
-				item.Email = infoUser.Email
-				item.CompanyId = infoUser.CompanyId
-				item.CompanyName = infoUser.CompanyName
-				item.AdminId = AdminUser.AdminId
-				item.Source = 2
-				//优先绑定用户修改过的外呼手机号
-				if infoUser.OutboundMobile != "" {
-					item.OutboundMobile = infoUser.OutboundMobile
-					if infoUser.OutboundCountryCode == "" {
-						item.CountryCode = "86"
-					} else {
-						item.CountryCode = infoUser.OutboundCountryCode
-					}
+			} else {
+				item.OutboundMobile = infoUser.Mobile
+				if infoUser.CountryCode == "" {
+					item.CountryCode = "86"
 				} else {
-					item.OutboundMobile = infoUser.Mobile
-					if infoUser.CountryCode == "" {
-						item.CountryCode = "86"
-					} else {
-						item.CountryCode = infoUser.CountryCode
-					}
+					item.CountryCode = infoUser.CountryCode
 				}
+			}
+			itemsRedis = append(itemsRedis, item)
+			if totalAll == 0 {
 				items = append(items, item)
-				err = cygxService.DeductTripRemainingtimesByUser(infoUser, activityInfo, roleTypeCode) //扣除用户专项调研剩余次数
-				if err != nil {
-					br.Msg = "操作失败"
-					br.ErrMsg = "操作失败,Err:" + err.Error()
-					return
-				}
 			} else {
 				err = cygx.UpdateSpecialTrip(1, 0, uid, activityId)
 				if err != nil {
@@ -212,46 +179,7 @@ func (this *ActivitySpecialTripCoAntroller) AddUser() {
 					br.ErrMsg = "二次报名,更改报名是否有效状态失败,Err:" + err.Error()
 					return
 				}
-				resultTime := utils.StrTimeToTime(activityInfo.ActivityTime)
-				//48小时之内的取消也扣除一次参会记录
-				if time.Now().Add(+time.Hour * 48).After(resultTime) {
-					itemBill.BillDetailed = 0 //48小时之内,取消报名之后二次报名,不扣除流水记录
-				} else {
-					err = cygxService.DeductTripRemainingtimesByUser(infoUser, activityInfo, roleTypeCode) //扣除用户专项调研剩余次数
-					if err != nil {
-						br.Msg = "操作失败"
-						br.ErrMsg = "操作失败,Err:" + err.Error()
-						return
-					}
-				}
 			}
-			//userType, tripRemaining, mapChartName, err := cygxService.GetChartPermissionSpecialSurplusByCompany(infoUser.CompanyId)
-			//if err != nil {
-			//	br.Msg = "获取专项调研剩余次数失败"
-			//	br.ErrMsg = "获取专项调研剩余次数失败,err:" + err.Error()
-			//	return
-			//}
-			//if userType == 2 {
-			//	tripRemaining = tripRemaining + itemBill.BillDetailed - i
-			//	itemBill.Total = strconv.Itoa(tripRemaining) + "次"
-			//} else {
-			//	for k, num := range mapChartName {
-			//		if activityInfo.ChartPermissionName == k {
-			//			num = num + itemBill.BillDetailed - i
-			//		}
-			//		itemBill.Total += k + strconv.Itoa(num) + "次+"
-			//	}
-			//	itemBill.Total = strings.TrimRight(itemBill.Total, "+")
-			//}
-			totalText, err := cygxService.HandleActivitySpecialTripBillTotalText(infoUser.CompanyId)
-			if err != nil {
-				br.Msg = "报名失败,"
-				br.ErrMsg = "二次报名,更改报名是否有效状态失败,Err:" + err.Error()
-				return
-			}
-			itemBill.Total = totalText
-			itemsBill = append(itemsBill, itemBill)
-			//}
 
 			var itemMeeting = new(cygx.CygxActivitySpecialMeetingDetail)
 			itemMeeting.UserId = v.UserId
@@ -265,12 +193,20 @@ func (this *ActivitySpecialTripCoAntroller) AddUser() {
 			itemsMeet = append(itemsMeet, itemMeeting)
 		}
 	}
+
 	err = cygx.AddCygxActivitySpecialTrip(items, itemsBill, itemsMeet)
 	if err != nil {
 		br.Msg = "操作失败"
 		br.ErrMsg = "新增用户失败,Err:" + err.Error()
 		return
 	}
+	if len(itemsRedis) > 0 {
+		//9用户报名添加到处理研选扣点
+		for _, v := range itemsRedis {
+			time.Sleep(100 * time.Millisecond) // 添加0.1秒的延时
+			cygxService.SpecialActivityPointsBillSignupAddSpecial(v.ActivityId, v.UserId, AdminUser.AdminId)
+		}
+	}
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"
@@ -547,57 +483,11 @@ func (this *ActivitySpecialTripCoAntroller) TripCancel() {
 		br.ErrMsg = "操作失败,Err:" + errInfo.Error()
 		return
 	}
-
-	infoUser, err := cygx.GetUserAndCompanyNameList(userId)
-	if err != nil {
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取数据失败,Err:" + err.Error()
-		return
-	}
-	//流水记录表
-	itemBill := new(cygx.CygxActivitySpecialTripBill)
-	itemBill.UserId = infoUser.UserId
-	itemBill.ActivityId = activityInfo.ActivityId
-	itemBill.CreateTime = time.Now()
-	itemBill.Mobile = infoUser.Mobile
-	itemBill.Email = infoUser.Email
-	itemBill.CompanyId = infoUser.CompanyId
-	itemBill.CompanyName = infoUser.CompanyName
-	itemBill.RealName = infoUser.RealName
-	itemBill.Source = 2
-	itemBill.DoType = 2
-	itemBill.BillDetailed = 1 // 流水加一
-	itemBill.RegisterPlatform = 3
-	itemBill.ChartPermissionId = activityInfo.ChartPermissionId
-	itemBill.ChartPermissionName = activityInfo.ChartPermissionName
-	itemBill.AdminId = sysUser.AdminId
-
-	//if activityInfo.ChartPermissionName == utils.CE_LUE_NAME || activityInfo.ChartPermissionName == utils.GU_SHOU_NAME {
-	if utils.InArrayByStr(utils.ACTIVITY_SPECIAL_TRIP_PERMISSION_NAME_OTHER, activityInfo.ChartPermissionName) {
-		//如果是策略、固收行业,把代扣行业信息放入流水表,取消报名的时候,返点使用
-		lastTripBill, err := cygx.GetCygxActivitySpecialTripBillLastDetialByActivityId(activityInfo.ActivityId, userId)
-		if err != nil {
-			br.Msg = "操作失败"
-			br.ErrMsg = "获取销售信息失败,GetCygxActivitySpecialTripBillLastDetialByActivityId Err:" + err.Error()
-			return
-		}
-		itemBill.ChartPermissionId = lastTripBill.ChartPermissionId
-		itemBill.ChartPermissionName = lastTripBill.ChartPermissionName
-	}
-
 	resultTime := utils.StrTimeToTime(activityInfo.ActivityTime)
 	//48小时之内的取消也扣除一次参会记录
 	var isValid int
 	if time.Now().Add(+time.Hour * 48).After(resultTime) {
 		isValid = 1
-		itemBill.BillDetailed = 0 // 48小时之内取消的,照样扣点,流水不进行加一
-	} else {
-		err = cygxService.RebateTripRemainingtimesByUser(infoUser, activityInfo) // 返点
-		if err != nil {
-			br.Msg = "操作失败"
-			br.ErrMsg = "操作失败,RebateTripRemainingtimesByUserErr:" + err.Error()
-			return
-		}
 	}
 	err = cygx.ActivitySpecialTripCancel(isValid, activityId, userId)
 	if err != nil {
@@ -605,37 +495,7 @@ func (this *ActivitySpecialTripCoAntroller) TripCancel() {
 		br.ErrMsg = "修改失败 Err:" + err.Error()
 		return
 	}
-	//userType, tripRemaining, mapChartName, err := cygxService.GetChartPermissionSpecialSurplusByCompany(infoUser.CompanyId)
-	//if err != nil {
-	//	br.Msg = "获取专项调研剩余次数失败"
-	//	br.ErrMsg = "获取专项调研剩余次数失败,err:" + err.Error()
-	//	return
-	//}
-	//if userType == 2 {
-	//	tripRemaining += itemBill.BillDetailed
-	//	itemBill.Total = strconv.Itoa(tripRemaining) + "次"
-	//} else {
-	//	for k, num := range mapChartName {
-	//		if activityInfo.ChartPermissionName == k {
-	//			num += itemBill.BillDetailed
-	//		}
-	//		itemBill.Total += k + strconv.Itoa(num) + "次+"
-	//	}
-	//	itemBill.Total = strings.TrimRight(itemBill.Total, "+")
-	//}
-	totalText, err := cygxService.HandleActivitySpecialTripBillTotalText(infoUser.CompanyId)
-	if err != nil {
-		br.Msg = "报名失败,"
-		br.ErrMsg = "二次报名,更改报名是否有效状态失败,Err:" + err.Error()
-		return
-	}
-	itemBill.Total = totalText
-	err = cygx.AddCygxActivitySpecialTripBill(itemBill)
-	if err != nil {
-		br.Msg = "修改失败"
-		br.ErrMsg = "修改失败流水记录添加失败 Err:" + err.Error()
-		return
-	}
+	go cygxService.ActivityPointsBillSignupCancelSpecial(activityId, userId, sysUser.AdminId) // 用户取消报名专项调研活动扣点处理
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"
@@ -806,14 +666,14 @@ func (this *ActivitySpecialTripCoAntroller) MeetingDo() {
 
 	var condition string
 	var pars []interface{}
-	condition += " AND is_meeting = 1  AND  activity_id = ? "
-	pars = append(pars, activityId)
-	listOldMeetingDetail, err := cygx.GetCygxActivitySpecialMeetingDetailList(condition, pars)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		br.Msg = "获取失败"
-		br.ErrMsg = "GetCygxActivitySpecialMeetingDetailList,Err:" + err.Error()
-		return
-	}
+	//condition += " AND is_meeting = 1  AND  activity_id = ? "
+	//pars = append(pars, activityId)
+	//listOldMeetingDetail, err := cygx.GetCygxActivitySpecialMeetingDetailList(condition, pars)
+	//if err != nil && err.Error() != utils.ErrNoRow() {
+	//	br.Msg = "获取失败"
+	//	br.ErrMsg = "GetCygxActivitySpecialMeetingDetailList,Err:" + err.Error()
+	//	return
+	//}
 	//获取之前已经到会的人
 	//var oldMeetingUserid = make(map[int]bool)
 
@@ -834,53 +694,53 @@ func (this *ActivitySpecialTripCoAntroller) MeetingDo() {
 
 	var items []*cygx.CygxActivitySpecialMeetingDetail
 	var itemsBill []*cygx.CygxActivitySpecialTripBill
-	if len(listOldMeetingDetail) > 0 {
-		for _, v := range listOldMeetingDetail {
-			if mapUserLastTripBill[v.UserId] == nil {
-				continue
-			}
-			//如果上一次空降的用户,这一次提交的时候没有带入,而且还被扣点了,那么就进行返点处理
-			if !newMeetingUserid[v.UserId] && v.IsAirborne == 1 && mapUserLastTripBill[v.UserId].BillDetailed < 0 {
-				var itemBill = new(cygx.CygxActivitySpecialTripBill)
-				//流水记录表
-				itemBill.UserId = v.UserId
-				itemBill.ActivityId = activityInfo.ActivityId
-				itemBill.CreateTime = time.Now()
-				itemBill.Mobile = v.Mobile
-				itemBill.Email = v.Email
-				itemBill.CompanyId = v.CompanyId
-				itemBill.CompanyName = v.CompanyName
-				itemBill.RealName = v.RealName
-				itemBill.Source = 2
-				itemBill.DoType = 2
-				itemBill.BillDetailed = 1 // 流水加一
-				itemBill.RegisterPlatform = 1
-				itemBill.ChartPermissionId = activityInfo.ChartPermissionId
-				itemBill.ChartPermissionName = activityInfo.ChartPermissionName
-				itemBill.AdminId = AdminUser.AdminId
-				itemBill.Way = 2
-				userType, tripRemaining, mapChartName, err := cygxService.GetChartPermissionSpecialSurplusByCompany(v.CompanyId)
-				if err != nil {
-					br.Msg = "获取专项调研剩余次数失败"
-					br.ErrMsg = "获取专项调研剩余次数失败,err:" + err.Error()
-					return
-				}
-				if userType == 2 {
-					tripRemaining += itemBill.BillDetailed
-					itemBill.Total = strconv.Itoa(tripRemaining) + "次"
-				} else {
-					for k, num := range mapChartName {
-						if activityInfo.ChartPermissionName == k {
-							num += itemBill.BillDetailed
-						}
-						itemBill.Total += k + strconv.Itoa(num) + "次+"
-					}
-					itemBill.Total = strings.TrimRight(itemBill.Total, "+")
-				}
-				itemsBill = append(itemsBill, itemBill)
-			}
-		}
-	}
+	//if len(listOldMeetingDetail) > 0 {
+	//	for _, v := range listOldMeetingDetail {
+	//		if mapUserLastTripBill[v.UserId] == nil {
+	//			continue
+	//		}
+	//		//如果上一次空降的用户,这一次提交的时候没有带入,而且还被扣点了,那么就进行返点处理
+	//		if !newMeetingUserid[v.UserId] && v.IsAirborne == 1 && mapUserLastTripBill[v.UserId].BillDetailed < 0 {
+	//			//var itemBill = new(cygx.CygxActivitySpecialTripBill)
+	//			//流水记录表
+	//			itemBill.UserId = v.UserId
+	//			itemBill.ActivityId = activityInfo.ActivityId
+	//			itemBill.CreateTime = time.Now()
+	//			itemBill.Mobile = v.Mobile
+	//			itemBill.Email = v.Email
+	//			itemBill.CompanyId = v.CompanyId
+	//			itemBill.CompanyName = v.CompanyName
+	//			itemBill.RealName = v.RealName
+	//			itemBill.Source = 2
+	//			itemBill.DoType = 2
+	//			itemBill.BillDetailed = 1 // 流水加一
+	//			itemBill.RegisterPlatform = 1
+	//			itemBill.ChartPermissionId = activityInfo.ChartPermissionId
+	//			itemBill.ChartPermissionName = activityInfo.ChartPermissionName
+	//			itemBill.AdminId = AdminUser.AdminId
+	//			itemBill.Way = 2
+	//			userType, tripRemaining, mapChartName, err := cygxService.GetChartPermissionSpecialSurplusByCompany(v.CompanyId)
+	//			if err != nil {
+	//				br.Msg = "获取专项调研剩余次数失败"
+	//				br.ErrMsg = "获取专项调研剩余次数失败,err:" + err.Error()
+	//				return
+	//			}
+	//			if userType == 2 {
+	//				//tripRemaining += itemBill.BillDetailed要处理
+	//				itemBill.Total = strconv.Itoa(tripRemaining) + "次"
+	//			} else {
+	//				for k, num := range mapChartName {
+	//					if activityInfo.ChartPermissionName == k {
+	//						//num += itemBill.BillDetailed要处理
+	//					}
+	//					itemBill.Total += k + strconv.Itoa(num) + "次+"
+	//				}
+	//				itemBill.Total = strings.TrimRight(itemBill.Total, "+")
+	//			}
+	//			itemsBill = append(itemsBill, itemBill)
+	//		}
+	//	}
+	//}
 
 	for _, v := range listUser {
 		var item = new(cygx.CygxActivitySpecialMeetingDetail)
@@ -897,46 +757,46 @@ func (this *ActivitySpecialTripCoAntroller) MeetingDo() {
 		if _, ok := UserMap[v.UserId]; !ok {
 			item.IsAirborne = 1
 		}
-		var itemBill = new(cygx.CygxActivitySpecialTripBill)
+		//var itemBill = new(cygx.CygxActivitySpecialTripBill)
 		//如果是空降客户,(没有扣点记录,或者上一次的流水不为负) 就进行扣点处理
-		if item.IsAirborne == 1 && (mapUserLastTripBill[v.UserId] == nil || mapUserLastTripBill[v.UserId].BillDetailed >= 0) {
-			//流水记录表
-			itemBill.UserId = v.UserId
-			itemBill.ActivityId = activityInfo.ActivityId
-			itemBill.CreateTime = time.Now()
-			itemBill.Mobile = v.Mobile
-			itemBill.Email = v.Email
-			itemBill.CompanyId = v.CompanyId
-			itemBill.CompanyName = v.CompanyName
-			itemBill.RealName = v.RealName
-			itemBill.Source = 2
-			itemBill.DoType = 1
-			itemBill.BillDetailed = -1 // 流水减一
-			itemBill.RegisterPlatform = 1
-			itemBill.ChartPermissionId = activityInfo.ChartPermissionId
-			itemBill.ChartPermissionName = activityInfo.ChartPermissionName
-			itemBill.AdminId = AdminUser.AdminId
-			itemBill.Way = 2
-			userType, tripRemaining, mapChartName, err := cygxService.GetChartPermissionSpecialSurplusByCompany(v.CompanyId)
-			if err != nil {
-				br.Msg = "获取专项调研剩余次数失败"
-				br.ErrMsg = "获取专项调研剩余次数失败,err:" + err.Error()
-				return
-			}
-			if userType == 2 {
-				tripRemaining -= 1
-				itemBill.Total = strconv.Itoa(tripRemaining) + "次"
-			} else {
-				for k, num := range mapChartName {
-					if activityInfo.ChartPermissionName == k {
-						num -= 1
-					}
-					itemBill.Total += k + strconv.Itoa(num) + "次+"
-				}
-				itemBill.Total = strings.TrimRight(itemBill.Total, "+")
-			}
-			itemsBill = append(itemsBill, itemBill)
-		}
+		//if item.IsAirborne == 1 && (mapUserLastTripBill[v.UserId] == nil || mapUserLastTripBill[v.UserId].BillDetailed >= 0) {
+		//	//流水记录表
+		//	itemBill.UserId = v.UserId
+		//	itemBill.ActivityId = activityInfo.ActivityId
+		//	itemBill.CreateTime = time.Now()
+		//	itemBill.Mobile = v.Mobile
+		//	itemBill.Email = v.Email
+		//	itemBill.CompanyId = v.CompanyId
+		//	itemBill.CompanyName = v.CompanyName
+		//	itemBill.RealName = v.RealName
+		//	itemBill.Source = 2
+		//	itemBill.DoType = 1
+		//	itemBill.BillDetailed = -1 // 流水减一
+		//	itemBill.RegisterPlatform = 1
+		//	itemBill.ChartPermissionId = activityInfo.ChartPermissionId
+		//	itemBill.ChartPermissionName = activityInfo.ChartPermissionName
+		//	itemBill.AdminId = AdminUser.AdminId
+		//	itemBill.Way = 2
+		//	userType, tripRemaining, mapChartName, err := cygxService.GetChartPermissionSpecialSurplusByCompany(v.CompanyId)
+		//	if err != nil {
+		//		br.Msg = "获取专项调研剩余次数失败"
+		//		br.ErrMsg = "获取专项调研剩余次数失败,err:" + err.Error()
+		//		return
+		//	}
+		//	if userType == 2 {
+		//		tripRemaining -= 1
+		//		itemBill.Total = strconv.Itoa(tripRemaining) + "次"
+		//	} else {
+		//		for k, num := range mapChartName {
+		//			if activityInfo.ChartPermissionName == k {
+		//				num -= 1
+		//			}
+		//			itemBill.Total += k + strconv.Itoa(num) + "次+"
+		//		}
+		//		itemBill.Total = strings.TrimRight(itemBill.Total, "+")
+		//	}
+		//	itemsBill = append(itemsBill, itemBill)
+		//}
 		items = append(items, item)
 	}
 	err = cygx.MeetingDopecialMeet(meetingUids, noMeetingUids, activityId, items, itemsBill)
@@ -946,6 +806,7 @@ func (this *ActivitySpecialTripCoAntroller) MeetingDo() {
 		return
 	}
 	go cygxService.ActivitySpecialUserLabelLogAdd(activityId, userIdArr)
+	go cygxService.SpecialActivityPointsBillSubmitMeeting(activityId, AdminUser.AdminId)
 	//添加操作日志记录
 	br.Ret = 200
 	br.Success = true

+ 6 - 2
controllers/cygx/contract_allocation.go

@@ -1127,11 +1127,15 @@ func (this *ContractAllocationController) CompanyContractStatistics() {
 	}
 
 	var list []*cygx.AllocationPermissionStatisticsListResp
-	permissionNameArr := []string{"医药", "消费", "科技", "智造", "策略", "固收", "买方研选"}
+	permissionNameArr := []string{"医药", "消费", "科技", "智造", "策略", "固收", "研选订阅"}
 	for _, v := range permissionNameArr {
 		item := new(cygx.AllocationPermissionStatisticsListResp)
 		item.ChartPermissionName = v
-		item.List = mapPermissionUser[v]
+		if len(mapPermissionUser[v]) == 0 {
+			item.List = make([]*cygx.AllocationRealNameStatisticsListResp, 0)
+		} else {
+			item.List = mapPermissionUser[v]
+		}
 		list = append(list, item)
 	}
 

+ 111 - 35
controllers/cygx/morning_meeting_review.go

@@ -90,7 +90,7 @@ func (this *MorningMeetingController) List() {
 		return
 	}
 
-	condition += ` ORDER BY publish_time DESC  `
+	condition += ` ORDER BY meeting_time DESC ,id DESC  `
 	resp := new(cygx.CygxMorningMeetingReviewsList)
 	list, err := cygx.GetCygxMorningMeetingReviewsList(condition, pars, startSize, pageSize)
 	if err != nil {
@@ -109,6 +109,7 @@ func (this *MorningMeetingController) List() {
 			Status:        item.Status,
 			PartNums:      item.PartNums,
 			IndustryNames: item.IndustryNames,
+			OpUserName:    item.OpUserName,
 		}
 		if item.Status == 1 {
 			respItem.PublishTime = item.PublishTime.Local().Format(utils.FormatDateTime)
@@ -165,19 +166,26 @@ func (this *MorningMeetingController) PreserveAndPublish() {
 	}
 	industryNames := strings.Join(industryNameslice, ",")
 
-	if reqList.MeetingId <= 0 {
-		//先新增主表
-		reviewItem := cygx.CygxMorningMeetingReviews{
-			MeetingTime:   meetingTime,
-			CreateTime:    time.Now(),
-			ModifyTime:    time.Now(),
-			PartNums:      len(reqList.List),
-			IndustryNames: industryNames,
-		}
+	//先新增主表
+	reviewItem := cygx.CygxMorningMeetingReviews{
+		MeetingTime:   meetingTime,
+		CreateTime:    time.Now(),
+		ModifyTime:    time.Now(),
+		PartNums:      len(reqList.List),
+		IndustryNames: industryNames,
+		OpUserId:      sysUser.AdminId,
+		OpUserName:    sysUser.RealName,
+	}
+	if reqList.DoType == 1 {
+		reviewItem.Status = 2
+	}
 
+	if reqList.MeetingId <= 0 {
 		if reqList.DoType == 1 {
-			reviewItem.PublishTime = time.Now()
-			reviewItem.Status = 1
+			//reviewItem.PublishTime = time.Now()
+			//reviewItem.Status = 2
+		} else {
+			reviewItem.Status = 5
 		}
 
 		meetingId, err := cygx.AddCygxMorningMeetingReviews(&reviewItem)
@@ -254,10 +262,10 @@ func (this *MorningMeetingController) PreserveAndPublish() {
 			br.Msg = "保存成功"
 			br.Data = meetingId
 		} else {
-			for _, item := range reqList.List {
-				go services.SendWxMsgWithCygxMorningMeeting(int(meetingId), item.IndustryId, item.IndustryName)
-				go cygxService.UpdateIndustrialManagementTimeLineDateList3ByRedis(item.IndustryId) //处理产业管理时间线相关内容的数据
-			}
+			//for _, item := range reqList.List {
+			//go services.SendWxMsgWithCygxMorningMeeting(int(meetingId), item.IndustryId, item.IndustryName)
+			//	go cygxService.UpdateIndustrialManagementTimeLineDateList3ByRedis(item.IndustryId) //处理产业管理时间线相关内容的数据
+			//}
 			//添加到首页最新
 			listchapter, err := cygx.GetCygxMorningMeetingReviewsListById(int(meetingId))
 			if err != nil {
@@ -267,8 +275,9 @@ func (this *MorningMeetingController) PreserveAndPublish() {
 			}
 			for _, itemchapter := range listchapter {
 				//go cygxService.UpdateResourceData(itemchapter.Id, "meetingreviewchapt", "add", time.Now().Format(utils.FormatDateTime))
-				go cygxService.UpdateMeetingreviewchaptResourceData(itemchapter.Id) //写入首页最新  cygx_resource_data 表
-				go elastic.AddComprehensiveMeetingreviewchapt(itemchapter.Id)       //Es添加晨会精华
+				//go cygxService.UpdateMeetingreviewchaptResourceData(itemchapter.Id)                                 //写入首页最新  cygx_resource_data 表
+				//go elastic.AddComprehensiveMeetingreviewchapt(itemchapter.Id)                                       //Es添加晨会精华
+				go cygxService.AddCygxMorningMeetingReviewLog(itemchapter, "提交审核", sysUser.RealName, sysUser.AdminId, 2) //添加晨会精华日志信息,并发送模版消息
 			}
 			br.Msg = "发布成功"
 			br.Data = meetingId
@@ -285,22 +294,14 @@ func (this *MorningMeetingController) PreserveAndPublish() {
 			return
 		}
 
-		reviewItem := cygx.CygxMorningMeetingReviews{
-			Id:            reqList.MeetingId,
-			MeetingTime:   meetingTime,
-			ModifyTime:    time.Now(),
-			PartNums:      len(reqList.List),
-			IndustryNames: industryNames,
-		}
-
 		if reqList.DoType == 1 {
-			reviewItem.PublishTime = time.Now()
-			reviewItem.Status = 1
+			//reviewItem.PublishTime = time.Now()
+			//reviewItem.Status = 2
 		} else {
-			reviewItem.PublishTime = reviewInfo.PublishTime
+			//reviewItem.PublishTime = reviewInfo.PublishTime
 			reviewItem.Status = reviewInfo.Status
 		}
-
+		reviewItem.Id = reqList.MeetingId
 		err = cygx.UpdateCygxMorningMeetingReviews(&reviewItem)
 		if err != nil {
 			br.Msg = "更新晨报点评失败!"
@@ -439,13 +440,14 @@ func (this *MorningMeetingController) PreserveAndPublish() {
 		if reqList.DoType == 0 {
 			br.Msg = "保存成功"
 		} else {
-			for _, item := range reqList.List {
-				go services.SendWxMsgWithCygxMorningMeeting(reqList.MeetingId, item.IndustryId, item.IndustryName)
-				go cygxService.UpdateIndustrialManagementTimeLineDateList3ByRedis(item.IndustryId) //处理产业管理时间线相关内容的数据
-			}
+			//for _, item := range reqList.List {
+			//	go services.SendWxMsgWithCygxMorningMeeting(reqList.MeetingId, item.IndustryId, item.IndustryName)
+			//	go cygxService.UpdateIndustrialManagementTimeLineDateList3ByRedis(item.IndustryId) //处理产业管理时间线相关内容的数据
+			//}
 			for _, itemchapter := range listchapter {
 				//go cygxService.UpdateResourceData(itemchapter.Id, "meetingreviewchapt", "add", time.Now().Format(utils.FormatDateTime))
-				go cygxService.UpdateMeetingreviewchaptResourceData(itemchapter.Id) //写入首页最新  cygx_resource_data 表
+				//go cygxService.UpdateMeetingreviewchaptResourceData(itemchapter.Id) //写入首页最新  cygx_resource_data 表
+				go cygxService.AddCygxMorningMeetingReviewLog(itemchapter, "提交审核", sysUser.RealName, sysUser.AdminId, 2) //添加晨会精华日志信息,并发送模版消息
 			}
 			br.Msg = "发布成功"
 		}
@@ -882,3 +884,77 @@ func MorningMeetingHistoryListExport(this *MorningMeetingController, resp cygx.C
 	br.Success = true
 	br.Msg = "导出成功"
 }
+
+// @Title 提交审核与撤回审核接口
+// @Description 提交审核与撤回审核接口
+// @Param	request	body cygx.MorningReviewApproveSubmiteq true "type json string"
+// @Success 200 Ret=200 取消发布成功
+// @router /morningMeeting/approve/submit [post]
+func (this *MorningMeetingController) ApproveSubmitReport() {
+	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.MorningReviewApproveSubmiteq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	reviewId := req.ReviewId
+	status := req.Status
+	if reviewId <= 0 {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误,晨会id不可为空"
+		return
+	}
+	if status != 2 && status != 4 {
+		br.Msg = "操作失败"
+		br.ErrMsg = "发布状态错误"
+		return
+	}
+	var operate string
+	if status == 2 {
+		operate = "提交审核"
+	} else {
+		operate = "撤回"
+	}
+
+	//reviewInfo, err := cygx.GetMorningMeetingReviewById(reviewId)
+	//if err != nil {
+	//	br.Msg = "取消发布失败"
+	//	br.ErrMsg = "取消发布失败,Err:" + err.Error()
+	//	return
+	//}
+
+	//添加到首页最新
+	listchapter, err := cygx.GetCygxMorningMeetingReviewsListById(reviewId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+
+	err = cygx.UpdateMorningMeetingReviewStatusById(status, reviewId)
+	if err != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "操作失败失败,Err:" + err.Error()
+		return
+	}
+	for _, itemchapter := range listchapter {
+		go cygxService.AddCygxMorningMeetingReviewLog(itemchapter, operate, sysUser.RealName, sysUser.AdminId, status) //添加晨会精华日志信息,并发送模版消息
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = operate + "成功"
+}

+ 167 - 9
controllers/cygx/rai_serve.go

@@ -1226,15 +1226,6 @@ func (this *RaiServeCoAntroller) AddRemark() {
 	item.TableName = "company_history_remark"
 
 	err = company.AddCompanyHistoryRemark(item)
-
-	//{
-	//	approveContent := req.Remark
-	//	remark := "新增备注"
-	//	operation := "add_remark"
-	//	services.AddCompanyOperationRecord(req.CompanyId, companyProduct.SellerId, sysUser.AdminId, companyProduct.ProductId, sysUser.AdminId, companyProduct.CompanyName,
-	//		companyProduct.ProductName, sysUser.RealName, remark, operation, approveContent, sysUser.RealName, "", companyProduct.Status)
-	//}
-
 	if err != nil {
 		br.Msg = "编辑失败"
 		br.ErrMsg = "编辑失败,Err:" + err.Error()
@@ -1290,6 +1281,7 @@ func (this *RaiServeCoAntroller) RemarkList() {
 	resp := new(company.CompanyHistoryRemarkListResp)
 	for _, v := range remarkList {
 		item := new(company.CompanyHistoryRemarkResp)
+		item.HistoryId = v.HistoryId
 		item.CompanyId = v.CompanyId
 		item.Content = v.Content
 		item.SysAdminName = v.SysAdminName
@@ -1305,6 +1297,12 @@ func (this *RaiServeCoAntroller) RemarkList() {
 			item.RemarkType = "未续约说明"
 		case "cygx_user_feedback":
 			item.RemarkType = "交流反馈(" + v.RealName + ")"
+		case "company_approval":
+			item.RemarkType = "申请解冻"
+		case "company_history_remark":
+			item.RemarkType = "备注"
+			item.BtnEdit = true
+			item.BtnDelete = true
 		default:
 			item.RemarkType = "备注"
 		}
@@ -1316,3 +1314,163 @@ func (this *RaiServeCoAntroller) RemarkList() {
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// EditRemark
+// @Title 修改历史备注
+// @Description 修改历史备注
+// @Param	request	body company.CompanyHistoryRemarkReq true "type json string"
+// @Success 200 编辑成功
+// @router /rai_serve/remark/edit [post]
+func (this *RaiServeCoAntroller) EditRemark() {
+	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 company.CompanyHistoryRemarkEditReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	historyId := req.HistoryId
+	content := req.Content
+	if historyId <= 0 {
+		br.Msg = "参数缺失"
+		br.ErrMsg = "参数缺失,备注ID未传!"
+		return
+	}
+	if content == "" {
+		br.Msg = "参数缺失"
+		br.ErrMsg = "参数缺失,备注说明未传!"
+		return
+	}
+	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_SELLER || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_TEAM || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_GROUP {
+		br.Msg = "角色类型错误"
+		br.ErrMsg = "角色类型错误,该角色不能添加备注!"
+		return
+	}
+	detail, err := company.GetCompanyHistoryRemarkByHistoryId(historyId)
+	if err != nil {
+		br.Msg = "编辑失败"
+		br.ErrMsg = "编辑失败,Err:" + err.Error()
+		return
+	}
+	if detail.TableName != "company_history_remark" {
+		br.Msg = "编辑失败"
+		br.ErrMsg = "该类型无法编辑" + detail.TableName
+		return
+	}
+
+	whereParams := make(map[string]interface{})
+	updateParams := make(map[string]interface{})
+
+	whereParams["history_id"] = historyId
+
+	updateParams["content"] = content
+	updateParams["modify_time"] = time.Now()
+
+	err = company.UpdateCompanyHistoryRemark(whereParams, updateParams)
+	if err != nil {
+		br.Msg = "修改失败"
+		br.ErrMsg = "编辑失败,Err:" + err.Error()
+		return
+	}
+	item := new(company.CompanyHistoryRemarkLog)
+	item.HistoryId = detail.HistoryId
+	item.CompanyId = detail.CompanyId
+	item.ProductId = detail.ProductId
+	item.Content = detail.Content
+	item.ContentEdit = content
+	item.SysAdminId = sysUser.AdminId
+	item.SysAdminName = sysUser.RealName
+	item.CreateTime = time.Now()
+
+	err = company.AddCompanyHistoryRemarkLog(item)
+	if err != nil {
+		br.Msg = "编辑失败"
+		br.ErrMsg = "编辑失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "编辑成功"
+}
+
+// DeletRemark
+// @Title 删除历史备注
+// @Description 删除历史备注
+// @Param	request	body company.CompanyHistoryRemarkEditReq true "type json string"
+// @Success 200 编辑成功
+// @router /rai_serve/remark/delete [post]
+func (this *RaiServeCoAntroller) DeleteRemark() {
+	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 company.CompanyHistoryRemarkEditReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	historyId := req.HistoryId
+
+	if historyId <= 0 {
+		br.Msg = "参数缺失"
+		br.ErrMsg = "参数缺失,备注ID未传!"
+		return
+	}
+
+	detail, err := company.GetCompanyHistoryRemarkByHistoryId(historyId)
+	if err != nil {
+		br.Msg = "编辑失败"
+		br.ErrMsg = "编辑失败,Err:" + err.Error()
+		return
+	}
+	if detail.TableName != "company_history_remark" {
+		br.Msg = "编辑失败"
+		br.ErrMsg = "该类型无法编辑" + detail.TableName
+		return
+	}
+
+	//whereParams := make(map[string]interface{})
+	//updateParams := make(map[string]interface{})
+	//
+	//whereParams["history_id"] = historyId
+	//
+	//updateParams["content"] = "12321312"
+	//updateParams["email"] = 1
+	////updateParams["is_del"] = 1
+	////updateParams["del_time"] = time.Now()
+	//updateParams["modify_time"] = time.Now()
+	////updateParams["del_admin_name"] = sysUser.RealName
+	////updateParams["del_admin_id"] = sysUser.AdminId
+
+	err = company.DeleteCompanyHistoryRemark(sysUser.RealName, sysUser.AdminId, historyId)
+	if err != nil {
+		br.Msg = "删除失败"
+		br.ErrMsg = "删除失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "编辑成功"
+}

+ 3 - 0
controllers/cygx/report_selection.go

@@ -208,6 +208,7 @@ func (this *ReportSelectionController) PreserveAndPublish() {
 	//	existMap[v.ChartPermissionId] = v.ChartPermissionId
 	//}
 	go cygxService.UpdateReportSelectionResourceData(req.ArticleId) //首页最新页面数据逻辑处理 V11.1.1
+	go cygxService.UpdateReportSelectionSubjectNameList()           //获取报告精选最新一期标的名称
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"
@@ -582,6 +583,7 @@ func (this *ReportSelectionController) PublishAndCancel() {
 		return
 	}
 	go cygxService.UpdateReportSelectionResourceData(articleId) //首页最新页面数据逻辑处理 V11.1.1
+	go cygxService.UpdateReportSelectionSubjectNameList()       //获取报告精选最新一期标的名称
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"
@@ -969,6 +971,7 @@ func (this *ReportSelectionController) VisibleRange() {
 		return
 	}
 	go cygxService.UpdateReportSelectionResourceData(articleId) //首页最新页面数据逻辑处理 V11.1.1
+	go cygxService.UpdateReportSelectionSubjectNameList()       //获取报告精选最新一期标的名称
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"

+ 4 - 4
controllers/cygx/search_keyword.go

@@ -50,10 +50,10 @@ func (this *SearchKeywordController) HostKeywordList() {
 	startSize = utils.StartIndex(currentIndex, pageSize)
 	var condition string
 	var pars []interface{}
-	currentTime := time.Now()
-	starTime := currentTime.AddDate(0, 0, -8).Format("2006-01-02") + " 00:00:00"
-	endTime := currentTime.AddDate(0, 0, -1).Format("2006-01-02") + " 23:59:59"
-	condition += ` AND create_time < ` + "'" + endTime + "'" + `AND create_time > ` + "'" + starTime + "'"
+	starTime := time.Now().AddDate(0, 0, -8).Format(utils.FormatDate)
+	endTime := time.Now().Format(utils.FormatDate)
+	condition += ` AND create_time > ? AND create_time < ?  AND user_id > 0 `
+	pars = append(pars, starTime, endTime)
 	total, err := cygx.GetSearchKeyWordCount(condition, pars)
 	if err != nil {
 		br.Msg = "获取失败"

+ 30 - 3
controllers/cygx/summary_manage.go

@@ -1241,17 +1241,25 @@ func (this *SummaryManage) ArticleHistoryExport() {
 		br.ErrMsg = "获取策略品台数据失败,Err:" + err.Error()
 		return
 	}
-	var mobilesCl string
+	var mobilesArr []string
 	if len(listClPv) > 0 {
 		for _, v := range listClPv {
 			if v.Mobile != "" {
-				mobilesCl += v.Mobile + ","
+				mobilesArr = append(mobilesArr, v.Mobile)
+			}
+		}
+	}
+	if len(list) > 0 {
+		for _, v := range list {
+			if v.Mobile != "" {
+				mobilesArr = append(mobilesArr, v.Mobile)
 			}
 		}
 	}
 	mapMobileCompany := make(map[string]string)
 	mapMobileSellName := make(map[string]string)
-	mobilesCl = strings.TrimRight(mobilesCl, ",")
+	mapMobileRealName := make(map[string]string)
+	mobilesCl := strings.Join(mobilesArr, ",")
 
 	if mobilesCl != "" {
 		listClCompanyName, err := cygx.GetCygxCelueArticleComapnyName(mobilesCl)
@@ -1279,6 +1287,25 @@ func (this *SummaryManage) ArticleHistoryExport() {
 		}
 	}
 
+	listUser, err := models.GetWxUserRaiSllerListByUserMobile(mobilesArr)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	//获取用户当前最新的公司信息
+	for _, v := range listUser {
+		mapMobileRealName[v.Mobile] = v.RealName
+	}
+
+	for _, v := range list {
+		if v.Mobile != "" {
+			if v.RealName == "" {
+				v.RealName = mapMobileRealName[v.Mobile]
+			}
+		}
+	}
+
 	var listClPvPower []*cygx.ArticleHistoryRep
 
 	if len(mapMobileSellWithUser) != 0 {

+ 9 - 0
controllers/cygx/user_rai_label.go

@@ -353,8 +353,17 @@ func (this *UserRaiLabelController) List() {
 		br.ErrMsg = "获取失败,Err:" + err.Error() + "userId:" + strconv.Itoa(userId)
 		return
 	}
+
 	if len(list) == 0 {
 		list = make([]*cygx.WxUserRaiLabelListResp, 0)
+	} else {
+		RaiUserLabelStyleSetConfig := cygxService.RaiUserLabelStyleSet
+		for _, v := range list {
+			if RaiUserLabelStyleSetConfig[v.SourceType] != nil {
+				v.BackgroundColor = RaiUserLabelStyleSetConfig[v.SourceType].BackgroundColor
+				v.TextClolr = RaiUserLabelStyleSetConfig[v.SourceType].TextClolr
+			}
+		}
 	}
 	resp.List = list
 	br.Ret = 200

+ 53 - 0
controllers/roadshow/calendar.go

@@ -11,6 +11,7 @@ import (
 	"hongze/hz_crm_api/models/roadshow"
 	"hongze/hz_crm_api/models/system"
 	"hongze/hz_crm_api/services"
+	cygxService "hongze/hz_crm_api/services/cygx"
 	roadshowService "hongze/hz_crm_api/services/roadshow"
 	"hongze/hz_crm_api/utils"
 	"strconv"
@@ -57,6 +58,7 @@ func (this *CalendarController) Add() {
 		return
 	}
 	var req roadshow.AddActivityReq
+	var resp roadshow.AddActivityResp
 	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
 	if err != nil {
 		br.Msg = "参数解析异常!"
@@ -209,6 +211,8 @@ func (this *CalendarController) Add() {
 	var productItemRai *company.CompanyProduct
 	roleTypeCode := sysUser.RoleTypeCode
 	//如果是权益销售、权益销售组长、权益管理员 添加的路演信息,做销售与共享销售信息关联查看
+
+	var isRaiRoadShow bool //是否属于权益的路演
 	if req.CompanyId > 0 && req.ActivityType == "路演" && (roleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER ||
 		roleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP || roleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN) {
 		productItemRai, err = company.GetCompanyProductByCompanyIdAndProductId(req.CompanyId, utils.COMPANY_PRODUCT_RAI_ID)
@@ -217,6 +221,21 @@ func (this *CalendarController) Add() {
 			br.ErrMsg = "获取客户信息失败, Err: " + err.Error()
 			return
 		}
+		points, addType, err := roadshowService.CheckAddRoadShowCompanyPoint(req.CompanyId, req.ResearcherList)
+		if err != nil {
+			br.Msg = "添加失败"
+			br.ErrMsg = "获取客户信息失败, Err: " + err.Error()
+			return
+		}
+		if addType == 3 {
+			br.Msg = "客户暂无路演权限,请开通对应行业权限或者购买【路演服务】权限"
+			br.ErrMsg = "客户暂无路演权限,请开通对应行业权限或者购买【路演服务】权限 "
+			return
+		}
+		isRaiRoadShow = true
+		resp.Points = points
+		resp.AddType = addType
+
 	}
 
 	rsCalendar := new(roadshow.RsCalendar)
@@ -335,11 +354,17 @@ func (this *CalendarController) Add() {
 		}
 	}
 
+	//13  给公司添加路演,对应专项调研扣点处理
+	if isRaiRoadShow {
+		go cygxService.SpecialActivityPointsBillRoadShow(int(rsCalendarId), sysUser.AdminId)
+	}
+
 	//if req.ActivityType == "公开会议" {
 	//	go roadshowService.SetPublicMeetingUnionCode()
 	//}
 	br.Ret = 200
 	br.Success = true
+	br.Data = resp
 	br.Msg = "保存成功"
 	br.IsAddLog = true
 }
@@ -379,6 +404,7 @@ func (this *CalendarController) Edit() {
 	}
 
 	var req roadshow.EditActivityReq
+	var resp roadshow.AddActivityResp
 	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
 	if err != nil {
 		br.Msg = "参数解析异常!"
@@ -627,6 +653,7 @@ func (this *CalendarController) Edit() {
 
 	//如果是权益客户,添加销售跟共享销售的信息
 	roleTypeCode := sysUser.RoleTypeCode
+	var isRaiRoadShow bool //是否属于权益的路演
 	//如果是权益销售、权益销售组长、权益管理员 添加的路演信息,做销售与共享销售信息关联查看
 	if req.CompanyId > 0 && req.ActivityType == "路演" && (roleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER ||
 		roleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP || roleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN) {
@@ -637,10 +664,25 @@ func (this *CalendarController) Edit() {
 			br.ErrMsg = "获取客户信息失败, Err: " + err.Error()
 			return
 		}
+		isRaiRoadShow = true
 		if productItemRai != nil {
 			calendarUpdateParams["seller_id"] = productItemRai.SellerId
 			calendarUpdateParams["share_seller_id"] = productItemRai.ShareSellerId
 		}
+		points, addType, err := roadshowService.CheckAddRoadShowCompanyPoint(req.CompanyId, req.ResearcherList)
+		if err != nil {
+			br.Msg = "添加失败"
+			br.ErrMsg = "获取客户信息失败, Err: " + err.Error()
+			return
+		}
+		if addType == 3 {
+			br.Msg = "客户暂无路演权限,请开通对应行业权限或者购买【路演服务】权限"
+			br.ErrMsg = "客户暂无路演权限,请开通对应行业权限或者购买【路演服务】权限 "
+			return
+		}
+		isRaiRoadShow = true
+		resp.Points = points
+		resp.AddType = addType
 	}
 
 	err = roadshow.UpdateRsCalendar(calendarWhereParams, calendarUpdateParams)
@@ -875,6 +917,10 @@ func (this *CalendarController) Edit() {
 			}(v.ResearcherId, req.RsCalendarId, int(rsCalendarResearcherId))
 		}
 	}
+	//13  给公司添加路演,对应专项调研扣点处理
+	if isRaiRoadShow {
+		go cygxService.SpecialActivityPointsBillRoadShow(req.RsCalendarId, sysUser.AdminId)
+	}
 
 	//for k, v := range req.ResearcherList {
 	//	rsCalendarResearcherItem, err := roadshow.GetRsCalendarResearcherById(req.RsCalendarResearcherId)
@@ -1051,6 +1097,7 @@ func (this *CalendarController) Edit() {
 	//}
 	br.Ret = 200
 	br.Success = true
+	br.Data = resp
 	br.Msg = "保存成功"
 	br.IsAddLog = true
 }
@@ -1882,6 +1929,12 @@ func (this *CalendarController) Delete() {
 		}
 	}
 
+	roleTypeCode := sysUser.RoleTypeCode
+	if rsCalendarItem.CompanyId > 0 && rsCalendarItem.ActivityType == "路演" && (roleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER ||
+		roleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP || roleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN) {
+		go cygxService.SpecialActivityPointsBillRoadShow(req.RsCalendarId, sysUser.AdminId)
+	}
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "删除成功"

+ 45 - 27
controllers/roadshow/report.go

@@ -202,7 +202,9 @@ func (this *CalendarController) ResearcherReportList() {
 	tmpAllMeetingNumMap := make(map[int]int)
 	tmpAllRoadShowNumMap := make(map[int]int)
 	tmpAllSalonNumMap := make(map[int]int)
-	tmpAllAskNumMap := make(map[int]int)
+	//tmpAllAskNumMap := make(map[int]int)
+	tmpAllAskTryOutNumMap := make(map[int]int)
+	tmpAllAskFormalNumMap := make(map[int]int)
 	for _, v := range group {
 		v.ResearcherList = groupMap[v.GroupId]
 		tmpGroupAdminReportRecord := make([]roadshow.AdminReportRecord, 0)
@@ -216,7 +218,8 @@ func (this *CalendarController) ResearcherReportList() {
 		tmpGroupMeetingNumMap := make(map[int]int)
 		tmpGroupRoadShowNumMap := make(map[int]int)
 		tmpGroupSalonMapNumMap := make(map[int]int)
-		tmpGroupAskMapNumMap := make(map[int]int)
+		tmpGroupAskTryOutMapNumMap := make(map[int]int)
+		tmpGroupAskFormalMapNumMap := make(map[int]int)
 		for _, researcher := range groupMap[v.GroupId] {
 			//组内研究员数据
 			//每个区间的数据
@@ -225,7 +228,7 @@ func (this *CalendarController) ResearcherReportList() {
 				startDateIndexList[index] = adminData.StartDate
 				endDateIndexList[index] = adminData.EndDate
 
-				var tmpTryOutNum, tmpFormalNum, tmpMeetingNum, tmpRoadShowNum, tmpSalonNum, tmpAskNum int
+				var tmpTryOutNum, tmpFormalNum, tmpMeetingNum, tmpRoadShowNum, tmpSalonNum, tmpAskTryOutNum, tmpAskFormalNum int
 				if num, ok := adminData.TryOutMap[researcher.AdminId]; ok {
 					tmpTryOutNum = num
 				}
@@ -242,19 +245,24 @@ func (this *CalendarController) ResearcherReportList() {
 					tmpSalonNum = num
 				}
 
-				if num, ok := adminData.AskMap[researcher.AdminId]; ok { //路演总次数
-					tmpAskNum = num
+				if num, ok := adminData.AskTryOutMap[researcher.AdminId]; ok { //路演总次数(试用)
+					tmpAskTryOutNum = num
+				}
+				if num, ok := adminData.AskFormalMap[researcher.AdminId]; ok { //路演总次数(正式)
+					tmpAskFormalNum = num
 				}
 
 				tmpAdminRsReportRecordNum := roadshow.RsReportRecordNum{
-					TryOutNum:   tmpTryOutNum,
-					FormalNum:   tmpFormalNum,
-					MeetingNum:  tmpMeetingNum,
-					RoadShowNum: tmpRoadShowNum,
-					SalonNum:    tmpSalonNum,
-					AskNum:      tmpAskNum,
-					StartDate:   adminData.StartDate,
-					EndDate:     adminData.EndDate,
+					TryOutNum:    tmpTryOutNum,
+					FormalNum:    tmpFormalNum,
+					MeetingNum:   tmpMeetingNum,
+					RoadShowNum:  tmpRoadShowNum,
+					SalonNum:     tmpSalonNum,
+					AskTryOutNum: tmpAskTryOutNum,
+					AskFormalNum: tmpAskFormalNum,
+					AskNum:       tmpAskTryOutNum + tmpAskFormalNum,
+					StartDate:    adminData.StartDate,
+					EndDate:      adminData.EndDate,
 				}
 				tmpAdminRsReportRecordNumList = append(tmpAdminRsReportRecordNumList, tmpAdminRsReportRecordNum)
 
@@ -274,15 +282,19 @@ func (this *CalendarController) ResearcherReportList() {
 				if _, ok := tmpGroupSalonMapNumMap[index]; !ok {
 					tmpGroupSalonMapNumMap[index] = 0
 				}
-				if _, ok := tmpGroupAskMapNumMap[index]; !ok {
-					tmpGroupAskMapNumMap[index] = 0
+				if _, ok := tmpGroupAskTryOutMapNumMap[index]; !ok {
+					tmpGroupAskTryOutMapNumMap[index] = 0
+				}
+				if _, ok := tmpGroupAskFormalMapNumMap[index]; !ok {
+					tmpGroupAskFormalMapNumMap[index] = 0
 				}
 				tmpGroupTryOutNumMap[index] += tmpTryOutNum
 				tmpGroupFormalNumMap[index] += tmpFormalNum
 				tmpGroupMeetingNumMap[index] += tmpMeetingNum
 				tmpGroupRoadShowNumMap[index] += tmpRoadShowNum
 				tmpGroupSalonMapNumMap[index] += tmpSalonNum
-				tmpGroupAskMapNumMap[index] += tmpAskNum
+				tmpGroupAskTryOutMapNumMap[index] += tmpAskTryOutNum
+				tmpGroupAskFormalMapNumMap[index] += tmpAskFormalNum
 
 				//总数据汇总
 				if _, ok := tmpAllTryOutNumMap[index]; !ok {
@@ -300,15 +312,20 @@ func (this *CalendarController) ResearcherReportList() {
 				if _, ok := tmpGroupSalonMapNumMap[index]; !ok {
 					tmpGroupSalonMapNumMap[index] = 0
 				}
-				if _, ok := tmpGroupAskMapNumMap[index]; !ok {
-					tmpGroupAskMapNumMap[index] = 0
+				if _, ok := tmpGroupAskTryOutMapNumMap[index]; !ok {
+					tmpGroupAskTryOutMapNumMap[index] = 0
 				}
+				if _, ok := tmpGroupAskFormalMapNumMap[index]; !ok {
+					tmpGroupAskFormalMapNumMap[index] = 0
+				}
+
 				tmpAllTryOutNumMap[index] += tmpTryOutNum
 				tmpAllFormalNumMap[index] += tmpFormalNum
 				tmpAllMeetingNumMap[index] += tmpMeetingNum
 				tmpAllRoadShowNumMap[index] += tmpRoadShowNum
 				tmpAllSalonNumMap[index] += tmpSalonNum
-				tmpAllAskNumMap[index] += tmpAskNum
+				tmpAllAskTryOutNumMap[index] += tmpAskTryOutNum
+				tmpAllAskFormalNumMap[index] += tmpAskFormalNum
 			}
 			tmpAdminReportRecord := roadshow.AdminReportRecord{
 				Name:                  researcher.RealName,
@@ -320,14 +337,15 @@ func (this *CalendarController) ResearcherReportList() {
 
 		for i := 0; i < len(tmpGroupMeetingNumMap); i++ {
 			tmpGroupRsReportRecordNum := roadshow.RsReportRecordNum{
-				TryOutNum:   tmpGroupTryOutNumMap[i],
-				FormalNum:   tmpGroupFormalNumMap[i],
-				MeetingNum:  tmpGroupMeetingNumMap[i],
-				RoadShowNum: tmpGroupRoadShowNumMap[i],
-				SalonNum:    tmpGroupSalonMapNumMap[i],
-				AskNum:      tmpGroupAskMapNumMap[i],
-				StartDate:   startDateIndexList[i],
-				EndDate:     endDateIndexList[i],
+				TryOutNum:    tmpGroupTryOutNumMap[i],
+				FormalNum:    tmpGroupFormalNumMap[i],
+				MeetingNum:   tmpGroupMeetingNumMap[i],
+				RoadShowNum:  tmpGroupRoadShowNumMap[i],
+				SalonNum:     tmpGroupSalonMapNumMap[i],
+				AskTryOutNum: tmpGroupAskTryOutMapNumMap[i],
+				AskFormalNum: tmpGroupAskFormalMapNumMap[i],
+				StartDate:    startDateIndexList[i],
+				EndDate:      endDateIndexList[i],
 			}
 			tmpGroupRsReportRecordNumList = append(tmpGroupRsReportRecordNumList, tmpGroupRsReportRecordNum)
 		}

+ 277 - 100
controllers/statistic/rai_data_summary.go

@@ -12,6 +12,7 @@ import (
 	"hongze/hz_crm_api/services"
 	cygxService "hongze/hz_crm_api/services/cygx"
 	"hongze/hz_crm_api/utils"
+	"sort"
 	"strconv"
 	"strings"
 	"time"
@@ -36,6 +37,8 @@ type StatisticRaiDataSummaryController struct {
 // @Param   ContractButtonType   query   string	  false       "开关类型,:`新签`,`续约`,`收入` 多个用英文逗号隔开, "
 // @Param   StartDate   query   string	  false       "开始时间 "
 // @Param   EndDate   query   string	  false       "结束时间 "
+// @Param   SortParam   query   string  false       "排序字段参数,用来排序的字段, 枚举值:根据列表表头对应参数"
+// @Param   SortType   query   string  true       "如何排序,是正序还是倒序,枚举值:`asc 正序`,`desc 倒叙`"
 // @Param   IsExport   query   bool  false       "是否导出excel,默认是false"
 // @Success 200 {object} statistic_report.RaiDataSummaryListResp
 // @router /rai_data_summary/list [get]
@@ -63,6 +66,8 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 	serverButton, _ := this.GetBool("ServerButton")
 	startDate := this.GetString("StartDate")
 	endDate := this.GetString("EndDate")
+	sortParam := this.GetString("SortParam")
+	sortType := this.GetString("SortType")
 
 	adminIdArr := strings.Split(adminId, ",")
 	serviceAdminIdArr := strings.Split(serviceAdminId, ",")
@@ -85,12 +90,23 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 	var pars []interface{}
 	var conditionEnSeller string // 手动禁用的销售
 
-	conditionEnSeller = " AND  real_name  NOT  IN  ('余晔', '于卓铭', '张怡', '王芳6') "
+	// 获取图片识别手机号的配置
+	crmConfig, err := company.GetConfigDetailByCode("rai_data_summary_seller")
+	if err != nil {
+		br.Msg = "获取配置失败"
+		br.ErrMsg = "获取配置失败"
+		br.IsSendEmail = false
+		return
+	}
+	//fmt.Println(crmConfig.ConfigValue)
+
+	conditionEnSeller = " AND  real_name  NOT  IN  ('余晔', '于卓铭', '张怡', '王芳6')  "
 	mapsellerDevelop := make(map[int]bool) // 开拓组销售Map
 	mapsellerService := make(map[int]bool) // 服务组销售Map
 	var sellerIds []string
 	var sellerServiceIds []string
-	condition = " AND role_type_code IN ('rai_seller','rai_group')    " + conditionEnSeller
+	condition = " AND role_type_code IN ('rai_seller','rai_group')    " + conditionEnSeller + " OR   admin_id  IN( " + crmConfig.ConfigValue + ") "
+
 	sellerListAll, err := system.GetSysUserItemsOrderByCreated(condition, pars)
 	if err != nil {
 		br.Msg = "获取管理账号失败"
@@ -113,6 +129,7 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 	if adminId != "" {
 		serviceAdminId = ""
 		condition += " AND  admin_id IN (" + adminId + ") "
+		condition += " OR  admin_id IN (" + adminId + ") "
 		sellerIds = make([]string, 0)
 	}
 	if serviceAdminId != "" {
@@ -164,7 +181,7 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 	//新签部分的数据
 	var conditionRai string
 	var parsRai []interface{}
-	conditionRai = " AND  a.product_id = 2  AND  a.status = 1  AND  a.start_date >= ?  AND  a.start_date <= ? AND a.rai_contract_type = '新签合同'  "
+	conditionRai = " AND  a.product_id = 2  AND  a.status = 1  AND  a.start_date >= ?  AND  a.start_date <= ? AND a.rai_contract_type = '新签合同'  AND a.contract_type != '打分1派点'  "
 	parsRai = append(parsRai, startDate, endDate)
 	listRaiData, err := statistic_report.GetRaiDataSummaryList(conditionRai, parsRai)
 	if err != nil {
@@ -181,7 +198,7 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 	//续约部分的数据
 	var conditionInherit string
 	var parsInherit []interface{}
-	conditionInherit = ` AND  a.product_id = 2  AND  a.status = 1  AND  a.inherit_end_date >= ?  AND  a.inherit_end_date <= ?  AND a.rai_contract_type = '续约合同'   AND  a.company_contract_id NOT IN (` + utils.GetOrmInReplace(len(companyContractIds)) + `) `
+	conditionInherit = ` AND  c.product_id = 2  AND  a.status = 1  AND  a.inherit_end_date >= ?  AND  a.inherit_end_date <= ?  AND a.rai_contract_type = '续约合同'   AND a.contract_type != '打分1派点'  AND  a.company_contract_id NOT IN (` + utils.GetOrmInReplace(len(companyContractIds)) + `) `
 	parsInherit = append(parsInherit, startDate, endDate, companyContractIds)
 	listInheritData, err := statistic_report.GetRaiDataSummaryInheritList(conditionInherit, parsInherit)
 	if err != nil {
@@ -193,7 +210,7 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 	//确认不续约、到期合同部分的数据
 	var conditionEnd string
 	var parsEnd []interface{}
-	conditionEnd = " AND  a.product_id = 2  AND  a.status = 1  AND  a.due_end_date >= ?  AND  a.due_end_date <= ? AND  a.end_date < ? "
+	conditionEnd = " AND  c.product_id = 2  AND  a.status = 1 AND a.contract_type != '打分1派点'  AND  a.due_end_date >= ?  AND  a.due_end_date <= ? AND  a.end_date < ? "
 	parsEnd = append(parsEnd, startDate, endDate, time.Now().Format(utils.FormatDate))
 	listEndData, err := statistic_report.GetRaiDataSummaryList(conditionEnd, parsEnd)
 	if err != nil {
@@ -205,8 +222,8 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 	var conditionConfirm string
 	var parsConfirm []interface{}
 	mapNoRenewedcompanyContractIds := make(map[int]bool) //已经确定未续约的合同ID
-	conditionConfirm = " AND company_ascribe_id != 9  "
-	companyConfirmList, err := company.GetCompanyContractNoRenewedAscribeList(conditionConfirm, parsConfirm, 0, 0)
+	conditionConfirm = "  AND a.company_ascribe_id != 9  AND b.contract_type != '打分1派点' "
+	companyConfirmList, err := company.GetCompanyContractNoRenewedAscribeListJoin(conditionConfirm, parsConfirm, 0, 0)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,GetCompanyNoRenewedAscribeList Err:" + err.Error()
@@ -253,6 +270,7 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 	var keyMapTtoal string
 	var keyMapTtoalServer string
 	var keyMapCompany string
+	var keyMapCompanyTotal string
 	var keyMapCompanyNo string
 	//var keyMapCompanyNoServer string
 	var keySigned string
@@ -396,6 +414,7 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 
 	//确认不续约、到期合同部分的数据
 	mapKeyMapCompanyEndData := make(map[string]bool)
+	mapKeyMapCompanyEndDataTotal := make(map[string]bool)
 	mapKeyMapCompanyNoData := make(map[string]bool)
 	//到期部分开拓组数据
 	for _, v := range listEndData {
@@ -409,6 +428,7 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 
 		keyMap = fmt.Sprint(yearStr, "_", v.SellerIdLast)
 		keyMapCompany = fmt.Sprint(yearStr, "_", v.SellerIdLast, "_CID_", v.CompanyId)
+		keyMapCompanyTotal = fmt.Sprint(yearStr, "_CID_", v.CompanyId)
 		keyMapCompanyNo = fmt.Sprint(yearStr, "_", v.SellerIdLast, "_CID_NO", v.CompanyId)
 		keyMapTtoal = fmt.Sprint(yearStr, "_Develop")
 
@@ -423,9 +443,12 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 		//一家公司同一个时间纬度,只统计一次
 		if !mapKeyMapCompanyEndData[keyMapCompany] {
 			mapExpiredContractCompanyNum[keyMap]++
-			mapExpiredContractCompanyNum[keyMapTtoal]++
 			mapKeyMapCompanyEndData[keyMapCompany] = true
 		}
+		if !mapKeyMapCompanyEndDataTotal[keyMapCompanyTotal] { //同一家共公司,在某个时段的多分合同下有不同的销售进行兼容
+			mapExpiredContractCompanyNum[keyMapTtoal]++
+			mapKeyMapCompanyEndDataTotal[keyMapCompanyTotal] = true
+		}
 
 		if mapNoRenewedcompanyContractIds[v.CompanyContractId] { // 确认不续约合同
 			confirmedNoRenewalContractMoney[keyMap] += v.Money
@@ -502,13 +525,14 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 		if !mapsellerDevelop[v.RaiSellerId] {
 			continue
 		}
+
 		yearStr := getYearStar(utils.StrDateToDate(v.InvoiceTime), dataType, isCustomizeDate)
 
 		keyMap = fmt.Sprint(yearStr, "_", v.RaiSellerId)
 		keyMapTtoal = fmt.Sprint(yearStr, "_Develop")
 
 		//开票记录
-		if v.InvoiceType == 1 {
+		if v.InvoiceType == 1 || v.InvoiceType == 3 {
 			mapInvoiceAmountMoney[keyMap] += v.Amount
 			mapInvoiceAmountMoney[keyMapTtoal] += v.Amount
 			if v.ContractType == 1 {
@@ -518,7 +542,7 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 		}
 
 		//到款记录
-		if v.InvoiceType == 2 {
+		if v.InvoiceType == 2 || v.InvoiceType == 4 {
 			mapPaymentAmountMoney[keyMap] += v.Amount
 			mapPaymentAmountMoney[keyMapTtoal] += v.Amount
 			if v.ContractType == 1 {
@@ -542,7 +566,7 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 		keyMapTtoal = fmt.Sprint(yearStr, "_Server_")
 
 		//开票记录
-		if v.InvoiceType == 1 {
+		if v.InvoiceType == 1 || v.InvoiceType == 3 {
 			mapInvoiceAmountMoney[keyMap] += v.Amount
 			mapInvoiceAmountMoney[keyMapTtoal] += v.Amount
 			if v.ContractType == 1 {
@@ -552,7 +576,7 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 		}
 
 		//到款记录
-		if v.InvoiceType == 2 {
+		if v.InvoiceType == 2 || v.InvoiceType == 4 {
 			mapPaymentAmountMoney[keyMap] += v.Amount
 			mapPaymentAmountMoney[keyMapTtoal] += v.Amount
 			if v.ContractType == 1 {
@@ -573,6 +597,10 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 		return
 	}
 	for _, v := range tryList {
+		sysUserId, _ := strconv.Atoi(v.SysUserId)
+		if !mapsellerService[sysUserId] && !mapsellerDevelop[sysUserId] {
+			continue
+		}
 
 		startDateTime := utils.StrTimeToTime(v.CreateTime)
 		monthNum := startDateTime.Month()
@@ -602,8 +630,8 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 		mapAddTrialNum[keyMap]++
 
 		//var keyMapTtoal string
-		sysUserId, _ := strconv.Atoi(v.SysUserId)
-		if sellerDevelopIds[sysUserId] == true {
+
+		if mapsellerDevelop[sysUserId] == true {
 			keyMapTtoal = fmt.Sprint(yearStr, "_Develop")
 		} else {
 			keyMapTtoal = fmt.Sprint(yearStr, "_Server_")
@@ -614,6 +642,9 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 	resp := new(statistic_report.RaiDataSummaryListResp)
 	var items []*statistic_report.RaiDataSummaryResp
 
+	mapSortDateService := make(map[int]float64)
+	mapSortDateDevelop := make(map[int]float64)
+
 	for i := startYear; i <= endYear; i++ {
 		for _, Dv := range dataTypeArr {
 			item := new(statistic_report.RaiDataSummaryResp)
@@ -624,6 +655,8 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 			}
 			keyMapTtoal = fmt.Sprint(item.DataType, "_Develop")
 			keyMapTtoalServer = fmt.Sprint(item.DataType, "_Server_")
+
+			var dataListDevelop []*statistic_report.RaiDataSummaryDetail
 			for _, vS := range sellerDevelop {
 				keyMap = fmt.Sprint(item.DataType, "_", vS.AdminId)
 				sellerItem := new(statistic_report.RaiDataSummaryDetail)
@@ -631,9 +664,9 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 				sellerIds = append(sellerIds, sellerItem.SellerId)
 				sellerItem.SellerName = vS.RealName
 				sellerItem.AddTrialCount = fmt.Sprint(mapAddTrialNum[keyMap])
-				sellerItem.NewContractData = fmt.Sprint(utils.SubFloatToString(mapNewContractMoney[keyMap], 2), " / ", mapNewContractNum[keyMap])             // 新签合同(金额/数量)-(数据)
-				sellerItem.ExpiredContractData = fmt.Sprint(utils.SubFloatToString(mapExpiredContractMoney[keyMap], 2), " / ", mapExpiredContractNum[keyMap]) //"到期合同(金额/数量)-(数据)"
-				sellerItem.RenewedContractData = fmt.Sprint(utils.SubFloatToString(mapRenewedContractMoney[keyMap], 2), " / ", mapRenewedContractNum[keyMap]) // "续约合同(金额/数量)-(数据)"
+				sellerItem.NewContractData = fmt.Sprint(utils.FormatNumberWithCommas(mapNewContractMoney[keyMap], 2), " / ", mapNewContractNum[keyMap])             // 新签合同(金额/数量)-(数据)
+				sellerItem.ExpiredContractData = fmt.Sprint(utils.FormatNumberWithCommas(mapExpiredContractMoney[keyMap], 2), " / ", mapExpiredContractNum[keyMap]) //"到期合同(金额/数量)-(数据)"
+				sellerItem.RenewedContractData = fmt.Sprint(utils.FormatNumberWithCommas(mapRenewedContractMoney[keyMap], 2), " / ", mapRenewedContractNum[keyMap]) // "续约合同(金额/数量)-(数据)"
 				var renewalRateMoey string
 				var renewalRateNum string
 				if mapRenewedContractMoney[keyMap] == 0 || mapExpiredContractMoney[keyMap] == 0 {
@@ -646,8 +679,8 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 				} else {
 					renewalRateNum = utils.SubFloatToString(float64(mapRenewedContractCompanyNum[keyMap])/float64(mapExpiredContractCompanyNum[keyMap])*100, 2) + "%"
 				}
-				sellerItem.RenewalRateData = fmt.Sprint(renewalRateMoey, " / ", renewalRateNum)                                                                                          //"续约率(金额/数量)-(数据)"
-				sellerItem.ConfirmedNoRenewalContractData = fmt.Sprint(utils.SubFloatToString(confirmedNoRenewalContractMoney[keyMap], 2), " / ", confirmedNoRenewalContractNum[keyMap]) //"确认不续约合同(金额/数量)-(数据)"
+				sellerItem.RenewalRateData = fmt.Sprint(renewalRateMoey, " / ", renewalRateNum)                                                                                                //"续约率(金额/数量)-(数据)"
+				sellerItem.ConfirmedNoRenewalContractData = fmt.Sprint(utils.FormatNumberWithCommas(confirmedNoRenewalContractMoney[keyMap], 2), " / ", confirmedNoRenewalContractNum[keyMap]) //"确认不续约合同(金额/数量)-(数据)"
 
 				var confirmNonRenewalRateMoey string
 				var confirmNonRenewalRateNum string
@@ -667,31 +700,83 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 				if mapSignedClientNum[keyMap] == 0 || mapSignedClientMoney[keyMap] == 0 {
 					sellerItem.AverageRevenueCount = "0"
 				} else {
-					sellerItem.AverageRevenueCount = utils.SubFloatToString(mapSignedClientMoney[keyMap]/float64(mapSignedClientNum[keyMap]), 2) //客单价
+					sellerItem.AverageRevenueCount = utils.FormatNumberWithCommas(mapSignedClientMoney[keyMap]/float64(mapSignedClientNum[keyMap]), 2) //客单价
 				}
 
-				sellerItem.InvoiceAmountCount = utils.SubFloatToString(mapInvoiceAmountMoney[keyMap], 2)   //"开票金额-(数据)"
-				sellerItem.PaymentReceivedCount = utils.SubFloatToString(mapPaymentAmountMoney[keyMap], 2) //"开票金额-(数据)"
+				sellerItem.InvoiceAmountCount = utils.FormatNumberWithCommas(mapInvoiceAmountMoney[keyMap], 2)   //"开票金额-(数据)"
+				sellerItem.PaymentReceivedCount = utils.FormatNumberWithCommas(mapPaymentAmountMoney[keyMap], 2) //"开票金额-(数据)"
 				if mapInvoiceAmountMoney[keyMap] == 0 || mapPaymentAmountMoney[keyMap] == 0 {
 					sellerItem.UnpaidRatioCount = "0%"
 				} else {
 					sellerItem.UnpaidRatioCount = utils.SubFloatToString((mapInvoiceAmountMoney[keyMap]-mapPaymentAmountMoney[keyMap])/mapInvoiceAmountMoney[keyMap]*100, 2) + "%" //"未到款比例-(数据)"
 				}
-				sellerItem.NewCustomerInvoicingCount = utils.SubFloatToString(mapNewCustomerInvoicingMoney[keyMap], 2)               // "新客开票-(数据)"
-				sellerItem.NewCustomerPaymentsReceivedCount = utils.SubFloatToString(mapNewCustomerPaymentsReceivedMoney[keyMap], 2) // "新客到款-(数据)"
+				sellerItem.NewCustomerInvoicingCount = utils.FormatNumberWithCommas(mapNewCustomerInvoicingMoney[keyMap], 2)               // "新客开票-(数据)"
+				sellerItem.NewCustomerPaymentsReceivedCount = utils.FormatNumberWithCommas(mapNewCustomerPaymentsReceivedMoney[keyMap], 2) // "新客到款-(数据)"
 				if developButton || serverButton || adminId != "" {
 					item.DataList = append(item.DataList, sellerItem)
+					dataListDevelop = append(dataListDevelop, sellerItem)
+				}
+
+				//处理要排序的值
+				switch sortParam {
+				case "AddTrialCount": //新增试用
+					mapSortDateDevelop[vS.AdminId] = mapAddTrialNum[keyMap]
+				case "NewContractData": //新签合同
+					mapSortDateDevelop[vS.AdminId] = mapNewContractMoney[keyMap]
+				case "ExpiredContractData": //到期合同
+					mapSortDateDevelop[vS.AdminId] = mapExpiredContractMoney[keyMap]
+				case "RenewedContractData": //续约合同
+					mapSortDateDevelop[vS.AdminId] = mapRenewedContractMoney[keyMap]
+				case "RenewalRateData": //续约率
+					if mapRenewedContractMoney[keyMap] == 0 || mapExpiredContractMoney[keyMap] == 0 {
+						mapSortDateDevelop[vS.AdminId] = 0
+					} else {
+						mapSortDateDevelop[vS.AdminId] = mapRenewedContractMoney[keyMap] / mapExpiredContractMoney[keyMap]
+					}
+				case "ConfirmedNoRenewalContractData": //确认不续约合同
+					mapSortDateDevelop[vS.AdminId] = confirmedNoRenewalContractMoney[keyMap]
+				case "ConfirmNonRenewalRateData": //确认不续约率
+					if confirmedNoRenewalContractMoney[keyMap] == 0 || mapExpiredContractMoney[keyMap] == 0 {
+						mapSortDateDevelop[vS.AdminId] = 0
+					} else {
+						mapSortDateDevelop[vS.AdminId] = confirmedNoRenewalContractMoney[keyMap] / mapExpiredContractMoney[keyMap]
+					}
+				case "SignedClientCount": //签约客户数量
+					mapSortDateDevelop[vS.AdminId] = float64(mapSignedClientNum[keyMap])
+				case "AverageRevenueCount": //客单价
+					if mapSignedClientNum[keyMap] == 0 || mapSignedClientMoney[keyMap] == 0 {
+						mapSortDateDevelop[vS.AdminId] = 0
+					} else {
+						mapSortDateDevelop[vS.AdminId] = mapSignedClientMoney[keyMap] / float64(mapSignedClientNum[keyMap])
+					}
+				case "InvoiceAmountCount": //开票金额
+					mapSortDateDevelop[vS.AdminId] = mapInvoiceAmountMoney[keyMap]
+				case "PaymentReceivedCount": //到款金额
+					mapSortDateDevelop[vS.AdminId] = mapPaymentAmountMoney[keyMap]
+				case "UnpaidRatioCount": //未到款比例
+					if mapInvoiceAmountMoney[keyMap] == 0 || mapPaymentAmountMoney[keyMap] == 0 {
+						mapSortDateDevelop[vS.AdminId] = 0
+					} else {
+						mapSortDateDevelop[vS.AdminId] = (mapInvoiceAmountMoney[keyMap] - mapPaymentAmountMoney[keyMap]) / mapInvoiceAmountMoney[keyMap]
+					}
+				case "NewCustomerInvoicingCount": //新开票金额
+					mapSortDateDevelop[vS.AdminId] = mapNewCustomerInvoicingMoney[keyMap]
+				case "NewCustomerPaymentsReceivedCount": //新客到款
+					mapSortDateDevelop[vS.AdminId] = mapNewCustomerPaymentsReceivedMoney[keyMap]
 				}
 			}
+			if sortType != "" && sortParam != "" && len(mapSortDateDevelop) > 0 {
+				item.DataList = handleMapSortDate(mapSortDateDevelop, dataListDevelop, sortType)
+			}
 
 			if len(sellerDevelop) > 0 && adminId == "" {
 				sellerItem := new(statistic_report.RaiDataSummaryDetail)
 				sellerItem.SellerId = strings.Join(sellerIds, ",")
 				sellerItem.SellerName = "开拓组合计"
 				sellerItem.AddTrialCount = fmt.Sprint(mapAddTrialNum[keyMapTtoal])
-				sellerItem.NewContractData = fmt.Sprint(utils.SubFloatToString(mapNewContractMoney[keyMapTtoal], 2), " / ", mapNewContractNum[keyMapTtoal])             // 新签合同(金额/数量)-(数据)
-				sellerItem.ExpiredContractData = fmt.Sprint(utils.SubFloatToString(mapExpiredContractMoney[keyMapTtoal], 2), " / ", mapExpiredContractNum[keyMapTtoal]) //"到期合同(金额/数量)-(数据)"
-				sellerItem.RenewedContractData = fmt.Sprint(utils.SubFloatToString(mapRenewedContractMoney[keyMapTtoal], 2), " / ", mapRenewedContractNum[keyMapTtoal]) // "续约合同(金额/数量)-(数据)"
+				sellerItem.NewContractData = fmt.Sprint(utils.FormatNumberWithCommas(mapNewContractMoney[keyMapTtoal], 2), " / ", mapNewContractNum[keyMapTtoal])             // 新签合同(金额/数量)-(数据)
+				sellerItem.ExpiredContractData = fmt.Sprint(utils.FormatNumberWithCommas(mapExpiredContractMoney[keyMapTtoal], 2), " / ", mapExpiredContractNum[keyMapTtoal]) //"到期合同(金额/数量)-(数据)"
+				sellerItem.RenewedContractData = fmt.Sprint(utils.FormatNumberWithCommas(mapRenewedContractMoney[keyMapTtoal], 2), " / ", mapRenewedContractNum[keyMapTtoal]) // "续约合同(金额/数量)-(数据)"
 				var renewalRateMoey string
 				var renewalRateNum string
 				if mapRenewedContractMoney[keyMapTtoal] == 0 || mapExpiredContractMoney[keyMapTtoal] == 0 {
@@ -704,8 +789,8 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 				} else {
 					renewalRateNum = utils.SubFloatToString(float64(mapRenewedContractCompanyNum[keyMapTtoal])/float64(mapExpiredContractCompanyNum[keyMapTtoal])*100, 2) + "%"
 				}
-				sellerItem.RenewalRateData = fmt.Sprint(renewalRateMoey, " / ", renewalRateNum)                                                                                                    //"续约率(金额/数量)-(数据)"
-				sellerItem.ConfirmedNoRenewalContractData = fmt.Sprint(utils.SubFloatToString(confirmedNoRenewalContractMoney[keyMapTtoal], 2), " / ", confirmedNoRenewalContractNum[keyMapTtoal]) //"确认不续约合同(金额/数量)-(数据)"
+				sellerItem.RenewalRateData = fmt.Sprint(renewalRateMoey, " / ", renewalRateNum)                                                                                                          //"续约率(金额/数量)-(数据)"
+				sellerItem.ConfirmedNoRenewalContractData = fmt.Sprint(utils.FormatNumberWithCommas(confirmedNoRenewalContractMoney[keyMapTtoal], 2), " / ", confirmedNoRenewalContractNum[keyMapTtoal]) //"确认不续约合同(金额/数量)-(数据)"
 
 				var confirmNonRenewalRateMoey string
 				var confirmNonRenewalRateNum string
@@ -725,21 +810,22 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 				if mapSignedClientNum[keyMapTtoal] == 0 || mapSignedClientMoney[keyMapTtoal] == 0 {
 					sellerItem.AverageRevenueCount = "0"
 				} else {
-					sellerItem.AverageRevenueCount = utils.SubFloatToString(mapSignedClientMoney[keyMapTtoal]/float64(mapSignedClientNum[keyMapTtoal]), 2) //客单价
+					sellerItem.AverageRevenueCount = utils.FormatNumberWithCommas(mapSignedClientMoney[keyMapTtoal]/float64(mapSignedClientNum[keyMapTtoal]), 2) //客单价
 				}
 
-				sellerItem.InvoiceAmountCount = utils.SubFloatToString(mapInvoiceAmountMoney[keyMapTtoal], 2)   //"开票金额-(数据)"
-				sellerItem.PaymentReceivedCount = utils.SubFloatToString(mapPaymentAmountMoney[keyMapTtoal], 2) //"开票金额-(数据)"
+				sellerItem.InvoiceAmountCount = utils.FormatNumberWithCommas(mapInvoiceAmountMoney[keyMapTtoal], 2)   //"开票金额-(数据)"
+				sellerItem.PaymentReceivedCount = utils.FormatNumberWithCommas(mapPaymentAmountMoney[keyMapTtoal], 2) //"开票金额-(数据)"
 				if mapInvoiceAmountMoney[keyMapTtoal] == 0 || mapPaymentAmountMoney[keyMapTtoal] == 0 {
 					sellerItem.UnpaidRatioCount = "0%"
 				} else {
 					sellerItem.UnpaidRatioCount = utils.SubFloatToString((mapInvoiceAmountMoney[keyMapTtoal]-mapPaymentAmountMoney[keyMapTtoal])/mapInvoiceAmountMoney[keyMapTtoal]*100, 2) + "%" //"未到款比例-(数据)"
 				}
-				sellerItem.NewCustomerInvoicingCount = utils.SubFloatToString(mapNewCustomerInvoicingMoney[keyMapTtoal], 2)               // "新客开票-(数据)"
-				sellerItem.NewCustomerPaymentsReceivedCount = utils.SubFloatToString(mapNewCustomerPaymentsReceivedMoney[keyMapTtoal], 2) // "新客到款-(数据)"
+				sellerItem.NewCustomerInvoicingCount = utils.FormatNumberWithCommas(mapNewCustomerInvoicingMoney[keyMapTtoal], 2)               // "新客开票-(数据)"
+				sellerItem.NewCustomerPaymentsReceivedCount = utils.FormatNumberWithCommas(mapNewCustomerPaymentsReceivedMoney[keyMapTtoal], 2) // "新客到款-(数据)"
 				item.DataList = append(item.DataList, sellerItem)
 			}
 
+			var dataListService []*statistic_report.RaiDataSummaryDetail
 			for _, vS := range sellerService {
 				keyMap = fmt.Sprint(item.DataType, "_Server_", vS.AdminId)
 				sellerItem := new(statistic_report.RaiDataSummaryDetail)
@@ -748,9 +834,9 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 				sellerServiceIds = append(sellerServiceIds, sellerItem.SellerId)
 				sellerItem.SellerName = vS.RealName
 				sellerItem.AddTrialCount = fmt.Sprint(mapAddTrialNum[keyMap])
-				sellerItem.NewContractData = fmt.Sprint(utils.SubFloatToString(mapNewContractMoneyServer[keyMap], 2), " / ", mapNewContractNumServer[keyMap])             // 新签合同(金额/数量)-(数据)
-				sellerItem.ExpiredContractData = fmt.Sprint(utils.SubFloatToString(mapExpiredContractMoneyServer[keyMap], 2), " / ", mapExpiredContractNumServer[keyMap]) //"到期合同(金额/数量)-(数据)"
-				sellerItem.RenewedContractData = fmt.Sprint(utils.SubFloatToString(mapRenewedContractMoneyServer[keyMap], 2), " / ", mapRenewedContractNumServer[keyMap]) // "续约合同(金额/数量)-(数据)"
+				sellerItem.NewContractData = fmt.Sprint(utils.FormatNumberWithCommas(mapNewContractMoneyServer[keyMap], 2), " / ", mapNewContractNumServer[keyMap])             // 新签合同(金额/数量)-(数据)
+				sellerItem.ExpiredContractData = fmt.Sprint(utils.FormatNumberWithCommas(mapExpiredContractMoneyServer[keyMap], 2), " / ", mapExpiredContractNumServer[keyMap]) //"到期合同(金额/数量)-(数据)"
+				sellerItem.RenewedContractData = fmt.Sprint(utils.FormatNumberWithCommas(mapRenewedContractMoneyServer[keyMap], 2), " / ", mapRenewedContractNumServer[keyMap]) // "续约合同(金额/数量)-(数据)"
 				var renewalRateMoey string
 				var renewalRateNum string
 				if mapRenewedContractMoneyServer[keyMap] == 0 || mapExpiredContractMoneyServer[keyMap] == 0 {
@@ -763,8 +849,8 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 				} else {
 					renewalRateNum = utils.SubFloatToString(float64(mapRenewedContractCompanyNumServer[keyMap])/float64(mapExpiredContractCompanyNumServer[keyMap])*100, 2) + "%"
 				}
-				sellerItem.RenewalRateData = fmt.Sprint(renewalRateMoey, " / ", renewalRateNum)                                                                                                      //"续约率(金额/数量)-(数据)"
-				sellerItem.ConfirmedNoRenewalContractData = fmt.Sprint(utils.SubFloatToString(confirmedNoRenewalContractMoneyServer[keyMap], 2), " / ", confirmedNoRenewalContractNumServer[keyMap]) //"确认不续约合同(金额/数量)-(数据)"
+				sellerItem.RenewalRateData = fmt.Sprint(renewalRateMoey, " / ", renewalRateNum)                                                                                                            //"续约率(金额/数量)-(数据)"
+				sellerItem.ConfirmedNoRenewalContractData = fmt.Sprint(utils.FormatNumberWithCommas(confirmedNoRenewalContractMoneyServer[keyMap], 2), " / ", confirmedNoRenewalContractNumServer[keyMap]) //"确认不续约合同(金额/数量)-(数据)"
 
 				var confirmNonRenewalRateMoey string
 				var confirmNonRenewalRateNum string
@@ -784,31 +870,84 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 				if mapSignedClientNumServer[keyMap] == 0 || mapSignedClientMoneyServer[keyMap] == 0 {
 					sellerItem.AverageRevenueCount = "0"
 				} else {
-					sellerItem.AverageRevenueCount = utils.SubFloatToString(mapSignedClientMoneyServer[keyMap]/float64(mapSignedClientNumServer[keyMap]), 2) //客单价
+					sellerItem.AverageRevenueCount = utils.FormatNumberWithCommas(mapSignedClientMoneyServer[keyMap]/float64(mapSignedClientNumServer[keyMap]), 2) //客单价
 				}
 
-				sellerItem.InvoiceAmountCount = utils.SubFloatToString(mapInvoiceAmountMoney[keyMap], 2)   //"开票金额-(数据)"
-				sellerItem.PaymentReceivedCount = utils.SubFloatToString(mapPaymentAmountMoney[keyMap], 2) //"开票金额-(数据)"
+				sellerItem.InvoiceAmountCount = utils.FormatNumberWithCommas(mapInvoiceAmountMoney[keyMap], 2)   //"开票金额-(数据)"
+				sellerItem.PaymentReceivedCount = utils.FormatNumberWithCommas(mapPaymentAmountMoney[keyMap], 2) //"开票金额-(数据)"
 				if mapInvoiceAmountMoney[keyMap] == 0 || mapPaymentAmountMoney[keyMap] == 0 {
 					sellerItem.UnpaidRatioCount = "0%"
 				} else {
 					sellerItem.UnpaidRatioCount = utils.SubFloatToString((mapInvoiceAmountMoney[keyMap]-mapPaymentAmountMoney[keyMap])/mapInvoiceAmountMoney[keyMap]*100, 2) + "%" //"未到款比例-(数据)"
 				}
-				sellerItem.NewCustomerInvoicingCount = utils.SubFloatToString(mapNewCustomerInvoicingMoney[keyMap], 2)               // "新客开票-(数据)"
-				sellerItem.NewCustomerPaymentsReceivedCount = utils.SubFloatToString(mapNewCustomerPaymentsReceivedMoney[keyMap], 2) // "新客到款-(数据)"
+				sellerItem.NewCustomerInvoicingCount = utils.FormatNumberWithCommas(mapNewCustomerInvoicingMoney[keyMap], 2)               // "新客开票-(数据)"
+				sellerItem.NewCustomerPaymentsReceivedCount = utils.FormatNumberWithCommas(mapNewCustomerPaymentsReceivedMoney[keyMap], 2) // "新客到款-(数据)"
 				if developButton || serverButton || serviceAdminId != "" {
 					item.DataList = append(item.DataList, sellerItem)
+					dataListService = append(dataListService, sellerItem)
+				}
+
+				//处理要排序的值
+				switch sortParam {
+				case "AddTrialCount": //新增试用
+					mapSortDateService[vS.AdminId] = mapAddTrialNum[keyMap]
+				case "NewContractData": //新签合同
+					mapSortDateService[vS.AdminId] = mapNewContractMoneyServer[keyMap]
+				case "ExpiredContractData": //到期合同
+					mapSortDateService[vS.AdminId] = mapExpiredContractMoneyServer[keyMap]
+				case "RenewedContractData": //续约合同
+					mapSortDateService[vS.AdminId] = mapRenewedContractMoneyServer[keyMap]
+				case "RenewalRateData": //续约率
+					if mapRenewedContractMoneyServer[keyMap] == 0 || mapExpiredContractMoneyServer[keyMap] == 0 {
+						mapSortDateService[vS.AdminId] = 0
+					} else {
+						mapSortDateService[vS.AdminId] = mapRenewedContractMoneyServer[keyMap] / mapExpiredContractMoneyServer[keyMap]
+					}
+				case "ConfirmedNoRenewalContractData": //确认不续约合同
+					mapSortDateService[vS.AdminId] = confirmedNoRenewalContractMoneyServer[keyMap]
+				case "ConfirmNonRenewalRateData": //确认不续约率
+					if confirmedNoRenewalContractMoneyServer[keyMap] == 0 || mapExpiredContractMoneyServer[keyMap] == 0 {
+						mapSortDateService[vS.AdminId] = 0
+					} else {
+						mapSortDateService[vS.AdminId] = confirmedNoRenewalContractMoneyServer[keyMap] / mapExpiredContractMoneyServer[keyMap]
+					}
+				case "SignedClientCount": //签约客户数量
+					mapSortDateService[vS.AdminId] = float64(mapSignedClientNumServer[keyMap])
+				case "AverageRevenueCount": //客单价
+					if mapSignedClientNumServer[keyMap] == 0 || mapSignedClientMoneyServer[keyMap] == 0 {
+						mapSortDateService[vS.AdminId] = 0
+					} else {
+						mapSortDateService[vS.AdminId] = mapSignedClientMoneyServer[keyMap] / float64(mapSignedClientNumServer[keyMap])
+					}
+				case "InvoiceAmountCount": //开票金额
+					mapSortDateService[vS.AdminId] = mapInvoiceAmountMoney[keyMap]
+				case "PaymentReceivedCount": //到款金额
+					mapSortDateService[vS.AdminId] = mapPaymentAmountMoney[keyMap]
+				case "UnpaidRatioCount": //未到款比例
+					if mapInvoiceAmountMoney[keyMap] == 0 || mapPaymentAmountMoney[keyMap] == 0 {
+						mapSortDateService[vS.AdminId] = 0
+					} else {
+						mapSortDateService[vS.AdminId] = (mapInvoiceAmountMoney[keyMap] - mapPaymentAmountMoney[keyMap]) / mapInvoiceAmountMoney[keyMap]
+					}
+				case "NewCustomerInvoicingCount": //新开票金额
+					mapSortDateService[vS.AdminId] = mapNewCustomerInvoicingMoney[keyMap]
+				case "NewCustomerPaymentsReceivedCount": //新客到款
+					mapSortDateService[vS.AdminId] = mapNewCustomerPaymentsReceivedMoney[keyMap]
 				}
 			}
+			if sortType != "" && sortParam != "" && len(mapSortDateService) > 0 {
+				item.DataList = handleMapSortDate(mapSortDateService, dataListService, sortType)
+			}
+
 			if len(sellerService) > 0 && serviceAdminId == "" {
 				sellerItem := new(statistic_report.RaiDataSummaryDetail)
 				sellerItem.IsServerSeller = true
 				sellerItem.SellerId = strings.Join(sellerServiceIds, ",")
 				sellerItem.SellerName = "服务组合计"
 				sellerItem.AddTrialCount = fmt.Sprint(mapAddTrialNum[keyMapTtoalServer])
-				sellerItem.NewContractData = fmt.Sprint(utils.SubFloatToString(mapNewContractMoneyServer[keyMapTtoalServer], 2), " / ", mapNewContractNumServer[keyMapTtoalServer])             // 新签合同(金额/数量)-(数据)
-				sellerItem.ExpiredContractData = fmt.Sprint(utils.SubFloatToString(mapExpiredContractMoneyServer[keyMapTtoalServer], 2), " / ", mapExpiredContractNumServer[keyMapTtoalServer]) //"到期合同(金额/数量)-(数据)"
-				sellerItem.RenewedContractData = fmt.Sprint(utils.SubFloatToString(mapRenewedContractMoneyServer[keyMapTtoalServer], 2), " / ", mapRenewedContractNumServer[keyMapTtoalServer]) // "续约合同(金额/数量)-(数据)"
+				sellerItem.NewContractData = fmt.Sprint(utils.FormatNumberWithCommas(mapNewContractMoneyServer[keyMapTtoalServer], 2), " / ", mapNewContractNumServer[keyMapTtoalServer])             // 新签合同(金额/数量)-(数据)
+				sellerItem.ExpiredContractData = fmt.Sprint(utils.FormatNumberWithCommas(mapExpiredContractMoneyServer[keyMapTtoalServer], 2), " / ", mapExpiredContractNumServer[keyMapTtoalServer]) //"到期合同(金额/数量)-(数据)"
+				sellerItem.RenewedContractData = fmt.Sprint(utils.FormatNumberWithCommas(mapRenewedContractMoneyServer[keyMapTtoalServer], 2), " / ", mapRenewedContractNumServer[keyMapTtoalServer]) // "续约合同(金额/数量)-(数据)"
 				var renewalRateMoey string
 				var renewalRateNum string
 				if mapRenewedContractMoneyServer[keyMapTtoalServer] == 0 || mapExpiredContractMoneyServer[keyMapTtoalServer] == 0 {
@@ -821,8 +960,8 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 				} else {
 					renewalRateNum = utils.SubFloatToString(float64(mapRenewedContractCompanyNumServer[keyMapTtoalServer])/float64(mapExpiredContractCompanyNumServer[keyMapTtoalServer])*100, 2) + "%"
 				}
-				sellerItem.RenewalRateData = fmt.Sprint(renewalRateMoey, " / ", renewalRateNum)                                                                                                                            //"续约率(金额/数量)-(数据)"
-				sellerItem.ConfirmedNoRenewalContractData = fmt.Sprint(utils.SubFloatToString(confirmedNoRenewalContractMoneyServer[keyMapTtoalServer], 2), " / ", confirmedNoRenewalContractNumServer[keyMapTtoalServer]) //"确认不续约合同(金额/数量)-(数据)"
+				sellerItem.RenewalRateData = fmt.Sprint(renewalRateMoey, " / ", renewalRateNum)                                                                                                                                  //"续约率(金额/数量)-(数据)"
+				sellerItem.ConfirmedNoRenewalContractData = fmt.Sprint(utils.FormatNumberWithCommas(confirmedNoRenewalContractMoneyServer[keyMapTtoalServer], 2), " / ", confirmedNoRenewalContractNumServer[keyMapTtoalServer]) //"确认不续约合同(金额/数量)-(数据)"
 
 				var confirmNonRenewalRateMoey string
 				var confirmNonRenewalRateNum string
@@ -842,18 +981,18 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 				if mapSignedClientNumServer[keyMapTtoalServer] == 0 || mapSignedClientMoneyServer[keyMapTtoalServer] == 0 {
 					sellerItem.AverageRevenueCount = "0"
 				} else {
-					sellerItem.AverageRevenueCount = utils.SubFloatToString(mapSignedClientMoneyServer[keyMapTtoalServer]/float64(mapSignedClientNumServer[keyMapTtoalServer]), 2) //客单价
+					sellerItem.AverageRevenueCount = utils.FormatNumberWithCommas(mapSignedClientMoneyServer[keyMapTtoalServer]/float64(mapSignedClientNumServer[keyMapTtoalServer]), 2) //客单价
 				}
 
-				sellerItem.InvoiceAmountCount = utils.SubFloatToString(mapInvoiceAmountMoney[keyMapTtoalServer], 2)   //"开票金额-(数据)"
-				sellerItem.PaymentReceivedCount = utils.SubFloatToString(mapPaymentAmountMoney[keyMapTtoalServer], 2) //"开票金额-(数据)"
+				sellerItem.InvoiceAmountCount = utils.FormatNumberWithCommas(mapInvoiceAmountMoney[keyMapTtoalServer], 2)   //"开票金额-(数据)"
+				sellerItem.PaymentReceivedCount = utils.FormatNumberWithCommas(mapPaymentAmountMoney[keyMapTtoalServer], 2) //"开票金额-(数据)"
 				if mapInvoiceAmountMoney[keyMapTtoalServer] == 0 || mapPaymentAmountMoney[keyMapTtoalServer] == 0 {
 					sellerItem.UnpaidRatioCount = "0%"
 				} else {
 					sellerItem.UnpaidRatioCount = utils.SubFloatToString((mapInvoiceAmountMoney[keyMapTtoalServer]-mapPaymentAmountMoney[keyMapTtoalServer])/mapInvoiceAmountMoney[keyMapTtoalServer]*100, 2) + "%" //"未到款比例-(数据)"
 				}
-				sellerItem.NewCustomerInvoicingCount = utils.SubFloatToString(mapNewCustomerInvoicingMoney[keyMapTtoalServer], 2)               // "新客开票-(数据)"
-				sellerItem.NewCustomerPaymentsReceivedCount = utils.SubFloatToString(mapNewCustomerPaymentsReceivedMoney[keyMapTtoalServer], 2) // "新客到款-(数据)"
+				sellerItem.NewCustomerInvoicingCount = utils.FormatNumberWithCommas(mapNewCustomerInvoicingMoney[keyMapTtoalServer], 2)               // "新客开票-(数据)"
+				sellerItem.NewCustomerPaymentsReceivedCount = utils.FormatNumberWithCommas(mapNewCustomerPaymentsReceivedMoney[keyMapTtoalServer], 2) // "新客到款-(数据)"
 				item.DataList = append(item.DataList, sellerItem)
 			}
 			items = append(items, item)
@@ -866,6 +1005,43 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 	br.Data = resp
 }
 
+// 排序处理
+func handleMapSortDate(mapSort map[int]float64, dataList []*statistic_report.RaiDataSummaryDetail, orderType string) (dataListResp []*statistic_report.RaiDataSummaryDetail) {
+	type kvSort struct {
+		AdminIdKey int
+		AdminValue float64
+	}
+
+	var adminSlice []kvSort
+	for k, v := range mapSort {
+		adminSlice = append(adminSlice, kvSort{k, v})
+	}
+
+	if orderType == "asc" {
+		// 2. 按Value从小到大排序
+		sort.Slice(adminSlice, func(i, j int) bool {
+			return adminSlice[i].AdminValue < adminSlice[j].AdminValue // "<" 表示升序
+		})
+	} else {
+		// 2.1 按Value从大到小排序
+		sort.Slice(adminSlice, func(i, j int) bool {
+			return adminSlice[i].AdminValue > adminSlice[j].AdminValue // ">" 表示降序
+		})
+	}
+
+	// 3. 输出排序结果
+	for _, vsort := range adminSlice {
+		//fmt.Println("vsort.AdminIdKey", vsort.AdminIdKey, "vsort.AdminValue", vsort.AdminValue)
+		for _, vDate := range dataList {
+			if vDate.SellerId == strconv.Itoa(vsort.AdminIdKey) {
+				dataListResp = append(dataListResp, vDate)
+			}
+		}
+	}
+	//fmt.Println("dataListResp", dataListResp)
+	return
+}
+
 // MergeCompanyList
 // @Title 权益数据汇总弹窗详情
 // @Description 权益数据汇总弹窗详情接口
@@ -955,7 +1131,7 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryDetail() {
 		if sellerId != "" {
 			conditionNew += ` AND a.seller_id_init IN (` + sellerId + `) `
 		}
-		conditionNew += " AND  a.product_id = 2  AND  a.status = 1  AND  a.start_date >= ?  AND  a.start_date <= ? AND a.rai_contract_type = '新签合同'  "
+		conditionNew += " AND  a.product_id = 2  AND  a.status = 1  AND  a.start_date >= ?  AND  a.start_date <= ? AND a.rai_contract_type = '新签合同'  AND a.contract_type != '打分1派点' "
 		parsNew = append(parsNew, startDate, endDate)
 		listNewData, err := statistic_report.GetRaiDataSummaryList(conditionNew, parsNew)
 		if err != nil {
@@ -964,7 +1140,7 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryDetail() {
 			return
 		}
 		for _, v := range listNewData {
-			companyContractIdsNew = append(companyContractIdsNew, v.CompanyId)
+			companyContractIdsNew = append(companyContractIdsNew, v.CompanyContractId)
 		}
 	}
 	companyContractIdsNew = append(companyContractIdsNew, 0)
@@ -1022,7 +1198,7 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryDetail() {
 
 		}
 
-		condition += ` AND  a.status = 1  AND a.start_date >= ?  AND a.start_date <= ? 	AND a.product_id = 2   `
+		condition += ` AND  a.status = 1  AND a.start_date >= ?  AND a.start_date <= ? 	AND a.product_id = 2   AND a.contract_type != '打分1派点' `
 		pars = append(pars, startDate, endDate)
 		condition += `  AND a.rai_contract_type = ? `
 		pars = append(pars, "新签合同")
@@ -1087,10 +1263,9 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryDetail() {
 			} else {
 				condition += ` AND a.seller_id_last  IN (` + sellerId + `) `
 			}
-
 		}
 
-		condition += ` 	AND a.product_id = 2  AND  a.status = 1  AND a.due_end_date >= ?  AND a.due_end_date <= ?   AND a.end_date < ? `
+		condition += ` 	AND a.product_id = 2  AND  a.status = 1  AND a.due_end_date >= ?  AND a.due_end_date <= ?   AND a.end_date < ?  AND a.contract_type != '打分1派点' `
 		pars = append(pars, startDate, endDate, time.Now().Format(utils.FormatDate))
 
 		total, err := company.GetIncrementalNewCompanyProductMergeCount(condition, pars)
@@ -1151,7 +1326,7 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryDetail() {
 				condition += ` AND a.seller_id_init  IN (` + sellerId + `) `
 			}
 		}
-		condition += ` AND  a.status = 1  AND a.inherit_end_date >= ?  AND a.inherit_end_date <= ?  AND  a.inherit_company_contract_id > 0  AND a.rai_contract_type = '续约合同'  AND a.company_contract_id NOT  IN (` + utils.GetOrmInReplace(lenArrCompany) + `)  `
+		condition += ` AND  a.status = 1  AND a.inherit_end_date >= ?  AND a.inherit_end_date <= ?  AND  a.inherit_company_contract_id > 0  AND a.rai_contract_type = '续约合同' AND a.contract_type != '打分1派点'  AND a.company_contract_id NOT  IN (` + utils.GetOrmInReplace(lenArrCompany) + `)  `
 		pars = append(pars, startDate, endDate, companyContractIdsNew)
 
 		total, err := company.GetIncrementalNewCompanyProductMergeCount(condition, pars)
@@ -1186,9 +1361,9 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryDetail() {
 				item.CompanyId = v.CompanyId
 				item.CompanyName = v.CompanyName
 				if isServerSeller {
-					item.SellerName = v.ShareSellerLast
+					item.SellerName = v.ShareSellerInit
 				} else {
-					item.SellerName = v.SellerNameLast
+					item.SellerName = v.SellerNameInit
 				}
 				item.StartDate = v.StartDate
 				item.EndDate = v.EndDate
@@ -1217,7 +1392,7 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryDetail() {
 			}
 		}
 
-		condition += ` AND  a.status = 1  AND a.inherit_end_date >= ?  AND a.inherit_end_date <= ?  AND  inherit_company_contract_id > 0    AND a.rai_contract_type = '续约合同' AND a.company_contract_id NOT  IN (` + utils.GetOrmInReplace(lenArrCompany) + `)  `
+		condition += ` AND  a.status = 1  AND a.inherit_end_date >= ?  AND a.inherit_end_date <= ?  AND  inherit_company_contract_id > 0    AND a.rai_contract_type = '续约合同' AND a.contract_type != '打分1派点' AND a.company_contract_id NOT  IN (` + utils.GetOrmInReplace(lenArrCompany) + `)  `
 		pars = append(pars, startDate, endDate, companyContractIdsNew)
 		listRaiData, err := statistic_report.GetRaiDataSummaryList(condition, pars)
 		if err != nil {
@@ -1227,7 +1402,7 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryDetail() {
 		}
 
 		//到期合同数据
-		conditionEnd += ` AND  a.status = 1  AND a.due_end_date >= ?  AND a.due_end_date <= ?   AND a.end_date < ? `
+		conditionEnd += ` AND  a.status = 1   AND a.contract_type != '打分1派点' AND a.due_end_date >= ?  AND a.due_end_date <= ?   AND a.end_date < ? `
 		parsEnd = append(parsEnd, startDate, endDate, time.Now().Format(utils.FormatDate))
 		listEndData, err := statistic_report.GetRaiDataSummaryList(conditionEnd, parsEnd)
 		if err != nil {
@@ -1303,7 +1478,7 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryDetail() {
 				condition += ` AND a.seller_id_last  IN (` + sellerId + `) `
 			}
 		}
-		condition += ` AND  a.product_id = 2  AND  a.status = 1  AND a.end_date >= ?  AND a.end_date <= ?  AND a.end_date <= ?  `
+		condition += ` AND  a.product_id = 2  AND  a.status = 1 AND a.contract_type != '打分1派点'  AND a.due_end_date >= ?  AND a.due_end_date <= ?  AND a.due_end_date <= ?  `
 		pars = append(pars, startDate, endDate, time.Now().Format(utils.FormatDate))
 
 		total, err := company.GetIncrementalNewCompanyProductMergeCount(condition, pars)
@@ -1365,25 +1540,26 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryDetail() {
 		var parsEnd []interface{}
 		if sellerId != "" {
 			if isServerSeller {
-				condition += ` AND a.share_seller_id_init  IN (` + sellerId + `) `
+				//condition += ` AND a.share_seller_id_init  IN (` + sellerId + `) `
 				conditionEnd += ` AND a.share_seller_id_last  IN (` + sellerId + `) `
 			} else {
-				condition += ` AND a.seller_id_init  IN (` + sellerId + `) `
+				//condition += ` AND a.seller_id_init  IN (` + sellerId + `) `
 				conditionEnd += ` AND a.seller_id_last  IN (` + sellerId + `) `
 			}
 
 		}
 
-		condition += ` AND  a.product_id = 2  AND  a.status = 1  AND  a.end_date >= ?  AND  a.end_date <= ? AND a.end_date <= ?  `
-		pars = append(pars, startDate, endDate, time.Now().Format(utils.FormatDate))
-		listRaiData, err := statistic_report.GetRaiDataSummaryList(condition, pars)
-		if err != nil {
-			br.Msg = "获取数据信息失败"
-			br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
-			return
-		}
+		//condition += ` AND  a.product_id = 2  AND  a.status = 1 AND a.contract_type != '打分1派点'  AND  a.end_date >= ?  AND  a.end_date <= ? AND a.end_date <= ?  `
+		//pars = append(pars, startDate, endDate, time.Now().Format(utils.FormatDate))
+		//listRaiData, err := statistic_report.GetRaiDataSummaryList(condition, pars)
+		//if err != nil {
+		//	br.Msg = "获取数据信息失败"
+		//	br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
+		//	return
+		//}
+		//fmt.Println(len(listRaiData))
 
-		conditionEnd += `  AND  a.product_id = 2  AND  a.status = 1  AND a.due_end_date >= ?  AND a.due_end_date <= ?   AND a.end_date < ? `
+		conditionEnd += `  AND  a.product_id = 2  AND  a.status = 1  AND a.contract_type != '打分1派点'  AND a.due_end_date >= ?  AND a.due_end_date <= ?   AND a.end_date < ? `
 		parsEnd = append(parsEnd, startDate, endDate, time.Now().Format(utils.FormatDate))
 
 		listEndData, err := statistic_report.GetRaiDataSummaryList(conditionEnd, parsEnd)
@@ -1401,7 +1577,7 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryDetail() {
 		var expiredContractCompany float64 // 到期客户数
 		mapexpiredContractCompany := make(map[int]bool)
 
-		for _, v := range listRaiData {
+		for _, v := range listEndData {
 			if noRenewedcompanyContractIdsMap[v.CompanyContractId] {
 				norenewedContractMoney += v.Money
 				if !mapnorenewedContractCompany[v.CompanyId] {
@@ -1453,7 +1629,7 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryDetail() {
 				conditionInherit += ` AND a.seller_id_last  IN (` + sellerId + `) `
 			}
 		}
-		condition += " AND  a.product_id = 2  AND  a.status = 1  AND  a.start_date >= ?  AND  a.start_date <= ?  AND a.rai_contract_type = '新签合同' "
+		condition += " AND  a.product_id = 2  AND  a.status = 1  AND  a.start_date >= ?  AND  a.start_date <= ?  AND a.rai_contract_type = '新签合同' AND a.contract_type != '打分1派点' "
 		pars = append(pars, startDate, endDate)
 		listRaiData, err := statistic_report.GetRaiDataSummaryList(condition, pars)
 		if err != nil {
@@ -1463,7 +1639,7 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryDetail() {
 		}
 
 		//续约部分的数据
-		conditionInherit += ` AND  a.product_id = 2  AND  a.status = 1  AND  a.inherit_end_date >= ?  AND  a.inherit_end_date <= ? AND  a.inherit_company_contract_id > 0  AND a.rai_contract_type = '续约合同'  AND a.company_contract_id NOT  IN (` + utils.GetOrmInReplace(lenArrCompany) + `)  `
+		conditionInherit += ` AND  a.product_id = 2  AND  a.status = 1  AND  a.inherit_end_date >= ?  AND  a.inherit_end_date <= ? AND  a.inherit_company_contract_id > 0  AND a.rai_contract_type = '续约合同' AND a.contract_type != '打分1派点'  AND a.company_contract_id NOT  IN (` + utils.GetOrmInReplace(lenArrCompany) + `)  `
 		parsInherit = append(parsInherit, startDate, endDate, companyContractIdsNew)
 		listInheritData, err := statistic_report.GetRaiDataSummaryInheritList(conditionInherit, parsInherit)
 		if err != nil {
@@ -1526,7 +1702,7 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryDetail() {
 			}
 
 		}
-		condition += " AND  a.product_id = 2  AND  a.status = 1  AND  a.start_date >= ?  AND  a.start_date <= ? AND a.rai_contract_type = '新签合同'  "
+		condition += " AND  a.product_id = 2  AND  a.status = 1  AND  a.start_date >= ?  AND  a.start_date <= ? AND a.rai_contract_type = '新签合同'  AND a.contract_type != '打分1派点' "
 		pars = append(pars, startDate, endDate)
 		listRaiData, err := statistic_report.GetRaiDataSummaryList(condition, pars)
 		if err != nil {
@@ -1549,7 +1725,7 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryDetail() {
 				mapCompany[v.CompanyId] = true
 			}
 		}
-		conditionInherit += ` AND  a.product_id = 2  AND  a.status = 1  AND  a.inherit_end_date >= ?  AND  a.inherit_end_date <= ?  AND a.rai_contract_type = '续约合同'   AND a.company_contract_id NOT  IN (` + utils.GetOrmInReplace(lenArrCompany) + `)  `
+		conditionInherit += ` AND  a.product_id = 2  AND  a.status = 1  AND  a.inherit_end_date >= ?  AND  a.inherit_end_date <= ?  AND a.rai_contract_type = '续约合同'  AND a.contract_type != '打分1派点'  AND a.company_contract_id NOT  IN (` + utils.GetOrmInReplace(lenArrCompany) + `)  `
 		parsInherit = append(parsInherit, startDate, endDate, companyContractIdsNew)
 		listInheritData, err := statistic_report.GetRaiDataSummaryInheritList(conditionInherit, parsInherit)
 		if err != nil {
@@ -1573,9 +1749,9 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryDetail() {
 
 	case "开票金额":
 		if sellerId != "" {
-			condition += ` AND a.rai_seller_id  IN (` + sellerId + `) `
+			condition += ` AND a.seller_id  IN (` + sellerId + `) `
 		}
-		condition += " AND  a.is_deleted = 0    AND  a.invoiced_amount > 0  AND b.invoice_type = 1   AND  b.invoice_time >= ?  AND  b.invoice_time <= ?   "
+		condition += " AND  a.is_deleted = 0    AND a.invoice_type IN  (1,3)   AND  a.invoice_time >= ?  AND  a.invoice_time <= ?   "
 		pars = append(pars, startDate, endDate)
 		total, err := fms.GetContractInvoiceCount(condition, pars)
 		if err != nil && err.Error() != utils.ErrNoRow() {
@@ -1584,7 +1760,7 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryDetail() {
 			return
 		}
 		trialTotal = total
-		condition += " GROUP BY b.contract_invoice_id   ORDER BY invoice_time  DESC "
+		condition += " GROUP BY a.contract_invoice_id   ORDER BY a.invoice_time  DESC ,a.contract_register_id DESC  "
 		listFmsData, err := fms.GetContractRegisterList(condition, pars, startSize, pageSize)
 		if err != nil {
 			br.Msg = "获取数据信息失败"
@@ -1595,7 +1771,7 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryDetail() {
 			for _, v := range listFmsData {
 				item := new(statistic_report.RaiDataSummaryDetailResp)
 				item.CompanyName = v.CompanyName
-				item.SellerName = v.RaiSellerName
+				item.SellerName = v.SellerName
 				item.ContractCode = v.ContractCode
 				item.InvoicedAmount = v.Amount
 				item.CreateTime = v.InvoiceTime
@@ -1605,9 +1781,9 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryDetail() {
 
 	case "到款金额":
 		if sellerId != "" {
-			condition += ` AND a.rai_seller_id  IN (` + sellerId + `) `
+			condition += ` AND a.seller_id  IN (` + sellerId + `) `
 		}
-		condition += " AND  a.is_deleted = 0    AND  a.payment_amount > 0  AND b.invoice_type = 2   AND  b.invoice_time >= ?  AND  b.invoice_time <= ?   "
+		condition += " AND  a.is_deleted = 0    AND a.invoice_type IN  (2,4)   AND  a.invoice_time >= ?  AND  a.invoice_time <= ?   "
 		pars = append(pars, startDate, endDate)
 		total, err := fms.GetContractInvoiceCount(condition, pars)
 		if err != nil && err.Error() != utils.ErrNoRow() {
@@ -1616,7 +1792,7 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryDetail() {
 			return
 		}
 		trialTotal = total
-		condition += " GROUP BY b.contract_invoice_id   ORDER BY invoice_time  DESC "
+		condition += " GROUP BY a.contract_invoice_id   ORDER BY invoice_time  DESC ,a.contract_register_id DESC "
 		listFmsData, err := fms.GetContractRegisterList(condition, pars, startSize, pageSize)
 		if err != nil {
 			br.Msg = "获取数据信息失败"
@@ -1627,7 +1803,7 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryDetail() {
 			for _, v := range listFmsData {
 				item := new(statistic_report.RaiDataSummaryDetailResp)
 				item.CompanyName = v.CompanyName
-				item.SellerName = v.RaiSellerName
+				item.SellerName = v.SellerName
 				item.ContractCode = v.ContractCode
 				item.PaymentAmount = v.Amount
 				item.CreateTime = v.InvoiceTime
@@ -1637,14 +1813,14 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryDetail() {
 
 	case "未到款比例":
 		if sellerId != "" {
-			condition += ` AND a.rai_seller_id  IN (` + sellerId + `) `
+			condition += ` AND a.seller_id  IN (` + sellerId + `) `
 		}
 		var condition2 string
 		var pars2 []interface{}
-		condition2 = condition + " AND  a.is_deleted = 0    AND  a.payment_amount > 0  AND b.invoice_type = 2   AND  b.invoice_time >= ?  AND  b.invoice_time <= ?   "
+		condition2 = condition + " AND  a.is_deleted = 0      AND a.invoice_type  IN  (2,4)   AND  a.invoice_time >= ?  AND  a.invoice_time <= ?   "
 		pars2 = append(pars2, startDate, endDate)
 
-		condition += " AND  a.is_deleted = 0    AND  a.invoiced_amount > 0  AND b.invoice_type = 1   AND  b.invoice_time >= ?  AND  b.invoice_time <= ?   "
+		condition += " AND  a.is_deleted = 0   AND a.invoice_type IN  (1,3)   AND  a.invoice_time >= ?  AND  a.invoice_time <= ?   "
 		pars = append(pars, startDate, endDate)
 		amount1, err := fms.GetContractInvoiceAmountCount(condition, pars) //开票金额总计
 		if err != nil {
@@ -1668,9 +1844,9 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryDetail() {
 
 	case "新客开票":
 		if sellerId != "" {
-			condition += ` AND a.rai_seller_id  IN (` + sellerId + `) `
+			condition += ` AND a.seller_id  IN (` + sellerId + `) `
 		}
-		condition += " AND  a.is_deleted = 0    AND  a.contract_type = 1 AND  a.invoiced_amount > 0  AND b.invoice_type = 1   AND  b.invoice_time >= ?  AND  b.invoice_time <= ?   "
+		condition += ` AND  a.is_deleted = 0   AND  b.contract_type = 1  AND a.invoice_type IN  (1,3)   AND  a.invoice_time >= ?  AND  a.invoice_time <= ?  `
 		pars = append(pars, startDate, endDate)
 		total, err := fms.GetContractInvoiceCount(condition, pars)
 		if err != nil && err.Error() != utils.ErrNoRow() {
@@ -1679,8 +1855,9 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryDetail() {
 			return
 		}
 		trialTotal = total
-		condition += " GROUP BY b.contract_invoice_id   ORDER BY invoice_time  DESC "
+		condition += " GROUP BY a.contract_invoice_id   ORDER BY a.invoice_time  DESC  ,a.contract_register_id DESC "
 		listFmsData, err := fms.GetContractRegisterList(condition, pars, startSize, pageSize)
+
 		if err != nil {
 			br.Msg = "获取数据信息失败"
 			br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
@@ -1690,7 +1867,7 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryDetail() {
 			for _, v := range listFmsData {
 				item := new(statistic_report.RaiDataSummaryDetailResp)
 				item.CompanyName = v.CompanyName
-				item.SellerName = v.RaiSellerName
+				item.SellerName = v.SellerName
 				item.ContractCode = v.ContractCode
 				item.InvoicedAmount = v.Amount
 				item.CreateTime = v.InvoiceTime
@@ -1700,9 +1877,9 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryDetail() {
 
 	case "新客到款":
 		if sellerId != "" {
-			condition += ` AND a.rai_seller_id  IN (` + sellerId + `) `
+			condition += ` AND a.seller_id  IN (` + sellerId + `) `
 		}
-		condition += " AND  a.is_deleted = 0    AND a.contract_type = 1   AND  a.payment_amount > 0  AND b.invoice_type = 2   AND  b.invoice_time >= ?  AND  b.invoice_time <= ?   "
+		condition += ` AND  a.is_deleted = 0   AND  b.contract_type = 1  AND a.invoice_type IN  (2,4)   AND  a.invoice_time >= ?  AND  a.invoice_time <= ?   `
 		pars = append(pars, startDate, endDate)
 		total, err := fms.GetContractInvoiceCount(condition, pars)
 		if err != nil && err.Error() != utils.ErrNoRow() {
@@ -1711,7 +1888,7 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryDetail() {
 			return
 		}
 		trialTotal = total
-		condition += " GROUP BY b.contract_invoice_id   ORDER BY invoice_time  DESC "
+		condition += ` GROUP BY a.contract_invoice_id   ORDER BY a.invoice_time  DESC  ,a.contract_register_id DESC `
 		listFmsData, err := fms.GetContractRegisterList(condition, pars, startSize, pageSize)
 		if err != nil {
 			br.Msg = "获取数据信息失败"
@@ -1722,7 +1899,7 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryDetail() {
 			for _, v := range listFmsData {
 				item := new(statistic_report.RaiDataSummaryDetailResp)
 				item.CompanyName = v.CompanyName
-				item.SellerName = v.RaiSellerName
+				item.SellerName = v.SellerName
 				item.ContractCode = v.ContractCode
 				item.PaymentAmount = v.Amount
 				item.CreateTime = v.InvoiceTime

+ 5 - 1
controllers/statistic_report.go

@@ -3797,7 +3797,11 @@ func (this *StatisticReportController) IncrementalCompanyList() {
 
 	//条件
 	if adminId != "" {
-		condition += ` AND c.seller_id in  (` + adminId + `) `
+		if dataType == "未续约客户" {
+			condition += ` AND (c.share_seller_id in  (` + adminId + `) OR c.seller_id in  (` + adminId + `)) `
+		}else{
+			condition += ` AND c.seller_id in  (` + adminId + `) `
+		}
 		//pars = append(pars, adminId)
 	} else {
 

+ 15 - 16
controllers/sys_admin.go

@@ -1177,27 +1177,26 @@ func (this *SysAdminController) Move() {
 
 	// 修改客户关联的分组
 	{
+		// 有小组时GroupId取小组ID
 		if req.TeamId > 0 {
-			if req.TeamId != adminInfo.GroupId {
-				err = company.ModifyCompanyGroupId(req.AdminId, req.TeamId)
-				if err != nil {
-					br.Msg = "编辑失败"
-					br.ErrMsg = "ModifyCompanyGroupId,Err:" + err.Error()
-					return
-				}
+			err = company.ModifyCompanyGroupId(req.AdminId, req.TeamId)
+			if err != nil {
+				br.Msg = "编辑失败"
+				br.ErrMsg = "ModifyCompanyGroupId,Err:" + err.Error()
+				return
 			}
-		} else {
-			if req.GroupId != adminInfo.GroupId {
-				err = company.ModifyCompanyGroupId(req.AdminId, req.GroupId)
-				if err != nil {
-					br.Msg = "编辑失败"
-					br.ErrMsg = "ModifyCompanyGroupId,Err:" + err.Error()
-					return
-				}
+		}
+		// 无TeamId时GroupId取大组ID
+		if req.TeamId <= 0 && req.GroupId > 0 {
+			err = company.ModifyCompanyGroupId(req.AdminId, req.GroupId)
+			if err != nil {
+				br.Msg = "编辑失败"
+				br.ErrMsg = "ModifyCompanyGroupId,Err:" + err.Error()
+				return
 			}
 		}
 
-		if req.DepartmentId != adminInfo.DepartmentId {
+		if req.DepartmentId > 0 {
 			err = company.ModifyCompanyDepartmentId(req.AdminId, req.DepartmentId)
 			if err != nil {
 				br.Msg = "编辑失败"

+ 12 - 0
controllers/sys_role.go

@@ -112,6 +112,8 @@ func (this *SysRoleController) Edit() {
 			return
 		}
 	}
+	oldRoleName := item.RoleName
+	oldRoleCodeType := item.RoleTypeCode
 	roleTypeCode := services.GetRoleTypeCode(req.RoleType)
 	err = system.ModifySysRole(req.RoleName, req.RoleType, roleTypeCode, req.RoleId)
 	if err != nil {
@@ -119,6 +121,16 @@ func (this *SysRoleController) Edit() {
 		br.ErrMsg = "修改失败,Err:" + err.Error()
 		return
 	}
+	if oldRoleName != req.RoleName || oldRoleCodeType != roleTypeCode {
+		// 查询所有和角色相关的管理员的信息,并更新成最新的角色
+		err = system.UpdateAdminRoleInfoByRoleId(req.RoleId, req.RoleName, roleTypeCode)
+		if err != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = "更新管理员角色信息失败, Err: " + err.Error()
+			return
+		}
+	}
+
 
 	// 同步角色缓存
 	var syncData system.SyncRoleData

+ 33 - 26
models/company/company_apply.go

@@ -9,19 +9,25 @@ import (
 
 // 申请服务更新请求参数
 type CompanyApplyServiceUpdateReq struct {
-	CompanyId         int     `description:"客户id"`
-	CompanyApprovalId int     `description:"申请单id,没有传0"`
-	ContractType      string  `description:"合同类型,枚举值:'新签合同','续约合同','补充协议'"`
-	CompanyType       string  `description:"客户类型,ficc/权益"`
-	StartDate         string  `description:"合同开始日期"`
-	EndDate           string  `description:"合同结束日期"`
-	Money             float64 `description:"合同金额"`
-	PayMethod         string  `description:"付款方式"`
-	PayChannel        string  `description:"付款渠道"`
-	PermissionIds     string  `description:"权限id,多个用英文逗号隔开"`
-	ImgUrl            string  `description:"合同图片,多个用英文#隔开"`
-	PackageType       int     `description:"套餐类型,0:无,1:大套餐,2:小套餐"`
-	RaiPackageType    int     `description:"权益套餐类型: 0-无; 1-70w套餐; 2-45w套餐"`
+	CompanyId         int                       `description:"客户id"`
+	CompanyApprovalId int                       `description:"申请单id,没有传0"`
+	ContractType      string                    `description:"合同类型,枚举值:'新签合同','续约合同','补充协议'"`
+	CompanyType       string                    `description:"客户类型,ficc/权益"`
+	StartDate         string                    `description:"合同开始日期"`
+	EndDate           string                    `description:"合同结束日期"`
+	Money             float64                   `description:"合同金额"`
+	PayMethod         string                    `description:"付款方式"`
+	PayChannel        string                    `description:"付款渠道"`
+	PermissionIds     string                    `description:"权限id,多个用英文逗号隔开"`
+	ImgUrl            string                    `description:"合同图片,多个用英文#隔开"`
+	PackageType       int                       `description:"套餐类型,0:无,1:大套餐,2:小套餐"`
+	RaiPackageType    int                       `description:"权益套餐类型: 0-无; 1-70w套餐; 2-45w套餐"`
+	Points            float64                   `description:"研选扣点包点数"`
+	PointsArr         []ChartPermissionIdPoints `description:"行业下对应的点数"`
+}
+
+type ChartPermissionIdPoints struct {
+	ChartPermissionId int     `description:"权限ID"`
 	Points            float64 `description:"研选扣点包点数"`
 }
 
@@ -259,19 +265,20 @@ func ApproveRefuse(companyId, productId int, approveStatus, approveRemark string
 // 申请转正请求参数
 type CompanyApplyTurnPositiveReq struct {
 	CompanyId         int
-	CompanyApprovalId int     `description:"申请单id,没有传0"`
-	ContractType      string  `description:"合同类型,枚举值:'新签合同','续约合同','补充协议'"`
-	StartDate         string  `description:"合同开始日期"`
-	EndDate           string  `description:"合同结束日期"`
-	Money             float64 `description:"合同金额"`
-	PayMethod         string  `description:"付款方式"`
-	PayChannel        string  `description:"付款渠道"`
-	PermissionIds     string  `description:"权限id,多个用英文逗号隔开"`
-	PermissionNames   string  `description:"权限名称,多个用英文逗号隔开"`
-	ImgUrl            string  `description:"合同图片,多个用英文#隔开"`
-	PackageType       int     `description:"套餐类型,0:无,1:大套餐,2:小套餐"`
-	RaiPackageType    int     `description:"权益套餐类型: 0-无; 1-70w大套餐; 2-45w大套餐"`
-	Points            float64 `description:"研选扣点包点数"`
+	CompanyApprovalId int                       `description:"申请单id,没有传0"`
+	ContractType      string                    `description:"合同类型,枚举值:'新签合同','续约合同','补充协议'"`
+	StartDate         string                    `description:"合同开始日期"`
+	EndDate           string                    `description:"合同结束日期"`
+	Money             float64                   `description:"合同金额"`
+	PayMethod         string                    `description:"付款方式"`
+	PayChannel        string                    `description:"付款渠道"`
+	PermissionIds     string                    `description:"权限id,多个用英文逗号隔开"`
+	PermissionNames   string                    `description:"权限名称,多个用英文逗号隔开"`
+	ImgUrl            string                    `description:"合同图片,多个用英文#隔开"`
+	PackageType       int                       `description:"套餐类型,0:无,1:大套餐,2:小套餐"`
+	RaiPackageType    int                       `description:"权益套餐类型: 0-无; 1-70w大套餐; 2-45w大套餐"`
+	Points            float64                   `description:"研选扣点包点数"`
+	PointsArr         []ChartPermissionIdPoints `description:"行业下对应的点数"`
 }
 
 // 申请转正请求参数

+ 3 - 1
models/company/company_approval.go

@@ -1386,7 +1386,7 @@ func ModifyCompanyTurnPositiveBySystemContract(contractDetail *contract.Contract
 }
 
 // ModifyCompanyApplyServiceUpdate 修改申请信息
-func ModifyCompanyApplyServiceUpdate(item *CompanyApplyServiceUpdateReq, productId, companyContractId, isFormal int, mapPermissionIdUpgrade, mapPermissionIdExpensive map[int]int) (err error) {
+func ModifyCompanyApplyServiceUpdate(item *CompanyApplyServiceUpdateReq, productId, companyContractId, isFormal int, mapPermissionIdUpgrade, mapPermissionIdExpensive map[int]int, mapPoints map[int]float64) (err error) {
 	o := orm.NewOrm()
 	to, err := o.Begin()
 	if err != nil {
@@ -1434,6 +1434,7 @@ func ModifyCompanyApplyServiceUpdate(item *CompanyApplyServiceUpdateReq, product
 			return
 		}
 		contractPermission.ChartPermissionId = chartPermissionId
+		contractPermission.Points = mapPoints[chartPermissionId]
 
 		contractPermission.StartDate = item.StartDate
 		contractPermission.EndDate = item.EndDate
@@ -1444,6 +1445,7 @@ func ModifyCompanyApplyServiceUpdate(item *CompanyApplyServiceUpdateReq, product
 		contractPermission.IsUpgrade = mapPermissionIdUpgrade[p]
 		contractPermission.ExpensiveYx = mapPermissionIdExpensive[p]
 		tmpErr = AddCompanyContractPermission(contractPermission)
+
 		if tmpErr != nil {
 			err = tmpErr
 			return

+ 8 - 0
models/company/company_contract.go

@@ -372,6 +372,14 @@ func GetFirstContractRai(companyId int) (item *CompanyContract, err error) {
 	return
 }
 
+// GetLastContractRai 权益获取最后一份合同
+func GetLastContractRai(companyId int) (item *CompanyContract, err error) {
+	o := orm.NewOrm()
+	sql := " SELECT * FROM company_contract WHERE company_id = ?  AND product_id= 2  AND status = 1   ORDER BY   end_date  DESC  LIMIT  1  "
+	err = o.Raw(sql, companyId).QueryRow(&item)
+	return
+}
+
 // 更新合同类型
 func UpdateCompanyContractTypeinit16_1_01(share_seller_init string, share_seller_id_init, companyId int) (err error) {
 	o := orm.NewOrm()

+ 23 - 0
models/company/company_contract_no_renewed_ascribe.go

@@ -157,3 +157,26 @@ func GetCompanyContractNoRenewedAscribeList(condition string, pars []interface{}
 	_, err = o.Raw(sql, pars).QueryRows(&items)
 	return
 }
+
+// 列表
+func GetCompanyContractNoRenewedAscribeListJoin(condition string, pars []interface{}, startSize, pageSize int) (items []*CompanyContractNoRenewedAscribeResp, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+			a.* 
+		FROM
+			company_contract_no_renewed_ascribe AS a 
+			INNER JOIN company_contract as  b ON a.company_contract_id = b.company_contract_id 
+		WHERE
+			1 = 1
+			 AND a.company_ascribe_id != 9 
+			 AND b.contract_type != '打分派点' `
+	if condition != "" {
+		sql += condition
+	}
+	if startSize+pageSize > 0 {
+		sql += ` LIMIT ?,?  `
+		_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}

+ 39 - 2
models/company/company_history_remark.go

@@ -29,6 +29,12 @@ type CompanyHistoryRemarkReq struct {
 	Content   string `description:"备注内容"`
 }
 
+// CompanyHistoryRemarkReq 新增历史备注请求
+type CompanyHistoryRemarkEditReq struct {
+	HistoryId int    `description:"备注ID"`
+	Content   string `description:"备注内容"`
+}
+
 // 新增
 func AddCompanyHistoryRemark(remark *CompanyHistoryRemark) (err error) {
 	o := orm.NewOrm()
@@ -37,11 +43,14 @@ func AddCompanyHistoryRemark(remark *CompanyHistoryRemark) (err error) {
 }
 
 type CompanyHistoryRemarkResp struct {
+	HistoryId    int    `comment:"备注id"`
 	CompanyId    int    `comment:"客户ID"`
 	Content      string `comment:"备注内容"`
 	SysAdminName string `comment:"创建人姓名"`
 	RemarkType   string `comment:"备注类型"`
 	CreateTime   string `comment:"对外展示的创建时间"`
+	BtnEdit      bool   `description:"编辑按钮权限:true显示,false不显示"`
+	BtnDelete    bool   `description:"删除按钮权限:true显示,false不显示"`
 }
 
 type CompanyHistoryRemarkListResp struct {
@@ -51,7 +60,7 @@ type CompanyHistoryRemarkListResp struct {
 // GetCompanyHistoryRemarkList 获取备注列表
 func GetCompanyHistoryRemarkList(CompanyId, ProductId string) (items []*CompanyHistoryRemark, err error) {
 	o := orm.NewOrm()
-	sql := "SELECT * FROM company_history_remark WHERE company_id=? AND product_id=? ORDER BY show_time DESC "
+	sql := "SELECT * FROM company_history_remark WHERE  is_del = 0 AND  company_id=? AND product_id=? ORDER BY show_time DESC "
 	_, err = o.Raw(sql, CompanyId, ProductId).QueryRows(&items)
 	return
 }
@@ -64,7 +73,7 @@ func DelCompanyHistoryRemark(tableName string, tableId int) (err error) {
 	return
 }
 
-// GetCompanyHistoryRemarkList 获取备注列表
+// GetCompanyHistoryRemarkListinit 获取备注列表
 func GetCompanyHistoryRemarkListinit() (items []*CompanyHistoryRemark, err error) {
 	o := orm.NewOrm()
 	sql := "SELECT * FROM company_history_remark  WHERE	 table_id > 0   "
@@ -94,3 +103,31 @@ func AddCompanyHistoryRemarkMultiinit(items []*CompanyHistoryRemark) (err error)
 	}
 	return
 }
+
+// 根据ID获取详情
+func GetCompanyHistoryRemarkByHistoryId(historyId int) (item *CompanyHistoryRemark, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * FROM company_history_remark WHERE history_id=? `
+	err = o.Raw(sql, historyId).QueryRow(&item)
+	return
+}
+
+// 更新
+func UpdateCompanyHistoryRemark(where, updateParams map[string]interface{}) error {
+	o := orm.NewOrm()
+	ptrStructOrTableName := "company_history_remark"
+	qs := o.QueryTable(ptrStructOrTableName)
+	for expr, exprV := range where {
+		qs = qs.Filter(expr, exprV)
+	}
+	_, err := qs.Update(updateParams)
+	return err
+}
+
+// 软删除
+func DeleteCompanyHistoryRemark(adminName string, adminId, historyId int) (err error) {
+	o := orm.NewOrm()
+	sql := ` UPDATE company_history_remark SET  is_del=1 , del_time= ? ,del_admin_name =?,del_admin_id =?   WHERE history_id=? `
+	_, err = o.Raw(sql, time.Now(), adminName, adminId, historyId).Exec()
+	return
+}

+ 25 - 0
models/company/company_history_remark_log.go

@@ -0,0 +1,25 @@
+package company
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CompanyHistoryRemarkLog struct {
+	LogId        int       `orm:"column(log_id);pk" comment:"日志id"`
+	HistoryId    int       ` comment:"备注id"`
+	CompanyId    int       `comment:"客户ID"`
+	ProductId    int       `comment:"产品id"`
+	Content      string    `comment:"备注内容"`
+	ContentEdit  string    `comment:"修改后的备注内容"`
+	SysAdminId   int       `comment:"创建人ID"`
+	SysAdminName string    `comment:"创建人姓名"`
+	CreateTime   time.Time `comment:"创建时间" `
+}
+
+// 新增
+func AddCompanyHistoryRemarkLog(remark *CompanyHistoryRemarkLog) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Insert(remark)
+	return
+}

+ 54 - 27
models/company/company_permission.go

@@ -26,12 +26,15 @@ type ChartPermission struct {
 }
 
 type PermissionSetItem struct {
-	ChartPermissionId int    `description:"权限id"`
-	PermissionName    string `description:"权限名称"`
-	PermissionType    int    `description:"1主观,2客观"`
-	ParentId          int    `description:"父级权限id"`
-	IsPublic          int    `description:"是否是公有权限1:公有权限,0私有权限"`
-	Checked           bool   `description:"选中状态"`
+	ChartPermissionId        int    `description:"权限id"`
+	PermissionName           string `description:"权限名称"`
+	PermissionType           int    `description:"1主观,2客观"`
+	ParentId                 int    `description:"父级权限id"`
+	IsPublic                 int    `description:"是否是公有权限1:公有权限,0私有权限"`
+	Checked                  bool   `description:"选中状态"`
+	SetMenuChartPermissionId []int  `description:"大套餐所包含的权限id"`
+	ShowInput                bool   `description:"是否包含输入框"`
+	ChartContent             string `description:"权限申请时下面的框点数回显"`
 
 	Child []*PermissionSetItem `description:"具体的主客观-方便前端的排版用的"`
 }
@@ -87,6 +90,13 @@ func GetPermissionSetItemsByType(productId int, classifyName string) (items []*P
 	return
 }
 
+func GetPermissionSetMenuItemsByType(productId int) (items []*PermissionSetItem, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * FROM chart_permission WHERE enabled=1 AND product_id=?  AND parent_id>0 AND set_menu > 0  ORDER BY sort ASC `
+	_, err = o.Raw(sql, productId).QueryRows(&items)
+	return
+}
+
 func GetPermissionSetSandoItems(productId int, classifyName string) (items []*PermissionLookItem, err error) {
 	o := orm.NewOrm()
 	sql := ` SELECT * FROM chart_permission WHERE enabled=1 AND product_id=? AND classify_name=? AND parent_id>0 ORDER BY sort ASC `
@@ -160,25 +170,28 @@ type PermissionLookList struct {
 }
 
 type PermissionLookItem struct {
-	ChartPermissionId  int                   `description:"权限id"`
-	PermissionName     string                `description:"权限名称"`
-	StartDate          string                `description:"权限开始日期"`
-	EndDate            string                `description:"权限结束日期"`
-	Status             string                `description:"'正式','试用','关闭'"`
-	ExpireDay          string                `description:"到期天数"`
-	ClassifyName       string                `description:"分类"`
-	PermissionType     int                   `description:"1主观,2客观"`
-	PermissionTypeName string                `description:"主观、客观"`
-	Checked            bool                  `description:"选中状态"`
-	Remark             string                `description:"备注"`
-	IsMerge            bool                  `description:"是否合并行业, 给前端的标识, 暂时仅权益使用"`
-	RaiBothHas         bool                  `description:"权益-是否主客观都有"`
-	IsUpgrade          int                   `description:"是否升级,1是,0否"`
-	ExpensiveYx        int                   `description:"权益研选: 0-3w; 1-5w ,2: 10W"`
-	Points             float64               `description:"研选扣点包点数"`
-	ParentId           int                   `description:"父级权限id"`
-	IsPublic           int                   `description:"是否是公有权限1:公有权限,0私有权限"`
-	Child              []*PermissionLookItem `description:"子权限"`
+	ChartPermissionId        int                   `description:"权限id"`
+	PermissionName           string                `description:"权限名称"`
+	StartDate                string                `description:"权限开始日期"`
+	EndDate                  string                `description:"权限结束日期"`
+	Status                   string                `description:"'正式','试用','关闭'"`
+	ExpireDay                string                `description:"到期天数"`
+	ClassifyName             string                `description:"分类"`
+	PermissionType           int                   `description:"1主观,2客观"`
+	PermissionTypeName       string                `description:"主观、客观"`
+	Checked                  bool                  `description:"选中状态"`
+	Remark                   string                `description:"备注"`
+	IsMerge                  bool                  `description:"是否合并行业, 给前端的标识, 暂时仅权益使用"`
+	RaiBothHas               bool                  `description:"权益-是否主客观都有"`
+	IsUpgrade                int                   `description:"是否升级,1是,0否"`
+	ExpensiveYx              int                   `description:"权益研选: 0-3w; 1-5w ,2: 10W"`
+	Points                   float64               `description:"研选扣点包点数"`
+	ParentId                 int                   `description:"父级权限id"`
+	IsPublic                 int                   `description:"是否是公有权限1:公有权限,0私有权限"`
+	ShowInput                bool                  `description:"是否包含输入框"`
+	ChartContent             string                `description:"权限申请时下面的框点数回显"`
+	SetMenuChartPermissionId []int                 `description:"大套餐所包含的权限id"`
+	Child                    []*PermissionLookItem `description:"子权限"`
 }
 
 // todo 确认是否需要删除
@@ -189,6 +202,20 @@ func GetPermissionLookItems(productId int, classifyName string) (items []*Permis
 	return
 }
 
+func GetPermissionLookItemsRai(productId int, classifyName string) (items []*PermissionLookItem, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * FROM chart_permission WHERE enabled=1 AND product_id=? AND classify_name=? AND parent_id > 0 AND cygx_auth =1  ORDER BY sort ASC `
+	_, err = o.Raw(sql, productId, classifyName).QueryRows(&items)
+	return
+}
+
+func GetPermissionLookItems2(productId int, classifyName string) (items []*PermissionLookItem, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * FROM chart_permission WHERE enabled=1 AND product_id=? AND classify_name=? AND parent_id>0 AND permission_type!=2 ORDER BY sort ASC `
+	_, err = o.Raw(sql, productId, classifyName).QueryRows(&items)
+	return
+}
+
 func GetPermissionLookItemsByProductId(productId int) (items []*PermissionLookItem, err error) {
 	o := orm.NewOrm()
 	sql := ` SELECT * FROM chart_permission WHERE enabled=1 AND product_id=? ORDER BY sort ASC `
@@ -352,7 +379,7 @@ func GetCompanyListCompanyIdByPermissionIdStr(permissionStr string) (company_id
 		SELECT 
 		GROUP_CONCAT(DISTINCT company_id) AS company_id
 		FROM company_report_permission
-		WHERE report_permission_id IN (?)
+		WHERE chart_permission_id IN (?)
 		#GROUP  BY company_id
 		`
 	err = o.Raw(sql, permissionStr).QueryRow(&company_id)
@@ -612,7 +639,7 @@ func GetCompanyIdsStrByReportPermissionIds(permissionIds []int) (companyIds []in
 			FROM
 				company_report_permission
 			WHERE
-				report_permission_id IN (` + utils.GetOrmInReplace(len(permissionIds)) + `) AND (DATE(NOW()) BETWEEN start_date AND end_date) AND status IN ('试用', '正式', '永续')`
+				chart_permission_id IN (` + utils.GetOrmInReplace(len(permissionIds)) + `) AND (DATE(NOW()) BETWEEN start_date AND end_date) AND status IN ('试用', '正式', '永续')`
 	_, err = o.Raw(sql, permissionIds).QueryRows(&companyIds)
 	return
 }

+ 14 - 0
models/company/company_product.go

@@ -764,3 +764,17 @@ func GetShareSellerByCompanyName(companyNames []string) (items []*CompanyShareSe
 	_, err = o.Raw(sql, companyNames).QueryRows(&items)
 	return
 }
+// 取消共享销售
+func UpdateCompanyProductCancelisShare(companyId, productId int) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE company_product SET
+                            is_share = 0 , 
+                            share_seller = '',
+                            share_group_id = 0,
+                            share_seller_id = 0 , 
+                            share_seller_id_last  = 0 , 
+                            share_seller_last = ''
+                            WHERE company_id = ?  AND product_id= ? `
+	_, err = o.Raw(sql, companyId, productId).Exec()
+	return
+}

+ 3 - 0
models/company/wx_user_op_log.go

@@ -11,6 +11,9 @@ type WxUserOpLog struct {
 	LogType                string    `description:"日志类型:add,edit,move"`
 	UserId                 int       `description:"联系人id"`
 	CompanyId              int       `description:"客户id"`
+	CompanyName            string    `description:"客户名称"`
+	CurrentCompanyId       int       `description:"当前客户id"`
+	CurrentCompanyName     string    `description:"当前客户名称"`
 	Mobile                 string    `description:"当前手机号"`
 	Email                  string    `description:"当前邮箱"`
 	OriginalUserInfo       string    `description:"变更前的联系人信息"`

+ 4 - 0
models/cygx/activity.go

@@ -257,6 +257,8 @@ type CygxActivity struct {
 	AreaType                  int       `description:"地区,1国内,2海外,默认1"`
 	IsZoom                    int       `description:"是否是Zoom模版  1是,0否"`
 	MeetingId                 string    `description:"会议ID"`
+	ActivityPrice             float64   `description:"单场活动价格"`
+	ActivityOriginalPrice     float64   `description:"单场活动原价格"`
 }
 
 type CygxActivityEditDetail struct {
@@ -432,6 +434,8 @@ func EditActivity(item *CygxActivity, oldPublishStatus int, industrialActivityIt
 	updateParams["AreaType"] = item.AreaType
 	updateParams["MeetingId"] = item.MeetingId
 	updateParams["IsZoom"] = item.IsZoom
+	updateParams["ActivityPrice"] = item.ActivityPrice
+	updateParams["ActivityOriginalPrice"] = item.ActivityOriginalPrice
 	//修改活动信息
 	ptrStructOrTableName := "cygx_activity"
 	whereParam := map[string]interface{}{"activity_id": item.ActivityId}

+ 5 - 5
models/cygx/activity_special_permission_points.go

@@ -10,7 +10,7 @@ import (
 type CygxActivitySpecialPermissionPoints struct {
 	Id                  int       `orm:"column(id);pk"`
 	CompanyId           int       `description:"公司ID"`
-	Points              int       `description:"剩余点数"`
+	Points              float64   `description:"剩余点数"`
 	CompanyName         string    `description:"公司名称"`
 	ChartPermissionId   int       `description:"行业id"`
 	ChartPermissionName string    `description:"行业名称"`
@@ -90,7 +90,7 @@ func GetCygxActivitySpecialPermissionPointsList(condition string, pars []interfa
 }
 
 // 更新公司每个行业剩余研选点数
-func UpdateCygxActivitySpecialPermissionPoints(points, companyId, chartPermissionId int) (err error) {
+func UpdateCygxActivitySpecialPermissionPoints(points float64, companyId, chartPermissionId int) (err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
 	sql := `UPDATE cygx_activity_special_permission_points SET points = ?  WHERE company_id=?  AND chart_permission_id=? `
 	_, err = o.Raw(sql, points, companyId, chartPermissionId).Exec()
@@ -98,9 +98,9 @@ func UpdateCygxActivitySpecialPermissionPoints(points, companyId, chartPermissio
 }
 
 // 获取客户是否有研选扣点点数
-func GetCygxActivitySpecialPermissionPointsCount(companyId int) (count int, err error) {
+func GetCygxActivitySpecialPermissionPointsCount(companyId int) (points float64, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
-	sqlCount := `SELECT COUNT(1) AS count FROM cygx_activity_special_permission_points  WHERE company_id=?  `
-	err = o.Raw(sqlCount, companyId).QueryRow(&count)
+	sqlCount := `SELECT points FROM cygx_activity_special_permission_points  WHERE company_id=?  LIMIT 	  1 `
+	err = o.Raw(sqlCount, companyId).QueryRow(&points)
 	return
 }

+ 35 - 55
models/cygx/activity_special_trip_bill.go

@@ -17,7 +17,7 @@ type CygxActivitySpecialTripBill struct {
 	RealName            string    `description:"用户实际名称"`
 	AdminId             int       `description:"销售/管理员ID"`
 	Source              int       `description:"来源,1小程序,2后台添加, 3开发人员手动添加"`
-	BillDetailed        int       `description:"流水明细,判断是进账还是出账"`
+	BillDetailed        float64   `description:"流水明细,判断是进账还是出账"`
 	DoType              int       `description:"操作方式,1报名,2取消报名"`
 	RegisterPlatform    int       `description:"来源 1小程序,2:网页"`
 	ChartPermissionId   int       `description:"行业id"`
@@ -86,32 +86,6 @@ type AirborneCount struct {
 	ChartPermissionId int ` description:"品种权限ID"`
 }
 
-// 获取空降的公司报名的记录
-func GetActivitySpecialTripAirborneListByActivitySpecial(condition string, pars []interface{}) (items []*AirborneCount, err error) {
-	sqlCount := ` SELECT chart_permission_id,COUNT(1) AS count
-		FROM
-			cygx_activity_special_meeting_detail AS t
-			INNER JOIN cygx_activity_special AS a ON a.activity_id = t.activity_id 
-		WHERE
-			 1= 1  	AND YEAR ( t.create_time )= YEAR (NOW()) ` + condition + `GROUP BY chart_permission_id`
-	o := orm.NewOrmUsingDB("hz_cygx")
-	_, err = o.Raw(sqlCount, pars).QueryRows(&items)
-	return
-}
-
-// 获取空降的公司报名的记录
-func GetActivitySpecialTripAirborneCountByActivitySpecial(condition string, pars []interface{}) (count int, err error) {
-	sqlCount := ` SELECT COUNT(1) AS count
-		FROM
-			cygx_activity_special_meeting_detail AS t
-			INNER JOIN cygx_activity_special AS a ON a.activity_id = t.activity_id 
-		WHERE
-			 1= 1  	AND YEAR ( t.create_time )= YEAR (NOW()) ` + condition
-	o := orm.NewOrmUsingDB("hz_cygx")
-	err = o.Raw(sqlCount, pars).QueryRow(&count)
-	return
-}
-
 type CygxActivitySpecialTripBillDetailList struct {
 	Id                  int       `orm:"column(id);pk"`
 	UserId              int       `description:"用户id,多个用,隔开"`
@@ -125,7 +99,7 @@ type CygxActivitySpecialTripBillDetailList struct {
 	RealName            string    `description:"用户实际名称"`
 	AdminId             int       `description:"销售/管理员ID"`
 	Source              int       `description:"来源,1小程序,2后台添加, 3开发人员手动添加"`
-	BillDetailed        int       `description:"流水明细,判断是进账还是出账"`
+	BillDetailed        float64   `description:"流水明细,判断是进账还是出账"`
 	DoType              int       `description:"操作方式,1报名,2取消报名"`
 	RegisterPlatform    int       `description:"来源 1小程序,2:网页"`
 	ChartPermissionId   int       `description:"行业id"`
@@ -135,34 +109,18 @@ type CygxActivitySpecialTripBillDetailList struct {
 	Total               string    `description:"总和"`
 }
 
-//func GetCygxActivitySpecialTripBillDetailList(condition string, pars []interface{}) (item []*CygxActivitySpecialTripBillDetailList, err error) {
-//	o := orm.NewOrm()
-//	sql := `SELECT
-//			b.*,
-//			a.research_theme,
-//			c.chart_permission_name
-//		FROM
-//			cygx_activity_special_trip_bill AS b
-//			INNER JOIN chart_permission AS c ON c.chart_permission_id = b.chart_permission_id
-//			INNER JOIN cygx_activity_special AS a ON a.activity_id = b.activity_id
-//		WHERE
-//			1 = 1` + condition
-//	_, err = o.Raw(sql, pars).QueryRows(&item)
-//	return
-//}
-
 type CygxActivitySpecialPointsBillRespItem struct {
-	Id                  int    `gorm:"column:id;primary_key;AUTO_INCREMENT"`
-	Content             string `gorm:"column:content" `                                 // 内容说明
-	Total               string `gorm:"column:points;default:0;NOT NULL" `               // 合计
-	CreateTime          string `gorm:"column:create_time" `                             // 创建时间
-	CompanyId           int    `gorm:"column:company_id;default:0" `                    // 公司ID
-	CompanyName         string `gorm:"column:company_name" `                            // 公司名称
-	RealName            string `gorm:"column:real_name"`                                // 用户实际名称
-	BillDetailed        int    `gorm:"column:bill_detailed;default:0;NOT NULL" json:""` // 流水明细,判断是进账还是出账
-	ActivityName        string `description:"活动标题"`
-	ChartPermissionId   int    `description:"行业id"`
-	ChartPermissionName string `description:"行业名称"`
+	Id                  int     `gorm:"column:id;primary_key;AUTO_INCREMENT"`
+	Content             string  `gorm:"column:content" `                                 // 内容说明
+	Total               string  `gorm:"column:points;default:0;NOT NULL" `               // 合计
+	CreateTime          string  `gorm:"column:create_time" `                             // 创建时间
+	CompanyId           int     `gorm:"column:company_id;default:0" `                    // 公司ID
+	CompanyName         string  `gorm:"column:company_name" `                            // 公司名称
+	RealName            string  `gorm:"column:real_name"`                                // 用户实际名称
+	BillDetailed        float64 `gorm:"column:bill_detailed;default:0;NOT NULL" json:""` // 流水明细,判断是进账还是出账
+	ActivityName        string  `description:"活动标题"`
+	ChartPermissionId   int     `description:"行业id"`
+	ChartPermissionName string  `description:"行业名称"`
 }
 
 type CygxActivitySpecialPointsBillResp struct {
@@ -170,6 +128,20 @@ type CygxActivitySpecialPointsBillResp struct {
 }
 
 func GetCygxActivitySpecialTripBillDetailListAll(condition string, pars []interface{}) (item []*CygxActivitySpecialTripBillDetailList, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT
+			b.*
+		FROM
+			cygx_activity_special_trip_bill AS b
+		WHERE
+			1 = 1` + condition
+
+	sql += ` ORDER BY b.create_time DESC , b.id DESC `
+	_, err = o.Raw(sql, pars).QueryRows(&item)
+	return
+}
+
+func GetCygxActivitySpecialTripBillDetailListAllInit14_5(condition string, pars []interface{}) (item []*CygxActivitySpecialTripBillDetailList, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
 	sql := `SELECT
 			b.*,
@@ -226,3 +198,11 @@ GROUP BY
 	_, err = o.Raw(sql).QueryRows(&item)
 	return
 }
+
+// CygxCompanyUserType 更新权益客户身份类型
+func Updatecygx_activity_special_trip_bill(content string, id int) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `UPDATE cygx_activity_special_trip_bill SET content=?  WHERE id=? `
+	_, err = o.Raw(sql, content, id).Exec()
+	return
+}

+ 19 - 1
models/cygx/cygx_morning_meeting_reviews.go

@@ -17,6 +17,8 @@ type CygxMorningMeetingReviews struct {
 	Status        int       `json:"status"`       // 0:未发布,1:已发布
 	PartNums      int       `json:"partNums"`     // 段落数
 	IndustryNames string    `json:"industryName"` // 产业名称
+	OpUserId      int       `description:"操作人编号"`
+	OpUserName    string    `description:"操作人名称"`
 }
 
 // 添加晨报点评
@@ -59,6 +61,7 @@ type CygxMorningMeetingReviewItem struct {
 	IndustryNames string `json:"industryName"` // 产业名称
 	Pv            int    `description:"PV"`
 	Uv            int    `description:"UV"`
+	OpUserName    string `description:"操作人名称"`
 }
 
 type CygxMorningMeetingReviewsList struct {
@@ -81,6 +84,14 @@ func PublishMorningMeetingReviewById(reviewId int) (err error) {
 	return
 }
 
+// 发布报告
+func UpdateMorningMeetingReviewStatusById(status, reviewId int) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `UPDATE cygx_morning_meeting_reviews SET status= ?,publish_time=now(),modify_time=NOW() WHERE id = ? `
+	_, err = o.Raw(sql, status, reviewId).Exec()
+	return
+}
+
 type MorningReviewPublishReq struct {
 	ReviewIds string `description:"晨会id,多个用英文逗号隔开"`
 }
@@ -89,6 +100,11 @@ type MorningReviewPublishCancelReq struct {
 	ReviewId int `description:"晨会id"`
 }
 
+type MorningReviewApproveSubmiteq struct {
+	ReviewId int `description:"晨会id"`
+	Status   int `description:"0:未发布,1:已发布,2:待审核、3:已驳回、4:已撤回、5:未提交"`
+}
+
 // 取消发布报告
 func PublishCancelMorningMeetingReview(reviewId int) (err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
@@ -146,9 +162,11 @@ func UpdateCygxMorningMeetingReviews(item *CygxMorningMeetingReviews) (err error
 			  modify_time = ?,
 			  part_nums = ?,
 			  industry_names = ?,
+			  op_user_id = ?,
+			  op_user_name = ?,
 			  status = ? 
 			WHERE id = ? `
-	_, err = o.Raw(sql, item.MeetingTime, item.PublishTime, item.ModifyTime, item.PartNums, item.IndustryNames, item.Status, item.Id).Exec()
+	_, err = o.Raw(sql, item.MeetingTime, item.PublishTime, item.ModifyTime, item.PartNums, item.IndustryNames, item.OpUserId, item.OpUserName, item.Status, item.Id).Exec()
 
 	return
 }

+ 41 - 0
models/cygx/morning_meeting_review_log.go

@@ -0,0 +1,41 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxMorningMeetingReviewLog struct {
+	LogId                int       `orm:"column(log_id);pk"`
+	MeetingTime          time.Time `description:"晨会日期"`
+	CreateTime           time.Time `description:"创建时间"`
+	ModifyTime           time.Time `description:"修改时间"`
+	IndustryId           int       `description:"产业ID"`
+	IndustryName         string    `description:"产业名称"`
+	ChartPermissionName  string    `description:"行业名称"`
+	ChartPermissionId    int       `description:"行业ID"`
+	IndustrialSubjectIds string    `description:"标的ID"`
+	MeetingId            int       `description:"主表ID"`
+	Content              string    `description:"内容"`
+	ReportLink           string    `description:"报告链接"`
+	LinkArticleId        int       `description:"跳转的文章ID"`
+	Title                string    `description:"标题"`
+	Remark               string    `description:"备注说明"`
+	Operate              string    `description:"操作内容"`
+	OpUserId             int       `description:"操作人编号"`
+	OpUserName           string    `description:"操作人名称"`
+}
+
+// 添加晨报点评章节日志信息
+func AddCygxMorningMeetingReviewLog(item *CygxMorningMeetingReviewLog) (newId int64, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	newId, err = o.Insert(item)
+	return
+}
+
+func GetCygxMorningMeetingReviewLogByLogId(logId int) (item *CygxMorningMeetingReviewLog, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_morning_meeting_review_log WHERE  log_id =  ? `
+	err = o.Raw(sql, logId).QueryRow(&item)
+	return
+}

+ 8 - 0
models/cygx/report_selection.go

@@ -370,3 +370,11 @@ func GetArticleInfoByIdAndTable(table string, articleId int) (item *CygxArticleI
 	err = o.Raw(sql, articleId).QueryRow(&item)
 	return
 }
+
+// 获取最新一期
+func GetCygxReportSelectionInfoBestNew() (item *CygxReportSelectionRep, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_report_selection WHERE   publish_status = 1  ORDER BY  article_id  DESC  LIMIT  1  `
+	err = o.Raw(sql).QueryRow(&item)
+	return
+}

+ 13 - 3
models/cygx/search_keyword.go

@@ -28,12 +28,22 @@ func GetSearchKeyWordCount(condition string, pars []interface{}) (count int, err
 
 // 获取搜索关键词列表
 func GetSearchKeyWordList(condition string, pars []interface{}, startSize, pageSize int) (items []*KeyWordList, err error) {
-	sql := `SELECT COUNT( key_word ) AS key_word_num, key_word FROM cygx_search_key_word WHERE 1= 1`
+	o := orm.NewOrmUsingDB("hz_cygx")
+	//sql := `SELECT COUNT( key_word ) AS key_word_num, key_word FROM cygx_search_key_word WHERE 1= 1`
+
+	sql := `SELECT
+				key_word,
+				MAX(id) as max_id ,
+				COUNT( DISTINCT user_id ) AS key_word_num 
+			FROM
+				cygx_search_key_word 
+			WHERE
+				1 = 1 `
 	if condition != "" {
 		sql += condition
 	}
-	sql += ` GROUP BY key_word ORDER BY COUNT( key_word ) DESC LIMIT ?,? `
-	o := orm.NewOrmUsingDB("hz_cygx")
+	sql += ` GROUP BY key_word ORDER BY key_word_num DESC, max_id DESC LIMIT ?,? `
+
 	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
 	return
 }

+ 6 - 4
models/cygx/wx_user_rai_label.go

@@ -50,10 +50,12 @@ type WxUserRaiLabelList struct {
 }
 
 type WxUserRaiLabelListResp struct {
-	UserId     int    `description:"用户ID"`
-	RaiLabelId int    `description:"ID"`
-	Label      string `description:"标签内容"`
-	SourceType int    `description:"来源1:搜索关键字标签、2:产业/个股标签(线下活动)、3:产业/个股标签(线下路演)、4:产业/个股标签(线上活动)、5:产业/个股标签(线上路演)、6:销售输入标签、7:产业/个股标签(报告)、8:报告类型标签"`
+	UserId          int    `description:"用户ID"`
+	RaiLabelId      int    `description:"ID"`
+	Label           string `description:"标签内容"`
+	BackgroundColor string `description:"背景颜色"`
+	TextClolr       string `description:"字体颜色"`
+	SourceType      int    `description:"来源1:搜索关键字标签、2:产业/个股标签(线下活动)、3:产业/个股标签(线下路演)、4:产业/个股标签(线上活动)、5:产业/个股标签(线上路演)、6:销售输入标签、7:产业/个股标签(报告)、8:报告类型标签"`
 }
 
 type WxUserRaiLabelAddReq struct {

+ 3 - 1
models/db.go

@@ -268,7 +268,8 @@ func initCompany() {
 		new(company.CompanyContractNoRenewedAscribeLog),      // 合同确认不续约记录日志
 		new(company.CrmConfig),                               // 管理后台基本配置表
 		new(company.CompanyRenewalRecord),                    // 客户续约状态记录表
-		new(company.CompanyHistoryRemark),                    // 客户记录历史记录表
+		new(company.CompanyHistoryRemark),                    // 客户记录历史备注表
+		new(company.CompanyHistoryRemarkLog),                 // 客户记录历史备注日志表
 		new(company.WxUserMoveLog),                           // 客户联系人移动记录日志表
 	)
 }
@@ -442,6 +443,7 @@ func initCygx() {
 		new(cygx.CygxActivitySpecialMeetingDetail),
 		new(cygx.CygxMorningMeetingReviewChapter),
 		new(cygx.CygxMorningMeetingReviews),
+		new(cygx.CygxMorningMeetingReviewLog), //晨会操作日志
 		new(cygx.CygxResourceData),
 		new(cygx.CygxReportSelectionChartLog),
 		new(cygx.CygxActivitySpecialTripBill),

+ 20 - 18
models/fms/invoice_payment_summary.go

@@ -164,6 +164,7 @@ type InvoiceSummary struct {
 type ContractRegisterRaiData struct {
 	CompanyName   string  `gorm:"column:company_name" json:"company_name" description:"客户名称"`
 	ContractCode  string  `gorm:"column:contract_code" json:"contract_code" description:"合同编号"`
+	SellerName    string  `gorm:"column:seller_name" json:"seller_name" description:"CRM系统-权益销售名称"`
 	RaiSellerName string  `gorm:"column:rai_seller_name" json:"rai_seller_name" description:"CRM系统-权益销售名称"`
 	RaiSellerId   int     `gorm:"column:rai_seller_id" json:"rai_seller_id"  description:"CRM系统-权益销售ID"`
 	Amount        float64 `json:"amount" description:"分配金额"`
@@ -176,13 +177,14 @@ type ContractRegisterRaiData struct {
 func GetContractRegisterList(condition string, pars []interface{}, startSize, pageSize int) (items []*ContractRegisterRaiData, err error) {
 	o := orm.NewOrmUsingDB("fms")
 	sql := `SELECT 
-    		a.company_name,
-			a.rai_seller_name,
-			a.contract_code,
-			b.amount,
-			b.invoice_time 
-		 FROM contract_register  as a 
-         INNER JOIN contract_invoice as b ON a.contract_register_id = b.contract_register_id  
+			a.amount,
+			a.invoice_time ,
+			a.seller_name ,
+			b.company_name,
+			b.rai_seller_name,
+			b.contract_code
+		 FROM contract_invoice   as a 
+         INNER JOIN contract_register as b ON a.contract_register_id = b.contract_register_id  
          WHERE 1= 1 `
 	if condition != "" {
 		sql += condition
@@ -228,8 +230,8 @@ func GetContractInvoiceList(condition string, pars []interface{}, startSize, pag
 // 获取数量
 func GetContractInvoiceCount(condition string, pars []interface{}) (count int, err error) {
 	o := orm.NewOrmUsingDB("fms")
-	sqlCount := ` SELECT COUNT(1) AS count  FROM contract_register as a
-                  INNER JOIN contract_invoice as b ON a.contract_register_id = b.contract_register_id  
+	sqlCount := ` SELECT COUNT(1) AS count   FROM  contract_invoice as a
+                  INNER JOIN contract_register  as b ON a.contract_register_id = b.contract_register_id  
                   WHERE 1= 1  `
 	if condition != "" {
 		sqlCount += condition
@@ -242,8 +244,8 @@ func GetContractInvoiceCount(condition string, pars []interface{}) (count int, e
 func GetContractInvoiceAmountCount(condition string, pars []interface{}) (amount float64, err error) {
 	o := orm.NewOrmUsingDB("fms")
 	sql := `SELECT
-			SUM( amount ) AS amount FROM contract_register  as a
-			INNER JOIN contract_invoice as b ON a.contract_register_id = b.contract_register_id  
+			SUM( amount ) AS amount FROM contract_invoice    as a
+			INNER JOIN contract_register as b ON a.contract_register_id = b.contract_register_id  
 			WHERE 1= 1  `
 	if condition != "" {
 		sql += condition
@@ -256,13 +258,13 @@ func GetContractInvoiceAmountCount(condition string, pars []interface{}) (amount
 func GetContractRegisterListByStartDate(startDate, endDate string) (results []*ContractRegisterRaiData, err error) {
 	o := orm.NewOrmUsingDB("fms")
 	sql := `SELECT 
-			a.rai_seller_id,
-			a.contract_type,
-			b.amount,
-			b.invoice_time,
-			b.invoice_type
-		 FROM contract_register  as a 
-         INNER JOIN contract_invoice as b ON a.contract_register_id = b.contract_register_id    AND a.is_deleted = 0  AND  b.invoice_time >= ?  AND  b.invoice_time <= ?    `
+			a.seller_id as  rai_seller_id ,
+			b.contract_type,
+			a.amount,
+			a.invoice_time,
+			a.invoice_type
+		 FROM contract_invoice   as a 
+         INNER JOIN contract_register as b ON a.contract_register_id = b.contract_register_id    AND a.is_deleted = 0  AND  a.invoice_time >= ?  AND  a.invoice_time <= ?    `
 	_, err = o.Raw(sql, startDate, endDate).QueryRows(&results)
 	return
 }

+ 5 - 0
models/roadshow/calendar.go

@@ -29,6 +29,11 @@ type AddActivityReq struct {
 	EnglishCompany   int `description:"是否为英文客户"`
 }
 
+type AddActivityResp struct {
+	Points  int `description:"点数"`
+	AddType int `description:"添加类型,1成功(扣点数),2成功(不扣点数),3失败"`
+}
+
 type CalendarResearcher struct {
 	ResearcherId   int    `description:"研究员id"`
 	ResearcherName string `description:"研究员名称"`

+ 33 - 11
models/roadshow/report_record.go

@@ -59,17 +59,19 @@ type AdminReportRecord struct {
 
 // RsReportRecordNum 系统用户统计信息
 type RsReportRecordNum struct {
-	TryOutNum   int    `description:"试用路演次数"`
-	FormalNum   int    `description:"正式路演次数"`
-	MeetingNum  int    `description:"会议次数"`
-	OnlineNum   int    `description:"线上路演次数"`
-	OfflineNum  int    `description:"线上路演次数"`
-	RoadShowNum int    `description:"路演总次数"`
-	SalonNum    int    `description:"沙龙路演次数"`
-	AskNum      int    `description:"提交过问答的路演次数"`
-	StartDate   string `description:"开始日期"`
-	EndDate     string `description:"结束日期"`
-	IsLook      bool   `description:"是否可以查看详情"`
+	TryOutNum    int    `description:"试用路演次数"`
+	FormalNum    int    `description:"正式路演次数"`
+	MeetingNum   int    `description:"会议次数"`
+	OnlineNum    int    `description:"线上路演次数"`
+	OfflineNum   int    `description:"线上路演次数"`
+	RoadShowNum  int    `description:"路演总次数"`
+	SalonNum     int    `description:"沙龙路演次数"`
+	AskTryOutNum int    `description:"提交过问答的路演次数"`
+	AskFormalNum int    `description:"提交过问答的路演次数"`
+	AskNum       int    `description:"提交过问答的路演次数"`
+	StartDate    string `description:"开始日期"`
+	EndDate      string `description:"结束日期"`
+	IsLook       bool   `description:"是否可以查看详情"`
 }
 
 func DeleteRsReportRecord(rsCalendarId, rsCalendarResearcherId int) (err error) {
@@ -102,6 +104,26 @@ func GetGroupResearcherRecordList(condition string, pars []interface{}) (list []
 	return
 }
 
+// GetGroupResearcherRecordListAsk 获取研究员分组数据()
+func GetGroupResearcherRecordListAsk(condition string, pars []interface{}) (list []*RsReportRecordGroup, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT 
+				a.researcher_id AS admin_id,
+				a.researcher_group_id AS group_id,
+				a.researcher_name admin_name,
+				count( 1 ) num  
+				FROM  rs_report_record a 
+				inner join rs_calendar_researcher AS c ON a.rs_calendar_id=c.rs_calendar_id AND a.rs_calendar_researcher_id=c.rs_calendar_researcher_id
+				WHERE 1=1 and a.rs_calendar_researcher_status = 2 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` GROUP BY 	a.researcher_id `
+	_, err = o.Raw(sql, pars).QueryRows(&list)
+
+	return
+}
+
 // GetGroupSellerRecordList 获取销售分组数据
 func GetGroupSellerRecordList(condition string, pars []interface{}) (list []*RsReportRecordGroup, err error) {
 	o := orm.NewOrm()

+ 2 - 1
models/roadshow/rs_calendar_relation.go

@@ -371,10 +371,11 @@ func GetRsCalendarResearcherInfoIByResearcherIdAndDate(researcherId int, startDa
 	//WHERE b.source=1 and a.status=2 and c.calendar_type=1 and a.researcher_id=? and start_date>=? and end_date <= ? `
 
 	//杭州创建的路演活动,如果上海被删除了,那么也要同步删除杭州的(所以相对于上面的逻辑,下面移除了来源的where条件)
+	// 需求池1065 同步上海CRM路演信息时,若某路演在我们的CRM中创建,即便在上海CRM中没有查到,也不做删除
 	sql := `SELECT a.*,c.third_calendar_id,c.calendar_type FROM rs_calendar_researcher a 
 join rs_calendar b on a.rs_calendar_id=b.rs_calendar_id
 join rs_calendar_relation c on a.rs_calendar_researcher_id=c.self_calendar_id
-WHERE a.status=2 and c.calendar_type=1 and a.researcher_id=? and start_date>=? and end_date <= ? `
+WHERE a.status=2 and c.calendar_type=1 AND b.source = 1 and a.researcher_id=? and start_date>=? and end_date <= ? `
 	_, err = o.Raw(sql, researcherId, startDate, endDate).QueryRows(&items)
 	return
 }

+ 7 - 5
models/statistic_report.go

@@ -822,7 +822,7 @@ func GetIncrementalCompanyListByOperationRecord(condition string, pars []interfa
 	sql1 += ` GROUP BY a.company_id, a.product_id `
 
 	//查询真正的数据
-	sql := `SELECT a.id, a.company_id, b.company_name, c.seller_id, c.seller_name, c.seller_name_init, a.product_id, a.product_name, a.create_time, b.region_type, c.renewal_reason, c.renewal_todo, c.status , a.sys_real_name, a.operation FROM company_operation_record a
+	sql := `SELECT a.id, a.company_id, b.company_name, c.seller_id, c.seller_name, c.seller_name_init, a.product_id, a.product_name, a.create_time, b.region_type, c.renewal_reason, c.renewal_todo, c.status , a.sys_real_name, a.operation, c.share_seller FROM company_operation_record a
 		RIGHT JOIN company b ON a.company_id = b.company_id
 		JOIN company_product c ON b.company_id = c.company_id 
 		AND a.product_id = c.product_id
@@ -966,14 +966,16 @@ type CompanyContractGroupList struct {
 func GetCompanyContractGroupList(condition string, pars []interface{}) (items []*CompanyContractGroupList, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT
-			company_id,
-			COUNT( company_id )  company_count 
+			a.company_id,
+			COUNT( a.company_id )  company_count 
 		FROM
-			company_contract AS a  WHERE  product_id = 2  `
+			company_contract AS a  
+		INNER  JOIN company_product  AS b ON a.company_id = b.company_id 
+		WHERE  b.product_id = 2   `
 	if condition != "" {
 		sql += condition
 	}
-	sql += ` GROUP BY company_id `
+	sql += ` GROUP BY a.company_id `
 	_, err = o.Raw(sql, pars).QueryRows(&items)
 	return
 }

+ 2 - 1
models/statistic_report/rai_data_summary.go

@@ -113,8 +113,9 @@ func GetRaiDataSummaryList(condition string, pars []interface{}) (items []*Incre
 			   a.share_seller_last,
 			   a.share_seller_id_last
        FROM company_contract a
+    	INNER JOIN  company_product c ON a.company_id = c.company_id and a.product_id=c.product_id and  c.product_id = 2 
 	   JOIN company b ON a.company_id = b.company_id
-	   JOIN company_product c ON a.company_id = c.company_id and a.product_id=c.product_id WHERE 1 = 1 `
+	   WHERE 1 = 1 `
 	if condition != "" {
 		sql += condition
 	}

+ 14 - 4
models/system/sys_admin.go

@@ -466,19 +466,21 @@ func GetSysuserRaiList() (items []*AdminItem, err error) {
 	sql := `SELECT
 			real_name,
 			mobile,
+			group_id,
 			group_name 
 		FROM
 			admin 
 		WHERE
-			role_type_code IN ('rai_group','rai_seller')
-			AND group_id NOT IN ( 19, 10, 17 )
+			role_type_code IN ( 'rai_group', 'rai_seller' ) 
+			AND group_id NOT IN ( 19, 10, 17, 68, 72 ) 
 			AND enabled = 1 
-			OR real_name IN ( '沈涛', '张传星' ) ` // 先写死,看情况要不要改
+			OR real_name IN ( '沈涛', '张传星' ) 
+			OR ( group_name = '未分组' AND enabled = 1 ) ` // 先写死,看情况要不要改
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
 
-// GetSysuserRaiList 获取除服务组之外的所有权益销售
+// GetSysuserRaiListNoServer 获取除服务组之外的所有权益销售
 func GetSysuserRaiListNoServer() (items []*AdminItem, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT  * FROM admin WHERE role_type_code  IN ('rai_group','rai_seller')   AND role_name NOT IN ('权益服务销售','权益服务组长')  `
@@ -550,3 +552,11 @@ type SyncGroupData struct {
 	Source  int `description:"来源: 1-CRM; 2-ETA"`
 	GroupId int `description:"分组ID"`
 }
+
+// UpdateAdminRoleInfoByRoleId 更新管理员角色信息
+func UpdateAdminRoleInfoByRoleId(roleId int, roleName string, roleTypeCode string) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE admin SET role_name = ?, role_type_code = ? WHERE role_id = ?`
+	_, err = o.Raw(sql, roleName, roleTypeCode, roleId).Exec()
+	return
+}

+ 27 - 0
routers/commentsRouter.go

@@ -2167,6 +2167,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:MorningMeetingController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:MorningMeetingController"],
+        beego.ControllerComments{
+            Method: "ApproveSubmitReport",
+            Router: `/morningMeeting/approve/submit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:MorningMeetingController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:MorningMeetingController"],
         beego.ControllerComments{
             Method: "Delete",
@@ -2410,6 +2419,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"],
+        beego.ControllerComments{
+            Method: "DeleteRemark",
+            Router: `/rai_serve/remark/delete`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"],
+        beego.ControllerComments{
+            Method: "EditRemark",
+            Router: `/rai_serve/remark/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"],
         beego.ControllerComments{
             Method: "RemarkList",

+ 6 - 6
services/company.go

@@ -876,7 +876,7 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 				return
 			} else if status == utils.COMPANY_STATUS_TRY_OUT { //试用
 				button.BtnEdit = true
-				button.BtnDelete = true
+				//button.BtnDelete = true //需求池1067
 				if productId == utils.COMPANY_PRODUCT_RAI_ID {
 					button.BtnRemarkViewHistory = true
 				} else {
@@ -898,21 +898,21 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 				return
 			} else if status == utils.COMPANY_STATUS_LOSE { //流失
 				//button.BtnModifySeller = true
-				button.BtnDelete = true
+				//button.BtnDelete = true //需求池1067
 				if productId == utils.COMPANY_PRODUCT_RAI_ID {
 					button.BtnRemarkViewHistory = true
 				}
 				return
 			} else if status == utils.COMPANY_STATUS_CLOSE { // 关闭
 				//button.BtnModifySeller = true
-				button.BtnDelete = true
+				//button.BtnDelete = true //需求池1067
 				if productId == utils.COMPANY_PRODUCT_FICC_ID {
 					button.BtnLoss = true // 超管/FICC管理员可关闭转流失
 				}
 				return
 			} else { //永续
 				//button.BtnModifySeller = true
-				button.BtnDelete = true
+				//button.BtnDelete = true //需求池1067
 				button.BtnEdit = true
 				if productId == utils.COMPANY_PRODUCT_RAI_ID {
 					button.BtnRemarkViewHistory = true
@@ -1027,7 +1027,7 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 						}
 					} else if productStatus == utils.COMPANY_STATUS_TRY_OUT { //试用
 						button.BtnEdit = true
-						button.BtnDelete = true
+						//button.BtnDelete = true //需求池1067
 						button.BtnSuspend = true
 						button.BtnDelay = true
 						button.BtnTurnPositive = true
@@ -1191,7 +1191,7 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 						button.BtnRemarkViewHistory = true
 					} else if productStatus == utils.COMPANY_STATUS_TRY_OUT { //试用
 						button.BtnEdit = true
-						button.BtnDelete = true
+						//button.BtnDelete = true //需求池1067
 						button.BtnSuspend = true
 						button.BtnDelay = true
 						button.BtnTurnPositive = true

+ 3 - 1
services/company_apply/company_approval.go

@@ -410,7 +410,8 @@ func Approved(approvalRecord *contract.ContractApprovalRecord, opUser *system.Ad
 					return
 				}
 				if time.Now().After(contractStartDate) {
-					cygxService.ActivitySpecialCompanyApproval(recordInfo.CompanyId, recordInfo.CompanyContractId, companyInfo.CompanyName) //审批通过的时候专项调研次数更新
+					//cygxService.ActivitySpecialCompanyApproval(recordInfo.CompanyId, recordInfo.CompanyContractId, companyInfo.CompanyName) //审批通过的时候专项调研次数更新
+					cygxService.ActivitySpecialCompanyApprovalRedis(recordInfo.CompanyId, recordInfo.CompanyContractId) //审批通过的时候专项调研次数更新
 					//cygxService.ActivitySpecialCompanyApproval(recordInfo.CompanyContractId) //审批通过的时候专项调研次数更新
 				}
 				//}
@@ -730,6 +731,7 @@ func afterApproved(companyApprovalId int, opUserId int, opUserName string) (err
 			startDate = tmpStartDate
 			endDate = tmpEndDate
 		}
+		go AddCompanyHistoryRemarkByCompanyApply(recodeInfo) //权益销售冻结销售申请试用,审批通过后,将申请内容添加到备注
 
 	case 3: //试用延期
 		tmpCompanyReportPermissionList, tmpEndDate, tmpErr := company.TryOutDelay(recodeInfo.CompanyId, recodeInfo.ProductId, opUser.AdminId, recodeInfo.CompanyApprovalId, opUser.RealName, companyProduct.EndDate, companyProduct.ProductName)

+ 72 - 0
services/company_apply/company_history_remark.go

@@ -0,0 +1,72 @@
+package company_apply
+
+import (
+	"fmt"
+	"hongze/hz_crm_api/models/company"
+	"hongze/hz_crm_api/services/alarm_msg"
+	"hongze/hz_crm_api/utils"
+	"time"
+)
+
+// 权益销售冻结销售申请试用,审批通过后,将申请内容添加到备注
+func AddCompanyHistoryRemarkByCompanyApply(recodeInfo *company.CompanyApproval) {
+	if recodeInfo.ProductId != 2 {
+		return
+	}
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println("err:", err)
+			go alarm_msg.SendAlarmMsg(fmt.Sprint(" 权益销售冻结销售申请试用,审批通过后,将申请内容添加到备注 失败,AddCompanyHistoryRemarkByCompanyApply Err:", err.Error(), recodeInfo), 3)
+		}
+	}()
+
+	item := new(company.CompanyHistoryRemark)
+	item.CompanyId = recodeInfo.CompanyId
+	item.ProductId = 2
+	item.Content = recodeInfo.ApplyReasons
+	item.SysAdminId = recodeInfo.ApplyUserId
+	item.SysAdminName = recodeInfo.ApplyRealName
+	item.CreateTime = time.Now()
+	item.ModifyTime = time.Now()
+	item.ShowTime = time.Now()
+	item.TableName = "company_approval"
+	item.TableId = recodeInfo.CompanyApprovalId
+	err = company.AddCompanyHistoryRemark(item)
+	return
+}
+
+//func init() {
+//	init16_9_2()
+//}
+
+func init16_9_2() {
+	var condition string
+	var pars []interface{}
+	condition = "  AND  product_id = 2   AND approve_content = '冻结转试用'  AND approve_status = '已审批' "
+
+	CompanyApprovalList, e := company.GetCompanyApprovalList(condition, pars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		fmt.Println(e)
+		return
+	}
+	fmt.Println(len(CompanyApprovalList))
+	//return
+
+	for k, recodeInfo := range CompanyApprovalList {
+		item := new(company.CompanyHistoryRemark)
+		item.CompanyId = recodeInfo.CompanyId
+		item.ProductId = 2
+		item.Content = recodeInfo.ApplyReasons
+		item.SysAdminId = recodeInfo.ApplyUserId
+		item.SysAdminName = recodeInfo.ApplyRealName
+		item.CreateTime = time.Now()
+		item.ModifyTime = time.Now()
+		item.ShowTime = recodeInfo.ApproveTime
+		item.TableName = "company_approval"
+		item.TableId = recodeInfo.CompanyApprovalId
+		err := company.AddCompanyHistoryRemark(item)
+		fmt.Println(k, "____", err)
+	}
+
+}

+ 5 - 5
services/company_ascribe.go

@@ -110,10 +110,10 @@ func GetCompanyContractNoRenewedAscribeListMap() (mapCountResp map[int]bool) {
 	}()
 	var condition string
 	var pars []interface{}
-	condition = ` AND company_ascribe_id != 9 `
-	list, e := company.GetCompanyContractNoRenewedAscribeList(condition, pars, 0, 0)
+	condition = `  AND a.company_ascribe_id != 9  AND b.contract_type != '打分派点' `
+	list, e := company.GetCompanyContractNoRenewedAscribeListJoin(condition, pars, 0, 0)
 	if e != nil && e.Error() != utils.ErrNoRow() {
-		err = errors.New("GetCompanyContractNoRenewedAscribeList, Err: " + e.Error())
+		err = errors.New("GetCompanyContractNoRenewedAscribeListJoin, Err: " + e.Error())
 		return
 	}
 	mapCountResp = make(map[int]bool, 0)
@@ -134,8 +134,8 @@ func GetCompanyContractNoRenewedAscribeListArr() (companyContractIds []int) {
 	}()
 	var condition string
 	var pars []interface{}
-	condition = ` AND company_ascribe_id != 9 `
-	list, e := company.GetCompanyContractNoRenewedAscribeList(condition, pars, 0, 0)
+	condition = ` AND a.company_ascribe_id != 9  AND b.contract_type != '打分派点'  `
+	list, e := company.GetCompanyContractNoRenewedAscribeListJoin(condition, pars, 0, 0)
 	if e != nil && e.Error() != utils.ErrNoRow() {
 		err = errors.New("GetCompanyContractNoRenewedAscribeList, Err: " + e.Error())
 		return

+ 1 - 1
services/company_permission.go

@@ -24,7 +24,7 @@ func RaiCompanyPermissionAndCheckList(companyId int, unify bool, filterPermissio
 	checkList := make([]int, 0) // 客户拥有的权限, 用于前端匹配权限列表回显
 
 	// 获取权益权限列表
-	permissionItems, e := company.GetPermissionLookItems(productId, productName)
+	permissionItems, e := company.GetPermissionLookItemsRai(productId, productName)
 	if e != nil {
 		err = errors.New("获取权益权限列表失败, Err: " + e.Error())
 		return

+ 12 - 1
services/contract/contract.go

@@ -1261,7 +1261,7 @@ func GetServicePermissionMap(serviceList []*contract.ContractServiceAndDetail) (
 			for _, v := range allFiccPermissions {
 				if v.ParentId == 0 {
 					//合同这边市场策略不需要体现出来,所以调整返回
-					if v.PermissionName == "市场策略" {
+					if v.PermissionName == "市场策略" || v.PermissionName == "固定收益" {
 						continue
 					}
 					items, ok := permissionMap[v.ChartPermissionId]
@@ -1809,6 +1809,17 @@ func GetCompanyContractCountRaiByLastYear(companyId int, startDate string) (tota
 	startDateTimeFirst, _ := time.Parse(utils.FormatDate, firstContractRai.StartDate)
 	if startDateTime.Before(startDateTimeFirst) {
 		total = 1
+		return
+	}
+	//当前合同的开始时间,距离上一份合同的结束时间,超过一年,就属于新签
+	lastContractRai, err := company.GetLastContractRai(companyId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+
+	startDateTimeLast, _ := time.Parse(utils.FormatDate, lastContractRai.EndDate)
+	if startDateTime.After(startDateTimeLast) {
+		total = 1
 	}
 	return
 }

+ 20 - 18
services/cygx/acitvity.go

@@ -1256,15 +1256,16 @@ func DoActivityOnenIdWxTemplateMsg(activityId int) (err error) {
 		item := new(models.OpenIdList)
 		item.UserId = v.UserId
 		item.OpenId = v.OpenId
-		if mapUserIdChooseSend[v.UserId] == 0 {
-			//如果小助手没有选择过权限信息,那么做消息推送
-			OpenIdList = append(OpenIdList, item)
-		} else {
-			//如果勾选了权限信息,则要满足 1选择产业,2没有选择不接受任何消息推送,3活动对应的主客观跟自己选择的一致。
-			if mapOpenidFllow[v.UserId] != "" && mapOpenidRefuset[v.UserId] == "" && mapUserIdChooseTypeSend[v.UserId] != 0 {
-				OpenIdList = append(OpenIdList, item)
-			}
-		}
+		OpenIdList = append(OpenIdList, item)
+		//if mapUserIdChooseSend[v.UserId] == 0 {
+		//	//如果小助手没有选择过权限信息,那么做消息推送
+		//	OpenIdList = append(OpenIdList, item)
+		//} else {
+		//	//如果勾选了权限信息,则要满足 1选择产业,2没有选择不接受任何消息推送,3活动对应的主客观跟自己选择的一致。
+		//	if mapOpenidFllow[v.UserId] != "" && mapOpenidRefuset[v.UserId] == "" && mapUserIdChooseTypeSend[v.UserId] != 0 {
+		//		OpenIdList = append(OpenIdList, item)
+		//	}
+		//}
 	}
 
 	var openiditems []*cygx.CygxActivityUserTemplateRecord
@@ -1292,15 +1293,16 @@ func DoActivityOnenIdWxTemplateMsg(activityId int) (err error) {
 		item := new(models.OpenIdList)
 		item.UserId = v.UserId
 		item.OpenId = v.OpenId
-		if mapUserIdChooseSend[v.UserId] == 0 {
-			//如果小助手没有选择过权限信息,那么做消息推送
-			OpenIdListYx = append(OpenIdListYx, item)
-		} else {
-			//如果勾选了权限信息,则要满足 1选择产业,2没有选择不接受任何消息推送,3活动对应的主客观跟自己选择的一致。
-			if mapOpenidFllow[v.UserId] != "" && mapOpenidRefuset[v.UserId] == "" && mapUserIdChooseTypeSend[v.UserId] != 0 {
-				OpenIdListYx = append(OpenIdListYx, item)
-			}
-		}
+		OpenIdListYx = append(OpenIdListYx, item)
+		//if mapUserIdChooseSend[v.UserId] == 0 {
+		//	//如果小助手没有选择过权限信息,那么做消息推送
+		//	OpenIdListYx = append(OpenIdListYx, item)
+		//} else {
+		//	//如果勾选了权限信息,则要满足 1选择产业,2没有选择不接受任何消息推送,3活动对应的主客观跟自己选择的一致。
+		//	if mapOpenidFllow[v.UserId] != "" && mapOpenidRefuset[v.UserId] == "" && mapUserIdChooseTypeSend[v.UserId] != 0 {
+		//		OpenIdListYx = append(OpenIdListYx, item)
+		//	}
+		//}
 	}
 
 	var openIdArrYx []string

+ 110 - 11
services/cygx/activity_points_set.go

@@ -68,21 +68,21 @@ func CheckActivityPointsSet(pointsSet *cygx.CygxActivityPointsSetRsq, activityId
 
 	companyId := pointsSet.CompanyId
 	if companyId > 0 {
-		pointsCompany, e := cygx.GetCygxActivityPointsCompanyByCompanyId(companyId)
+		pointsCompany, e := cygx.GetCygxActivitySpecialPermissionPointsCount(companyId)
 		if e != nil && e.Error() != utils.ErrNoRow() {
 			err = errors.New("GetCygxActivityPointsCompanyByCompanyId,Err" + e.Error())
 			return
 		}
-		if pointsCompany == nil {
-			errMsg = "公司剩余点数不足"
-			return
-		}
+		//if pointsCompany == nil {
+		//	errMsg = "公司剩余点数不足"
+		//	return
+		//}
 		companyPointsNum, _ := strconv.ParseFloat(pointsSet.CompanyPointsNum, 2)
 		if companyPointsNum == 0 {
 			errMsg = "办会人扣点数量设置有误" + pointsSet.CompanyPointsNum
 		}
 		if activityId == 0 {
-			if companyPointsNum > pointsCompany.Points {
+			if companyPointsNum > pointsCompany {
 				errMsg = "公司剩余点数不足"
 			}
 		} else {
@@ -93,29 +93,29 @@ func CheckActivityPointsSet(pointsSet *cygx.CygxActivityPointsSetRsq, activityId
 			}
 			if pointsSetDetail != nil {
 				if pointsSetDetail.CompanyId != companyId {
-					if companyPointsNum > pointsCompany.Points {
+					if companyPointsNum > pointsCompany {
 						errMsg = "公司剩余点数不足"
 					}
 				} else {
 					//查询最新的一条针对这个公司的扣点记录
 					var condition string
 					var pars []interface{}
-					condition += ` AND activity_id = ? AND company_id = ? AND mobile = ''   ORDER BY id DESC LIMIT 1  `
+					condition += ` AND activity_id = ? AND company_id = ? AND mobile = ''  AND table_source = 'activityspecial'   ORDER BY id DESC LIMIT 1  `
 					pars = append(pars, activityId, companyId)
-					activityPointsBillDetail, e := cygx.GetCygxActivityPointsBillDetailByCondition(condition, pars)
+					activityPointsBillDetail, e := cygx.GetCygxActivitySpecialTripBill(condition, pars)
 					if e != nil && e.Error() != utils.ErrNoRow() {
 						err = errors.New("GetCompanyPoints, Err: " + e.Error())
 						return
 					}
 					if activityPointsBillDetail != nil {
 						CompanyPointsNumOld, _ := strconv.ParseFloat(pointsSetDetail.CompanyPointsNum, 2)
-						if pointsCompany.Points-companyPointsNum+CompanyPointsNumOld < 0 {
+						if pointsCompany-companyPointsNum+CompanyPointsNumOld < 0 {
 							errMsg = "公司剩余点数不足"
 						}
 					}
 				}
 			} else {
-				if companyPointsNum > pointsCompany.Points {
+				if companyPointsNum > pointsCompany {
 					errMsg = "公司剩余点数不足"
 				}
 			}
@@ -329,6 +329,105 @@ func YanXuanCompanyApproval(comapnyId, companyContractId int) (err error) {
 	return
 }
 
+// 9用户报名专项调研活动扣点处理
+func SpecialActivityPointsBillSignupAddSpecial(activityId, uid, adminId int) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			msg := fmt.Sprint("activityId:", activityId, "userId:", uid)
+			go alarm_msg.SendAlarmMsg("用户报名专项调研活动扣点处理,写入Redis队列消息失败:"+err.Error()+msg, 2)
+		}
+	}()
+	//SourceType int       `description:"1:报名、 2:取消报名、3:活动编辑、4:活动发布,取消发布、5:活动到会。"`
+	log := &cygx.YanXuanActivityPointsRedis{UserId: uid, ActivityId: activityId, SourceType: 9, AdminId: adminId, Source: 2, CreateTime: time.Now()}
+	if utils.Re == nil {
+		err = utils.Rc.LPush(utils.CYGX_YANXUAN_POINTS_KEY, log)
+		if err != nil {
+			fmt.Println("YanXuanActivityPointsRedis LPush Err:" + err.Error())
+		}
+	}
+	return
+}
+
+// 10 用户取消报名专项调研活动扣点处理
+func ActivityPointsBillSignupCancelSpecial(activityId, uid, adminId int) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			msg := fmt.Sprint("activityId:", activityId, "userId:", uid)
+			go alarm_msg.SendAlarmMsg("用户取消报名专项调研活动扣点处理,写入Redis队列消息失败:"+err.Error()+msg, 2)
+		}
+	}()
+	//SourceType int       `description:"1:报名、 2:取消报名、3:活动编辑、4:活动发布,取消发布、5:活动到会。"`
+	log := &cygx.YanXuanActivityPointsRedis{UserId: uid, ActivityId: activityId, SourceType: 10, AdminId: adminId, Source: 2, CreateTime: time.Now()}
+	if utils.Re == nil {
+		err := utils.Rc.LPush(utils.CYGX_YANXUAN_POINTS_KEY, log)
+		if err != nil {
+			fmt.Println("YanXuanActivityPointsRedis LPush Err:" + err.Error())
+		}
+	}
+	return
+}
+
+// 11 合同审批通过的时候,专项调研点数更新
+func ActivitySpecialCompanyApprovalRedis(comapnyId, companyContractId int) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			msg := fmt.Sprint("comapnyId:", comapnyId)
+			go alarm_msg.SendAlarmMsg("研选审批通过的时候研选扣点更新,写入Redis队列消息失败:"+err.Error()+msg, 2)
+		}
+	}()
+	//SourceType int       `description:"1:报名、 2:取消报名、3:活动编辑、4:活动发布,取消发布、5:活动到会。"`
+	log := &cygx.YanXuanActivityPointsRedis{ComapnyId: comapnyId, CompanyContractId: companyContractId, SourceType: 11, Source: 2, CreateTime: time.Now()}
+	if utils.Re == nil {
+		err := utils.Rc.LPush(utils.CYGX_YANXUAN_POINTS_KEY, log)
+		if err != nil {
+			fmt.Println("YanXuanActivityPointsRedis LPush Err:" + err.Error())
+		}
+	}
+	return
+}
+
+// 12  专项调研活动到会研选扣点处理
+func SpecialActivityPointsBillSubmitMeeting(activityId, adminId int) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			msg := fmt.Sprint("activityId:", activityId)
+			go alarm_msg.SendAlarmMsg("专项调研活动到会研选扣点处理,写入Redis队列消息失败:"+err.Error()+msg, 2)
+		}
+	}()
+	//SourceType int       `description:"1:报名、 2:取消报名、3:活动编辑、4:活动发布,取消发布、5:活动到会。6:研选审批通过的时候研选扣点更新、 7:正式专试用定时任务更新研选扣点"`
+	log := &cygx.YanXuanActivityPointsRedis{ActivityId: activityId, SourceType: 12, AdminId: adminId, Source: 2, CreateTime: time.Now()}
+	if utils.Re == nil {
+		err := utils.Rc.LPush(utils.CYGX_YANXUAN_POINTS_KEY, log)
+		if err != nil {
+			fmt.Println("YanXuanActivityPointsRedis LPush Err:" + err.Error())
+		}
+	}
+	return
+}
+
+// 13  给公司添加路演,对应专项调研扣点处理
+func SpecialActivityPointsBillRoadShow(activityId, adminId int) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			msg := fmt.Sprint("activityId:", activityId)
+			go alarm_msg.SendAlarmMsg("专项调研活动到会研选扣点处理,写入Redis队列消息失败:"+err.Error()+msg, 2)
+		}
+	}()
+	log := &cygx.YanXuanActivityPointsRedis{ActivityId: activityId, SourceType: 13, AdminId: adminId, Source: 2, CreateTime: time.Now()}
+	if utils.Re == nil {
+		err := utils.Rc.LPush(utils.CYGX_YANXUAN_POINTS_KEY, log)
+		if err != nil {
+			fmt.Println("YanXuanActivityPointsRedis LPush Err:" + err.Error())
+		}
+	}
+	return
+}
+
 func init0703() {
 	//2023.07.03剩余服务点数初始化
 	path := "0703.xlsx"

+ 1 - 1
services/cygx/activity_poster.go

@@ -97,7 +97,7 @@ func MakeActivitySigninImg(activityId int) (imgUrl string, err error) {
 	if activityInfo == nil {
 		return
 	}
-	if activityInfo.ActivityTypeId != 5 && activityInfo.ActivityTypeId != 6 && activityInfo.ActivityTypeId != 8 {
+	if !utils.InArrayByInt(utils.SHOW_SIGNIN_BUTTON_ACTIVITY_TYPE_ID, activityInfo.ActivityTypeId) {
 		return
 	}
 	itemToken, err := models.GetWxToken(utils.WxCygxAppId, utils.WxCygxAppSecret)

+ 17 - 9
services/cygx/activity_power_check.go

@@ -532,6 +532,14 @@ func GetSpecialDetailUserPower(user *models.WxUser, activityInfo *cygx.ActivityS
 		havePower = true
 		return
 	}
+	userPointsNum, e := cygx.GetCygxActivityPointsSetUserNum(activityInfo.ActivityId)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCygxActivityPointsSetUserNum, Err: " + e.Error())
+		return
+	}
+	if userPointsNum > 0 {
+		return
+	}
 	userType, _, permissionStr, _, e := GetUserType(user.CompanyId)
 	if e != nil {
 		err = errors.New("GetCompanyPermissionUpgrade, Err: " + e.Error())
@@ -554,22 +562,22 @@ func GetSpecialDetailUserPower(user *models.WxUser, activityInfo *cygx.ActivityS
 			return
 		}
 	}
-	permissionShengji, errs := cygx.GetCompanyPermissionByUserTrip(user.CompanyId)
-	if errs != nil {
-		err = errs
-		return
-	}
+	//permissionShengji, errs := cygx.GetCompanyPermissionByUserTrip(user.CompanyId)
+	//if errs != nil {
+	//	err = errs
+	//	return
+	//}
 	//如果有升级权限的自动添加策略、固收的升级权限
 	if permissionStr != "" {
 		if activityInfo.ChartPermissionName == utils.CE_LUE_NAME {
-			permissionShengji += "," + utils.CE_LUE_NAME
+			permissionStr += "," + utils.CE_LUE_NAME
 		}
 		if activityInfo.ChartPermissionName == utils.GU_SHOU_NAME {
-			permissionShengji += "," + utils.GU_SHOU_NAME
+			permissionStr += "," + utils.GU_SHOU_NAME
 		}
 	}
 	//如果没有对应的升级权限,则返回
-	if !strings.Contains(permissionShengji, activityInfo.ChartPermissionName) {
+	if !strings.Contains(permissionStr, activityInfo.ChartPermissionName) {
 		return
 	}
 
@@ -592,7 +600,7 @@ func GetSpecialDetailUserPower(user *models.WxUser, activityInfo *cygx.ActivityS
 		return
 	}
 
-	if strings.Contains(permissionShengji, activityInfo.ChartPermissionName) && strings.Contains(activityInfo.CustomerTypeIds, "8") {
+	if strings.Contains(permissionStr, activityInfo.ChartPermissionName) && strings.Contains(activityInfo.CustomerTypeIds, "8") {
 		havePower = true
 		return
 	}

+ 2 - 2
services/cygx/activity_signup.go

@@ -432,12 +432,12 @@ func CheckActivityPoints(activityInfo *cygx.ActivityDetail, wxUser *models.WxUse
 	if activityInfo.IsResearchPoints == 1 {
 		//获取活动对用户要扣的点
 		userPointsNum, e := cygx.GetCygxActivityPointsSetUserNum(activityInfo.ActivityId)
-		if e != nil {
+		if e != nil && e.Error() != utils.ErrNoRow() {
 			err = errors.New("GetCygxActivityPointsSetUserNum, Err: " + e.Error())
 			return
 		}
 		// 获取用户所在公司剩余的点
-		companyPointsNum, e := cygx.GetCompanyPoints(wxUser.CompanyId)
+		companyPointsNum, e := cygx.GetCygxActivitySpecialPermissionPointsCount(wxUser.CompanyId)
 		if e != nil && e.Error() != utils.ErrNoRow() {
 			err = errors.New("GetCompanyPoints, Err: " + e.Error())
 			return

+ 195 - 190
services/cygx/activity_special.go

@@ -556,202 +556,146 @@ func GetChartPermissionSpecialSurplusByCompany(companyId int) (userType int, tri
 //}
 
 // 审批通过的时候专项调研次数更新
-func ActivitySpecialCompanyApproval(companyId, companyContractId int, companyName string) (err error) {
-	//userType, packageType, _, _, _ := GetUserType(companyId)
-	// 获取继承点数
-	//inheritList, e := cygx.GetCygxActivitySpecialInheritPointsByCompanyId(companyId)
-	//if e != nil && e.Error() != utils.ErrNoRow() {
-	//	err = errors.New("GetCygxActivitySpecialInheritPointsByCompanyId, Err: " + e.Error())
-	//}
-	//chartNameMap := map[string]int{utils.YI_YAO_NAME: 0, utils.XIAO_FEI_NAME: 0, utils.KE_JI_NAME: 0, utils.ZHI_ZAO_NAME: 0}
-
-	// 获取合同信息-套餐信息
-	companyContract, e := company.GetCompanyContractById(companyContractId)
-	if e != nil {
-		err = errors.New("GetCompanyContractById, Err: " + e.Error())
-		return
-	}
-	packageType := companyContract.RaiPackageType
-	var items []*cygx.CygxActivitySpecialPermissionPoints
-
-	itemBill := new(cygx.CygxActivitySpecialTripBill)
-	itemBill.CreateTime = time.Now()
-	itemBill.CompanyId = companyId
-	itemBill.CompanyName = companyName
-	itemBill.Source = 2
-	itemBill.DoType = 2
-	itemBill.Way = 3
-	if packageType > 0 {
-		packageTypeMap := map[int]int{1: 16, 2: 12}
-		totalTrip := packageTypeMap[packageType]
-		itemBill.BillDetailed = totalTrip
-		itemBill.Total = strconv.Itoa(itemBill.BillDetailed) + "次"
-		if packageType == 2 {
-			itemBill.Content = "45w大套餐转正"
-		} else {
-			itemBill.Content = "70w大套餐转正"
-		}
-
-		//记录公司剩余点数
-		item := new(cygx.CygxActivitySpecialPermissionPoints)
-		item.Points = totalTrip
-		item.CompanyId = companyId
-		item.CompanyName = companyName
-		item.CreateTime = time.Now()
-		item.ModifyTime = time.Now()
-		items = append(items, item)
-
-	} else {
-
-		var condition string
-		var pars []interface{}
-		pars = make([]interface{}, 0)
-		condition = " AND  company_contract_id = ?  AND  is_upgrade = 1  "
-		pars = append(pars, companyContractId)
-		list, e := company.GetCompanyContractPermissionList(condition, pars) // 获取带有升级的权限
-		if e != nil && e.Error() != utils.ErrNoRow() {
-			err = errors.New("GetCompanyContractPermissionList, Err: " + e.Error())
-			return
-		}
-
-		if len(list) == 0 {
-			return
-		}
-
-		//获取权益主观权限
-		listRaiSubjectivity, e := models.GetChartPermissionListRaiSubjectivity()
-		if e != nil && e.Error() != utils.ErrNoRow() {
-			err = errors.New("GetChartPermissionListRaiSubjectivity, Err: " + e.Error())
-		}
-		mapRaiSubjectivity := make(map[int]bool)
-		mapPermissionName := make(map[int]string)
-		for _, v := range listRaiSubjectivity {
-			mapRaiSubjectivity[v.ChartPermissionId] = true
-			mapPermissionName[v.ChartPermissionId] = v.ChartPermissionName
-		}
-		var points int
-		for _, v := range list {
-			//如果是升级则加点
-			if v.IsUpgrade == 1 && mapRaiSubjectivity[v.ChartPermissionId] {
-				points += 4
-			}
-		}
-		item := new(cygx.CygxActivitySpecialPermissionPoints)
-		item.Points = points
-		item.CompanyId = companyId
-		item.CompanyName = companyName
-		item.ChartPermissionId = 0
-		item.ChartPermissionName = ""
-		item.CreateTime = time.Now()
-		item.ModifyTime = time.Now()
-		items = append(items, item)
-		itemBill.Content = "行业升级套餐转正"
-	}
-
-	e = cygx.MultiAddCygxActivitySpecialPermissionPoints(items)
-	if e != nil {
-		err = errors.New("MultiAddCygxActivitySpecialPermissionPoints, Err:" + e.Error())
-		return
-	}
-	if packageType == 0 && len(items) > 0 {
-		var condition string
-		var pars []interface{}
-		pars = make([]interface{}, 0)
-		condition = " AND  company_id  = ?  AND points  > 0   ORDER BY  chart_permission_id DESC  "
-		pars = append(pars, companyId)
-		activitySpecialPermissionPointsList, e := cygx.GetCygxActivitySpecialPermissionPointsList(condition, pars)
-		if e != nil && e.Error() != utils.ErrNoRow() {
-			err = errors.New("GetCygxActivitySpecialPermissionPointsList, Err:" + e.Error())
-			return
-		}
-		var itemBillTotal []string
-		itemBillTotalMap := make(map[string]string)
-		for _, v := range activitySpecialPermissionPointsList {
-			itemBillTotal = append(itemBillTotal, fmt.Sprint(v.ChartPermissionName, v.Points, "次"))
-			itemBillTotalMap[v.ChartPermissionName] = fmt.Sprint(v.ChartPermissionName, v.Points, "次")
-		}
-		itemBill.BillDetailed = 4 * len(items)
-		permissionNameSlice := []string{"医药", "消费", "科技", "智造"}
-		var itemBillTotalNew []string
-		for _, v := range permissionNameSlice {
-			if itemBillTotalMap[v] == "" {
-				itemBillTotalNew = append(itemBillTotalNew, fmt.Sprint(v, "0次"))
-			} else {
-				itemBillTotalNew = append(itemBillTotalNew, itemBillTotalMap[v])
-			}
-		}
-		itemBill.Total = strings.Join(itemBillTotalNew, "+")
-	}
-
-	//如果有升级行业权限,或者大套餐客户就写入流水信息
-	if itemBill.Total != "" {
-		e := cygx.AddCygxActivitySpecialTripBill(itemBill)
-		if e != nil {
-			err = errors.New("AddCygxActivitySpecialTripBill, Err:" + e.Error())
-			return
-		}
-	}
-	return
-}
-
-// 取消专项调研返点
-func ActivitySpecialPublishAndCancel(activityInfo *cygx.ActivitySpecialDetail) (err error) {
-	//userType, tripRemaining, mapChartName, err := GetChartPermissionSpecialSurplusByCompany(companyId)
-	//if err != nil {
-	//	br.Msg = "获取专项调研剩余次数失败"
-	//	br.ErrMsg = "获取专项调研剩余次数失败,err:" + err.Error()
-	//	return
-	//}
-	//itemBill := new(cygx.CygxActivitySpecialTripBill)
-	//itemBill.CreateTime = time.Now()
-	//itemBill.ActivityId = activityInfo.ActivityId
-	//itemBill.Content = activityInfo.ResearchTheme + "--活动取消"
-	//itemBill.Source = 2
-	//itemBill.DoType = 2
-	//itemBill.Way = 4
-	//itemBill.BillDetailed = 1
-	//err = cygx.AddCygxActivitySpecialTripBill(itemBill)
-	//if err != nil {
-	//	return
-	//}
-	return
-}
+//func ActivitySpecialCompanyApproval(companyId, companyContractId int, companyName string) (err error) {
 
-//func init() {
-//	fmt.Println(GetSpecialSurplusByCompanyNew(16))
+// 获取合同信息-套餐信息
+//companyContract, e := company.GetCompanyContractById(companyContractId)
+//if e != nil {
+//	err = errors.New("GetCompanyContractById, Err: " + e.Error())
+//	return
+//}
+//packageType := companyContract.RaiPackageType
+//var items []*cygx.CygxActivitySpecialPermissionPoints
+//
+//itemBill := new(cygx.CygxActivitySpecialTripBill)
+//itemBill.CreateTime = time.Now()
+//itemBill.CompanyId = companyId
+//itemBill.CompanyName = companyName
+//itemBill.Source = 2
+//itemBill.DoType = 2
+//itemBill.Way = 3
+//if packageType > 0 {
+//	packageTypeMap := map[int]float64{1: 16, 2: 12}
+//	totalTrip := packageTypeMap[packageType]
+//	itemBill.BillDetailed = totalTrip
+//	itemBill.Total = fmt.Sprint(itemBill.BillDetailed) + "次"
+//	if packageType == 2 {
+//		itemBill.Content = "45w大套餐转正"
+//	} else {
+//		itemBill.Content = "70w大套餐转正"
+//	}
+//
+//	//记录公司剩余点数
+//	item := new(cygx.CygxActivitySpecialPermissionPoints)
+//	item.Points = totalTrip
+//	item.CompanyId = companyId
+//	item.CompanyName = companyName
+//	item.CreateTime = time.Now()
+//	item.ModifyTime = time.Now()
+//	items = append(items, item)
+//
+//} else {
+//
+//	var condition string
+//	var pars []interface{}
+//	pars = make([]interface{}, 0)
+//	condition = " AND  company_contract_id = ?  AND  is_upgrade = 1  "
+//	pars = append(pars, companyContractId)
+//	list, e := company.GetCompanyContractPermissionList(condition, pars) // 获取带有升级的权限
+//	if e != nil && e.Error() != utils.ErrNoRow() {
+//		err = errors.New("GetCompanyContractPermissionList, Err: " + e.Error())
+//		return
+//	}
+//
+//	if len(list) == 0 {
+//		return
+//	}
+//
+//	//获取权益主观权限
+//	listRaiSubjectivity, e := models.GetChartPermissionListRaiSubjectivity()
+//	if e != nil && e.Error() != utils.ErrNoRow() {
+//		err = errors.New("GetChartPermissionListRaiSubjectivity, Err: " + e.Error())
+//	}
+//	mapRaiSubjectivity := make(map[int]bool)
+//	mapPermissionName := make(map[int]string)
+//	for _, v := range listRaiSubjectivity {
+//		mapRaiSubjectivity[v.ChartPermissionId] = true
+//		mapPermissionName[v.ChartPermissionId] = v.ChartPermissionName
+//	}
+//	var points float64
+//	for _, v := range list {
+//		//如果是升级则加点
+//		if v.IsUpgrade == 1 && mapRaiSubjectivity[v.ChartPermissionId] {
+//			points += 4
+//		}
+//	}
+//	item := new(cygx.CygxActivitySpecialPermissionPoints)
+//	item.Points = points
+//	item.CompanyId = companyId
+//	item.CompanyName = companyName
+//	item.ChartPermissionId = 0
+//	item.ChartPermissionName = ""
+//	item.CreateTime = time.Now()
+//	item.ModifyTime = time.Now()
+//	items = append(items, item)
+//	itemBill.Content = "行业升级套餐转正"
+//}
+//
+//e = cygx.MultiAddCygxActivitySpecialPermissionPoints(items)
+//if e != nil {
+//	err = errors.New("MultiAddCygxActivitySpecialPermissionPoints, Err:" + e.Error())
+//	return
+//}
+//if packageType == 0 && len(items) > 0 {
+//	var condition string
+//	var pars []interface{}
+//	pars = make([]interface{}, 0)
+//	condition = " AND  company_id  = ?  AND points  > 0   ORDER BY  chart_permission_id DESC  "
+//	pars = append(pars, companyId)
+//	activitySpecialPermissionPointsList, e := cygx.GetCygxActivitySpecialPermissionPointsList(condition, pars)
+//	if e != nil && e.Error() != utils.ErrNoRow() {
+//		err = errors.New("GetCygxActivitySpecialPermissionPointsList, Err:" + e.Error())
+//		return
+//	}
+//	var itemBillTotal []string
+//	itemBillTotalMap := make(map[string]string)
+//	for _, v := range activitySpecialPermissionPointsList {
+//		itemBillTotal = append(itemBillTotal, fmt.Sprint(v.ChartPermissionName, v.Points, "次"))
+//		itemBillTotalMap[v.ChartPermissionName] = fmt.Sprint(v.ChartPermissionName, v.Points, "次")
+//	}
+//	itemBill.BillDetailed = float64(4 * len(items))
+//	permissionNameSlice := []string{"医药", "消费", "科技", "智造"}
+//	var itemBillTotalNew []string
+//	for _, v := range permissionNameSlice {
+//		if itemBillTotalMap[v] == "" {
+//			itemBillTotalNew = append(itemBillTotalNew, fmt.Sprint(v, "0次"))
+//		} else {
+//			itemBillTotalNew = append(itemBillTotalNew, itemBillTotalMap[v])
+//		}
+//	}
+//	itemBill.Total = strings.Join(itemBillTotalNew, "+")
+//}
+//
+////如果有升级行业权限,或者大套餐客户就写入流水信息
+//if itemBill.Total != "" {
+//	e := cygx.AddCygxActivitySpecialTripBill(itemBill)
+//	if e != nil {
+//		err = errors.New("AddCygxActivitySpecialTripBill, Err:" + e.Error())
+//		return
+//	}
+//}
+//	return
 //}
 
 // GetSpecialSurplusByCompanyNew 获取公司专项调研剩余次数-用流水表数据不计算了,计算都丢在流水里
 func GetSpecialSurplusByCompanyNew(companyId int) (specialSurplus string, err error) {
-	companyDetail, e := cygx.GetCompanyDetailByIdGroup(companyId)
-	if e != nil {
-		err = errors.New("GetCompanyDetailByIdGroup, Err: " + e.Error())
-	}
-	if companyDetail == nil {
-		return
-	}
-	//if companyDetail.Status != "永续" && companyDetail.Status != "正式" {
-	//	return
-	//}
-	//if companyDetail.Status == "永续" {
-	//	specialSurplus = "不限次数"
-	//}
-	//chartMap := map[int]string{utils.YI_YAO_ID:utils.YI_YAO_NAME, utils.XIAO_FEI_ID:utils.XIAO_FEI_NAME, utils.KE_JI_ID:utils.KE_JI_NAME, utils.ZHI_ZAO_ID:utils.ZHI_ZAO_NAME}
-	//chartNumMap := map[int]int{utils.YI_YAO_ID:0, utils.XIAO_FEI_ID:0, utils.KE_JI_ID:0, utils.ZHI_ZAO_ID:0}
-	//if companyDetail.Status == "正式" {
-	billItem, e := cygx.GetCygxActivitySpecialTripBillByCompanyId(companyId)
+	points, e := cygx.GetCygxActivitySpecialPermissionPointsCount(companyId)
 	if e != nil && e.Error() != utils.ErrNoRow() {
 		err = e
 		return
 	}
-	if billItem != nil {
-		specialSurplus = billItem.Total
-	} else {
-		specialSurplus = "0次"
-	}
+	specialSurplus = fmt.Sprint(points, "次")
 	return
-	//}
-	//return
 }
 
 // GetSpecialBillMaxChartPermissionId  获取专项调研剩余点数最多的行业
@@ -822,7 +766,7 @@ func DeductTripRemainingtimesByUser(user *cygx.UserAndCompanyName, activityInfo
 		return
 	}
 
-	var maxPoints int // 获取最大剩余点数,(写的有点多余)
+	var maxPoints float64 // 获取最大剩余点数,(写的有点多余)
 	for _, v := range activitySpecialPermissionPointsList {
 		if maxPoints < v.Points {
 			maxPoints = v.Points
@@ -856,7 +800,7 @@ func DeductTripRemainingtimesByUser(user *cygx.UserAndCompanyName, activityInfo
 		}
 	}
 	var maxChartPermissionId int // 剩余点数最多的行业
-	var points int               // 剩余点数
+	var points float64           // 剩余点数
 	for _, v := range activitySpecialPermissionPointsList {
 		maxChartPermissionId = v.ChartPermissionId
 		points = v.Points - 1
@@ -904,7 +848,7 @@ func RebateTripRemainingtimesByUser(user *cygx.UserAndCompanyName, activityInfo
 	}
 
 	var maxChartPermissionId int // 剩余点数最多的行业(返点行业)
-	var points int               // 剩余点数
+	var points float64           // 剩余点数
 	for _, v := range activitySpecialPermissionPointsList {
 		maxChartPermissionId = v.ChartPermissionId
 		points = v.Points + 1
@@ -939,7 +883,7 @@ func HandleActivitySpecialTripBillTotalText(companyId int) (totalText string, er
 	}
 	//永续客户次数累加
 	if companyDetail.Status == utils.COMPANY_STATUS_FOREVER {
-		var points int
+		var points float64
 		for _, v := range activitySpecialPermissionPointsList {
 			points += v.Points
 		}
@@ -973,3 +917,64 @@ func HandleActivitySpecialTripBillTotalText(companyId int) (totalText string, er
 	}
 	return
 }
+
+// 根据用户ID,活动场次,校验用户是否有剩余点数报名专项调研活动
+func CheckSpecialActivityPointsByUserIds(userIds string, activityLen int) (err error) {
+	userList, err := models.GetWxUserListByUserIds(userIds)
+	if err != nil {
+		return
+	}
+	mapCompanyPointAdd := make(map[int]float64) // 每个公司需要添加的点数
+	mapCompanyPointNow := make(map[int]float64) // 每个公司现有的点数
+	var comPanyIds []int
+	for _, v := range userList {
+		mapCompanyPointAdd[v.CompanyId] += float64(1 * activityLen)
+		comPanyIds = append(comPanyIds, v.CompanyId)
+	}
+
+	var condition string
+	var pars []interface{}
+	pars = make([]interface{}, 0)
+	condition = ` AND  company_id IN (` + utils.GetOrmInReplace(len(comPanyIds)) + `) `
+	pars = append(pars, comPanyIds)
+	activitySpecialPermissionPointsList, e := cygx.GetCygxActivitySpecialPermissionPointsList(condition, pars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCygxActivitySpecialPermissionPointsList, Err:" + e.Error())
+		return
+	}
+	for _, v := range activitySpecialPermissionPointsList {
+		mapCompanyPointNow[v.CompanyId] = v.Points
+	}
+	//如果需要新增的点数,大于公司剩余的点数,那么就做报错处理
+	for _, v := range userList {
+		if mapCompanyPointAdd[v.CompanyId] > mapCompanyPointNow[v.CompanyId] {
+			err = errors.New("您的专项调研次数已用完,如仍想参加,请与您的对口销售商议")
+		}
+	}
+	return
+}
+
+//// 根据用户ID,活动场次,校验用户是否有剩余点数报名专项调研活动
+//func CheckRoadShowSpecialActivityPointsByComapnId(comapnId int) (err error) {
+//
+//	var condition string
+//	var pars []interface{}
+//	pars = make([]interface{}, 0)
+//	condition = ` AND  company_id IN (` + utils.GetOrmInReplace(len(comPanyIds)) + `) `
+//	pars = append(pars, comPanyIds)
+//	activitySpecialPermissionPointsList, e := cygx.GetCygxActivitySpecialPermissionPointsList(condition, pars)
+//	if e != nil && e.Error() != utils.ErrNoRow() {
+//		err = errors.New("GetCygxActivitySpecialPermissionPointsList, Err:" + e.Error())
+//		return
+//	}
+//	for _, v := range activitySpecialPermissionPointsList {
+//		mapCompanyPointNow[v.CompanyId] = v.Points
+//	}
+//	//如果需要新增的点数,大于公司剩余的点数,那么就做报错处理
+//	for _, v := range userList {
+//		if mapCompanyPointAdd[v.CompanyId] > mapCompanyPointNow[v.CompanyId] {
+//			err = errors.New("您的专项调研次数已用完,如仍想参加,请与您的对口销售商议")
+//		}
+//	}
+//	return
+//}

+ 51 - 0
services/cygx/cygx_config.go

@@ -0,0 +1,51 @@
+package cygx
+
+import (
+	"encoding/json"
+	"errors"
+	"fmt"
+	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/services/alarm_msg"
+	"hongze/hz_crm_api/utils"
+)
+
+type CygxUserLabelColorSetList struct {
+	List []*CygxUserLabelColorSet
+}
+
+type CygxUserLabelColorSet struct {
+	SourceType      int    `description:"类型"`
+	BackgroundColor string `description:"背景色"`
+	TextClolr       string `description:"字体色"`
+}
+
+var RaiUserLabelStyleSet = make(map[int]*CygxUserLabelColorSet)
+
+// 获取用户标签展示样式 (全局)
+func init() {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("获取用户标签展示样式 失败err:", err.Error()), 2)
+		}
+	}()
+	conf, e := cygx.GetCygxConfigDetailByCode("cygx_user_label_color_set")
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCygxConfigDetailByCode, Err: " + e.Error())
+		return
+	}
+	if conf.ConfigValue == "" {
+		err = errors.New("ConfigValue, 配置项内容为空 ")
+		return
+	}
+	list := new(CygxUserLabelColorSetList)
+	if e = json.Unmarshal([]byte(conf.ConfigValue), &list); e != nil {
+		err = errors.New("配置值解析失败, Err: " + e.Error())
+		return
+	}
+	for _, v := range list.List {
+		RaiUserLabelStyleSet[v.SourceType] = v
+	}
+	return
+}

+ 0 - 2
services/cygx/mail.go

@@ -19,7 +19,6 @@ func SendResearchSummaryEmail(detail *cygx.DetailCygxResearchSummaryRep, touser
 	m.SetHeader("From", "hzcygx@hzinsights.com ")
 	//m.SetHeader("To", touser...)
 	var user []string
-	user = append(user, "zqliu@hzinsights.com ")
 	user = append(user, "tshen@hzinsights.com ")
 	user = append(user, "hdong@hzinsights.com ")
 	user = append(user, "cxzhang@hzinsights.com ")
@@ -287,7 +286,6 @@ func SendMinutesSummaryEmail(detail *cygx.DetailCygxMinutesSummaryRep, touser []
 	m.SetHeader("From", "hzcygx@hzinsights.com ")
 	//m.SetHeader("To", touser...)
 	var user []string
-	user = append(user, "zqliu@hzinsights.com ")
 	user = append(user, "tshen@hzinsights.com ")
 	user = append(user, "hdong@hzinsights.com ")
 	user = append(user, "cxzhang@hzinsights.com ")

+ 118 - 0
services/cygx/morning_meeting.go

@@ -3,9 +3,13 @@ package cygx
 import (
 	"errors"
 	"fmt"
+	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/services"
 	"hongze/hz_crm_api/services/alarm_msg"
 	"hongze/hz_crm_api/utils"
+	"strconv"
+	"time"
 )
 
 //func init() {
@@ -43,3 +47,117 @@ func GetCygxMorningMeetingReviewChapterHistoryPvUvMap(articleIdArr []int) (mapPv
 	}
 	return
 }
+
+// 添加晨会精华操作日志
+func AddCygxMorningMeetingReviewLog(itemReq *cygx.CygxMorningMeetingReviewChapter, operate, opUserName string, opUserId, status int) {
+
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg("添加晨会精华操作日志 失败,AddCygxMorningMeetingReviewLog Err:"+err.Error(), 3)
+		}
+	}()
+
+	item := new(cygx.CygxMorningMeetingReviewLog)
+	item.MeetingTime = itemReq.MeetingTime
+	item.CreateTime = time.Now()
+	item.ModifyTime = time.Now()
+	item.IndustryId = itemReq.IndustryId
+	item.IndustryName = itemReq.IndustryName
+	item.ChartPermissionName = itemReq.ChartPermissionName
+	item.ChartPermissionId = itemReq.ChartPermissionId
+	item.IndustrialSubjectIds = itemReq.IndustrialSubjectIds
+	item.MeetingId = int(itemReq.MeetingId)
+	item.Content = itemReq.Content
+	item.ReportLink = itemReq.ReportLink
+	item.LinkArticleId = itemReq.LinkArticleId
+	item.Title = itemReq.Title
+	//item.Remark = remark
+	item.Operate = operate
+	item.OpUserName = opUserName
+	item.OpUserId = opUserId
+
+	newId, e := cygx.AddCygxMorningMeetingReviewLog(item)
+	if e != nil {
+		err = errors.New("AddCygxMorningMeetingReviewLog, Err: " + e.Error())
+		return
+	}
+
+	if status == 2 {
+		SendWxMsgMorningMeetingApproveSubmit(int(newId))
+	}
+	return
+}
+
+// 晨会点评提交新内容审核时,给合规(指定手机号15721524062、15221002612)发送模板消息
+func SendWxMsgMorningMeetingApproveSubmit(logId int) (err error) {
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("晨会点评内容完成审核时,给提交人发送模板消息失败 logId ", logId, err.Error()), 2)
+		}
+	}()
+	time.Sleep(1 * time.Second) // 延迟1秒
+	var first string
+	var keyword1 string
+	var keyword2 string
+	var keyword3 string
+	var keyword4 string
+	var remark string
+
+	logDetail, e := cygx.GetCygxMorningMeetingReviewLogByLogId(logId)
+	if e != nil {
+		err = errors.New("GetCygxMorningMeetingReviewLogByLogId, Err: " + e.Error())
+		return
+	}
+	meetingId := logDetail.MeetingId
+
+	keyword1 = logDetail.OpUserName
+	keyword2 = "--"
+	keyword3 = time.Now().Format(utils.FormatDateTime)
+	keyword4 = "提交了晨会点评待审核"
+
+	configCode := "cygx_morning_meeting_mobile"
+	detailConfig, e := cygx.GetConfigByCode(configCode)
+	if e != nil {
+		err = errors.New("GetConfigByCode, Err: " + e.Error())
+		return
+	}
+
+	mobile := detailConfig.ConfigValue
+	openIdList, e := models.GetWxOpenIdByMobileList(mobile)
+	if e != nil {
+		err = errors.New("GetWxOpenIdByMobileList, Err: " + e.Error())
+		return
+	}
+	if len(openIdList) == 0 {
+		return
+	}
+
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+	redirectUrl := ""
+
+	redirectUrl = utils.WX_MSG_PATH_MORNING_MEETING_LOG_DETAIL + strconv.Itoa(logId)
+	if utils.RunMode != "release" {
+		redirectUrl = ""
+	}
+
+	sendInfo := new(services.SendWxTemplate)
+	sendInfo.First = first
+	sendInfo.Keyword1 = keyword1
+	sendInfo.Keyword2 = keyword2
+	sendInfo.Keyword3 = keyword3
+	sendInfo.Keyword4 = keyword4
+	sendInfo.Remark = remark
+	sendInfo.TemplateId = utils.WxMsgTemplateIdAskByUser
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	sendInfo.Resource = strconv.Itoa(meetingId)
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
+	sendInfo.OpenIdArr = openIdArr
+	err = services.SendTemplateMsg(sendInfo)
+	return
+}

+ 59 - 0
services/cygx/report_selection.go

@@ -0,0 +1,59 @@
+package cygx
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/services/alarm_msg"
+	"strings"
+	"time"
+)
+
+//func init() {
+//	UpdateReportSelectionSubjectNameList()
+//}
+
+// 获取报告精选最新一期标的名称
+func UpdateReportSelectionSubjectNameList() {
+	time.Sleep(2 * time.Second)
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println("err:", err)
+			go alarm_msg.SendAlarmMsg("获取报告精选最新一期标的名称,UpdateReportSelectionSubjectNameList Err:"+err.Error(), 3)
+		}
+	}()
+	detail, e := cygx.GetCygxReportSelectionInfoBestNew()
+	if e != nil {
+		err = errors.New("GetCygxReportSelectionInfoBestNew, Err: " + e.Error())
+		return
+	}
+
+	articleId := detail.ArticleId
+	listSelectionLog, e := cygx.GetReportSelectionlogListAll(articleId)
+	if e != nil {
+		err = errors.New("GetReportSelectionlogListAll, Err: " + e.Error())
+		return
+	}
+
+	var keyNames []string
+	for _, v := range listSelectionLog {
+		if v.ThirdName != "" {
+			keyNames = append(keyNames, v.ThirdName)
+		} else if v.SubjectName != "" {
+			keyNames = append(keyNames, v.SubjectName)
+		} else {
+			keyNames = append(keyNames, v.IndustrialManagementNames)
+		}
+	}
+
+	keyNameStr := strings.Join(keyNames, ",")
+	keyNameStr = strings.Replace(keyNameStr, "/", ",", -1)
+	e = cygx.CygxConfigUpdateByCode(keyNameStr, "cygx_report_selection_subject")
+	if e != nil {
+		err = errors.New("CygxConfigUpdateByCode, Err: " + e.Error())
+		return
+	}
+	return
+
+}

+ 4 - 4
services/cygx/resource_data.go

@@ -110,7 +110,7 @@ func UpdateActivityResourceData(sourceId int) {
 		item.SearchTag = detail.ActivityTypeName
 		item.ChartPermissionId = detail.ChartPermissionId
 		item.PublishDate = publishDate
-		item.SearchTitle = detail.ActivityName
+		item.SearchTitle = detail.ActivityName + "{|}" + detail.Label
 		item.SearchContent = detail.Label + industrialName + subjectName
 		item.SearchOrderTime = detail.ActivityTime
 		item.CreateTime = time.Now()
@@ -383,7 +383,7 @@ func UpdateArticleResourceData(sourceId int) {
 		item.Source = source
 		item.PublishDate = publishDate
 		item.CreateTime = time.Now()
-		item.SearchTitle = detail.Title
+		item.SearchTitle = detail.Title + "{|}" + detail.FieldName + "{|}" + detail.Stock + "{|}" + industrialName + "{|}" + subjectName
 		annotation, e := utils.GetHtmlContentText(detail.Annotation)
 		if e != nil && e.Error() != utils.ErrNoRow() {
 			err = errors.New("GetHtmlContentText, Err: " + e.Error() + "sourceId:" + strconv.Itoa(sourceId))
@@ -1030,7 +1030,7 @@ func UpdateActivityVoiceResourceData(sourceId int) {
 		item.PublishDate = publishDate
 		item.ChartPermissionId = activityInfo.ChartPermissionId
 		item.CreateTime = utils.StrDateToDate(activityInfo.ActivityTime)
-		item.SearchTitle = voiceDetail.VoiceName
+		item.SearchTitle = voiceDetail.VoiceName + "{|}" + activityInfo.Label
 		item.SearchContent = activityInfo.Label + industrialName + subjectName
 		item.SearchOrderTime = activityInfo.ActivityTime
 		if totalData == 0 {
@@ -1133,7 +1133,7 @@ func UpdateActivityVideoResourceData(sourceId int) {
 		item.PublishDate = publishDate
 		item.ChartPermissionId = activityInfo.ChartPermissionId
 		item.CreateTime = utils.StrDateToDate(activityInfo.ActivityTime)
-		item.SearchTitle = videoDetail.VideoName
+		item.SearchTitle = videoDetail.VideoName + "{|}" + activityInfo.Label
 		item.SearchContent = activityInfo.Label + industrialName + subjectName
 		item.SearchOrderTime = activityInfo.ActivityTime
 		if totalData == 0 {

+ 5 - 0
services/cygx/user_rai_label.go

@@ -27,7 +27,12 @@ func GetUserLabelByUserIdArr(userIdArr []int) (mapRsp map[int][]*cygx.WxUserRaiL
 		return
 	}
 	mapRsp = make(map[int][]*cygx.WxUserRaiLabelListResp)
+	RaiUserLabelStyleSetConfig := RaiUserLabelStyleSet
 	for _, v := range labelList {
+		if RaiUserLabelStyleSet[v.SourceType] != nil {
+			v.BackgroundColor = RaiUserLabelStyleSetConfig[v.SourceType].BackgroundColor
+			v.TextClolr = RaiUserLabelStyleSetConfig[v.SourceType].TextClolr
+		}
 		mapRsp[v.UserId] = append(mapRsp[v.UserId], v)
 	}
 	return

+ 65 - 0
services/roadshow/calendar.go

@@ -5,6 +5,8 @@ import (
 	"errors"
 	"fmt"
 	"github.com/rdlucklib/rdluck_tools/http"
+	"hongze/hz_crm_api/models/company"
+	"hongze/hz_crm_api/models/cygx"
 	"hongze/hz_crm_api/models/roadshow"
 	"hongze/hz_crm_api/models/system"
 	"hongze/hz_crm_api/services/alarm_msg"
@@ -1097,3 +1099,66 @@ func GetCalendarFrom(userPhone, startDate, endDate string) (list []roadshow.User
 	list, err = getCalendarFrom(userPhone, startDate, endDate)
 	return
 }
+
+// 公司添加路演的时候,校验公司对应点数,以及研究员关联行业的权限
+func CheckAddRoadShowCompanyPoint(companyId int, researcherList []*roadshow.CalendarResearcher) (points int, addType int, err error) {
+	addType = 1
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg("获取公司剩余点数失败:"+err.Error(), 2)
+		}
+	}()
+	pointsCompany, e := cygx.GetCygxActivitySpecialPermissionPointsCount(companyId)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCygxActivitySpecialPermissionPointsCount, Err: " + e.Error())
+		return
+	}
+	productItemRai, e := company.GetCompanyProductByCompanyIdAndProductId(companyId, utils.COMPANY_PRODUCT_RAI_ID)
+	if e != nil {
+		err = errors.New("GetCompanyProductByCompanyIdAndProductId, Err: " + e.Error())
+		return
+	}
+
+	permissionStr, e := cygx.GetCompanyPermission(companyId)
+	if e != nil {
+		err = errors.New("GetCompanyPermission, Err: " + e.Error())
+		return
+	}
+
+	//用户没有路演服务,以及研究员所关联行业的权限,就进行报错提示
+	var isHaveWangFang bool // 研究员里面是否包含王芳
+	if !strings.Contains(permissionStr, utils.LU_YAN_FU_WU) {
+		var adminIds []string
+		for _, v := range researcherList {
+			adminIds = append(adminIds, strconv.Itoa(v.ResearcherId))
+		}
+		askEmailList, e := cygx.GetAskEmailListByAdminIds(strings.Join(adminIds, ","))
+		if e != nil {
+			err = errors.New("GetAskEmailListByAdminIds, Err: " + e.Error())
+			return
+		}
+		for _, v := range askEmailList {
+			if v.Name == "王芳" { // 王芳,不需要判断权限和点数,以及对应的点数弹窗提示
+				isHaveWangFang = true
+				continue
+			}
+			if !strings.Contains(permissionStr, v.ChartPermissionName) {
+				addType = 3
+				return
+			}
+		}
+	}
+
+	if pointsCompany > 0 || productItemRai.Status == utils.COMPANY_STATUS_FORMAL {
+		points = len(researcherList)
+		if isHaveWangFang {
+			points--
+			if points == 0 {
+				addType = 2
+			}
+		}
+	} else {
+		addType = 2
+	}
+	return
+}

+ 40 - 31
services/roadshow/report.go

@@ -142,11 +142,11 @@ func GetQuarterData(adminType, dimensionType string) (adminDataMapList []AdminDa
 	nowQuarterFirstDay := utils.GetNowQuarterFirstDay()                            //本季度第一天
 	nowQuarterLastDay := nowQuarterFirstDay.AddDate(0, 3, 0).Add(-1 * time.Second) //本季度最后一天
 
-	lastQuarterFirstDay1 := nowQuarterFirstDay.AddDate(0, -3, 0)                       //上个季度第一天
-	lastQuarterLastDay1 := lastQuarterFirstDay1.AddDate(0, 1, 0).Add(-1 * time.Second) //上个季度最后一天
+	lastQuarterFirstDay1 := nowQuarterFirstDay.AddDate(0, -3, 0)                     //上个季度第一天
+	lastQuarterLastDay1 := nowQuarterFirstDay.AddDate(0, 0, 0).Add(-1 * time.Second) //上个季度最后一天
 
-	lastQuarterFirstDay2 := nowQuarterFirstDay.AddDate(0, -6, 0)                       //上上个季度第一天
-	lastQuarterLastDay2 := lastQuarterFirstDay2.AddDate(0, 1, 0).Add(-1 * time.Second) //上上个季度最后一天
+	lastQuarterFirstDay2 := nowQuarterFirstDay.AddDate(0, -6, 0)                      //上上个季度第一天
+	lastQuarterLastDay2 := nowQuarterFirstDay.AddDate(0, -3, 0).Add(-1 * time.Second) //上上个季度最后一天
 
 	ch1 := make(chan AdminDataMap, 0)
 	ch2 := make(chan AdminDataMap, 0)
@@ -225,16 +225,17 @@ func GetTimeIntervalData(startDate, endDate, adminType, dimensionType string) (a
 }
 
 type AdminDataMap struct {
-	TryOutMap   map[int]int `description:"试用路演次数"`
-	FormalMap   map[int]int `description:"正式路演次数"`
-	MeetingMap  map[int]int `description:"会议次数"`
-	OnlineMap   map[int]int `description:"线上路演次数"`
-	OfflineMap  map[int]int `description:"线上路演次数"`
-	RoadShowMap map[int]int `description:"路演总次数"`
-	SalonMap    map[int]int `description:"沙龙路演次数"`
-	AskMap      map[int]int `description:"沙龙路演次数"`
-	StartDate   string      `description:"开始日期"`
-	EndDate     string      `description:"开始日期"`
+	TryOutMap    map[int]int `description:"试用路演次数"`
+	FormalMap    map[int]int `description:"正式路演次数"`
+	MeetingMap   map[int]int `description:"会议次数"`
+	OnlineMap    map[int]int `description:"线上路演次数"`
+	OfflineMap   map[int]int `description:"线上路演次数"`
+	RoadShowMap  map[int]int `description:"路演总次数"`
+	SalonMap     map[int]int `description:"沙龙路演次数"`
+	AskTryOutMap map[int]int `description:"沙龙路演次数"`
+	AskFormalMap map[int]int `description:"沙龙路演次数"`
+	StartDate    string      `description:"开始日期"`
+	EndDate      string      `description:"开始日期"`
 }
 
 // getSectionData 获取周期数据
@@ -257,9 +258,10 @@ func getResearcherSectionData(startDate, endDate time.Time) (adminDataMap AdminD
 	tryOutMap := make(map[int]int)
 	formalMap := make(map[int]int)
 	meetingMap := make(map[int]int)
-	roadShowMap := make(map[int]int) // 路演总次数
-	salonMap := make(map[int]int)    //沙龙路演次数
-	askMap := make(map[int]int)      //填写过客户问答的路演次数
+	roadShowMap := make(map[int]int)  // 路演总次数
+	salonMap := make(map[int]int)     //沙龙路演次数
+	asktryOutMap := make(map[int]int) //填写过客户问答的路演次数(试用)
+	askformalMap := make(map[int]int) //填写过客户问答的路演次数(正式)
 	//正式客户
 	{
 		var condition string
@@ -275,14 +277,17 @@ func getResearcherSectionData(startDate, endDate time.Time) (adminDataMap AdminD
 			formalMap[v.AdminId] = v.Num
 		}
 
-		condition += ` and  question_status = 1  `
-		dataAsk, tmpErr := roadshow.GetGroupResearcherRecordList(condition, pars)
+		var conditionAsk string
+		var parsAsk []interface{}
+		conditionAsk = ` and  c.question_status = 1  and a.start_date >= ? and a.end_date <= ?  and a.company_status = ? `
+		parsAsk = append(parsAsk, startDate, endDate, "正式")
+		dataAsk, tmpErr := roadshow.GetGroupResearcherRecordListAsk(conditionAsk, parsAsk)
 		if tmpErr != nil {
 			err = tmpErr
 			return
 		}
 		for _, v := range dataAsk {
-			askMap[v.AdminId] = v.Num
+			askformalMap[v.AdminId] = v.Num
 		}
 	}
 
@@ -303,14 +308,17 @@ func getResearcherSectionData(startDate, endDate time.Time) (adminDataMap AdminD
 			tryOutMap[v.AdminId] = v.Num
 		}
 
-		condition += ` and  question_status = 1  `
-		dataAsk, tmpErr := roadshow.GetGroupResearcherRecordList(condition, pars)
+		var conditionAsk string
+		var parsAsk []interface{}
+		conditionAsk = ` and  c.question_status = 1  and a.start_date >= ? and a.end_date <= ?  and a.company_status = ? `
+		parsAsk = append(parsAsk, startDate, endDate, "试用")
+		dataAsk, tmpErr := roadshow.GetGroupResearcherRecordListAsk(conditionAsk, parsAsk)
 		if tmpErr != nil {
 			err = tmpErr
 			return
 		}
 		for _, v := range dataAsk {
-			askMap[v.AdminId] = v.Num
+			asktryOutMap[v.AdminId] = v.Num
 		}
 	}
 
@@ -366,14 +374,15 @@ func getResearcherSectionData(startDate, endDate time.Time) (adminDataMap AdminD
 	}
 
 	adminDataMap = AdminDataMap{
-		TryOutMap:   tryOutMap,
-		FormalMap:   formalMap,
-		MeetingMap:  meetingMap,
-		RoadShowMap: roadShowMap,
-		SalonMap:    salonMap,
-		AskMap:      askMap,
-		StartDate:   startDate.Format(utils.FormatDate),
-		EndDate:     endDate.Format(utils.FormatDate),
+		TryOutMap:    tryOutMap,
+		FormalMap:    formalMap,
+		MeetingMap:   meetingMap,
+		RoadShowMap:  roadShowMap,
+		SalonMap:     salonMap,
+		AskTryOutMap: asktryOutMap,
+		AskFormalMap: askformalMap,
+		StartDate:    startDate.Format(utils.FormatDate),
+		EndDate:      endDate.Format(utils.FormatDate),
 	}
 	return
 }

+ 7 - 0
services/user_login.go

@@ -29,6 +29,13 @@ func SendAdminMobileVerifyCode(source int, mobile, areaCode string) (ok bool, er
 	}
 
 	tplId := utils.SmsNewLoginTplId
+
+	// 从配置里面获取短信模板ID
+	config, e := company.GetConfigDetailByCode("LoginSmsTpId")
+	if e == nil {
+		tplId = config.ConfigValue
+	}
+	
 	if areaCode == "86" {
 		ok = SendSmsCode(mobile, verifyCode, tplId)
 	} else {

+ 26 - 0
utils/common.go

@@ -2361,3 +2361,29 @@ func GetAttendanceDetailSecondsByYiDong(str string) string {
 	timeStr += "''"
 	return timeStr
 }
+
+// 浮点类型转为千分位字符串
+func FormatNumberWithCommas(num float64, m int) string {
+	// 先格式化为2位小数字符串
+	str := strconv.FormatFloat(num, 'f', m, 64)
+
+	// 分割整数和小数部分
+	parts := strings.Split(str, ".")
+	intPart := parts[0]
+	decimalPart := parts[1] // 已截取2位小数
+
+	// 从右往左每3位加逗号
+	var formatted strings.Builder
+	n := len(intPart)
+	for i := 0; i < n; i++ {
+		if (n-i)%3 == 0 && i != 0 {
+			formatted.WriteByte(',')
+		}
+		formatted.WriteByte(intPart[i])
+	}
+	if decimalPart == "00" {
+		return formatted.String()
+	} else {
+		return formatted.String() + "." + decimalPart
+	}
+}

+ 6 - 0
utils/config.go

@@ -427,6 +427,11 @@ func WxDebug() {
 		WxMsgTemplateIdCompanyApprovalMessageRai = "RcV2uM5nFSiUtOHsq4SdYz2Fhk-OVfg5rutWz2IsSJQ" //权益销售签约成功通知查研观向小助手模版消息-模板ID
 	}
 
+	//内部员测试公众号(弘则科技)
+	{
+		AdminWxAppId = "wxe0d0a4d892da28a3"
+		AdminWxAppSecret = "b88ac96aef1852fa0b8902c321ed4bf8"
+	}
 }
 
 // 生产环境模板消息
@@ -437,6 +442,7 @@ func WxRelease() {
 	//模板消息
 	{
 		TemplateIdByProduct = "Cp2wF8gvBtxyWV4DeYuI172oqwyYXVRSm3AyJO42d84"
+		WxMsgTemplateIdAskByUser = "IpS-yuNNQc8osCoy20jPHNkvBUyKRL1NGn7c0G9xmQA" //手机号用户【XXX】发送模板消息模板ID(小助手)
 		TemplateIdByCompanyApply = "yqaDUavXAKBpsPqTr0zYXAGIQYeCijZtWwFsT07wTbE"
 		WxMsgTemplateIdActivityChangeApply = "dYg6iHooRq74PyCXmw_Ns7qdJZmbtLoKS2p2FKeaXl0"
 		//销售跨部门领取客户通知

+ 33 - 17
utils/constants.go

@@ -164,8 +164,8 @@ const (
 	RAI_DEPARTMENT_ID         = 5 // 权益部门ID
 )
 
-var PermissionFiccClassifyArr = [...]string{"宏观经济", "化工产业", "建材产业", "有色产业", "新能源", "市场策略"}
-var PermissionAllClassifyArr = [...]string{"宏观经济", "化工产业", "建材产业", "有色产业", "新能源", "市场策略", "权益"}
+var PermissionFiccClassifyArr = [...]string{"宏观经济", "化工产业", "建材产业", "有色产业", "新能源", "市场策略", "固定收益"}
+var PermissionAllClassifyArr = [...]string{"宏观经济", "化工产业", "建材产业", "有色产业", "新能源", "市场策略", "固定收益", "权益"}
 
 //apply_method:申请类型:1:试用->正式,2:冻结—>试用,3:流失—>正式,4:试用延期,5:原销售申请领取流失客户,6:正式客户申请服务更新
 
@@ -426,8 +426,23 @@ const (
 	HONG_GUAN_NAME                          string = "宏观"
 	CYGX_ARTICLE_TIME_LINE_KEY                     = "CYGX_ARTICLE_TIME_LINE_KEY" //产业时间线关联的文章key
 	WX_USER_RAI_LABEL_KEY                          = "CYGX_WX_USER_RAI_LABEL_KEY" //用户列表标签key
+
 )
 
+var FilterPermissionNameRai = []string{"专家", "路演/专项点数", "海外调研", "路演服务"} // 权益某些地方不展示的行业
+var FilterPermissionNameRai2 = []string{"专家", "路演/专项点数", "海外调研"}        // 权益某些地方不展示的行业
+var SHOW_SIGNIN_BUTTON_ACTIVITY_TYPE_ID = []int{4, 5, 6, 8}             //展示下载签到码的活动类型
+
+// GetRaiChartPermissionIdSpecialPoint 获取权益权限,专项路演调研权限ID
+func GetRaiChartPermissionIdSpecialPoint() (chartPermissionId int) {
+	if RunMode == "release" {
+		chartPermissionId = 70
+	} else {
+		chartPermissionId = 157
+	}
+	return
+}
+
 // 权益cygx_config配置主键以后放这里
 const (
 	YANXUAN_SPECIAL_ARTICLE_BUTTON_MOBILE string = "yanxuan_special_article_button_mobile" //CRM研选专栏模块文章管理可以查看的手机号
@@ -490,21 +505,22 @@ const (
 
 // 查研观向小程序 模板消息地址路由
 const (
-	WX_MSG_PATH_ARTICLE_DETAIL                  = "pageMy/reportDetail/reportDetail?id="                          //文章详情模板消息地址
-	WX_MSG_PATH_ACTIVITY_SPECIAL_DETAIL         = "activityPages/specialDetail/specialDetail?id="                 //专项调研活动模板消息地址
-	WX_MSG_PATH_ROAD_ESSENCE                    = "reportPages/roadEssence/roadEssence?id="                       //路演精华模板消息地址
-	WX_MSG_PATH_ACTIVITY_DETAIL                 = "activityPages/activityDetail/activityDetail?id="               //活动模板消息地址
-	WX_MSG_PATH_PRODUCTINTERIOR_DETAIL          = "reportPages/internalDetials/internalDetials?id="               //产品内测模版消息地址
-	WX_MSG_PATH_ACTIVITY_SIGNIN                 = "pages-signIn/isSignIn/isSignIn"                                //扫s码签到地址
-	WX_MSG_PATH_THIS_WEEK_DETAIL                = "/reportPages/reportSecretDetail/reportSecretDetail?type=2&id=" //本周研究汇总详情模板消息地址
-	WX_MSG_PATH_LAST_WEEK_DETAIL                = "/reportPages/reportSecretDetail/reportSecretDetail?type=3&id=" //上周纪要汇总详情模板消息地址
-	WX_MSG_PATH_KEY_COMPANY_DETAIL              = "/reportPages/keyCompany/keyCompany?id="                        //重点公司详情模板消息地址
-	WX_MSG_PATH_INDUSTRY_DETAIL                 = "/reportPages/IndustryReport/IndustryReport?id="                //产业详情模板消息地址
-	CYGX_YANXUAN_POINTS_KEY              string = "CYGX_YANXUAN_POINTS_KEY"                                       //查研观向研选活动扣点KEY(冲突,先放这里)
-	WX_MSG_PATH_YX_SPECIAL_DETAIL               = "pages-purchaser/noteAndViewpoint/noteAndViewpoint?id="         //研选专栏详情
-	WX_MSG_PATH_YX_SPECIAL_ENABLE_DETAIL        = "pages-purchaser/toExamine/toExamine?id="                       //研选专栏审核详情页面
-	WX_MSG_PATH_YX_SPECIAL_CENTER               = "pages-purchaser/contentAllPage/contentAllPage?Status=4"        //研选专栏内容中心
-	WX_MSG_PATH_QUESTIONNAIRE_DETAIL            = "pages-purchaser/themeVote/themeVote?id="                       //问卷调查详情页
+	WX_MSG_PATH_ARTICLE_DETAIL                    = "pageMy/reportDetail/reportDetail?id="                          //文章详情模板消息地址
+	WX_MSG_PATH_ACTIVITY_SPECIAL_DETAIL           = "activityPages/specialDetail/specialDetail?id="                 //专项调研活动模板消息地址
+	WX_MSG_PATH_ROAD_ESSENCE                      = "reportPages/roadEssence/roadEssence?id="                       //路演精华模板消息地址
+	WX_MSG_PATH_ACTIVITY_DETAIL                   = "activityPages/activityDetail/activityDetail?id="               //活动模板消息地址
+	WX_MSG_PATH_PRODUCTINTERIOR_DETAIL            = "reportPages/internalDetials/internalDetials?id="               //产品内测模版消息地址
+	WX_MSG_PATH_ACTIVITY_SIGNIN                   = "pages-signIn/isSignIn/isSignIn"                                //扫s码签到地址
+	WX_MSG_PATH_THIS_WEEK_DETAIL                  = "/reportPages/reportSecretDetail/reportSecretDetail?type=2&id=" //本周研究汇总详情模板消息地址
+	WX_MSG_PATH_LAST_WEEK_DETAIL                  = "/reportPages/reportSecretDetail/reportSecretDetail?type=3&id=" //上周纪要汇总详情模板消息地址
+	WX_MSG_PATH_KEY_COMPANY_DETAIL                = "/reportPages/keyCompany/keyCompany?id="                        //重点公司详情模板消息地址
+	WX_MSG_PATH_INDUSTRY_DETAIL                   = "/reportPages/IndustryReport/IndustryReport?id="                //产业详情模板消息地址
+	CYGX_YANXUAN_POINTS_KEY                string = "CYGX_YANXUAN_POINTS_KEY"                                       //查研观向研选活动扣点KEY(冲突,先放这里)
+	WX_MSG_PATH_YX_SPECIAL_DETAIL                 = "pages-purchaser/noteAndViewpoint/noteAndViewpoint?id="         //研选专栏详情
+	WX_MSG_PATH_YX_SPECIAL_ENABLE_DETAIL          = "pages-purchaser/toExamine/toExamine?id="                       //研选专栏审核详情页面
+	WX_MSG_PATH_YX_SPECIAL_CENTER                 = "pages-purchaser/contentAllPage/contentAllPage?Status=4"        //研选专栏内容中心
+	WX_MSG_PATH_QUESTIONNAIRE_DETAIL              = "pages-purchaser/themeVote/themeVote?id="                       //问卷调查详情页
+	WX_MSG_PATH_MORNING_MEETING_LOG_DETAIL        = "pages-meeting/toExamine/toExamine?LogId="                      //晨会精华模板消息日志跳转详情
 )
 
 // 图表类型