Selaa lähdekoodia

Merge branch 'master' of http://8.136.199.33:3000/hongze/hz_crm_api into export_article_pv

zhangchuanxing 15 tuntia sitten
vanhempi
commit
e6c04884f4
100 muutettua tiedostoa jossa 8629 lisäystä ja 1666 poistoa
  1. 44 63
      controllers/company.go
  2. 51 17
      controllers/company_apply.go
  3. 162 17
      controllers/company_apply_v2.go
  4. 22 6
      controllers/company_permission.go
  5. 108 3
      controllers/company_seller.go
  6. 25 0
      controllers/company_user.go
  7. 17 39
      controllers/cygx/activity.go
  8. 27 1
      controllers/cygx/activity_meet.go
  9. 42 3
      controllers/cygx/activity_special.go
  10. 143 282
      controllers/cygx/activity_special_trip.go
  11. 2 2
      controllers/cygx/contract_allocation.go
  12. 1 1
      controllers/cygx/enter_score.go
  13. 154 36
      controllers/cygx/rai_serve.go
  14. 13 0
      controllers/cygx/report_article.go
  15. 31 3
      controllers/cygx/summary_manage.go
  16. 32 7
      controllers/cygx/user.go
  17. 364 0
      controllers/cygx/user_rai_label.go
  18. 100 32
      controllers/roadshow/calendar.go
  19. 19 0
      controllers/roadshow/calendar_meeting_user.go
  20. 416 0
      controllers/roadshow/calendar_researcher_question.go
  21. 301 12
      controllers/roadshow/company.go
  22. 497 62
      controllers/roadshow/report.go
  23. 213 5
      controllers/seal/seal_approval.go
  24. 1794 0
      controllers/statistic/rai_data_summary.go
  25. 129 17
      controllers/statistic_company_merge.go
  26. 5 1
      controllers/statistic_report.go
  27. 15 16
      controllers/sys_admin.go
  28. 12 0
      controllers/sys_role.go
  29. 7 6
      go.mod
  30. 13 0
      go.sum
  31. 48 2
      models/company/company.go
  32. 33 26
      models/company/company_apply.go
  33. 12 1
      models/company/company_approval.go
  34. 35 1
      models/company/company_contract.go
  35. 23 0
      models/company/company_contract_no_renewed_ascribe.go
  36. 59 26
      models/company/company_permission.go
  37. 6 0
      models/company/company_seller.go
  38. 3 0
      models/company/wx_user_op_log.go
  39. 4 0
      models/contract/contract.go
  40. 13 0
      models/cygx/activity.go
  41. 16 0
      models/cygx/activity_ask_email.go
  42. 8 0
      models/cygx/activity_signup_detail.go
  43. 11 0
      models/cygx/activity_special.go
  44. 5 5
      models/cygx/activity_special_permission_points.go
  45. 35 55
      models/cygx/activity_special_trip_bill.go
  46. 1 2
      models/cygx/activity_video.go
  47. 8 0
      models/cygx/activity_voice.go
  48. 43 1
      models/cygx/askserie_video_history_record.go
  49. 50 49
      models/cygx/cygx_user.go
  50. 42 39
      models/cygx/cygx_user_record.go
  51. 34 0
      models/cygx/industrial_article_group_management.go
  52. 4 1
      models/cygx/rai_serve_bill.go
  53. 5 0
      models/cygx/rai_serve_company.go
  54. 32 0
      models/cygx/report_history_record.go
  55. 2 0
      models/cygx/summary_manage.go
  56. 282 0
      models/cygx/wx_user_rai_label.go
  57. 4 0
      models/db.go
  58. 1 0
      models/fms/contract_invoice.go
  59. 116 14
      models/fms/invoice_payment_summary.go
  60. 20 4
      models/roadshow/calendar.go
  61. 206 0
      models/roadshow/calendar_researcher_question.go
  62. 1 0
      models/roadshow/company.go
  63. 131 12
      models/roadshow/report_record.go
  64. 9 1
      models/roadshow/rs_calendar_meeting_user.go
  65. 40 0
      models/roadshow/rs_report_record_permission.go
  66. 7 0
      models/seal/request/seal_approval.go
  67. 146 4
      models/seal/seal.go
  68. 67 1
      models/statistic_report.go
  69. 188 0
      models/statistic_report/rai_data_summary.go
  70. 8 0
      models/system/sys_admin.go
  71. 7 0
      models/system/sys_user.go
  72. 135 0
      routers/commentsRouter.go
  73. 3 0
      routers/router.go
  74. 2 1
      services/company_apply/company_approval.go
  75. 52 0
      services/company_ascribe.go
  76. 154 0
      services/company_contract.go
  77. 1 1
      services/company_permission.go
  78. 12 1
      services/contract/contract.go
  79. 30 39
      services/cygx/acitvity.go
  80. 21 1
      services/cygx/activity_meet.go
  81. 110 11
      services/cygx/activity_points_set.go
  82. 234 0
      services/cygx/activity_poster.go
  83. 17 9
      services/cygx/activity_power_check.go
  84. 2 2
      services/cygx/activity_signup.go
  85. 188 246
      services/cygx/activity_special.go
  86. 264 11
      services/cygx/activity_wx_msg.go
  87. 1 1
      services/cygx/article.go
  88. 45 9
      services/cygx/contract_allocation.go
  89. 0 2
      services/cygx/mail.go
  90. 1 1
      services/cygx/research_summary.go
  91. 110 2
      services/cygx/resource_data.go
  92. 125 49
      services/cygx/special_wx_msg.go
  93. 92 0
      services/cygx/user_rai_label.go
  94. 31 0
      services/cygx/user_remind.go
  95. 1 1
      services/elastic/es_comprehensive.go
  96. 65 0
      services/roadshow/calendar.go
  97. 169 19
      services/roadshow/report.go
  98. 204 24
      services/seal/seal.go
  99. 8 8
      services/wechat_send_category_template_msg.go
  100. 28 353
      services/wechat_send_msg.go

+ 44 - 63
controllers/company.go

@@ -2723,22 +2723,6 @@ func (this *CompanyController) Add() {
 
 	//移除空格
 	req.CreditCode = utils.TrimStr(req.CreditCode)
-
-	var startDateTime, endDateTime time.Time
-	if req.Status == utils.COMPANY_STATUS_TRY_OUT {
-		startDateTime = time.Now()
-		endDateTime = time.Now().AddDate(0, 2, 0)
-	} else if req.Status == utils.COMPANY_STATUS_FOREVER {
-		startDateTime = time.Now()
-		endDateTime = time.Now().AddDate(100, 0, 0)
-	} else {
-		br.Msg = "无效的客户状态,请重新选择"
-		return
-	}
-	var startDate, endDate string
-	startDate = startDateTime.Format(utils.FormatDate)
-	endDate = endDateTime.Format(utils.FormatDate)
-
 	if req.CompanyType == "" {
 		br.Msg = "请选择客户类型"
 		return
@@ -2756,6 +2740,24 @@ func (this *CompanyController) Add() {
 		return
 	}
 
+	var startDateTime, endDateTime time.Time
+	if req.Status == utils.COMPANY_STATUS_TRY_OUT {
+		startDateTime = time.Now()
+		endDateTime = time.Now().AddDate(0, 2, 0)
+		if productId == utils.COMPANY_PRODUCT_RAI_ID {
+			endDateTime = time.Now().AddDate(0, 1, 0) // 权益客户试用期改为1个月
+		}
+	} else if req.Status == utils.COMPANY_STATUS_FOREVER {
+		startDateTime = time.Now()
+		endDateTime = time.Now().AddDate(100, 0, 0)
+	} else {
+		br.Msg = "无效的客户状态,请重新选择"
+		return
+	}
+	var startDate, endDate string
+	startDate = startDateTime.Format(utils.FormatDate)
+	endDate = endDateTime.Format(utils.FormatDate)
+
 	if req.IndustryId <= 0 {
 		br.Msg = "请选择行业"
 		return
@@ -2906,6 +2908,9 @@ func (this *CompanyController) Add() {
 	if req.Status == utils.COMPANY_STATUS_TRY_OUT {
 		item.EndDate = time.Now().AddDate(0, 2, 0).Format(utils.FormatDate)
 		item.CompanyType = 2
+		if productId == utils.COMPANY_PRODUCT_RAI_ID {
+			item.EndDate = time.Now().AddDate(0, 1, 0).Format(utils.FormatDate) // 权益客户试用期改为1个月
+		}
 	}
 
 	item.FirstStartDate = item.StartDate
@@ -3403,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()
@@ -3417,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
@@ -5072,6 +5077,9 @@ func (this *CompanyController) Receive() {
 		if req.Status == utils.COMPANY_STATUS_TRY_OUT {
 			startDateTime = time.Now()
 			endDateTime = time.Now().AddDate(0, 2, 0)
+			if productId == utils.COMPANY_PRODUCT_RAI_ID {
+				endDateTime = time.Now().AddDate(0, 1, 0) // 权益客户试用期改为1个月。 需求池 1035
+			}
 		} else if req.Status == utils.COMPANY_STATUS_FOREVER {
 			startDateTime = time.Now()
 			endDateTime = time.Now().AddDate(100, 0, 0)
@@ -7867,15 +7875,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
 					}
 				}
 			}
@@ -9656,50 +9667,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)
 	}
 

+ 51 - 17
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)
@@ -1406,7 +1414,11 @@ func (this *CompanyApplyController) ApplyThawOld() {
 					delayItem.CompanyApplyId = companyApprovalId
 					delayItem.ChartPermissionId = permissionId
 					delayItem.StartDate = time.Now().Format(utils.FormatDate)
-					delayItem.EndDate = time.Now().AddDate(0, 2, 0).Format(utils.FormatDate)
+					if productId == utils.COMPANY_PRODUCT_RAI_ID { // 权益客户试用期改为1个月。 需求池 1035
+						delayItem.EndDate = time.Now().AddDate(0, 1, 0).Format(utils.FormatDate)
+					} else {
+						delayItem.EndDate = time.Now().AddDate(0, 2, 0).Format(utils.FormatDate)
+					}
 					delayItem.CreateTime = time.Now()
 					delayItem.ModifyTime = time.Now()
 					err = company.AddCompanyDelayPermission(delayItem)
@@ -1599,7 +1611,12 @@ func (this *CompanyApplyController) ApplyDelayOld() {
 							delayItem.CompanyApplyId = companyApprovalId
 							delayItem.ChartPermissionId = permissionId
 							delayItem.StartDate = time.Now().Format(utils.FormatDate)
-							delayItem.EndDate = time.Now().AddDate(0, 2, 0).Format(utils.FormatDate)
+							if productId == utils.COMPANY_PRODUCT_RAI_ID { // 权益客户试用期改为1个月。 需求池 1035
+								delayItem.EndDate = time.Now().AddDate(0, 1, 0).Format(utils.FormatDate)
+							} else {
+								delayItem.EndDate = time.Now().AddDate(0, 2, 0).Format(utils.FormatDate)
+							}
+
 							delayItem.CreateTime = time.Now()
 							delayItem.ModifyTime = time.Now()
 							err = company.AddCompanyDelayPermission(delayItem)
@@ -2006,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()
@@ -2031,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)
 		}
 
@@ -2068,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() {
@@ -2084,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)
@@ -2102,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 {
@@ -2158,7 +2190,6 @@ func (this *CompanyApplyController) ApplyContract() {
 					})
 				}
 			}
-
 			plist.Items = append(plist.Items, n)
 
 			if totalForever == 0 && !mapPermissionNameUpgrade[n.PermissionName] {
@@ -2190,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)

+ 162 - 17
controllers/company_apply_v2.go

@@ -5,6 +5,7 @@ import (
 	"fmt"
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/company"
+	"hongze/hz_crm_api/models/seal"
 	"hongze/hz_crm_api/models/system"
 	"hongze/hz_crm_api/services"
 	"hongze/hz_crm_api/services/company_apply"
@@ -122,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)
@@ -131,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 {
@@ -154,6 +158,7 @@ func (this *CompanyApplyController) ApplyServiceUpdate() {
 			}
 			if totalLastYear > 0 {
 				raicontractType = "新签合同"
+				req.ContractType = "新签合同"
 			}
 		}
 
@@ -205,6 +210,42 @@ func (this *CompanyApplyController) ApplyServiceUpdate() {
 			br.ErrMsg = "生成合同编码失败,Err:" + err.Error()
 			return
 		}
+		var sealId int
+		if productId == 2 {
+			contractCode, err = seal.GetSealCodeRai() //权益客户合同编号格式替换
+			if err != nil {
+				br.Msg = "生成合同编码失败"
+				br.ErrMsg = "生成合同编码失败,Err:" + err.Error()
+				return
+			}
+			sealCount, err := seal.GetCountByDateAndCompanyId(req.StartDate, req.EndDate, req.CompanyId)
+			if err != nil {
+				br.Msg = "生成合同编码失败"
+				br.ErrMsg = "获取用印合同数量信息失败,Err:" + err.Error()
+				return
+			}
+			crmConfig, err := company.GetConfigDetailByCode("rai_seal_check") //权益非标合同是否校验用印提交
+			if err != nil {
+				br.Msg = "获取配置失败"
+				br.ErrMsg = "获取配置失败,Err:" + err.Error()
+				return
+			}
+
+			if sealCount == 0 && crmConfig.ConfigValue == "1" {
+				br.Msg = "此合同暂未申请用印,请核对合同期限是否有误"
+				return
+			}
+			if sealCount > 0 {
+				sealInfo, err := seal.GetSealInfoByDateAndCompanyId(req.StartDate, req.EndDate, req.CompanyId)
+				if err != nil {
+					br.Msg = "生成合同编码失败"
+					br.ErrMsg = "获取用印合同信息失败,Err:" + err.Error()
+					return
+				}
+				contractCode = sealInfo.Code
+				sealId = sealInfo.SealId
+			}
+		}
 		//当前是否存在待审批的单子
 		nowCompanyApprovalInfo, err := company.GetCompanyApprovalById(req.CompanyId, productId)
 		if (err == nil || nowCompanyApprovalInfo != nil) || err != nil && err.Error() != utils.ErrNoRow() {
@@ -257,6 +298,19 @@ func (this *CompanyApplyController) ApplyServiceUpdate() {
 			br.ErrMsg = "新增合同失败,Err:" + err.Error()
 			return
 		}
+
+		//如果用印ID > 0 建立合同ID,与用印申请表的关系
+		if sealId > 0 {
+			//用印作废
+			err = seal.UpdateSealCompanyContractId(int(newId), sealId)
+			if err != nil {
+				br.Msg = "操作失败"
+				br.ErrMsg = "添加用印与合同的关系失败,Err:" + err.Error()
+				return
+			}
+		}
+		go services.UpdateCompanyContractInheritEndDate(int(newId))
+
 		permissionArr := strings.Split(req.PermissionIds, ",")
 		permissionMap := make(map[int]int) //权限id的map集合,用来避免重复添加权限校验
 
@@ -282,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]
@@ -347,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()
@@ -471,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)
@@ -654,6 +709,10 @@ func (this *CompanyApplyController) ApplyTurnPositive() {
 			}
 		}
 	}
+	//权益合同类型,有一套单独的逻辑
+	if productId == 2 {
+		contractType = raicontractType
+	}
 
 	var companyApprovalId int
 	// 全新的申请转正
@@ -664,6 +723,76 @@ func (this *CompanyApplyController) ApplyTurnPositive() {
 			br.ErrMsg = "生成合同编码失败,Err:" + err.Error()
 			return
 		}
+
+		//如果是权益的合同,合同编号另取
+
+		if productId == 2 {
+			sealCount, err := seal.GetCountByDateAndCompanyId(req.StartDate, req.EndDate, req.CompanyId)
+			if err != nil {
+				br.Msg = "生成合同编码失败"
+				br.ErrMsg = "获取用印合同数量信息失败,Err:" + err.Error()
+				return
+			}
+			crmConfig, err := company.GetConfigDetailByCode("rai_seal_check") //权益非标合同是否校验用印提交
+			if err != nil {
+				br.Msg = "获取配置失败"
+				br.ErrMsg = "获取配置失败,Err:" + err.Error()
+				return
+			}
+
+			if sealCount == 0 && crmConfig.ConfigValue == "1" {
+				br.Msg = "此合同暂未申请用印,请核对合同期限是否有误"
+				return
+			}
+			if sealCount > 0 {
+				sealInfo, err := seal.GetSealInfoByDateAndCompanyId(req.StartDate, req.EndDate, req.CompanyId)
+				if err != nil {
+					br.Msg = "生成合同编码失败"
+					br.ErrMsg = "获取用印合同信息失败,Err:" + err.Error()
+					return
+				}
+				contractCode = sealInfo.Code
+			}
+		}
+
+		var sealId int
+
+		if productId == 2 {
+			contractCode, err = seal.GetSealCodeRai() //权益客户合同编号格式替换
+			if err != nil {
+				br.Msg = "生成合同编码失败"
+				br.ErrMsg = "生成合同编码失败,Err:" + err.Error()
+				return
+			}
+			sealCount, err := seal.GetCountByDateAndCompanyId(req.StartDate, req.EndDate, req.CompanyId)
+			if err != nil {
+				br.Msg = "生成合同编码失败"
+				br.ErrMsg = "获取用印合同数量信息失败,Err:" + err.Error()
+				return
+			}
+			crmConfig, err := company.GetConfigDetailByCode("rai_seal_check") //权益非标合同是否校验用印提交
+			if err != nil {
+				br.Msg = "获取配置失败"
+				br.ErrMsg = "获取配置失败,Err:" + err.Error()
+				return
+			}
+
+			if sealCount == 0 && crmConfig.ConfigValue == "1" {
+				br.Msg = "此合同暂未申请用印,请核对合同期限是否有误"
+				return
+			}
+			if sealCount > 0 {
+				sealInfo, err := seal.GetSealInfoByDateAndCompanyId(req.StartDate, req.EndDate, req.CompanyId)
+				if err != nil {
+					br.Msg = "生成合同编码失败"
+					br.ErrMsg = "获取用印合同信息失败,Err:" + err.Error()
+					return
+				}
+				contractCode = sealInfo.Code
+				sealId = sealInfo.SealId
+			}
+		}
+
 		//当前是否存在待审批的单子
 		nowCompanyApprovalInfo, err := company.GetCompanyApprovalById(req.CompanyId, productId)
 		if (err == nil || nowCompanyApprovalInfo != nil) || err != nil && err.Error() != utils.ErrNoRow() {
@@ -717,6 +846,20 @@ func (this *CompanyApplyController) ApplyTurnPositive() {
 			br.ErrMsg = "新增合同失败,Err:" + err.Error()
 			return
 		}
+
+		//如果用印ID > 0 建立合同ID,与用印申请表的关系
+		if sealId > 0 {
+			//用印作废
+			err = seal.UpdateSealCompanyContractId(int(newId), sealId)
+			if err != nil {
+				br.Msg = "操作失败"
+				br.ErrMsg = "添加用印与合同的关系失败,Err:" + err.Error()
+				return
+			}
+		}
+
+		go services.UpdateCompanyContractInheritEndDate(int(newId))
+
 		permissionArr := strings.Split(req.PermissionIds, ",")
 		permissionMap := make(map[int]int) //权限id的map集合,用来避免重复添加权限校验
 		permissionItems := make([]*company.CompanyContractPermission, 0)
@@ -747,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
@@ -1228,6 +1363,7 @@ func (this *CompanyApplyController) ApplyBySystemContract() {
 			br.ErrMsg = "新增合同失败,Err:" + err.Error()
 			return
 		}
+		go services.UpdateCompanyContractInheritEndDate(int(newId))
 		upgradeMap := make(map[int]int)
 		if utils.RunMode == "release" {
 			upgradeMap = map[int]int{22: 39, 21: 38, 20: 37, 19: 36}
@@ -1636,7 +1772,11 @@ func (this *CompanyApplyController) ApplyThaw() {
 					delayItem.CompanyApplyId = companyApprovalId
 					delayItem.ChartPermissionId = permissionId
 					delayItem.StartDate = time.Now().Format(utils.FormatDate)
-					delayItem.EndDate = time.Now().AddDate(0, 2, 0).Format(utils.FormatDate)
+					if productId == utils.COMPANY_PRODUCT_RAI_ID { // 权益客户试用期改为1个月。 需求池 1035
+						delayItem.EndDate = time.Now().AddDate(0, 1, 0).Format(utils.FormatDate)
+					} else {
+						delayItem.EndDate = time.Now().AddDate(0, 2, 0).Format(utils.FormatDate)
+					}
 					delayItem.CreateTime = time.Now()
 					delayItem.ModifyTime = time.Now()
 					err = company.AddCompanyDelayPermission(delayItem)
@@ -2139,7 +2279,12 @@ func (this *CompanyApplyController) ApplyReceive() {
 					delayItem.CompanyApplyId = companyApprovalId
 					delayItem.ChartPermissionId = permissionId
 					delayItem.StartDate = time.Now().Format(utils.FormatDate)
-					delayItem.EndDate = time.Now().AddDate(0, 2, 0).Format(utils.FormatDate)
+					if productId == utils.COMPANY_PRODUCT_RAI_ID { // 权益客户试用期改为1个月。 需求池 1035
+						delayItem.EndDate = time.Now().AddDate(0, 1, 0).Format(utils.FormatDate)
+					} else {
+						delayItem.EndDate = time.Now().AddDate(0, 2, 0).Format(utils.FormatDate)
+					}
+
 					delayItem.CreateTime = time.Now()
 					delayItem.ModifyTime = time.Now()
 					err = company.AddCompanyDelayPermission(delayItem)

+ 22 - 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 {
@@ -932,6 +945,9 @@ func (this *CompanyPermissionController) PermissionAddTryOut() {
 	companyReportPermissionList := make([]*company.CompanyReportPermission, 0) //添加的品种
 	startDateTime := time.Now()
 	endDateTime := startDateTime.AddDate(0, 2, 0)
+	if product == utils.COMPANY_PRODUCT_RAI_ID { // 权益客户试用期改为1个月。 需求池 1035
+		endDateTime = startDateTime.AddDate(0, 1, 0)
+	}
 	for _, v := range permissionArr {
 		permissionId, _ := strconv.Atoi(v)
 		count, err := company.GetCompanyPermissionCheck(req.CompanyId, permissionId)

+ 108 - 3
controllers/company_seller.go

@@ -191,7 +191,7 @@ func (this *CompanySellerController) CheckListV2() {
 	getAllUser, _ := this.GetBool("AllUser", false)
 	status, _ := this.GetInt("Status", 0)
 	getAllEnabled, _ := this.GetBool("AllEnabled", false)
-	enabled := -1       //默认只获取正常状态的用户
+	enabled := -1      //默认只获取正常状态的用户
 	if getAllEnabled { //获取所有状态的用户
 		enabled = -1
 	}
@@ -5572,7 +5572,7 @@ func (this *CompanySellerController) InvoicePaymentCheckList() {
 	getAllUser, _ := this.GetBool("AllUser", false)
 	status, _ := this.GetInt("Status", 0)
 	//getAllEnabled, _ := this.GetBool("AllEnabled", false)
-	enabled := -1       //默认只获取正常状态的用户
+	enabled := -1 //默认只获取正常状态的用户
 	//if getAllEnabled { //获取所有状态的用户
 	//	enabled = -1
 	//}
@@ -7485,4 +7485,109 @@ func (this *CompanySellerController) InvoicePaymentCheckList() {
 	br.Data = company.DepartmentGroupSellersResp{
 		List: list,
 	}
-}
+}
+
+// CheckListV2
+// @Title 获取权益开拓组或者服务组下面的销售
+// @Description 获取权益开拓组或者服务组下面的销售接口
+// @Success 200 {object} company.DepartmentGroupSellersResp
+// @router /seller/check/list_rai/server_type [get]
+func (this *CompanySellerController) CheckListRaiServerType() {
+	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
+	}
+	//serverType := this.GetString("ServerType", "开拓")
+	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 "
+	var pars []interface{}
+	//名字带6 的属于服务组
+	//if serverType == "开拓" {
+	//	condition += " AND  real_name  NOT LIKE '%6%' "
+	//} else {
+	//	condition += " AND  real_name LIKE '%6%' "
+	//}
+	sellerList, err := system.GetSysUserItemsOrderByCreated(condition, pars)
+	if err != nil {
+		br.Msg = "获取管理账号失败"
+		br.ErrMsg = "获取管理账号失败,Err:" + err.Error()
+		return
+	}
+	//部门管理员看小组、销售
+	departmentId := 5
+	groupList, err := system.GetSysGroupByDepartmentId(departmentId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取分组失败,Err:" + err.Error()
+		return
+	}
+	for _, group := range groupList {
+		groupSellerList := make([]company.DepartmentGroupSellers, 0)
+		groupItem := company.DepartmentGroupSellers{
+			AdminId: fmt.Sprint("group_", group.DepartmentId),
+			//AdminName string `description:"系统用户名称"`
+			RealName:     group.GroupName,
+			ChildrenList: groupSellerList,
+		}
+		for _, seller := range sellerList {
+			if seller.GroupId != group.GroupId || strings.Contains(seller.RealName, "6") {
+				continue
+			}
+			sellerItem := company.DepartmentGroupSellers{
+				AdminId:      fmt.Sprint(seller.AdminId),
+				RealName:     seller.RealName,
+				Authority:    seller.Authority,
+				RoleTypeCode: seller.RoleTypeCode,
+			}
+			groupSellerList = append(groupSellerList, sellerItem)
+		}
+		groupItem.ChildrenList = groupSellerList
+		if len(groupSellerList) > 0 {
+			list = append(list, groupItem)
+		}
+	}
+
+	for _, group := range groupList {
+		groupSellerList := make([]company.DepartmentGroupSellers, 0)
+		groupItem := company.DepartmentGroupSellers{
+			AdminId: fmt.Sprint("group_", group.DepartmentId),
+			//AdminName string `description:"系统用户名称"`
+			RealName:     group.GroupName,
+			ChildrenList: groupSellerList,
+		}
+		for _, seller := range sellerList {
+			if seller.GroupId != group.GroupId || !strings.Contains(seller.RealName, "6") {
+				continue
+			}
+			sellerItem := company.DepartmentGroupSellers{
+				AdminId:      fmt.Sprint(seller.AdminId),
+				RealName:     seller.RealName,
+				Authority:    seller.Authority,
+				RoleTypeCode: seller.RoleTypeCode,
+			}
+			groupSellerList = append(groupSellerList, sellerItem)
+		}
+		groupItem.ChildrenList = groupSellerList
+		if len(groupSellerList) > 0 {
+			listServer = append(listServer, groupItem)
+		}
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = company.DepartmentGroupSellersServerResp{
+		List:       list,
+		ListServer: listServer,
+	}
+}

+ 25 - 0
controllers/company_user.go

@@ -1528,6 +1528,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 +1603,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),
@@ -2805,6 +2813,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 +2864,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),

+ 17 - 39
controllers/cygx/activity.go

@@ -32,6 +32,7 @@ func (this *ActivityCoAntroller) List() {
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
+
 	isZxdy, _ := this.GetBool("IsZxdy", false)
 	sysUser := this.SysUser
 	if sysUser == nil {
@@ -617,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
@@ -682,18 +690,7 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 					itemVideo.CreateTime = time.Now().Format(utils.FormatDateTime)
 					sourceVivo = utils.CYGX_OBJ_ACTIVITYVIDEO
 				}
-				//删除原有的视频数据
-				//if itemVideo.VideoUrl != "" {
-				//videoDetail, err := cygx.GetCygxActivityVideoReqDetail(activityId)
-				//if err != nil && err.Error() != utils.ErrNoRow() {
-				//	br.Msg = "获取信息失败"
-				//	br.ErrMsg = "GetCygxActivityVideoReqDetail,Err:" + err.Error() + "activityId:" + strconv.Itoa(activityId)
-				//	return
-				//}
-				//if videoDetail != nil {
-				//	go cygxService.UpdateResourceData(videoDetail.VideoId, "activityvideo", "delete", time.Now().Format(utils.FormatDateTime))
-				//}
-				//}
+
 				//处理音视频上传
 				err = cygxService.UpdateActivityVideoAndVoice(activityInfo, itemVoice, itemVideo)
 				if err != nil && err.Error() != utils.ErrNoRow() {
@@ -708,19 +705,7 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 					br.ErrMsg = "UpdateActivityVideoAndVoice,Err:" + err.Error() + "activityId:" + strconv.Itoa(activityId)
 					return
 				}
-				//if itemVoice.VoiceUrl != "" {
-				//voiceReqList, err := cygx.GetCygxActivityVoiceReqList(activityId)
-				//if err != nil && err.Error() != utils.ErrNoRow() {
-				//	br.Msg = "获取信息失败"
-				//	br.ErrMsg = "GetCygxActivityVoiceReqList,Err:" + err.Error() + "activityId:" + strconv.Itoa(activityId)
-				//	return
-				//}
-				//if len(voiceReqList) > 0 {
-				//	for _, voice := range voiceReqList {
-				//		go cygxService.UpdateResourceData(voice.ActivityVoiceId, "activityvoice", "delete", time.Now().Format(utils.FormatDateTime))
-				//	}
-				//}
-				//}
+
 				//如果活动信息有如下变更则做消息推送
 				err = cygx.EditActivity(item, activityInfo.PublishStatus, industrialActivityItemsList, subjectActivityItemsList, itemPointsSet)
 				if err != nil {
@@ -728,18 +713,10 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 					br.ErrMsg = "操作失败,Err:" + err.Error()
 					return
 				}
-				////更新活动音频
-				//if int(voiceIdNew) > 0 {
-				//	go cygxService.UpdateResourceData(int(voiceIdNew), "activityvoice", "add", activityInfo.ActivityTime)
-				//}
-				////更新活动视频
-				//if int(videoIdNew) > 0 {
-				//	go cygxService.UpdateResourceData(int(videoIdNew), "activityvideo", "add", activityInfo.ActivityTime)
-				//}
 
 				errAct = err
 				if activityInfo.PublishStatus == 1 && activityInfo.ActivityTimeText != item.ActivityTimeText {
-					go services.SendWxMsgWithCygxActivityUpdateTime(req.ActivityId, activityInfo.ActivityTimeText, item.ActivityTimeText, "timeType")
+					go cygxService.SendWxMsgWithCygxActivityUpdateTime(req.ActivityId, activityInfo.ActivityTimeText, item.ActivityTimeText, "timeType")
 					if activityInfo.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
 						activityTime, err := time.Parse(utils.FormatDateTime, item.ActivityTime)
 						if err != nil {
@@ -754,26 +731,26 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 				oldExpert, _ := cygx.GetReportContentTextSub(activityInfo.Expert)
 				newExpert, _ := cygx.GetReportContentTextSub(item.Expert)
 				if activityInfo.PublishStatus == 1 && oldExpert != newExpert {
-					go services.SendWxMsgWithCygxActivityUpdateTime(req.ActivityId, oldExpert, newExpert, "expertType")
+					go cygxService.SendWxMsgWithCygxActivityUpdateTime(req.ActivityId, oldExpert, newExpert, "expertType")
 					if activityInfo.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
 						go services.SendWxCategoryMsgWithCygxActivityUpdateTime(req.ActivityId, activityInfo.ActivityTimeText, newExpert, "expertType")
 					}
 				}
 				if activityInfo.PublishStatus == 1 && activityInfo.Address != item.Address {
-					go services.SendWxMsgWithCygxActivityUpdateTime(req.ActivityId, activityInfo.Address, item.Address, "addressType")
+					go cygxService.SendWxMsgWithCygxActivityUpdateTime(req.ActivityId, activityInfo.Address, item.Address, "addressType")
 					if activityInfo.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
 						go services.SendWxCategoryMsgWithCygxActivityUpdateTime(req.ActivityId, activityInfo.ActivityTimeText, item.Address, "addressType")
 					}
 				}
 				if activityInfo.PublishStatus == 1 && activityInfo.ParticipationCode != item.ParticipationCode {
-					go services.SendWxMsgWithCygxActivityUpdateTime(req.ActivityId, activityInfo.ParticipationCode, item.ParticipationCode, "participationCode")
+					go cygxService.SendWxMsgWithCygxActivityUpdateTime(req.ActivityId, activityInfo.ParticipationCode, item.ParticipationCode, "participationCode")
 					if activityInfo.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
 						go services.SendWxCategoryMsgWithCygxActivityUpdateTime(req.ActivityId, activityInfo.ActivityTimeText, item.ParticipationCode, "participationCode")
 					}
 				}
 
 				if activityInfo.PublishStatus == 1 && activityInfo.Theme != item.Theme {
-					go services.SendWxMsgWithCygxActivityUpdateTime(req.ActivityId, activityInfo.Theme, item.Theme, "Theme")
+					go cygxService.SendWxMsgWithCygxActivityUpdateTime(req.ActivityId, activityInfo.Theme, item.Theme, "Theme")
 					if activityInfo.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
 						go services.SendWxCategoryMsgWithCygxActivityUpdateTime(req.ActivityId, activityInfo.ActivityTimeText, item.Theme, "Theme")
 					}
@@ -851,6 +828,7 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 				//}()
 			}
 			go cygxService.MakeActivitySigninImg(v)
+			go cygxService.MakeActivityDetailImg2(v)
 		}
 	} else {
 		if req.DoType == 1 {
@@ -1342,7 +1320,7 @@ func (this *ActivityCoAntroller) PublishAndCancel() {
 		item.IsCancel = 1
 	}
 	if activityInfo.PublishStatus == 1 {
-		go services.SendWxMsgWithCygxActivity(req.ActivityId)
+		go cygxService.SendWxMsgWithCygxActivity(req.ActivityId)
 		//同步活动到最新数据表
 		//go cygxService.UpdateResourceData(req.ActivityId, "activity", "delete", "")
 		if activityInfo.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {

+ 27 - 1
controllers/cygx/activity_meet.go

@@ -340,6 +340,30 @@ func (this *ActivityMeetCoAntroller) MeetingDo() {
 			utils.Rc.Delete(redisKey)
 		}()
 	}
+
+	var conditionOld string //点了到会,又点了取消的人,对应的活动标签给取消掉
+	conditionOld += ` AND s.is_meeting = 1  AND  s.activity_id = ` + strconv.Itoa(activityId)
+	listOld, err := cygx.GetOfflineMeetingList(conditionOld)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	var deleteUserids []int
+	sliceNew := strings.Split(meetingUids, ",")
+	mapNewUserIds := make(map[string]bool)
+	for _, v := range sliceNew {
+		mapNewUserIds[v] = true
+	}
+
+	for _, v := range listOld {
+		if !mapNewUserIds[strconv.Itoa(v.UserId)] {
+			deleteUserids = append(deleteUserids, v.UserId)
+		}
+	} //点了到会,又点了取消的人,对应的活动标签给取消掉 end
+
+	//return
 	//加入缓存机制,避免创建同一个名称的指标 end
 	activityInfo, errInfo := cygx.GetAddActivityInfoById(activityId)
 	if activityInfo == nil {
@@ -445,6 +469,7 @@ func (this *ActivityMeetCoAntroller) MeetingDo() {
 	go cygxService.AddctivitySignupDetailList(itemDs, activityId)                        // 处理个人以及机构到会数量
 	go cygxService.ActivityUserLabelLogAdd(activityId, userIdArr)                        // 处理用户标签
 	go cygxService.YanXuanActivityPointsBillSubmitMeeting(activityId, AdminUser.AdminId) // 处理用户到会研选扣点
+	go cygxService.DeleteActivityWxUserRaiLabel(deleteUserids, activityId)               // 点了到会,又点了取消的人,对应的活动标签给取消掉
 	//添加操作日志记录
 	br.Ret = 200
 	br.Success = true
@@ -1484,7 +1509,8 @@ func (this *ActivityMeetCoAntroller) AttendanceDetail() {
 				isBloneSell = true
 			}
 			//如果这个活动属于销售创建,而且不是这个销售自己查看的,并且查看的角色不属于管理员或者权益管理员,那么就做限制处理
-			if isBloneSell && sysUser.AdminId != adminInfoActivity.AdminId && (sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_RAI_ADMIN) {
+			if isBloneSell && sysUser.AdminId != adminInfoActivity.AdminId && (sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_RAI_ADMIN) && !strings.Contains(activityInfo.AdminName, "6") {
+				//销售的6账号建的会,也可以让所有销售看到 需求池1020 2025-01-21
 				isProhibit = true //限制又取消了。2023-06-14 ,2024.09.04又开启了
 			}
 		}

+ 42 - 3
controllers/cygx/activity_special.go

@@ -2,13 +2,13 @@ package cygx
 
 import (
 	"encoding/json"
+	"fmt"
 	"github.com/rdlucklib/rdluck_tools/paging"
 	"github.com/tealeg/xlsx"
 	"hongze/hz_crm_api/controllers"
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/cygx"
 	"hongze/hz_crm_api/models/system"
-	"hongze/hz_crm_api/services"
 	cygxService "hongze/hz_crm_api/services/cygx"
 	"hongze/hz_crm_api/services/elastic"
 	"hongze/hz_crm_api/utils"
@@ -274,7 +274,7 @@ func (this *ActivitySpecialCoAntroller) PreserveAndPublish() {
 	}
 	//模板消息推送
 	if req.DoType == 1 {
-		go services.SendWxMsgWithCygxActivitySpecial(activityId)
+		go cygxService.SendWxMsgWithCygxActivitySpecial(activityId)
 		//go cygxService.UpdateResourceData(activityId, "activityspecial", "add", time.Now().Format(utils.FormatDateTime))
 	}
 	go cygxService.UpdateActivitySpecialResourceData(activityId) //写入首页最新  cygx_resource_data 表
@@ -535,7 +535,7 @@ func (this *ActivitySpecialCoAntroller) PublishAndCancel() {
 	}
 	//模板消息推送
 	if item.PublishStatus == 1 {
-		go services.SendWxMsgWithCygxActivitySpecial(activityId)
+		go cygxService.SendWxMsgWithCygxActivitySpecial(activityId)
 		//go cygxService.UpdateResourceData(activityId, "activityspecial", "add", time.Now().Format(utils.FormatDateTime))
 	} else {
 		go cygxService.DetermineTripCancel(activityId)
@@ -1189,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

+ 2 - 2
controllers/cygx/contract_allocation.go

@@ -616,7 +616,7 @@ func (this *ContractAllocationController) CompanyContracDetail() {
 	} else {
 		resp.TotalPointsContent = fmt.Sprint(resp.Money, "W")
 	}
-	sysUserList, err := cygx.GetAskEmailList()
+	sysUserList, err := cygx.GetAskEmailListPoint()
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,GetAskEmailList Err: " + err.Error()
@@ -1035,7 +1035,7 @@ func (this *ContractAllocationController) CompanyContractStatistics() {
 		}
 	}
 
-	sysUserList, err := cygx.GetAskEmailList()
+	sysUserList, err := cygx.GetAskEmailListPoint()
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,GetAskEmailList Err: " + err.Error()

+ 1 - 1
controllers/cygx/enter_score.go

@@ -117,7 +117,7 @@ func (this *EnterScoreController) EnterScoreDetail() {
 	var itemsGroup []*cygx.EnterScoreGroupListResp                     //自定义分组
 	if enterScoreId == 0 {
 		//权益研究员
-		sysUserList, err := cygx.GetAskEmailList()
+		sysUserList, err := cygx.GetAskEmailListPoint()
 		if err != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取失败,GetAskEmailList Err: " + err.Error()

+ 154 - 36
controllers/cygx/rai_serve.go

@@ -357,7 +357,7 @@ func (this *RaiServeCoAntroller) List() {
 	isExport, _ := this.GetBool("IsExport")
 	resp := new(cygx.CygxRaiServeCompanyListResp)
 	if isExport {
-		pageSize = 999
+		pageSize = 9999
 	}
 	var startSize int
 	if pageSize <= 0 {
@@ -441,10 +441,13 @@ func (this *RaiServeCoAntroller) List() {
 		companyIds = append(companyIds, v.CompanyId)
 	}
 
-	mapWeekAmount := make(map[string]float64) //周度服务量
+	mapWeekAmount := make(map[string]float64)  //周度服务量
+	mapMonthAmount := make(map[string]float64) //月度服务量
 	weeks := 4
+	months := 3
 	if isExport {
 		weeks = 12 // 下载获取近12周的数据
+		months = 6
 	}
 	lencompanyIds := len(companyIds)
 	if lencompanyIds > 0 {
@@ -475,14 +478,21 @@ func (this *RaiServeCoAntroller) List() {
 		}
 
 		now := time.Now()
-
 		for _, v := range listBill {
 			for i := 0; i < weeks; i++ {
 				// 计算当前周的周一
 				monday := now.AddDate(0, 0, -int(now.Weekday()-time.Monday)-i*7)
 				weekmonday := monday.Format(utils.FormatDate)
 				if v.WeekStartDate == weekmonday {
-					mapWeekAmount[fmt.Sprintf("CID_", v.CompanyId, "WEEK_", i)] += v.ServeCount
+					mapWeekAmount[fmt.Sprint("CID_", v.CompanyId, "WEEK_", i)] += v.ServeCount
+				}
+			}
+			for i := 0; i < months; i++ {
+				// 计算当前月的第一天
+				monthday := time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, now.Location()).AddDate(0, -i, 0)
+				monthFirstDay := monthday.Format(utils.FormatDate)
+				if v.MonthStartDate == monthFirstDay {
+					mapMonthAmount[fmt.Sprint("CID_", v.CompanyId, "MONTH_", i)] += v.ServeCount
 				}
 			}
 		}
@@ -504,16 +514,29 @@ func (this *RaiServeCoAntroller) List() {
 		item.Status = v.Status
 		item.PermissionName = v.PermissionName
 		item.IsUserMaker = v.IsUserMaker
-		item.ThisWeekAmount = mapWeekAmount[fmt.Sprintf("CID_", v.CompanyId, "WEEK_", 0)]
-		item.LastWeekAmount = mapWeekAmount[fmt.Sprintf("CID_", v.CompanyId, "WEEK_", 1)]
-		item.TwoWeekAmount = mapWeekAmount[fmt.Sprintf("CID_", v.CompanyId, "WEEK_", 2)]
-		item.ThreeWeekAmount = mapWeekAmount[fmt.Sprintf("CID_", v.CompanyId, "WEEK_", 3)]
+		item.ThisWeekAmount = mapWeekAmount[fmt.Sprint("CID_", v.CompanyId, "WEEK_", 0)]
+		item.LastWeekAmount = mapWeekAmount[fmt.Sprint("CID_", v.CompanyId, "WEEK_", 1)]
+		item.TwoWeekAmount = mapWeekAmount[fmt.Sprint("CID_", v.CompanyId, "WEEK_", 2)]
+		item.ThreeWeekAmount = mapWeekAmount[fmt.Sprint("CID_", v.CompanyId, "WEEK_", 3)]
+
+		item.ThisMonthAmount = mapMonthAmount[fmt.Sprint("CID_", v.CompanyId, "MONTH_", 0)]
+		item.LastMonthAmount = mapMonthAmount[fmt.Sprint("CID_", v.CompanyId, "MONTH_", 1)]
+		item.TwoMonthAmount = mapMonthAmount[fmt.Sprint("CID_", v.CompanyId, "MONTH_", 2)]
+		if item.TwoMonthAmount == 0 || item.LastMonthAmount-item.TwoMonthAmount == 0 {
+			item.LastMonthQoq = "0%" //上月环比=(上月服务量-上上月服务量)/上上月服务量,当数值≤-20%时,用红色字显示
+		} else {
+			item.LastMonthQoq = fmt.Sprint(utils.SubFloatToString((item.LastMonthAmount-item.TwoMonthAmount)/item.TwoMonthAmount*100, 2)) + "%"
+			if (item.LastMonthAmount-item.TwoMonthAmount)/item.TwoMonthAmount <= -0.2 {
+				item.LastMonthQoqIsRed = true
+			}
+		}
+
 		resp.List = append(resp.List, item)
 	}
 
 	//导出excel
 	if isExport {
-		RaiServeListExport(this, resp, mapWeekAmount, br)
+		RaiServeListExport(this, resp, mapWeekAmount, mapMonthAmount, br)
 		return
 	}
 	page := paging.GetPaging(currentIndex, pageSize, total)
@@ -525,10 +548,13 @@ func (this *RaiServeCoAntroller) List() {
 }
 
 // EnterScoreScoreListExport 导出Excel
-func RaiServeListExport(this *RaiServeCoAntroller, resp *cygx.CygxRaiServeCompanyListResp, mapWeekAmount map[string]float64, br *models.BaseResponse) {
+func RaiServeListExport(this *RaiServeCoAntroller, resp *cygx.CygxRaiServeCompanyListResp, mapWeekAmount map[string]float64, mapMonthAmount map[string]float64, br *models.BaseResponse) {
 	weeks := 12 // 下载获取近12周的数据
+	months := 6 // 下载获取近6个月的数据
 	mapWeekFormat := make(map[int]string)
+	mapMonthFormat := make(map[int]string)
 	now := time.Now()
+
 	for i := 0; i < weeks; i++ {
 		// 计算当前周的周一
 		monday := now.AddDate(0, 0, -int(now.Weekday()-time.Monday)-i*7)
@@ -537,7 +563,11 @@ func RaiServeListExport(this *RaiServeCoAntroller, resp *cygx.CygxRaiServeCompan
 		weeksunday := sunday.Format(utils.FormatMonthDayUnSpace2)
 		mapWeekFormat[i] = weekmonday + "~" + weeksunday
 	}
-
+	for i := 0; i < months; i++ {
+		// 处理月份
+		monthday := now.AddDate(0, -i, 0)
+		mapMonthFormat[i] = fmt.Sprint(int(monthday.Month()), "月")
+	}
 	dir, err := os.Executable()
 	exPath := filepath.Dir(dir)
 	downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
@@ -605,6 +635,32 @@ func RaiServeListExport(this *RaiServeCoAntroller, resp *cygx.CygxRaiServeCompan
 	cellF.SetStyle(style)
 	cellF.SetValue("合同金额")
 
+	cellMonth1 := titleRow.AddCell()
+	cellMonth1.SetStyle(style)
+	cellMonth1.SetValue("本月服务量")
+
+	cellMonthQoQ := titleRow.AddCell()
+	cellMonthQoQ.SetStyle(style)
+	cellMonthQoQ.SetValue("上月环比")
+
+	cellMonth2 := titleRow.AddCell()
+	cellMonth2.SetStyle(style)
+	cellMonth2.SetValue("上月服务量")
+
+	cellMonth3 := titleRow.AddCell()
+	cellMonth3.SetStyle(style)
+	cellMonth3.SetValue("上上月服务量")
+
+	for i := 0; i < months; i++ {
+		if i < 3 {
+			continue
+		}
+		// 计算当前周的周一
+		cellMonthi := titleRow.AddCell()
+		cellMonthi.SetStyle(style)
+		cellMonthi.SetValue(mapMonthFormat[i])
+	}
+
 	cellG := titleRow.AddCell()
 	cellG.SetStyle(style)
 	cellG.SetValue("签约套餐")
@@ -639,46 +695,72 @@ func RaiServeListExport(this *RaiServeCoAntroller, resp *cygx.CygxRaiServeCompan
 		dataRow := sheel.AddRow()
 		dataRow.SetHeight(20)
 
-		cellA := dataRow.AddCell()
+		cellAData := dataRow.AddCell()
 		if v.IsUserMaker == -1 {
-			cellA.SetStyle(redStyle)
+			cellAData.SetStyle(redStyle)
 		} else {
-			cellA.SetStyle(style)
+			cellAData.SetStyle(style)
 		}
-		cellA.SetValue(v.CompanyName)
+		cellAData.SetValue(v.CompanyName)
 
 		cellWeekData := dataRow.AddCell()
 		cellWeekData.SetStyle(style)
 		cellWeekData.SetValue(v.ServeCoverageRate)
 
-		cellB := dataRow.AddCell()
-		cellB.SetStyle(style)
-		cellB.SetValue(v.Status)
+		cellBData := dataRow.AddCell()
+		cellBData.SetStyle(style)
+		cellBData.SetValue(v.Status)
+
+		cellCData := dataRow.AddCell()
+		cellCData.SetStyle(style)
+		cellCData.SetValue(v.SellerName)
+
+		cellDData := dataRow.AddCell()
+		cellDData.SetStyle(style)
+		cellDData.SetValue(v.ShareSeller)
 
-		cellC := dataRow.AddCell()
-		cellC.SetStyle(style)
-		cellC.SetValue(v.SellerName)
+		cellEData := dataRow.AddCell()
+		cellEData.SetStyle(style)
+		cellEData.SetValue(v.StartDate + "~" + v.EndDate)
 
-		cellD := dataRow.AddCell()
-		cellD.SetStyle(style)
-		cellD.SetValue(v.ShareSeller)
+		cellFData := dataRow.AddCell()
+		cellFData.SetStyle(style)
+		cellFData.SetValue(v.Money)
 
-		cellE := dataRow.AddCell()
-		cellE.SetStyle(style)
-		cellE.SetValue(v.StartDate + "~" + v.EndDate)
+		cellMonth1Data := dataRow.AddCell()
+		cellMonth1Data.SetStyle(style)
+		cellMonth1Data.SetValue(mapMonthAmount[fmt.Sprint("CID_", v.CompanyId, "MONTH_", 0)])
 
-		cellF := dataRow.AddCell()
-		cellF.SetStyle(style)
-		cellF.SetValue(v.Money)
+		cellMonthQoQData := dataRow.AddCell()
+		var cellMonthQoQStr string
+		if mapMonthAmount[fmt.Sprint("CID_", v.CompanyId, "MONTH_", 1)]-mapMonthAmount[fmt.Sprint("CID_", v.CompanyId, "MONTH_", 2)] == 0 || mapMonthAmount[fmt.Sprint("CID_", v.CompanyId, "MONTH_", 2)] == 0 {
+			cellMonthQoQStr = "0%"
+		} else {
+			cellMonthQoQStr = fmt.Sprint(utils.SubFloatToString((mapMonthAmount[fmt.Sprint("CID_", v.CompanyId, "MONTH_", 1)]-mapMonthAmount[fmt.Sprint("CID_", v.CompanyId, "MONTH_", 2)])/mapMonthAmount[fmt.Sprint("CID_", v.CompanyId, "MONTH_", 2)]*100, 2)) + "%"
+			if (mapMonthAmount[fmt.Sprint("CID_", v.CompanyId, "MONTH_", 1)]-mapMonthAmount[fmt.Sprint("CID_", v.CompanyId, "MONTH_", 2)])/mapMonthAmount[fmt.Sprint("CID_", v.CompanyId, "MONTH_", 2)] <= -0.2 {
+				cellMonthQoQData.SetStyle(redStyle) //小于0.2做标红处理
+			} else {
+				cellMonthQoQData.SetStyle(style)
+			}
+		}
+		cellMonthQoQData.SetValue(cellMonthQoQStr)
+		for i := 0; i < months; i++ {
+			if i == 0 {
+				continue
+			}
+			cellMonthData := dataRow.AddCell()
+			cellMonthData.SetStyle(style)
+			cellMonthData.SetValue(mapMonthAmount[fmt.Sprint("CID_", v.CompanyId, "MONTH_", i)])
+		}
 
-		cellG := dataRow.AddCell()
-		cellG.SetStyle(style)
-		cellG.SetValue(v.PermissionName)
+		cellGData := dataRow.AddCell()
+		cellGData.SetStyle(style)
+		cellGData.SetValue(v.PermissionName)
 
 		for i := 0; i < weeks; i++ {
-			cellWei := dataRow.AddCell()
-			cellWei.SetStyle(style)
-			cellWei.SetValue(mapWeekAmount[fmt.Sprintf("CID_", v.CompanyId, "WEEK_", i)])
+			cellWeiData := dataRow.AddCell()
+			cellWeiData.SetStyle(style)
+			cellWeiData.SetValue(mapWeekAmount[fmt.Sprint("CID_", v.CompanyId, "WEEK_", i)])
 		}
 
 	}
@@ -889,6 +971,7 @@ func (this *RaiServeCoAntroller) CoverageRate() {
 // @Param   TagId   query   int  false       "标签ID"
 // @Param   ServeTypeId   int   int	  false       "服务类型ID"
 // @Param   WhatWeek   query   int  false       "哪一周 ,1:本周、2:上周、3:上上周、4上三周"
+// @Param   WhatMonth   query   int  false       "哪一月 ,1:本月、2:上月、3:上上月"
 // @Success 200 {object} cygx.RaiServeTagListResp
 // @router /rai_serve/bill_list [get]
 func (this *RaiServeCoAntroller) BillList() {
@@ -911,6 +994,7 @@ func (this *RaiServeCoAntroller) BillList() {
 	tagId, _ := this.GetInt("TagId")
 	serveTypeId, _ := this.GetInt("ServeTypeId")
 	whatWeek, _ := this.GetInt("WhatWeek")
+	whatMonth, _ := this.GetInt("WhatMonth")
 
 	var startSize int
 	if pageSize <= 0 {
@@ -943,6 +1027,14 @@ func (this *RaiServeCoAntroller) BillList() {
 		pars = append(pars, monday.Format(utils.FormatDate))
 	}
 
+	if whatMonth > 0 {
+		now := time.Now()
+		// 计算所选月份的第一天
+		monthday := time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, now.Location()).AddDate(0, -whatMonth+1, 0)
+		condition += " AND  month_start_date = ? "
+		pars = append(pars, monthday.Format(utils.FormatDate))
+	}
+
 	condition += " AND  company_id = ? "
 	pars = append(pars, companyId)
 	if serveTypeId > 0 {
@@ -983,6 +1075,13 @@ func (this *RaiServeCoAntroller) BillList() {
 				activitySpecialIds = append(activitySpecialIds, v.SourceId)
 			case utils.CYGX_OBJ_RS_CALENDAR:
 				rsCalendarIds = append(rsCalendarIds, v.SourceId)
+			case utils.CYGX_OBJ_ACTIVITYVIDEO:
+				activityIds = append(activityIds, v.ActivityId)
+			case utils.CYGX_OBJ_ACTIVITYVOICE:
+				activityIds = append(activityIds, v.ActivityId)
+			}
+			if v.ServeTypeName == "阅读uv" {
+				v.ServeTypeName = "报告阅读uv" //服务类型名称做一下,映射修改
 			}
 		}
 
@@ -1041,7 +1140,26 @@ func (this *RaiServeCoAntroller) BillList() {
 				} else {
 					v.Tag = strings.Join(mapRsCalendarLabel[v.SourceId], ",")
 				}
+			case utils.CYGX_OBJ_ACTIVITYVIDEO:
+				if v.ChartPermissionName == utils.GU_SHOU_NAME || v.ChartPermissionName == utils.CE_LUE_NAME {
+					v.Tag = v.ChartPermissionName
+				} else {
+					v.Tag = strings.Join(mapActivityIndustrialLabel[v.ActivityId], ",")
+					if len(mapActivitySubjectLabel[v.ActivityId]) > 0 {
+						v.Tag += "," + strings.Join(mapActivitySubjectLabel[v.ActivityId], ",")
+					}
+				}
+			case utils.CYGX_OBJ_ACTIVITYVOICE:
+				if v.ChartPermissionName == utils.GU_SHOU_NAME || v.ChartPermissionName == utils.CE_LUE_NAME {
+					v.Tag = v.ChartPermissionName
+				} else {
+					v.Tag = strings.Join(mapActivityIndustrialLabel[v.ActivityId], ",")
+					if len(mapActivitySubjectLabel[v.ActivityId]) > 0 {
+						v.Tag += "," + strings.Join(mapActivitySubjectLabel[v.ActivityId], ",")
+					}
+				}
 			}
+
 		}
 		resp.List = list
 	}

+ 13 - 0
controllers/cygx/report_article.go

@@ -494,6 +494,17 @@ func (this *IndustrialSubjectController) ReportArticleClassification() {
 		return
 	}
 
+	detailIndustryNameList, err := cygx.GetIndustrialManagemenDetailByAaticleID(reportInfo.ArticleId)
+	if err != nil {
+		br.Msg = "分类失败"
+		br.ErrMsg = "获取报告原有分类失败,Err:" + err.Error()
+		return
+	}
+	var industryId []string
+	for _, v := range detailIndustryNameList {
+		industryId = append(industryId, strconv.Itoa(v.IndustrialManagementId))
+	}
+
 	industrialStrList := strings.Split(industrialManagementIdStr, ",")
 	for _, v := range industrialStrList {
 		condition = `AND industrial_management_id = ` + v
@@ -503,6 +514,7 @@ func (this *IndustrialSubjectController) ReportArticleClassification() {
 			br.ErrMsg = "操作失败,产业不存在IndustrialManagementId:" + v
 			return
 		}
+		industryId = append(industryId, v)
 	}
 	if req.IndustrialSubjectIdStr != "0" && req.IndustrialSubjectIdStr != "" {
 		strList := strings.Split(req.IndustrialSubjectIdStr, ",")
@@ -525,6 +537,7 @@ func (this *IndustrialSubjectController) ReportArticleClassification() {
 	}
 
 	go cygxService.DoArticleOnenIdWxTemplateMsg(reportInfo.ArticleId, 2)
+	go cygxService.UpdateIndustrialsourceHzResourceDataById(industryId, "Hz") //修改相关产业关联的报告信息
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "分类成功"

+ 31 - 3
controllers/cygx/summary_manage.go

@@ -80,6 +80,17 @@ func (this *SummaryManage) PreserveAndPublish() {
 	articleId := req.ArticleId
 	articleTypeId := req.ArticleTypeId
 
+	detailIndustryNameList, err := cygx.GetIndustrialManagemenDetailByAaticleID(articleId)
+	if err != nil {
+		br.Msg = "分类失败"
+		br.ErrMsg = "获取报告原有分类失败,Err:" + err.Error()
+		return
+	}
+	var industryId []string
+	for _, v := range detailIndustryNameList {
+		industryId = append(industryId, strconv.Itoa(v.IndustrialManagementId))
+	}
+
 	// 产业ID校验
 	industryIds := make([]int, 0)
 	industrialManagementIdList := strings.Split(industrialManagementIds, ",")
@@ -91,6 +102,7 @@ func (this *SummaryManage) PreserveAndPublish() {
 			return
 		}
 		industryIds = append(industryIds, i)
+		industryId = append(industryId, v)
 	}
 	if industrialSubjectIds != "" {
 		industrialSubjectIdList := strings.Split(industrialSubjectIds, ",")
@@ -240,6 +252,9 @@ func (this *SummaryManage) PreserveAndPublish() {
 		br.Msg = "请选择研选行业"
 		return
 	}
+	//买方研选自定义
+	item.ChartPermissionId = 31
+	item.ChartPermissionName = utils.CHART_PERMISSION_NAME_MAI_FANG_YANXUAN
 	charInfo, err := cygx.GetCategoryInfoByName(utils.CHART_PERMISSION_NAME_MF_YANXUAN)
 	if err != nil {
 		br.Msg = "操作失败"
@@ -316,9 +331,10 @@ func (this *SummaryManage) PreserveAndPublish() {
 		go cygxService.UpdateIndustryLayoutTime(industryIds, false)       // 查研观向7.4-更新产业布局时间
 		go elastic.AddComprehensiveIndustrialSource("Yx", item.ArticleId) // 查研观向10.6 更新搜索引擎的产业资源包
 	}
-	go elastic.AddComprehensiveArticle(item.ArticleId)       // ES添加文章:报告、纪要
-	go cygxService.UpdateArticleResourceData(item.ArticleId) //写入首页最新  cygx_resource_data 表
-	go cygxService.MakeArticleMomentsImg(item.ArticleId)     //生成文章分享到朋友圈的图片
+	go elastic.AddComprehensiveArticle(item.ArticleId)                        // ES添加文章:报告、纪要
+	go cygxService.UpdateArticleResourceData(item.ArticleId)                  //写入首页最新  cygx_resource_data 表
+	go cygxService.MakeArticleMomentsImg(item.ArticleId)                      //生成文章分享到朋友圈的图片
+	go cygxService.UpdateIndustrialsourceHzResourceDataById(industryId, "Yx") //修改相关产业关联的报告信息
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"
@@ -408,6 +424,18 @@ func (this *SummaryManage) PublishAndCancel() {
 	}
 	go elastic.AddComprehensiveArticle(articleId)            // ES添加文章:报告、纪要
 	go cygxService.UpdateArticleResourceData(item.ArticleId) //写入首页最新  cygx_resource_data 表
+
+	detailIndustryNameList, err := cygx.GetIndustrialManagemenDetailByAaticleID(articleId)
+	if err != nil {
+		br.Msg = "分类失败"
+		br.ErrMsg = "获取报告原有分类失败,Err:" + err.Error()
+		return
+	}
+	var industryId []string
+	for _, v := range detailIndustryNameList {
+		industryId = append(industryId, strconv.Itoa(v.IndustrialManagementId))
+	}
+	go cygxService.UpdateIndustrialsourceHzResourceDataById(industryId, "Yx") //修改相关产业关联的报告信息
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"

+ 32 - 7
controllers/cygx/user.go

@@ -20,6 +20,7 @@ import (
 	"strconv"
 	"strings"
 	"time"
+	"unicode/utf8"
 )
 
 // 权益用户管理
@@ -204,9 +205,19 @@ func (this *UserController) List() {
 			condition += ` AND (a.company_name LIKE '%` + keyWord + `%' OR a.credit_code LIKE '%` + keyWord + `%' ) `
 		}
 	}
-	if label != "" {
-		usercondition += ` AND u.user_label LIKE '%` + label + `%'`
+
+	var joinTable string
+	var tableField string
+	var labelSort string
+	if label != "" && utf8.RuneCountInString(label) > 1 {
+		//usercondition += ` AND u.user_label LIKE '%` + label + `%'`
+		//usercondition += ` AND u.user_id IN ( SELECT user_id  FROM ` + utils.GetCygxDatabase() + `.wx_user_rai_label WHERE label LIKE '%` + label + `%'  AND create_time >= '` + time.Now().AddDate(0, -4, 0).Format(utils.FormatDate) + `' ) `
+		usercondition += ` AND l.label LIKE '%` + label + `%'  AND l.create_time >= '` + time.Now().AddDate(0, -4, 0).Format(utils.FormatDate) + `' `
+		joinTable = ` 	INNER JOIN ` + utils.GetCygxDatabase() + `.wx_user_rai_label as l ON  l.user_id = u.user_id   `
+		tableField = ` MAX(l.create_time) as max_create_time,   `
+		labelSort = `  max_create_time DESC ,   `
 	}
+
 	//
 	usercondition += ` AND cp.product_id = 2  	AND sr.product_id = 2  `
 
@@ -218,23 +229,23 @@ func (this *UserController) List() {
 		usercondition += ` AND u.cygx_subscribe = 1 `
 	}
 	condition += ` AND cp.product_id = 2  `
-	total, err := cygx.GetCompanyListCount(usercondition, keyWord, kwywordcondition, condition, roleTypeCode, pars)
+	total, err := cygx.GetCompanyListCount(joinTable, usercondition, keyWord, kwywordcondition, condition, roleTypeCode, pars)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据总数失败,Err:" + err.Error()
 		return
 	}
 	if sortType == "" {
-		sqlOrder = ` GROUP by u.user_id  ORDER BY c.created_time  DESC, u.register_time  DESC `
+		sqlOrder = ` GROUP by u.user_id  ORDER BY ` + labelSort + ` c.created_time  DESC, u.register_time  DESC `
 	} else {
 		if sortType == "asc" {
-			sqlOrder = ` GROUP by u.user_id  ORDER BY u.interaction_num  ASC , u.register_time  DESC `
+			sqlOrder = ` GROUP by u.user_id  ORDER BY  u.interaction_num  ASC ,` + labelSort + ` u.register_time  DESC `
 		} else {
-			sqlOrder = ` GROUP by u.user_id  ORDER BY u.interaction_num  DESC , u.register_time  DESC  `
+			sqlOrder = ` GROUP by u.user_id  ORDER BY u.interaction_num  DESC , ` + labelSort + `  u.register_time  DESC  `
 		}
 	}
 
-	list, err := cygx.GetCygxCompanyUserList(usercondition, keyWord, kwywordcondition, condition, roleTypeCode, sqlOrder, parsUser, startSize, pageSize)
+	list, err := cygx.GetCygxCompanyUserList(joinTable, tableField, usercondition, keyWord, kwywordcondition, condition, roleTypeCode, sqlOrder, parsUser, startSize, pageSize)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
@@ -316,6 +327,7 @@ func (this *UserController) List() {
 		UserRemindListMap := cygxService.GetCygxUserRemindListMap(userIdArr)
 		mapIsUserMaker := cygxService.GetCompanyProductIsUserMakerByCompanyIds(companyIds) //根据公司ID获取近四周之内有决策人互动的客户
 		userHaveMoveMap := services.GetWxUserHaveMoveMap(mobilesSlice)                     // 处理用户是否移动过按钮回显
+		userLabelMap := cygxService.GetUserLabelByUserIdArr(userIdArr)                     // 根据多个userId 获取每个UserId最新的十条数据
 
 		for k, v := range list {
 			for _, vsplit := range splitList {
@@ -343,6 +355,11 @@ func (this *UserController) List() {
 			if v.Mobile != "" {
 				v.HaveMoveButton = userHaveMoveMap[v.Mobile]
 			}
+			if len(userLabelMap[int(v.UserId)]) == 0 {
+				list[k].RaiLabelList = make([]*cygx.WxUserRaiLabelListResp, 0)
+			} else {
+				list[k].RaiLabelList = userLabelMap[int(v.UserId)]
+			}
 		}
 		for k := range list {
 			list[k].InteractionNum = list[k].HistoryNum + list[k].CountNum + list[k].IndustryFllowNum + list[k].DepartmentFollowNum + list[k].KeyWordNum + list[k].OnLineNum + list[k].OfficeNum + list[k].ChartNum + list[k].TripNum + list[k].RoadshowVideoNum + list[k].ActivityVideoNum + list[k].ActivityVoiceNum + list[k].YanxuanspecialNum
@@ -5831,6 +5848,10 @@ func exportListRsCalendar(this *UserController, list []*cygx.UserInteraction, ex
 	cellF.SetStyle(style)
 	cellF.SetValue("路演形式")
 
+	cellThem := titleRow.AddCell()
+	cellThem.SetStyle(style)
+	cellThem.SetValue("路演主题")
+
 	cellG := titleRow.AddCell()
 	cellG.SetStyle(style)
 	cellG.SetValue("主题标签")
@@ -5871,6 +5892,10 @@ func exportListRsCalendar(this *UserController, list []*cygx.UserInteraction, ex
 			cellFData.Value = "线下"
 		}
 
+		cellThemData := dataRow.AddCell()
+		cellThemData.SetStyle(style)
+		cellThemData.Value = v.RoadShowTheme
+
 		cellGData := dataRow.AddCell()
 		cellGData.SetStyle(style)
 		cellGData.Value = v.LabelKeyWord

+ 364 - 0
controllers/cygx/user_rai_label.go

@@ -0,0 +1,364 @@
+package cygx
+
+import (
+	"encoding/json"
+	"hongze/hz_crm_api/controllers"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/models/roadshow"
+	cygxService "hongze/hz_crm_api/services/cygx"
+	"hongze/hz_crm_api/utils"
+	"strconv"
+	"time"
+)
+
+// 权益用户标签
+type UserRaiLabelController struct {
+	controllers.BaseAuthController
+}
+
+// @Title 销售输入标签
+// @Description 销售输入标签接口
+// @Param	request	body cygx.WxUserRaiLabelAddReq true "type json string"
+// @Success 200 {object} "保存成功"
+// @router /use_rai_label/add [post]
+func (this *UserRaiLabelController) Add() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	AdminUser := this.SysUser
+	if AdminUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req cygx.WxUserRaiLabelAddReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	userId := req.UserId
+	label := req.Label
+	wxUser, err := models.GetWxUserItemByUserId(userId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败, GetWxUserItemByUserId  Err:" + err.Error()
+		return
+	}
+	item := new(cygx.WxUserRaiLabel)
+	item.UserId = wxUser.UserId
+	item.RealName = wxUser.RealName
+	item.Mobile = wxUser.Mobile
+	item.Email = wxUser.Email
+	item.CompanyId = wxUser.CompanyId
+	item.CompanyName = wxUser.CompanyName
+	item.Label = label
+	item.SysUserId = AdminUser.AdminId
+	item.SysUserRealName = AdminUser.RealName
+	item.SourceType = 6
+	item.CreateTime = time.Now()
+	item.ModifyTime = time.Now()
+	err = cygx.AddWxUserRaiLabel(item)
+	if err != nil {
+		br.Msg = "保存失败"
+		br.ErrMsg = "保存失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.IsAddLog = true
+	br.Msg = "操作成功"
+}
+
+// @Title 删除销售输入标签
+// @Description 删除销售输入标签接口
+// @Param	request	body cygx.WxUserRaiLabelAddReq true "type json string"
+// @Success 200 {object} "保存成功"
+// @router /use_rai_label/delte [post]
+func (this *UserRaiLabelController) Delte() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	AdminUser := this.SysUser
+	if AdminUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req cygx.WxUserRaiLabelIdReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	raiLabelId := req.RaiLabelId
+	err = cygx.DeleteWxUserRaiLabel(raiLabelId)
+	if err != nil {
+		br.Msg = "删除失败"
+		br.ErrMsg = "删除失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.IsAddLog = true
+	br.Msg = "操作成功"
+}
+
+// @Title  标签详情
+// @Description 获取标签详情接口
+// @Param   RaiLabelId   query   int  true       "标签ID"
+// @Success Ret=200 {object} cygx.ActivityDetail
+// @router /use_rai_label/detail [get]
+func (this *UserRaiLabelController) Detail() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	AdminUser := this.SysUser
+	if AdminUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	raiLabelId, _ := this.GetInt("RaiLabelId")
+	detail, err := cygx.GetWxUserRaiLabelDetailById(raiLabelId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,标签不存在Err:" + err.Error() + "RaiLabelId:" + strconv.Itoa(raiLabelId)
+		return
+	}
+	resp := new(cygx.WxUserRaiLabelDetailResp)
+	sourceType := detail.SourceType
+	sourceId := detail.SourceId
+	//来源1:搜索关键字标签、2:产业/个股标签(线下活动)、3:产业/个股标签(线下路演)、4:产业/个股标签(线上活动)、5:产业/个股标签(线上路演)、6:销售输入标签、7:产业/个股标签(报告)、8:报告类型标签
+	switch sourceType {
+	case 1:
+		item := new(cygx.WxUserRaiLabelKeyWordResp)
+		item.Label = detail.Label
+		item.CreateTime = detail.CreateTime.Format(utils.FormatDateTime)
+		resp.KeyWord = item
+	case 2, 4:
+		item := new(cygx.WxUserRaiLabelActivityResp)
+		activityInfo, errInfo := cygx.GetAddActivityInfoById(sourceId)
+		if activityInfo == nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = "活动ID错误,不存在activityId:" + strconv.Itoa(sourceId)
+			return
+		}
+		if errInfo != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = "操作失败,Err:" + errInfo.Error()
+			return
+		}
+		activitySignupDetai, _ := cygx.GetCygxActivitySignupDetailDetailLast(sourceId, detail.Mobile)
+		item.ActivityName = activityInfo.ActivityName
+		item.ActivityTypeName = activityInfo.ActivityTypeName
+		item.ActivityTime = activityInfo.ActivityTime
+		if activitySignupDetai != nil {
+			item.Duration = activitySignupDetai.Duration
+		}
+		item.Label = detail.Label
+		resp.Activity = item
+	case 3, 5:
+		item := new(cygx.WxUserRaiLabelRoadShowResp)
+		rsCalendarMeetingUserItem, err := roadshow.GetRsCalendarMeetingUserFirst(sourceId)
+		if err != nil {
+			br.Msg = "获取数据失败!"
+			br.ErrMsg = "获取数据失败!GetRsCalendarMeetingUserFirst:" + err.Error()
+			return
+		}
+		if rsCalendarMeetingUserItem == nil {
+			br.Msg = "获取数据失败!"
+			br.ErrMsg = "获取数据失败!GetRsCalendarMeetingUserFirst:" + err.Error()
+			return
+		}
+		rsCalendarResearcherList, tmpErr := roadshow.GetRsCalendarResearcherListByRsCalendarId(sourceId)
+		if tmpErr != nil {
+			br.Msg = "获取数据失败!"
+			br.ErrMsg = "获取数据失败!GetRsCalendarResearcherListByRsCalendarId:" + tmpErr.Error()
+			return
+		}
+		for _, v := range rsCalendarResearcherList {
+			item.ResearcherName = v.ResearcherName
+			item.RoadShowTime = v.StartDate + " " + v.StartTime
+		}
+		item.Theme = rsCalendarMeetingUserItem.RoadShowTheme
+		item.Label = detail.Label
+		resp.RoadShow = item
+	case 6:
+		item := new(cygx.WxUserRaiLabelSellerResp)
+		item.Label = detail.Label
+		item.SysUserRealName = detail.SysUserRealName
+		item.CreateTime = detail.CreateTime.Format(utils.FormatDateTime)
+		resp.Seller = item
+	case 7, 8:
+		item := new(cygx.WxUserRaiLabelArticleResp)
+		switch detail.TableName {
+		case "cygx_article":
+			//文章
+			detailArticle, err := cygx.GetArticleIdInfoByArticleId(sourceId)
+			if err != nil {
+				br.Msg = "内容不存在"
+				br.ErrMsg = "操作失败,Err:" + err.Error()
+				return
+			}
+			historyDetail := new(cygx.CygxArticleHistoryRecordAll)
+			if detail.Mobile != "" {
+				historyDetail, err = cygx.GetCygxArticleHistoryRecordAllDetailLastByMobile(sourceId, detail.Mobile)
+			} else {
+				historyDetail, err = cygx.GetCygxArticleHistoryRecordAllDetailLast(sourceId, detail.UserId)
+			}
+
+			item.Title = detailArticle.Title
+			item.PublishDate = detailArticle.PublishDate.Format(utils.FormatDateTime)
+			item.CreateTime = detail.CreateTime.Format(utils.FormatDateTime)
+			item.SourceText = cygxService.GetArticleSourcePlatformText(historyDetail.RegisterPlatform)
+			item.StopTime = strconv.Itoa(historyDetail.StopTime)
+
+		case "cygx_report_selection":
+			//报告精选
+			detailReportSelection, err := cygx.GetCygxReportSelectionInfoById(sourceId)
+			if err != nil {
+				br.Msg = "内容不存在"
+				br.ErrMsg = "操作失败,Err:" + err.Error()
+				return
+			}
+			historyDetail, err := cygx.GetCygxReportHistoryRecordDetailLast(sourceId, detail.Mobile, "bgjx")
+			if err != nil {
+				br.Msg = "内容不存在"
+				br.ErrMsg = "操作失败,Err:" + err.Error()
+				return
+			}
+			item.Title = detailReportSelection.Title
+			item.PublishDate = detailReportSelection.PublishDate
+			item.CreateTime = detail.CreateTime.Format(utils.FormatDateTime)
+			item.SourceText = cygxService.GetArticleSourcePlatformText(historyDetail.RegisterPlatform)
+			item.StopTime = strconv.Itoa(historyDetail.StopTime)
+
+		case "cygx_research_summary":
+			//本周研究汇总
+			detailResearchSummary, err := cygx.GetCygxResearchSummaryInfoById(sourceId)
+			if err != nil {
+				br.Msg = "内容不存在"
+				br.ErrMsg = "操作失败,Err:" + err.Error()
+				return
+			}
+			historyDetail, err := cygx.GetCygxReportHistoryRecordDetailLast(sourceId, detail.Mobile, "bzyjhz")
+			if err != nil {
+				br.Msg = "内容不存在"
+				br.ErrMsg = "操作失败,Err:" + err.Error()
+				return
+			}
+			item.Title = detailResearchSummary.Title
+			item.PublishDate = detailResearchSummary.PublishDate
+			item.CreateTime = detail.CreateTime.Format(utils.FormatDateTime)
+			item.SourceText = cygxService.GetArticleSourcePlatformText(historyDetail.RegisterPlatform)
+			item.StopTime = strconv.Itoa(historyDetail.StopTime)
+		}
+
+		item.Label = detail.Label
+		resp.Article = item
+
+	case 9:
+		item := new(cygx.WxUserRaiLabelActivityVivoResp)
+		activityInfo, err := cygx.GetAddActivityInfoById(sourceId)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取信息失败,GetAddActivityInfoById Err:" + err.Error()
+			return
+		}
+		var title string
+		totalVoice, err := cygx.GetCygxActivityVoiceCountByActivityId(sourceId)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取信息失败, GetCygxActivityVoiceCountByActivityId :" + err.Error()
+			return
+		}
+		if totalVoice > 0 {
+			voiceDetail, err := cygx.GetCygxActivityVoiceReqDetail(sourceId)
+			if err != nil {
+				br.Msg = "获取信息失败"
+				br.ErrMsg = "获取信息失败, GetCygxActivityVoiceReqDetail :" + err.Error()
+				return
+			}
+			title = voiceDetail.VoiceName
+		} else {
+			totalVideo, err := cygx.GetActivityVideoCountByActivityId(sourceId)
+			if err != nil {
+				br.Msg = "获取信息失败"
+				br.ErrMsg = "获取信息失败, GetActivityVideoCountByActivityId :" + err.Error()
+				return
+			}
+
+			if totalVideo > 0 {
+				videoDetail, err := cygx.GetCygxActivityVideoReqDetail(sourceId)
+				if err != nil {
+					br.Msg = "获取信息失败"
+					br.ErrMsg = "GetCygxActivityVideoReqDetail,Err:" + err.Error() + "activityId:" + strconv.Itoa(sourceId)
+					return
+				}
+				title = videoDetail.VideoName
+			}
+		}
+
+		item.Title = title
+		item.ActivityTime = activityInfo.ActivityTime
+		item.Label = detail.Label
+		item.CreateTime = detail.CreateTime.Format(utils.FormatDateTime)
+		resp.ActivityVivo = item
+	}
+
+	resp.SourceType = detail.SourceType
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title  标签详情
+// @Description 获取标签详情接口
+// @Param   UserId   query   int  true       "用户ID"
+// @Success Ret=200 {object} cygx.ActivityDetail
+// @router /use_rai_label/list [get]
+func (this *UserRaiLabelController) List() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	AdminUser := this.SysUser
+	if AdminUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	userId, _ := this.GetInt("UserId")
+
+	resp := new(cygx.WxUserRaiLabelList)
+	list, err := cygx.GetWxUserRaiLabelListByUserId(userId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error() + "userId:" + strconv.Itoa(userId)
+		return
+	}
+	if len(list) == 0 {
+		list = make([]*cygx.WxUserRaiLabelListResp, 0)
+	}
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 100 - 32
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 = "参数解析异常!"
@@ -72,8 +74,19 @@ func (this *CalendarController) Add() {
 	researcherMap := make(map[int]string)
 	var checkIsAdd []string
 
+	var companyStatus string // 海外客户记录当时客户状态
+	if req.EnglishCompany == 1 {
+		englishCompany, err := models.GetEnglishCompanyById(req.CompanyId)
+		if err != nil {
+			br.Msg = "客户已被删除, 请刷新页面"
+			br.ErrMsg = "获取失败,GetEnglishCompanyById Err: " + err.Error()
+			return
+		}
+		companyStatus = englishCompany.OverseasStatus
+	}
+
 	//获取所有自定义的权益研究员
-	sysUserList, err := cygx.GetAskEmailList()
+	sysUserList, err := cygx.GetAskEmailListResearcher()
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,GetAskEmailList Err: " + err.Error()
@@ -84,17 +97,6 @@ func (this *CalendarController) Add() {
 		raiAskadminMap[v.AdminId] = true
 	}
 
-	sysUserFwang, e := system.GetSysUserByAdminName("fwang") // 手动拼接王芳到权益的策略行业下 start
-	if e != nil {
-		if e.Error() == utils.ErrNoRow() {
-			br.Msg = "用户不存在, 请检查"
-			return
-		}
-		br.Msg = "账号错误, 请重新输入"
-		br.ErrMsg = "fwang 用户名获取用户失败, Err: " + e.Error()
-		return
-	}
-	raiAskadminMap[sysUserFwang.AdminId] = true // 手动拼接王芳到权益的策略行业下 end
 	//var tipMsg string
 	for _, v := range req.ResearcherList {
 		if v.ResearcherId <= 0 {
@@ -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)
@@ -239,6 +258,7 @@ func (this *CalendarController) Add() {
 	rsCalendar.ActivityCategory = req.ActivityCategory
 	rsCalendar.Source = 0
 	rsCalendar.EnglishCompany = req.EnglishCompany
+	rsCalendar.CompanyStatus = companyStatus //海外客户记录当时客户状态
 	rsCalendar.Title = getTitle(req.ActivityType, req.RoadshowType, req.ActivityCategory, req.RoadshowPlatform, req.Province, req.City)
 	if productItemRai != nil {
 		rsCalendar.SellerId = productItemRai.SellerId
@@ -334,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
 }
@@ -378,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 = "参数解析异常!"
@@ -626,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) {
@@ -636,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)
@@ -661,7 +704,7 @@ func (this *CalendarController) Edit() {
 	for _, ev := range existList {
 		existResearcherMap[ev.ResearcherId] = ev.ResearcherName
 	}
-	sysUserList, err := cygx.GetAskEmailList()
+	sysUserList, err := cygx.GetAskEmailListResearcher()
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,GetAskEmailList Err: " + err.Error()
@@ -874,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)
@@ -1050,6 +1097,7 @@ func (this *CalendarController) Edit() {
 	//}
 	br.Ret = 200
 	br.Success = true
+	br.Data = resp
 	br.Msg = "保存成功"
 	br.IsAddLog = true
 }
@@ -1109,7 +1157,7 @@ func (this *CalendarController) ResearcherList() {
 	for _, v := range sysUserList {
 		adminMap[v.AdminId] = v
 	}
-	askUserList, err := cygx.GetAskEmailList()
+	askUserList, err := cygx.GetAskEmailListResearcher()
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,GetAskEmailList Err: " + err.Error()
@@ -1127,24 +1175,6 @@ func (this *CalendarController) ResearcherList() {
 		mapPermissionId[v.PermissionName] = v.ChartPermissionId
 	}
 
-	sysUserFwang, e := system.GetSysUserByAdminName("fwang") // 手动拼接王芳到权益的策略行业下 start
-	if e != nil {
-		if e.Error() == utils.ErrNoRow() {
-			br.Msg = "用户不存在, 请检查"
-			return
-		}
-		br.Msg = "账号错误, 请重新输入"
-		br.ErrMsg = "fwang 用户名获取用户失败, Err: " + e.Error()
-		return
-	}
-	itemFwang := new(roadshow.ResearcherGroup)
-	itemFwang.AdminId = sysUserFwang.AdminId
-	itemFwang.GroupId = sysUserFwang.GroupId
-	itemFwang.GroupName = sysUserFwang.GroupName
-	itemFwang.RealName = sysUserFwang.RealName
-	itemFwang.RoleTypeCode = sysUserFwang.RoleTypeCode
-	mapPermissionUser["策略"] = append(mapPermissionUser["策略"], itemFwang) // 手动拼接王芳到权益的策略行业下 end
-
 	for _, v := range askUserList {
 		if admin, ok := adminMap[v.AdminId]; ok {
 			item := &roadshow.ResearcherGroup{
@@ -1187,6 +1217,10 @@ func (this *CalendarController) ResearcherList() {
 // @Param   PageSize   query   int  true       "每页数据条数"
 // @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
 // @Param   CalendarType   query   int  true       "1:待处理申请,2:已处理申请,3:内部会议,4:报告电话会"
+// @Param   Status   query   int  true       "1:待接受,2:已接受,3:已拒绝,4:已删除,5:已撤回,6:已结束"
+// @Param   StartDate   query   string  true       "开始日期"
+// @Param   EndDate   query   string  true       "结束日期"
+// @Param   Keyword			query	string	false	"关键词: 客户名称/社会信用码"
 // @Success 200 {object} roadshow.CalendarListResp
 // @router /calendar/list [get]
 func (this *CalendarController) CalendarList() {
@@ -1209,6 +1243,11 @@ func (this *CalendarController) CalendarList() {
 	pageSize, _ := this.GetInt("PageSize")
 	currentIndex, _ := this.GetInt("CurrentIndex")
 
+	status, _ := this.GetInt("Status")
+	startDate := this.GetString("StartDate")
+	endDate := this.GetString("EndDate")
+	keyword := this.GetString("Keyword")
+
 	var total int
 	page := paging.GetPaging(currentIndex, pageSize, total)
 
@@ -1285,6 +1324,29 @@ func (this *CalendarController) CalendarList() {
 		br.ErrMsg = "参数错误,calendarType:" + strconv.Itoa(calendarType)
 		return
 	}
+
+	if status > 0 {
+		condition += ` AND b.status = ?`
+		pars = append(pars, status)
+	}
+
+	if startDate != "" {
+		condition += ` AND b.start_date >= ?`
+		pars = append(pars, startDate)
+	}
+
+	if endDate != "" {
+		condition += ` AND b.start_date <= ?`
+		pars = append(pars, endDate)
+	}
+
+	keyword = strings.TrimSpace(keyword)
+	if keyword != "" {
+		kw := fmt.Sprint("%", keyword, "%")
+		condition += ` AND a.company_name LIKE ? `
+		pars = append(pars, kw)
+	}
+
 	fmt.Println(condition)
 	resp := new(roadshow.CalendarListResp)
 	total, err := roadshow.GetCalendarListCount(condition, pars, calendarType)
@@ -1867,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 = "删除成功"

+ 19 - 0
controllers/roadshow/calendar_meeting_user.go

@@ -7,6 +7,7 @@ import (
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/cygx"
 	"hongze/hz_crm_api/models/roadshow"
+	cygxService "hongze/hz_crm_api/services/cygx"
 	"hongze/hz_crm_api/utils"
 	"strconv"
 	"strings"
@@ -115,6 +116,10 @@ func (this *CalendarMeetingUserController) Add() {
 		br.ErrMsg = "操作失败-MultiAddRsCalendarMeetingUser!Err:" + err.Error()
 		return
 	}
+
+	for _, v := range items {
+		cygxService.RoadShowWxUserRaiLabelRedisAdd(rsCalendarId, v.UserId, v.CreateTime) //添加用户参加路演标签到Redis
+	}
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "添加成功"
@@ -268,6 +273,20 @@ func (this *CalendarMeetingUserController) Delete() {
 	}
 
 	rsCalendarMeetingUserId := req.RsCalendarMeetingUserId
+
+	//rsCalendarMeetingUserItem, err := roadshow.GetRsCalendarMeetingUserByRsCalendarMeetingUserId(rsCalendarMeetingUserId)
+	//if err != nil {
+	//	br.Msg = "获取数据失败!"
+	//	br.ErrMsg = "获取数据失败!GetRsCalendarMeetingUserFirst:" + err.Error()
+	//	return
+	//}
+	//err = cygx.DeleteWxUserRaiLabelWithRoadshow(rsCalendarMeetingUserItem.UserId, rsCalendarMeetingUserItem.RsCalendarId) // 路演到会删除后,删除对应的标签
+	//if err != nil {
+	//	br.Msg = "删除失败!"
+	//	br.ErrMsg = "删除失败-DeleteWxUserRaiLabelWithRoadshow!Err:" + err.Error()
+	//	return
+	//}
+
 	err = roadshow.DeleteRsCalendarMeetingUser(rsCalendarMeetingUserId)
 	if err != nil {
 		br.Msg = "删除失败!"

+ 416 - 0
controllers/roadshow/calendar_researcher_question.go

@@ -0,0 +1,416 @@
+package roadshow
+
+import (
+	"encoding/json"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"github.com/tealeg/xlsx"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/roadshow"
+	"hongze/hz_crm_api/utils"
+	"os"
+	"path/filepath"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// @Title 路演客户问答保存接口
+// @Description 路演客户问答保存接口
+// @Param	request	body roadshow.RoadShowQuestionSaveReq true "type json string"
+// @Success Ret=200 保存成功
+// @router /question/save [post]
+func (this *CalendarController) QuestionAdd() {
+	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
+	}
+
+	deleteCache := true
+	cacheKey := "CACHE_RS_ACTIVITY_QUESTION_SAVE_" + strconv.Itoa(sysUser.AdminId)
+	defer func() {
+		if deleteCache {
+			utils.Rc.Delete(cacheKey)
+		}
+	}()
+	if !utils.Rc.SetNX(cacheKey, 1, 5*time.Second) {
+		deleteCache = false
+		br.Msg = "系统处理中,请稍后重试!"
+		br.ErrMsg = "系统处理中,请稍后重试!" + sysUser.RealName + ";data:" + string(this.Ctx.Input.RequestBody)
+		return
+	}
+	var req roadshow.RoadShowQuestionSaveReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if req.RsCalendarId <= 0 || req.RsCalendarResearcherId <= 0 {
+		br.Msg = "参数错误!"
+		return
+	}
+
+	calendarResearcherItem, err := roadshow.GetRsCalendarResearcherById(req.RsCalendarResearcherId)
+	if err != nil {
+		br.Msg = "获取路演记录失败!"
+		br.ErrMsg = "获取路演记录失败,Err:" + err.Error()
+		return
+	}
+
+	if calendarResearcherItem.QuestionStatus == 1 {
+		br.Msg = "问答已填写,不可重复提交!"
+		return
+	}
+
+	err = roadshow.RoadShowQuestionSave(&req)
+	if err != nil {
+		br.Msg = "保存失败!"
+		br.ErrMsg = "保存失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "保存成功"
+	br.IsAddLog = true
+}
+
+// ResearcherList
+// @Title 获取路演客户问答信息接口
+// @Description 获取路演客户问答信息接口
+// @Param   RsCalendarId   query   int  true       "路演日历ID"
+// @Param   RsCalendarResearcherId   query   int  true       "路演研究员记录ID"
+// @Success 200 {object} roadshow.ResearcherGroup
+// @router /question/list [get]
+func (this *CalendarController) QuestionList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	rsCalendarId, _ := this.GetInt("RsCalendarId")
+
+	rsCalendarResearcherId, _ := this.GetInt("RsCalendarResearcherId")
+	if rsCalendarResearcherId <= 0 && rsCalendarId <= 0 {
+		br.Msg = "参数错误!"
+		return
+	}
+
+	var condition string
+	var pars []interface{}
+
+	if rsCalendarId > 0 {
+		condition += ` AND a.rs_calendar_id = ? `
+		pars = append(pars, rsCalendarId)
+	}
+
+	if rsCalendarResearcherId > 0 {
+		condition += ` AND a.rs_calendar_researcher_id = ? `
+		pars = append(pars, rsCalendarResearcherId)
+	}
+
+	list, err := roadshow.GetRoadShowQuestionList(condition, pars)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取失败!"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = list
+}
+
+// @Title 获取客户路演问题汇总
+// @Description 获取客户路演问题汇总
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   StartDate   query   string  true       "开始日期"
+// @Param   EndDate   query   string  true       "结束日期"
+// @Param   ResearcherId   query   string  true       "研究员id"
+// @Param   CompanyId   query   int  true       "客户ID"
+// @Param   CompanyIndustry			query	string	false	"客户行业"
+// @Param   CompanyClassify			query	string	false	"客户分类"
+// @Param   Keyword			query	string	false	"关键词: 客户名称/社会信用码"
+// @Success 200 {object} roadshow.QuestionSummaryListResp
+// @router /question/summary/list [get]
+func (this *CalendarController) CalendarSummaryList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	startDate := this.GetString("StartDate")
+	endDate := this.GetString("EndDate")
+	researcherId := this.GetString("ResearcherId")
+	companyIndustry := this.GetString("CompanyIndustry")
+	companyClassify := this.GetString("CompanyClassify")
+	keyword := this.GetString("Keyword")
+
+	var total int
+	page := paging.GetPaging(currentIndex, pageSize, total)
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize10
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	var condition string
+	var pars []interface{}
+
+	condition += ` AND b.question_status = 1 `
+
+	if startDate != "" {
+		condition += ` AND b.start_date >= ?`
+		pars = append(pars, startDate)
+	}
+
+	if endDate != "" {
+		condition += ` AND b.start_date <= ?`
+		pars = append(pars, endDate)
+	}
+
+	if researcherId != "" {
+		condition += ` AND b.researcher_id IN(` + researcherId + `)`
+	}
+
+	if companyIndustry != "" {
+		condition += ` AND b.company_industry = ?`
+		pars = append(pars, companyIndustry)
+	}
+
+	if companyClassify != "" {
+		condition += ` AND b.company_classify = ?`
+		pars = append(pars, companyClassify)
+	}
+
+	keyword = strings.TrimSpace(keyword)
+	if keyword != "" {
+		kw := fmt.Sprint("%", keyword, "%")
+		condition += ` AND a.company_name LIKE ? `
+		pars = append(pars, kw)
+	}
+
+	total, err := roadshow.GetQuestionSummaryListCount(condition, pars)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取数据总数失败,GetQuestionSummaryListCount,Err:" + err.Error()
+		return
+	}
+
+	dataList, err := roadshow.GetQuestionSummaryList(condition, pars, startSize, pageSize)
+	if err != nil {
+		br.Msg = "获取指标信息失败"
+		br.ErrMsg = "获取数据失败,GetQuestionSummaryList,Err:" + err.Error()
+		return
+	}
+
+	page = paging.GetPaging(currentIndex, pageSize, total)
+
+	resp := new(roadshow.QuestionSummaryListResp)
+
+	resp.Paging = page
+	resp.List = dataList
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 导出客户路演问题汇总
+// @Description 导出客户路演问题汇总
+// @Param   StartDate   query   string  true       "开始日期"
+// @Param   EndDate   query   string  true       "结束日期"
+// @Param   ResearcherId   query   string  true       "研究员id"
+// @Param   CompanyId   query   int  true       "客户ID"
+// @Param   CompanyIndustry			query	string	false	"客户行业"
+// @Param   CompanyClassify			query	string	false	"客户分类"
+// @Param   Keyword			query	string	false	"关键词: 客户名称/社会信用码"
+// @Success 200 {object} roadshow.QuestionSummaryListResp
+// @router /question/summary/export [get]
+func (this *CalendarController) CalendarSummaryExport() {
+	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
+	}
+
+	startDate := this.GetString("StartDate")
+	endDate := this.GetString("EndDate")
+	researcherId := this.GetString("ResearcherId")
+	companyIndustry := this.GetString("CompanyIndustry")
+	companyClassify := this.GetString("CompanyClassify")
+	keyword := this.GetString("Keyword")
+
+	var condition string
+	var pars []interface{}
+
+	condition += ` AND b.question_status = 1 `
+
+	if startDate != "" {
+		condition += ` AND b.start_date >= ?`
+		pars = append(pars, startDate)
+	}
+
+	if endDate != "" {
+		condition += ` AND b.start_date <= ?`
+		pars = append(pars, endDate)
+	}
+
+	if researcherId != "" {
+		condition += ` AND b.researcher_id IN(` + researcherId + `)`
+	}
+
+	if companyIndustry != "" {
+		condition += ` AND b.company_industry = ?`
+		pars = append(pars, companyIndustry)
+	}
+
+	if companyClassify != "" {
+		condition += ` AND b.company_classify = ?`
+		pars = append(pars, companyClassify)
+	}
+
+	keyword = strings.TrimSpace(keyword)
+	if keyword != "" {
+		kw := fmt.Sprint("%", keyword, "%")
+		condition += ` AND a.company_name LIKE ? `
+		pars = append(pars, kw)
+	}
+
+	dataList, err := roadshow.GetQuestionSummaryExport(condition, pars)
+	if err != nil {
+		br.Msg = "获取指标信息失败"
+		br.ErrMsg = "获取数据失败,GetQuestionSummaryList,Err:" + err.Error()
+		return
+	}
+
+	var rsCalendarIdArr []string
+
+	for _, v := range dataList {
+		rsCalendarIdArr = append(rsCalendarIdArr, strconv.Itoa(v.RsCalendarId))
+	}
+
+	questionMap := make(map[int][]*roadshow.RsCalendarResearcherQuestionView)
+	var questionMax int
+
+	if len(rsCalendarIdArr) > 0 {
+		var questionCondition string
+		var questionPars []interface{}
+
+		condition += ` AND a.rs_calendar_id IN (` + strings.Join(rsCalendarIdArr, ",") + `) `
+
+		questionList, err := roadshow.GetRoadShowQuestionList(questionCondition, questionPars)
+		if err != nil {
+			br.Msg = "获取指标信息失败"
+			br.ErrMsg = "获取数据失败,GetRoadShowQuestionList,Err:" + err.Error()
+			return
+		}
+
+		for _, qv := range questionList {
+			if items, ok := questionMap[qv.RsCalendarId]; ok {
+				items = append(items, qv)
+				questionMap[qv.RsCalendarId] = items
+
+				if len(items) > questionMax {
+					questionMax = len(items)
+				}
+			} else {
+				items = make([]*roadshow.RsCalendarResearcherQuestionView, 0)
+				items = append(items, qv)
+				questionMap[qv.RsCalendarId] = items
+				if len(items) > questionMax {
+					questionMax = len(items)
+				}
+			}
+		}
+	}
+
+	dir, _ := os.Executable()
+	exPath := filepath.Dir(dir)
+	downloadPath := exPath + "/" + time.Now().Format(utils.FormatDateUnSpace) + "客户路演汇总" + ".xlsx"
+	xlsxFile := xlsx.NewFile()
+	sheet, e := xlsxFile.AddSheet("客户路演汇总")
+	if e != nil {
+		br.Msg = "新增Sheet失败"
+		br.ErrMsg = "新增Sheet失败, Err: " + e.Error()
+		return
+	}
+
+	titleRow := sheet.AddRow()
+	titleRow.AddCell().SetString("路演时间")
+	titleRow.AddCell().SetString("客户名称")
+	titleRow.AddCell().SetString("发起人")
+	titleRow.AddCell().SetString("研究员")
+	titleRow.AddCell().SetString("客户行业")
+	titleRow.AddCell().SetString("客户分类")
+
+	for i := 1; i <= questionMax; i++ {
+		titleRow.AddCell().SetString("Q" + strconv.Itoa(i))
+		titleRow.AddCell().SetString("A" + strconv.Itoa(i))
+	}
+
+	for _, v := range dataList {
+		dataRow := sheet.AddRow()
+		dataRow.AddCell().SetString(v.StartDate + " " + v.StartTime)
+		dataRow.AddCell().SetString(v.CompanyName)
+		dataRow.AddCell().SetString(v.SysUserRealName)
+		dataRow.AddCell().SetString(v.ResearcherName)
+		dataRow.AddCell().SetString(v.CompanyIndustry)
+		dataRow.AddCell().SetString(v.CompanyClassify)
+		questionList := questionMap[v.RsCalendarId]
+		for _, qv := range questionList {
+			dataRow.AddCell().SetString(qv.QuestionContent)
+			dataRow.AddCell().SetString(qv.ReplyContent)
+		}
+	}
+
+	if e = xlsxFile.Save(downloadPath); e != nil {
+		br.Msg = "导出失败"
+		br.ErrMsg = "保存文件失败"
+		return
+	}
+	fileName := time.Now().Format(utils.FormatDateUnSpace) + "客户路演汇总" + ".xlsx"
+	this.Ctx.Output.Download(downloadPath, fileName)
+	defer func() {
+		_ = os.Remove(downloadPath)
+	}()
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}

+ 301 - 12
controllers/roadshow/company.go

@@ -1,12 +1,16 @@
 package roadshow
 
 import (
+	"fmt"
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/company"
 	"hongze/hz_crm_api/models/roadshow"
+	"hongze/hz_crm_api/models/system"
 	"hongze/hz_crm_api/services"
 	"hongze/hz_crm_api/utils"
+	"strconv"
 	"strings"
+	"time"
 )
 
 // @Title 我的日历列表
@@ -60,6 +64,9 @@ func (this *CalendarController) CompanySearch() {
 // @Description 我的日历列表接口
 // @Param   CompanyId   query   int  true       "公司id"
 // @Param   EnglishCompany   query   int  true       "是否为英文客户"
+// @Param   CompanyType   query   string  true       "客户类型:'ficc','权益',传空默认为ficc,"
+// @Param   RsReportRecordId   query   int	  true       "路演统计Id"
+// @Param   SellerId   query   int	  true       "销售ID"
 // @Success 200 {object} roadshow.CompanyDetailView
 // @router /company/detail [get]
 func (this *CalendarController) CompanyDetail() {
@@ -84,12 +91,45 @@ func (this *CalendarController) CompanyDetail() {
 		return
 	}
 	englishCompany, _ := this.GetInt("EnglishCompany")
+	companyType := this.GetString("CompanyType")
+	rsReportRecordId, _ := this.GetInt("RsReportRecordId")
+	sellerId, _ := this.GetInt("SellerId")
+
 	productId := services.GetProductId(sysUser.RoleTypeCode)
 	if productId == 0 {
 		productId = 1
 	}
+
+	if companyType == utils.COMPANY_CLASSIFY_RAI {
+		productId = 2
+	}
+
+	if sellerId > 0 {
+		ficcSellerMap := make(map[int]int)
+		//raiSellerMap := make(map[int]int)
+		_, groupIdRelationMap, err := services.GetFiccSystemGroup()
+		if err != nil {
+			br.Msg = "获取信息失败!"
+			br.ErrMsg = "获取FICC销售信息失败!Err:" + err.Error()
+			return
+		}
+		ficcSellerList, err := services.GetFiccSeller(time.Now(), groupIdRelationMap)
+		for _, v := range ficcSellerList {
+			ficcSellerMap[v.AdminId] = v.AdminId
+		}
+
+		if _, ok := ficcSellerMap[sellerId]; ok {
+			productId = 1
+		} else {
+			productId = 2
+		}
+	}
+
 	detailView := new(roadshow.CompanyDetailView)
 	if englishCompany == 0 {
+		var companyStatus string
+		var permissionName string
+		var viewTotal int
 		companyProductItem, err := company.GetCompanyProductByCompanyIdAndProductId(companyId, productId)
 		if err != nil {
 			if err.Error() == utils.ErrNoRow() {
@@ -100,23 +140,49 @@ func (this *CalendarController) CompanyDetail() {
 			br.ErrMsg = "搜索客户失败!Err:" + err.Error()
 			return
 		}
-		permissionList, err := company.GetCompanyProductReportPermissionList(companyId, productId)
-		if err != nil {
-			br.Msg = "搜索客户权限失败!"
-			br.ErrMsg = "搜索客户权限失败!Err:" + err.Error()
-			return
-		}
-		var permissionArr []string
-		for _, v := range permissionList {
-			permissionArr = append(permissionArr, v.PermissionName)
+		if rsReportRecordId > 0 {
+			rsReportRecordItem, err := roadshow.GetRsReportRecordDetailByRsReportRecordId(rsReportRecordId)
+			if err != nil {
+				br.Msg = "路演信息不存在!"
+				br.ErrMsg = "路演信息不存在!Err:" + err.Error()
+				return
+			}
+			companyStatus = rsReportRecordItem.CompanyStatus
+			permissionName = rsReportRecordItem.PermissionName
+			viewTotal = rsReportRecordItem.InteractionNum
+		} else {
+			permissionList, err := company.GetCompanyProductReportPermissionList(companyId, productId)
+			if err != nil {
+				br.Msg = "搜索客户权限失败!"
+				br.ErrMsg = "搜索客户权限失败!Err:" + err.Error()
+				return
+			}
+			var permissionArr []string
+			for _, v := range permissionList {
+				permissionArr = append(permissionArr, v.PermissionName)
+			}
+			companyStatus = companyProductItem.Status
+			permissionName = strings.Join(permissionArr, "/")
 		}
+
 		detailView.CompanyId = companyProductItem.CompanyId
 		detailView.CompanyName = companyProductItem.CompanyName
-		detailView.Status = companyProductItem.Status
+		detailView.Status = companyStatus
 		detailView.IndustryId = companyProductItem.IndustryId
 		detailView.IndustryName = companyProductItem.IndustryName
-		detailView.PermissionName = strings.Join(permissionArr, "/")
+		//detailView.PermissionName = strings.Join(permissionArr, "/")
+		detailView.PermissionName = permissionName
 		detailView.ReportReadTotal = companyProductItem.ViewTotal //ficc报告-累计阅读次数
+
+		if companyType == utils.COMPANY_CLASSIFY_RAI { //权益互动统计
+			detailView.ReportReadTotal = viewTotal
+		}
+
+		if productId == 1 {
+			detailView.CompanyType = "FICC"
+		} else {
+			detailView.CompanyType = "权益"
+		}
 		br.Ret = 200
 		br.Success = true
 		br.Msg = "获取成功"
@@ -133,7 +199,7 @@ func (this *CalendarController) CompanyDetail() {
 	}
 	detailView.CompanyId = enItem.CompanyId
 	detailView.CompanyName = enItem.CompanyName
-	detailView.Status = "正常"
+	detailView.Status = enItem.OverseasStatus
 	detailView.EnglishCompany = 1
 	detailView.EnglishCountry = enItem.Country
 	detailView.EnglishViewTotal = enItem.ViewTotal
@@ -142,3 +208,226 @@ func (this *CalendarController) CompanyDetail() {
 	br.Msg = "获取成功"
 	br.Data = detailView
 }
+
+//func init() {
+//	init16_01()
+//}
+
+func init16_0() {
+	var condition string
+	var pars []interface{}
+	condition = ` AND a.company_id > 0   AND  a.start_date > '2025-01-01' `
+
+	list, err := roadshow.GetRsReportRecordList(condition, pars)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+
+	var companyIds []int
+	mapcompanyIds := make(map[int]bool)
+	for _, v := range list {
+		if mapcompanyIds[v.CompanyId] {
+			continue
+		}
+		companyIds = append(companyIds, v.CompanyId)
+		mapcompanyIds[v.CompanyId] = true
+	}
+
+	listCompanyProductFicc, err := company.GetCompanyProductListByCompanyIds(companyIds, 1)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+
+	listCompanyProductRai, err := company.GetCompanyProductListByCompanyIds(companyIds, 2)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+
+	companyMap := make(map[int]*company.CompanyProduct)
+	companyMapRai := make(map[int]*company.CompanyProduct)
+	for _, v := range listCompanyProductFicc {
+		companyMap[v.CompanyId] = v
+	}
+	for _, v := range listCompanyProductRai {
+		companyMapRai[v.CompanyId] = v
+	}
+
+	mapPermissionNameFicc := make(map[int][]string)
+	mapPermissionNameRai := make(map[int][]string)
+	mapPermissionFicc := make(map[int][]*roadshow.RsReportRecordPermission)
+	mapPermissionRai := make(map[int][]*roadshow.RsReportRecordPermission)
+	listPermissionNameFicc, errFicc := company.GetCompanyProductReportPermissionListInit16_0(companyIds, 1) // FICC权限信息
+	if errFicc != nil {
+		err = errFicc
+		return
+	}
+	mapPermissionArrFicc := make(map[string]bool)
+	for _, v := range listPermissionNameFicc {
+		if mapPermissionArrFicc[fmt.Sprint(v.CompanyId, v.PermissionName)] || v.PermissionName == "" {
+			continue
+		}
+		if companyMap[v.CompanyId].Status == "正式" && v.Status != "正式" {
+			continue // 正式客户只统计正式权限
+		}
+		mapPermissionNameFicc[v.CompanyId] = append(mapPermissionNameFicc[v.CompanyId], v.PermissionName)
+		mapPermissionArrFicc[fmt.Sprint(v.CompanyId, v.PermissionName)] = true
+	}
+
+	listPermissionNameRai, errRai := company.GetCompanyProductReportPermissionListInit16_0(companyIds, 2) // 权益权限信息
+	if errRai != nil {
+		err = errRai
+		return
+	}
+
+	mapPermissionArrRai := make(map[string]bool)
+	for _, v := range listPermissionNameRai {
+		if mapPermissionArrRai[fmt.Sprint(v.CompanyId, v.PermissionName)] || v.PermissionName == "" {
+			continue
+		}
+		if companyMapRai[v.CompanyId].Status == "正式" && v.Status != "正式" {
+			continue // 正式客户只统计正式权限
+		}
+		mapPermissionNameRai[v.CompanyId] = append(mapPermissionNameRai[v.CompanyId], v.PermissionName)
+		mapPermissionArrRai[fmt.Sprint(v.CompanyId, v.PermissionName)] = true
+	}
+
+	listPermissionFicc, errFicc := roadshow.GetCompanyProductReportPermissionList(companyIds, 1) // FICC权限信息
+	if errFicc != nil {
+		err = errFicc
+		return
+	}
+	for _, v := range listPermissionFicc {
+		if companyMap[v.CompanyId] == nil {
+			continue
+		}
+		mapPermissionFicc[v.CompanyId] = append(mapPermissionFicc[v.CompanyId], v)
+	}
+
+	listPermissionRai, errRai := roadshow.GetCompanyProductReportPermissionList(companyIds, 2) // 权益权限信息
+	if errRai != nil {
+		err = errRai
+		return
+	}
+	for _, v := range listPermissionRai {
+		if companyMapRai[v.CompanyId] == nil {
+			continue
+		}
+		mapPermissionRai[v.CompanyId] = append(mapPermissionRai[v.CompanyId], v)
+	}
+
+	adminAll, err := system.GetAdminList()
+	if err != nil {
+		return
+	}
+	//adminMap := make(map[int]*system.AdminView)
+	mapRaiSllerId := make(map[int]bool) // 是否为权益销售
+	for _, v := range adminAll {
+		//adminMap[v.AdminId] = v
+		if v.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER || v.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP || v.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN {
+			mapRaiSllerId[v.AdminId] = true
+		}
+	}
+
+	var updateItems []*roadshow.RsReportRecord
+	var itemsRs []*roadshow.RsReportRecordPermission
+	mapRsReportRecordPermission := make(map[string]bool) // 一个公司的一场路演,添加了多个研究员只记录一次
+	for _, v := range list {
+		item := new(roadshow.RsReportRecord)
+		item.RsReportRecordId = v.RsReportRecordId
+		if mapRaiSllerId[v.SellerId] {
+			if len(mapPermissionNameRai[v.CompanyId]) > 0 {
+				item.PermissionName = strings.Join(mapPermissionNameRai[v.CompanyId], "/")
+			}
+		} else {
+			if len(mapPermissionNameFicc[v.CompanyId]) > 0 {
+				item.PermissionName = strings.Join(mapPermissionNameFicc[v.CompanyId], "/")
+			}
+		}
+		updateItems = append(updateItems, item)
+
+		if mapRaiSllerId[v.SellerId] {
+			for _, vP := range mapPermissionRai[v.CompanyId] {
+				pKey := strconv.Itoa(v.RsCalendarId) + "_" + strconv.Itoa(vP.ChartPermissionId)
+				if mapRsReportRecordPermission[pKey] {
+					continue
+				}
+				vP.RsCalendarId = v.RsCalendarId
+				itemsRs = append(itemsRs, vP)
+				mapRsReportRecordPermission[pKey] = true
+			}
+		} else {
+			for _, vP := range mapPermissionFicc[v.CompanyId] {
+				pKey := strconv.Itoa(v.RsCalendarId) + "_" + strconv.Itoa(vP.ChartPermissionId)
+				if mapRsReportRecordPermission[pKey] {
+					continue
+				}
+				vP.RsCalendarId = v.RsCalendarId
+				itemsRs = append(itemsRs, vP)
+				mapRsReportRecordPermission[pKey] = true
+			}
+		}
+	}
+	fmt.Println(len(updateItems))
+	err = roadshow.UpdateRsReportRecordPermissionMulti(updateItems)
+	fmt.Println(err)
+	if len(itemsRs) > 0 {
+		err = roadshow.MultiRsReportRecordPermission(itemsRs) // 添加公司当时对应的权限信息
+	}
+	return
+}
+
+func init16_01() {
+	var condition string
+	var pars []interface{}
+	condition = ` AND a.company_id > 0   AND  a.start_date > '2025-01-01' `
+
+	list, err := roadshow.GetRsReportRecordList(condition, pars)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+	var companyIds []int
+	mapcompanyIds := make(map[int]bool)
+	for _, v := range list {
+		if mapcompanyIds[v.CompanyId] {
+			continue
+		}
+		companyIds = append(companyIds, v.CompanyId)
+		mapcompanyIds[v.CompanyId] = true
+	}
+	adminAll, err := system.GetAdminList()
+	if err != nil {
+		return
+	}
+	//adminMap := make(map[int]*system.AdminView)
+	mapRaiSllerId := make(map[int]bool) // 是否为权益销售
+	for _, v := range adminAll {
+		if v.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER || v.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP || v.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN {
+			mapRaiSllerId[v.AdminId] = true
+		}
+	}
+	listerrCompanyInteractionNum, errCompany := company.GetCompanyListByCompanyId(companyIds) // 权益客户互动信息
+	if errCompany != nil {
+		err = errCompany
+		return
+	}
+	mapInteractionNum := make(map[int]int)
+	for _, v := range listerrCompanyInteractionNum {
+		mapInteractionNum[v.CompanyId] = v.InteractionNum
+	}
+	var updateItems []*roadshow.RsReportRecord
+	for _, v := range list {
+		if mapRaiSllerId[v.SellerId] == true {
+			item := new(roadshow.RsReportRecord)
+			item.RsReportRecordId = v.RsReportRecordId
+			item.InteractionNum = mapInteractionNum[v.CompanyId]
+			updateItems = append(updateItems, item)
+		}
+	}
+	err = roadshow.UpdateRsReportRecordInteractionNumnMulti(updateItems)
+
+	fmt.Println("end", err)
+}

+ 497 - 62
controllers/roadshow/report.go

@@ -3,13 +3,17 @@ package roadshow
 import (
 	"encoding/json"
 	"github.com/rdlucklib/rdluck_tools/paging"
+	"github.com/tealeg/xlsx"
 	"hongze/hz_crm_api/models"
 	"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"
 	roadshowService "hongze/hz_crm_api/services/roadshow"
 	"hongze/hz_crm_api/utils"
+	"os"
+	"path/filepath"
 	"strconv"
 	"strings"
 	"time"
@@ -18,9 +22,10 @@ import (
 // ResearcherReportList
 // @Title 研究员路演统计
 // @Description 研究员路演统计接口
-// @Param   DataType   query   string  true       "枚举值:week、month、time_interval"
+// @Param   DataType   query   string  true       "枚举值:week、month、time_interval、quarter(季度)"
 // @Param   StartDate   query   string  true       "开始日期,格式:2022-04-06"
 // @Param   EndDate   query   string  true       "结束日期,格式:2022-04-06"
+// @Param   CompanyType   query   string  true       "客户类型:'ficc','权益',传空默认为ficc,"
 // @Success 200 {object} roadshow.RsReportRecordResp
 // @router /report/researcher/list [get]
 func (this *CalendarController) ResearcherReportList() {
@@ -39,7 +44,7 @@ func (this *CalendarController) ResearcherReportList() {
 	dataType := this.GetString("DataType")
 	startDate := this.GetString("StartDate")
 	endDate := this.GetString("EndDate")
-
+	companyType := this.GetString("CompanyType", "ficc")
 	var adminDataList []roadshowService.AdminDataMap
 	var err error
 	//var firstDate time.Time
@@ -71,19 +76,94 @@ func (this *CalendarController) ResearcherReportList() {
 			br.ErrMsg = "数据异常,Err:" + err.Error()
 			return
 		}
-
-	}
-	group, err := roadshow.GetResearcherGroup()
-	if err != nil {
-		br.Msg = "获取信息失败!"
-		br.ErrMsg = "获取分组信息失败!Err:" + err.Error()
-		return
+	case "quarter":
+		adminDataList, _, err = roadshowService.GetQuarterData("researcher", "company_status")
+		if err != nil {
+			br.Msg = "数据异常"
+			br.ErrMsg = "数据异常,Err:" + err.Error()
+			return
+		}
+		if err != nil {
+			br.Msg = "数据异常"
+			br.ErrMsg = "数据异常,Err:" + err.Error()
+			return
+		}
 	}
-	researcherList, err := roadshow.GetResearcherV2()
-	if err != nil {
-		br.Msg = "获取信息失败!"
-		br.ErrMsg = "获取分组信息失败!,GetResearcherV2 Err:" + err.Error()
-		return
+
+	var group []*roadshow.ResearcherGroup
+	var researcherList []*roadshow.ResearcherGroup
+
+	switch companyType {
+	case utils.COMPANY_CLASSIFY_FICC:
+		group, err = roadshow.GetResearcherGroup()
+		if err != nil {
+			br.Msg = "获取信息失败!"
+			br.ErrMsg = "获取分组信息失败!Err:" + err.Error()
+			return
+		}
+		researcherList, err = roadshow.GetResearcherV2()
+		if err != nil {
+			br.Msg = "获取信息失败!"
+			br.ErrMsg = "获取分组信息失败!,GetResearcherV2 Err:" + err.Error()
+			return
+		}
+	case utils.COMPANY_CLASSIFY_RAI:
+		mapPermissionUser := make(map[string][]*roadshow.ResearcherGroup)
+		listPermission, err := cygx.GetChartPermissionAll()
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取品种信息失败,Err:" + err.Error()
+			return
+		}
+		mapPermissionId := make(map[string]int)
+		for _, v := range listPermission {
+			mapPermissionId[v.PermissionName] = v.ChartPermissionId
+		}
+		askUserList, err := cygx.GetAskEmailListResearcher()
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetAskEmailListResearcher Err: " + err.Error()
+			return
+		}
+		sysUserList, err := system.GetAdminList()
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取admin列表失败, Err:" + err.Error()
+			return
+		}
+		adminMap := make(map[int]*system.Admin, 0)
+		for _, v := range sysUserList {
+			if v.Enabled == 0 {
+				continue // 被禁用的不展示
+			}
+			adminMap[v.AdminId] = v
+		}
+
+		for _, v := range askUserList {
+			if admin, ok := adminMap[v.AdminId]; ok {
+				item := &roadshow.ResearcherGroup{
+					AdminId:      v.AdminId,
+					RealName:     v.Name,
+					GroupId:      mapPermissionId[v.ChartPermissionName], //行业ID作为组别,进行关系映射
+					GroupName:    admin.GroupName,
+					RoleTypeCode: admin.RoleTypeCode,
+				}
+				mapPermissionUser[v.ChartPermissionName] = append(mapPermissionUser[v.ChartPermissionName], item)
+				researcherList = append(researcherList, item)
+			}
+		}
+		//for _, vP := range listPermission {
+		for k, v := range mapPermissionUser {
+			//if vP.PermissionName != k {
+			//	continue //统一排序顺序
+			//}
+			respItem := new(roadshow.ResearcherGroup)
+			respItem.GroupName = k + "组"
+			respItem.GroupId = mapPermissionId[k]
+			respItem.ResearcherList = v
+			group = append(group, respItem)
+		}
+		//}
 	}
 	groupMap := make(map[int][]*roadshow.ResearcherGroup)
 	for _, v := range researcherList {
@@ -120,24 +200,35 @@ func (this *CalendarController) ResearcherReportList() {
 	tmpAllTryOutNumMap := make(map[int]int)
 	tmpAllFormalNumMap := make(map[int]int)
 	tmpAllMeetingNumMap := make(map[int]int)
+	tmpAllRoadShowNumMap := make(map[int]int)
+	tmpAllSalonNumMap := 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)
 		tmpGroupRsReportRecordNumList := make([]roadshow.RsReportRecordNum, 0)
 
+		//roadShowMap := make(map[int]int) // 路演总次数
+		//salonMap := make(map[int]int)    //沙龙路演次数
+
 		tmpGroupTryOutNumMap := make(map[int]int)
 		tmpGroupFormalNumMap := make(map[int]int)
 		tmpGroupMeetingNumMap := make(map[int]int)
+		tmpGroupRoadShowNumMap := make(map[int]int)
+		tmpGroupSalonMapNumMap := make(map[int]int)
+		tmpGroupAskTryOutMapNumMap := make(map[int]int)
+		tmpGroupAskFormalMapNumMap := make(map[int]int)
 		for _, researcher := range groupMap[v.GroupId] {
 			//组内研究员数据
-
 			//每个区间的数据
 			tmpAdminRsReportRecordNumList := make([]roadshow.RsReportRecordNum, 0)
 			for index, adminData := range adminDataList {
 				startDateIndexList[index] = adminData.StartDate
 				endDateIndexList[index] = adminData.EndDate
 
-				var tmpTryOutNum, tmpFormalNum, tmpMeetingNum int
+				var tmpTryOutNum, tmpFormalNum, tmpMeetingNum, tmpRoadShowNum, tmpSalonNum, tmpAskTryOutNum, tmpAskFormalNum int
 				if num, ok := adminData.TryOutMap[researcher.AdminId]; ok {
 					tmpTryOutNum = num
 				}
@@ -147,12 +238,31 @@ func (this *CalendarController) ResearcherReportList() {
 				if num, ok := adminData.MeetingMap[researcher.AdminId]; ok {
 					tmpMeetingNum = num
 				}
+				if num, ok := adminData.RoadShowMap[researcher.AdminId]; ok { //路演总次数
+					tmpRoadShowNum = num
+				}
+				if num, ok := adminData.SalonMap[researcher.AdminId]; ok { //路演总次数
+					tmpSalonNum = 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,
-					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)
 
@@ -166,9 +276,25 @@ func (this *CalendarController) ResearcherReportList() {
 				if _, ok := tmpGroupMeetingNumMap[index]; !ok {
 					tmpGroupMeetingNumMap[index] = 0
 				}
+				if _, ok := tmpGroupRoadShowNumMap[index]; !ok {
+					tmpGroupRoadShowNumMap[index] = 0
+				}
+				if _, ok := tmpGroupSalonMapNumMap[index]; !ok {
+					tmpGroupSalonMapNumMap[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
+				tmpGroupAskTryOutMapNumMap[index] += tmpAskTryOutNum
+				tmpGroupAskFormalMapNumMap[index] += tmpAskFormalNum
 
 				//总数据汇总
 				if _, ok := tmpAllTryOutNumMap[index]; !ok {
@@ -180,9 +306,26 @@ func (this *CalendarController) ResearcherReportList() {
 				if _, ok := tmpAllMeetingNumMap[index]; !ok {
 					tmpAllMeetingNumMap[index] = 0
 				}
+				if _, ok := tmpGroupRoadShowNumMap[index]; !ok {
+					tmpGroupRoadShowNumMap[index] = 0
+				}
+				if _, ok := tmpGroupSalonMapNumMap[index]; !ok {
+					tmpGroupSalonMapNumMap[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
+				tmpAllAskTryOutNumMap[index] += tmpAskTryOutNum
+				tmpAllAskFormalNumMap[index] += tmpAskFormalNum
 			}
 			tmpAdminReportRecord := roadshow.AdminReportRecord{
 				Name:                  researcher.RealName,
@@ -194,11 +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],
-				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)
 		}
@@ -213,11 +360,13 @@ func (this *CalendarController) ResearcherReportList() {
 	//总体汇总数据
 	for i := 0; i < len(tmpAllFormalNumMap); i++ {
 		tmpGroupRsReportRecordNum := roadshow.RsReportRecordNum{
-			TryOutNum:  tmpAllTryOutNumMap[i],
-			FormalNum:  tmpAllFormalNumMap[i],
-			MeetingNum: tmpAllMeetingNumMap[i],
-			StartDate:  startDateIndexList[i],
-			EndDate:    endDateIndexList[i],
+			TryOutNum:   tmpAllTryOutNumMap[i],
+			FormalNum:   tmpAllFormalNumMap[i],
+			MeetingNum:  tmpAllMeetingNumMap[i],
+			RoadShowNum: tmpAllRoadShowNumMap[i],
+			SalonNum:    tmpAllSalonNumMap[i],
+			StartDate:   startDateIndexList[i],
+			EndDate:     endDateIndexList[i],
 		}
 		rsAllReportRecordNumList = append(rsAllReportRecordNumList, tmpGroupRsReportRecordNum)
 	}
@@ -237,6 +386,7 @@ func (this *CalendarController) ResearcherReportList() {
 // @Param   DimensionType   query   string  true       "维度枚举值:company_status、roadshow_type"
 // @Param   StartDate   query   string  true       "开始日期,格式:2022-04-06"
 // @Param   EndDate   query   string  true       "结束日期,格式:2022-04-06"
+// @Param   CompanyType   query   string  true       "客户类型:'ficc','权益',传空默认为ficc,"
 // @Success 200 {object} roadshow.RsReportRecordResp
 // @router /report/seller/list [get]
 func (this *CalendarController) SellerReportList() {
@@ -256,10 +406,13 @@ func (this *CalendarController) SellerReportList() {
 	dimensionType := this.GetString("DimensionType")
 	startDate := this.GetString("StartDate")
 	endDate := this.GetString("EndDate")
-
+	companyType := this.GetString("CompanyType", "ficc")
 	if dimensionType == "" {
 		dimensionType = "company_status"
 	}
+	if companyType == utils.COMPANY_CLASSIFY_RAI {
+		dimensionType = "roadshow_rai" // 类型传了权益,就强制查询权益的路演
+	}
 
 	var adminDataList []roadshowService.AdminDataMap
 	var err error
@@ -294,13 +447,34 @@ func (this *CalendarController) SellerReportList() {
 		}
 
 	}
-	group, groupIdRelationMap, err := services.GetFiccSystemGroup()
-	if err != nil {
-		br.Msg = "获取信息失败!"
-		br.ErrMsg = "获取分组信息失败!Err:" + err.Error()
-		return
+
+	var group []services.AdminGroup
+	var groupIdRelationMap map[int]int
+	var researcherList []*roadshow.Researcher
+	switch companyType {
+	case utils.COMPANY_CLASSIFY_FICC:
+		group, groupIdRelationMap, err = services.GetFiccSystemGroup()
+		if err != nil {
+			br.Msg = "获取信息失败!"
+			br.ErrMsg = "获取FICC销售信息失败!Err:" + err.Error()
+			return
+		}
+		researcherList, err = services.GetFiccSeller(firstDate, groupIdRelationMap)
+	case utils.COMPANY_CLASSIFY_RAI:
+		group, groupIdRelationMap, err = services.GetRaiSystemGroup()
+		if err != nil {
+			br.Msg = "获取信息失败!"
+			br.ErrMsg = "获取分组信息失败!Err:" + err.Error()
+			return
+		}
+		researcherList, err = services.GetRaiSeller(groupIdRelationMap)
+		if err != nil {
+			br.Msg = "获取信息失败!"
+			br.ErrMsg = "获取权益销售信息失败!Err:" + err.Error()
+			return
+		}
 	}
-	researcherList, err := services.GetFiccSeller(firstDate, groupIdRelationMap)
+
 	groupMap := make(map[int][]*roadshow.Researcher)
 	for _, v := range researcherList {
 		if v.RoleTypeCode == "ficc_admin" {
@@ -333,6 +507,8 @@ func (this *CalendarController) SellerReportList() {
 	tmpAllMeetingNumMap := make(map[int]int)
 	tmpAllOnlineNumMap := make(map[int]int)
 	tmpAllOfflineNumMap := make(map[int]int)
+	tmpAllRoadShowNumMap := make(map[int]int)
+	tmpAllSalonNumMap := make(map[int]int)
 	for _, v := range group {
 		v.ResearcherList = groupMap[v.GroupId]
 		tmpGroupAdminReportRecord := make([]roadshow.AdminReportRecord, 0)
@@ -343,16 +519,17 @@ func (this *CalendarController) SellerReportList() {
 		tmpGroupMeetingNumMap := make(map[int]int)
 		tmpGroupOnlineNumMap := make(map[int]int)
 		tmpGroupOfflineNumMap := make(map[int]int)
+		tmpGroupRoadShowNumMap := make(map[int]int)
+		tmpGroupSalonNumMap := make(map[int]int)
 		for _, researcher := range groupMap[v.GroupId] {
 			//组内研究员数据
-
 			//每个区间的数据
 			tmpAdminRsReportRecordNumList := make([]roadshow.RsReportRecordNum, 0)
 			for index, adminData := range adminDataList {
 				startDateIndexList[index] = adminData.StartDate
 				endDateIndexList[index] = adminData.EndDate
 
-				var tmpTryOutNum, tmpFormalNum, tmpMeetingNum, tmpOnlineNum, tmpOfflineNum int
+				var tmpTryOutNum, tmpFormalNum, tmpMeetingNum, tmpOnlineNum, tmpOfflineNum, tmpRoadShowNum, tmpSalonNum int
 				if num, ok := adminData.TryOutMap[researcher.AdminId]; ok {
 					tmpTryOutNum = num
 				}
@@ -368,14 +545,22 @@ func (this *CalendarController) SellerReportList() {
 				if num, ok := adminData.OfflineMap[researcher.AdminId]; ok {
 					tmpOfflineNum = num
 				}
+				if num, ok := adminData.RoadShowMap[researcher.AdminId]; ok {
+					tmpRoadShowNum = num
+				}
+				if num, ok := adminData.SalonMap[researcher.AdminId]; ok {
+					tmpSalonNum = num
+				}
 				tmpAdminRsReportRecordNum := roadshow.RsReportRecordNum{
-					TryOutNum:  tmpTryOutNum,
-					FormalNum:  tmpFormalNum,
-					MeetingNum: tmpMeetingNum,
-					OnlineNum:  tmpOnlineNum,
-					OfflineNum: tmpOfflineNum,
-					StartDate:  adminData.StartDate,
-					EndDate:    adminData.EndDate,
+					TryOutNum:   tmpTryOutNum,
+					FormalNum:   tmpFormalNum,
+					MeetingNum:  tmpMeetingNum,
+					OnlineNum:   tmpOnlineNum,
+					OfflineNum:  tmpOfflineNum,
+					RoadShowNum: tmpRoadShowNum,
+					SalonNum:    tmpSalonNum,
+					StartDate:   adminData.StartDate,
+					EndDate:     adminData.EndDate,
 				}
 				tmpAdminRsReportRecordNumList = append(tmpAdminRsReportRecordNumList, tmpAdminRsReportRecordNum)
 
@@ -395,11 +580,19 @@ func (this *CalendarController) SellerReportList() {
 				if _, ok := tmpGroupOfflineNumMap[index]; !ok {
 					tmpGroupOfflineNumMap[index] = 0
 				}
+				if _, ok := tmpGroupRoadShowNumMap[index]; !ok {
+					tmpGroupRoadShowNumMap[index] = 0
+				}
+				if _, ok := tmpGroupSalonNumMap[index]; !ok {
+					tmpGroupSalonNumMap[index] = 0
+				}
 				tmpGroupTryOutNumMap[index] += tmpTryOutNum
 				tmpGroupFormalNumMap[index] += tmpFormalNum
 				tmpGroupMeetingNumMap[index] += tmpMeetingNum
 				tmpGroupOnlineNumMap[index] += tmpOnlineNum
 				tmpGroupOfflineNumMap[index] += tmpOfflineNum
+				tmpGroupRoadShowNumMap[index] += tmpRoadShowNum
+				tmpGroupSalonNumMap[index] += tmpSalonNum
 
 				//总数据汇总
 				if _, ok := tmpAllTryOutNumMap[index]; !ok {
@@ -417,11 +610,19 @@ func (this *CalendarController) SellerReportList() {
 				if _, ok := tmpAllOfflineNumMap[index]; !ok {
 					tmpAllOfflineNumMap[index] = 0
 				}
+				if _, ok := tmpAllRoadShowNumMap[index]; !ok {
+					tmpAllRoadShowNumMap[index] = 0
+				}
+				if _, ok := tmpAllSalonNumMap[index]; !ok {
+					tmpAllSalonNumMap[index] = 0
+				}
 				tmpAllTryOutNumMap[index] += tmpTryOutNum
 				tmpAllFormalNumMap[index] += tmpFormalNum
 				tmpAllMeetingNumMap[index] += tmpMeetingNum
 				tmpAllOnlineNumMap[index] += tmpOnlineNum
 				tmpAllOfflineNumMap[index] += tmpOfflineNum
+				tmpAllRoadShowNumMap[index] += tmpRoadShowNum
+				tmpAllSalonNumMap[index] += tmpSalonNum
 			}
 			tmpAdminReportRecord := roadshow.AdminReportRecord{
 				Name:                  researcher.RealName,
@@ -433,13 +634,15 @@ func (this *CalendarController) SellerReportList() {
 
 		for i := 0; i < len(tmpGroupMeetingNumMap); i++ {
 			tmpGroupRsReportRecordNum := roadshow.RsReportRecordNum{
-				TryOutNum:  tmpGroupTryOutNumMap[i],
-				FormalNum:  tmpGroupFormalNumMap[i],
-				MeetingNum: tmpGroupMeetingNumMap[i],
-				OnlineNum:  tmpGroupOnlineNumMap[i],
-				OfflineNum: tmpGroupOfflineNumMap[i],
-				StartDate:  startDateIndexList[i],
-				EndDate:    endDateIndexList[i],
+				TryOutNum:   tmpGroupTryOutNumMap[i],
+				FormalNum:   tmpGroupFormalNumMap[i],
+				MeetingNum:  tmpGroupMeetingNumMap[i],
+				OnlineNum:   tmpGroupOnlineNumMap[i],
+				OfflineNum:  tmpGroupOfflineNumMap[i],
+				RoadShowNum: tmpGroupRoadShowNumMap[i],
+				SalonNum:    tmpGroupSalonNumMap[i],
+				StartDate:   startDateIndexList[i],
+				EndDate:     endDateIndexList[i],
 			}
 			tmpGroupRsReportRecordNumList = append(tmpGroupRsReportRecordNumList, tmpGroupRsReportRecordNum)
 		}
@@ -455,13 +658,15 @@ func (this *CalendarController) SellerReportList() {
 	//总体汇总数据
 	for i := 0; i < len(tmpAllFormalNumMap); i++ {
 		tmpGroupRsReportRecordNum := roadshow.RsReportRecordNum{
-			TryOutNum:  tmpAllTryOutNumMap[i],
-			FormalNum:  tmpAllFormalNumMap[i],
-			MeetingNum: tmpAllMeetingNumMap[i],
-			OnlineNum:  tmpAllOnlineNumMap[i],
-			OfflineNum: tmpAllOfflineNumMap[i],
-			StartDate:  startDateIndexList[i],
-			EndDate:    endDateIndexList[i],
+			TryOutNum:   tmpAllTryOutNumMap[i],
+			FormalNum:   tmpAllFormalNumMap[i],
+			MeetingNum:  tmpAllMeetingNumMap[i],
+			OnlineNum:   tmpAllOnlineNumMap[i],
+			OfflineNum:  tmpAllOfflineNumMap[i],
+			RoadShowNum: tmpAllRoadShowNumMap[i],
+			SalonNum:    tmpAllSalonNumMap[i],
+			StartDate:   startDateIndexList[i],
+			EndDate:     endDateIndexList[i],
 		}
 		rsAllReportRecordNumList = append(rsAllReportRecordNumList, tmpGroupRsReportRecordNum)
 	}
@@ -506,6 +711,8 @@ func (this *CalendarController) SellerReportList() {
 // @Param   AdminId   query   int  true       "用户id"
 // @Param   StartDate   query   string  true       "开始日期,格式:2022-04-06"
 // @Param   EndDate   query   string  true       "结束日期,格式:2022-04-06"
+// @Param   Status   query   int  true       "0:全部,1:已完成"
+// @Param   EnglishCompany   query   int  true       "-1:全部,0:国内,1:海外"
 // @Success 200 {object} []roadshow.RsReportRecordList
 // @router /report/calendar/list [get]
 func (this *CalendarController) ReportCalendarList() {
@@ -531,6 +738,10 @@ func (this *CalendarController) ReportCalendarList() {
 		return
 	}
 
+	status, _ := this.GetInt("Status")
+
+	englishCompany, _ := this.GetInt("EnglishCompany")
+
 	//正式客户
 	var condition string
 	var pars []interface{}
@@ -571,18 +782,55 @@ func (this *CalendarController) ReportCalendarList() {
 	case "offline":
 		condition += ` and a.roadshow_type = ? `
 		pars = append(pars, "线下")
+	case "road_show":
+		condition += ` and a.activity_type = ? `
+		pars = append(pars, "路演")
+	case "salon":
+		condition += ` and a.activity_type = ? `
+		pars = append(pars, "沙龙")
 	default:
 		br.Msg = "请传入类型"
 		br.ErrMsg = "请传入类型DataType"
 		return
 	}
 
+	if status == 1 {
+		condition += ` and c.question_status = ? `
+		pars = append(pars, 1)
+	}
+
+	if englishCompany != -1 {
+		condition += ` and b.english_company = ? `
+		pars = append(pars, englishCompany)
+	}
+
 	list, err := roadshow.GetRsReportRecordList(condition, pars)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,ERR:" + err.Error()
 		return
 	}
+
+	ficcSellerMap := make(map[int]int)
+	//raiSellerMap := make(map[int]int)
+	_, groupIdRelationMap, err := services.GetFiccSystemGroup()
+	if err != nil {
+		br.Msg = "获取信息失败!"
+		br.ErrMsg = "获取FICC销售信息失败!Err:" + err.Error()
+		return
+	}
+	ficcSellerList, err := services.GetFiccSeller(time.Now(), groupIdRelationMap)
+	for _, v := range ficcSellerList {
+		ficcSellerMap[v.AdminId] = v.AdminId
+	}
+
+	for _, v := range list {
+		if _, ok := ficcSellerMap[v.SellerId]; ok {
+			v.CompanyType = "FICC"
+		} else {
+			v.CompanyType = "权益"
+		}
+	}
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
@@ -1715,4 +1963,191 @@ func (this *CalendarController) OverseasCalendarList() {
 	br.Msg = "获取成功"
 	br.Data = list
 	return
-}
+}
+
+// @Title 导出研究员路演统计
+// @Description 导出研究员路演统计接口
+// @Param   DataType   query   string  true       "枚举值:week、month、time_interval"
+// @Param   StartDate   query   string  true       "开始日期,格式:2022-04-06"
+// @Param   EndDate   query   string  true       "结束日期,格式:2022-04-06"
+// @Param   CompanyType   query   string  true       "客户类型:'ficc','权益',传空默认为ficc,"
+// @Success 200 {object} roadshow.RsReportRecordResp
+// @router /report/researcher/export [get]
+func (this *CalendarController) ResearcherReportExport() {
+	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
+	}
+	dataType := this.GetString("DataType")
+	startDate := this.GetString("StartDate")
+	endDate := this.GetString("EndDate")
+	companyType := this.GetString("CompanyType", "ficc")
+
+	var err error
+	//获取列表
+	switch dataType {
+	case "week":
+		startDate = utils.GetNowWeekMonday().AddDate(0, 0, -7).Format(utils.FormatDate)
+		endDate = utils.GetNowWeekLastDay().AddDate(0, 0, 7).Format(utils.FormatDate)
+	case "month":
+		startDate = utils.GetNowMonthFirstDay().AddDate(0, -4, 0).Format(utils.FormatDate)
+		endDate = utils.GetNowMonthLastDay().Format(utils.FormatDate)
+	case "time_interval":
+		if startDate == `` || endDate == `` {
+			br.Msg = "开始日期或结束日期不能为空"
+			br.ErrMsg = "开始日期或结束日期不能为空,Err:" + err.Error()
+			return
+		}
+	}
+
+	var researcherIdArr []string
+	ficcSellerMap := make(map[int]int)
+	//raiSellerMap := make(map[int]int)
+	switch companyType {
+	case utils.COMPANY_CLASSIFY_FICC:
+		researcherList, err := roadshow.GetResearcherV2()
+		if err != nil {
+			br.Msg = "获取信息失败!"
+			br.ErrMsg = "获取分组信息失败!,GetResearcherV2 Err:" + err.Error()
+			return
+		}
+		for _, v := range researcherList {
+			if v.AdminId > 0 {
+				researcherId := strconv.Itoa(v.AdminId)
+				researcherIdArr = append(researcherIdArr, researcherId)
+			}
+		}
+
+		_, groupIdRelationMap, err := services.GetFiccSystemGroup()
+		if err != nil {
+			br.Msg = "获取信息失败!"
+			br.ErrMsg = "获取FICC销售信息失败!Err:" + err.Error()
+			return
+		}
+		ficcSellerList, err := services.GetFiccSeller(time.Now(), groupIdRelationMap)
+		for _, v := range ficcSellerList {
+			ficcSellerMap[v.AdminId] = v.AdminId
+		}
+	case utils.COMPANY_CLASSIFY_RAI:
+		askUserList, err := cygx.GetAskEmailListResearcher()
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetAskEmailListResearcher Err: " + err.Error()
+			return
+		}
+		for _, v := range askUserList {
+			if v.AdminId > 0 {
+				researcherId := strconv.Itoa(v.AdminId)
+				researcherIdArr = append(researcherIdArr, researcherId)
+			}
+		}
+
+		//_, groupIdRelationMap, err := services.GetRaiSystemGroup()
+		//if err != nil {
+		//	br.Msg = "获取信息失败!"
+		//	br.ErrMsg = "获取分组信息失败!Err:" + err.Error()
+		//	return
+		//}
+		//raiSellList, err := services.GetRaiSeller(groupIdRelationMap)
+		//if err != nil {
+		//	br.Msg = "获取信息失败!"
+		//	br.ErrMsg = "获取权益销售信息失败!Err:" + err.Error()
+		//	return
+		//}
+		//
+		//for _, v := range raiSellList {
+		//	raiSellerMap[v.AdminId] = v.AdminId
+		//}
+	}
+
+	var condition string
+	var pars []interface{}
+
+	condition += ` AND c.researcher_id IN(` + strings.Join(researcherIdArr, ",") + `) `
+
+	if startDate != "" {
+		condition += ` AND c.start_date >= ? `
+		pars = append(pars, startDate)
+	}
+
+	if endDate != "" {
+		condition += ` AND c.start_date <= ? `
+		pars = append(pars, endDate)
+	}
+
+	condition += ` AND b.activity_type = '路演' `
+	condition += ` AND b.roadshow_type <> '' `
+	condition += ` AND c.question_status = 1 `
+
+	list, err := roadshow.GetReportResearcherExport(condition, pars)
+	if err != nil {
+		br.Msg = "获取信息失败!"
+		br.ErrMsg = "获取数据失败!Err:" + err.Error()
+		return
+	}
+
+	dir, _ := os.Executable()
+	exPath := filepath.Dir(dir)
+	downloadPath := exPath + "/" + time.Now().Format(utils.FormatDateUnSpace) + "研究员已完成路演统计" + ".xlsx"
+	xlsxFile := xlsx.NewFile()
+	sheet, e := xlsxFile.AddSheet("已完成路演统计")
+	if e != nil {
+		br.Msg = "新增Sheet失败"
+		br.ErrMsg = "新增Sheet失败, Err: " + e.Error()
+		return
+	}
+
+	titleRow := sheet.AddRow()
+	titleRow.AddCell().SetString("研究员")
+	titleRow.AddCell().SetString("路演时间")
+	titleRow.AddCell().SetString("客户名称")
+	titleRow.AddCell().SetString("路演形式")
+	titleRow.AddCell().SetString("发起人")
+	titleRow.AddCell().SetString("客户类型")
+	titleRow.AddCell().SetString("客户状态")
+	titleRow.AddCell().SetString("客户行业")
+	titleRow.AddCell().SetString("客户分类")
+	titleRow.AddCell().SetString("所属区域")
+
+	for _, v := range list {
+		dataRow := sheet.AddRow()
+		dataRow.AddCell().SetString(v.ResearcherName)
+		dataRow.AddCell().SetString(v.StartDate + " " + v.StartTime)
+		dataRow.AddCell().SetString(v.CompanyName)
+		dataRow.AddCell().SetString(v.RoadshowType)
+		dataRow.AddCell().SetString(v.SellerName)
+		if _, ok := ficcSellerMap[v.SellerId]; ok {
+			dataRow.AddCell().SetString("FICC")
+		} else {
+			dataRow.AddCell().SetString("权益")
+		}
+		dataRow.AddCell().SetString(v.CompanyStatus)
+		dataRow.AddCell().SetString(v.CompanyIndustry)
+		dataRow.AddCell().SetString(v.CompanyClassify)
+		if v.EnglishCompany == 0 {
+			dataRow.AddCell().SetString("国内")
+		} else {
+			dataRow.AddCell().SetString("海外")
+		}
+	}
+
+	if e = xlsxFile.Save(downloadPath); e != nil {
+		br.Msg = "导出失败"
+		br.ErrMsg = "保存文件失败"
+		return
+	}
+	fileName := time.Now().Format(utils.FormatDateUnSpace) + "研究员已完成路演统计" + ".xlsx"
+	this.Ctx.Output.Download(downloadPath, fileName)
+	defer func() {
+		_ = os.Remove(downloadPath)
+	}()
+	return
+}

+ 213 - 5
controllers/seal/seal_approval.go

@@ -13,6 +13,8 @@ import (
 	sealModels "hongze/hz_crm_api/models/seal"
 	"hongze/hz_crm_api/models/seal/request"
 	"hongze/hz_crm_api/models/seal/response"
+	"hongze/hz_crm_api/services"
+	contractService "hongze/hz_crm_api/services/contract"
 	"hongze/hz_crm_api/services/seal"
 	"hongze/hz_crm_api/utils"
 	"os"
@@ -427,7 +429,7 @@ func ApprovalListExport(this *SealApprovalController, condition, joinCondition s
 		br.ErrMsg = "保存文件失败"
 		return
 	}
-	downloadFileName := "用印审批列表" + time.Now().Format("2006.01.02")+ ".xlsx"
+	downloadFileName := "用印审批列表" + time.Now().Format("2006.01.02") + ".xlsx"
 	this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
 	defer func() {
 		os.Remove(downLoadnFilePath)
@@ -464,16 +466,47 @@ func (this *SealApprovalController) Apply() {
 		br.ErrMsg = "参数解析异常!Err:" + err.Error()
 		return
 	}
+
+	creditCode := req.CreditCode
+	startDate := req.StartDate
+
 	reqVerify := utils.Rules{
-		"Use":               {utils.NotEmpty()},
-		"CompanyName":       {utils.NotEmpty()},
-		"CreditCode":        {utils.NotEmpty()},
-		"ServiceType":       {utils.NotEmpty()},
+		"Use":         {utils.NotEmpty()},
+		"CompanyName": {utils.NotEmpty()},
+		"CreditCode":  {utils.NotEmpty()},
+		//"ServiceType":       {utils.NotEmpty()},
 		"SealType":          {utils.NotEmpty()},
 		"FileUrls":          {utils.NotEmpty()},
 		"AffiliatedCompany": {utils.NotEmpty()},
 	}
 
+	//目前只有权益的用印申请会有开始时间,先作为权益的标识判断 CRM_16.8
+	if startDate != "" {
+		companyInfo, tmpErr := company.GetCompanyByCreditCode(creditCode)
+		//如果查询异常,且并不是在系统中找不到该社会信用码,那么就异常返回
+		if tmpErr != nil {
+			br.Msg = "根据社会信用码获取客户信息失败!"
+			br.ErrMsg = "根据社会信用码获取客户信息失败!Err:" + err.Error()
+			return
+		}
+
+		req.CompanyId = companyInfo.CompanyId
+		totalLastYear, err := contractService.GetCompanyContractCountRaiByLastYear(req.CompanyId, req.StartDate)
+		if err != nil {
+			br.Msg = "获取合同信息失败"
+			br.ErrMsg = "获取合同信息失败,Err:" + err.Error()
+			return
+		}
+		if totalLastYear > 0 {
+			req.ServiceType = "新签合同"
+		} else {
+			req.ServiceType = "续约合同"
+		}
+		reqVerify["Money"] = []string{utils.NotEmpty()}
+	} else {
+		reqVerify["ServiceType"] = []string{utils.NotEmpty()}
+	}
+
 	err = utils.Verify(req, reqVerify, utils.LANG_CN)
 	if err != nil {
 		br.Msg = "参数丢失!"
@@ -561,6 +594,30 @@ func (this *SealApprovalController) Edit() {
 		br.ErrMsg = "归属公司不能为空"
 		return
 	}
+	startDate := req.StartDate
+	creditCode := req.CreditCode
+	if startDate != "" {
+		companyInfo, tmpErr := company.GetCompanyByCreditCode(creditCode)
+		//如果查询异常,且并不是在系统中找不到该社会信用码,那么就异常返回
+		if tmpErr != nil {
+			br.Msg = "根据社会信用码获取客户信息失败!"
+			br.ErrMsg = "根据社会信用码获取客户信息失败!Err:" + err.Error()
+			return
+		}
+
+		companyId := companyInfo.CompanyId
+		totalLastYear, err := contractService.GetCompanyContractCountRaiByLastYear(companyId, req.StartDate)
+		if err != nil {
+			br.Msg = "获取合同信息失败"
+			br.ErrMsg = "获取合同信息失败,Err:" + err.Error()
+			return
+		}
+		if totalLastYear > 0 {
+			req.ServiceType = "新签合同"
+		} else {
+			req.ServiceType = "续约合同"
+		}
+	}
 
 	// 编辑用印
 	err = seal.EditApply(this.SysUser, req)
@@ -998,3 +1055,154 @@ func (this *SealApprovalController) AffiliatedCompanyList() {
 	br.Msg = "获取成功"
 	br.Data = list
 }
+
+// 用印客户名称检索
+// @Title 用印客户名称检索列表
+// @Description 关联公司列表
+// @Param   KeyWord   query   string  true       "搜索关键词"
+// @Success 200 {object} company.CompanySearchView
+// @router /company/search [get]
+func (this *SealApprovalController) CompanySearch() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser is Empty"
+		br.Ret = 408
+		return
+	}
+	KeyWord := this.GetString("KeyWord")
+	if KeyWord == "" {
+		br.Msg = "请输入搜索词!"
+		return
+	}
+	KeyWord = "%" + KeyWord + "%"
+	productId := services.GetProductId(sysUser.RoleTypeCode)
+	var groupId int
+	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_GROUP || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP {
+		groupId = sysUser.GroupId
+	} else {
+		groupId = -1
+	}
+
+	list, err := company.GetCompanySearchBySeal(productId, sysUser.AdminId, groupId, KeyWord)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "搜索客户失败!"
+		br.ErrMsg = "搜索客户失败!Err:" + err.Error()
+		return
+	}
+	if list == nil {
+		list = make([]*company.CompanySearchView, 0)
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = list
+}
+
+// 用印合同编号检索
+// @Title 用印合同编号检索
+// @Description 关联用印信息列表
+// @Param   KeyWord   query   string  true       "搜索关键词"
+// @Success 200 {object} sealModels.SealSearCodeViewListResp
+// @router /sealcode/search [get]
+func (this *SealApprovalController) SealCodeSearch() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser is Empty"
+		br.Ret = 408
+		return
+	}
+	KeyWord := this.GetString("KeyWord")
+	if KeyWord == "" {
+		br.Msg = "请输入搜索词!"
+		return
+	}
+	KeyWord = "%" + KeyWord + "%"
+	var condition string
+	var pars []interface{}
+	condition += ` AND code LIKE ?  AND  user_id = ?   `
+	pars = append(pars, KeyWord, sysUser.AdminId)
+
+	list, err := sealModels.GetList(condition, pars, 0, 100)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "搜索客户失败!"
+		br.ErrMsg = "搜索客户失败!Err:" + err.Error()
+		return
+	}
+	resp := new(sealModels.SealSearCodeViewListResp)
+	if list == nil {
+		resp.List = make([]*sealModels.SealSearCodeView, 0)
+	} else {
+		for _, v := range list {
+			item := new(sealModels.SealSearCodeView)
+			item.SealId = v.SealId
+			item.Code = v.Code
+			item.StartDate = v.StartDate
+			item.EndDate = v.EndDate
+			item.Money = v.Money
+			resp.List = append(resp.List, item)
+		}
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// 通过ID获取用印对应详情
+// @Title 通过ID获取用印对应详情接口
+// @Description 获取用印对应详情
+// @Param   SealId   query   int	  true       "用印ID"
+// @Success 200 {object} response.SealSearCodeViewDetailResp
+// @router /sealdetail/by_sealid [get]
+func (this *SealApprovalController) SealdetailById() {
+	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
+	}
+	sealId, _ := this.GetInt("SealId")
+	if sealId == 0 {
+		br.Msg = "请输入用印ID!"
+		return
+	}
+
+	sealInfo, err := sealModels.GetSealInfoById(sealId)
+	if err != nil {
+		br.Msg = "获取用印失败!"
+		br.ErrMsg = "获取用印失败!Err:" + err.Error()
+		return
+	}
+
+	resp := new(sealModels.SealSearCodeViewDetailResp)
+
+	item := new(sealModels.SealSearCodeView)
+	item.SealId = sealInfo.SealId
+	item.Code = sealInfo.Code
+	item.StartDate = sealInfo.StartDate
+	item.EndDate = sealInfo.EndDate
+	item.Money = sealInfo.Money
+	resp.Detail = item
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 1794 - 0
controllers/statistic/rai_data_summary.go

@@ -0,0 +1,1794 @@
+package statistic
+
+import (
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"hongze/hz_crm_api/controllers"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/company"
+	"hongze/hz_crm_api/models/fms"
+	"hongze/hz_crm_api/models/statistic_report"
+	"hongze/hz_crm_api/models/system"
+	"hongze/hz_crm_api/services"
+	cygxService "hongze/hz_crm_api/services/cygx"
+	"hongze/hz_crm_api/utils"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// 权益数据汇总
+// StatisticRaiDataSummaryController 权益数据汇总基类
+type StatisticRaiDataSummaryController struct {
+	controllers.BaseAuthController
+}
+
+// MergeCompanyList
+// @Title 权益数据汇总
+// @Description 权益数据汇总统计列表接口
+// @Param   AdminId   query   string  true       "开拓组销售id,多个用英文逗号隔开,空字符串为全部"
+// @Param   ServiceAdminId   query   string  true       "服务组销售id,多个用英文逗号隔开,空字符串为全部"
+// @Param   StartYear   query   int	  false       "开始日期(年份)"
+// @Param   EndYear   query   int  false       "结束日期(年份)"
+// @Param   DataType   query   string  false       "报表类型,枚举值:`季度`,`年度`,`半年度`"
+// @Param   DevelopButton   query   int	  false       "开拓组开关,枚举值:1:开启,0:关闭 ,默认关闭"
+// @Param   ServerButton   query   int	  false       "服务组开关,枚举值:1:开启,0:关闭 ,默认关闭"
+// @Param   ContractButtonType   query   string	  false       "开关类型,:`新签`,`续约`,`收入` 多个用英文逗号隔开, "
+// @Param   StartDate   query   string	  false       "开始时间 "
+// @Param   EndDate   query   string	  false       "结束时间 "
+// @Param   IsExport   query   bool  false       "是否导出excel,默认是false"
+// @Success 200 {object} statistic_report.RaiDataSummaryListResp
+// @router /rai_data_summary/list [get]
+func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
+	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
+	}
+
+	dataType := this.GetString("DataType")
+	adminId := this.GetString("AdminId")
+	serviceAdminId := this.GetString("ServiceAdminId")
+	startYear, _ := this.GetInt("StartYear")
+	endYear, _ := this.GetInt("EndYear")
+	developButton, _ := this.GetBool("DevelopButton")
+	serverButton, _ := this.GetBool("ServerButton")
+	startDate := this.GetString("StartDate")
+	endDate := this.GetString("EndDate")
+
+	adminIdArr := strings.Split(adminId, ",")
+	serviceAdminIdArr := strings.Split(serviceAdminId, ",")
+	if adminId == "" {
+		adminIdArr = make([]string, 0)
+	}
+	if serviceAdminId == "" {
+		serviceAdminIdArr = make([]string, 0)
+	}
+
+	dataTypeArr := []string{}
+	if dataType == "季度" {
+		dataTypeArr = []string{"Q1", "Q2", "Q3", "Q4"}
+	} else if dataType == "半年度" {
+		dataTypeArr = []string{"H1", "H2"}
+	} else {
+		dataTypeArr = []string{""}
+	}
+	var condition string
+	var pars []interface{}
+	var conditionEnSeller string // 手动禁用的销售
+
+	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
+
+	sellerListAll, err := system.GetSysUserItemsOrderByCreated(condition, pars)
+	if err != nil {
+		br.Msg = "获取管理账号失败"
+		br.ErrMsg = "获取管理账号失败,Err:" + err.Error()
+		return
+	}
+
+	for _, v := range sellerListAll {
+		if strings.Contains(v.RealName, "6") {
+			mapsellerService[v.AdminId] = true
+			sellerServiceIds = append(sellerServiceIds, strconv.Itoa(v.AdminId))
+		} else {
+			mapsellerDevelop[v.AdminId] = true
+			sellerIds = append(sellerIds, strconv.Itoa(v.AdminId))
+		}
+	}
+
+	condition = " AND role_type_code IN ('rai_seller','rai_group') AND enabled = 1 AND  rai_enabled = 1  " + conditionEnSeller
+
+	if adminId != "" {
+		serviceAdminId = ""
+		condition += " AND  admin_id IN (" + adminId + ") "
+		sellerIds = make([]string, 0)
+	}
+	if serviceAdminId != "" {
+		condition += " AND  admin_id IN (" + serviceAdminId + ") "
+		sellerServiceIds = make([]string, 0)
+	}
+
+	if developButton && !serverButton && adminId == "" && serviceAdminId == "" { //开拓组筛选条件
+		condition += " AND  real_name   NOT LIKE '%6%' "
+	}
+
+	if !developButton && serverButton && adminId == "" && serviceAdminId == "" { //服务组筛选条件
+		condition += " AND  real_name   LIKE '%6%' "
+	}
+
+	sellerList, err := system.GetSysUserItemsOrderByCreated(condition, pars)
+	if err != nil {
+		br.Msg = "获取管理账号失败"
+		br.ErrMsg = "获取管理账号失败,Err:" + err.Error()
+		return
+	}
+
+	var sellerDevelop []*system.AdminItem     // 开拓组销售
+	var sellerService []*system.AdminItem     // 服务组销售
+	var sellerDevelopIds = make(map[int]bool) // 开拓组销售的map
+	mapsellerId := make(map[int]bool)         // 权益销售map
+	for _, v := range sellerList {
+		if strings.Contains(v.RealName, "6") {
+			sellerService = append(sellerService, v)
+		} else {
+			sellerDevelop = append(sellerDevelop, v)
+			sellerDevelopIds[v.AdminId] = true
+		}
+		mapsellerId[v.AdminId] = true
+	}
+
+	var isCustomizeDate bool // 是否有自定义的时间
+	//拼接起始时间查询
+	if startDate == "" {
+		startDate = fmt.Sprintf("%d-01-01", startYear)
+		endDate = fmt.Sprintf("%d-12-31", endYear)
+	} else {
+		isCustomizeDate = true
+		startYear = 1
+		endYear = 1
+		dataTypeArr = []string{""}
+	}
+
+	//新签部分的数据
+	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 = '新签合同'  AND a.contract_type != '打分派点'  "
+	parsRai = append(parsRai, startDate, endDate)
+	listRaiData, err := statistic_report.GetRaiDataSummaryList(conditionRai, parsRai)
+	if err != nil {
+		br.Msg = "获取数据信息失败"
+		br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
+		return
+	}
+	var companyContractIds []int
+	for _, v := range listRaiData {
+		companyContractIds = append(companyContractIds, v.CompanyId)
+	}
+	companyContractIds = append(companyContractIds, 0)
+
+	//续约部分的数据
+	var conditionInherit string
+	var parsInherit []interface{}
+	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 != '打分派点'  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 {
+		br.Msg = "获取数据信息失败"
+		br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
+		return
+	}
+
+	//确认不续约、到期合同部分的数据
+	var conditionEnd string
+	var parsEnd []interface{}
+	conditionEnd = " AND  c.product_id = 2  AND  a.status = 1 AND a.contract_type != '打分派点'  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 {
+		br.Msg = "获取数据信息失败"
+		br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
+		return
+	}
+
+	var conditionConfirm string
+	var parsConfirm []interface{}
+	mapNoRenewedcompanyContractIds := make(map[int]bool) //已经确定未续约的合同ID
+	conditionConfirm = "  AND a.company_ascribe_id != 9  AND b.contract_type != '打分派点' "
+	companyConfirmList, err := company.GetCompanyContractNoRenewedAscribeListJoin(conditionConfirm, parsConfirm, 0, 0)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,GetCompanyNoRenewedAscribeList Err:" + err.Error()
+		return
+	}
+	for _, v := range companyConfirmList {
+		mapNoRenewedcompanyContractIds[v.CompanyContractId] = true
+	}
+
+	mapAddTrialNum := make(map[string]float64)                      // 新增试用-(数据)
+	mapNewContractMoney := make(map[string]float64)                 // 新签合同(金额)
+	mapNewContractNum := make(map[string]int)                       // 新签合同(数量)
+	mapExpiredContractMoney := make(map[string]float64)             // 到期合同(金额)
+	mapExpiredContractNum := make(map[string]int)                   // 到期合同(数量)
+	mapExpiredContractCompanyNum := make(map[string]int)            // 到期公司(数量)
+	mapRenewedContractMoney := make(map[string]float64)             // 续约合同(金额)
+	mapRenewedContractNum := make(map[string]int)                   // 续约合同(数量)
+	mapRenewedContractCompanyNum := make(map[string]int)            // 续约公司(数量)
+	confirmedNoRenewalContractMoney := make(map[string]float64)     // 确认不续约合同(金额)
+	confirmedNoRenewalContractNum := make(map[string]int)           // 确认不续约合同(数量)
+	confirmedNoRenewalContractCompanyNum := make(map[string]int)    // 确认不续约公司(数量)
+	mapSignedClientNum := make(map[string]int)                      // 签约客户(数量)
+	mapSignedClientMoney := make(map[string]float64)                // 签约客户(金额)
+	mapInvoiceAmountMoney := make(map[string]float64)               // 财务系统开票金额(金额)
+	mapPaymentAmountMoney := make(map[string]float64)               // 财务系统到款金额(金额)
+	mapNewCustomerInvoicingMoney := make(map[string]float64)        // 财务系统新客开票金额(金额)
+	mapNewCustomerPaymentsReceivedMoney := make(map[string]float64) // 财务系统新客到款金额(金额)
+
+	mapNewContractMoneyServer := make(map[string]float64)              // 新签合同(金额)
+	mapNewContractNumServer := make(map[string]int)                    // 新签合同(数量)
+	mapExpiredContractMoneyServer := make(map[string]float64)          // 到期合同(金额)
+	mapExpiredContractNumServer := make(map[string]int)                // 到期合同(数量)_服务组
+	mapExpiredContractCompanyNumServer := make(map[string]int)         // 到期公司(数量)_服务组
+	mapRenewedContractMoneyServer := make(map[string]float64)          // 续约合同(金额)_服务组
+	mapRenewedContractNumServer := make(map[string]int)                // 续约合同(数量)_服务组
+	mapRenewedContractCompanyNumServer := make(map[string]int)         // 续约公司(数量)_服务组
+	confirmedNoRenewalContractMoneyServer := make(map[string]float64)  // 确认不续约合同(金额)_服务组
+	confirmedNoRenewalContractNumServer := make(map[string]int)        // 确认不续约合同(数量)_服务组
+	confirmedNoRenewalContractCompanyNumServer := make(map[string]int) // 确认不续约公司(数量)_服务组
+	mapSignedClientNumServer := make(map[string]int)                   // 签约客户(数量)
+	mapSignedClientMoneyServer := make(map[string]float64)             // 签约客户(金额)
+
+	var keyMap string
+	var keyMapTtoal string
+	var keyMapTtoalServer string
+	var keyMapCompany string
+	var keyMapCompanyTotal string
+	var keyMapCompanyNo string
+	//var keyMapCompanyNoServer string
+	var keySigned string
+
+	mapCompanyData := make(map[string]bool)
+
+	//新签部分的数据(开拓组)
+	for _, v := range listRaiData {
+		if !mapsellerDevelop[v.SellerIdInit] {
+			continue
+		}
+		yearStr := getYearStar(utils.StrDateToDate(v.StartDate), dataType, isCustomizeDate)
+
+		keyMap = fmt.Sprint(yearStr, "_", v.SellerIdInit)
+		keySigned = fmt.Sprint(yearStr, "_CID_", v.CompanyId, "_SID_", v.SellerIdInit)
+		keyMapTtoal = fmt.Sprint(yearStr, "_Develop")
+
+		if v.RaiContractType == "新签合同" {
+			mapNewContractMoney[keyMap] += v.Money
+			mapNewContractNum[keyMap]++
+			mapNewContractMoney[keyMapTtoal] += v.Money
+			mapNewContractNum[keyMapTtoal]++
+		}
+
+		mapSignedClientMoney[keyMap] += v.Money
+		mapSignedClientMoney[keyMapTtoal] += v.Money
+
+		if !mapCompanyData[keySigned] && v.RaiContractType == "新签合同" {
+			mapSignedClientNum[keyMap]++
+			mapSignedClientNum[keyMapTtoal]++
+			mapCompanyData[keySigned] = true
+		}
+	}
+
+	//新签部分的数据(服务组)
+	for _, v := range listRaiData {
+		if !mapsellerService[v.ShareSellerIdInit] {
+			continue
+		}
+		yearStr := getYearStar(utils.StrDateToDate(v.StartDate), dataType, isCustomizeDate)
+
+		keyMap = fmt.Sprint(yearStr, "_Server_", v.ShareSellerIdInit)
+		keySigned = fmt.Sprint(yearStr, "_Server_", v.CompanyId, "_SID_", v.ShareSellerIdInit)
+		keyMapTtoal = fmt.Sprint(yearStr, "_Server_")
+
+		if v.RaiContractType == "新签合同" {
+			mapNewContractMoneyServer[keyMap] += v.Money
+			mapNewContractNumServer[keyMap]++
+			mapNewContractMoneyServer[keyMapTtoal] += v.Money
+			mapNewContractNumServer[keyMapTtoal]++
+		}
+
+		mapSignedClientMoneyServer[keyMap] += v.Money
+		mapSignedClientMoneyServer[keyMapTtoal] += v.Money
+
+		if !mapCompanyData[keySigned] && v.RaiContractType == "新签合同" {
+			mapSignedClientNumServer[keyMap]++
+			mapSignedClientNumServer[keyMapTtoal]++
+			mapCompanyData[keySigned] = true
+		}
+	}
+
+	//续约部分的数据(开拓组)
+	mapKeyMapCompanyData := make(map[string]bool)
+	for _, v := range listInheritData {
+		if len(adminIdArr) > 0 && !utils.InArrayByStr(adminIdArr, strconv.Itoa(v.SellerIdLast)) {
+			continue
+		}
+		if !mapsellerDevelop[v.SellerIdLast] {
+			continue
+		}
+		yearStr := getYearStar(utils.StrDateToDate(v.InheritEndDate), dataType, isCustomizeDate)
+
+		keyMap = fmt.Sprint(yearStr, "_", v.SellerIdLast)
+		keyMapCompany = fmt.Sprint(yearStr, "_", v.SellerIdLast, "_CID_", v.CompanyId)
+		keySigned = fmt.Sprint(yearStr, "_CID_", v.CompanyId, "_SID_", v.SellerIdLast)
+		keyMapTtoal = fmt.Sprint(yearStr, "_Develop")
+
+		//续约合同 数据
+		mapRenewedContractMoney[keyMap] += v.Money
+		mapRenewedContractMoney[keyMapTtoal] += v.Money
+		mapRenewedContractNum[keyMap]++
+		mapRenewedContractNum[keyMapTtoal]++
+
+		//续约公司 数据
+		if !mapKeyMapCompanyData[keyMapCompany] {
+			mapRenewedContractCompanyNum[keyMap]++
+			mapRenewedContractCompanyNum[keyMapTtoal]++
+			mapKeyMapCompanyData[keyMapCompany] = true
+		}
+
+		//签约合同 数据
+		mapSignedClientMoney[keyMap] += v.Money
+		mapSignedClientMoney[keyMapTtoal] += v.Money
+
+		if !mapCompanyData[keySigned] {
+			mapSignedClientNum[keyMap]++
+			mapSignedClientNum[keyMapTtoal]++
+			mapCompanyData[keySigned] = true
+		}
+	}
+
+	//续约部分的数据(服务组)
+	for _, v := range listInheritData {
+		if len(serviceAdminIdArr) > 0 && !utils.InArrayByStr(serviceAdminIdArr, strconv.Itoa(v.ShareSellerIdInit)) {
+			continue
+		}
+		if !mapsellerService[v.ShareSellerIdInit] {
+			continue
+		}
+		yearStr := getYearStar(utils.StrDateToDate(v.InheritEndDate), dataType, isCustomizeDate)
+
+		keyMap = fmt.Sprint(yearStr, "_Server_", v.ShareSellerIdInit)
+		keyMapCompany = fmt.Sprint(yearStr, "_Server_", v.ShareSellerIdInit, "_CID_", v.CompanyId)
+		keySigned = fmt.Sprint(yearStr, "_Server_", v.CompanyId, "_SID_", v.ShareSellerIdInit)
+		keyMapTtoal = fmt.Sprint(yearStr, "_Server_")
+
+		//续约合同 数据
+		mapRenewedContractMoneyServer[keyMap] += v.Money
+		mapRenewedContractMoneyServer[keyMapTtoal] += v.Money
+		mapRenewedContractNumServer[keyMap]++
+		mapRenewedContractNumServer[keyMapTtoal]++
+
+		//续约公司 数据
+		if !mapKeyMapCompanyData[keyMapCompany] {
+			mapRenewedContractCompanyNumServer[keyMap]++
+			mapRenewedContractCompanyNumServer[keyMapTtoal]++
+			mapKeyMapCompanyData[keyMapCompany] = true
+		}
+
+		////签约合同 数据
+		mapSignedClientMoneyServer[keyMap] += v.Money
+		mapSignedClientMoneyServer[keyMapTtoal] += v.Money
+
+		if !mapCompanyData[keySigned] {
+			mapSignedClientNumServer[keyMap]++
+			mapSignedClientNumServer[keyMapTtoal]++
+			mapCompanyData[keySigned] = true
+		}
+	}
+
+	//确认不续约、到期合同部分的数据
+	mapKeyMapCompanyEndData := make(map[string]bool)
+	mapKeyMapCompanyEndDataTotal := make(map[string]bool)
+	mapKeyMapCompanyNoData := make(map[string]bool)
+	//到期部分开拓组数据
+	for _, v := range listEndData {
+		if len(adminIdArr) > 0 && !utils.InArrayByStr(adminIdArr, strconv.Itoa(v.SellerIdLast)) {
+			continue
+		}
+		if !mapsellerDevelop[v.SellerIdLast] {
+			continue
+		}
+		yearStr := getYearStar(utils.StrDateToDate(v.DueEndDate), dataType, isCustomizeDate)
+
+		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")
+
+		//到期合同数据
+		mapExpiredContractMoney[keyMap] += v.Money
+		mapExpiredContractMoney[keyMapTtoal] += v.Money
+
+		//一家公司同一个时间纬度,只统计一次
+		mapExpiredContractNum[keyMap]++
+		mapExpiredContractNum[keyMapTtoal]++
+
+		//一家公司同一个时间纬度,只统计一次
+		if !mapKeyMapCompanyEndData[keyMapCompany] {
+			mapExpiredContractCompanyNum[keyMap]++
+			mapKeyMapCompanyEndData[keyMapCompany] = true
+		}
+		if !mapKeyMapCompanyEndDataTotal[keyMapCompanyTotal] { //同一家共公司,在某个时段的多分合同下有不同的销售进行兼容
+			mapExpiredContractCompanyNum[keyMapTtoal]++
+			mapKeyMapCompanyEndDataTotal[keyMapCompanyTotal] = true
+		}
+
+		if mapNoRenewedcompanyContractIds[v.CompanyContractId] { // 确认不续约合同
+			confirmedNoRenewalContractMoney[keyMap] += v.Money
+			confirmedNoRenewalContractMoney[keyMapTtoal] += v.Money
+
+			//一家公司同一个时间纬度,只统计一次
+			confirmedNoRenewalContractNum[keyMap]++
+			confirmedNoRenewalContractNum[keyMapTtoal]++
+
+			if !mapKeyMapCompanyNoData[keyMapCompanyNo] {
+				confirmedNoRenewalContractCompanyNum[keyMap]++
+				confirmedNoRenewalContractCompanyNum[keyMapTtoal]++
+				mapKeyMapCompanyNoData[keyMapCompanyNo] = true
+			}
+		}
+	}
+
+	//到期部分服务组数据
+	for _, v := range listEndData {
+		if len(serviceAdminIdArr) > 0 && !utils.InArrayByStr(serviceAdminIdArr, strconv.Itoa(v.ShareSellerIdLast)) {
+			continue
+		}
+		if !mapsellerService[v.ShareSellerIdLast] {
+			continue
+		}
+		yearStr := getYearStar(utils.StrDateToDate(v.DueEndDate), dataType, isCustomizeDate)
+
+		keyMap = fmt.Sprint(yearStr, "_Server_", v.ShareSellerIdLast)
+		keyMapCompany = fmt.Sprint(yearStr, "_Server_", v.ShareSellerIdLast, "_CID_", v.CompanyId)
+		keyMapCompanyNo = fmt.Sprint(yearStr, "_Server_", v.ShareSellerIdLast, "_CID_NO", v.CompanyId)
+		keyMapTtoal = fmt.Sprint(yearStr, "_Server_")
+
+		//到期合同数据
+		mapExpiredContractMoneyServer[keyMap] += v.Money
+		mapExpiredContractMoneyServer[keyMapTtoal] += v.Money
+		mapExpiredContractNumServer[keyMap]++
+		mapExpiredContractNumServer[keyMapTtoal]++
+
+		//一家公司同一个时间纬度,只统计一次
+		if !mapKeyMapCompanyEndData[keyMapCompany] {
+			mapExpiredContractCompanyNumServer[keyMap]++
+			mapExpiredContractCompanyNumServer[keyMapTtoal]++
+			mapKeyMapCompanyEndData[keyMapCompany] = true
+		}
+
+		if mapNoRenewedcompanyContractIds[v.CompanyContractId] { // 确认不续约合同
+			confirmedNoRenewalContractMoneyServer[keyMap] += v.Money
+			confirmedNoRenewalContractMoneyServer[keyMapTtoal] += v.Money
+
+			//一家公司同一个时间纬度,只统计一次
+			confirmedNoRenewalContractNumServer[keyMap]++
+			confirmedNoRenewalContractNumServer[keyMapTtoal]++
+
+			if !mapKeyMapCompanyNoData[keyMapCompanyNo] {
+				confirmedNoRenewalContractCompanyNumServer[keyMap]++
+				confirmedNoRenewalContractCompanyNumServer[keyMapTtoal]++
+				mapKeyMapCompanyNoData[keyMapCompanyNo] = true
+			}
+		}
+	}
+
+	listFmsData, err := fms.GetContractRegisterListByStartDate(startDate, endDate)
+	if err != nil {
+		br.Msg = "获取数据信息失败"
+		br.ErrMsg = "获取财务系统数据信息失败,Err:" + err.Error()
+		return
+	}
+
+	//开拓组财务系统数据
+	for _, v := range listFmsData {
+		if len(adminIdArr) > 0 && !utils.InArrayByStr(adminIdArr, strconv.Itoa(v.RaiSellerId)) {
+			continue
+		}
+		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 || v.InvoiceType == 3 {
+			mapInvoiceAmountMoney[keyMap] += v.Amount
+			mapInvoiceAmountMoney[keyMapTtoal] += v.Amount
+			if v.ContractType == 1 {
+				mapNewCustomerInvoicingMoney[keyMap] += v.Amount
+				mapNewCustomerInvoicingMoney[keyMapTtoal] += v.Amount
+			}
+		}
+
+		//到款记录
+		if v.InvoiceType == 2 || v.InvoiceType == 4 {
+			mapPaymentAmountMoney[keyMap] += v.Amount
+			mapPaymentAmountMoney[keyMapTtoal] += v.Amount
+			if v.ContractType == 1 {
+				mapNewCustomerPaymentsReceivedMoney[keyMap] += v.Amount
+				mapNewCustomerPaymentsReceivedMoney[keyMapTtoal] += v.Amount
+			}
+		}
+	}
+
+	//服务组财务系统数据
+	for _, v := range listFmsData {
+		if len(serviceAdminIdArr) > 0 && !utils.InArrayByStr(serviceAdminIdArr, strconv.Itoa(v.RaiSellerId)) {
+			continue
+		}
+		if !mapsellerService[v.RaiSellerId] {
+			continue
+		}
+		yearStr := getYearStar(utils.StrDateToDate(v.InvoiceTime), dataType, isCustomizeDate)
+
+		keyMap = fmt.Sprint(yearStr, "_Server_", v.RaiSellerId)
+		keyMapTtoal = fmt.Sprint(yearStr, "_Server_")
+
+		//开票记录
+		if v.InvoiceType == 1 || v.InvoiceType == 3 {
+			mapInvoiceAmountMoney[keyMap] += v.Amount
+			mapInvoiceAmountMoney[keyMapTtoal] += v.Amount
+			if v.ContractType == 1 {
+				mapNewCustomerInvoicingMoney[keyMap] += v.Amount
+				mapNewCustomerInvoicingMoney[keyMapTtoal] += v.Amount
+			}
+		}
+
+		//到款记录
+		if v.InvoiceType == 2 || v.InvoiceType == 4 {
+			mapPaymentAmountMoney[keyMap] += v.Amount
+			mapPaymentAmountMoney[keyMapTtoal] += v.Amount
+			if v.ContractType == 1 {
+				mapNewCustomerPaymentsReceivedMoney[keyMap] += v.Amount
+				mapNewCustomerPaymentsReceivedMoney[keyMapTtoal] += v.Amount
+			}
+		}
+	}
+
+	conditionTry := ` AND a.create_time >= ? AND a.create_time <= ? AND a.operation in ( "add","receive","apply_receive" )  AND a.sys_user_id IN ( SELECT  admin_id FROM admin  WHERE  role_type_code IN ( 'rai_seller', 'rai_group' , 'rai_admin') ` + conditionEnSeller + ` ) `
+	var parsTry []interface{}
+	parsTry = append(parsTry, startDate, endDate)
+	//列表页数据
+	tryList, err := models.GetIncrementalCompanyListByOperationRecordRai(conditionTry, parsTry, 0, 9999)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	for _, v := range tryList {
+		sysUserId := v.SysUserId
+		if !mapsellerService[sysUserId] && !mapsellerDevelop[sysUserId] {
+			continue
+		}
+
+		startDateTime := utils.StrTimeToTime(v.CreateTime)
+		monthNum := startDateTime.Month()
+		yearStr := strconv.Itoa(startDateTime.Year())
+		if dataType == "季度" {
+			if monthNum < 4 {
+				yearStr += "Q1"
+			} else if monthNum > 3 && monthNum < 7 {
+				yearStr += "Q2"
+			} else if monthNum > 6 && monthNum < 10 {
+				yearStr += "Q3"
+			} else if monthNum > 9 {
+				yearStr += "Q4"
+			}
+		} else if dataType == "半年度" {
+			if monthNum < 7 {
+				yearStr += "H1"
+			} else {
+				yearStr += "H2"
+			}
+		}
+		if isCustomizeDate {
+			yearStr = ""
+		}
+
+		keyMap = fmt.Sprint(yearStr, "_", v.SysUserId)
+		mapAddTrialNum[keyMap]++
+
+		//var keyMapTtoal string
+
+		if mapsellerDevelop[sysUserId] == true {
+			keyMapTtoal = fmt.Sprint(yearStr, "_Develop")
+		} else {
+			keyMapTtoal = fmt.Sprint(yearStr, "_Server_")
+		}
+		mapAddTrialNum[keyMapTtoal]++
+	}
+
+	resp := new(statistic_report.RaiDataSummaryListResp)
+	var items []*statistic_report.RaiDataSummaryResp
+
+	for i := startYear; i <= endYear; i++ {
+		for _, Dv := range dataTypeArr {
+			item := new(statistic_report.RaiDataSummaryResp)
+			if isCustomizeDate {
+				item.DataType = "" //传了自定义时间之后,把key值,置空
+			} else {
+				item.DataType = fmt.Sprint(i, Dv)
+			}
+			keyMapTtoal = fmt.Sprint(item.DataType, "_Develop")
+			keyMapTtoalServer = fmt.Sprint(item.DataType, "_Server_")
+			for _, vS := range sellerDevelop {
+				keyMap = fmt.Sprint(item.DataType, "_", vS.AdminId)
+				sellerItem := new(statistic_report.RaiDataSummaryDetail)
+				sellerItem.SellerId = strconv.Itoa(vS.AdminId)
+				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]) // "续约合同(金额/数量)-(数据)"
+				var renewalRateMoey string
+				var renewalRateNum string
+				if mapRenewedContractMoney[keyMap] == 0 || mapExpiredContractMoney[keyMap] == 0 {
+					renewalRateMoey = "0%"
+				} else {
+					renewalRateMoey = utils.SubFloatToString(mapRenewedContractMoney[keyMap]/mapExpiredContractMoney[keyMap]*100, 2) + "%"
+				}
+				if mapRenewedContractCompanyNum[keyMap] == 0 || mapExpiredContractCompanyNum[keyMap] == 0 {
+					renewalRateNum = "0%"
+				} 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]) //"确认不续约合同(金额/数量)-(数据)"
+
+				var confirmNonRenewalRateMoey string
+				var confirmNonRenewalRateNum string
+				if confirmedNoRenewalContractMoney[keyMap] == 0 || mapExpiredContractMoney[keyMap] == 0 {
+					confirmNonRenewalRateMoey = "0%"
+				} else {
+					confirmNonRenewalRateMoey = utils.SubFloatToString(confirmedNoRenewalContractMoney[keyMap]/mapExpiredContractMoney[keyMap]*100, 2) + "%"
+				}
+				if confirmedNoRenewalContractCompanyNum[keyMap] == 0 || mapExpiredContractCompanyNum[keyMap] == 0 {
+					confirmNonRenewalRateNum = "0%"
+				} else {
+					confirmNonRenewalRateNum = utils.SubFloatToString(float64(confirmedNoRenewalContractCompanyNum[keyMap])/float64(mapExpiredContractCompanyNum[keyMap])*100, 2) + "%"
+				}
+				sellerItem.ConfirmNonRenewalRateData = fmt.Sprint(confirmNonRenewalRateMoey, " / ", confirmNonRenewalRateNum) //确认不续约率(金额/数量)-(数据)"
+
+				sellerItem.SignedClientCount = fmt.Sprint(mapSignedClientNum[keyMap]) // 签约客户数量
+				if mapSignedClientNum[keyMap] == 0 || mapSignedClientMoney[keyMap] == 0 {
+					sellerItem.AverageRevenueCount = "0"
+				} else {
+					sellerItem.AverageRevenueCount = utils.SubFloatToString(mapSignedClientMoney[keyMap]/float64(mapSignedClientNum[keyMap]), 2) //客单价
+				}
+
+				sellerItem.InvoiceAmountCount = utils.SubFloatToString(mapInvoiceAmountMoney[keyMap], 2)   //"开票金额-(数据)"
+				sellerItem.PaymentReceivedCount = utils.SubFloatToString(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) // "新客到款-(数据)"
+				if developButton || serverButton || adminId != "" {
+					item.DataList = append(item.DataList, sellerItem)
+				}
+			}
+
+			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]) // "续约合同(金额/数量)-(数据)"
+				var renewalRateMoey string
+				var renewalRateNum string
+				if mapRenewedContractMoney[keyMapTtoal] == 0 || mapExpiredContractMoney[keyMapTtoal] == 0 {
+					renewalRateMoey = "0%"
+				} else {
+					renewalRateMoey = utils.SubFloatToString(mapRenewedContractMoney[keyMapTtoal]/mapExpiredContractMoney[keyMapTtoal]*100, 2) + "%"
+				}
+				if mapRenewedContractCompanyNum[keyMapTtoal] == 0 || mapExpiredContractCompanyNum[keyMapTtoal] == 0 {
+					renewalRateNum = "0%"
+				} 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]) //"确认不续约合同(金额/数量)-(数据)"
+
+				var confirmNonRenewalRateMoey string
+				var confirmNonRenewalRateNum string
+				if confirmedNoRenewalContractMoney[keyMapTtoal] == 0 || mapExpiredContractMoney[keyMapTtoal] == 0 {
+					confirmNonRenewalRateMoey = "0%"
+				} else {
+					confirmNonRenewalRateMoey = utils.SubFloatToString(confirmedNoRenewalContractMoney[keyMapTtoal]/mapExpiredContractMoney[keyMapTtoal]*100, 2) + "%"
+				}
+				if confirmedNoRenewalContractCompanyNum[keyMapTtoal] == 0 || mapExpiredContractCompanyNum[keyMapTtoal] == 0 {
+					confirmNonRenewalRateNum = "0%"
+				} else {
+					confirmNonRenewalRateNum = utils.SubFloatToString(float64(confirmedNoRenewalContractCompanyNum[keyMapTtoal])/float64(mapExpiredContractCompanyNum[keyMapTtoal])*100, 2) + "%"
+				}
+				sellerItem.ConfirmNonRenewalRateData = fmt.Sprint(confirmNonRenewalRateMoey, " / ", confirmNonRenewalRateNum) //确认不续约率(金额/数量)-(数据)"
+
+				sellerItem.SignedClientCount = fmt.Sprint(mapSignedClientNum[keyMapTtoal]) // 签约客户数量
+				if mapSignedClientNum[keyMapTtoal] == 0 || mapSignedClientMoney[keyMapTtoal] == 0 {
+					sellerItem.AverageRevenueCount = "0"
+				} else {
+					sellerItem.AverageRevenueCount = utils.SubFloatToString(mapSignedClientMoney[keyMapTtoal]/float64(mapSignedClientNum[keyMapTtoal]), 2) //客单价
+				}
+
+				sellerItem.InvoiceAmountCount = utils.SubFloatToString(mapInvoiceAmountMoney[keyMapTtoal], 2)   //"开票金额-(数据)"
+				sellerItem.PaymentReceivedCount = utils.SubFloatToString(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) // "新客到款-(数据)"
+				item.DataList = append(item.DataList, sellerItem)
+			}
+
+			for _, vS := range sellerService {
+				keyMap = fmt.Sprint(item.DataType, "_Server_", vS.AdminId)
+				sellerItem := new(statistic_report.RaiDataSummaryDetail)
+				sellerItem.IsServerSeller = true
+				sellerItem.SellerId = strconv.Itoa(vS.AdminId)
+				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]) // "续约合同(金额/数量)-(数据)"
+				var renewalRateMoey string
+				var renewalRateNum string
+				if mapRenewedContractMoneyServer[keyMap] == 0 || mapExpiredContractMoneyServer[keyMap] == 0 {
+					renewalRateMoey = "0%"
+				} else {
+					renewalRateMoey = utils.SubFloatToString(mapRenewedContractMoneyServer[keyMap]/mapExpiredContractMoneyServer[keyMap]*100, 2) + "%"
+				}
+				if mapRenewedContractCompanyNumServer[keyMap] == 0 || mapExpiredContractCompanyNumServer[keyMap] == 0 {
+					renewalRateNum = "0%"
+				} 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]) //"确认不续约合同(金额/数量)-(数据)"
+
+				var confirmNonRenewalRateMoey string
+				var confirmNonRenewalRateNum string
+				if confirmedNoRenewalContractMoneyServer[keyMap] == 0 || mapExpiredContractMoneyServer[keyMap] == 0 {
+					confirmNonRenewalRateMoey = "0%"
+				} else {
+					confirmNonRenewalRateMoey = utils.SubFloatToString(confirmedNoRenewalContractMoneyServer[keyMap]/mapExpiredContractMoneyServer[keyMap]*100, 2) + "%"
+				}
+				if confirmedNoRenewalContractCompanyNumServer[keyMap] == 0 || mapExpiredContractCompanyNumServer[keyMap] == 0 {
+					confirmNonRenewalRateNum = "0%"
+				} else {
+					confirmNonRenewalRateNum = utils.SubFloatToString(float64(confirmedNoRenewalContractCompanyNumServer[keyMap])/float64(mapExpiredContractCompanyNumServer[keyMap])*100, 2) + "%"
+				}
+				sellerItem.ConfirmNonRenewalRateData = fmt.Sprint(confirmNonRenewalRateMoey, " / ", confirmNonRenewalRateNum) //确认不续约率(金额/数量)-(数据)"
+
+				sellerItem.SignedClientCount = fmt.Sprint(mapSignedClientNumServer[keyMap]) // 签约客户数量
+				if mapSignedClientNumServer[keyMap] == 0 || mapSignedClientMoneyServer[keyMap] == 0 {
+					sellerItem.AverageRevenueCount = "0"
+				} else {
+					sellerItem.AverageRevenueCount = utils.SubFloatToString(mapSignedClientMoneyServer[keyMap]/float64(mapSignedClientNumServer[keyMap]), 2) //客单价
+				}
+
+				sellerItem.InvoiceAmountCount = utils.SubFloatToString(mapInvoiceAmountMoney[keyMap], 2)   //"开票金额-(数据)"
+				sellerItem.PaymentReceivedCount = utils.SubFloatToString(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) // "新客到款-(数据)"
+				if developButton || serverButton || serviceAdminId != "" {
+					item.DataList = append(item.DataList, sellerItem)
+				}
+			}
+			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]) // "续约合同(金额/数量)-(数据)"
+				var renewalRateMoey string
+				var renewalRateNum string
+				if mapRenewedContractMoneyServer[keyMapTtoalServer] == 0 || mapExpiredContractMoneyServer[keyMapTtoalServer] == 0 {
+					renewalRateMoey = "0%"
+				} else {
+					renewalRateMoey = utils.SubFloatToString(mapRenewedContractMoneyServer[keyMapTtoalServer]/mapExpiredContractMoneyServer[keyMapTtoalServer]*100, 2) + "%"
+				}
+				if mapRenewedContractCompanyNumServer[keyMapTtoalServer] == 0 || mapExpiredContractCompanyNumServer[keyMapTtoalServer] == 0 {
+					renewalRateNum = "0%"
+				} 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]) //"确认不续约合同(金额/数量)-(数据)"
+
+				var confirmNonRenewalRateMoey string
+				var confirmNonRenewalRateNum string
+				if confirmedNoRenewalContractMoneyServer[keyMapTtoalServer] == 0 || mapExpiredContractMoneyServer[keyMapTtoalServer] == 0 {
+					confirmNonRenewalRateMoey = "0%"
+				} else {
+					confirmNonRenewalRateMoey = utils.SubFloatToString(confirmedNoRenewalContractMoneyServer[keyMapTtoalServer]/mapExpiredContractMoneyServer[keyMapTtoalServer]*100, 2) + "%"
+				}
+				if confirmedNoRenewalContractCompanyNumServer[keyMapTtoalServer] == 0 || mapExpiredContractCompanyNumServer[keyMapTtoalServer] == 0 {
+					confirmNonRenewalRateNum = "0%"
+				} else {
+					confirmNonRenewalRateNum = utils.SubFloatToString(float64(confirmedNoRenewalContractCompanyNumServer[keyMapTtoalServer])/float64(mapExpiredContractCompanyNumServer[keyMapTtoalServer])*100, 2) + "%"
+				}
+				sellerItem.ConfirmNonRenewalRateData = fmt.Sprint(confirmNonRenewalRateMoey, " / ", confirmNonRenewalRateNum) //确认不续约率(金额/数量)-(数据)"
+
+				sellerItem.SignedClientCount = fmt.Sprint(mapSignedClientNumServer[keyMapTtoalServer]) // 签约客户数量
+				if mapSignedClientNumServer[keyMapTtoalServer] == 0 || mapSignedClientMoneyServer[keyMapTtoalServer] == 0 {
+					sellerItem.AverageRevenueCount = "0"
+				} else {
+					sellerItem.AverageRevenueCount = utils.SubFloatToString(mapSignedClientMoneyServer[keyMapTtoalServer]/float64(mapSignedClientNumServer[keyMapTtoalServer]), 2) //客单价
+				}
+
+				sellerItem.InvoiceAmountCount = utils.SubFloatToString(mapInvoiceAmountMoney[keyMapTtoalServer], 2)   //"开票金额-(数据)"
+				sellerItem.PaymentReceivedCount = utils.SubFloatToString(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) // "新客到款-(数据)"
+				item.DataList = append(item.DataList, sellerItem)
+			}
+			items = append(items, item)
+		}
+	}
+	resp.List = items
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// MergeCompanyList
+// @Title 权益数据汇总弹窗详情
+// @Description 权益数据汇总弹窗详情接口
+// @Param   SellerId   query   int  true       "销售ID"
+// @Param   DataType   query   string  false       "报表类型,枚举值:`季度`,`年度`,`半年度`"
+// @Param   PopupType   query   string	  false       "弹窗数据类型,枚举值:"
+// @Param   IsServerSeller   query   bool	  false       "是否属于服务组销售"
+// @Param   StartDate   query   string	  false       "开始时间 "
+// @Param   EndDate   query   string	  false       "结束时间 "
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Success 200 {object} statistic_report.RaiDataSummaryPopupTypeResp
+// @router /rai_data_summary/detail [get]
+func (this *StatisticRaiDataSummaryController) RaiDataSummaryDetail() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	dataType := this.GetString("DataType")
+	sellerId := this.GetString("SellerId")
+	popupType := this.GetString("PopupType")
+	isServerSeller, _ := this.GetBool("IsServerSeller")
+	startDate := this.GetString("StartDate")
+	endDate := this.GetString("EndDate")
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+
+	//var startDate string
+	//var endDate string
+	if startDate == "" {
+		year := (dataType[:4])
+		if strings.Contains(dataType, "Q1") {
+			startDate = year + "-01-01"
+			endDate = year + "-03-31"
+		} else if strings.Contains(dataType, "Q2") {
+			startDate = year + "-04-01"
+			endDate = year + "-06-30"
+		} else if strings.Contains(dataType, "Q3") {
+			startDate = year + "-07-01"
+			endDate = year + "-09-30"
+		} else if strings.Contains(dataType, "Q4") {
+			startDate = year + "-10-01"
+			endDate = year + "-12-31"
+		} else if strings.Contains(dataType, "H1") {
+			startDate = year + "-01-01"
+			endDate = year + "-06-31"
+		} else if strings.Contains(dataType, "H2") {
+			startDate = year + "-07-01"
+			endDate = year + "-12-31"
+		} else {
+			startDate = year + "-01-01"
+			endDate = year + "-12-31"
+		}
+	}
+
+	resp := new(statistic_report.RaiDataSummaryPopupTypeResp)
+	var listResp []*statistic_report.RaiDataSummaryDetailResp
+	var listGroup []*models.CompanyContractGroupList
+	var trialTotal int
+
+	var condition string
+	var pars []interface{}
+
+	//新签合同的ID
+	var companyContractIdsNew []int
+	{
+		var conditionNew string
+		var parsNew []interface{}
+		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 = '新签合同'  AND a.contract_type != '打分派点' "
+		parsNew = append(parsNew, startDate, endDate)
+		listNewData, err := statistic_report.GetRaiDataSummaryList(conditionNew, parsNew)
+		if err != nil {
+			br.Msg = "获取数据信息失败"
+			br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
+			return
+		}
+		for _, v := range listNewData {
+			companyContractIdsNew = append(companyContractIdsNew, v.CompanyId)
+		}
+	}
+	companyContractIdsNew = append(companyContractIdsNew, 0)
+	lenArrCompany := len(companyContractIdsNew)
+
+	switch popupType {
+	case "新增试用":
+		var parsTry []interface{}
+		var conditionTry string
+		if sellerId != "" {
+			conditionTry += ` AND a.sys_user_id IN (` + sellerId + `) `
+		}
+		conditionTry += ` AND a.create_time >= ? AND a.create_time <= ? AND a.operation in ( "add","receive","apply_receive" )  AND a.sys_user_id IN ( SELECT  admin_id FROM admin  WHERE  role_type_code IN ( 'rai_seller', 'rai_group' , 'rai_admin') ) `
+
+		parsTry = append(parsTry, startDate, endDate)
+		total, err := models.GetIncrementalCompanyCountByOperationRecordRai(conditionTry, parsTry)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取新增试用客户数量失败,Err:" + err.Error()
+			return
+		}
+		trialTotal = total
+
+		//列表页数据
+		tryList, err := models.GetIncrementalCompanyListByOperationRecordRai(conditionTry, parsTry, startSize, pageSize)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		if len(tryList) > 0 {
+			for _, v := range tryList {
+				item := new(statistic_report.RaiDataSummaryDetailResp)
+				v.SellerName = v.SysRealName
+				if v.Operation == "add" {
+					item.AddType = "新建"
+				} else if v.Operation == "receive" || v.Operation == "apply_receive" {
+					item.AddType = "领取"
+				}
+				item.CompanyId = v.CompanyId
+				item.CompanyName = v.CompanyName
+				item.SellerName = v.SellerName
+				item.CreateTime = v.CreateTime
+				listResp = append(listResp, item)
+			}
+		}
+
+	case "新签合同":
+		if sellerId != "" {
+			if isServerSeller {
+				condition += ` AND a.share_seller_id_init IN (` + sellerId + `) `
+			} else {
+				condition += ` AND a.seller_id_init IN (` + sellerId + `) `
+			}
+
+		}
+
+		condition += ` AND  a.status = 1  AND a.start_date >= ?  AND a.start_date <= ? 	AND a.product_id = 2   AND a.contract_type != '打分派点' `
+		pars = append(pars, startDate, endDate)
+		condition += `  AND a.rai_contract_type = ? `
+		pars = append(pars, "新签合同")
+
+		total, err := company.GetIncrementalNewCompanyProductMergeCount(condition, pars)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		trialTotal = total
+		//列表页数据
+		tmpList, err := models.GetIncrementalCompanyMergeList(condition, pars, startSize, pageSize)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		if len(tmpList) > 0 {
+			var companyContractIds []int
+			for _, v := range tmpList {
+				companyContractIds = append(companyContractIds, v.CompanyContractId)
+			}
+
+			//合并合同所对应的权限
+			mappermissionName, err := cygxService.GetCompanyContractPermissionNameMapById(companyContractIds)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取失败,Err:" + err.Error()
+				return
+			}
+			for _, v := range tmpList {
+				item := new(statistic_report.RaiDataSummaryDetailResp)
+				item.CompanyId = v.CompanyId
+				item.CompanyName = v.CompanyName
+				if isServerSeller {
+					item.SellerName = v.ShareSeller
+				} else {
+					item.SellerName = v.SellerNameInit
+				}
+				item.StartDate = v.StartDate
+				item.EndDate = v.EndDate
+				item.Money = v.Money
+				item.PermissionName = mappermissionName[v.CompanyContractId]
+				listResp = append(listResp, item)
+			}
+
+			listGroup, err = models.GetCompanyContractGroupList(condition, pars)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取失败,Err:" + err.Error()
+				return
+			}
+
+		}
+
+	case "到期合同":
+
+		if sellerId != "" {
+			if isServerSeller {
+				condition += ` AND a.share_seller_id_last  IN (` + sellerId + `) `
+			} 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 < ?  AND a.contract_type != '打分派点' `
+		pars = append(pars, startDate, endDate, time.Now().Format(utils.FormatDate))
+
+		total, err := company.GetIncrementalNewCompanyProductMergeCount(condition, pars)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		trialTotal = total
+		//列表页数据
+		tmpList, err := models.GetIncrementalCompanyMergeListEnd(condition, pars, startSize, pageSize)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		if len(tmpList) > 0 {
+			var companyContractIds []int
+			for _, v := range tmpList {
+				companyContractIds = append(companyContractIds, v.CompanyContractId)
+			}
+
+			//合并合同所对应的权限
+			mappermissionName, err := cygxService.GetCompanyContractPermissionNameMapById(companyContractIds)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取失败,Err:" + err.Error()
+				return
+			}
+			for _, v := range tmpList {
+				item := new(statistic_report.RaiDataSummaryDetailResp)
+				item.CompanyId = v.CompanyId
+				item.CompanyName = v.CompanyName
+				if isServerSeller {
+					item.SellerName = v.ShareSellerLast
+				} else {
+					item.SellerName = v.SellerNameLast
+				}
+				item.StartDate = v.StartDate
+				item.EndDate = v.EndDate
+				item.Money = v.Money
+				item.PermissionName = mappermissionName[v.CompanyContractId]
+				listResp = append(listResp, item)
+			}
+			listGroup, err = models.GetCompanyContractGroupList(condition, pars)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取失败,Err:" + err.Error()
+				return
+			}
+		}
+
+	case "续约合同":
+		if sellerId != "" {
+			if isServerSeller {
+				condition += ` AND a.share_seller_id_init  IN (` + sellerId + `) `
+			} else {
+				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.contract_type != '打分派点'  AND a.company_contract_id NOT  IN (` + utils.GetOrmInReplace(lenArrCompany) + `)  `
+		pars = append(pars, startDate, endDate, companyContractIdsNew)
+
+		total, err := company.GetIncrementalNewCompanyProductMergeCount(condition, pars)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		trialTotal = total
+		//列表页数据
+		tmpList, err := models.GetIncrementalCompanyMergeList(condition, pars, startSize, pageSize)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		if len(tmpList) > 0 {
+			var companyContractIds []int
+			for _, v := range tmpList {
+				companyContractIds = append(companyContractIds, v.CompanyContractId)
+			}
+
+			//合并合同所对应的权限
+			mappermissionName, err := cygxService.GetCompanyContractPermissionNameMapById(companyContractIds)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取失败,Err:" + err.Error()
+				return
+			}
+			for _, v := range tmpList {
+				item := new(statistic_report.RaiDataSummaryDetailResp)
+				item.CompanyId = v.CompanyId
+				item.CompanyName = v.CompanyName
+				if isServerSeller {
+					item.SellerName = v.ShareSellerInit
+				} else {
+					item.SellerName = v.SellerNameInit
+				}
+				item.StartDate = v.StartDate
+				item.EndDate = v.EndDate
+				item.Money = v.Money
+				item.PermissionName = mappermissionName[v.CompanyContractId]
+				listResp = append(listResp, item)
+			}
+			listGroup, err = models.GetCompanyContractGroupList(condition, pars)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取失败,Err:" + err.Error()
+				return
+			}
+		}
+
+	case "续约率":
+		var conditionEnd string
+		var parsEnd []interface{}
+		if sellerId != "" {
+			if isServerSeller {
+				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 + `) `
+				conditionEnd += ` AND a.seller_id_last  IN (` + sellerId + `) `
+			}
+		}
+
+		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 != '打分派点' 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 {
+			br.Msg = "获取数据信息失败"
+			br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
+			return
+		}
+
+		//到期合同数据
+		conditionEnd += ` AND  a.status = 1   AND a.contract_type != '打分派点' 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 {
+			br.Msg = "获取数据信息失败"
+			br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
+			return
+		}
+
+		var renewedContractMoney float64   // 续约金额
+		var renewedContractCompany float64 // 续约客户数
+		maprenewedContractCompany := make(map[int]bool)
+
+		var expiredContractMoney float64   //到期金额
+		var expiredContractCompany float64 // 到期客户数
+		mapexpiredContractCompany := make(map[int]bool)
+
+		for _, v := range listRaiData {
+			renewedContractMoney += v.Money
+			if !maprenewedContractCompany[v.CompanyId] {
+				renewedContractCompany++
+				maprenewedContractCompany[v.CompanyId] = true
+			}
+			//startDateTime := utils.StrDateToDate(v.StartDate)
+			//if startDateTime.Before(time.Now().AddDate(0, 0, -1)) { //到期合同数据
+			//	expiredContractMoney += v.Money
+			//	if !mapexpiredContractCompany[v.CompanyId] {
+			//		expiredContractCompany++
+			//		mapexpiredContractCompany[v.CompanyId] = true
+			//	}
+			//}
+		}
+
+		for _, v := range listEndData {
+			expiredContractMoney += v.Money
+			if !mapexpiredContractCompany[v.CompanyId] {
+				expiredContractCompany++
+				mapexpiredContractCompany[v.CompanyId] = true
+			}
+		}
+
+		item := new(statistic_report.RaiDataSummaryDetailResp)
+		item.TbaleNameAText = "金额续约率"
+		item.RenewedContractMoney = fmt.Sprint(utils.SubFloatToString(renewedContractMoney, 2))
+		item.ExpiredContractMoney = fmt.Sprint(utils.SubFloatToString(expiredContractMoney, 2))
+		if renewedContractMoney == 0 || expiredContractMoney == 0 {
+			item.RenewalRate = "0%"
+		} else {
+			item.RenewalRate = fmt.Sprint(utils.SubFloatToString(renewedContractMoney/expiredContractMoney*100, 2), "%")
+		}
+
+		listResp = append(listResp, item)
+
+		item2 := new(statistic_report.RaiDataSummaryDetailResp)
+		item2.TbaleNameAText = "客户续约率"
+		item2.RenewedContractMoney = fmt.Sprint(renewedContractCompany)
+		item2.ExpiredContractMoney = fmt.Sprint(expiredContractCompany)
+		if renewedContractCompany == 0 || expiredContractCompany == 0 {
+			item2.RenewalRate = "0%"
+		} else {
+			item2.RenewalRate = fmt.Sprint(utils.SubFloatToString(renewedContractCompany/expiredContractCompany*100, 2), "%")
+		}
+
+		listResp = append(listResp, item2)
+
+	case "确认不续约合同":
+		noRenewedcompanyContractIds := services.GetCompanyContractNoRenewedAscribeListArr()
+		condition += ` AND  a.company_contract_id IN (` + utils.GetOrmInReplace(len(noRenewedcompanyContractIds)) + `)  ` // 已确认
+		pars = append(pars, noRenewedcompanyContractIds)
+		if sellerId != "" {
+			if isServerSeller {
+				condition += ` AND a.share_seller_id_last  IN (` + sellerId + `) `
+			} else {
+				condition += ` AND a.seller_id_last  IN (` + sellerId + `) `
+			}
+		}
+		condition += ` AND  a.product_id = 2  AND  a.status = 1 AND a.contract_type != '打分派点'  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)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		trialTotal = total
+		//列表页数据
+		tmpList, err := models.GetIncrementalCompanyMergeList(condition, pars, startSize, pageSize)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		if len(tmpList) > 0 {
+			var companyContractIds []int
+			for _, v := range tmpList {
+				companyContractIds = append(companyContractIds, v.CompanyContractId)
+			}
+
+			//合并合同所对应的权限
+			mappermissionName, err := cygxService.GetCompanyContractPermissionNameMapById(companyContractIds)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取失败,Err:" + err.Error()
+				return
+			}
+			for _, v := range tmpList {
+				item := new(statistic_report.RaiDataSummaryDetailResp)
+				item.CompanyId = v.CompanyId
+				item.CompanyName = v.CompanyName
+				if isServerSeller {
+					item.SellerName = v.ShareSellerLast
+				} else {
+					item.SellerName = v.SellerNameLast
+				}
+
+				item.StartDate = v.StartDate
+				item.EndDate = v.EndDate
+				item.Money = v.Money
+				item.PermissionName = mappermissionName[v.CompanyContractId]
+				listResp = append(listResp, item)
+			}
+
+			listGroup, err = models.GetCompanyContractGroupList(condition, pars)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取失败,Err:" + err.Error()
+				return
+			}
+
+		}
+
+	case "确认不续约率":
+		noRenewedcompanyContractIdsMap := services.GetCompanyContractNoRenewedAscribeListMap()
+		var conditionEnd string
+		var parsEnd []interface{}
+		if sellerId != "" {
+			if isServerSeller {
+				//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 + `) `
+				conditionEnd += ` AND a.seller_id_last  IN (` + sellerId + `) `
+			}
+
+		}
+
+		//condition += ` AND  a.product_id = 2  AND  a.status = 1 AND a.contract_type != '打分派点'  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.contract_type != '打分派点'  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 {
+			br.Msg = "获取数据信息失败"
+			br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
+			return
+		}
+
+		var norenewedContractMoney float64   // 不续约金额
+		var norenewedContractCompany float64 // 不续约客户数
+		mapnorenewedContractCompany := make(map[int]bool)
+
+		var expiredContractMoney float64   //到期金额
+		var expiredContractCompany float64 // 到期客户数
+		mapexpiredContractCompany := make(map[int]bool)
+
+		for _, v := range listEndData {
+			if noRenewedcompanyContractIdsMap[v.CompanyContractId] {
+				norenewedContractMoney += v.Money
+				if !mapnorenewedContractCompany[v.CompanyId] {
+					norenewedContractCompany++
+					mapnorenewedContractCompany[v.CompanyId] = true
+				}
+			}
+		}
+
+		for _, v := range listEndData {
+			expiredContractMoney += v.Money
+			if !mapexpiredContractCompany[v.CompanyId] {
+				expiredContractCompany++
+				mapexpiredContractCompany[v.CompanyId] = true
+			}
+		}
+
+		item := new(statistic_report.RaiDataSummaryDetailResp)
+		item.TbaleNameAText = "金额不续约率"
+		item.RenewedContractMoney = fmt.Sprint(utils.SubFloatToString(norenewedContractMoney, 2))
+		item.ExpiredContractMoney = fmt.Sprint(utils.SubFloatToString(expiredContractMoney, 2))
+		if norenewedContractMoney == 0 || expiredContractMoney == 0 {
+			item.RenewalRate = "0%"
+		} else {
+			item.RenewalRate = fmt.Sprint(utils.SubFloatToString(norenewedContractMoney/expiredContractMoney*100, 2), "%")
+		}
+		listResp = append(listResp, item)
+
+		item2 := new(statistic_report.RaiDataSummaryDetailResp)
+		item2.TbaleNameAText = "客户不续约率"
+		item2.RenewedContractMoney = fmt.Sprint(norenewedContractCompany)
+		item2.ExpiredContractMoney = fmt.Sprint(expiredContractCompany)
+		if norenewedContractCompany == 0 || expiredContractCompany == 0 {
+			item2.RenewalRate = "0%"
+		} else {
+			item2.RenewalRate = fmt.Sprint(utils.SubFloatToString(norenewedContractCompany/expiredContractCompany*100, 2), "%")
+		}
+		listResp = append(listResp, item2)
+
+	case "签约客户数量":
+		var conditionInherit string
+		var parsInherit []interface{}
+		if sellerId != "" {
+			if isServerSeller {
+				condition += ` AND a.share_seller_id_init  IN (` + sellerId + `) `
+				conditionInherit += ` AND a.share_seller_id_last  IN (` + sellerId + `) `
+			} else {
+				condition += ` AND a.seller_id_init IN (` + sellerId + `) `
+				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 = '新签合同' AND a.contract_type != '打分派点' "
+		pars = append(pars, startDate, endDate)
+		listRaiData, err := statistic_report.GetRaiDataSummaryList(condition, pars)
+		if err != nil {
+			br.Msg = "获取数据信息失败"
+			br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
+			return
+		}
+
+		//续约部分的数据
+		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 != '打分派点'  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 {
+			br.Msg = "获取数据信息失败"
+			br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
+			return
+		}
+
+		var renewedContractCompany int // 续约客户数
+		var renewedContract int        // 续约合同数
+		maprenewedContractCompany := make(map[int]bool)
+
+		var newContractCompany int // 新签客户数
+		var newContract int        // 新签合同数
+		mapenewContractCompany := make(map[int]bool)
+		for _, v := range listRaiData {
+			if v.RaiContractType == "新签合同" {
+				newContract++
+				if !mapenewContractCompany[v.CompanyId] {
+					newContractCompany++
+					mapenewContractCompany[v.CompanyId] = true
+				}
+			}
+			//else if v.RaiContractType == "续约合同" {
+			//	renewedContract++
+			//	if !maprenewedContractCompany[v.CompanyId] {
+			//		renewedContractCompany++
+			//		maprenewedContractCompany[v.CompanyId] = true
+			//	}
+			//}
+		}
+
+		for _, v := range listInheritData {
+			renewedContract++
+			if !maprenewedContractCompany[v.CompanyId] {
+				renewedContractCompany++
+				maprenewedContractCompany[v.CompanyId] = true
+			}
+
+		}
+
+		item := new(statistic_report.RaiDataSummaryDetailResp)
+		item.RenewedContractCompany = renewedContractCompany
+		item.RenewedContract = renewedContract
+		item.NewContractCompany = newContractCompany
+		item.NewContract = newContract
+		listResp = append(listResp, item)
+
+	case "客单价":
+		//续约部分的数据
+		var conditionInherit string
+		var parsInherit []interface{}
+		if sellerId != "" {
+			if isServerSeller {
+				condition += ` AND a.share_seller_id_init  IN (` + sellerId + `) `
+				conditionInherit += ` AND a.share_seller_id_last  IN (` + sellerId + `) `
+			} else {
+				condition += ` AND a.seller_id_init  IN (` + sellerId + `) `
+				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 = '新签合同'  AND a.contract_type != '打分派点' "
+		pars = append(pars, startDate, endDate)
+		listRaiData, err := statistic_report.GetRaiDataSummaryList(condition, pars)
+		if err != nil {
+			br.Msg = "获取数据信息失败"
+			br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
+			return
+		}
+
+		var ontractMoney float64 // 签约总金额
+		var contractNum int      // 签约客户数
+		mapCompany := make(map[int]bool)
+
+		for _, v := range listRaiData {
+			if v.RaiContractType != "新签合同" {
+				continue
+			}
+			ontractMoney += v.Money
+			if !mapCompany[v.CompanyId] {
+				contractNum++
+				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.contract_type != '打分派点'  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 {
+			br.Msg = "获取数据信息失败"
+			br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
+			return
+		}
+
+		for _, v := range listInheritData {
+			ontractMoney += v.Money
+			if !mapCompany[v.CompanyId] && v.RaiContractType == "续约合同" {
+				contractNum++
+				mapCompany[v.CompanyId] = true
+			}
+		}
+
+		item := new(statistic_report.RaiDataSummaryDetailResp)
+		item.ContractMoney = fmt.Sprint(utils.SubFloatToString(ontractMoney, 2))
+		item.ContractNum = contractNum
+		listResp = append(listResp, item)
+
+	case "开票金额":
+		if sellerId != "" {
+			condition += ` AND a.seller_id  IN (` + sellerId + `) `
+		}
+		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() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		trialTotal = total
+		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()
+			return
+		}
+		if len(listFmsData) > 0 {
+			for _, v := range listFmsData {
+				item := new(statistic_report.RaiDataSummaryDetailResp)
+				item.CompanyName = v.CompanyName
+				item.SellerName = v.SellerName
+				item.ContractCode = v.ContractCode
+				item.InvoicedAmount = v.Amount
+				item.CreateTime = v.InvoiceTime
+				listResp = append(listResp, item)
+			}
+		}
+
+	case "到款金额":
+		if sellerId != "" {
+			condition += ` AND a.seller_id  IN (` + sellerId + `) `
+		}
+		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() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		trialTotal = total
+		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 = "获取数据信息失败"
+			br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
+			return
+		}
+		if len(listFmsData) > 0 {
+			for _, v := range listFmsData {
+				item := new(statistic_report.RaiDataSummaryDetailResp)
+				item.CompanyName = v.CompanyName
+				item.SellerName = v.SellerName
+				item.ContractCode = v.ContractCode
+				item.PaymentAmount = v.Amount
+				item.CreateTime = v.InvoiceTime
+				listResp = append(listResp, item)
+			}
+		}
+
+	case "未到款比例":
+		if sellerId != "" {
+			condition += ` AND a.seller_id  IN (` + sellerId + `) `
+		}
+		var condition2 string
+		var pars2 []interface{}
+		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.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 {
+			br.Msg = "获取数据信息失败"
+			br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
+			return
+		}
+
+		amount2, err := fms.GetContractInvoiceAmountCount(condition2, pars2) //到款金额总计
+		if err != nil {
+			br.Msg = "获取数据信息失败"
+			br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
+			return
+		}
+
+		item := new(statistic_report.RaiDataSummaryDetailResp)
+		item.InvoicedAmount = amount1
+		item.PaymentAmount = amount2
+		item.NotReceivedtAmount = amount1 - amount2
+		listResp = append(listResp, item)
+
+	case "新客开票":
+		if sellerId != "" {
+			condition += ` AND a.seller_id  IN (` + sellerId + `) `
+		}
+		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() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		trialTotal = total
+		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()
+			return
+		}
+		if len(listFmsData) > 0 {
+			for _, v := range listFmsData {
+				item := new(statistic_report.RaiDataSummaryDetailResp)
+				item.CompanyName = v.CompanyName
+				item.SellerName = v.SellerName
+				item.ContractCode = v.ContractCode
+				item.InvoicedAmount = v.Amount
+				item.CreateTime = v.InvoiceTime
+				listResp = append(listResp, item)
+			}
+		}
+
+	case "新客到款":
+		if sellerId != "" {
+			condition += ` AND a.seller_id  IN (` + sellerId + `) `
+		}
+		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() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		trialTotal = total
+		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()
+			return
+		}
+		if len(listFmsData) > 0 {
+			for _, v := range listFmsData {
+				item := new(statistic_report.RaiDataSummaryDetailResp)
+				item.CompanyName = v.CompanyName
+				item.SellerName = v.SellerName
+				item.ContractCode = v.ContractCode
+				item.PaymentAmount = v.Amount
+				item.CreateTime = v.InvoiceTime
+				listResp = append(listResp, item)
+			}
+		}
+
+	}
+
+	if len(listResp) == 0 {
+		listResp = make([]*statistic_report.RaiDataSummaryDetailResp, 0)
+	}
+	if len(listGroup) > 0 {
+		for _, v := range listGroup {
+			if v.CompanyCount > 1 {
+				resp.CompanyMultiple++
+			}
+		}
+		resp.CompanyNum = len(listGroup)
+	}
+	resp.List = listResp
+	page := paging.GetPaging(currentIndex, pageSize, trialTotal)
+	resp.Paging = page
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// 时间筛选项的转换
+func getYearStar(startDate time.Time, dataType string, isCustomizeDate bool) (yearStr string) {
+	if isCustomizeDate {
+		return //如果有自定的时间,就传空值
+	}
+	startDateTime := startDate
+	monthNum := startDateTime.Month()
+	yearStr = strconv.Itoa(startDateTime.Year())
+	if dataType == "季度" {
+		if monthNum < 4 {
+			yearStr += "Q1"
+		} else if monthNum > 3 && monthNum < 7 {
+			yearStr += "Q2"
+		} else if monthNum > 6 && monthNum < 10 {
+			yearStr += "Q3"
+		} else if monthNum > 9 {
+			yearStr += "Q4"
+		}
+	} else if dataType == "半年度" {
+		if monthNum < 7 {
+			yearStr += "H1"
+		} else {
+			yearStr += "H2"
+		}
+	}
+	return
+}

+ 129 - 17
controllers/statistic_company_merge.go

@@ -44,6 +44,7 @@ type StatisticCompanyMergerController struct {
 // @Param   IsConfirm   query   int  false       "是否确认续约: -1-默认全部; 0-待确认; 1-已确认 ;2-到期合同"
 // @Param   CompanyAscribeId   query   int  false       "归因ID"
 // @Param   PackageDifference   query   string  false       "和上一份合同的区别,枚举值:`增加套餐`,`减少套餐`,`维持套餐`"
+// @Param   Operation   query   string  false       "新增类型 ,枚举值:`新建`,`领取`"
 // @Success 200 {object} response.IncrementalCompanyListResp
 // @router /merge_company_list [get]
 func (this *StatisticCompanyMergerController) MergeCompanyList() {
@@ -71,6 +72,7 @@ func (this *StatisticCompanyMergerController) MergeCompanyList() {
 	tryOutType := this.GetString("TryOutType")
 	keyword := this.GetString("Keyword")
 	packageDifference := this.GetString("PackageDifference")
+	operation := this.GetString("Operation")
 
 	startDate := this.GetString("StartDate")
 	endDate := this.GetString("EndDate")
@@ -214,19 +216,28 @@ func (this *StatisticCompanyMergerController) MergeCompanyList() {
 
 	//试用客户数
 	{
+		var operationSql string
+		if operation == "新建" {
+			operationSql = ` "add" `
+		} else if operation == "领取" {
+			operationSql = ` "receive","apply_receive"  `
+		} else {
+			operationSql = ` "add","receive","apply_receive"  `
+		}
 		condition1 := condition
 		pars1 := pars
 		//销售筛选条件
 		if adminId != "" {
-			condition1 += ` AND c.seller_id in  (` + adminId + `) `
+			condition1 += ` AND a.sys_user_id in  (` + adminId + `) `
 		} else {
 			condition1, pars1 = getQueryParams(condition1, pars1, sysUser, "c.")
 		}
-		condition1 += ` AND a.create_time >= ? AND a.create_time <= ? AND a.operation in ("add","receive")  	AND b.company_id  NOT IN  (	SELECT  company_id  FROM company_operation_record WHERE   product_id = 2 	AND  operation  ="loss"   GROUP BY company_id )  AND c.status = '试用' `
+		//condition1 += ` AND a.create_time >= ? AND a.create_time <= ? AND a.operation in (` + operationSql + `)  	AND b.company_id  NOT IN  (	SELECT  company_id  FROM company_operation_record WHERE   product_id = 2 	AND  operation  ="loss"   GROUP BY company_id ) 	AND a.sys_user_id IN ( SELECT  admin_id FROM admin  WHERE  role_type_code IN ( 'rai_seller', 'rai_group' , 'rai_admin') ) `
+		condition1 += ` AND a.create_time >= ? AND a.create_time <= ? AND a.operation in (` + operationSql + `)  AND a.sys_user_id IN ( SELECT  admin_id FROM admin  WHERE  role_type_code IN ( 'rai_seller', 'rai_group' , 'rai_admin') ) `
 		pars1 = append(pars1, startDate, endDate)
 
-		total, err := models.GetIncrementalCompanyCountByOperationRecord(condition1, pars1)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		total, err := models.GetIncrementalCompanyCountByOperationRecordRai(condition1, pars1)
+		if err != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取失败,Err:" + err.Error()
 			return
@@ -235,25 +246,32 @@ func (this *StatisticCompanyMergerController) MergeCompanyList() {
 
 		if dataType == "新增试用" {
 			//列表数据数量
-			total, err := models.GetIncrementalCompanyProductCountByOperationRecord(condition1, pars1)
-			if err != nil && err.Error() != utils.ErrNoRow() {
-				br.Msg = "获取失败"
-				br.ErrMsg = "获取失败,Err:" + err.Error()
-				return
-			}
+			//total, err := models.GetIncrementalCompanyProductCountByOperationRecord(condition1, pars1)
+			//if err != nil {
+			//	br.Msg = "获取失败"
+			//	br.ErrMsg = "获取失败,Err:" + err.Error()
+			//	return
+			//}
+
+			//total = trialTotal
 
 			//列表页数据
-			tmpList, err := models.GetIncrementalCompanyListByOperationRecord(condition1, pars1, startSize, pageSize)
+			tmpList, err := models.GetIncrementalCompanyListByOperationRecordRai(condition1, pars1, startSize, pageSize)
 			if err != nil {
 				br.Msg = "获取失败"
 				br.ErrMsg = "获取失败,Err:" + err.Error()
 				return
 			}
 			for _, v := range tmpList {
-				v.SellerName = v.SellerNameInit
+				v.SellerName = v.SysRealName
+				if v.Operation == "add" {
+					v.Operation = "新建"
+				} else if v.Operation == "receive" || v.Operation == "apply_receive" {
+					v.Operation = "领取"
+				}
 			}
 			list = tmpList
-			dataTotal = total
+			dataTotal = trialTotal
 		}
 	}
 
@@ -391,7 +409,7 @@ func (this *StatisticCompanyMergerController) MergeCompanyList() {
 		}
 		notRenewalCompanyTotal = total
 
-		notRenewalCompanyToBeConfirmTotal, err = company.GetIncrementalRenewalCompanyProductMergeCount(notRenewalToBeCondition, notRenewalToBePars)
+		notRenewalCompanyToBeConfirmTotal, err = company.GetIncrementalRenewalCompanyProductMergeCount(notRenewalToBeCondition+` AND a.not_renewal_hide = 0  AND c.status not in ("永续","正式","关闭") `, notRenewalToBePars)
 		if err != nil && err.Error() != utils.ErrNoRow() {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取失败,Err:" + err.Error()
@@ -399,8 +417,7 @@ func (this *StatisticCompanyMergerController) MergeCompanyList() {
 		}
 
 		if isConfirm != 2 {
-			condition1 += `  AND a.not_renewal_hide = 0 `
-			condition1 += ` AND c.status not in ("永续","正式","关闭")  `
+			condition1 += `  AND a.not_renewal_hide = 0  AND c.status not in ("永续","正式","关闭") `
 		}
 
 		//if isConfirm == 1 {
@@ -535,7 +552,11 @@ func (this *StatisticCompanyMergerController) MergeCompanyList() {
 	//fmt.Println()
 	//导出excel
 	if isExport {
-		MergeCompanyListListExport(this, dataType, resp, br)
+		if dataType == "新增试用" {
+			MergeCompanyListListTrialExport(this, dataType, resp, br)
+		} else {
+			MergeCompanyListListExport(this, dataType, resp, br)
+		}
 		return
 	}
 	br.Ret = 200
@@ -720,6 +741,97 @@ func MergeCompanyListListExport(this *StatisticCompanyMergerController, dataType
 	br.Msg = "导出成功"
 }
 
+// MergeCompanyListListTrialExport 导出增量客户新增试用模块数据报表excel
+func MergeCompanyListListTrialExport(this *StatisticCompanyMergerController, dataType string, resp response.IncrementalCompanyListResp, br *models.BaseResponse) {
+	dir, err := os.Executable()
+	exPath := filepath.Dir(dir)
+	downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
+	xlsxFile := xlsx.NewFile()
+	if err != nil {
+		br.Msg = "生成文件失败"
+		br.ErrMsg = "生成文件失败"
+		return
+	}
+	style := xlsx.NewStyle()
+	alignment := xlsx.Alignment{
+		Horizontal: "center",
+		Vertical:   "center",
+		WrapText:   true,
+	}
+
+	style.Alignment = alignment
+	style.ApplyAlignment = true
+
+	sheel, err := xlsxFile.AddSheet("新增试用客户数据")
+	if err != nil {
+		br.Msg = "新增Sheet失败"
+		br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
+		return
+	}
+	sheel.SetColWidth(0, 0, 30)
+	sheel.SetColWidth(1, 1, 15)
+	sheel.SetColWidth(2, 2, 15)
+	sheel.SetColWidth(3, 3, 18)
+	sheel.SetColWidth(4, 4, 40)
+	sheel.SetColWidth(5, 5, 18)
+
+	//统计数据
+	statisticRow := sheel.AddRow()
+
+	cell1 := statisticRow.AddCell()
+	cell1.SetStyle(style)
+	cell1.SetValue("客户名称")
+
+	cell2 := statisticRow.AddCell()
+	cell2.SetStyle(style)
+	cell2.SetValue("所属销售")
+
+	cell3 := statisticRow.AddCell()
+	cell3.SetStyle(style)
+	cell3.SetValue("新增类型")
+
+	cell4 := statisticRow.AddCell()
+	cell4.SetStyle(style)
+	cell4.SetValue("新增时间")
+	//表头
+
+	for _, v := range resp.List {
+		dataRow := sheel.AddRow()
+		dataRow.SetHeight(20)
+
+		cellDataName := dataRow.AddCell()
+		cellDataName.SetStyle(style)
+		cellDataName.SetValue(v.CompanyName)
+
+		cellDataSellerName := dataRow.AddCell()
+		cellDataSellerName.SetStyle(style)
+		cellDataSellerName.SetValue(v.SellerName)
+
+		cellDataOperation := dataRow.AddCell()
+		cellDataOperation.SetStyle(style)
+		cellDataOperation.SetValue(v.Operation)
+
+		cellDataTime := dataRow.AddCell()
+		cellDataTime.SetStyle(style)
+		cellDataTime.SetValue(v.CreateTime)
+	}
+	err = xlsxFile.Save(downLoadnFilePath)
+	if err != nil {
+		br.Msg = "保存文件失败"
+		br.ErrMsg = "保存文件失败"
+		return
+	}
+	randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
+	downloadFileName := "新增试用客户数据_" + randStr + ".xlsx"
+	this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
+	defer func() {
+		os.Remove(downLoadnFilePath)
+	}()
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "导出成功"
+}
+
 // @Title 上一份合同详情
 // @Description 上一份合同详情接口
 // @Param   CompanyContractId   query   int  true       "合同ID"

+ 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

+ 7 - 6
go.mod

@@ -32,6 +32,7 @@ require (
 	github.com/tealeg/xlsx v1.0.5
 	github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.541
 	github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ses v1.0.541
+	github.com/wechatpay-apiv3/wechatpay-go v0.2.18
 	github.com/xuri/excelize/v2 v2.6.1
 	github.com/yidane/formula v0.0.0-20210902154546-0782e1736717
 	gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
@@ -63,6 +64,7 @@ require (
 	github.com/fsnotify/fsnotify v1.6.0 // indirect
 	github.com/garyburd/redigo v1.6.3 // indirect
 	github.com/go-redis/redis/v8 v8.11.6-0.20220405070650-99c79f7041fc // indirect
+	github.com/go-resty/resty/v2 v2.16.5 // indirect
 	github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
 	github.com/golang/protobuf v1.5.3 // indirect
 	github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac // indirect
@@ -97,15 +99,14 @@ require (
 	github.com/tidwall/match v1.1.1 // indirect
 	github.com/tidwall/pretty v1.2.0 // indirect
 	github.com/tjfoc/gmsm v1.3.2 // indirect
-	github.com/wechatpay-apiv3/wechatpay-go v0.2.18 // indirect
 	github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 // indirect
 	github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 // indirect
-	golang.org/x/crypto v0.5.0 // indirect
+	golang.org/x/crypto v0.31.0 // indirect
 	golang.org/x/image v0.0.0-20220413100746-70e8d0d3baa9 // indirect
-	golang.org/x/net v0.9.0 // indirect
-	golang.org/x/sys v0.7.0 // indirect
-	golang.org/x/text v0.9.0 // indirect
-	golang.org/x/time v0.0.0-20220609170525-579cf78fd858 // indirect
+	golang.org/x/net v0.33.0 // indirect
+	golang.org/x/sys v0.28.0 // indirect
+	golang.org/x/text v0.21.0 // indirect
+	golang.org/x/time v0.6.0 // indirect
 	google.golang.org/protobuf v1.30.0 // indirect
 	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
 	gopkg.in/ini.v1 v1.67.0 // indirect

+ 13 - 0
go.sum

@@ -13,6 +13,7 @@ github.com/SebastiaanKlippert/go-wkhtmltopdf v1.7.2 h1:LORAatv6KuKheYq8HXehiwx3f
 github.com/SebastiaanKlippert/go-wkhtmltopdf v1.7.2/go.mod h1:TY8r0gmwEL1c5Lbd66NgQCkL4ZjGDJCMVqvbbFvUx20=
 github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
 github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
+github.com/agiledragon/gomonkey v2.0.2+incompatible h1:eXKi9/piiC3cjJD1658mEE2o3NjkJ5vDLgYjCQu0Xlw=
 github.com/agiledragon/gomonkey v2.0.2+incompatible/go.mod h1:2NGfXu1a80LLr2cmWXGBDaHEjb1idR6+FVlX5T3D9hw=
 github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
@@ -153,6 +154,8 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V
 github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
 github.com/go-redis/redis/v8 v8.11.6-0.20220405070650-99c79f7041fc h1:jZY+lpZB92nvBo2f31oPC/ivGll6NcsnEOORm8Fkr4M=
 github.com/go-redis/redis/v8 v8.11.6-0.20220405070650-99c79f7041fc/go.mod h1:25mL1NKxbJhB63ihiK8MnNeTRd+xAizd6bOdydrTLUQ=
+github.com/go-resty/resty/v2 v2.16.5 h1:hBKqmWrr7uRc3euHVqmh1HTHcKn99Smr7o5spptdhTM=
+github.com/go-resty/resty/v2 v2.16.5/go.mod h1:hkJtXbA2iKHzJheXYvQ8snQES5ZLGKMwQ07xAwp/fiA=
 github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
 github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
 github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
@@ -454,6 +457,8 @@ golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0
 golang.org/x/crypto v0.0.0-20220817201139-bc19a97f63c8/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE=
 golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU=
+golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
+golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/image v0.0.0-20190501045829-6d32002ffd75/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
 golang.org/x/image v0.0.0-20220413100746-70e8d0d3baa9 h1:LRtI4W37N+KFebI/qV0OFiLUv4GLOWeEW5hn/KEJvxE=
@@ -493,6 +498,8 @@ golang.org/x/net v0.0.0-20220812174116-3211cb980234/go.mod h1:YDH+HFinaLZZlnHAfS
 golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
 golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
 golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
+golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
+golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -536,6 +543,8 @@ golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
 golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
+golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
@@ -549,10 +558,14 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
 golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
+golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20220609170525-579cf78fd858 h1:Dpdu/EMxGMFgq0CeYMh4fazTD2vtlZRYE7wyynxJb9U=
 golang.org/x/time v0.0.0-20220609170525-579cf78fd858/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
+golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
 golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=

+ 48 - 2
models/company/company.go

@@ -42,7 +42,7 @@ type Company struct {
 	IsHide          int       `description:"是否隐藏:0:不隐藏,1:隐藏"`
 	OverseasStatus  string    `description:"海外客户状态:'正式','试用','关闭'"`
 	ResetBtn        int       `description:"转正式和重置按钮:同步过来默认为0:显示转正式为1:显示重置为2"`
-	InteractionNum  int       `description:"互动量"`
+	InteractionNum  int       `description:"用户总的互动量"`
 }
 
 // 新增客户
@@ -965,7 +965,11 @@ func MoveSeller(companyId, productId, sellerId, groupId, departmentId int, selle
 	}()
 
 	startDateTime = time.Now()
-	endDateTime = time.Now().AddDate(0, 2, 0)
+	if productId == utils.COMPANY_PRODUCT_RAI_ID { // 权益客户试用期改为1个月。 需求池 1035
+		endDateTime = time.Now().AddDate(0, 1, 0)
+	} else {
+		endDateTime = time.Now().AddDate(0, 2, 0)
+	}
 
 	startDate := startDateTime.Format(utils.FormatDate)
 	endDate := endDateTime.Format(utils.FormatDate)
@@ -1996,3 +2000,45 @@ func GetOverseasCompanysByCompanyIdsInit() (items []*Company, err error) {
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
+
+// GetCompanyListByCompanyId 根据公司ID获取公司信息
+func GetCompanyListByCompanyId(companyId []int) (items []*Company, err error) {
+	lenArr := len(companyId)
+	if lenArr == 0 {
+		return
+	}
+	o := orm.NewOrm()
+	sql := `SELECT interaction_num , company_id  FROM  company AS a WHERE a.company_id IN (` + utils.GetOrmInReplace(lenArr) + `)   `
+	_, err = o.Raw(sql, companyId).QueryRows(&items)
+	return
+}
+
+type CompanySearchView struct {
+	CompanyId      int    `orm:"column(company_id);pk"`
+	CompanyName    string `description:"客户名称"`
+	CreditCode     string `description:"社会统一信用码"`
+	CompanyCode    string `description:"客户编码"`
+	EnglishCompany int    `description:"是否为英文客户"`
+}
+
+func GetCompanySearchBySeal(productId, sellerId, groupId int, keyWord string) (items []*CompanySearchView, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+				b.company_id,
+				a.company_name,
+				a.credit_code
+			FROM
+				company AS a
+			INNER JOIN company_product AS b ON a.company_id = b.company_id 
+			WHERE
+			     1=1 
+				 AND  b.product_id = ?
+				 AND (b.seller_id = ?  OR b.share_seller_id = ?  OR b.group_id =  ?  ) 
+			  	 AND a.company_name LIKE ?
+			GROUP BY b.company_id `
+	_, err = o.Raw(sql, productId, sellerId, sellerId, groupId, keyWord).QueryRows(&items)
+	if err != nil {
+		return
+	}
+	return
+}

+ 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:"行业下对应的点数"`
 }
 
 // 申请转正请求参数

+ 12 - 1
models/company/company_approval.go

@@ -403,6 +403,9 @@ func FreezeToTryOut(companyId, productId, sellerId, companyApprovalId, applyUser
 	}()
 	startDate = time.Now().Format(utils.FormatDate)
 	endDate = time.Now().AddDate(0, 2, 0).Format(utils.FormatDate)
+	if productId == utils.COMPANY_PRODUCT_RAI_ID { // 权益客户试用期改为1个月。 需求池 1035
+		endDate = time.Now().AddDate(0, 1, 0).Format(utils.FormatDate)
+	}
 
 	//sellerItem, err := system.GetSysAdminById(applyUserId)
 	//if err != nil {
@@ -643,6 +646,9 @@ func TryOutDelay(companyId, productId, sellerId, companyApprovalId int, sellerNa
 		return
 	}
 	newEndDate = endDateTime.AddDate(0, 2, 0).Format(utils.FormatDate)
+	if productId == utils.COMPANY_PRODUCT_RAI_ID { // 权益客户试用期改为1个月。 需求池 1035
+		newEndDate = endDateTime.AddDate(0, 1, 0).Format(utils.FormatDate)
+	}
 	//更新用户产品状态
 	sql := `UPDATE company_product SET approve_status='已审批',is_suspend=0,end_date=?,modify_time=NOW() WHERE company_id=? AND product_id=? `
 	_, err = to.Raw(sql, newEndDate, companyId, productId).Exec()
@@ -767,6 +773,9 @@ func ApplyReceive(companyId, productId, sysUserId, companyApprovalId int, seller
 
 	startDate = time.Now().Format(utils.FormatDate)
 	endDate = time.Now().AddDate(0, 2, 0).Format(utils.FormatDate)
+	if productId == utils.COMPANY_PRODUCT_RAI_ID { // 权益客户试用期改为1个月。 需求池 1035
+		endDate = time.Now().AddDate(0, 1, 0).Format(utils.FormatDate)
+	}
 
 	//更新用户产品状态
 	sql := `UPDATE company_product SET status='试用',try_out_time=NULL,last_description_time=NULL,is_suspend=0,approve_status='已审批', start_date=?,end_date=?,seller_id=?,seller_name=?,group_id=?,department_id=?,modify_time=NOW(),try_stage=1 WHERE company_id=? AND product_id=? `
@@ -1377,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 {
@@ -1425,6 +1434,7 @@ func ModifyCompanyApplyServiceUpdate(item *CompanyApplyServiceUpdateReq, product
 			return
 		}
 		contractPermission.ChartPermissionId = chartPermissionId
+		contractPermission.Points = mapPoints[chartPermissionId]
 
 		contractPermission.StartDate = item.StartDate
 		contractPermission.EndDate = item.EndDate
@@ -1435,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

+ 35 - 1
models/company/company_contract.go

@@ -325,6 +325,8 @@ type CompanyContractResp struct {
 	PackageType       int       `description:"套餐类型,0:无,1:大套餐,2:小套餐"`
 	RaiPackageType    int       `description:"权益套餐类型: 0-无; 1-70w大套餐; 2-45w大套餐"`
 	PermissionName    string    `description:"权限名"`
+	InheritEndDate    string    `description:"所继承上一份合同的结束日期,权益自定义续约合同统计使用"`
+	DueEndDate        string    `description:"所继承上一份合同的结束日期,权益自定义到期合同统计使用"`
 }
 
 // 获取合同列表
@@ -391,7 +393,7 @@ func GetCompanyContracDetail(condition string, pars []interface{}) (item *Compan
 	return
 }
 
-// 通过ID获取详情
+// 通过获取列表详情
 func GetCompanyContracList(condition string, pars []interface{}) (items []*CompanyContractResp, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT * FROM company_contract  WHERE 1= 1 ` + condition
@@ -463,6 +465,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()
@@ -579,3 +589,27 @@ func UpdateCompanyContracthide(companyContractId []string) (err error) {
 	_, err = o.Raw(sql).Exec()
 	return
 }
+
+// 更新续约时间
+func UpdateCompanyContractInheritEndDate(inheritEndDate string, inheritCompanyContracId, companyContractId int) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE company_contract SET inherit_end_date = ? ,inherit_company_contract_id = ?   WHERE company_contract_id=? `
+	_, err = o.Raw(sql, inheritEndDate, inheritCompanyContracId, companyContractId).Exec()
+	return
+}
+
+// 更新到期时间
+func UpdateCompanyContractDueEndDate(dueEndDate string, companyContractId int) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE company_contract SET due_end_date = ?    WHERE company_contract_id=? `
+	_, err = o.Raw(sql, dueEndDate, companyContractId).Exec()
+	return
+}
+
+// 更新到期时间
+func UpdateCompanyContractDueEndDateMerge(inheritEndDate, dueEndDate string, inheritCompanyContracId, mergeCompanyContractId, companyContractId int) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE company_contract SET  inherit_end_date = ? , due_end_date = ?  ,inherit_company_contract_id = ? , merge_company_contract_id = ?   WHERE company_contract_id=? `
+	_, err = o.Raw(sql, inheritEndDate, dueEndDate, inheritCompanyContracId, mergeCompanyContractId, companyContractId).Exec()
+	return
+}

+ 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
+}

+ 59 - 26
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 `
@@ -452,7 +479,7 @@ func GetChartPermissionListByIds(chartPermissionIds []int) (list []*ChartPermiss
 // 根据企业用户id和产品id获取所有正式的权限
 func GetCompanyProductReportPermissionList(companyId, productId int) (items []*CompanyReportPermissionAndName, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT a.*,b.permission_name,b.classify_name FROM company_report_permission a left join chart_permission b on a.chart_permission_id=b.chart_permission_id WHERE a.company_id = ? and a.product_id=? `
+	sql := `SELECT a.*,b.permission_name,b.classify_name FROM company_report_permission a left join chart_permission b on a.chart_permission_id=b.chart_permission_id WHERE a.company_id = ? and a.product_id=?  AND a.status IN ('正式','试用','永续')  `
 	_, err = o.Raw(sql, companyId, productId).QueryRows(&items)
 	return
 }
@@ -464,6 +491,12 @@ func GetCompanyProductReportPermissionLists(companyIds []int, productId int) (it
 	_, err = o.Raw(sql, companyIds, productId).QueryRows(&items)
 	return
 }
+func GetCompanyProductReportPermissionListInit16_0(companyIds []int, productId int) (items []*CompanyReportPermissionAndName, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT a.*,b.permission_name,b.classify_name FROM company_report_permission a left join chart_permission b on a.chart_permission_id=b.chart_permission_id WHERE a.company_id IN (` + utils.GetOrmInReplace(len(companyIds)) + `) and a.product_id=? AND a.status IN ('正式','试用','永续')   `
+	_, err = o.Raw(sql, companyIds, productId).QueryRows(&items)
+	return
+}
 
 // GetChartPermissionListById 根据权限id获取产品权限详情
 func GetChartPermissionListById(chartPermissionId int) (item *ChartPermission, err error) {

+ 6 - 0
models/company/company_seller.go

@@ -29,6 +29,12 @@ type DepartmentGroupSellersResp struct {
 	List []DepartmentGroupSellers
 }
 
+// DepartmentGroupSellersResp 销售列表(根据部门、分组来)
+type DepartmentGroupSellersServerResp struct {
+	List       []DepartmentGroupSellers
+	ListServer []DepartmentGroupSellers //服务组销售
+}
+
 type DepartmentGroupSellers struct {
 	AdminId string `description:"系统用户id"`
 	//AdminName string `description:"系统用户名称"`

+ 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/contract/contract.go

@@ -480,6 +480,7 @@ func InvalidContract(contractInfo *Contract) (err error) {
 // GetCompanyContractCode 生成合同编号
 func GetCompanyContractCode(productId int, contractBusinessType string) (companyCode string, err error) {
 	var num int
+	var num2 int
 	o := orm.NewOrm()
 	today := utils.GetToday(utils.FormatDate)
 	sql := `SELECT COUNT(1) AS num FROM contract where create_time>=?`
@@ -487,6 +488,9 @@ func GetCompanyContractCode(productId int, contractBusinessType string) (company
 	if err != nil {
 		return
 	}
+	sql = `SELECT COUNT(1) AS num FROM seal where create_time>=?` // 把合规的部分也算上
+	err = o.Raw(sql, today).QueryRow(&num2)
+	num += num2
 	companyType := ""
 	switch productId {
 	case 1:

+ 13 - 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}
@@ -586,6 +590,7 @@ type CygxActivityList struct {
 	SigninImg                 string `description:"签到码图片"`
 	ChartPermissionNameDeputy string `description:"副行业名称"`
 	TopTime                   int    `description:"置顶时间"`
+	XcxDetailImg              string `description:"小程序二维码详情图片"`
 }
 
 type GetCygxActivityListRep struct {
@@ -751,6 +756,14 @@ func UpdateCygxActivityMomentsImg(momentsImg string, activityId int) (err error)
 	return
 }
 
+// 添加活动详情图片
+func UpdateCygxActivityXcxDetailImg(xcxDetailImg string, activityId int) (err error) {
+	sql := `UPDATE cygx_activity SET  xcx_detail_img=?  WHERE activity_id=? `
+	o := orm.NewOrmUsingDB("hz_cygx")
+	_, err = o.Raw(sql, xcxDetailImg, activityId).Exec()
+	return
+}
+
 // UpdateCygxActivityyidongActivityId  ,建立与易董的活动关联
 func UpdateCygxActivityyidongActivityId(yidongActivityId string, activityId int) (err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")

+ 16 - 0
models/cygx/activity_ask_email.go

@@ -42,6 +42,22 @@ func GetAskEmailList() (item []*AskEmailRep, err error) {
 	return
 }
 
+// 权益自定义派点信息
+func GetAskEmailListPoint() (item []*AskEmailRep, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_activity_ask_email WHERE  chart_permission_name != ''  AND enabled_point = 1 AND admin_id > 0    ORDER BY sort  DESC , id ASC  `
+	_, err = o.Raw(sql).QueryRows(&item)
+	return
+}
+
+// 权益自定义研究员信息
+func GetAskEmailListResearcher() (item []*AskEmailRep, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_activity_ask_email WHERE  chart_permission_name != ''  AND enabled_researcher = 1 AND admin_id > 0    ORDER BY sort  DESC , id ASC  `
+	_, err = o.Raw(sql).QueryRows(&item)
+	return
+}
+
 func UpdateAskEmail(item *AskEmailRep) (err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
 	sql := `UPDATE cygx_activity_ask_email SET admin_id=? where mobile=?`

+ 8 - 0
models/cygx/activity_signup_detail.go

@@ -235,3 +235,11 @@ WHERE
 	_, err = o.Raw(sql).QueryRows(&list)
 	return
 }
+
+// 根据用户ID,文章ID获取用户最新一条参会记录
+func GetCygxActivitySignupDetailDetailLast(articleId int, mobile string) (item *CygxActivitySignupDetail, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_activity_signup_detail WHERE   activity_id = ?  AND mobile = ?     ORDER BY id DESC    LIMIT 1 `
+	err = o.Raw(sql, articleId, mobile).QueryRow(&item)
+	return
+}

+ 11 - 0
models/cygx/activity_special.go

@@ -499,3 +499,14 @@ func GetactivitySpecilIdsByLabel(name string) (activityIds string, err error) {
 	err = o.Raw(sql).QueryRow(&activityIds)
 	return
 }
+
+// 获取数量
+func GetActivitySpecilCount(condition string, pars []interface{}) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_activity_special as art WHERE 1= 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	o := orm.NewOrmUsingDB("hz_cygx")
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}

+ 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:"剩余点数"`
 	Pointsf             float64   `description:"剩余点数"`
 	CompanyName         string    `description:"公司名称"`
 	ChartPermissionId   int       `description:"行业id"`
@@ -91,7 +91,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()
@@ -99,9 +99,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
+}

+ 1 - 2
models/cygx/activity_video.go

@@ -105,8 +105,7 @@ func GetActivityVideoCountByActivityId(activityId int) (count int, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
 	sqlCount := ` SELECT
 				COUNT( 1 ) AS count 
-			FROM
-   				JOIN cygx_activity_video
+			FROM cygx_activity_video
 			WHERE activity_id = ? `
 	err = o.Raw(sqlCount, activityId).QueryRow(&count)
 	return

+ 8 - 0
models/cygx/activity_voice.go

@@ -67,6 +67,14 @@ func GetCygxActivityVoiceCount(condition string, pars []interface{}) (count int,
 	return
 }
 
+// 获取数量
+func GetCygxActivityVoiceCountByActivityId(activityId int) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_activity_voice   WHERE activity_id= ?  `
+	o := orm.NewOrmUsingDB("hz_cygx")
+	err = o.Raw(sqlCount, activityId).QueryRow(&count)
+	return
+}
+
 // 列表
 func GetCygxActivityVoiceReqList(activityId int) (items []*CygxActivityVoiceReq, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")

+ 43 - 1
models/cygx/askserie_video_history_record.go

@@ -1,6 +1,9 @@
 package cygx
 
-import "github.com/beego/beego/v2/client/orm"
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
 
 type CygxAskserieVideoHistoryRecordResp struct {
 	Id               int    `orm:"column(id);pk"`
@@ -72,3 +75,42 @@ func GetCygxAskserieVideoCollectionList(condition string, pars []interface{}) (i
 	_, err = o.Raw(sql, pars).QueryRows(&items)
 	return
 }
+
+type CygxArticleHistoryRecordAll struct {
+	Id               int `orm:"column(id);pk"`
+	ArticleId        int
+	UserId           int
+	CreateTime       string
+	ModifyTime       time.Time
+	Mobile           string    `description:"手机号"`
+	Email            string    `description:"邮箱"`
+	CompanyId        int       `description:"公司id"`
+	CompanyName      string    `description:"公司名称"`
+	StopTime         int       `description:"停留时间"`
+	OutType          int       `description:"退出方式,1正常退出,2强制关闭"`
+	Source           string    `description:"来源,MOBILE:手机端,PC:电脑端"`
+	RealName         string    `description:"用户实际名称"`
+	CreateDateApi    time.Time `description:"同步创建时间"`
+	CelueHistoryId   int       `description:"策略平台记录的ID"`
+	Platfor          int       `description:"PV阅读记录来源,1:查研观向,2:策略平台"`
+	IsDel            int       `description:"是否删除"`
+	RegisterPlatform int       `description:"来源"`
+	CompanyStatus    string    `description:"公司状态"`
+	SellerName       string    `description:"所属销售"`
+}
+
+// 根据用户ID,文章ID获取用户最新一条阅读记录
+func GetCygxArticleHistoryRecordAllDetailLast(articleId, userId int) (item *CygxArticleHistoryRecordAll, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_article_history_record_all WHERE   article_id = ?  AND user_id = ?   AND is_del = 0  AND stop_time > 0  ORDER BY id DESC    LIMIT 1 `
+	err = o.Raw(sql, articleId, userId).QueryRow(&item)
+	return
+}
+
+// 根据用户ID,文章ID获取用户最新一条阅读记录
+func GetCygxArticleHistoryRecordAllDetailLastByMobile(articleId int, mobile string) (item *CygxArticleHistoryRecordAll, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_article_history_record_all WHERE   article_id = ?  AND mobile = ?   AND is_del = 0  AND stop_time > 0 ORDER BY id DESC    LIMIT 1 `
+	err = o.Raw(sql, articleId, mobile).QueryRow(&item)
+	return
+}

+ 50 - 49
models/cygx/cygx_user.go

@@ -12,50 +12,51 @@ import (
 )
 
 type CygxCompanyUser struct {
-	UserId                      int64  `orm:"column(user_id);pk"`
-	Mobile                      string `description:"手机号"`
-	Email                       string `description:"邮箱"`
-	CompanyId                   int    `description:"公司id"`
-	CompanyName                 string `description:"公司名称"`
-	RealName                    string `description:"姓名"`
-	CreatedTime                 string `description:"创建时间"`
-	IsMaker                     int    `description:"是否决策人,1:是,0:否"`
-	IsRegister                  bool   `description:"是否注册,true:已注册,false:未注册"`
-	Status                      string `description:"客户状态"`
-	RegisterTime                string `description:"注册时间"`
-	SellerName                  string `description:"销售名称"`
-	InteractionNum              int    `description:"互动量"`
-	CompanyInteractionNum       int    `description:"企业互动量"`
-	CompanyInteractionNumSeller int    `description:"销售可见企业互动量"`
-	Labels                      string `description:"标签,用英文,隔开"`
-	ActivityLabel               string `description:"活动标签,用英文,隔开"`
-	IsShowSee                   bool   `description:"是否展示查看"`
-	IsShowSeeNum                int    `description:"是否展示查看"`
-	HistoryNum                  int    `description:"报告阅读"`
-	CountNum                    int    `description:"报告收藏"`
-	IndustryFllowNum            int    `description:"产业关注"`
-	DepartmentFollowNum         int    `description:"作者关注"`
-	KeyWordNum                  int    `description:"搜索关键词"`
-	OnLineNum                   int    `description:"线上互动活动"`
-	OfficeNum                   int    `description:"线下互动活动"`
-	ChartNum                    int    `description:"图表收藏数量"`
-	TripNum                     int    `description:"图表数量"`
-	RoadshowVideoNum            int    `description:"产业视频播放量"`
-	ActivityVideoNum            int    `description:"活动视频播放量"`
-	ActivityVoiceNum            int    `description:"活动音频播放量"`
-	YanxuanspecialNum           int    `description:"研选专栏查看数量"`
-	RsCalendarNum               int    `description:"1V1 路演数量"`
-	FeedbackNum                 int    `description:"交流反馈数量"`
-	PackageType                 int    `description:"套餐类型,0:无,1:大套餐,2:小套餐"`
-	TryStage                    int    `description:"试用客户子标签:0全部、1未分类、2 推进、3 跟踪、4 预备"`
-	Content                     string `description:"备注信息"`
-	IsRemind                    bool   `description:"是否添加互动提醒"`
-	IsSubscribeCygx             int    `description:"是否关注了查研观向微信公众号: 0-未关注; 1-已关注"`
-	IsSubscribeMfyx             int    `description:"是否关注了买方研选微信公众号: 0-未关注; 1-已关注"`
-	IsUserMaker                 int    `description:"近四周之内是否包含决策人互动过 ,0否,1是"`
-	HaveMoveButton              bool   `description:"是否移动过"`
-	MfyxIsBinding               bool   `description:"买方研选是否绑定"`
-	Position                    string `description:"职位"`
+	UserId                      int64                     `orm:"column(user_id);pk"`
+	Mobile                      string                    `description:"手机号"`
+	Email                       string                    `description:"邮箱"`
+	CompanyId                   int                       `description:"公司id"`
+	CompanyName                 string                    `description:"公司名称"`
+	RealName                    string                    `description:"姓名"`
+	CreatedTime                 string                    `description:"创建时间"`
+	IsMaker                     int                       `description:"是否决策人,1:是,0:否"`
+	IsRegister                  bool                      `description:"是否注册,true:已注册,false:未注册"`
+	Status                      string                    `description:"客户状态"`
+	RegisterTime                string                    `description:"注册时间"`
+	SellerName                  string                    `description:"销售名称"`
+	InteractionNum              int                       `description:"互动量"`
+	CompanyInteractionNum       int                       `description:"企业互动量"`
+	CompanyInteractionNumSeller int                       `description:"销售可见企业互动量"`
+	Labels                      string                    `description:"标签,用英文,隔开"`
+	ActivityLabel               string                    `description:"活动标签,用英文,隔开"`
+	IsShowSee                   bool                      `description:"是否展示查看"`
+	IsShowSeeNum                int                       `description:"是否展示查看"`
+	HistoryNum                  int                       `description:"报告阅读"`
+	CountNum                    int                       `description:"报告收藏"`
+	IndustryFllowNum            int                       `description:"产业关注"`
+	DepartmentFollowNum         int                       `description:"作者关注"`
+	KeyWordNum                  int                       `description:"搜索关键词"`
+	OnLineNum                   int                       `description:"线上互动活动"`
+	OfficeNum                   int                       `description:"线下互动活动"`
+	ChartNum                    int                       `description:"图表收藏数量"`
+	TripNum                     int                       `description:"图表数量"`
+	RoadshowVideoNum            int                       `description:"产业视频播放量"`
+	ActivityVideoNum            int                       `description:"活动视频播放量"`
+	ActivityVoiceNum            int                       `description:"活动音频播放量"`
+	YanxuanspecialNum           int                       `description:"研选专栏查看数量"`
+	RsCalendarNum               int                       `description:"1V1 路演数量"`
+	FeedbackNum                 int                       `description:"交流反馈数量"`
+	PackageType                 int                       `description:"套餐类型,0:无,1:大套餐,2:小套餐"`
+	TryStage                    int                       `description:"试用客户子标签:0全部、1未分类、2 推进、3 跟踪、4 预备"`
+	Content                     string                    `description:"备注信息"`
+	IsRemind                    bool                      `description:"是否添加互动提醒"`
+	IsSubscribeCygx             int                       `description:"是否关注了查研观向微信公众号: 0-未关注; 1-已关注"`
+	IsSubscribeMfyx             int                       `description:"是否关注了买方研选微信公众号: 0-未关注; 1-已关注"`
+	IsUserMaker                 int                       `description:"近四周之内是否包含决策人互动过 ,0否,1是"`
+	HaveMoveButton              bool                      `description:"是否移动过"`
+	MfyxIsBinding               bool                      `description:"买方研选是否绑定"`
+	Position                    string                    `description:"职位"`
+	RaiLabelList                []*WxUserRaiLabelListResp `description:"权益用户标签列表'"`
 }
 
 type CompanyUserListResp struct {
@@ -64,7 +65,7 @@ type CompanyUserListResp struct {
 }
 
 // 获取数量
-func GetCompanyListCount(userCondition, keyWord, kwywordcondition, condition, roleTypeCode string, pars []interface{}) (count int, err error) {
+func GetCompanyListCount(joinTable, userCondition, keyWord, kwywordcondition, condition, roleTypeCode string, pars []interface{}) (count int, err error) {
 	o := orm.NewOrm()
 	companyCondition := `SELECT a.company_id FROM company AS a  INNER JOIN company_product AS b ON a.company_id=b.company_id   WHERE a.enabled=1  `
 	kwywordcondition = companyCondition + kwywordcondition
@@ -78,7 +79,7 @@ func GetCompanyListCount(userCondition, keyWord, kwywordcondition, condition, ro
 			INNER JOIN company AS c ON c.company_id = u.company_id
 			INNER JOIN company_product AS cp ON cp.company_id = c.company_id
 			INNER JOIN admin AS m ON m.admin_id = cp.seller_id 
-			INNER JOIN user_seller_relation AS sr ON sr.user_id = u.user_id 
+			INNER JOIN user_seller_relation AS sr ON sr.user_id = u.user_id ` + joinTable + `
 			 WHERE  u.company_id IN (` + companyCondition + `)`
 	if userCondition != "" {
 		sql += userCondition
@@ -96,14 +97,14 @@ func GetCompanyListCount(userCondition, keyWord, kwywordcondition, condition, ro
 }
 
 // 列表
-func GetCygxCompanyUserList(userCondition, keyWord, kwywordcondition, condition, roleTypeCode, sqlOrder string, pars []interface{}, startSize, pageSize int) (items []*CygxCompanyUser, err error) {
+func GetCygxCompanyUserList(joinTable, tableField, userCondition, keyWord, kwywordcondition, condition, roleTypeCode, sqlOrder string, pars []interface{}, startSize, pageSize int) (items []*CygxCompanyUser, err error) {
 	o := orm.NewOrm()
 	companyCondition := `SELECT a.company_id FROM company AS a  INNER JOIN company_product AS b ON a.company_id=b.company_id   WHERE a.enabled=1  `
 	kwywordcondition = companyCondition + kwywordcondition
 	if condition != "" {
 		companyCondition += condition
 	}
-	sql := `SELECT
+	sql := `SELECT` + tableField + `
 			u.user_id,
 			u.mobile,
 			u.email,
@@ -129,7 +130,7 @@ func GetCygxCompanyUserList(userCondition, keyWord, kwywordcondition, condition,
 			INNER JOIN company AS c ON c.company_id = u.company_id
 			INNER JOIN company_product AS cp ON cp.company_id = c.company_id
 			INNER JOIN admin AS m ON m.admin_id = cp.seller_id 
-			INNER JOIN user_seller_relation AS sr ON sr.user_id = u.user_id 
+			INNER JOIN user_seller_relation AS sr ON sr.user_id = u.user_id ` + joinTable + `
 			 WHERE u.company_id IN (` + companyCondition + `)`
 	if userCondition != "" {
 		sql += userCondition

+ 42 - 39
models/cygx/cygx_user_record.go

@@ -27,9 +27,10 @@ type OpenIdList struct {
 }
 
 type OpenIdMobileList struct {
-	OpenId string
-	UserId int
-	Mobile string `description:"手机号"`
+	OpenId    string
+	UserId    int
+	Mobile    string `description:"手机号"`
+	CompanyId int    `description:"公司ID"`
 }
 
 func GetCygxUserRecord() (items []*CygxUserRecord, err error) {
@@ -41,30 +42,39 @@ func GetCygxUserRecord() (items []*CygxUserRecord, err error) {
 
 // 获取所有有权限的用户的opid
 func GetCygxUserRecordPower(chartPermissionIds string) (items []*OpenIdList, err error) {
-	//o := orm.NewOrm()
-	//sql := `SELECT
-	//		cr.open_id,
-	//		u.user_id,
-	//		u.company_id,
-	//		u.real_name,
-	//		u.mobile
-	//	FROM
-	//		company_report_permission AS p
-	//		INNER JOIN wx_user AS u ON u.company_id = p.company_id
-	//		INNER JOIN user_record AS r ON r.user_id = u.user_id
-	//		INNER JOIN cygx_user_record AS cr ON cr.union_id = r.union_id
-	//	WHERE
-	//		p.chart_permission_id IN (` + chartPermissionIds + `)
-	//		AND r.create_platform = 4
-	//		AND p.STATUS IN ('正式','试用','永续')   GROUP BY cr.open_id `
-	//_, err = o.Raw(sql).QueryRows(&items)
+	listMobile, err := GetCygxUserRecordPowerMobileList(chartPermissionIds)
+	if err != nil {
+		return
+	}
+	var mobileArr []string
+	for _, v := range listMobile {
+		if v.Mobile != "" {
+			mobileArr = append(mobileArr, v.Mobile)
+		}
+	}
+	mobileLen := len(mobileArr)
+	if mobileLen == 0 {
+		return
+	}
+	openIdList, err := GetUserRecordListByMobileArr(mobileArr)
+	if err != nil {
+		return
+	}
+	items = openIdList
+	return
+}
 
+// 获取所有有权限的用户的opid
+func GetCygxUserRecordPowerArticle(chartPermissionIds string) (items []*OpenIdList, err error) {
 	listMobile, err := GetCygxUserRecordPowerMobileList(chartPermissionIds)
 	if err != nil {
 		return
 	}
 	var mobileArr []string
 	for _, v := range listMobile {
+		if v.CompanyId == utils.JMCJ_COMPANY_ID {
+			continue //需求池 1043:深圳进门财经科技股份有限公司下所有的账号,所有活动的新增修改都做推送,所有的报告的新增修改都不做推送。
+		}
 		if v.Mobile != "" {
 			mobileArr = append(mobileArr, v.Mobile)
 		}
@@ -231,31 +241,24 @@ func GetCygxActiviyUserFllowOpenid(activityId int) (items []*OpenIdList, err err
 //}
 
 // GetCygxUserRecordPowerByActivitySet 根据活动设置,获取所有有权限的用户的opid
-func GetCygxUserRecordPowerByActivitySet(chartPermissionIds, condition string) (items []*OpenIdList, itemsYx []*OpenIdList, err error) {
-	//o := orm.NewOrm()
-	//sql := `SELECT
-	//		cr.open_id,
-	//		u.user_id,
-	//		u.company_id,
-	//		u.real_name,
-	//		u.mobile
-	//	FROM
-	//		company_report_permission AS p
-	//		INNER JOIN wx_user AS u ON u.company_id = p.company_id
-	//		INNER JOIN user_record AS r ON r.user_id = u.user_id
-	//		INNER JOIN cygx_user_record AS cr ON cr.union_id = r.union_id
-	//	WHERE
-	//		p.chart_permission_id IN (` + chartPermissionIds + `) ` + condition + ` AND r.create_platform = 4
-	//		AND p.STATUS IN ('正式','试用','永续')   GROUP BY cr.open_id `
-	//_, err = o.Raw(sql).QueryRows(&items)
-
+func GetCygxUserRecordPowerByActivitySet(chartPermissionIds, condition string, mobileArrJmcj []string) (items []*OpenIdList, itemsYx []*OpenIdList, err error) {
 	listMobile, err := GetCygxUserRecordPowerByActivitySetListMobile(chartPermissionIds, condition)
 	if err != nil {
 		return
 	}
 	var mobileArr []string
+	var mobileArrYx []string
+	//需求池 1043:深圳进门财经科技股份有限公司下所有的账号,所有活动的新增修改都做推送,所有的报告的新增修改都不做推送。
+	for _, v := range mobileArrJmcj {
+		if v != "" {
+			mobileArr = append(mobileArr, v)
+		}
+	}
 	for _, v := range listMobile {
 		if v.Mobile != "" {
+			if !utils.InArrayByStr(mobileArrJmcj, v.Mobile) {
+				mobileArrYx = append(mobileArrYx, v.Mobile)
+			}
 			mobileArr = append(mobileArr, v.Mobile)
 		}
 	}
@@ -269,7 +272,7 @@ func GetCygxUserRecordPowerByActivitySet(chartPermissionIds, condition string) (
 	}
 	items = openIdList
 
-	openIdListYx, err := GetMfyxUserRecordListByMobileArr(mobileArr)
+	openIdListYx, err := GetMfyxUserRecordListByMobileArr(mobileArrYx)
 	if err != nil {
 		return
 	}

+ 34 - 0
models/cygx/industrial_article_group_management.go

@@ -208,3 +208,37 @@ func GetSearchResourceList(userId int, condition string, startSize, pageSize int
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
+
+// GetIndustrialManagementGroupArticleMaxPublishDateByHz 获取产业ID关联最新发布文章的发布时间(弘则资源包)
+func GetIndustrialManagementGroupArticleMaxPublishDateByHz(industrialManagementId int) (maxTime string, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ` SELECT
+			MAX( a.publish_date ) AS max_time 
+		FROM
+			cygx_industrial_article_group_management AS m
+			INNER JOIN cygx_article AS a ON a.article_id = m.article_id 
+		WHERE
+			1 = 1 
+			AND m.industrial_management_id = ? 
+			AND a.publish_status = 1 
+			AND a.article_type_id = 0 `
+	err = o.Raw(sql, industrialManagementId).QueryRow(&maxTime)
+	return
+}
+
+// GetIndustrialManagementGroupArticleMaxPublishDateByYx 获取产业ID关联最新发布文章的发布时间(研选资源包)
+func GetIndustrialManagementGroupArticleMaxPublishDateByYx(industrialManagementId int) (maxTime string, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT
+			MAX( a.publish_date ) AS max_time 
+		FROM
+			cygx_industrial_article_group_management AS m
+			INNER JOIN cygx_article AS a ON a.article_id = m.article_id 
+		WHERE
+			1 = 1 
+			AND m.industrial_management_id = ? 
+			AND a.publish_status = 1  
+			AND a.article_type_id > 0 `
+	err = o.Raw(sql, industrialManagementId).QueryRow(&maxTime)
+	return
+}

+ 4 - 1
models/cygx/rai_serve_bill.go

@@ -130,6 +130,7 @@ type CygxRaiServeBillResp struct {
 	ViewTime            string  `comment:"浏览时间"`
 	ChartPermissionId   int     `description:"行业id"`
 	ChartPermissionName string  `description:"行业名称"`
+	ActivityId          int     `description:"活动ID"`
 }
 
 type CygxRaiServeBillListResp struct {
@@ -154,7 +155,7 @@ func GetCygxRaiServeBillRespList(condition string, pars []interface{}, startSize
 	if condition != "" {
 		sql += condition
 	}
-	sql += ` ORDER BY bill_id DESC   LIMIT ?,? `
+	sql += ` ORDER BY view_time DESC   LIMIT ?,? `
 	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
 	return
 }
@@ -178,6 +179,8 @@ type CygxRaiServeBill struct {
 	Source           string    `comment:"来源 "`
 	WeekStartDate    string    `comment:"周一开始日期"`
 	WeekEndDate      string    `comment:"周日结束日期"`
+	MonthStartDate   string    `comment:"月份开始日期"`
+	MonthEndDate     string    `comment:"月份结束日期"`
 	CreateTime       time.Time `comment:"创建时间"`
 	ViewTime         string    `comment:"浏览时间"`
 }

+ 5 - 0
models/cygx/rai_serve_company.go

@@ -42,6 +42,11 @@ type CygxRaiServeCompanyResp struct {
 	LastWeekAmount    float64 `comment:"上周互动量"`
 	TwoWeekAmount     float64 `comment:"上上周互动量"`
 	ThreeWeekAmount   float64 `comment:"上三周互动量"`
+	ThisMonthAmount   float64 `comment:"本月互动量"`
+	LastMonthAmount   float64 `comment:"上月互动量"`
+	LastMonthQoq      string  `comment:"上月环比"`
+	LastMonthQoqIsRed bool    `comment:"上月环比是否标红"`
+	TwoMonthAmount    float64 `comment:"上上月互动量"`
 }
 
 type CygxRaiServeCompanyListResp struct {

+ 32 - 0
models/cygx/report_history_record.go

@@ -0,0 +1,32 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxReportHistoryRecord struct {
+	Id               int `orm:"column(id);pk"`
+	ArticleId        int
+	UserId           int
+	CreateTime       time.Time
+	Mobile           string    `description:"手机号"`
+	Email            string    `description:"邮箱"`
+	CompanyId        int       `description:"公司id"`
+	CompanyName      string    `description:"公司名称"`
+	ModifyTime       time.Time `description:"修改时间"`
+	ReportType       string    `description:"报告类型,bgjx:报告精选、bzyjhz:本周研究汇总、szjyhz:上周纪要汇总"`
+	RealName         string    `description:"用户实际名称"`
+	SellerName       string    `description:"所属销售"`
+	StopTime         int       `description:"停留时间"`
+	OutType          int       `description:"退出方式,1正常退出,2强制关闭"`
+	RegisterPlatform int       `description:"来源 1小程序,2:网页"`
+}
+
+// 根据用户ID,文章ID获取用户最新一条阅读记录
+func GetCygxReportHistoryRecordDetailLast(articleId int, mobile, reportType string) (item *CygxArticleHistoryRecordAll, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_report_history_record WHERE   article_id = ?  AND mobile = ?   AND report_type = ?    ORDER BY id DESC    LIMIT 1 `
+	err = o.Raw(sql, articleId, mobile, reportType).QueryRow(&item)
+	return
+}

+ 2 - 0
models/cygx/summary_manage.go

@@ -93,6 +93,8 @@ type CygxArticle struct {
 	Annotation         string    `description:"核心观点"`
 	VisibleRange       int       `description:"设置可见范围1全部,0内部"`
 	//NickName           string    `description:"作者昵称"`
+	ChartPermissionId   int    `description:"行业id"`
+	ChartPermissionName string `description:"行业名称"`
 }
 
 type CygxArticleResp struct {

+ 282 - 0
models/cygx/wx_user_rai_label.go

@@ -0,0 +1,282 @@
+package cygx
+
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"hongze/hz_crm_api/utils"
+	"time"
+)
+
+type WxUserRaiLabel struct {
+	RaiLabelId      int       `orm:"column(rai_label_id);pk"`
+	UserId          int       `description:"用户ID"`
+	RealName        string    `description:"用户实际名称"`
+	Mobile          string    `description:"手机号"`
+	Email           string    `description:"邮箱"`
+	CompanyId       int       `description:"公司id"`
+	CompanyName     string    `description:"公司名称"`
+	Label           string    `description:"标签内容"`
+	SourceId        int       `description:"来源ID"`
+	SourceType      int       `description:"来源1:搜索关键字标签、2:产业/个股标签(线下活动)、3:产业/个股标签(线下路演)、4:产业/个股标签(线上活动)、5:产业/个股标签(线上路演)、6:销售输入标签、7:产业/个股标签(报告)、8:报告类型标签"`
+	SysUserId       int       `description:"创建人id"`
+	SysUserRealName string    `description:"创建人名称"`
+	CreateTime      time.Time `description:"创建时间"`
+	ModifyTime      time.Time `description:"更新时间"`
+	TableName       string    `description:"数据来源的表名"`
+}
+
+// 标签记录表,所有内容都不删除
+type WxUserRaiLabelLog struct {
+	RaiLabelId       int       `orm:"column(rai_label_id);pk"`
+	UserId           int       `description:"用户ID"`
+	RealName         string    `description:"用户实际名称"`
+	Mobile           string    `description:"手机号"`
+	Email            string    `description:"邮箱"`
+	CompanyId        int       `description:"公司id"`
+	CompanyName      string    `description:"公司名称"`
+	Label            string    `description:"标签内容"`
+	SourceId         int       `description:"来源ID"`
+	SourceType       int       `description:"来源1:搜索关键字标签、2:产业/个股标签(线下活动)、3:产业/个股标签(线下路演)、4:产业/个股标签(线上活动)、5:产业/个股标签(线上路演)、6:销售输入标签、7:产业/个股标签(报告)、8:报告类型标签"`
+	SysUserId        int       `description:"创建人id"`
+	SysUserRealName  string    `description:"创建人名称"`
+	CreateTime       time.Time `description:"创建时间"`
+	ModifyTime       time.Time `description:"更新时间"`
+	RegisterPlatform int       `description:"来源 1小程序,2:网页"`
+	TableName        string    `description:"数据来源的表名"`
+}
+
+type WxUserRaiLabelList struct {
+	List []*WxUserRaiLabelListResp
+}
+
+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:报告类型标签"`
+}
+
+type WxUserRaiLabelAddReq struct {
+	UserId int    `description:"用户ID"`
+	Label  string `description:"标签内容"`
+}
+
+type WxUserRaiLabelIdReq struct {
+	RaiLabelId int `description:"ID"`
+}
+
+// 添加
+//func AddWxUserRaiLabel(item *WxUserRaiLabel) (err error) {
+//	o := orm.NewOrmUsingDB("hz_cygx")
+//	_, err = o.Insert(item)
+//	return
+//}
+
+func AddWxUserRaiLabel(item *WxUserRaiLabel) (err error) {
+	o, err := orm.NewOrmUsingDB("hz_cygx").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		fmt.Println(err)
+		if err == nil {
+			o.Commit()
+		} else {
+			o.Rollback()
+		}
+	}()
+
+	//删除原有数据
+	sql := ` DELETE FROM wx_user_rai_label WHERE user_id = ? AND label = ?  `
+	_, err = o.Raw(sql, item.UserId, item.Label).Exec()
+	if err != nil {
+		return
+	}
+
+	_, err = o.Insert(item)
+
+	if err != nil {
+		return
+	}
+
+	itemLog := new(WxUserRaiLabelLog)
+	itemLog.UserId = item.UserId
+	itemLog.RealName = item.RealName
+	itemLog.Mobile = item.Mobile
+	itemLog.Email = item.Email
+	itemLog.CompanyId = item.CompanyId
+	itemLog.CompanyName = item.CompanyName
+	itemLog.Label = item.Label
+	itemLog.SourceId = item.SourceId
+	itemLog.SourceType = item.SourceType
+	itemLog.SysUserId = item.SysUserId
+	itemLog.SysUserRealName = item.SysUserRealName
+	itemLog.CreateTime = item.CreateTime
+	itemLog.ModifyTime = item.ModifyTime
+	//itemLog.RegisterPlatform = item.RegisterPlatform
+	itemLog.TableName = item.TableName
+	_, err = o.Insert(itemLog)
+	return
+}
+
+// DeleteWxUserRaiLabel 根据主键ID删除数据
+func DeleteWxUserRaiLabel(raiLabelId int) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ` DELETE FROM wx_user_rai_label WHERE rai_label_id = ? `
+	_, err = o.Raw(sql, raiLabelId).Exec()
+	return
+}
+
+// DeleteWxUserRaiLabelWithRoadshow 路演到会删除后,删除对应的标签
+func DeleteWxUserRaiLabelWithRoadshow(userId, sourceId int) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ` DELETE FROM wx_user_rai_label WHERE user_id  = ?  AND source_id =?  AND  source_type IN  (3,5) `
+	_, err = o.Raw(sql, userId, sourceId).Exec()
+	return
+}
+
+// DeleteWxUserRaiLabelWithActivity 线下活动取消到会后,删除对应的标签
+func DeleteWxUserRaiLabelWithActivity(userIds []int, sourceId int) (err error) {
+	lenArr := len(userIds)
+	if lenArr == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ` DELETE FROM wx_user_rai_label WHERE user_id IN (` + utils.GetOrmInReplace(lenArr) + `)  AND source_id =?  AND  source_type IN  (2,4) `
+	_, err = o.Raw(sql, userIds, sourceId).Exec()
+	return
+}
+
+// GetWxUserRaiLabelListByUserIds 根据多个userId 获取每个UserId最新的十条数据
+func GetWxUserRaiLabelListByUserIds(userIdArr []int) (list []*WxUserRaiLabelListResp, err error) {
+	lenArr := len(userIdArr)
+	if lenArr == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT
+			t.rai_label_id,
+			t.user_id,
+			t.label,
+			t.source_type 
+		FROM
+			(
+			SELECT
+				rai_label_id,
+				user_id,
+				label,
+				source_type,
+				create_time,
+				@row_number :=
+			IF
+				( @prev_user_id = user_id, @row_number + 1, 1 ) AS rank,
+				@prev_user_id := user_id 
+			FROM
+				wx_user_rai_label,
+				( SELECT @row_number := 0, @prev_user_id := NULL ) AS vars 
+			WHERE
+				user_id IN ( ` + utils.GetOrmInReplace(lenArr) + ` ) 
+				AND create_time > ?
+			ORDER BY
+				create_time DESC 
+			) AS t 
+		WHERE
+			t.rank <= 10 
+		ORDER BY
+			t.create_time DESC  `
+	_, err = o.Raw(sql, userIdArr, time.Now().AddDate(0, -4, 0).Format(utils.FormatDate)).QueryRows(&list)
+	return
+}
+
+// GetWxUserRaiLabelListByUserId 根据用户ID,获取最近四个月的数据信息
+func GetWxUserRaiLabelListByUserId(userId int) (list []*WxUserRaiLabelListResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT
+			rai_label_id,
+			user_id,
+			label,
+			source_type 
+		FROM
+			wx_user_rai_label
+		WHERE
+			 user_id = ? AND  create_time >= ?
+		ORDER BY
+		    create_time DESC  LIMIT  1000  `
+	_, err = o.Raw(sql, userId, time.Now().AddDate(0, -4, 0).Format(utils.FormatDate)).QueryRows(&list)
+	return
+}
+
+// 通过纪要ID获取详情
+func GetWxUserRaiLabelDetailById(raiLabelId int) (item *WxUserRaiLabel, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT
+			*
+		FROM
+			wx_user_rai_label 
+		WHERE
+			rai_label_id =? `
+	err = o.Raw(sql, raiLabelId).QueryRow(&item)
+	return
+}
+
+type WxUserRaiLabelDetailResp struct {
+	SourceType   int `description:"来源1:搜索关键字标签、2:产业/个股标签(线下活动)、3:产业/个股标签(线下路演)、4:产业/个股标签(线上活动)、5:产业/个股标签(线上路演)、6:销售输入标签、7:产业/个股标签(报告)、8:报告类型标签"`
+	KeyWord      *WxUserRaiLabelKeyWordResp
+	Activity     *WxUserRaiLabelActivityResp
+	RoadShow     *WxUserRaiLabelRoadShowResp
+	Seller       *WxUserRaiLabelSellerResp
+	Article      *WxUserRaiLabelArticleResp
+	ActivityVivo *WxUserRaiLabelActivityVivoResp
+}
+
+type WxUserRaiLabelKeyWordResp struct {
+	Label      string `description:"标签内容"`
+	CreateTime string `description:"创建时间"`
+}
+
+type WxUserRaiLabelActivityResp struct {
+	ActivityName     string `description:"活动名称"`
+	ActivityTypeName string `description:"活动类型名称"`
+	ActivityTime     string `description:"活动时间"`
+	Duration         string `description:"参会时长"`
+	Label            string `description:"标签内容"`
+}
+
+type WxUserRaiLabelActivityVivoResp struct {
+	Title        string `description:"活动名称"`
+	ActivityTime string `description:"活动时间"`
+	Label        string `description:"标签内容"`
+	CreateTime   string `description:"查看时间"`
+}
+
+type WxUserRaiLabelRoadShowResp struct {
+	Theme          string `description:"会议主题"`
+	ResearcherName string `description:"研究员名称"`
+	RoadShowTime   string `description:"开始时间"`
+	Label          string `description:"标签内容"`
+}
+
+type WxUserRaiLabelSellerResp struct {
+	Label           string `description:"标签内容"`
+	SysUserRealName string `description:"创建人名称"`
+	CreateTime      string `description:"创建时间"`
+}
+
+type WxUserRaiLabelArticleResp struct {
+	Title       string `description:"标题"`
+	PublishDate string `description:"发布时间"`
+	CreateTime  string `description:"创建时间"`
+	SourceText  string `description:"阅读来源"`
+	StopTime    string `description:"阅读停留时间"`
+	Label       string `description:"标签内容"`
+}
+
+type WxUserRaiLabelRedis struct {
+	UserId           int       `description:"用户ID"`
+	SourceId         int       `description:"资源ID"`
+	Label            string    `description:"标签内容"`
+	SourceType       int       `description:"来源1:搜索关键字标签、2:产业/个股标签(线下活动)、3:产业/个股标签(线下路演)、4:产业/个股标签(线上活动)、5:产业/个股标签(线上路演)、6:销售输入标签、7:产业/个股标签(报告)、8:报告类型标签"`
+	CreateTime       time.Time `description:"创建时间"`
+	RegisterPlatform int       `description:"来源 1小程序,2:网页"`
+	TableName        string    `description:"数据来源的表名"`
+}

+ 4 - 0
models/db.go

@@ -388,6 +388,8 @@ func initRoadShow() {
 		new(roadshow.RsCalendarMeetingUser),       //路演参会名单表
 		new(roadshow.RsCalendarMeetingLabelGroup), //路演参会名单关联的标签表
 		new(roadshow.RsCalendarApiLog),            //上海路演三方接口请求记录日志表
+		new(roadshow.RsReportRecordPermission),    //路演公司权限记录
+		new(roadshow.RsCalendarResearcherQuestion),
 	)
 }
 
@@ -489,6 +491,8 @@ func initCygx() {
 		new(cygx.CygxUserFeedback),
 		new(cygx.CygxReportSelectionThirdName),
 		new(cygx.CygxGushouTimeLine),
+		new(cygx.WxUserRaiLabel),
+		new(cygx.WxUserRaiLabelLog),
 	)
 }
 

+ 1 - 0
models/fms/contract_invoice.go

@@ -16,6 +16,7 @@ type ContractInvoice struct {
 	CurrencyUnit       string    `gorm:"column:currency_unit" json:"currency_unit" description:"货币国际代码"`
 	InvoiceType        int       `gorm:"column:invoice_type" json:"invoice_type" description:"类型: 1-开票登记; 2-到款登记"`
 	InvoiceDate        time.Time `gorm:"column:invoice_time" json:"invoice_time" description:"开票日期/到款月"`
+	InvoiceTime        time.Time `description:"开票日期/到款月"`
 	SellerId           int       `gorm:"column:seller_id" json:"seller_id" description:"销售ID"`
 	SellerName         string    `gorm:"column:seller_name" json:"seller_name" description:"销售名称"`
 	SellerGroupId      int       `gorm:"column:seller_group_id" json:"seller_group_id" description:"销售分组ID"`

+ 116 - 14
models/fms/invoice_payment_summary.go

@@ -17,13 +17,11 @@ type InvoicePaymentSummary struct {
 	ModifyTime       time.Time `gorm:"autoUpdateTime:milli;column:modify_time" json:"modify_time" description:"最后更新时间"`
 }
 
-
 type ContractRegisterSummary struct {
 	SummaryId int `json:"summary_id" description:"汇总ID"`
 	ContractRegister
 }
 
-
 // GetInvoicePaymentCensusPageList 获取商品到款统计列表-总数
 func GetInvoicePaymentCensusPageList(condition string, pars []interface{}, order string, startSize, pageSize int) (results []*ContractRegisterSummary, total int64, err error) {
 	o := orm.NewOrmUsingDB("fms")
@@ -35,7 +33,7 @@ func GetInvoicePaymentCensusPageList(condition string, pars []interface{}, order
 	if condition != "" {
 		sql += condition
 	}
-	totalSQl := `SELECT COUNT(1) total FROM (`+sql+`) as a`
+	totalSQl := `SELECT COUNT(1) total FROM (` + sql + `) as a`
 	if err = o.Raw(totalSQl, pars).QueryRow(&total); err != nil {
 		return
 	}
@@ -81,14 +79,14 @@ func GetInvoicePaymentCensusSummaryData(condition string, pars []interface{}) (r
 		"IF(c.seller_group_name = '' OR c.seller_group_name IS NULL, d.seller_group_name, c.seller_group_name) AS seller_group_name", "d.origin_amount AS payment_amount", "d.invoice_time AS payment_date", "d.pay_type",
 	}
 	o := orm.NewOrmUsingDB("fms")
-	sql := `SELECT `+strings.Join(fields, ",")+ ` FROM invoice_payment_summary AS a 
+	sql := `SELECT ` + strings.Join(fields, ",") + ` FROM invoice_payment_summary AS a 
 			JOIN contract_register AS b ON a.register_id = b.contract_register_id AND b.is_deleted = 0
 			LEFT JOIN contract_invoice AS c ON a.invoice_id = c.contract_invoice_id AND c.is_deleted = 0
 			LEFT JOIN contract_invoice AS d ON a.payment_id = d.contract_invoice_id AND d.is_deleted = 0
 	WHERE `
 	sql += condition
 
-	_,err = o.Raw(sql, pars).QueryRows(&results)
+	_, err = o.Raw(sql, pars).QueryRows(&results)
 
 	return
 }
@@ -102,8 +100,7 @@ func GetInvoicePaymentCensusSummaryDataIds(condition string, pars []interface{})
 			LEFT JOIN contract_invoice AS d ON a.payment_id = d.contract_invoice_id AND d.is_deleted = 0
 	WHERE `
 	sql += condition
-	_,err = o.Raw(sql, pars).QueryRows(&summaryIds)
-
+	_, err = o.Raw(sql, pars).QueryRows(&summaryIds)
 
 	return
 }
@@ -115,7 +112,7 @@ func GetContractSummaryInvoicePaymentAmountTotal(condition string, pars []interf
 		joinCond = `a.payment_id = b.contract_invoice_id`
 	}
 	o := orm.NewOrmUsingDB("fms")
-	sql := `SELECT IFNULL(SUM(b.amount),0) FROM invoice_payment_summary AS a JOIN contract_invoice AS b ON `+ joinCond+` AND b.is_deleted = 0 WHERE `
+	sql := `SELECT IFNULL(SUM(b.amount),0) FROM invoice_payment_summary AS a JOIN contract_invoice AS b ON ` + joinCond + ` AND b.is_deleted = 0 WHERE `
 	sql += condition
 	err = o.Raw(sql, pars).QueryRow(&amountTotal)
 
@@ -131,27 +128,25 @@ func GetSummaryListCurrencySum(condition string, pars []interface{}, amountType
 
 	o := orm.NewOrmUsingDB("fms")
 	sql := `SELECT b.currency_unit, b.invoice_type, SUM(b.amount) AS amount_total, SUM(b.origin_amount) AS origin_amount_total
-			FROM invoice_payment_summary AS a JOIN contract_invoice AS b ON `+ joinCond+` AND b.is_deleted = 0 WHERE `
+			FROM invoice_payment_summary AS a JOIN contract_invoice AS b ON ` + joinCond + ` AND b.is_deleted = 0 WHERE `
 	sql += condition
 
 	sql += ` GROUP BY b.currency_unit `
-	_,err = o.Raw(sql, pars).QueryRows(&results)
+	_, err = o.Raw(sql, pars).QueryRows(&results)
 
 	return
 }
 
-
 // GetContractSummaryInvoicePaymentAmount 获取汇总金额合计信息
 func GetContractSummaryInvoicePaymentAmount(condition string, pars []interface{}) (amountTotal float64, err error) {
 	joinCond := ` (a.invoice_id = b.contract_invoice_id OR a.payment_id = b.contract_invoice_id) `
 
 	o := orm.NewOrmUsingDB("fms")
-	sql := `SELECT b.amount FROM invoice_payment_summary AS a JOIN contract_invoice AS b ON `+ joinCond+` AND b.is_deleted = 0 WHERE `
+	sql := `SELECT b.amount FROM invoice_payment_summary AS a JOIN contract_invoice AS b ON ` + joinCond + ` AND b.is_deleted = 0 WHERE `
 	sql += condition
 	sql += ` GROUP BY id `
 
-	nsql := `SELECT IFNULL( SUM( e.amount ), 0 ) FROM (`+sql+`) as e`
-
+	nsql := `SELECT IFNULL( SUM( e.amount ), 0 ) FROM (` + sql + `) as e`
 
 	err = o.Raw(nsql, pars).QueryRow(&amountTotal)
 
@@ -165,3 +160,110 @@ type InvoiceSummary struct {
 	ContractRegister
 }
 
+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:"分配金额"`
+	InvoiceTime   string  `json:"invoice_time" description:"开票日期"`
+	InvoiceType   int     `json:"invoice_type" description:"1-开票登记; 2-到款登记"`
+	ContractType  int     `gorm:"column:contract_type" json:"contract_type" description:"合同类型: 1-新签; 2-续约; 3-代付; 4-补充协议"`
+}
+
+// 列表
+func GetContractRegisterList(condition string, pars []interface{}, startSize, pageSize int) (items []*ContractRegisterRaiData, err error) {
+	o := orm.NewOrmUsingDB("fms")
+	sql := `SELECT 
+			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
+	}
+	if startSize+pageSize > 0 {
+		sql += ` LIMIT ?,?  `
+		_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	} else {
+		_, err = o.Raw(sql, pars).QueryRows(&items)
+	}
+	return
+}
+
+// 获取开票金额与未到账金额的统计
+func GetContractRegisterAmountList(condition string, pars []interface{}) (items []*ContractRegisterSummary, err error) {
+	o := orm.NewOrmUsingDB("fms")
+	sql := `SELECT
+			SUM( invoiced_amount ) AS invoiced_amount,
+			SUM( payment_amount ) AS payment_amount FROM contract_register  as a  WHERE 1= 1  `
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// 列表
+func GetContractInvoiceList(condition string, pars []interface{}, startSize, pageSize int) (items []*ContractInvoice, err error) {
+	o := orm.NewOrmUsingDB("fms")
+	sql := `SELECT * FROM contract_invoice  as a  WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	if startSize+pageSize > 0 {
+		sql += ` LIMIT ?,?  `
+		_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	} else {
+		_, err = o.Raw(sql, pars).QueryRows(&items)
+	}
+	return
+}
+
+// 获取数量
+func GetContractInvoiceCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("fms")
+	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
+	}
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+// 获取开票金额与未到账金额的统计
+func GetContractInvoiceAmountCount(condition string, pars []interface{}) (amount float64, err error) {
+	o := orm.NewOrmUsingDB("fms")
+	sql := `SELECT
+			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
+	}
+	err = o.Raw(sql, pars).QueryRow(&amount)
+	return
+}
+
+// GetContractRegisterListByStartDate  根据起始日期的时间段筛选合同登记信息。
+func GetContractRegisterListByStartDate(startDate, endDate string) (results []*ContractRegisterRaiData, err error) {
+	o := orm.NewOrmUsingDB("fms")
+	sql := `SELECT 
+			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
+}

+ 20 - 4
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:"研究员名称"`
@@ -66,6 +71,7 @@ type RsCalendar struct {
 	EnglishCompany   int    `description:"是否为英文客户: 0-否; 1-是"`
 	SellerId         int    `description:"销售id"`
 	ShareSellerId    int    `description:"共享销售员id"`
+	CompanyStatus    string `description:"客户状态:'试用','永续','冻结','流失','正式','潜在'"`
 }
 
 type RsCalendarResearcher struct {
@@ -90,6 +96,10 @@ type RsCalendarResearcher struct {
 	IsSynced               int       `description:"是否与上海同步 0:未同步 1:已同步"`
 	ResearcherSort         int       `description:"研究员新增排序"`
 	UnionCode              string    `description:"公开会议联合编码"`
+	CompanyIndustry        string    `description:"客户行业"`
+	CompanyClassify        string    `description:"客户分类"`
+	QuestionStatus         int       `description:"问答状态:0-未填写;1-已填写"`
+	QuestionMsgStatus      int       `description:"问答模板消息:0-未发送;1-已发送"`
 }
 
 func GetRsCalendarById(rsCalendarId int) (item *RsCalendar, err error) {
@@ -318,6 +328,10 @@ type CalendarListView struct {
 	SubmitButton           bool   `description:"提交按钮是否展示"`
 	ViewButton             bool   `description:"查看按钮是否展示"`
 	EditButton             bool   `description:"修改按钮是否展示"`
+	CompanyIndustry        string `description:"客户行业"`
+	CompanyClassify        string `description:"客户分类"`
+	QuestionStatus         int    `description:"问答状态:0-未填写;1-已填写"`
+	QuestionMsgStatus      int    `description:"问答模板消息:0-未发送;1-已发送"`
 }
 
 type CalendarListResp struct {
@@ -357,7 +371,8 @@ func GetCalendarList(condition string, pars []interface{}, startSize, pageSize,
 				b.rs_calendar_researcher_id,b.start_date,
 				b.end_date,b.start_time,b.end_time,b.start_week,b.end_week,b.status,b.refuse_reason,b.refuse_time,
                 b.delete_reason,a.sys_user_real_name,a.city,a.province,a.company_name,a.company_id,
-                a.cooperation_name,a.theme,a.activity_category,a.english_company
+                a.cooperation_name,a.theme,a.activity_category,a.english_company,
+                b.company_industry,b.company_classify,b.question_status,b.question_msg_status
 				FROM  rs_calendar AS a
 				INNER JOIN rs_calendar_researcher AS b ON a.rs_calendar_id=b.rs_calendar_id
 				WHERE 1=1
@@ -379,7 +394,8 @@ func GetCalendarList(condition string, pars []interface{}, startSize, pageSize,
 				b.modify_time,b.researcher_id,b.researcher_name,
 				b.rs_calendar_researcher_id,b.start_date,
 				b.end_date,b.start_time,b.end_time,b.start_week,b.end_week,b.status,b.refuse_reason,b.refuse_time,
-                b.delete_reason,a.sys_user_real_name,a.city,a.province,a.company_name,a.company_id,a.cooperation_name,a.theme,a.activity_category,a.english_company
+                b.delete_reason,a.sys_user_real_name,a.city,a.province,a.company_name,a.company_id,a.cooperation_name,a.theme,a.activity_category,a.english_company,
+                b.company_industry,b.company_classify,b.question_status,b.question_msg_status
         FROM  rs_calendar AS a
 		INNER JOIN rs_calendar_researcher AS b ON a.rs_calendar_id=b.rs_calendar_id
 		WHERE 1=1 `
@@ -987,7 +1003,7 @@ func GetOverseaCustomCalendarList2(sellerId, researcherId, startDate, endDate, c
 
 	pars := make([]interface{}, 0)
 
-	sql1 := `SELECT b.start_date,b.end_date,b.start_time,b.end_time,a.rs_calendar_id,b.seller_id,b.seller_name,b.researcher_name,b.company_name,b.company_id,d.overseas_status as company_status,b.roadshow_type,a.theme,a.roadshow_platform,a.province as province,a.city as city FROM  rs_calendar AS a
+	sql1 := `SELECT b.start_date,b.end_date,b.start_time,b.end_time,a.rs_calendar_id,b.seller_id,b.seller_name,b.researcher_name,b.company_name,b.company_id,d.overseas_status as company_status,b.roadshow_type,a.theme,a.roadshow_platform,a.province as province,a.city as city ,a.english_company FROM  rs_calendar AS a
     INNER JOIN rs_report_record  AS b ON a.rs_calendar_id=b.rs_calendar_id
          JOIN company_product AS c ON a.company_id=c.company_id AND c.product_id=1
          JOIN company AS d ON c.company_id=d.company_id 
@@ -1012,7 +1028,7 @@ func GetOverseaCustomCalendarList2(sellerId, researcherId, startDate, endDate, c
 	if researcherId != "" {
 		sql1 += fmt.Sprintf(` AND b.researcher_id in (%s) `, researcherId)
 	}
-	sql2 := fmt.Sprintf(`SELECT bb.start_date,bb.end_date,bb.start_time,bb.end_time,aa.rs_calendar_id,bb.seller_id,bb.seller_name,bb.researcher_name,aa.company_name,aa.company_id,cc.overseas_status as company_status,bb.roadshow_type,aa.theme,aa.roadshow_platform,aa.province as province,aa.city as city FROM  rs_calendar AS aa
+	sql2 := fmt.Sprintf(`SELECT bb.start_date,bb.end_date,bb.start_time,bb.end_time,aa.rs_calendar_id,bb.seller_id,bb.seller_name,bb.researcher_name,aa.company_name,aa.company_id,cc.overseas_status as company_status,bb.roadshow_type,aa.theme,aa.roadshow_platform,aa.province as province,aa.city as city ,aa.english_company FROM  rs_calendar AS aa
     INNER JOIN rs_report_record  AS bb ON aa.rs_calendar_id=bb.rs_calendar_id
     INNER JOIN %s.english_company AS cc ON aa.company_id=cc.company_id
 		where aa.english_company= 1 AND aa.source = 0 AND cc.is_deleted=0  AND bb.rs_calendar_researcher_status=2 AND bb.researcher_id != 0 `, databaseName)

+ 206 - 0
models/roadshow/calendar_researcher_question.go

@@ -0,0 +1,206 @@
+package roadshow
+
+import (
+	"context"
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
+)
+
+type RsCalendarResearcherQuestion struct {
+	RsCalendarResearcherQuestionId int       `orm:"column(rs_calendar_researcher_question_id);pk"`
+	RsCalendarId                   int       `description:"路演日历ID"`
+	RsCalendarResearcherId         int       `description:"路演研究员记录ID"`
+	QuestionContent                string    `description:"提问内容"`
+	ReplyContent                   string    `description:"回复内容"`
+	CreateTime                     time.Time `description:"创建时间"`
+	ModifyTime                     time.Time `description:"更新时间"`
+}
+
+type RoadShowQuestionSaveReq struct {
+	RsCalendarId           int                                    `description:"路演ID"`
+	RsCalendarResearcherId int                                    `description:"路演研究员记录ID"`
+	CompanyIndustry        string                                 `description:"客户行业"`
+	CompanyClassify        string                                 `description:"客户分类"`
+	QuestionList           []*RsCalendarResearcherQuestionSaveReq `description:"问答列表"`
+}
+
+type RsCalendarResearcherQuestionSaveReq struct {
+	QuestionContent string `description:"提问内容"`
+	ReplyContent    string `description:"回复内容"`
+}
+
+func RoadShowQuestionSave(req *RoadShowQuestionSaveReq) (err error) {
+	o := orm.NewOrm()
+	tx, err := o.BeginWithCtx(context.Background())
+	if err != nil {
+		return err
+	}
+
+	defer func() {
+		if err != nil {
+			tx.Rollback()
+		} else {
+			tx.Commit()
+		}
+	}()
+
+	sql := ` UPDATE rs_calendar_researcher SET company_industry = ?,company_classify = ?,question_status=1 WHERE rs_calendar_researcher_id = ? `
+	_, err = tx.Raw(sql, req.CompanyIndustry, req.CompanyClassify, req.RsCalendarResearcherId).Exec()
+	if err != nil {
+		return err
+	}
+	list := make([]*RsCalendarResearcherQuestion, 0)
+	for _, v := range req.QuestionList {
+		item := new(RsCalendarResearcherQuestion)
+		item.RsCalendarId = req.RsCalendarId
+		item.RsCalendarResearcherId = req.RsCalendarResearcherId
+		item.QuestionContent = v.QuestionContent
+		item.ReplyContent = v.ReplyContent
+		item.ModifyTime = time.Now()
+		item.CreateTime = time.Now()
+		list = append(list, item)
+	}
+	_, err = tx.InsertMulti(len(list), &list)
+	return err
+}
+
+type RsCalendarResearcherQuestionView struct {
+	RsCalendarResearcherQuestionId int    `orm:"column(rs_calendar_researcher_question_id);pk"`
+	RsCalendarId                   int    `description:"路演日历ID"`
+	RsCalendarResearcherId         int    `description:"路演研究员记录ID"`
+	QuestionContent                string `description:"提问内容"`
+	ReplyContent                   string `description:"回复内容"`
+	ResearcherId                   int    `description:"研究员ID"`
+	ResearcherName                 string `description:"研究员名称"`
+	CreateTime                     string `description:"创建时间"`
+	ModifyTime                     string `description:"更新时间"`
+}
+
+func GetRoadShowQuestionList(condition string, pars []interface{}) (item []*RsCalendarResearcherQuestionView, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT a.*,b.researcher_id,b.researcher_name FROM rs_calendar_researcher_question AS a
+         LEFT JOIN rs_calendar_researcher AS b ON a.rs_calendar_researcher_id=b.rs_calendar_researcher_id
+         WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY a.create_time DESC  `
+	_, err = o.Raw(sql, pars).QueryRows(&item)
+	return
+}
+
+type QuestionSummary struct {
+	RsCalendarId           int    `orm:"column(rs_calendar_id);pk"`
+	SysUserId              int    `description:"创建人id"`
+	SysUserRealName        string `description:"创建人名称"`
+	ActivityType           string `description:"活动类型"`
+	RoadshowType           string `description:"路演形式"`
+	RoadshowPlatform       string `description:"路演平台"`
+	CompanyId              int    `description:"客户id"`
+	CompanyName            string `description:"客户名称"`
+	RsCalendarResearcherId int    `description:"活动研究员id"`
+	ResearcherId           string `description:"研究员id"`
+	ResearcherName         string `description:"研究员名称"`
+	StartDate              string `description:"开始日期"`
+	EndDate                string `description:"结束日期"`
+	StartTime              string `description:"开始时间"`
+	EndTime                string `description:"结束时间"`
+	StartWeek              string `description:"开始日期对应周"`
+	EndWeek                string `description:"结束日期对应周"`
+	Status                 int    `description:"状态:1:待接受,2:已接受,3:已拒绝,4:已删除,5:已撤回,6:已结束"`
+	RefuseReason           string `description:"拒绝理由"`
+	RefuseTime             string `description:"拒绝时间"`
+	DeleteReason           string `description:"删除原因"`
+	Province               string `description:"省"`
+	ProvinceCode           string `description:"省编码"`
+	City                   string `description:"市"`
+	CityCode               string `description:"市编码"`
+	District               string `description:"区"`
+	Theme                  string `description:"会议主题"`
+	CooperationName        string `description:"合作方名称"`
+	ActivityCategory       string `description:"活动类别"`
+	Source                 int    `description:"来源,0:自系统,1:上海方的"`
+	Title                  string `description:"日历展示标题"`
+	CompanyStatus          string `description:"新增客户状态"`
+	UnionCode              string `description:"公开会议联合编码"`
+	EnglishCompany         int    `description:"是否为英文客户: 0-否; 1-是"`
+	EnglishCountry         string `description:"英文客户-国家"`
+	EnglishViewTotal       int    `description:"英文客户-累计点击量"`
+	SubmitButton           bool   `description:"提交按钮是否展示"`
+	ViewButton             bool   `description:"查看按钮是否展示"`
+	EditButton             bool   `description:"修改按钮是否展示"`
+	CompanyIndustry        string `description:"客户行业"`
+	CompanyClassify        string `description:"客户分类"`
+	QuestionStatus         int    `description:"问答状态:0-未填写;1-已填写"`
+	QuestionMsgStatus      int    `description:"问答模板消息:0-未发送;1-已发送"`
+}
+
+type QuestionSummaryListResp struct {
+	Paging *paging.PagingItem
+	List   []*QuestionSummary
+}
+
+func GetQuestionSummaryListCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT COUNT(1) AS count FROM(SELECT COUNT(1) AS count
+				FROM  rs_calendar AS a
+				INNER JOIN rs_calendar_researcher AS b ON a.rs_calendar_id=b.rs_calendar_id
+				WHERE 1=1  `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` GROUP BY a.rs_calendar_id ) AS t `
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+func GetQuestionSummaryList(condition string, pars []interface{}, startSize, pageSize int) (list []*QuestionSummary, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT a.sys_user_id,a.sys_user_real_name,a.rs_calendar_id,a.activity_type,a.roadshow_type,a.activity_category,a.roadshow_platform,a.english_company,b.create_time,a.district,
+				b.modify_time,GROUP_CONCAT(b.researcher_id ORDER BY researcher_sort ASC) AS researcher_id,GROUP_CONCAT(b.researcher_name ORDER BY researcher_sort ASC) AS researcher_name,
+				b.rs_calendar_researcher_id,b.start_date,
+				b.end_date,b.start_time,b.end_time,b.start_week,b.end_week,b.status,b.refuse_reason,b.refuse_time,
+                b.delete_reason,a.sys_user_real_name,a.city,a.province,a.company_name,a.company_id,
+                a.cooperation_name,a.theme,a.activity_category,a.english_company,
+                b.question_status,b.question_msg_status,
+ 				GROUP_CONCAT(b.company_industry) AS company_industry,
+ 				GROUP_CONCAT(b.company_classify) AS company_classify
+				FROM  rs_calendar AS a
+				INNER JOIN rs_calendar_researcher AS b ON a.rs_calendar_id=b.rs_calendar_id
+				WHERE 1=1
+ `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` GROUP BY a.rs_calendar_id
+				 ORDER BY b.create_time DESC LIMIT ?,? `
+
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&list)
+	return
+}
+
+func GetQuestionSummaryExport(condition string, pars []interface{}) (list []*QuestionSummary, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT a.rs_calendar_id,a.activity_type,a.roadshow_type,a.activity_category,a.roadshow_platform,b.create_time,a.district,
+				b.modify_time,GROUP_CONCAT(b.researcher_id ORDER BY researcher_sort ASC) AS researcher_id,GROUP_CONCAT(b.researcher_name ORDER BY researcher_sort ASC) AS researcher_name,
+				b.rs_calendar_researcher_id,b.start_date,
+				b.end_date,b.start_time,b.end_time,b.start_week,b.end_week,b.status,b.refuse_reason,b.refuse_time,
+                b.delete_reason,a.sys_user_real_name,a.city,a.province,a.company_name,a.company_id,
+                a.cooperation_name,a.theme,a.activity_category,a.english_company,
+                b.question_status,b.question_msg_status,
+ 				GROUP_CONCAT(b.company_industry) AS company_industry,
+ 				GROUP_CONCAT(b.company_classify) AS company_classify
+				FROM  rs_calendar AS a
+				INNER JOIN rs_calendar_researcher AS b ON a.rs_calendar_id=b.rs_calendar_id
+				WHERE 1=1
+ `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` GROUP BY a.rs_calendar_id
+				 ORDER BY b.create_time DESC `
+
+	_, err = o.Raw(sql, pars).QueryRows(&list)
+	return
+}

+ 1 - 0
models/roadshow/company.go

@@ -105,4 +105,5 @@ type CompanyDetailView struct {
 	EnglishCompany   int    `description:"是否为英文客户: 0-否; 1-是"`
 	EnglishCountry   string `description:"英文客户-国家"`
 	EnglishViewTotal int    `description:"英文客户-累计点击量"`
+	CompanyType      string `description:"客户类型"`
 }

+ 131 - 12
models/roadshow/report_record.go

@@ -32,6 +32,8 @@ type RsReportRecord struct {
 	EndWeek                    string    `description:"结束日期对应周"`
 	CreateTime                 time.Time `description:"记录创建时间"`
 	RsCalendarResearcherStatus int       `description:"路演活动状态"`
+	PermissionName             string    `description:"开通品种"`
+	InteractionNum             int       `description:"当时用户总的互动量"`
 }
 
 // RsReportRecordResp 总统计信息
@@ -57,14 +59,19 @@ type AdminReportRecord struct {
 
 // RsReportRecordNum 系统用户统计信息
 type RsReportRecordNum struct {
-	TryOutNum  int    `description:"试用路演次数"`
-	FormalNum  int    `description:"正式路演次数"`
-	MeetingNum int    `description:"会议次数"`
-	OnlineNum  int    `description:"线上路演次数"`
-	OfflineNum 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) {
@@ -97,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()
@@ -141,14 +168,21 @@ type RsReportRecordList struct {
 	Province                   string    `description:"省"`
 	City                       string    `description:"市"`
 	CooperationName            string    `description:"合作方名称"`
+	CompanyIndustry            string    `description:"客户行业"`
+	CompanyClassify            string    `description:"客户分类"`
+	QuestionStatus             int       `description:"问答状态:0-未填写;1-已填写"`
+	QuestionMsgStatus          int       `description:"问答模板消息:0-未发送;1-已发送"`
+	CompanyType                string    `description:"客户类型:FICC/权益"`
+	EnglishCompany             int       `description:"是否为英文客户: 0-否; 1-是"`
 }
 
 // GetRsReportRecordList 获取路演统计详情返回数据
 func GetRsReportRecordList(condition string, pars []interface{}) (list []*RsReportRecordList, err error) {
 	o := orm.NewOrm()
-	sql := ` SELECT a.*,b.theme,b.roadshow_platform,b.province,b.city,b.cooperation_name
+	sql := ` SELECT a.*,b.theme,b.roadshow_platform,b.province,b.city,b.cooperation_name,b.english_company,c.company_industry,c.company_classify,c.question_status,c.question_msg_status
 				FROM  rs_report_record a 
 				join rs_calendar b on a.rs_calendar_id=b.rs_calendar_id
+				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 != "" {
@@ -274,8 +308,6 @@ type RsOverseasReportRecordResp struct {
 	RsReportRecordNumList []RsOverseasReportRecordNum `description:"统计次数"`
 }
 
-
-
 func GetOverseasGroupResearcherRecordList(startDate, endDate, companyStatus string) (list []*RsReportRecordGroup, err error) {
 	var databaseName string
 	if utils.RunMode == "debug" {
@@ -404,9 +436,96 @@ func GetOverseasGroupSellerRecordList(startDate, endDate, companyStatus string)
 	sql := `SELECT m.*,SUM(m.num) AS num  FROM (` + sql1 + ` UNION ALL ` + sql2
 	sql += ` ) AS m  WHERE 1=1 `
 
-
 	sql += ` Group by admin_id `
 	_, err = o.Raw(sql, pars).QueryRows(&list)
 
 	return
 }
+
+// 根据ID获取详情
+func GetRsReportRecordDetailByRsReportRecordId(rsReportRecordId int) (item *RsReportRecord, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * FROM rs_report_record WHERE rs_report_record_id=? `
+	err = o.Raw(sql, rsReportRecordId).QueryRow(&item)
+	return
+}
+
+// UpdateRsReportRecordPermissionMulti 批量修改
+func UpdateRsReportRecordPermissionMulti(items []*RsReportRecord) (err error) {
+	o, err := orm.NewOrm().Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err == nil {
+			o.Commit()
+		} else {
+			o.Rollback()
+		}
+	}()
+
+	//批量修改
+	p, err := o.Raw("UPDATE rs_report_record SET permission_name = ?  WHERE rs_report_record_id = ?").Prepare()
+	if err != nil {
+		return
+	}
+	defer func() {
+		_ = p.Close() // 别忘记关闭 statement
+	}()
+
+	for _, v := range items {
+		_, err = p.Exec(v.PermissionName, v.RsReportRecordId)
+		if err != nil {
+			return
+		}
+	}
+	return
+}
+
+// UpdateRsReportRecordInteractionNumnMulti 批量修改互动数量
+func UpdateRsReportRecordInteractionNumnMulti(items []*RsReportRecord) (err error) {
+	o, err := orm.NewOrm().Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err == nil {
+			o.Commit()
+		} else {
+			o.Rollback()
+		}
+	}()
+
+	//批量修改
+	p, err := o.Raw("UPDATE rs_report_record SET interaction_num = ?  WHERE rs_report_record_id = ?").Prepare()
+	if err != nil {
+		return
+	}
+	defer func() {
+		_ = p.Close() // 别忘记关闭 statement
+	}()
+
+	for _, v := range items {
+		_, err = p.Exec(v.InteractionNum, v.RsReportRecordId)
+		if err != nil {
+			return
+		}
+	}
+	return
+}
+
+func GetReportResearcherExport(condition string, pars []interface{}) (list []*RsReportRecordList, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT a.*,b.theme,b.roadshow_platform,b.province,b.city,b.cooperation_name,c.company_industry,c.company_classify,c.question_status,c.question_msg_status,b.english_company
+				FROM  rs_report_record a 
+				join rs_calendar b on a.rs_calendar_id=b.rs_calendar_id
+				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 += ` order BY a.start_date DESC,a.start_time DESC`
+	_, err = o.Raw(sql, pars).QueryRows(&list)
+	return
+}

+ 9 - 1
models/roadshow/rs_calendar_meeting_user.go

@@ -85,13 +85,21 @@ func MultiAddRsCalendarMeetingUser(items []*RsCalendarMeetingUser, roadShowTheme
 }
 
 // 获取第一个提交参会信息内容
-func GetRsCalendarMeetingUserFirst(rsCalendarId int) (item *RsCalendarResearcher, err error) {
+func GetRsCalendarMeetingUserFirst(rsCalendarId int) (item *RsCalendarMeetingUser, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT * FROM rs_calendar_meeting_user WHERE rs_calendar_id=? LIMIT 1   `
 	err = o.Raw(sql, rsCalendarId).QueryRow(&item)
 	return
 }
 
+// 获取第一个提交参会信息内容
+func GetRsCalendarMeetingUserByRsCalendarMeetingUserId(rsCalendarMeetingUserId int) (item *RsCalendarMeetingUser, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM rs_calendar_meeting_user WHERE rs_calendar_meeting_user_id =?  `
+	err = o.Raw(sql, rsCalendarMeetingUserId).QueryRow(&item)
+	return
+}
+
 // 删除
 func DeleteRsCalendarMeetingUser(rsCalendarMeetingUserID int) (err error) {
 	o := orm.NewOrm()

+ 40 - 0
models/roadshow/rs_report_record_permission.go

@@ -0,0 +1,40 @@
+package roadshow
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"hongze/hz_crm_api/utils"
+	"time"
+)
+
+type RsReportRecordPermission struct {
+	RsReportRecordPermissionId int64     `orm:"column(rs_report_record_permission_id);pk"`
+	CompanyId                  int       `description:"公司id"`
+	ProductId                  int       `description:"产品id"`
+	ProductName                string    `description:"产品名称"`
+	ReportPermissionId         int       `description:"权限id(作废)"`
+	Status                     string    `description:"状态"`
+	CreatedTime                time.Time `description:"创建时间"`
+	ChartPermissionId          int       `description:"大分类ID"`
+	StartDate                  string    `description:"合同开始日期"`
+	EndDate                    string    `description:"合同结束日期"`
+	ModifyTime                 string    `description:"更新时间"`
+	IsUpgrade                  int       `description:"是否升级,1是,0否"`
+	ExpensiveYx                int       `description:"权益研选: 0-3w; 1-5w"`
+	RsCalendarId               int       `description:"路演活动id"`
+	time.Time
+}
+
+// 根据企业用户id和产品id获取所有正式的权限
+func GetCompanyProductReportPermissionList(companyId []int, productId int) (items []*RsReportRecordPermission, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM company_report_permission  WHERE company_id IN (` + utils.GetOrmInReplace(len(companyId)) + `) and product_id=?  `
+	_, err = o.Raw(sql, companyId, productId).QueryRows(&items)
+	return
+}
+
+func MultiRsReportRecordPermission(items []*RsReportRecordPermission) (err error) {
+	o := orm.NewOrm()
+	//批量插入
+	_, err = o.InsertMulti(len(items), items)
+	return
+}

+ 7 - 0
models/seal/request/seal_approval.go

@@ -13,6 +13,10 @@ type SealApprovalApplyReq struct {
 	FileUrls          []string `description:"多个文件附件地址"`
 	FileNum           int      `description:"文件份数"`
 	AffiliatedCompany string   `description:"归属公司"`
+	CompanyId         int      `description:"客户id"`
+	StartDate         string   `description:"开始日期."`
+	EndDate           string   `description:"结束日期"`
+	Money             float64  `description:"合同金额"`
 }
 
 // 用印审批编辑请求
@@ -29,6 +33,9 @@ type SealApprovalEditReq struct {
 	FileUrls          []string `description:"多个文件附件地址"`
 	FileNum           int      `description:"文件份数"`
 	AffiliatedCompany string   `description:"归属公司"`
+	StartDate         string   `description:"开始日期"`
+	EndDate           string   `description:"结束日期"`
+	Money             float64  `description:"合同金额"`
 }
 
 // 用印审批撤回请求

+ 146 - 4
models/seal/seal.go

@@ -34,6 +34,12 @@ type Seal struct {
 	CreateTime        time.Time `description:"添加时间"`
 	CheckBackFileTime time.Time `description:"签回用印附件时间"`
 	AffiliatedCompany string    `description:"归属公司"`
+	ProductId         int       `description:"产品id,1:ficc;2:权益."`
+	CompanyId         int       `description:"客户id."`
+	StartDate         string    `description:"开始日期."`
+	EndDate           string    `description:"结束日期。"`
+	CompanyContractId int       `description:"合同id"`
+	Money             float64   `description:"合同金额"`
 }
 
 var EnumUse = []string{"销售合同", "渠道合同", "付款通知函", "招投标", "战略合作协议", "代付合同", "总对总协议"}
@@ -57,6 +63,24 @@ func GetSealInfoByContractId(sealId int) (sealInfo *Seal, err error) {
 	return
 }
 
+// GetSealInfoByDateAndCompanyId 根据起始时间,公司ID获取合同信息
+func GetSealInfoByDateAndCompanyId(startDate, endDate string, companyId int) (sealInfo *Seal, err error) {
+	o := orm.NewOrm()
+
+	sql := `select * from seal where start_date = ? and end_date = ? AND company_id =?  AND  product_id = 2   AND  company_contract_id  = 0  order by seal_id asc limit 1 `
+	err = o.Raw(sql, startDate, endDate, companyId).QueryRow(&sealInfo)
+	return
+}
+
+// GetCountByDateAndCompanyId  根据起始时间,公司ID获取合同信息数量
+func GetCountByDateAndCompanyId(startDate, endDate string, companyId int) (count int, err error) {
+	o := orm.NewOrm()
+
+	sql := "select count(*) AS COUNT from seal   where start_date = ? and end_date = ? AND company_id =?  AND  product_id = 2   AND  company_contract_id  = 0    "
+	err = o.Raw(sql, startDate, endDate, companyId).QueryRow(&count)
+	return
+}
+
 // AddSeal 用印添加
 func AddSeal(sealInfo *Seal) (err error) {
 	o := orm.NewOrm()
@@ -95,9 +119,19 @@ func Invalid(sealInfo *Seal) (err error) {
 	return
 }
 
+// UpdateSealCompanyContractId 添加用印与合同的关系
+func UpdateSealCompanyContractId(companyContractId, sealId int) (err error) {
+	//修改用印数据入库
+	o := orm.NewOrm()
+	msql := " UPDATE seal SET company_contract_id = ? WHERE seal_id = ? "
+	_, err = o.Raw(msql, companyContractId, sealId).Exec()
+	return
+}
+
 // GetSealCode 生成合同编号
 func GetSealCode() (code string, err error) {
 	var num int
+	var num2 int
 	o := orm.NewOrm()
 	today := utils.GetToday(utils.FormatDate)
 	sql := `SELECT COUNT(1) AS num FROM seal where create_time>=?`
@@ -106,10 +140,34 @@ func GetSealCode() (code string, err error) {
 		return
 	}
 
+	sql = `SELECT COUNT(1) AS num FROM contract where create_time>=?` // 把正式合同的部分也算上
+	err = o.Raw(sql, today).QueryRow(&num2)
+	num += num2
+
 	code = "HZ" + time.Now().Format("20060102") + fmt.Sprintf("%03d", num)
 	return
 }
 
+// GetSealCodeRai 生成权益合同编号1
+func GetSealCodeRai() (code string, err error) {
+	var num int
+	var num2 int
+	o := orm.NewOrm()
+	today := utils.GetToday(utils.FormatDate)
+	sql := `SELECT COUNT(1) AS num FROM seal where create_time>=?`
+	err = o.Raw(sql, today).QueryRow(&num)
+	if err != nil {
+		return
+	}
+
+	sql = `SELECT COUNT(1) AS num FROM contract where create_time>=?` // 把正式合同的部分也算上
+	err = o.Raw(sql, today).QueryRow(&num2)
+	num += num2
+
+	code = "HZEQ" + time.Now().Format("20060102") + fmt.Sprintf("%03d", num)
+	return
+}
+
 type CompanyNameList struct {
 	CompanyName string `description:"客户名称,甲方名称,长度32位"`
 }
@@ -158,10 +216,51 @@ func GetList(condition string, pars []interface{}, startSize, pageSize int) (lis
 	return
 }
 
+//type SealApprovalItem struct {
+//	ContractApprovalId       int                     `description:"审批单ID"`
+//	ContractId               int                     `description:"合同ID"`
+//	ContractApprovalRecordId int                     `description:"审批流ID"`
+//	Code                     string                  `description:"合同编号"`
+//	Use                      string                  `description:"用印用途,枚举值:'销售合同','渠道合同','付款通知函','招投标','战略合作协议'"`
+//	ContractType             string                  `description:"合同类型,枚举值:'新签合同','续约合同','补充协议','代付合同'"`
+//	Status                   string                  `description:"合同状态,枚举值:待审批','已审批','已驳回','已撤回','已签回',默认待审批"`
+//	ApproveStatus            string                  `json:"-" description:"审批单状态,枚举值:待审批','已审批','已驳回','已撤回',默认待审批"`
+//	ApplyContent             string                  `description:"申请内容"`
+//	ApplyUserId              int                     `description:"申请人ID"`
+//	ApplyUserName            string                  `description:"申请人名称"`
+//	ContractDetail           string                  `json:"-" description:"提交审批时的合同信息;用印快照"`
+//	ContractInfo             contract.ContractDetail `json:"-" description:"提交审批时的合同信息;用印快照"`
+//	ApproveRemark            string                  `description:"审核备注"`
+//	SealType                 string                  `description:"用印类型"`
+//	CompanyName              string                  `description:"客户名称"`
+//	FileUrl                  string                  `description:"合同下载地址"`
+//	CurrNodeId               int                     `description:"当前审批节点id"`
+//	StartNodeId              int                     `description:"开始审批节点id"`
+//	//UserId                   int                     `description:"申请人id"`
+//	//UserName                 string                  `description:"申请人名称"`
+//	SealId               int       `description:"用印审批ID"`
+//	CreateTime           time.Time `description:"发起审批的时间"`
+//	ModifyTime           time.Time `description:"最后一次修改的时间"`
+//	ApproveTime          time.Time `description:"审批时间"`
+//	InvalidTime          time.Time `description:"作废时间"`
+//	CheckBackFileUrl     string    `description:"签回附件地址"`
+//	CheckBackFileTime    time.Time `description:"签回用印附件时间"`
+//	CreditCode           string    `description:"社会信用码"`
+//	CreateTimeStr        string    `description:"发起审批的时间(字符串)"`
+//	ModifyTimeStr        string    `description:"最后一次修改的时间(字符串)"`
+//	ApproveTimeStr       string    `description:"审批时间(字符串)"`
+//	InvalidTimeStr       string    `description:"作废时间(字符串)"`
+//	CheckBackFileTimeStr string    `description:"签回用印附件时间(字符串)"`
+//	ContractCode         string    `description:"合同编码"`
+//	AffiliatedCompany    string    `description:"归属公司"`
+//	ProductId            int       `description:"产品id,1:ficc;2:权益。"`
+//}
+
 type SealApprovalItem struct {
-	ContractApprovalId       int `description:"审批单ID"`
-	ContractId               int `description:"合同ID"`
-	ContractApprovalRecordId int `description:"审批流ID"`
+	ContractApprovalId       int    `description:"审批单ID"`
+	ContractId               int    `description:"合同ID"`
+	ContractApprovalRecordId int    `description:"审批流ID"`
+	Code                     string `description:"合同编号"`
 	//ContractCode             string                  `description:"合同编号"`
 	Use            string                  `description:"用印用途,枚举值:'销售合同','渠道合同','付款通知函','招投标','战略合作协议'"`
 	ContractType   string                  `description:"合同类型,枚举值:'新签合同','续约合同','补充协议','代付合同'"`
@@ -195,13 +294,37 @@ type SealApprovalItem struct {
 	CheckBackFileTimeStr string    `description:"签回用印附件时间(字符串)"`
 	ContractCode         string    `description:"合同编码"`
 	AffiliatedCompany    string    `description:"归属公司"`
+	ProductId            int       `description:"产品id,1:ficc;2:权益。"`
 }
 
 // GetSealApprovalListByWhere 获取用印审批列表-分页
+//func GetSealApprovalListByWhere(condition, joinCondition string, pars []interface{}, startSize, pageSize int) (list []*SealApprovalItem, total int, err error) {
+//	o := orm.NewOrm()
+//	fields := `a.contract_approval_id,c.contract_id,a.apply_content,a.approve_remark,a.apply_user_id,a.apply_user_name,a.curr_node_id,a.start_node_id,c.create_time,a.modify_time,a.status approval_status,
+//			   c.status,c.seal_id,c.seal_type,c.service_type contract_type,c.use,c.company_name,c.file_url,c.approve_time,c.invalid_time,c.code,c.credit_code,c.check_back_file_time,c.check_back_file_url,c.product_id,c.affiliated_company `
+//	sql := `SELECT ` + fields + ` from contract_approval a JOIN ( SELECT max( contract_approval_id ) max_id,contract_id FROM contract_approval where 1=1 and approval_type = "seal" `
+//	sql += ` GROUP BY contract_id ) b on a.contract_approval_id=b.max_id
+//	JOIN seal c ON c.seal_id = a.contract_id
+//	JOIN contract_approval_record d on a.contract_approval_id=d.contract_approval_id ` + joinCondition + `
+//WHERE c.is_delete = 0 AND a.approval_type="seal" `
+//	sql += condition
+//	sql += ` group by c.seal_id order by c.create_time desc`
+//	totalSql := `SELECT COUNT(1) total FROM (` + sql + `) z`
+//	err = o.Raw(totalSql, pars).QueryRow(&total)
+//	if err != nil {
+//		return
+//	}
+//	sql += ` LIMIT ?,? `
+//	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&list)
+//
+//	return
+//}
+
 func GetSealApprovalListByWhere(condition, joinCondition string, pars []interface{}, startSize, pageSize int) (list []*SealApprovalItem, total int, err error) {
+	//git
 	o := orm.NewOrm()
 	fields := `a.contract_approval_id,c.contract_id,a.apply_content,a.approve_remark,a.apply_user_id,a.apply_user_name,a.curr_node_id,a.start_node_id,c.create_time,a.modify_time,a.status approval_status,
-			   c.status,c.seal_id,c.seal_type,c.service_type contract_type,c.use,c.company_name,c.file_url,c.approve_time,c.invalid_time,c.code,c.credit_code,c.check_back_file_time,c.check_back_file_url,c.affiliated_company `
+			   c.status,c.seal_id,c.seal_type,c.service_type contract_type,c.use,c.company_name,c.file_url,c.approve_time,c.invalid_time,c.code,c.credit_code,c.check_back_file_time,c.check_back_file_url,c.affiliated_company,c.product_id `
 	sql := `SELECT ` + fields + ` from contract_approval a JOIN ( SELECT max( contract_approval_id ) max_id,contract_id FROM contract_approval where 1=1 and approval_type = "seal" `
 	sql += ` GROUP BY contract_id ) b on a.contract_approval_id=b.max_id
 	JOIN seal c ON c.seal_id = a.contract_id 
@@ -281,3 +404,22 @@ WHERE c.is_delete = 0 AND a.approval_type="seal" `
 
 	return
 }
+
+// Seal 用印结构体
+type SealSearCodeView struct {
+	SealId    int     `orm:"column(seal_id);pk"`
+	Code      string  `description:"用印编号,长度32位"`
+	StartDate string  `description:"开始日期."`
+	EndDate   string  `description:"结束日期。"`
+	Money     float64 `description:"合同金额"`
+}
+
+// Seal 用印结构体
+type SealSearCodeViewListResp struct {
+	List []*SealSearCodeView
+}
+
+// Seal 用印结构体
+type SealSearCodeViewDetailResp struct {
+	Detail *SealSearCodeView
+}

+ 67 - 1
models/statistic_report.go

@@ -417,6 +417,7 @@ type IncrementalList struct {
 	ShareSellerInit string `description:"共享销售员"`
 	Operation       string `description:"共享销售员"`
 	SysUserId       int    `description:"操作人用户id"`
+	SysRealName     string `description:"操作者名称"`
 }
 
 // GetIncrementalNewCompanyCount 获取增量客户报表列表统计数据(根据合同来展示)
@@ -751,6 +752,23 @@ a.product_id,a.product_name,b.region_type,c.renewal_reason FROM company_operatio
 	return
 }
 
+// 获取试用客户报表列表统计数据(根据新增客户时间来展示)
+func GetIncrementalCompanyCountByOperationRecordRai(condition string, pars []interface{}) (total int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT a.id,a.company_id,b.company_name,c.seller_id,c.seller_name,
+a.product_id,a.product_name,b.region_type,c.renewal_reason 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 WHERE 1 = 1 `
+
+	if condition != "" {
+		sql += condition
+	}
+	//sql += " order by a.start_date desc "
+	sql = `select count(1) count from (` + sql + ` group by a.id ) f `
+	err = o.Raw(sql, pars).QueryRow(&total)
+	return
+}
+
 // 获取试用客户报表列表统计数据(根据新增客户和对应的产品时间来展示)
 func GetIncrementalCompanyProductCountByOperationRecord(condition string, pars []interface{}) (total int, err error) {
 	o := orm.NewOrm()
@@ -805,7 +823,31 @@ 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 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
+where a.id in (` + sql1 + `) order by  create_time DESC,company_id DESC limit ?,?`
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+// GetIncrementalCompanyListByOperationRecord 获取试用客户报表列表数据(根据新增客户时间来展示)
+func GetIncrementalCompanyListByOperationRecordRai(condition string, pars []interface{}, startSize, pageSize int) (items []*IncrementalList, err error) {
+	o := orm.NewOrm()
+	//查询出最大id
+	sql1 := `SELECT max(id) id 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 
+	WHERE 1 = 1 `
+	if condition != "" {
+		sql1 += condition
+	}
+	sql1 += ` GROUP BY a.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 ,a.sys_user_id  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
@@ -990,6 +1032,30 @@ func GetIncrementalCompanyMergeList(condition string, pars []interface{}, startS
 	return
 }
 
+// 增量客户统计报表列表数据结构
+type CompanyContractGroupList struct {
+	CompanyId    int `description:"企业客户id"`
+	CompanyCount int `description:"合同数"`
+}
+
+// GetIncrementalNewCompanyList 获取增量客户报表列表数据(根据合同来展示)
+func GetCompanyContractGroupList(condition string, pars []interface{}) (items []*CompanyContractGroupList, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+			a.company_id,
+			COUNT( a.company_id )  company_count 
+		FROM
+			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 a.company_id `
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
 // GetIncrementalNewCompanyList 获取到期合同列表数据(根据合同来展示)
 func GetIncrementalCompanyMergeListEnd(condition string, pars []interface{}, startSize, pageSize int) (items []*IncrementalList, err error) {
 	o := orm.NewOrm()

+ 188 - 0
models/statistic_report/rai_data_summary.go

@@ -0,0 +1,188 @@
+package statistic_report
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"hongze/hz_crm_api/models/company"
+)
+
+// 时间区间数据结构
+type DateInterval struct {
+	StartDate string `description:"合同开始日期"`
+	EndDate   string `description:"合同结束日期"`
+}
+
+type RaiDataSummaryListResp struct {
+	List []*RaiDataSummaryResp
+}
+
+type RaiDataSummaryResp struct {
+	DataType string `description:"时间区间"`
+	DataList []*RaiDataSummaryDetail
+}
+
+type RaiDataSummaryDetail struct {
+	IsServerSeller                   bool   `description:"是否属于服务组销售"`
+	SellerId                         string `description:"销售id"`
+	SellerName                       string `description:"销售名称"`
+	AddTrialCount                    string `description:"新增试用"`
+	NewContractData                  string `description:"新签合同(金额/数量)"`
+	ExpiredContractData              string `description:"到期合同(金额/数量)"`
+	RenewedContractData              string `description:"续约合同(金额/数量)"`
+	RenewalRateData                  string `description:"续约率(金额/数量)"`
+	ConfirmedNoRenewalContractData   string `description:"确认不续约合同(金额/数量)"`
+	ConfirmNonRenewalRateData        string `description:"确认不续约率(金额/数量)"`
+	SignedClientCount                string `description:"签约客户数量"`
+	AverageRevenueCount              string `description:"客单价"`
+	InvoiceAmountCount               string `description:"开票金额"`
+	PaymentReceivedCount             string `description:"到款金额"`
+	UnpaidRatioCount                 string `description:"未到款比例"`
+	NewCustomerInvoicingCount        string `description:"新客开票"`
+	NewCustomerPaymentsReceivedCount string `description:"新客到款"`
+}
+
+// 增量客户统计报表列表数据结构
+type IncrementalList struct {
+	CompanyContractId    int                                `description:"合同id"`
+	ContractType         string                             `description:"合同类型"`
+	CompanyId            int                                `description:"企业客户id"`
+	CompanyName          string                             `description:"企业客户名称"`
+	ProductId            int                                `description:"产品id"`
+	ProductName          string                             `description:"产品名称"`
+	ProductStatus        string                             `description:"产品名称"`
+	CompanyProductId     int                                `description:"客户购买产品授权id"`
+	ContractCode         string                             `description:"合同编码"`
+	StartDate            string                             `description:"合同开始日期"`
+	EndDate              string                             `description:"合同结束日期"`
+	Money                float64                            `description:"合同金额"`
+	PayMethod            string                             `description:"付款方式"`
+	PayChannel           string                             `description:"付款渠道"`
+	ImgUrl               string                             `description:"合同图片"`
+	CreateTime           string                             `description:"合同创建时间"`
+	ModifyTime           string                             `description:"合同修改时间"`
+	Status               string                             `description:"合同审批状态,0:待审批,1:已审批;默认:1"`
+	RegionType           string                             `description:"企业客户所属区域;可选范围:国内,海外"`
+	SellerId             int                                `description:"归属销售id"`
+	SellerName           string                             `description:"归属销售名称"`
+	SellerNameLast       string                             `description:"合同到期之前最后所属归属销售名称"`
+	ShareSeller          string                             `description:"合同到期之前最后所属共享销售员"`
+	ShareSellerLast      string                             `description:"共享销售员"`
+	ExpireDay            string                             `description:"剩余可用天数"`
+	PermissionList       []*company.CompanyReportPermission `description:"产品权限"`
+	Count                int                                `json:"-" description:"合同数"`
+	RenewalReason        string                             `description:"未续约说明"`
+	RenewalTodo          string                             `description:"未续约说明中的待办事项说明"`
+	PackageDifference    string                             `description:"和上一份合同的区别"`
+	AscribeContent       string                             `description:"归因标签说明"`
+	IsShowNoRenewedNote  bool                               `description:"是否展示未续约备注按钮"`
+	Content              string                             `description:"归因内容说明"`
+	PermissionName       string                             `description:"权限名"`
+	PermissionNameExport string                             `description:"权限名导出时使用"`
+	PermissionNameStatus string                             `description:"权限状态"`
+	CompanyProductStatus string                             `description:"客户状态"`
+	//CompanyContractIdGroup string                             `description:"表company_contract合并的 company_contract_id"`
+	IsUserMaker       int    `description:"近四周之内是否包含决策人互动过 ,0否,1是"`
+	SellerNameInit    string `description:"权益初始化销售"`
+	SellerIdInit      int    `description:"权益初始化销售ID"`
+	SellerIdLast      int    `description:"合同到期之前最后所属销售ID"`
+	ShareSellerIdInit int    `description:"共享销售员"`
+	ShareSellerIdLast int    `description:"合同到期之前最后共享销售员ID"`
+	SysRealName       string `description:"操作者名称"`
+	Operation         string `description:"操作"`
+	RaiContractType   string `description:"权益合同类型:枚举值:'新签合同','续约合同','补充协议'"`
+	InheritEndDate    string `description:"所继承上一份合同的结束日期,权益自定义续约合同统计使用"`
+	DueEndDate        string `description:"所继承上一份合同的结束日期,权益自定义到期合同统计使用"`
+}
+
+// GetRaiDataSummaryList 获取增量客户报表列表数据(根据合同来展示)
+func GetRaiDataSummaryList(condition string, pars []interface{}) (items []*IncrementalList, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT a.start_date,
+			   a.end_date,
+			   a.due_end_date,
+			   a.company_contract_id,
+			   a.money,
+			   a.company_id,
+			   a.rai_contract_type,
+			   a.seller_id_init,
+			   a.seller_name_init,
+			   a.share_seller_init,
+			   a.share_seller_id_init,
+			   a.seller_id_last,
+			   a.seller_name_last, 
+			   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
+	   WHERE 1 = 1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` group by a.company_contract_id  order by a.start_date desc,a.company_id desc `
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// GetRaiDataSummaryList 获取增量客户报表列表数据(根据合同来展示)
+func GetRaiDataSummaryInheritList(condition string, pars []interface{}) (items []*IncrementalList, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT a.start_date,
+			   a.end_date,
+			   a.inherit_end_date,
+			   a.company_contract_id,
+			   a.money,
+		       a.company_id,
+			   a.rai_contract_type,
+			   a.seller_id_init,
+			   a.seller_name_init,
+			   a.share_seller_init,
+			   a.share_seller_id_init,
+			   a.seller_id_last,
+			   a.seller_name_last, 
+			   a.share_seller_last,
+			   a.share_seller_id_last
+       FROM company_contract a
+	   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 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` group by a.company_contract_id  order by a.start_date desc,a.company_id desc `
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+type RaiDataSummaryPopupTypeResp struct {
+	CompanyNum      int                         `description:"企业客户数量"`
+	CompanyMultiple int                         `description:"户有多份合同的企业客户数量"`
+	Paging          *paging.PagingItem          `description:"分页数据"`
+	List            []*RaiDataSummaryDetailResp `description:"列表"`
+}
+
+// 增量客户统计报表列表数据结构
+type RaiDataSummaryDetailResp struct {
+	CompanyId              int     `description:"企业客户ID"`
+	CompanyName            string  `description:"企业客户名称"`
+	SellerName             string  `description:"归属销售名称"`
+	AddType                string  `description:"新增类型"`
+	CreateTime             string  `description:"创建时间"`
+	StartDate              string  `description:"合同开始日期"`
+	EndDate                string  `description:"合同结束日期"`
+	Money                  float64 `description:"合同金额"`
+	PermissionName         string  `description:"权限名"`
+	RenewedContractMoney   string  `description:"续约金额"`
+	ExpiredContractMoney   string  `description:"到期金额"`
+	RenewalRate            string  `description:"续约率"`
+	RenewedContractCompany int     `description:"续约客户数"`
+	RenewedContract        int     `description:"续约合同数"`
+	NewContractCompany     int     `description:"新签客户数"`
+	NewContract            int     `description:"新签合同数"`
+	ContractMoney          string  `description:"签约总金额"`
+	ContractNum            int     `description:"签约客户数"`
+	ContractCode           string  `description:"合同编号"`
+	InvoicedAmount         float64 ` description:"开票金额"`
+	PaymentAmount          float64 ` description:"到款金额"`
+	NotReceivedtAmount     float64 ` description:"未到账金额"`
+	TbaleNameAText         string  ` description:"表格A列占位符"` //配合前端渲染使用,没有啥实际意义
+}

+ 8 - 0
models/system/sys_admin.go

@@ -566,3 +566,11 @@ func GetRaiAdminInitRai() (items []*AdminItem, err error) {
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
+
+// 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
+}

+ 7 - 0
models/system/sys_user.go

@@ -130,6 +130,13 @@ func GetAdminList() (items []*Admin, err error) {
 	return
 }
 
+func GetAdminEnabledList() (items []*Admin, err error) {
+	sql := `SELECT * FROM admin  WHERE  enabled=1  `
+	o := orm.NewOrm()
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
 // GetSysUserByMobile 根据手机号获取管理信息
 //func GetSysUserByMobile(mobile string) (item *Admin, err error) {
 //	sql := `SELECT * FROM admin WHERE mobile = ? LIMIT 1`

+ 135 - 0
routers/commentsRouter.go

@@ -3328,6 +3328,42 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserRaiLabelController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserRaiLabelController"],
+        beego.ControllerComments{
+            Method: "Add",
+            Router: `/use_rai_label/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserRaiLabelController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserRaiLabelController"],
+        beego.ControllerComments{
+            Method: "Delte",
+            Router: `/use_rai_label/delte`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserRaiLabelController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserRaiLabelController"],
+        beego.ControllerComments{
+            Method: "Detail",
+            Router: `/use_rai_label/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserRaiLabelController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserRaiLabelController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/use_rai_label/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:YanxuanSpecialController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:YanxuanSpecialController"],
         beego.ControllerComments{
             Method: "ApprovalLogList",
@@ -7774,6 +7810,42 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "QuestionList",
+            Router: `/question/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "QuestionAdd",
+            Router: `/question/save`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "CalendarSummaryExport",
+            Router: `/question/summary/export`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "CalendarSummaryList",
+            Router: `/question/summary/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"],
         beego.ControllerComments{
             Method: "Refuse",
@@ -7819,6 +7891,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "ResearcherReportExport",
+            Router: `/report/researcher/export`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"],
         beego.ControllerComments{
             Method: "ResearcherReportList",
@@ -7963,6 +8044,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/seal:SealApprovalController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/seal:SealApprovalController"],
+        beego.ControllerComments{
+            Method: "CompanySearch",
+            Router: `/company/search`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/seal:SealApprovalController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/seal:SealApprovalController"],
         beego.ControllerComments{
             Method: "Del",
@@ -8035,6 +8125,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/seal:SealApprovalController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/seal:SealApprovalController"],
+        beego.ControllerComments{
+            Method: "SealCodeSearch",
+            Router: `/sealcode/search`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/seal:SealApprovalController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/seal:SealApprovalController"],
+        beego.ControllerComments{
+            Method: "SealdetailById",
+            Router: `/sealdetail/by_sealid`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/seal:SealApprovalController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/seal:SealApprovalController"],
         beego.ControllerComments{
             Method: "VerifierEdit",
@@ -8053,6 +8161,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/statistic:StatisticRaiDataSummaryController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/statistic:StatisticRaiDataSummaryController"],
+        beego.ControllerComments{
+            Method: "RaiDataSummaryDetail",
+            Router: `/rai_data_summary/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/statistic:StatisticRaiDataSummaryController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/statistic:StatisticRaiDataSummaryController"],
+        beego.ControllerComments{
+            Method: "RaiDataSummaryList",
+            Router: `/rai_data_summary/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/yb:ActivityController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/yb:ActivityController"],
         beego.ControllerComments{
             Method: "Add",
@@ -10123,6 +10249,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanySellerController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanySellerController"],
+        beego.ControllerComments{
+            Method: "CheckListRaiServerType",
+            Router: `/seller/check/list_rai/server_type`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanySellerController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanySellerController"],
         beego.ControllerComments{
             Method: "CheckListForLose",

+ 3 - 0
routers/router.go

@@ -27,6 +27,7 @@ import (
 	"hongze/hz_crm_api/controllers/overseas_custom"
 	"hongze/hz_crm_api/controllers/roadshow"
 	"hongze/hz_crm_api/controllers/seal"
+	"hongze/hz_crm_api/controllers/statistic"
 	"hongze/hz_crm_api/controllers/yb"
 
 	"github.com/beego/beego/v2/server/web"
@@ -72,6 +73,7 @@ func init() {
 				&controllers.StatisticYbLogController{},
 				&controllers.StatisticReportCommonController{},
 				&controllers.StatisticCompanyMergerController{},
+				&statistic.StatisticRaiDataSummaryController{},
 			),
 		),
 		web.NSNamespace("/voice",
@@ -165,6 +167,7 @@ func init() {
 				&cygx.RaiServeCoAntroller{},
 				&cygx.UserFeedbackController{},
 				&cygx.GushouTimeLineController{},
+				&cygx.UserRaiLabelController{},
 			),
 		),
 		web.NSNamespace("/advisory",

+ 2 - 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) //审批通过的时候专项调研次数更新
 				}
 				//}

+ 52 - 0
services/company_ascribe.go

@@ -98,3 +98,55 @@ func GetCompanyContractAscribeContentMap(companyContractIds []int) (mapResp map[
 	}
 	return
 }
+
+// 获取不续约的合同ID的map映射
+func GetCompanyContractNoRenewedAscribeListMap() (mapCountResp map[int]bool) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println("err:", err)
+			go alarm_msg.SendAlarmMsg(" 处理公司归因展示失败 GetCompanyContractAscribeContentMap,Err:"+err.Error(), 3)
+		}
+	}()
+	var condition string
+	var pars []interface{}
+	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("GetCompanyContractNoRenewedAscribeListJoin, Err: " + e.Error())
+		return
+	}
+	mapCountResp = make(map[int]bool, 0)
+	for _, v := range list {
+		mapCountResp[v.CompanyContractId] = true
+	}
+	return
+}
+
+// 获取不续约的合同ID的数组
+func GetCompanyContractNoRenewedAscribeListArr() (companyContractIds []int) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println("err:", err)
+			go alarm_msg.SendAlarmMsg(" 处理公司归因展示失败 GetCompanyContractNoRenewedAscribeListArr,Err:"+err.Error(), 3)
+		}
+	}()
+	var condition string
+	var pars []interface{}
+	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
+	}
+	companyContractIds = make([]int, 0)
+	if len(list) == 0 {
+		companyContractIds = append(companyContractIds, 0)
+	} else {
+		for _, v := range list {
+			companyContractIds = append(companyContractIds, v.CompanyContractId)
+		}
+	}
+	return
+}

+ 154 - 0
services/company_contract.go

@@ -588,3 +588,157 @@ func UpdateCompanyContracthideBycompanyId(companyId, productId int) {
 
 	return
 }
+
+func init_CRM_16_7() {
+	var condition string
+	var pars []interface{}
+	condition = "    AND  product_id = 2 AND status != 2  AND rai_contract_type  = '续约合同' AND is_hand = 0  ORDER BY company_contract_id ASC   "
+	condition = "     AND  product_id = 2 AND status != 2    ORDER BY company_contract_id ASC   "
+	companyContractList, e := company.GetCompanyContractList(condition, pars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		fmt.Println(e)
+		return
+	}
+	for k, v := range companyContractList {
+		fmt.Println(k)
+		UpdateCompanyContractInheritEndDate(v.CompanyContractId)
+		time.Sleep(100 * time.Millisecond)
+		//UpdateCompanyContractDueEndDate(v.CompanyContractId)
+	}
+	fmt.Println("init_CRM_16_7end")
+}
+
+//func init() {
+//	//UpdateCompanyContractInheritEndDate(211)
+//	init_CRM_16_7()
+//}
+
+// 判断权益合同,是否续约了上一份的合同,并修改对应续约信息
+func UpdateCompanyContractInheritEndDate(companyContractId int) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("判断权益合同,是否续约了上一份的合同,并修改对应续约信息失败,UpdateCompanyContractInheritEndDate ", err), 3)
+		}
+	}()
+	go UpdateCompanyContractDueEndDate(companyContractId)
+	contractInfo, e := company.GetCompanyContractDetailByCompanyContractId(companyContractId)
+	if e != nil {
+		err = errors.New("GetCompanyContractDetailByCompanyContractId, Err: " + e.Error())
+		return
+	}
+	if contractInfo.RaiContractType == "新签合同" {
+		e = company.UpdateCompanyContractDueEndDate(contractInfo.EndDate, contractInfo.CompanyContractId)
+		if e != nil {
+			err = errors.New("UpdateCompanyContractInheritEndDate, Err: " + e.Error())
+			return
+		}
+		return
+	}
+	startDate := contractInfo.StartDate
+
+	var condition string
+	var pars []interface{}
+	condition = "  AND  product_id = 2 AND status =1  AND  merge_company_contract_id = 0   AND company_id = ? AND end_date < ? AND DATE_ADD( end_date, INTERVAL 1 YEAR ) > ?  ORDER BY end_date ASC  LIMIT	 1  "
+	pars = append(pars, contractInfo.CompanyId, startDate, startDate)
+	companyContractList, e := company.GetCompanyContractList(condition, pars)
+	if e != nil {
+		err = errors.New("GetCompanyContractList, Err: " + e.Error())
+		return
+	}
+	//fmt.Println("companyContractList", len(companyContractList), "id", contractInfo.CompanyContractId, "contractInfo.EndDate", contractInfo.EndDate)
+	if len(companyContractList) == 1 {
+		for _, v := range companyContractList {
+			e = company.UpdateCompanyContractInheritEndDate(v.EndDate, v.CompanyContractId, contractInfo.CompanyContractId)
+			if e != nil {
+				err = errors.New("UpdateCompanyContractInheritEndDate, Err: " + e.Error())
+				return
+			}
+		}
+		return
+	}
+	pars = make([]interface{}, 0)
+
+	//上一份合同找不到的话,就找开始时间早于当前合同开始时间的,结束时间晚于当前合同开始时间的
+	condition = "  AND  product_id = 2 AND status = 1  AND  merge_company_contract_id = 0   AND company_id = ? AND start_date < ? AND   end_date > ?  ORDER BY end_date ASC  LIMIT	 1  "
+	pars = append(pars, contractInfo.CompanyId, startDate, startDate)
+	companyContractList2, e := company.GetCompanyContractList(condition, pars)
+	if e != nil {
+		err = errors.New("GetCompanyContractList, Err: " + e.Error())
+		return
+	}
+	//fmt.Println("companyContractList2", len(companyContractList2), "id", contractInfo.CompanyContractId, "contractInfo.EndDate", contractInfo.EndDate)
+	if len(companyContractList2) == 1 {
+		for _, v := range companyContractList2 {
+			e = company.UpdateCompanyContractInheritEndDate(v.EndDate, v.CompanyContractId, contractInfo.CompanyContractId)
+			if e != nil {
+				err = errors.New("UpdateCompanyContractInheritEndDate, Err: " + e.Error())
+				return
+			}
+		}
+		return
+	}
+
+	////上面两个要是都找不到,就把自身的开始时间作为,续约的结束时间
+	e = company.UpdateCompanyContractInheritEndDate(contractInfo.StartDate, contractInfo.CompanyContractId, contractInfo.CompanyContractId)
+	if e != nil {
+		err = errors.New("UpdateCompanyContractInheritEndDate, Err: " + e.Error())
+		return
+	}
+	return
+}
+
+// 判断权益合同,是否续约了上一份的合同,并修改对应续约信息
+func UpdateCompanyContractDueEndDate(companyContractId int) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("判断权益合同,是否续约了上一份的合同,并修改对应续约信息失败,UpdateCompanyContractInheritEndDate ", err), 3)
+		}
+	}()
+	contractInfo, e := company.GetCompanyContractDetailByCompanyContractId(companyContractId)
+	if e != nil {
+		err = errors.New("GetCompanyContractDetailByCompanyContractId, Err: " + e.Error())
+		return
+	}
+	if contractInfo.RaiContractType == "新签合同" {
+		fmt.Println("新签合同")
+		return
+	}
+	endDate := contractInfo.EndDate
+	startDate := contractInfo.StartDate
+
+	var condition string
+	var pars []interface{}
+	condition = `  AND  product_id = 2 AND status =1  AND  merge_company_contract_id = 0  AND rai_contract_type  = '续约合同'   AND company_contract_id < ? AND company_id = ? 
+				AND DATE_ADD( end_date, INTERVAL - 1 YEAR ) < ? AND DATE_ADD( end_date, INTERVAL 1 YEAR ) > ? 
+				AND DATE_ADD( start_date, INTERVAL - 1 YEAR ) < ? AND DATE_ADD( start_date, INTERVAL 1 YEAR ) > ?
+				ORDER BY company_contract_id DESC,  end_date  DESC LIMIT	 1  `
+	pars = append(pars, contractInfo.CompanyContractId, contractInfo.CompanyId, endDate, endDate, startDate, startDate)
+	companyContractList, e := company.GetCompanyContractList(condition, pars)
+	if e != nil {
+		err = errors.New("GetCompanyContractList, Err: " + e.Error())
+		return
+	}
+	//fmt.Println("companyContractList", len(companyContractList), "id", contractInfo.CompanyContractId, "contractInfo.EndDate", contractInfo.EndDate)
+	if len(companyContractList) == 1 {
+		for _, v := range companyContractList {
+			e = company.UpdateCompanyContractDueEndDateMerge(v.InheritEndDate, v.DueEndDate, v.CompanyContractId, v.CompanyContractId, contractInfo.CompanyContractId)
+			if e != nil {
+				err = errors.New("UpdateCompanyContractDueEndDateMerge, Err: " + e.Error())
+				return
+			}
+		}
+		return
+	} else {
+		//因为没有1年内的合并对象,结束时间作为自己的到期时间
+		e = company.UpdateCompanyContractDueEndDate(contractInfo.EndDate, contractInfo.CompanyContractId)
+		if e != nil {
+			err = errors.New("UpdateCompanyContractInheritEndDate, Err: " + e.Error())
+			return
+		}
+	}
+	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
 }

+ 30 - 39
services/cygx/acitvity.go

@@ -44,7 +44,7 @@ func AddCygxActivityRestrictSignupByAdmin(activityId int) (err error) {
 	}
 	mobileList, _ := cygx.GetUserMeetingMobile(activityId)
 	var userIdArr []int
-	if len(mobileList) >= 0 {
+	if len(mobileList) > 0 {
 		for _, v := range mobileList {
 			userIdArr = append(userIdArr, v.UserId)
 		}
@@ -56,7 +56,7 @@ func AddCygxActivityRestrictSignupByAdmin(activityId int) (err error) {
 		pars = append(pars, userIdArr)
 		restrictSignupList, e := cygx.GetCygxActivityRestrictSignupList(condition, pars, 0, 9999)
 		if e != nil {
-			err = errors.New("GetCygxActivityRestrictSignupList" + e.Error())
+			err = errors.New("GetCygxActivityRestrictSignupList 1 " + e.Error())
 			return
 		}
 		//获取这些用户是否被加入到限制报名了
@@ -120,7 +120,7 @@ func AddCygxActivityRestrictSignupByAdmin(activityId int) (err error) {
 		item.SellerName = v.SellerName
 		items = append(items, item)
 	}
-	if len(list) == 0 {
+	if len(userIdSiginArr) == 0 {
 		return
 	}
 
@@ -133,7 +133,7 @@ func AddCygxActivityRestrictSignupByAdmin(activityId int) (err error) {
 	pars = append(pars, userIdSiginArr)
 	restrictSignupList, e := cygx.GetCygxActivityRestrictSignupList(condition, pars, 0, 9999)
 	if e != nil {
-		err = errors.New("GetCygxActivityRestrictSignupList" + e.Error())
+		err = errors.New("GetCygxActivityRestrictSignupList 2" + e.Error())
 		return
 	}
 	//获取这些用户是否被加入到限制报名了
@@ -920,24 +920,6 @@ func DoActivityOnenIdWxTemplateMsg(activityId int) (err error) {
 	//conditionPer = ` AND p.chart_permission_id IN (` + utils.GetOrmInReplace(len(chartPermissionIdArr)) + `) `
 	parsPer = append(parsPer, chartPermissionIdArr)
 
-	//if len(chartPermissionStarus) > 0 {
-	//	conditionPer += ` AND p.STATUS IN (` + utils.GetOrmInReplace(len(chartPermissionStarus)) + `) `
-	//	parsPer = append(parsPer, chartPermissionStarus)
-	//}
-
-	//先获取有对应权限的所有用户
-	//openidPowerList, e := cygx.GetCygxUserRecordPowerOpenid(conditionPer, parsPer)
-	//if e != nil && e.Error() != utils.ErrNoRow() {
-	//	err = errors.New("GetCygxUserRecordPowerOpenid, Err: " + e.Error())
-	//	return
-	//}
-	//fmt.Println(len(openidPowerList))
-	// 获取所有有权的用户的 openid
-	//openidPowerList, err := cygx.GetCygxUserRecordPower(chartPermissionIds)
-	//if err != nil {
-	//	return
-	//}
-
 	var havePowerCompanyid string
 	//如果活动限制人数就做可见区分判断
 	if activityInfo.IsLimitPeople > 0 {
@@ -1242,26 +1224,35 @@ func DoActivityOnenIdWxTemplateMsg(activityId int) (err error) {
 		mapOpenidFllow[v.UserId] = v.OpenId
 	}
 
+	var mobileArrJmcj []string
+	listUserJmcj, err := models.GetWxUserListCompanyId(utils.JMCJ_COMPANY_ID)
+	if err != nil {
+		return
+	}
+	for _, v := range listUserJmcj {
+		mobileArrJmcj = append(mobileArrJmcj, v.Mobile)
+	}
+
 	//fmt.Println(mapOpenidFllow)
-	openidPowerByActivitySetList, openidPowerByActivitySetListYx, err := cygx.GetCygxUserRecordPowerByActivitySet(chartPermissionIds, condition)
+	openidPowerByActivitySetList, openidPowerByActivitySetListYx, err := cygx.GetCygxUserRecordPowerByActivitySet(chartPermissionIds, condition, mobileArrJmcj)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		return err
 	}
 	//已经推送过的不做二次推送
-	listSendOpendId, err := cygx.GeCygxActivityUserTemplateRecordListByActivityId(activityId, utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		return err
-	}
-	mapSendOpenid := make(map[string]int)
-	for _, v := range listSendOpendId {
-		mapSendOpenid[v.OpenId] = v.UserId
-	}
+	//listSendOpendId, err := cygx.GeCygxActivityUserTemplateRecordListByActivityId(activityId, utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD)
+	//if err != nil && err.Error() != utils.ErrNoRow() {
+	//	return err
+	//}
+	//mapSendOpenid := make(map[string]int)
+	//for _, v := range listSendOpendId {
+	//	mapSendOpenid[v.OpenId] = v.UserId
+	//}
 	var OpenIdList []*models.OpenIdList
 	for _, v := range openidPowerByActivitySetList {
-		if mapSendOpenid[v.OpenId] > 0 {
-			//fmt.Println("已经推过了")
-			continue
-		}
+		//if mapSendOpenid[v.OpenId] > 0 {
+		//	//fmt.Println("已经推过了")
+		//	continue
+		//}
 		item := new(models.OpenIdList)
 		item.UserId = v.UserId
 		item.OpenId = v.OpenId
@@ -1294,10 +1285,10 @@ func DoActivityOnenIdWxTemplateMsg(activityId int) (err error) {
 
 	var OpenIdListYx []*models.OpenIdList
 	for _, v := range openidPowerByActivitySetListYx {
-		if mapSendOpenid[v.OpenId] > 0 {
-			//fmt.Println("已经推过了")
-			continue
-		}
+		//if mapSendOpenid[v.OpenId] > 0 {
+		//	//fmt.Println("已经推过了")
+		//	continue
+		//}
 		item := new(models.OpenIdList)
 		item.UserId = v.UserId
 		item.OpenId = v.OpenId

+ 21 - 1
services/cygx/activity_meet.go

@@ -100,7 +100,7 @@ func AddCygxActivityMeetDetailLogOffline(meetingUids string, activityId int) (er
 			itemsUpdateCompany = append(itemsUpdateCompany, item)
 		}
 	}
-	fmt.Println(111)
+
 	var itemsUpdateMobile []*cygx.MeetDetailLoggGroupCount
 	lenmobileArr := len(mobileArr)
 	if lenmobileArr > 0 {
@@ -225,6 +225,13 @@ func AddctivitySignupDetailList(itemsDetail []*cygx.CygxActivitySignupDetail, ac
 		}
 	}
 
+	//添加到Redis队列消息中,处理用户标签
+	for _, v := range itemsAdd {
+		if v.UserId > 0 {
+			ActivityWxUserRaiLabelRedisAdd(v.ActivityId, v.UserId, v.CreateTime)
+		}
+	}
+
 	return err
 }
 
@@ -346,6 +353,12 @@ func AddctivitySignupDetailListByHand(itemsDetail []*cygx.CygxActivityAttendance
 		}
 	}
 
+	//添加到Redis队列消息中,处理用户标签
+	for _, v := range itemsAdd {
+		if v.UserId > 0 {
+			ActivityWxUserRaiLabelRedisAdd(v.ActivityId, v.UserId, v.CreateTime)
+		}
+	}
 	return err
 }
 
@@ -435,6 +448,13 @@ func AddctivitySignupDetailListByAdminSignup(activityIdsStr string) (err error)
 			err = errors.New("AddCygxActivitySignupDetail, Err: " + e.Error())
 			return
 		}
+
+		//添加到Redis队列消息中,处理用户标签
+		for _, v := range items {
+			if v.UserId > 0 {
+				ActivityWxUserRaiLabelRedisAdd(v.ActivityId, v.UserId, v.CreateTime)
+			}
+		}
 	}
 
 	return err

+ 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"

+ 234 - 0
services/cygx/activity_poster.go

@@ -4,6 +4,7 @@ import (
 	"encoding/json"
 	"errors"
 	"fmt"
+	"github.com/go-resty/resty/v2"
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/cygx"
 	"hongze/hz_crm_api/services"
@@ -198,6 +199,7 @@ func MakeActivitySigninImg(activityId int) (imgUrl string, err error) {
 		return
 	}
 
+	fmt.Println("resourceUrl", resourceUrl)
 	detailConfig, e := cygx.GetCygxConfigDetailByCode(Cygx_activity_sigin_html)
 	if e != nil {
 		err = errors.New("GetCygxConfigDetailByCode 获取配置签到码格式信息失败, Err: " + e.Error())
@@ -582,3 +584,235 @@ func MakeActivityMomentsImg(activityId int) {
 //	err = cygx.AddCygxActivityPoster(item)
 //	return
 //}
+
+//func init() {
+//	MakeActivityDetailImg2(2992)
+//}
+
+//func init() {
+//	var condition string
+//	var pars []interface{}
+//
+//	condition = " AND active_state = 1   AND xcx_detail_img = ''   "
+//	list, errList := cygx.GetActivityListAll(condition, pars, 0, 999)
+//	if errList != nil {
+//		fmt.Println(errList)
+//		return
+//	}
+//
+//	for _, v := range list {
+//		MakeActivityDetailImg2(v.ActivityId)
+//	}
+//}
+
+// MakeActivityDetailImg  生成活动详情二维码 生成太阳码并上传OSS 30天有效
+func MakeActivityDetailImg(activityId int) (imgUrl string, err error) {
+	var msg string
+	defer func() {
+		if err != nil || msg != "" {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg("生成活动详情二维码,失败,MakeActivityDetailImg 活动ID:"+strconv.Itoa(activityId)+err.Error()+";msg:"+msg, 3)
+		}
+	}()
+	activityInfo, e := cygx.GetAddActivityInfoById(activityId)
+	if e != nil {
+		err = errors.New("活动不存在, Err: " + e.Error())
+		return
+	}
+	if activityInfo == nil {
+		return
+	}
+	itemToken, err := models.GetWxToken(utils.WxCygxAppId, utils.WxCygxAppSecret)
+	if err != nil {
+		return
+	}
+	if itemToken.AccessToken == "" {
+		msg = "accessToken is empty"
+		return
+	}
+	client := resty.New()
+	resp, err := client.R().
+		SetQueryParam("access_token", itemToken.AccessToken).
+		SetBody(map[string]interface{}{
+			"path":  "activityPages/activityDetail/activityDetail?id=" + strconv.Itoa(activityId),
+			"width": 430,
+		}).
+		Post("https://api.weixin.qq.com/wxa/getwxacode")
+
+	if err != nil {
+		return
+	}
+	if resp.StatusCode() != http.StatusOK {
+		return
+	}
+	fmt.Println(resp.Status())
+	var resourceUrl string
+
+	uploadDir := "static/img/share/"
+	uuid := utils.GetRandStringNoSpecialChar(28)
+	if !utils.FileIsExist(uploadDir) {
+		err = os.MkdirAll(uploadDir, 0755)
+		if err != nil {
+			msg = "生成文件夹失败,Err:" + err.Error()
+			return
+		}
+	}
+	imagePath := uploadDir + uuid + ".jpg"
+	imageContent, e := os.Create(imagePath)
+	if e != nil {
+		err = e
+		msg = "获取微信二维码失败,Err:" + err.Error()
+		return
+	}
+	writeStringRes, e := io.WriteString(imageContent, string(resp.Body()))
+	if e != nil {
+		err = e
+		fmt.Println("writeStringRes", writeStringRes)
+		return
+	}
+	closeErr := imageContent.Close()
+	if closeErr != nil {
+		err = closeErr
+		return
+	}
+	randStr := utils.GetRandStringNoSpecialChar(28)
+	fileName := randStr + ".jpg"
+	savePath := uploadDir + time.Now().Format("200601/20060102/")
+	savePath += fileName
+	//上传到阿里云
+	err = services.UploadFileToAliyun(fileName, imagePath, savePath)
+	if err != nil {
+		fmt.Println("文件上传失败,Err:" + err.Error())
+		return
+	}
+	fileHost := "https://hzstatic.hzinsights.com/"
+	resourceUrl = fileHost + savePath
+	defer func() {
+		os.Remove(imagePath)
+	}()
+	fmt.Println(resourceUrl)
+	return
+}
+
+// MakeActivityDetailImg2  生成活动详情二维码 生成太阳码并上传OSS 永久有效
+func MakeActivityDetailImg2(activityId int) (imgUrl string, err error) {
+	var msg string
+	defer func() {
+		if err != nil || msg != "" {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg("生成活动详情二维码,失败,活动ID:"+strconv.Itoa(activityId)+err.Error()+";msg:"+msg, 3)
+		}
+	}()
+	activityInfo, e := cygx.GetAddActivityInfoById(activityId)
+	if e != nil {
+		err = errors.New("活动不存在, Err: " + e.Error())
+		return
+	}
+	if activityInfo == nil {
+		return
+	}
+
+	itemToken, err := models.GetWxToken(utils.WxCygxAppId, utils.WxCygxAppSecret)
+	if err != nil {
+		return
+	}
+	if itemToken.AccessToken == "" {
+		msg = "accessToken is empty"
+		return
+	}
+	var envVersion string
+	var resourceUrl string
+	if utils.RunMode == "release" {
+		envVersion = "release"
+	} else {
+		envVersion = "trial"
+	}
+	url := "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + itemToken.AccessToken
+	method := "POST"
+	payload := strings.NewReader(`{
+		"page":"activityPages/activityDetail/activityDetail",
+		"scene":"` + strconv.Itoa(activityId) + `",
+		"env_version":"` + envVersion + `",
+		"check_path":false,
+		"auto_color":true
+				}`)
+	client := &http.Client{}
+	req, err := http.NewRequest(method, url, payload)
+	if err != nil {
+		msg = "获取微信二维码失败,Err:" + err.Error()
+		return
+	}
+	req.Header.Add("Content-Type", "application/json")
+	postBody, err := client.Do(req)
+	if err != nil {
+		msg = "获取微信二维码失败,Err:" + err.Error()
+		return
+	}
+	defer postBody.Body.Close()
+	uploadDir := "static/img/share/"
+	uuid := utils.GetRandStringNoSpecialChar(28)
+	if !utils.FileIsExist(uploadDir) {
+		err = os.MkdirAll(uploadDir, 0755)
+		if err != nil {
+			msg = "生成文件夹失败,Err:" + err.Error()
+			return
+		}
+	}
+	imagePath := uploadDir + uuid + ".jpg"
+	switch header := postBody.Header.Get("Content-Type"); {
+	case strings.HasPrefix(header, "application/json"):
+		tokenResp := ReturnBodyRule{}
+		decoder := json.NewDecoder(postBody.Body)
+		if decodeErr := decoder.Decode(&tokenResp); decodeErr != nil {
+			msg = "获取微信二维码失败,Err:" + decodeErr.Error()
+			return
+		}
+	case strings.HasPrefix(header, "image"):
+		reply, e := ioutil.ReadAll(postBody.Body)
+		if e != nil {
+			err = e
+			msg = "获取微信二维码失败,Err:" + err.Error()
+			return
+		}
+		imageContent, e := os.Create(imagePath)
+		if e != nil {
+			err = e
+			msg = "获取微信二维码失败,Err:" + err.Error()
+			return
+		}
+		writeStringRes, e := io.WriteString(imageContent, string(reply))
+		if e != nil {
+			err = e
+			fmt.Println(writeStringRes)
+			return
+		}
+		closeErr := imageContent.Close()
+		if closeErr != nil {
+			err = closeErr
+			return
+		}
+		randStr := utils.GetRandStringNoSpecialChar(28)
+		fileName := randStr + ".jpg"
+		savePath := uploadDir + time.Now().Format("200601/20060102/")
+		savePath += fileName
+		//上传到阿里云
+		err = services.UploadFileToAliyun(fileName, imagePath, savePath)
+		if err != nil {
+			fmt.Println("文件上传失败,Err:" + err.Error())
+			return
+		}
+		fileHost := "https://hzstatic.hzinsights.com/"
+		resourceUrl = fileHost + savePath
+		defer func() {
+			os.Remove(imagePath)
+		}()
+	default:
+		msg = "生成二维码失败"
+		return
+	}
+
+	err = cygx.UpdateCygxActivityXcxDetailImg(resourceUrl, activityId)
+	fmt.Println("resourceUrl", resourceUrl)
+
+	return
+}

+ 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

+ 188 - 246
services/cygx/activity_special.go

@@ -556,200 +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
+//func ActivitySpecialCompanyApproval(companyId, companyContractId int, companyName string) (err error) {
 
-	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
-		}
-		for _, v := range list {
-			//如果是升级则加点
-			if v.IsUpgrade == 1 && mapRaiSubjectivity[v.ChartPermissionId] {
-				item := new(cygx.CygxActivitySpecialPermissionPoints)
-				item.Points = 5
-				item.CompanyId = companyId
-				item.CompanyName = companyName
-				item.ChartPermissionId = v.ChartPermissionId
-				item.ChartPermissionName = mapPermissionName[v.ChartPermissionId]
-				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 = 5 * 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 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  获取专项调研剩余点数最多的行业
@@ -820,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
@@ -854,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
@@ -902,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
@@ -937,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
 		}
@@ -972,67 +918,63 @@ func HandleActivitySpecialTripBillTotalText(companyId int) (totalText string, er
 	return
 }
 
-func initnee885() {
-	list, err := cygx.GetBestNewBillList()
+// 根据用户ID,活动场次,校验用户是否有剩余点数报名专项调研活动
+func CheckSpecialActivityPointsByUserIds(userIds string, activityLen int) (err error) {
+	userList, err := models.GetWxUserListByUserIds(userIds)
 	if err != nil {
-		fmt.Println(err)
+		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 items []*cygx.CygxActivitySpecialPermissionPoints
-	for _, v := range list {
-		fmt.Println(v.Total)
-		if v.Total == "" || v.Total == "0" || v.Total == "0次" {
-			continue
-		}
-		//智造5次+科技5次+消费5次+医药4次
-		sliceTotal := strings.Split(v.Total, "+")
-
-		for _, vs := range sliceTotal {
-			var points string
-			item := new(cygx.CygxActivitySpecialPermissionPoints)
-			if strings.Contains(vs, "医药") {
-				item.ChartPermissionName = "医药"
-				points := strings.Replace(vs, "医药", "", -1)
-				fmt.Println(points)
-				points = strings.Replace(points, "次", "", -1)
-				item.Points, _ = strconv.Atoi(points)
-				item.ChartPermissionId = 22
-			} else if strings.Contains(vs, "消费") {
-				item.ChartPermissionName = "消费"
-				points := strings.Replace(vs, "消费", "", -1)
-				points = strings.Replace(points, "次", "", -1)
-				item.ChartPermissionId = 21
-				item.Points, _ = strconv.Atoi(points)
-			} else if strings.Contains(vs, "科技") {
-				item.ChartPermissionName = "科技"
-				points := strings.Replace(vs, "科技", "", -1)
-				points = strings.Replace(points, "次", "", -1)
-				item.ChartPermissionId = 20
-				item.Points, _ = strconv.Atoi(points)
-			} else if strings.Contains(vs, "智造") {
-				item.ChartPermissionName = "智造"
-				points := strings.Replace(vs, "智造", "", -1)
-				points = strings.Replace(points, "次", "", -1)
-				item.ChartPermissionId = 19
-				item.Points, _ = strconv.Atoi(points)
-			} else {
-				points = strings.Replace(vs, "次", "", -1)
-				item.Points, _ = strconv.Atoi(points)
-			}
-			fmt.Println("points", points)
-			fmt.Println(vs)
 
-			item.CompanyId = v.CompanyId
-			item.CompanyName = v.CompanyName
-			item.CreateTime = time.Now()
-			item.ModifyTime = time.Now()
-			fmt.Println(item)
-			items = append(items, item)
+	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("您的专项调研次数已用完,如仍想参加,请与您的对口销售商议")
 		}
-
 	}
-
-	fmt.Println(len(items))
-	err = cygx.MultiAddCygxActivitySpecialPermissionPoints(items)
-	fmt.Println(err)
-
+	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
+//}

+ 264 - 11
services/cygx/activity_wx_msg.go

@@ -9,7 +9,9 @@ import (
 	"hongze/hz_crm_api/services"
 	"hongze/hz_crm_api/services/alarm_msg"
 	"hongze/hz_crm_api/utils"
+	"html"
 	"strconv"
+	"strings"
 	"time"
 )
 
@@ -35,17 +37,17 @@ func SendWxMsgWithCygxActivityUpdateLimitPeople(activityId int) (err error) {
 	//listSendOpendId, err := models.GeUserTemplateRecordListBysendType(utils.TEMPLATE_MSG_CYGX_ACTIVITY_LIMIT_PEOPLE, strconv.Itoa(activityId))
 
 	//已经推送过的不做二次推送
-	listSendOpendId, err := cygx.GeCygxActivityUserTemplateRecordListByActivityId(activityId, utils.TEMPLATE_MSG_CYGX_ACTIVITY_LIMIT_PEOPLE)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		return err
-	}
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		return err
-	}
-	mapSendOpenid := make(map[string]int)
-	for _, v := range listSendOpendId {
-		mapSendOpenid[v.OpenId] = v.UserId
-	}
+	//listSendOpendId, err := cygx.GeCygxActivityUserTemplateRecordListByActivityId(activityId, utils.TEMPLATE_MSG_CYGX_ACTIVITY_LIMIT_PEOPLE)
+	//if err != nil && err.Error() != utils.ErrNoRow() {
+	//	return err
+	//}
+	//if err != nil && err.Error() != utils.ErrNoRow() {
+	//	return err
+	//}
+	//mapSendOpenid := make(map[string]int)
+	//for _, v := range listSendOpendId {
+	//	mapSendOpenid[v.OpenId] = v.UserId
+	//}
 
 	var condition string
 	var pars []interface{}
@@ -101,6 +103,16 @@ func SendWxMsgWithCygxActivityUpdateLimitPeople(activityId int) (err error) {
 		openiditems = append(openiditems, openiditem)
 	}
 
+	if activityInfo.ChartPermissionId != utils.CHART_PERMISSION_ID_YANXUAN {
+		//需求池 1043:深圳进门财经科技股份有限公司下所有的账号,所有活动的新增修改都做推送,所有的报告的新增修改都不做推送。
+		jmcjOpenId := GetUserOpenidByComapnyIdRai(utils.JMCJ_COMPANY_ID)
+		for _, v := range jmcjOpenId {
+			if !utils.InArrayByStr(openIdArr, v) {
+				openIdArr = append(openIdArr, v)
+			}
+		}
+	}
+
 	first := "您好,本场活动已增加活动名额至" + activityInfo.LimitPeopleNum + "人,欢迎报名"
 	keyword1 := activityInfo.ActivityName
 	keyword2 := "已增加活动名额至" + activityInfo.LimitPeopleNum + "人,欢迎报名"
@@ -336,3 +348,244 @@ func SendWxMsgWithUpdateActivityVideoAndVoice(activityId int, fileName string) (
 	}
 	return
 }
+
+// 活动更改时间消息通知
+func SendWxMsgWithCygxActivityUpdateTime(activityId int, oldStr, newStr, strType string) (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg("发送模版消息失败,Err:"+err.Error()+";msg:"+msg, 3)
+			utils.FileLogCygx.Info(fmt.Sprintf("发送模版消息失败,Err:%s,%s", err.Error(), msg))
+		}
+		if msg != "" {
+			utils.FileLogCygx.Info("发送模版消息失败,msg:%s", msg)
+		}
+	}()
+
+	activityInfo, err := cygx.GetAddActivityInfoById(activityId)
+	if err != nil {
+		msg = "GetReportInfo Err:" + err.Error()
+		return
+	}
+	if activityInfo == nil {
+		utils.FileLogCygx.Info("活动信息不存在")
+		return
+	}
+
+	var openIdList []*cygx.OpenIdList
+
+	openIdList, err = cygx.GetActivityOpenIdList(activityId)
+	if err != nil {
+		msg = "get openIdList err:" + err.Error()
+		return
+	}
+
+	mapOpenid := make(map[int]string)
+	for _, v := range openIdList {
+		mapOpenid[v.UserId] = v.OpenId
+	}
+	//添加预约纪要的openid
+	openIdListAppointment, err := cygx.GetActivityAppointmentOpenIdList(activityId)
+	if err != nil {
+		msg = "GetActivityAppointmentOpenIdList err:" + err.Error()
+		return
+	}
+	if len(openIdListAppointment) > 0 {
+		for _, v := range openIdListAppointment {
+			if _, ok := mapOpenid[v.UserId]; !ok {
+				item := new(cygx.OpenIdList)
+				item.UserId = v.UserId
+				item.OpenId = v.OpenId
+				openIdList = append(openIdList, item)
+			}
+			mapOpenid[v.UserId] = v.OpenId
+
+		}
+	}
+
+	//添加带问的openid
+	openIdListActivityHelpAsk, err := cygx.GetActivityHelpAskOpenIdList(activityId)
+	if err != nil {
+		msg = "openIdListActivityHelpAsk err:" + err.Error()
+		return
+	}
+	if len(openIdListActivityHelpAsk) > 0 {
+		for _, v := range openIdListActivityHelpAsk {
+			if _, ok := mapOpenid[v.UserId]; !ok {
+				item := new(cygx.OpenIdList)
+				item.UserId = v.UserId
+				item.OpenId = v.OpenId
+				openIdList = append(openIdList, item)
+			}
+			mapOpenid[v.UserId] = v.OpenId
+		}
+	}
+
+	if len(openIdList) == 0 {
+		return err
+	}
+	//sendMap := make(map[string]interface{})
+	//sendData := make(map[string]interface{})
+	var first string
+	var keyword1, keyword2, keyword3, keyword4, redirectUrl string
+
+	activityInfo.ActivityTypeName = strings.Replace(activityInfo.ActivityTypeName, "(C类)", "", -1)
+	if strType == "timeType" {
+		//first = "您有一场【" + activityInfo.ActivityTypeName + "】发生了时间变更"
+		keyword2 = "时间变更为:【 " + newStr + "】"
+	} else if strType == "expertType" {
+		//first = "您有一场【" + activityInfo.ActivityTypeName + "】发生了专家变更"
+		keyword2 = "专家变更为:【" + newStr + "】"
+	} else if strType == "addressType" {
+		//first = "您有一场【" + activityInfo.ActivityTypeName + "】发生了地址变更"
+		keyword2 = "地点变更为:【" + newStr + "】"
+	} else if strType == "participationCode" {
+		//first = "您有一场【" + activityInfo.ActivityTypeName + "】公布了拨入密码"
+		keyword2 = "拨入密码为: " + newStr
+	} else if strType == "Theme" {
+		//first = "您有一场【" + activityInfo.ActivityTypeName + "】更新了活动主题"
+		newStr = strings.Replace(newStr, "</p><p>", "\n", -1)
+		newStr = html.EscapeString(newStr)
+		newStrHtml, _ := cygx.GetReportContentTextSub(newStr)
+		newStr = newStrHtml
+		keyword2 = "主题变更为: " + newStr
+	}
+
+	keyword1 = activityInfo.ActivityName
+	var openIdArr []string
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+	if activityInfo.ChartPermissionId != utils.CHART_PERMISSION_ID_YANXUAN {
+		//需求池 1043:深圳进门财经科技股份有限公司下所有的账号,所有活动的新增修改都做推送,所有的报告的新增修改都不做推送。
+		jmcjOpenId := GetUserOpenidByComapnyIdRai(utils.JMCJ_COMPANY_ID)
+		for _, v := range jmcjOpenId {
+			if !utils.InArrayByStr(openIdArr, v) {
+				openIdArr = append(openIdArr, v)
+			}
+		}
+	}
+	redirectUrl = utils.WX_MSG_PATH_ACTIVITY_DETAIL + strconv.Itoa(activityId) + "&IsSendWx=1"
+	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.WxMsgTemplateIdActivityChangeApplyXzs
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	sendInfo.Resource = strconv.Itoa(activityId)
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_UPDATE
+	sendInfo.OpenIdArr = openIdArr
+	e := services.SendTemplateMsg(sendInfo)
+	if e != nil {
+		err = errors.New("推送模板消息失败" + e.Error())
+		return
+	}
+	return
+}
+
+// 活动取消消息通知
+func SendWxMsgWithCygxActivity(activityId int) (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg("发送模版消息失败,Err:"+err.Error()+";msg:"+msg, 3)
+			utils.FileLogCygx.Info(fmt.Sprintf("发送模版消息失败,Err:%s,%s", err.Error(), msg))
+		}
+		if msg != "" {
+			utils.FileLogCygx.Info("发送模版消息失败,msg:%s", msg)
+		}
+	}()
+	activityInfo, err := cygx.GetAddActivityInfoById(activityId)
+	if err != nil {
+		msg = "GetReportInfo Err:" + err.Error()
+		return
+	}
+	var openIdList []*cygx.OpenIdList
+	openIdList, err = cygx.GetActivityOpenIdList(activityId)
+	if err != nil {
+		msg = "get GetActivityOpenIdList err:" + err.Error()
+		return
+	}
+	mapOpenid := make(map[int]string)
+	for _, v := range openIdList {
+		mapOpenid[v.UserId] = v.OpenId
+	}
+	//添加预约纪要的openid
+	openIdListAppointment, err := cygx.GetActivityAppointmentOpenIdList(activityId)
+	if err != nil {
+		msg = "GetActivityAppointmentOpenIdList err:" + err.Error()
+		return
+	}
+	if len(openIdListAppointment) > 0 {
+		for _, v := range openIdListAppointment {
+			if _, ok := mapOpenid[v.UserId]; !ok {
+				item := new(cygx.OpenIdList)
+				item.UserId = v.UserId
+				item.OpenId = v.OpenId
+				openIdList = append(openIdList, item)
+			}
+			mapOpenid[v.UserId] = v.OpenId
+
+		}
+	}
+
+	//添加带问的openid
+	openIdListActivityHelpAsk, err := cygx.GetActivityHelpAskOpenIdList(activityId)
+	if err != nil {
+		msg = "openIdListActivityHelpAsk err:" + err.Error()
+		return
+	}
+	if len(openIdListActivityHelpAsk) > 0 {
+		for _, v := range openIdListActivityHelpAsk {
+			if _, ok := mapOpenid[v.UserId]; !ok {
+				item := new(cygx.OpenIdList)
+				item.UserId = v.UserId
+				item.OpenId = v.OpenId
+				openIdList = append(openIdList, item)
+			}
+			mapOpenid[v.UserId] = v.OpenId
+		}
+	}
+	activityInfo.ActivityTypeName = strings.Replace(activityInfo.ActivityTypeName, "(C类)", "", -1)
+	if len(openIdList) == 0 {
+		return err
+	}
+	var keyword1, keyword2, keyword3, keyword4, redirectUrl string
+	keyword1 = activityInfo.ActivityName
+	keyword2 = "活动已取消"
+
+	var openIdArr []string
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+	if activityInfo.ChartPermissionId != utils.CHART_PERMISSION_ID_YANXUAN {
+		//需求池 1043:深圳进门财经科技股份有限公司下所有的账号,所有活动的新增修改都做推送,所有的报告的新增修改都不做推送。
+		jmcjOpenId := GetUserOpenidByComapnyIdRai(utils.JMCJ_COMPANY_ID)
+		for _, v := range jmcjOpenId {
+			if !utils.InArrayByStr(openIdArr, v) {
+				openIdArr = append(openIdArr, v)
+			}
+		}
+	}
+
+	redirectUrl = utils.WX_MSG_PATH_ACTIVITY_DETAIL + strconv.Itoa(activityId) + "&IsSendWx=1"
+	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.WxMsgTemplateIdActivityChangeApplyXzs
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	sendInfo.Resource = strconv.Itoa(activityId)
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_CACLE
+	sendInfo.OpenIdArr = openIdArr
+	err = services.SendTemplateMsg(sendInfo)
+	return
+}

+ 1 - 1
services/cygx/article.go

@@ -370,7 +370,7 @@ func SendWxMsgWithroadshowEssence(articleId int) (err error) {
 		return
 	}
 	// 获取所有有权的用户的 openid
-	openidPowerList, e := cygx.GetCygxUserRecordPower(permissionStr)
+	openidPowerList, e := cygx.GetCygxUserRecordPowerArticle(permissionStr)
 	if e != nil {
 		err = errors.New("获取所有有权的用户的 openid失败" + e.Error())
 		return

+ 45 - 9
services/cygx/contract_allocation.go

@@ -536,6 +536,25 @@ func HandleAllocationCompanyContractByYanXuan(companyContractId int) (err error)
 //
 //}
 
+//func init() {
+//	var condition string
+//	var pars []interface{}
+//	condition = " AND product_id = 2  AND package_difference != ''  "
+//	companyContracList, e := company.GetCompanyContracList(condition, pars)
+//	if e != nil {
+//		fmt.Println(e)
+//		return
+//	}
+//	for k, v := range companyContracList {
+//		fmt.Println("k", k, "v.CompanyContractId", v.CompanyContractId)
+//		HandleCompanyContractPackageDifference(v.CompanyContractId)
+//	}
+//
+//	fmt.Println("endened")
+//	//condition = " AND company_contract_id = ?  "
+//	//HandleCompanyContractPackageDifference(3038)
+//}
+
 // HandleCompanyContractPackageDifference 更新与上一份合同的金额的对比 '增加套餐','减少套餐','维持套餐'
 func HandleCompanyContractPackageDifference(companyContractId int) (err error) {
 	defer func() {
@@ -554,30 +573,47 @@ func HandleCompanyContractPackageDifference(companyContractId int) (err error) {
 		err = errors.New("GetCompanyContracDetail,detail Err: " + e.Error())
 		return
 	}
+	if detail.ProductId != 2 {
+		return
+	}
+
+	startYeaar := utils.StrDateToDate(detail.StartDate).Year()
+
+	lastYearStartData := fmt.Sprint(startYeaar-1, "-01-01")
+	lastYearEndData := fmt.Sprint(startYeaar-1, "-12-31")
+	//fmt.Println(lastYearStartData)
+	//fmt.Println(lastYearEndData)
+
+	//return
 
 	//如果不是续约合同就不做对比处理
 	if detail.ContractType != "续约合同" {
 		return
 	}
-	//获取前一份合同的信息
+	//获取前一年所有的合同列表
 	pars = make([]interface{}, 0)
-	condition = " AND company_id = ? AND company_contract_id < ?   AND status = 1    AND product_id = ?  ORDER BY company_contract_id DESC   LIMIT  1  "
-	pars = append(pars, detail.CompanyId, companyContractId, detail.ProductId)
-	detailPrevious, e := company.GetCompanyContracDetail(condition, pars)
+	condition = " AND company_id = ? AND company_contract_id < ?   AND status = 1    AND product_id = ? AND  start_date >= ? AND  start_date <= ?  "
+	pars = append(pars, detail.CompanyId, companyContractId, detail.ProductId, lastYearStartData, lastYearEndData)
+	companyContracList, e := company.GetCompanyContracList(condition, pars)
 	if e != nil {
-		err = errors.New("GetCompanyContracDetail,detailPrevious Err: " + e.Error())
+		err = errors.New("GetCompanyContracList Err: " + e.Error())
 		return
 	}
-	var packageDifference string
 
-	if detail.Money > detailPrevious.Money {
+	var sumMoney float64
+	var packageDifference string
+	for _, v := range companyContracList {
+		sumMoney += v.Money
+	}
+	if detail.Money > sumMoney {
 		packageDifference = "增加套餐"
-	} else if detail.Money < detailPrevious.Money {
+	} else if detail.Money < sumMoney {
 		packageDifference = "减少套餐"
 	} else {
 		packageDifference = "维持套餐"
 	}
-
+	//fmt.Println(packageDifference)
+	//return
 	e = company.UpdateCompanyContractPackageDifference(packageDifference, companyContractId)
 	if e != nil {
 		err = errors.New("UpdateCompanyContractPackageDifference, Err: " + e.Error())

+ 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, "zwxi@hzinsights.com ")
 	user = append(user, "zqliu@hzinsights.com ")
 	user = append(user, "tshen@hzinsights.com ")
 	user = append(user, "hdong@hzinsights.com ")
@@ -288,7 +287,6 @@ func SendMinutesSummaryEmail(detail *cygx.DetailCygxMinutesSummaryRep, touser []
 	m.SetHeader("From", "hzcygx@hzinsights.com ")
 	//m.SetHeader("To", touser...)
 	var user []string
-	user = append(user, "zwxi@hzinsights.com ")
 	user = append(user, "zqliu@hzinsights.com ")
 	user = append(user, "tshen@hzinsights.com ")
 	user = append(user, "hdong@hzinsights.com ")

+ 1 - 1
services/cygx/research_summary.go

@@ -279,7 +279,7 @@ func DoArticleOnenIdWxTemplateMsg(articleId int, source int) (err error) {
 	//utils.Rc.Put(cacheKey, articleId, time.Minute*30)
 	// 获取所有有权的用户的 openid
 	mapOpenidPower := make(map[int]string)
-	openidPowerList, err := cygx.GetCygxUserRecordPower(strconv.Itoa(chartPermissionId))
+	openidPowerList, err := cygx.GetCygxUserRecordPowerArticle(strconv.Itoa(chartPermissionId))
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		return err
 	}

+ 110 - 2
services/cygx/resource_data.go

@@ -7,6 +7,7 @@ import (
 	"hongze/hz_crm_api/services/alarm_msg"
 	"hongze/hz_crm_api/utils"
 	"strconv"
+	"strings"
 	"time"
 )
 
@@ -181,7 +182,7 @@ func UpdateActivitySpecialResourceData(sourceId int) {
 	var pars []interface{}
 	condition = ` AND publish_status = 1  AND  activity_id = ?  `
 	pars = append(pars, sourceId)
-	total, e := cygx.GetActivityCount(condition, pars)
+	total, e := cygx.GetActivitySpecilCount(condition, pars)
 	if e != nil {
 		err = errors.New("GetCygxReportSelection, Err: " + e.Error())
 		return
@@ -229,7 +230,6 @@ func UpdateActivitySpecialResourceData(sourceId int) {
 		} else {
 			item.SearchOrderTime = activityInfo.PublishDate
 		}
-
 		if totalData == 0 {
 			newId, e := cygx.AddCygxResourceData(item)
 			if e != nil {
@@ -1290,6 +1290,114 @@ func UpdateAskserieVideoResourceData(sourceId int) {
 	return
 }
 
+//func init() {
+//	UpdateIndustrialsourceHzResourceData(731, "HZ")
+//}
+
+func UpdateIndustrialsourceHzResourceDataById(industrialManagementIds []string, sourceType string) {
+	for _, v := range industrialManagementIds {
+		if v == "" {
+			continue
+		}
+		industrialManagementId, _ := strconv.Atoi(v)
+		if industrialManagementId < 1 {
+			continue
+		}
+		UpdateIndustrialsourceHzResourceData(industrialManagementId, sourceType)
+	}
+
+}
+
+// 更新产业资源包  写入首页最新  cygx_resource_data 表
+func UpdateIndustrialsourceHzResourceData(sourceId int, sourceType string) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("UpdateIndustrialsourceHzResourceData 失败: ", sourceId, err.Error()), 2)
+		}
+	}()
+	var source string
+	var e error
+	var maxData string
+	if sourceType == "Hz" {
+		maxData, e = cygx.GetIndustrialManagementGroupArticleMaxPublishDateByHz(sourceId)
+		if e != nil {
+			err = errors.New("GetIndustrialManagementGroupArticleMaxPublishDateByHz, Err: " + e.Error())
+			return
+		}
+		source = "industrialsourceHz"
+	} else {
+		maxData, e = cygx.GetIndustrialManagementGroupArticleMaxPublishDateByYx(sourceId)
+		if e != nil {
+			err = errors.New("GetIndustrialManagementGroupArticleMaxPublishDateByYx, Err: " + e.Error())
+			return
+		}
+		source = "industrialsourceYx"
+	}
+
+	if maxData == "" {
+		e = cygx.DeleteResourceData(sourceId, source)
+		if e != nil {
+			err = errors.New("DeleteResourceData, Err: " + e.Error())
+			return
+		}
+		return
+	}
+
+	industrialItem, e := cygx.GetIndustrialManagementInfo(sourceId)
+	if e != nil {
+		err = errors.New("GetIndustrialManagementInfo, Err: " + e.Error())
+		return
+	}
+
+	var subjectNames []string
+	listSub, e := cygx.GetcygxIndustrialSubject(sourceId)
+	if e != nil {
+		err = errors.New("GetcygxIndustrialSubject, Err: " + e.Error())
+		return
+	}
+	for _, v := range listSub {
+		subjectNames = append(subjectNames, v.SubjectName)
+	}
+
+	//判断是否存在,如果不存在就新增,存在就更新
+	totalData, e := cygx.GetCygxResourceDataBySourceAndIdCount(sourceId, source)
+	if e != nil {
+		err = errors.New("GetCygxResourceDataBySourceAndIdCount, Err: " + e.Error())
+		return
+	}
+
+	item := new(cygx.CygxResourceData)
+	item.SourceId = sourceId
+	item.Source = source
+	item.PublishDate = maxData
+	item.CreateTime = time.Now()
+	if len(subjectNames) == 0 {
+		item.SearchTitle = industrialItem.IndustryName
+	} else {
+		item.SearchTitle = industrialItem.IndustryName + "," + strings.Join(subjectNames, ",")
+	}
+	item.SearchContent = ""
+	item.SearchOrderTime = maxData
+	//fmt.Println(item)
+	//return
+	if totalData == 0 {
+		_, e := cygx.AddCygxResourceData(item)
+		if e != nil {
+			err = errors.New("AddCygxResourceData, Err: " + e.Error())
+			return
+		}
+	} else {
+		e = cygx.UpdateResourceDataByItem(item)
+		if e != nil {
+			err = errors.New("UpdateResourceDataByItem, Err: " + e.Error())
+			return
+		}
+	}
+	return
+}
+
 func init300() {
 	//var condition string
 	//var pars []interface{}

+ 125 - 49
services/cygx/special_wx_msg.go

@@ -63,13 +63,18 @@ func DetermineTripBeInterested(activityId int) (err error) {
 		fmt.Println(e)
 		return
 	}
-
-	if len(openIdList) == 0 {
-		return
-	}
-	openIdArr := make([]string, len(openIdList))
-	for i, v := range openIdList {
-		openIdArr[i] = v.OpenId
+	var openIdArr []string
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+	if activityInfo.ChartPermissionId != utils.CHART_PERMISSION_ID_YANXUAN {
+		//需求池 1043:深圳进门财经科技股份有限公司下所有的账号,所有活动的新增修改都做推送,所有的报告的新增修改都不做推送。
+		jmcjOpenId := GetUserOpenidByComapnyIdRai(utils.JMCJ_COMPANY_ID)
+		for _, v := range jmcjOpenId {
+			if !utils.InArrayByStr(openIdArr, v) {
+				openIdArr = append(openIdArr, v)
+			}
+		}
 	}
 	var first, keyword1, keyword2, keyword3, keyword4, remark, redirectUrl string
 	keyword1 = "专项调研【" + activityInfo.ResearchTheme + "】"
@@ -132,12 +137,18 @@ func DetermineTripCancel(activityId int) (err error) {
 		return
 	}
 
-	if len(openIdList) == 0 {
-		return
-	}
-	openIdArr := make([]string, len(openIdList))
-	for i, v := range openIdList {
-		openIdArr[i] = v.OpenId
+	var openIdArr []string
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+	if activityInfo.ChartPermissionId != utils.CHART_PERMISSION_ID_YANXUAN {
+		//需求池 1043:深圳进门财经科技股份有限公司下所有的账号,所有活动的新增修改都做推送,所有的报告的新增修改都不做推送。
+		jmcjOpenId := GetUserOpenidByComapnyIdRai(utils.JMCJ_COMPANY_ID)
+		for _, v := range jmcjOpenId {
+			if !utils.InArrayByStr(openIdArr, v) {
+				openIdArr = append(openIdArr, v)
+			}
+		}
 	}
 	var first, keyword1, keyword2, keyword3, keyword4, remark, redirectUrl string
 	keyword1 = "专项调研【" + activityInfo.ResearchTheme + "】"
@@ -201,13 +212,18 @@ func DetermineTripChange(activityId int, changeType, changeMsg string) (err erro
 		fmt.Println(e)
 		return
 	}
-
-	if len(openIdList) == 0 {
-		return
-	}
-	openIdArr := make([]string, len(openIdList))
-	for i, v := range openIdList {
-		openIdArr[i] = v.OpenId
+	var openIdArr []string
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+	if activityInfo.ChartPermissionId != utils.CHART_PERMISSION_ID_YANXUAN {
+		//需求池 1043:深圳进门财经科技股份有限公司下所有的账号,所有活动的新增修改都做推送,所有的报告的新增修改都不做推送。
+		jmcjOpenId := GetUserOpenidByComapnyIdRai(utils.JMCJ_COMPANY_ID)
+		for _, v := range jmcjOpenId {
+			if !utils.InArrayByStr(openIdArr, v) {
+				openIdArr = append(openIdArr, v)
+			}
+		}
 	}
 	var first, keyword1, keyword2, keyword3, keyword4, remark, redirectUrl string
 	if changeType == "City" {
@@ -324,12 +340,20 @@ func SendWxMsgWithCygxActivitySpecialSubscribeNoInterested(activityId int) (err
 	for _, v := range arrOpenId {
 		mapOpenid[v] = v
 	}
-	openIdArr := make([]string, len(mapOpenid))
-	var i int
+
+	var openIdArr []string
 	for _, v := range mapOpenid {
-		openIdArr[i] = v
-		i++
+		openIdArr = append(openIdArr, v)
 	}
+
+	//需求池 1043:深圳进门财经科技股份有限公司下所有的账号,所有活动的新增修改都做推送,所有的报告的新增修改都不做推送。
+	jmcjOpenId := GetUserOpenidByComapnyIdRai(utils.JMCJ_COMPANY_ID)
+	for _, v := range jmcjOpenId {
+		if !utils.InArrayByStr(openIdArr, v) {
+			openIdArr = append(openIdArr, v)
+		}
+	}
+
 	var first string
 	var keyword1 string
 	var keyword2 string
@@ -400,26 +424,6 @@ func SendWxMsgWithCygxActivitySpecialArticle(articleId int) (err error) {
 
 	var condition string
 	var pars []interface{}
-	//condition = ` AND m.industrial_management_id IN (` + utils.GetOrmInReplace(len(industryIds)) + `)`
-	//pars = append(pars, industryIds)
-
-	//condition += ` AND a.activity_time > ? `
-	//pars = append(pars, time.Now().AddDate(0, 0, -7))
-
-	//activityList, err := cygx.GetActivitySpecialByIndustryIds(condition, pars)
-	//if err != nil {
-	//	return
-	//}
-	//if len(activityList) == 0 {
-	//	return
-	//}
-
-	//for _, v := range activityList {
-	//activityInfo, e := cygx.GetAddActivityInfoSpecialById(v.ActivityId)
-	//if e != nil {
-	//	err = errors.New("GetAddActivityInfoSpecialById, Err: " + e.Error())
-	//	return
-	//}
 
 	condition = ` AND category_id = ? AND sub_category_name = '专项调研' `
 	pars = append(pars, articleInfo.CategoryId)
@@ -462,13 +466,19 @@ func SendWxMsgWithCygxActivitySpecialArticle(articleId int) (err error) {
 		err = errors.New("GetWxOpenIdByMobileList, Err: " + e.Error())
 		return
 	}
-	if len(openIdList) == 0 {
-		return
+	var openIdArr []string
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
 	}
-	openIdArr := make([]string, len(openIdList))
-	for i, vO := range openIdList {
-		openIdArr[i] = vO.OpenId
+
+	//需求池 1043:深圳进门财经科技股份有限公司下所有的账号,所有活动的新增修改都做推送,所有的报告的新增修改都不做推送。
+	jmcjOpenId := GetUserOpenidByComapnyIdRai(utils.JMCJ_COMPANY_ID)
+	for _, v := range jmcjOpenId {
+		if !utils.InArrayByStr(openIdArr, v) {
+			openIdArr = append(openIdArr, v)
+		}
 	}
+
 	var keyword1 string
 	first := ""
 	if industrialName != "" {
@@ -507,3 +517,69 @@ func SendWxMsgWithCygxActivitySpecialArticle(articleId int) (err error) {
 	}
 	return
 }
+
+// 专项调研活动模板消息通知
+func SendWxMsgWithCygxActivitySpecial(activityId int) (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg("发送模版消息失败,Err:"+err.Error()+";msg:"+msg, 3)
+			//go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
+			utils.FileLogCygx.Info(fmt.Sprintf("发送模版消息失败,Err:%s,%s", err.Error(), msg))
+		}
+	}()
+	activityInfo, err := cygx.GetAddActivityInfoSpecialById(activityId)
+	if err != nil {
+		msg = "GetReportInfo Err:" + err.Error()
+		return
+	}
+
+	var openIdList []*cygx.OpenIdList
+	openIdList, err = cygx.GetActivitySpecialOpenIdList()
+	if err != nil {
+		msg = "get openIdList err:" + err.Error()
+		return
+	}
+
+	var openIdArr []string
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+	if activityInfo.ChartPermissionId != utils.CHART_PERMISSION_ID_YANXUAN {
+		//需求池 1043:深圳进门财经科技股份有限公司下所有的账号,所有活动的新增修改都做推送,所有的报告的新增修改都不做推送。
+		jmcjOpenId := GetUserOpenidByComapnyIdRai(utils.JMCJ_COMPANY_ID)
+		for _, v := range jmcjOpenId {
+			if !utils.InArrayByStr(openIdArr, v) {
+				openIdArr = append(openIdArr, v)
+			}
+		}
+	}
+	var first, keyword1, keyword2, keyword3, keyword4, remark, redirectUrl string
+	keyword1 = "专项调研【" + activityInfo.ResearchTheme + "】"
+	keyword2 = "已开启预报名"
+	//if activityInfo.SpecialType == 1 {
+	//	keyword2 += "线上 预期时间:" + activityInfo.ActivityTimeText
+	//} else {
+	//	keyword2 += "线下 " + "(" + activityInfo.City + ") 预期时间:" + activityInfo.ActivityTimeText
+	//}
+	redirectUrl = utils.WX_MSG_PATH_ACTIVITY_SPECIAL_DETAIL + strconv.Itoa(activityId)
+	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.WxMsgTemplateIdActivityChangeApplyXzs
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	sendInfo.Resource = strconv.Itoa(activityId)
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_UPDATE
+	sendInfo.OpenIdArr = openIdArr
+	err = services.SendTemplateMsg(sendInfo)
+	if err != nil {
+		err = errors.New("SendTemplateMsg, Err: " + err.Error())
+		return
+	}
+	return
+}

+ 92 - 0
services/cygx/user_rai_label.go

@@ -0,0 +1,92 @@
+package cygx
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/services/alarm_msg"
+	"hongze/hz_crm_api/utils"
+	"time"
+)
+
+// GetUserLabelByUserIdArr 根据多个userId 获取每个UserId最新的十条数据
+func GetUserLabelByUserIdArr(userIdArr []int) (mapRsp map[int][]*cygx.WxUserRaiLabelListResp) {
+	if len(userIdArr) == 0 {
+		return
+	}
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("根据多个userId 获取每个UserId最新的十条数据失败:"+err.Error(), "userIdArr", userIdArr), 2)
+		}
+	}()
+	labelList, e := cygx.GetWxUserRaiLabelListByUserIds(userIdArr)
+	if e != nil {
+		err = errors.New("GetWxUserRaiLabelListByUserIds, Err: " + e.Error())
+		return
+	}
+	mapRsp = make(map[int][]*cygx.WxUserRaiLabelListResp)
+	for _, v := range labelList {
+		mapRsp[v.UserId] = append(mapRsp[v.UserId], v)
+	}
+	return
+}
+
+// DeleteActivityWxUserRaiLabel 点了到会,又点了取消的人,对应的活动标签给取消掉
+func DeleteActivityWxUserRaiLabel(userIdArr []int, activityId int) {
+	if len(userIdArr) == 0 {
+		return
+	}
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("点了到会,又点了取消的人,对应的活动标签给取消掉失败, DeleteActivityWxUserRaiLabel Err:"+err.Error(), "userIdArr", userIdArr), 2)
+		}
+	}()
+	e := cygx.DeleteWxUserRaiLabelWithActivity(userIdArr, activityId)
+	if e != nil {
+		err = errors.New("DeleteWxUserRaiLabelWithActivity, Err: " + e.Error())
+		return
+	}
+	return
+}
+
+// 添加用户参加活动标签到Redis
+func ActivityWxUserRaiLabelRedisAdd(sourceId, uid int, createTime time.Time) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			msg := fmt.Sprint("sourceId:", sourceId, "userId:", uid)
+			go alarm_msg.SendAlarmMsg("添加用户参加活动标签,写入Redis队列消息失败:"+err.Error()+msg, 2)
+		}
+	}()
+	log := &cygx.WxUserRaiLabelRedis{UserId: uid, SourceId: sourceId, SourceType: 2, CreateTime: createTime}
+	if utils.Re == nil {
+		err := utils.Rc.LPush(utils.WX_USER_RAI_LABEL_KEY, log)
+		if err != nil {
+			fmt.Println("ActivityWxUserRaiLabelRedisAdd LPush Err:" + err.Error())
+		}
+	}
+	return
+}
+
+// 添加用户参加路演标签到Redis
+func RoadShowWxUserRaiLabelRedisAdd(sourceId, uid int, createTime time.Time) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			msg := fmt.Sprint("sourceId:", sourceId, "userId:", uid)
+			go alarm_msg.SendAlarmMsg("添加用户参加路演标签,写入Redis队列消息失败:"+err.Error()+msg, 2)
+		}
+	}()
+	log := &cygx.WxUserRaiLabelRedis{UserId: uid, SourceId: sourceId, SourceType: 3, CreateTime: createTime}
+	if utils.Re == nil {
+		err := utils.Rc.LPush(utils.WX_USER_RAI_LABEL_KEY, log)
+		if err != nil {
+			fmt.Println("RoadShowWxUserRaiLabelRedisAdd LPush Err:" + err.Error())
+		}
+	}
+	return
+}

+ 31 - 0
services/cygx/user_remind.go

@@ -3,6 +3,7 @@ package cygx
 import (
 	"errors"
 	"fmt"
+	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/cygx"
 	"hongze/hz_crm_api/services/alarm_msg"
 	"hongze/hz_crm_api/utils"
@@ -38,3 +39,33 @@ func GetCygxUserRemindListMap(userIds []int) (mapResp map[int]bool) {
 	}
 	return
 }
+
+// 获取某一个公司下所有OpenId (查研观向主体)
+func GetUserOpenidByComapnyIdRai(comppanyId int) (openIdArr []string) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("获取某一个公司下所有用户的手机号 失败 comppanyId", comppanyId, "err", err.Error()), 2)
+		}
+	}()
+	listUser, e := models.GetWxUserListCompanyId(comppanyId)
+	if e != nil {
+		err = errors.New("GetWxUserListCompanyId" + e.Error())
+		return
+	}
+	var mobileArr []string
+	openIdArr = make([]string, 0)
+	for _, v := range listUser {
+		mobileArr = append(mobileArr, v.Mobile)
+	}
+	openIdListJmcj, e := cygx.GetUserRecordListByMobileArr(mobileArr)
+	if e != nil {
+		err = errors.New("GetUserRecordListByMobileArr" + e.Error())
+		return
+	}
+	for _, v := range openIdListJmcj {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+	return
+}

+ 1 - 1
services/elastic/es_comprehensive.go

@@ -578,7 +578,7 @@ func AddComprehensiveIndustrialSource(sourceType string, articleId int) {
 		item.SubjectNames = strings.Join(mapActivitySubject[v.IndustrialManagementId], ",")
 		item.PublishDate = v.PublishDate + " 00:00:00"
 		EsAddOrEditComprehensiveData(item)
-		UpdateComprehensiveIndustrialResourceData(item)
+		//UpdateComprehensiveIndustrialResourceData(item)
 	}
 }
 

+ 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
+}

+ 169 - 19
services/roadshow/report.go

@@ -137,6 +137,41 @@ func GetMonthData(adminType, dimensionType string) (adminDataMapList []AdminData
 	return
 }
 
+// GetQuarterData 季度数据
+func GetQuarterData(adminType, dimensionType string) (adminDataMapList []AdminDataMap, firstDate time.Time, err error) { //三个协程返回
+	nowQuarterFirstDay := utils.GetNowQuarterFirstDay()                            //本季度第一天
+	nowQuarterLastDay := nowQuarterFirstDay.AddDate(0, 3, 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 := nowQuarterFirstDay.AddDate(0, -3, 0).Add(-1 * time.Second) //上上个季度最后一天
+
+	ch1 := make(chan AdminDataMap, 0)
+	ch2 := make(chan AdminDataMap, 0)
+	ch3 := make(chan AdminDataMap, 0)
+
+	go getSectionData(nowQuarterFirstDay, nowQuarterLastDay, adminType, dimensionType, ch1)
+	go getSectionData(lastQuarterFirstDay1, lastQuarterLastDay1, adminType, dimensionType, ch2)
+	go getSectionData(lastQuarterFirstDay2, lastQuarterLastDay2, adminType, dimensionType, ch3)
+
+	var nowMonthAdminDataMap, lastMonthAdminDataMap1, lastMonthAdminDataMap2 AdminDataMap
+
+	nowMonthAdminDataMap = <-ch1
+	close(ch1)
+
+	lastMonthAdminDataMap1 = <-ch2
+	close(ch2)
+
+	lastMonthAdminDataMap2 = <-ch3
+	close(ch3)
+
+	adminDataMapList = make([]AdminDataMap, 0)
+	adminDataMapList = append(adminDataMapList, nowMonthAdminDataMap, lastMonthAdminDataMap1, lastMonthAdminDataMap2)
+	return
+}
+
 // GetMonthDataV2 月度数据
 func GetMonthDataV2(adminType, dimensionType string, dataNum int) (adminDataMapList []AdminDataMap, firstDate time.Time, err error) { //三个协程返回
 	nowMonthFirstDay := utils.GetNowMonthFirstDay() //本月第一天
@@ -190,13 +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:"线上路演次数"`
-	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 获取周期数据
@@ -219,6 +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)     //沙龙路演次数
+	asktryOutMap := make(map[int]int) //填写过客户问答的路演次数(试用)
+	askformalMap := make(map[int]int) //填写过客户问答的路演次数(正式)
 	//正式客户
 	{
 		var condition string
@@ -233,6 +276,19 @@ func getResearcherSectionData(startDate, endDate time.Time) (adminDataMap AdminD
 		for _, v := range data {
 			formalMap[v.AdminId] = v.Num
 		}
+
+		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 {
+			askformalMap[v.AdminId] = v.Num
+		}
 	}
 
 	//试用客户
@@ -251,6 +307,19 @@ func getResearcherSectionData(startDate, endDate time.Time) (adminDataMap AdminD
 			//fmt.Println(v)
 			tryOutMap[v.AdminId] = v.Num
 		}
+
+		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 {
+			asktryOutMap[v.AdminId] = v.Num
+		}
 	}
 
 	//试用客户
@@ -269,12 +338,51 @@ func getResearcherSectionData(startDate, endDate time.Time) (adminDataMap AdminD
 			meetingMap[v.AdminId] = v.Num
 		}
 	}
+
+	//路演总次数
+	{
+		var condition string
+		var pars []interface{}
+		condition = ` and start_date >= ? and end_date <= ? and activity_type = ? `
+		pars = append(pars, startDate, endDate, "路演")
+		data, tmpErr := roadshow.GetGroupResearcherRecordList(condition, pars)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		for _, v := range data {
+			//fmt.Println(v)
+			roadShowMap[v.AdminId] = v.Num
+		}
+	}
+
+	//沙龙路演次数
+	{
+		var condition string
+		var pars []interface{}
+		condition = ` and start_date >= ? and end_date <= ? and activity_type = ? `
+		pars = append(pars, startDate, endDate, "沙龙")
+		data, tmpErr := roadshow.GetGroupResearcherRecordList(condition, pars)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		for _, v := range data {
+			//fmt.Println(v)
+			salonMap[v.AdminId] = v.Num
+		}
+	}
+
 	adminDataMap = AdminDataMap{
-		TryOutMap:  tryOutMap,
-		FormalMap:  formalMap,
-		MeetingMap: meetingMap,
-		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
 }
@@ -286,6 +394,9 @@ func getSellerSectionData(startDate, endDate time.Time, dimensionType string) (a
 	meetingMap := make(map[int]int)
 	onlineMap := make(map[int]int)
 	offlineMap := make(map[int]int)
+	roadShowMap := make(map[int]int) // 路演总次数
+	salonMap := make(map[int]int)    //沙龙路演次数
+
 	//fmt.Println()
 	//客户状态维度
 	if dimensionType == "company_status" {
@@ -438,14 +549,53 @@ func getSellerSectionData(startDate, endDate time.Time, dimensionType string) (a
 		}
 	}
 
+	//权益路演
+	if dimensionType == "roadshow_rai" {
+		//路演总次数
+		{
+			var condition string
+			var pars []interface{}
+			condition = ` and start_date >= ? and end_date <= ? and activity_type = ? `
+			pars = append(pars, startDate, endDate, "路演")
+			data, tmpErr := roadshow.GetGroupSellerRecordList(condition, pars)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			for _, v := range data {
+				//fmt.Println(v)
+				roadShowMap[v.AdminId] = v.Num
+			}
+		}
+
+		//沙龙路演次数
+		{
+			var condition string
+			var pars []interface{}
+			condition = ` and start_date >= ? and end_date <= ? and activity_type = ? `
+			pars = append(pars, startDate, endDate, "沙龙")
+			data, tmpErr := roadshow.GetGroupSellerRecordList(condition, pars)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			for _, v := range data {
+				//fmt.Println(v)
+				salonMap[v.AdminId] = v.Num
+			}
+		}
+	}
+
 	adminDataMap = AdminDataMap{
-		TryOutMap:  tryOutMap,
-		FormalMap:  formalMap,
-		MeetingMap: meetingMap,
-		OfflineMap: offlineMap,
-		OnlineMap:  onlineMap,
-		StartDate:  startDate.Format(utils.FormatDate),
-		EndDate:    endDate.Format(utils.FormatDate),
+		TryOutMap:   tryOutMap,
+		FormalMap:   formalMap,
+		MeetingMap:  meetingMap,
+		OfflineMap:  offlineMap,
+		OnlineMap:   onlineMap,
+		RoadShowMap: roadShowMap,
+		SalonMap:    salonMap,
+		StartDate:   startDate.Format(utils.FormatDate),
+		EndDate:     endDate.Format(utils.FormatDate),
 	}
 	return
 }

+ 204 - 24
services/seal/seal.go

@@ -123,7 +123,7 @@ func ApplySeal(sysUser *system.Admin, req request.SealApprovalApplyReq) (err err
 	}()
 
 	// 添加用印
-	sealInfo, err := addSeal(sysUser.AdminId, req.ContractId, req.FileNum, sysUser.RealName, req.Use, req.CompanyName, req.UseCompanyName, req.CreditCode, req.ServiceType, req.SealType, req.Remark, req.FileUrls, req.AffiliatedCompany)
+	sealInfo, err := addSeal(sysUser.AdminId, req.ContractId, req.FileNum, req.CompanyId, sysUser.RealName, req.Use, req.CompanyName, req.UseCompanyName, req.CreditCode, req.ServiceType, req.SealType, req.Remark, req.FileUrls, req.AffiliatedCompany, req.StartDate, req.EndDate, req.Money)
 	if err != nil {
 		return
 	}
@@ -140,7 +140,7 @@ func ApplySeal(sysUser *system.Admin, req request.SealApprovalApplyReq) (err err
 }
 
 // addSeal 新增用印
-func addSeal(userId, contractId, fileNum int, userName, use, companyName, useCompanyName, creditCode, serviceType, sealType, remark string, fileUrls []string, affiliatedCompany string) (sealInfo *seal.Seal, err error) {
+func addSeal(userId, contractId, fileNum, companyId int, userName, use, companyName, useCompanyName, creditCode, serviceType, sealType, remark string, fileUrls []string, affiliatedCompany, startDate, endDate string, money float64) (sealInfo *seal.Seal, err error) {
 	if !strings.Contains(strings.Join(seal.EnumUse, ","), use) {
 		err = errors.New("用印用途异常")
 		return
@@ -149,8 +149,27 @@ func addSeal(userId, contractId, fileNum int, userName, use, companyName, useCom
 		err = errors.New("业务类型异常")
 		return
 	}
+	adminAll, err := system.GetAdminList()
+	if err != nil {
+		return
+	}
+	//adminMap := make(map[int]*system.AdminView)
+	mapRaiSllerId := make(map[int]bool) // 是否为权益销售
+	for _, v := range adminAll {
+		//adminMap[v.AdminId] = v
+		if v.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER || v.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP || v.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN {
+			mapRaiSllerId[v.AdminId] = true
+		}
+	}
 
-	sealCode, err := seal.GetSealCode()
+	var sealCode string
+	var productId int
+	if mapRaiSllerId[userId] {
+		sealCode, err = seal.GetSealCodeRai()
+		productId = utils.COMPANY_PRODUCT_RAI_ID
+	} else {
+		sealCode, err = seal.GetSealCode()
+	}
 	if err != nil {
 		return
 	}
@@ -160,25 +179,32 @@ func addSeal(userId, contractId, fileNum int, userName, use, companyName, useCom
 	if len(fileUrls) == 1 {
 		fileUrl = fileUrls[0]
 	}
+
 	sealInfo = &seal.Seal{
-		Code:           sealCode,
-		UserId:         userId,
-		UserName:       userName,
-		Use:            use,
-		CompanyName:    companyName,
-		UseCompanyName: useCompanyName,
-		CreditCode:     creditCode,
-		ServiceType:    serviceType,
-		SealType:       sealType,
-		Status:         "待提交",
-		Remark:         remark,
-		FileUrl:        fileUrl,
-		FileNum:        fileNum,
-		ContractId:     contractId,
-		ModifyTime:     now,
-		CreateTime:     now,
-		AffiliatedCompany:  affiliatedCompany,
+		Code:              sealCode,
+		UserId:            userId,
+		UserName:          userName,
+		Use:               use,
+		CompanyName:       companyName,
+		UseCompanyName:    useCompanyName,
+		CreditCode:        creditCode,
+		ServiceType:       serviceType,
+		SealType:          sealType,
+		Status:            "待提交",
+		Remark:            remark,
+		FileUrl:           fileUrl,
+		FileNum:           fileNum,
+		ContractId:        contractId,
+		ModifyTime:        now,
+		CreateTime:        now,
+		AffiliatedCompany: affiliatedCompany,
+		ProductId:         productId,
+		CompanyId:         companyId,
+		StartDate:         startDate,
+		EndDate:           endDate,
+		Money:             money,
 	}
+
 	err = seal.AddSeal(sealInfo)
 	if err != nil {
 		return
@@ -214,7 +240,7 @@ func EditApply(sysUser *system.Admin, req request.SealApprovalEditReq) (err erro
 	}()
 
 	// 编辑用印
-	sealInfo, err := editSeal(req.SealId, sysUser.AdminId, req.ContractId, req.FileNum, req.Use, req.CompanyName, req.UseCompanyName, req.CreditCode, req.ServiceType, req.SealType, req.Remark, req.FileUrls, req.AffiliatedCompany)
+	sealInfo, err := editSeal(req.SealId, sysUser.AdminId, req.ContractId, req.FileNum, req.Use, req.CompanyName, req.UseCompanyName, req.CreditCode, req.ServiceType, req.SealType, req.Remark, req.FileUrls, req.AffiliatedCompany, req.StartDate, req.EndDate, req.Money)
 	if err != nil {
 		return
 	}
@@ -231,7 +257,7 @@ func EditApply(sysUser *system.Admin, req request.SealApprovalEditReq) (err erro
 }
 
 // editSeal 编辑用印申请
-func editSeal(sealId, userId, contractId, fileNum int, use, companyName, userCompanyName, creditCode, serviceType, sealType, remark string, fileUrls []string, affiliatedCompany string) (sealInfo *seal.Seal, err error) {
+func editSeal(sealId, userId, contractId, fileNum int, use, companyName, userCompanyName, creditCode, serviceType, sealType, remark string, fileUrls []string, affiliatedCompany, startDate, endDate string, money float64) (sealInfo *seal.Seal, err error) {
 	if !strings.Contains(strings.Join(seal.EnumUse, ","), use) {
 		err = errors.New("用印用途异常")
 		return
@@ -278,7 +304,10 @@ func editSeal(sealId, userId, contractId, fileNum int, use, companyName, userCom
 	sealInfo.CreateTime = now // 更新提交时间
 	sealInfo.Status = "待提交"
 	sealInfo.AffiliatedCompany = affiliatedCompany
-	err = sealInfo.Update([]string{"Use", "CompanyName", "UseCompanyName", "CreditCode", "ServiceType", "SealType", "Remark", "FileUrl", "FileNum", "ContractId", "ModifyTime", "CreateTime", "Status", "AffiliatedCompany"})
+	sealInfo.StartDate = startDate
+	sealInfo.EndDate = endDate
+	sealInfo.Money = money
+	err = sealInfo.Update([]string{"Use", "CompanyName", "UseCompanyName", "CreditCode", "ServiceType", "SealType", "Remark", "FileUrl", "FileNum", "ContractId", "ModifyTime", "CreateTime", "Status", "AffiliatedCompany", "StartDate", "EndDate", "Money"})
 	if err != nil {
 		return
 	}
@@ -485,7 +514,6 @@ func reapply(sealInfo *seal.Seal, opUser *system.Admin) (err error) {
 	return
 }
 
-// GetSealApprovalPageList 获取用印审批分页列表
 func GetSealApprovalPageList(condition, joinCondition string, pars []interface{}, startSize, pageSize int, sysUser *system.Admin) (newList []*response.SealApprovalList, total int, err error) {
 	// 1.列表数据
 	list, total, err := seal.GetSealApprovalListByWhere(condition, joinCondition, pars, startSize, pageSize)
@@ -588,6 +616,14 @@ func GetSealApprovalPageList(condition, joinCondition string, pars []interface{}
 			}
 
 			// 合同编码
+			if selfContract, has := selfContractMap[item.ContractId]; has {
+				list[i].ContractCode = selfContract.ContractCode
+			} else {
+				if item.ProductId == utils.COMPANY_PRODUCT_RAI_ID {
+					list[i].ContractCode = item.Code
+				}
+			}
+
 			if selfContract, has := selfContractMap[item.ContractId]; has {
 				list[i].ContractCode = selfContract.ContractCode
 			}
@@ -617,6 +653,150 @@ func GetSealApprovalPageList(condition, joinCondition string, pars []interface{}
 	return
 }
 
+// GetSealApprovalPageList 获取用印审批分页列表
+//func GetSealApprovalPageList(condition, joinCondition string, pars []interface{}, startSize, pageSize int, sysUser *system.Admin) (newList []*response.SealApprovalList, total int, err error) {
+//	// 1.列表数据
+//	list, total, err := seal.GetSealApprovalListByWhere(condition, joinCondition, pars, startSize, pageSize)
+//	if err != nil {
+//		err = errors.New(fmt.Sprint("获取用印审批列表失败,Err:"+err.Error(), err))
+//		return
+//	}
+//
+//	// 2.操作权限
+//	if len(list) > 0 {
+//		// 取出所有列表最新的审批IDs
+//		approvalIdSlice := make([]string, 0)
+//		// 取出所有列表的关联合同id
+//		contractIdSlice := make([]string, 0)
+//		for i := 0; i < len(list); i++ {
+//			approvalIdSlice = append(approvalIdSlice, strconv.Itoa(list[i].ContractApprovalId))
+//			contractIdSlice = append(contractIdSlice, strconv.Itoa(list[i].ContractId))
+//		}
+//		approvalIdStr := strings.Join(approvalIdSlice, ",")
+//
+//		// 通过审批IDs获取所有的审批流
+//		approvalRecordList, tempErr := contract.GetContractApprovalRecordListByContractApprovalIds(approvalIdStr)
+//		//approvalRecordList, tempErr := contract.GetContractApprovalRecordList(approvalIdStr, sysUser.AdminId)
+//		if tempErr != nil {
+//			err = errors.New(fmt.Sprint("获取审批流失败,Err:"+tempErr.Error(), err))
+//			return
+//		}
+//
+//		// 获取自己的审批流列表数据
+//		selfContractApprovalRecordList, tempErr := contract.GetSelfContractApprovalRecordList(approvalIdStr, sysUser.AdminId)
+//		if tempErr != nil {
+//			err = errors.New(fmt.Sprint("获取审批列表失败,Err:"+tempErr.Error(), err))
+//			return
+//		}
+//		selfContractApprovalRecordMap := make(map[int]*contract.ContractApprovalRecord)
+//		for i := 0; i < len(selfContractApprovalRecordList); i++ {
+//			selfContractApprovalRecordMap[selfContractApprovalRecordList[i].ContractApprovalId] = selfContractApprovalRecordList[i]
+//		}
+//
+//		// 获取所有关联的合同列表
+//		selfContractMap := make(map[int]*contract.ContractList)
+//		{
+//			if len(contractIdSlice) > 0 {
+//				contractIdStr := strings.Join(contractIdSlice, ",")
+//				contractList, tempErr := contract.GetContractListByContractIds(contractIdStr)
+//				if tempErr != nil {
+//					err = errors.New(fmt.Sprint("获取合同失败,Err:"+tempErr.Error(), err))
+//					return
+//				}
+//				for i := 0; i < len(contractList); i++ {
+//					selfContractMap[contractList[i].ContractId] = contractList[i]
+//				}
+//			}
+//		}
+//
+//		for i := 0; i < len(list); i++ {
+//			item := list[i]
+//			list[i].CreateTimeStr = item.CreateTime.Format(utils.FormatDateTime)
+//			list[i].ModifyTimeStr = item.ModifyTime.Format(utils.FormatDateTime)
+//			list[i].ApproveTimeStr = item.ApproveTime.Format(utils.FormatDateTime)
+//			list[i].InvalidTimeStr = item.InvalidTime.Format(utils.FormatDateTime)
+//			list[i].CheckBackFileTimeStr = item.CheckBackFileTime.Format(utils.FormatDateTime)
+//
+//			if item.ApproveStatus == "已审批" || item.ApproveStatus == "已驳回" {
+//				list[i].ApproveTime = item.ModifyTime
+//				list[i].ApproveTimeStr = item.ModifyTime.Format(utils.FormatDateTime)
+//			}
+//
+//			// 如果当前状态是待审批的话,那么校验自己的审批流数据,然后去返回对应的状态
+//			if item.Status == "待审批" {
+//				// 如果是自己发起的审批单,同时已经经过了一轮审批,那么标记为处理中
+//				if item.ApplyUserId == sysUser.AdminId && item.CurrNodeId > item.StartNodeId {
+//					list[i].Status = "处理中"
+//				} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN && item.CurrNodeId > item.StartNodeId {
+//					// 如果是超管角色,同时已经经过了一轮审批,那么标记为处理中
+//					list[i].Status = "处理中"
+//				} else {
+//					// 此处可能出现同一审批人同时有权限处理一级二级的情况
+//					maxNodeId := 0
+//					tempStatus := "待审批"
+//					for _, selfRecord := range selfContractApprovalRecordList {
+//						if item.ContractApprovalId == selfRecord.ContractApprovalId {
+//							if selfRecord.NodeId > maxNodeId {
+//								maxNodeId = selfRecord.NodeId
+//							}
+//							if maxNodeId < item.CurrNodeId && selfRecord.NodeType != "cc" {
+//								tempStatus = "处理中"
+//							} else if maxNodeId == item.CurrNodeId && selfRecord.NodeType != "cc" {
+//								tempStatus = "待审批"
+//							}
+//						}
+//					}
+//					list[i].Status = tempStatus
+//					/*if contractApprovalRecord, has := selfContractApprovalRecordMap[item.ContractApprovalId]; has {
+//						if contractApprovalRecord.NodeId < item.CurrNodeId && contractApprovalRecord.NodeType != "cc" {
+//							list[i].Status = "处理中"
+//						}
+//					}*/
+//				}
+//			}
+//			// 合同编码
+//
+//			//if selfContract, has := selfContractMap[item.ContractId]; has {
+//			//	list[i].ContractCode = selfContract.ContractCode
+//			//} else {
+//			//	if item.ProductId == utils.COMPANY_PRODUCT_RAI_ID {
+//			//		list[i].ContractCode = item.Code
+//			//	}
+//			//}
+//
+//			if selfContract, has := selfContractMap[item.ContractId]; has {
+//				list[i].ContractCode = selfContract.ContractCode
+//			} else {
+//				if item.ProductId == utils.COMPANY_PRODUCT_RAI_ID {
+//					list[i].ContractCode = item.Code
+//				}
+//			}
+//
+//			// 取出item对应approval_id的审批流
+//			var tempApprovalRecordMap []*contract.ContractApprovalRecord
+//			for _, recordItem := range approvalRecordList {
+//				if item.ContractApprovalId == recordItem.ContractApprovalId {
+//					tempApprovalRecordMap = append(tempApprovalRecordMap, recordItem)
+//				}
+//			}
+//			// 获取对该条数据的操作权限
+//			opButton, tempErr := handleListOpButton(item, tempApprovalRecordMap, sysUser)
+//			if tempErr != nil {
+//				err = errors.New(fmt.Sprint("获取操作权限失败,Err:"+tempErr.Error(), err))
+//				return
+//			}
+//
+//			tempNewList := &response.SealApprovalList{
+//				SealApprovalItem: item,
+//				OpButton:         opButton,
+//			}
+//			newList = append(newList, tempNewList)
+//		}
+//	}
+//
+//	return
+//}
+
 // handleOpButton 列表数据操作权限
 func handleListOpButton(approvalItem *seal.SealApprovalItem, recordList []*contract.ContractApprovalRecord, sysUser *system.Admin) (opButton response.SealApprovalOpButton, err error) {
 	// 待审批状态下,如果是自己发起的审批单,同时已经经过了一轮审批,那么标记为处理中

+ 8 - 8
services/wechat_send_category_template_msg.go

@@ -308,14 +308,14 @@ func SendWxCategoryMsgWithCygxActivityUpdateLimitPeople(activityId int) (err err
 	//已经推送过的不做二次推送
 	//listSendOpendId, err := models.GeUserTemplateRecordListBysendType(utils.TEMPLATE_MSG_CYGX_ACTIVITY_LIMIT_PEOPLE, strconv.Itoa(activityId))
 	//已经推送过的不做二次推送
-	listSendOpendId, err := cygx.GeCygxActivityUserTemplateRecordListByActivityId(activityId, utils.TEMPLATE_MSG_CYGX_ACTIVITY_LIMIT_PEOPLE)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		return err
-	}
-	mapSendOpenid := make(map[string]int)
-	for _, v := range listSendOpendId {
-		mapSendOpenid[v.OpenId] = v.UserId
-	}
+	//listSendOpendId, err := cygx.GeCygxActivityUserTemplateRecordListByActivityId(activityId, utils.TEMPLATE_MSG_CYGX_ACTIVITY_LIMIT_PEOPLE)
+	//if err != nil && err.Error() != utils.ErrNoRow() {
+	//	return err
+	//}
+	//mapSendOpenid := make(map[string]int)
+	//for _, v := range listSendOpendId {
+	//	mapSendOpenid[v.OpenId] = v.UserId
+	//}
 
 	var condition string
 	var pars []interface{}

+ 28 - 353
services/wechat_send_msg.go

@@ -10,7 +10,6 @@ import (
 	"hongze/hz_crm_api/models/system"
 	"hongze/hz_crm_api/services/alarm_msg"
 	"hongze/hz_crm_api/utils"
-	"html"
 	"io/ioutil"
 	"net/http"
 	"strconv"
@@ -418,250 +417,6 @@ func SendCompanyReceiveWxTemplateMsg(companyName, productName, sellerName, other
 	return
 }
 
-// 活动取消消息通知
-func SendWxMsgWithCygxActivity(activityId int) (err error) {
-	var msg string
-	defer func() {
-		if err != nil {
-			go alarm_msg.SendAlarmMsg("发送模版消息失败,Err:"+err.Error()+";msg:"+msg, 3)
-			utils.FileLogCygx.Info(fmt.Sprintf("发送模版消息失败,Err:%s,%s", err.Error(), msg))
-		}
-		if msg != "" {
-			utils.FileLogCygx.Info("发送模版消息失败,msg:%s", msg)
-		}
-	}()
-	activityInfo, err := cygx.GetAddActivityInfoById(activityId)
-	if err != nil {
-		msg = "GetReportInfo Err:" + err.Error()
-		return
-	}
-	var openIdList []*cygx.OpenIdList
-	openIdList, err = cygx.GetActivityOpenIdList(activityId)
-	if err != nil {
-		msg = "get GetActivityOpenIdList err:" + err.Error()
-		return
-	}
-	mapOpenid := make(map[int]string)
-	for _, v := range openIdList {
-		mapOpenid[v.UserId] = v.OpenId
-	}
-	//添加预约纪要的openid
-	openIdListAppointment, err := cygx.GetActivityAppointmentOpenIdList(activityId)
-	if err != nil {
-		msg = "GetActivityAppointmentOpenIdList err:" + err.Error()
-		return
-	}
-	if len(openIdListAppointment) > 0 {
-		for _, v := range openIdListAppointment {
-			if _, ok := mapOpenid[v.UserId]; !ok {
-				item := new(cygx.OpenIdList)
-				item.UserId = v.UserId
-				item.OpenId = v.OpenId
-				openIdList = append(openIdList, item)
-			}
-			mapOpenid[v.UserId] = v.OpenId
-
-		}
-	}
-
-	//添加带问的openid
-	openIdListActivityHelpAsk, err := cygx.GetActivityHelpAskOpenIdList(activityId)
-	if err != nil {
-		msg = "openIdListActivityHelpAsk err:" + err.Error()
-		return
-	}
-	if len(openIdListActivityHelpAsk) > 0 {
-		for _, v := range openIdListActivityHelpAsk {
-			if _, ok := mapOpenid[v.UserId]; !ok {
-				item := new(cygx.OpenIdList)
-				item.UserId = v.UserId
-				item.OpenId = v.OpenId
-				openIdList = append(openIdList, item)
-			}
-			mapOpenid[v.UserId] = v.OpenId
-		}
-	}
-	activityInfo.ActivityTypeName = strings.Replace(activityInfo.ActivityTypeName, "(C类)", "", -1)
-	if len(openIdList) == 0 {
-		return err
-	}
-	var keyword1, keyword2, keyword3, keyword4, redirectUrl string
-	keyword1 = activityInfo.ActivityName
-	keyword2 = "活动已取消"
-	openIdArr := make([]string, len(openIdList))
-	for i, v := range openIdList {
-		openIdArr[i] = v.OpenId
-	}
-	redirectUrl = utils.WX_MSG_PATH_ACTIVITY_DETAIL + strconv.Itoa(activityId) + "&IsSendWx=1"
-	sendInfo := new(SendWxTemplate)
-	//sendInfo.First = first
-	sendInfo.Keyword1 = keyword1
-	sendInfo.Keyword2 = keyword2
-	sendInfo.Keyword3 = keyword3
-	sendInfo.Keyword4 = keyword4
-	//sendInfo.Remark = remark
-	sendInfo.TemplateId = utils.WxMsgTemplateIdActivityChangeApplyXzs
-	sendInfo.RedirectUrl = redirectUrl
-	sendInfo.RedirectTarget = 3
-	sendInfo.Resource = strconv.Itoa(activityId)
-	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_CACLE
-	sendInfo.OpenIdArr = openIdArr
-	err = SendTemplateMsg(sendInfo)
-	return
-}
-
-// 活动更改时间消息通知
-func SendWxMsgWithCygxActivityUpdateTime(activityId int, oldStr, newStr, strType string) (err error) {
-	var msg string
-	defer func() {
-		if err != nil {
-			go alarm_msg.SendAlarmMsg("发送模版消息失败,Err:"+err.Error()+";msg:"+msg, 3)
-			utils.FileLogCygx.Info(fmt.Sprintf("发送模版消息失败,Err:%s,%s", err.Error(), msg))
-		}
-		if msg != "" {
-			utils.FileLogCygx.Info("发送模版消息失败,msg:%s", msg)
-		}
-	}()
-
-	activityInfo, err := cygx.GetAddActivityInfoById(activityId)
-	if err != nil {
-		msg = "GetReportInfo Err:" + err.Error()
-		return
-	}
-	if activityInfo == nil {
-		utils.FileLogCygx.Info("活动信息不存在")
-		return
-	}
-
-	//var accessToken string
-	//if utils.RunMode == "release" {
-	//	accessToken, err = models.GetWxAccessTokenByXzs()
-	//	if err != nil {
-	//		msg = "GetWxAccessToken Err:" + err.Error()
-	//		return
-	//	}
-	//	if accessToken == "" {
-	//		msg = "accessToken is empty"
-	//		return
-	//	}
-	//} else {
-	//	accessToken, err = models.GetWxAccessToken()
-	//	if err != nil {
-	//		msg = "GetWxAccessToken Err:" + err.Error()
-	//		return
-	//	}
-	//	if accessToken == "" {
-	//		msg = "accessToken is empty"
-	//		return
-	//	}
-	//}
-	var openIdList []*cygx.OpenIdList
-
-	openIdList, err = cygx.GetActivityOpenIdList(activityId)
-	if err != nil {
-		msg = "get openIdList err:" + err.Error()
-		return
-	}
-
-	mapOpenid := make(map[int]string)
-	for _, v := range openIdList {
-		mapOpenid[v.UserId] = v.OpenId
-	}
-	//添加预约纪要的openid
-	openIdListAppointment, err := cygx.GetActivityAppointmentOpenIdList(activityId)
-	if err != nil {
-		msg = "GetActivityAppointmentOpenIdList err:" + err.Error()
-		return
-	}
-	if len(openIdListAppointment) > 0 {
-		for _, v := range openIdListAppointment {
-			if _, ok := mapOpenid[v.UserId]; !ok {
-				item := new(cygx.OpenIdList)
-				item.UserId = v.UserId
-				item.OpenId = v.OpenId
-				openIdList = append(openIdList, item)
-			}
-			mapOpenid[v.UserId] = v.OpenId
-
-		}
-	}
-
-	//添加带问的openid
-	openIdListActivityHelpAsk, err := cygx.GetActivityHelpAskOpenIdList(activityId)
-	if err != nil {
-		msg = "openIdListActivityHelpAsk err:" + err.Error()
-		return
-	}
-	if len(openIdListActivityHelpAsk) > 0 {
-		for _, v := range openIdListActivityHelpAsk {
-			if _, ok := mapOpenid[v.UserId]; !ok {
-				item := new(cygx.OpenIdList)
-				item.UserId = v.UserId
-				item.OpenId = v.OpenId
-				openIdList = append(openIdList, item)
-			}
-			mapOpenid[v.UserId] = v.OpenId
-		}
-	}
-
-	if len(openIdList) == 0 {
-		return err
-	}
-	//sendMap := make(map[string]interface{})
-	//sendData := make(map[string]interface{})
-	var first string
-	var keyword1, keyword2, keyword3, keyword4, redirectUrl string
-
-	activityInfo.ActivityTypeName = strings.Replace(activityInfo.ActivityTypeName, "(C类)", "", -1)
-	if strType == "timeType" {
-		//first = "您有一场【" + activityInfo.ActivityTypeName + "】发生了时间变更"
-		keyword2 = "时间变更为:【 " + newStr + "】"
-	} else if strType == "expertType" {
-		//first = "您有一场【" + activityInfo.ActivityTypeName + "】发生了专家变更"
-		keyword2 = "专家变更为:【" + newStr + "】"
-	} else if strType == "addressType" {
-		//first = "您有一场【" + activityInfo.ActivityTypeName + "】发生了地址变更"
-		keyword2 = "地点变更为:【" + newStr + "】"
-	} else if strType == "participationCode" {
-		//first = "您有一场【" + activityInfo.ActivityTypeName + "】公布了拨入密码"
-		keyword2 = "拨入密码为: " + newStr
-	} else if strType == "Theme" {
-		//first = "您有一场【" + activityInfo.ActivityTypeName + "】更新了活动主题"
-		newStr = strings.Replace(newStr, "</p><p>", "\n", -1)
-		newStr = html.EscapeString(newStr)
-		newStrHtml, _ := cygx.GetReportContentTextSub(newStr)
-		newStr = newStrHtml
-		keyword2 = "主题变更为: " + newStr
-	}
-
-	keyword1 = activityInfo.ActivityName
-	openIdArr := make([]string, len(openIdList))
-	for i, v := range openIdList {
-		openIdArr[i] = v.OpenId
-	}
-
-	redirectUrl = utils.WX_MSG_PATH_ACTIVITY_DETAIL + strconv.Itoa(activityId) + "&IsSendWx=1"
-	sendInfo := new(SendWxTemplate)
-	sendInfo.First = first
-	sendInfo.Keyword1 = keyword1
-	sendInfo.Keyword2 = keyword2
-	sendInfo.Keyword3 = keyword3
-	sendInfo.Keyword4 = keyword4
-	//sendInfo.Remark = remark
-	sendInfo.TemplateId = utils.WxMsgTemplateIdActivityChangeApplyXzs
-	sendInfo.RedirectUrl = redirectUrl
-	sendInfo.RedirectTarget = 3
-	sendInfo.Resource = strconv.Itoa(activityId)
-	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_UPDATE
-	sendInfo.OpenIdArr = openIdArr
-	e := SendTemplateMsg(sendInfo)
-	if e != nil {
-		err = errors.New("推送模板消息失败" + e.Error())
-		return
-	}
-	return
-}
-
 func SendArticleWxTemplateMsg(nickName, aticleTiele, publishDate, abstract, industryName, msgType string, articleId, departmentId, industrialManagementId int, isResearch bool) (err error) {
 	var msg string
 	defer func() {
@@ -675,31 +430,7 @@ func SendArticleWxTemplateMsg(nickName, aticleTiele, publishDate, abstract, indu
 			utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
 		}
 	}()
-	//var accessToken string
-	//if utils.RunMode == "release" {
-	//	accessToken, err = models.GetWxAccessTokenByXzs()
-	//	if err != nil {
-	//		msg = "GetWxAccessToken Err:" + err.Error()
-	//		return
-	//	}
-	//	if accessToken == "" {
-	//		msg = "accessToken is empty"
-	//		return
-	//	}
-	//} else {
-	//	accessToken, err = models.GetWxAccessToken()
-	//	if err != nil {
-	//		msg = "GetWxAccessToken Err:" + err.Error()
-	//		return
-	//	}
-	//	if accessToken == "" {
-	//		msg = "accessToken is empty"
-	//		return
-	//	}
-	//}
 	var openIdList []*cygx.OpenIdList
-	//utils.FileLog.Info("mobile:%s", otherSellerMobile)
-	//openIdList, err = models.GetOpenIdListByMobile(otherSellerMobile)
 	var resource string
 
 	if msgType == "Department" {
@@ -1260,87 +991,6 @@ func CheckTwoWeekOrMonthReport(classifyId int, classifyName string) (ok bool) {
 	return
 }
 
-// 专项调研活动模板消息通知
-func SendWxMsgWithCygxActivitySpecial(activityId int) (err error) {
-	var msg string
-	defer func() {
-		if err != nil {
-			go alarm_msg.SendAlarmMsg("发送模版消息失败,Err:"+err.Error()+";msg:"+msg, 3)
-			//go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
-			utils.FileLogCygx.Info(fmt.Sprintf("发送模版消息失败,Err:%s,%s", err.Error(), msg))
-		}
-	}()
-	activityInfo, err := cygx.GetAddActivityInfoSpecialById(activityId)
-	if err != nil {
-		msg = "GetReportInfo Err:" + err.Error()
-		return
-	}
-
-	var openIdList []*cygx.OpenIdList
-	openIdList, err = cygx.GetActivitySpecialOpenIdList()
-	if err != nil {
-		msg = "get openIdList err:" + err.Error()
-		return
-	}
-	if len(openIdList) == 0 {
-		return err
-	}
-	//sendMap := make(map[string]interface{})
-	//sendData := make(map[string]interface{})
-	//var first string
-	//var keyword1 string
-	//var keyword2 string
-	//first = "专项调研【" + activityInfo.ResearchTheme + "】已开启预报名"
-	//
-	//redirectUrl := ""
-	//sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
-	//sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
-	//sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
-	//sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
-	//if utils.RunMode == "release" {
-	//	sendMap["template_id"] = utils.WxMsgTemplateIdActivityChangeApplyXzs
-	//} else {
-	//	sendMap["template_id"] = utils.WxMsgTemplateIdActivityChangeApply
-	//}
-	//sendMap["url"] = redirectUrl
-	//sendMap["data"] = sendData
-	//sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxCygxAppId, "pagepath": "activityPages/specialDetail/specialDetail?id=" + strconv.Itoa(activityId)}
-	//sendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(activityId), utils.TEMPLATE_MSG_CYGX_ACTIVITY_UPDATE)
-
-	openIdArr := make([]string, len(openIdList))
-	for i, v := range openIdList {
-		openIdArr[i] = v.OpenId
-	}
-	var first, keyword1, keyword2, keyword3, keyword4, remark, redirectUrl string
-	keyword1 = "专项调研【" + activityInfo.ResearchTheme + "】"
-	keyword2 = "已开启预报名"
-	//if activityInfo.SpecialType == 1 {
-	//	keyword2 += "线上 预期时间:" + activityInfo.ActivityTimeText
-	//} else {
-	//	keyword2 += "线下 " + "(" + activityInfo.City + ") 预期时间:" + activityInfo.ActivityTimeText
-	//}
-	redirectUrl = utils.WX_MSG_PATH_ACTIVITY_SPECIAL_DETAIL + strconv.Itoa(activityId)
-	sendInfo := new(SendWxTemplate)
-	sendInfo.First = first
-	sendInfo.Keyword1 = keyword1
-	sendInfo.Keyword2 = keyword2
-	sendInfo.Keyword3 = keyword3
-	sendInfo.Keyword4 = keyword4
-	sendInfo.Remark = remark
-	sendInfo.TemplateId = utils.WxMsgTemplateIdActivityChangeApplyXzs
-	sendInfo.RedirectUrl = redirectUrl
-	sendInfo.RedirectTarget = 3
-	sendInfo.Resource = strconv.Itoa(activityId)
-	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_UPDATE
-	sendInfo.OpenIdArr = openIdArr
-	err = SendTemplateMsg(sendInfo)
-	if err != nil {
-		err = errors.New("SendTemplateMsg, Err: " + err.Error())
-		return
-	}
-	return
-}
-
 // SendYbQuestionDistributeWxMsg 推送研报小程序模板消息-问答社区分配
 func SendYbQuestionDistributeWxMsg(questionId, adminId int, openid, questionTitle, remark string) (err error) {
 	var errMsg string
@@ -1996,9 +1646,34 @@ func SendWxMsgWithCygxMorningMeeting(meetingId, industryId int, industryName str
 	}
 	meetingTime := reviewInfo.MeetingTime.Format(utils.FormatDate)
 	openIdList, err := models.GetCygxUserIndustryFllowOpneid(industryId)
-	openIdArr := make([]string, len(openIdList))
-	for i, v := range openIdList {
-		openIdArr[i] = v.OpenId
+	if err != nil {
+		err = errors.New("GetCygxUserIndustryFllowOpneid, Err: " + err.Error())
+		return
+	}
+
+	listUser, e := models.GetWxUserListCompanyId(utils.JMCJ_COMPANY_ID)
+	if e != nil {
+		err = errors.New("GetWxUserListCompanyId" + e.Error())
+		return
+	}
+	var mobileArr []string
+	for _, v := range listUser {
+		mobileArr = append(mobileArr, v.Mobile)
+	}
+	openIdListJmcj, e := cygx.GetUserRecordListByMobileArr(mobileArr)
+	if e != nil {
+		err = errors.New("GetUserRecordListByMobileArr" + e.Error())
+		return
+	}
+	mapOpneiIdJmcj := make(map[string]bool)
+	for _, v := range openIdListJmcj {
+		mapOpneiIdJmcj[v.OpenId] = true
+	}
+	var openIdArr []string
+	for _, v := range openIdList {
+		if !mapOpneiIdJmcj[v.OpenId] {
+			openIdArr = append(openIdArr, v.OpenId)
+		}
 	}
 
 	//保留回撤,去掉空行

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä