瀏覽代碼

Merge branch 'master' of http://8.136.199.33:3000/hongze/hz_crm_api into crm/crm_16.0

zhangchuanxing 3 月之前
父節點
當前提交
963f619257
共有 98 個文件被更改,包括 8955 次插入896 次删除
  1. 12 0
      controllers/business_trip/business_apply.go
  2. 95 4
      controllers/company.go
  3. 89 63
      controllers/company_apply_v2.go
  4. 20 1
      controllers/company_renewal.go
  5. 1958 1
      controllers/company_seller.go
  6. 20 1
      controllers/company_service_record.go
  7. 56 13
      controllers/company_share.go
  8. 103 2
      controllers/company_user.go
  9. 1 0
      controllers/cygx/activity.go
  10. 150 82
      controllers/cygx/activity_meet.go
  11. 4 0
      controllers/cygx/apply_record.go
  12. 476 0
      controllers/cygx/gushou_time_line.go
  13. 1 1
      controllers/cygx/industrial_management.go
  14. 61 0
      controllers/cygx/industrial_subject.go
  15. 6 2
      controllers/cygx/morning_meeting_review.go
  16. 175 11
      controllers/cygx/rai_serve.go
  17. 8 0
      controllers/cygx/report_article.go
  18. 142 42
      controllers/cygx/report_selection.go
  19. 610 197
      controllers/cygx/user.go
  20. 26 2
      controllers/cygx/user_feedback.go
  21. 13 1
      controllers/help_doc/doc.go
  22. 212 56
      controllers/roadshow/calendar.go
  23. 18 9
      controllers/roadshow/calendar_meeting_user.go
  24. 1 1
      controllers/roadshow/company.go
  25. 312 7
      controllers/seal/seal_approval.go
  26. 743 53
      controllers/statistic_company_merge.go
  27. 923 26
      controllers/statistic_report.go
  28. 4 0
      models/business_trip/business_apply.go
  29. 28 25
      models/company/company.go
  30. 11 0
      models/company/company_approval.go
  31. 138 0
      models/company/company_contract.go
  32. 96 0
      models/company/company_history_remark.go
  33. 2 2
      models/company/company_no_renewed_note.go
  34. 9 2
      models/company/company_operation_record.go
  35. 46 4
      models/company/company_product.go
  36. 2 2
      models/company/company_service_record.go
  37. 5 1
      models/company/company_user.go
  38. 65 0
      models/company/wx_user_move_log.go
  39. 34 0
      models/cygx/activity.go
  40. 13 8
      models/cygx/activity_attendance_detail.go
  41. 35 0
      models/cygx/activity_signup_detail.go
  42. 45 0
      models/cygx/activity_user_template_record.go
  43. 1 0
      models/cygx/apply_record.go
  44. 1 1
      models/cygx/chart.go
  45. 1 1
      models/cygx/cygx_report_mapping.go
  46. 15 1
      models/cygx/cygx_user.go
  47. 3 23
      models/cygx/cygx_user_company.go
  48. 7 3
      models/cygx/cygx_user_record.go
  49. 152 0
      models/cygx/gushou_time_line.go
  50. 32 0
      models/cygx/gushou_time_line_history.go
  51. 1 1
      models/cygx/industrial_management.go
  52. 1 0
      models/cygx/industrial_subject.go
  53. 3 3
      models/cygx/rai_serve_bill.go
  54. 1 1
      models/cygx/rai_serve_company.go
  55. 16 2
      models/cygx/report_article.go
  56. 1 1
      models/cygx/report_selection.go
  57. 63 51
      models/cygx/report_selection_log.go
  58. 12 10
      models/cygx/report_selection_subject_history.go
  59. 33 0
      models/cygx/report_selection_third_name.go
  60. 11 1
      models/cygx/user_feedback.go
  61. 6 0
      models/db.go
  62. 9 0
      models/response/statistic_report.go
  63. 20 1
      models/roadshow/calendar.go
  64. 33 6
      models/roadshow/company.go
  65. 35 0
      models/roadshow/rs_calendar_api_log.go
  66. 7 7
      models/roadshow/rs_calendar_meeting_label_group.go
  67. 46 11
      models/roadshow/rs_calendar_meeting_user.go
  68. 31 29
      models/seal/request/seal_approval.go
  69. 65 1
      models/seal/seal.go
  70. 4 0
      models/stack_company_statistic.go
  71. 50 5
      models/statistic_report.go
  72. 11 4
      models/system/sys_admin.go
  73. 7 0
      models/system/sys_group.go
  74. 15 0
      models/wx_user.go
  75. 6 6
      models/yb/apply_record.go
  76. 162 0
      routers/commentsRouter.go
  77. 1 0
      routers/router.go
  78. 130 8
      services/company.go
  79. 4 2
      services/company_apply/company_approval.go
  80. 192 0
      services/company_contract.go
  81. 243 0
      services/company_record.go
  82. 28 1
      services/contract/contract.go
  83. 109 46
      services/cygx/acitvity.go
  84. 14 17
      services/cygx/activity_special.go
  85. 36 7
      services/cygx/activity_wx_msg.go
  86. 19 0
      services/cygx/article.go
  87. 31 0
      services/cygx/contract_allocation.go
  88. 20 0
      services/cygx/industrial_management.go
  89. 4 4
      services/cygx/mail.go
  90. 1 1
      services/cygx/resource_data.go
  91. 33 0
      services/cygx/tactics_time_line.go
  92. 2 1
      services/cygx/user_label.go
  93. 369 0
      services/cygx/yidong.go
  94. 36 4
      services/roadshow/calendar.go
  95. 13 5
      services/seal/seal.go
  96. 29 12
      services/wechat_send_category_template_msg.go
  97. 8 0
      utils/common.go
  98. 4 0
      utils/constants.go

+ 12 - 0
controllers/business_trip/business_apply.go

@@ -78,6 +78,11 @@ func (this *BusinessTrip) ApplyAdd() {
 		return
 	}
 
+	if req.Itinerary == "" {
+		br.Msg = "请填写行程说明"
+		return
+	}
+
 	startP, _ := time.ParseInLocation(utils.FormatDate, req.ArriveDate, time.Local)
 	endP, _ := time.ParseInLocation(utils.FormatDate, req.ReturnDate, time.Local)
 	nowDate, _ := time.ParseInLocation(utils.FormatDate, time.Now().Format(utils.FormatDate), time.Local)
@@ -188,6 +193,7 @@ func (this *BusinessTrip) ApplyAdd() {
 	item.ApproveName = approveItem.RealName
 	item.CreateTime = time.Now()
 	item.ModifyTime = time.Now()
+	item.Itinerary = req.Itinerary
 	applyId, err := business_trip.AddBusinessApply(item)
 	if err != nil {
 		br.Msg = "申请失败"
@@ -332,6 +338,11 @@ func (this *BusinessTrip) ApplyEdit() {
 		return
 	}
 
+	if req.Itinerary == "" {
+		br.Msg = "请填写行程说明"
+		return
+	}
+
 	startP, _ := time.ParseInLocation(utils.FormatDate, req.ArriveDate, time.Local)
 	endP, _ := time.ParseInLocation(utils.FormatDate, req.ReturnDate, time.Local)
 	nowDate, _ := time.ParseInLocation(utils.FormatDate, time.Now().Format(utils.FormatDate), time.Local)
@@ -459,6 +470,7 @@ func (this *BusinessTrip) ApplyEdit() {
 	updateParams["refuse_reason"] = ""
 	updateParams["create_time"] = time.Now()
 	updateParams["modify_time"] = time.Now()
+	updateParams["itinerary"] = req.Itinerary
 
 	err = business_trip.UpdateBusinessApply(whereParams, updateParams)
 	if err != nil {

+ 95 - 4
controllers/company.go

@@ -1702,6 +1702,14 @@ func (this *CompanyController) List() {
 			//永续客户X类试用客户出参转换
 			v.StatusStr = strings.Replace(v.StatusStr, utils.COMPANY_STATUS_FOREVER, utils.COMPANY_STATUS_X_CLASS_TRY_OUT, -1)
 
+			if !utils.InArrayByStr([]string{"正式", "试用", "永续", "X类试用"}, v.Status) { //不是这几种状态不做标红处理
+				v.IsUserMaker = 0
+			}
+
+			//解决共享客户正式筛选下是否标红的问题
+			if v.WeekViewActive == 0 && v.IsUserMaker == 1 {
+				v.WeekViewActive = 1
+			}
 			companyList := &company.CompanyListItem{
 				CompanyId:        v.CompanyId,
 				CompanyName:      v.CompanyName,
@@ -1766,6 +1774,7 @@ func (this *CompanyController) List() {
 				CloseReason:     v.CloseReason,
 				ShareSellerId:   v.ShareSellerId,
 				ShareSellerIds:  v.ShareSellerIds,
+				IsUserMaker:     v.IsUserMaker,
 			}
 			if v.ShareSellerIds != "" {
 				shareSellerIds := strings.Split(v.ShareSellerIds, ",")
@@ -2974,6 +2983,9 @@ func (this *CompanyController) Add() {
 	if productId == utils.COMPANY_PRODUCT_RAI_ID && req.Status == utils.COMPANY_STATUS_FOREVER { // 权益的永续客户给一个状态初始化的记录
 		companyProduct.InitStatus = req.Status
 	}
+
+	companyProduct.SellerIdInit = seller.AdminId
+	companyProduct.SellerNameInit = seller.RealName
 	companyProductId, err := company.AddCompanyProduct(companyProduct)
 	if err != nil {
 		br.Msg = "新增失败"
@@ -5110,6 +5122,8 @@ func (this *CompanyController) Receive() {
 		companyProduct.OpenCode = services.GenerateOpenCompanyProductCode(req.CompanyId, productId)
 		companyProduct.TodoStatus = "无任务"
 		companyProduct.TryStage = 1
+		companyProduct.SellerIdInit = seller.AdminId
+		companyProduct.SellerNameInit = seller.RealName
 		_, err = company.AddCompanyProduct(companyProduct)
 		if err != nil {
 			br.Msg = "新增失败"
@@ -5306,6 +5320,10 @@ func (this *CompanyController) MoveSeller() {
 		services.AddCompanyOperationRecord(req.CompanyId, seller.AdminId, sysUser.AdminId, productId, sysUser.AdminId, cp.CompanyName,
 			cp.ProductName, sysUser.RealName, remark, operation, "", sysUser.RealName, "", cp.Status)
 	}
+
+	{
+		services.UpdateCompanyContractSellerMove(req.CompanyId, productId) //益客户移动所属销售之后,更新所关联的销售信息
+	}
 	//变更销售员与联系人关系
 	_ = models.UpdateUserSellerRelationByCompanyId(req.CompanyId, productId, seller.AdminId, seller.RealName)
 
@@ -8237,7 +8255,8 @@ func (this *CompanyController) EditTryOutCompanyReason() {
 	endDateTime, _ = time.Parse(utils.FormatDate, endDate)
 	sub := time.Now().Sub(endDateTime)
 	renewalReason.ExpirationTimeExceeded = int(sub.Hours() / 24)
-	err = company.AddRenewalReason(&renewalReason)
+	var newId int64
+	newId, err = company.AddRenewalReason(&renewalReason)
 	if err != nil {
 		br.Msg = "新增续约情况说明操作异常!"
 		br.ErrMsg = "新增续约情况说明操作异常,err:" + err.Error()
@@ -8342,6 +8361,22 @@ func (this *CompanyController) EditTryOutCompanyReason() {
 		return
 	}
 
+	if req.ProductId == utils.COMPANY_PRODUCT_RAI_ID {
+		//权益客户新增历史备注总表
+		itemRecord := new(company.CompanyHistoryRemark)
+		itemRecord.CompanyId = req.CompanyId
+		itemRecord.Content = req.Remark
+		itemRecord.SysAdminId = sysUser.AdminId
+		itemRecord.SysAdminName = sysUser.RealName
+		itemRecord.CreateTime = time.Now().Local()
+		itemRecord.ModifyTime = time.Now().Local()
+		itemRecord.ShowTime = time.Now().Local()
+		itemRecord.ProductId = 2
+		itemRecord.TableName = "company_renewal_reason"
+		itemRecord.TableId = int(newId)
+		go services.AddCompanyHistoryRemark(itemRecord)
+	}
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "编辑成功"
@@ -8437,7 +8472,8 @@ func (this *CompanyController) AddTryOutCompanyReason() {
 	endDateTime, _ = time.Parse(utils.FormatDate, endDate)
 	sub := time.Now().Sub(endDateTime)
 	renewalReason.ExpirationTimeExceeded = int(sub.Hours() / 24)
-	err = company.AddRenewalReason(&renewalReason)
+	var newId int64
+	newId, err = company.AddRenewalReason(&renewalReason)
 	if err != nil {
 		br.Msg = "新增续约情况说明操作异常!"
 		br.ErrMsg = "新增续约情况说明操作异常,err:" + err.Error()
@@ -8523,6 +8559,22 @@ func (this *CompanyController) AddTryOutCompanyReason() {
 			companyProduct.ProductName, sysUser.RealName, remark, operation, approveContent, approveContentExtra, sysUser.RealName, "", companyProduct.Status)
 	}
 
+	if req.ProductId == utils.COMPANY_PRODUCT_RAI_ID {
+		//权益客户新增历史备注总表
+		itemRecord := new(company.CompanyHistoryRemark)
+		itemRecord.CompanyId = req.CompanyId
+		itemRecord.Content = req.Remark
+		itemRecord.SysAdminId = sysUser.AdminId
+		itemRecord.SysAdminName = sysUser.RealName
+		itemRecord.CreateTime = time.Now().Local()
+		itemRecord.ModifyTime = time.Now().Local()
+		itemRecord.ShowTime = time.Now().Local()
+		itemRecord.ProductId = 2
+		itemRecord.TableName = "company_renewal_reason"
+		itemRecord.TableId = int(newId)
+		go services.AddCompanyHistoryRemark(itemRecord)
+	}
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "编辑成功"
@@ -8678,7 +8730,9 @@ func (this *CompanyController) AddRenewalReason() {
 	endDateTime, _ = time.Parse(utils.FormatDate, endDate)
 	sub := time.Now().Sub(endDateTime)
 	renewalReason.ExpirationTimeExceeded = int(sub.Hours() / 24)
-	err = company.AddRenewalReason(&renewalReason)
+
+	var newId int64
+	newId, err = company.AddRenewalReason(&renewalReason)
 	if err != nil {
 		br.Msg = "新增续约情况说明操作异常!"
 		br.ErrMsg = "新增续约情况说明操作异常,err:" + err.Error()
@@ -8774,6 +8828,22 @@ func (this *CompanyController) AddRenewalReason() {
 		}
 	}
 
+	if req.ProductId == utils.COMPANY_PRODUCT_RAI_ID {
+		//权益客户新增历史备注总表
+		itemRecord := new(company.CompanyHistoryRemark)
+		itemRecord.CompanyId = req.CompanyId
+		itemRecord.Content = req.Remark
+		itemRecord.SysAdminId = sysUser.AdminId
+		itemRecord.SysAdminName = sysUser.RealName
+		itemRecord.CreateTime = time.Now().Local()
+		itemRecord.ModifyTime = time.Now().Local()
+		itemRecord.ShowTime = time.Now().Local()
+		itemRecord.ProductId = 2
+		itemRecord.TableName = "company_renewal_reason"
+		itemRecord.TableId = int(newId)
+		go services.AddCompanyHistoryRemark(itemRecord)
+	}
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "编辑成功"
@@ -8849,7 +8919,8 @@ func (this *CompanyController) AddRemark() {
 		SysRealName: sysUser.RealName,
 	}
 
-	err = company.AddCompanyRemark(&remark)
+	var newId int64
+	newId, err = company.AddCompanyRemark(&remark)
 
 	{
 		approveContent := req.Remark
@@ -8863,6 +8934,23 @@ func (this *CompanyController) AddRemark() {
 		br.Msg = "编辑失败"
 		br.ErrMsg = "编辑失败,Err:" + err.Error()
 	}
+
+	//如果是权益的写入历史备注表
+	if productId == utils.COMPANY_PRODUCT_RAI_ID {
+		//权益客户新增历史备注总表
+		itemRecord := new(company.CompanyHistoryRemark)
+		itemRecord.CompanyId = req.CompanyId
+		itemRecord.Content = req.Remark
+		itemRecord.SysAdminId = sysUser.AdminId
+		itemRecord.SysAdminName = sysUser.RealName
+		itemRecord.CreateTime = time.Now().Local()
+		itemRecord.ModifyTime = time.Now().Local()
+		itemRecord.ShowTime = time.Now().Local()
+		itemRecord.ProductId = 2
+		itemRecord.TableName = "company_product_remark"
+		itemRecord.TableId = int(newId)
+		go services.AddCompanyHistoryRemark(itemRecord)
+	}
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "编辑成功"
@@ -9505,6 +9593,9 @@ func (this *CompanyController) DelRemark() {
 	content := fmt.Sprintf("%s%s", "删除备注: ", item.Remark)
 	_ = services.AddCompanyOperationRecord(product.CompanyId, product.SellerId, sysUser.AdminId, product.ProductId, sysUser.AdminId, product.CompanyName, product.ProductName, sysUser.RealName, "删除备注", "del_remark", content, sysUser.RealName, "", product.Status)
 
+	if item.ProductId == utils.COMPANY_PRODUCT_RAI_ID {
+		go services.DelCompanyHistoryRemark("company_product_remark", req.RemarkId) // 删除
+	}
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"

+ 89 - 63
controllers/company_apply_v2.go

@@ -77,6 +77,49 @@ func (this *CompanyApplyController) ApplyServiceUpdate() {
 		br.ErrMsg = "客户类型为:" + req.CompanyType
 		return
 	}
+
+	//添加缓存,避免多次点击提交
+	{
+		deleteCache := true
+		cacheKey := "CACHE_COMPANY_APPLY_" + strconv.Itoa(req.CompanyId) + "_" + strconv.Itoa(productId)
+		defer func() {
+			if deleteCache {
+				utils.Rc.Delete(cacheKey)
+			}
+		}()
+		if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
+			deleteCache = false
+			br.Msg = "系统处理中,请勿重复操作"
+			br.ErrMsg = "系统处理中,请勿重复操作" + sysUser.RealName + ";data:" + string(this.Ctx.Input.RequestBody)
+			return
+		}
+	}
+
+	approveRoleTypeCode := ""
+	if productId == 1 {
+		approveRoleTypeCode = utils.ROLE_TYPE_CODE_FICC_ADMIN
+	} else {
+		approveRoleTypeCode = utils.ROLE_TYPE_CODE_RAI_ADMIN
+	}
+	companyProduct, err := company.GetCompanyProductByCompanyIdAndProductId(req.CompanyId, productId)
+	if err != nil {
+		br.Msg = "获取客户信息失败"
+		br.ErrMsg = "获取客户信息失败"
+		return
+	}
+	if companyProduct.Status != utils.COMPANY_STATUS_FORMAL && companyProduct.Status != utils.COMPANY_STATUS_TRY_OUT {
+		br.Msg = "客户状态为:" + companyProduct.Status + ";不可进行服务更新申请"
+		br.ErrMsg = "客户状态为:" + companyProduct.Status + ";不可进行服务更新申请"
+		return
+	}
+
+	//客户归属判断-当前销售/咨询组共享销售
+	if companyProduct.SellerId != sysUser.AdminId && companyProduct.ShareSellerId != sysUser.AdminId {
+		br.Msg = "客户信息异常"
+		br.ErrMsg = "客户信息异常,不是当前所属销售,客户所属销售:" + companyProduct.SellerName + ";当前销售:" + sysUser.AdminName
+		return
+	}
+
 	mapPermissionIdUpgrade := make(map[int]int, 0)
 	mapPermissionIdExpensive := make(map[int]int, 0)
 	var raicontractType string
@@ -100,7 +143,7 @@ func (this *CompanyApplyController) ApplyServiceUpdate() {
 
 		//权益的新签合同重新定义,如果合同起始时间在新签合同起始日期 1年之内的,仍为新签合同。
 		raicontractType = req.ContractType
-		if raicontractType != "新签合同" {
+		if raicontractType != "新签合同" && companyProduct.Status != utils.COMPANY_STATUS_FOREVER {
 			//startDateTime, _ := time.Parse(utils.FormatDate, req.StartDate)
 			//startDateTime = startDateTime.AddDate(-1, 0, 0)
 			totalLastYear, err := contractService.GetCompanyContractCountRaiByLastYear(req.CompanyId, req.StartDate)
@@ -124,47 +167,6 @@ func (this *CompanyApplyController) ApplyServiceUpdate() {
 		req.PermissionIds = permissionStr
 	}
 
-	//添加缓存,避免多次点击提交
-	{
-		deleteCache := true
-		cacheKey := "CACHE_COMPANY_APPLY_" + strconv.Itoa(req.CompanyId) + "_" + strconv.Itoa(productId)
-		defer func() {
-			if deleteCache {
-				utils.Rc.Delete(cacheKey)
-			}
-		}()
-		if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
-			deleteCache = false
-			br.Msg = "系统处理中,请勿重复操作"
-			br.ErrMsg = "系统处理中,请勿重复操作" + sysUser.RealName + ";data:" + string(this.Ctx.Input.RequestBody)
-			return
-		}
-	}
-
-	approveRoleTypeCode := ""
-	if productId == 1 {
-		approveRoleTypeCode = utils.ROLE_TYPE_CODE_FICC_ADMIN
-	} else {
-		approveRoleTypeCode = utils.ROLE_TYPE_CODE_RAI_ADMIN
-	}
-	companyProduct, err := company.GetCompanyProductByCompanyIdAndProductId(req.CompanyId, productId)
-	if err != nil {
-		br.Msg = "获取客户信息失败"
-		br.ErrMsg = "获取客户信息失败"
-		return
-	}
-	if companyProduct.Status != utils.COMPANY_STATUS_FORMAL && companyProduct.Status != utils.COMPANY_STATUS_TRY_OUT {
-		br.Msg = "客户状态为:" + companyProduct.Status + ";不可进行服务更新申请"
-		br.ErrMsg = "客户状态为:" + companyProduct.Status + ";不可进行服务更新申请"
-		return
-	}
-
-	//客户归属判断-当前销售/咨询组共享销售
-	if companyProduct.SellerId != sysUser.AdminId && companyProduct.ShareSellerId != sysUser.AdminId {
-		br.Msg = "客户信息异常"
-		br.ErrMsg = "客户信息异常,不是当前所属销售,客户所属销售:" + companyProduct.SellerName + ";当前销售:" + sysUser.AdminName
-		return
-	}
 	var approveUserId int
 	var approveUserRealName string
 	applyMethod := 5 //续约服务
@@ -241,6 +243,14 @@ func (this *CompanyApplyController) ApplyServiceUpdate() {
 		contract.ModifyTime = time.Now()
 		contract.PackageType = req.PackageType
 		contract.RaiPackageType = req.RaiPackageType
+		contract.SellerIdInit = companyProduct.SellerId
+		contract.SellerNameInit = companyProduct.SellerName
+		contract.ShareSellerInit = companyProduct.ShareSeller
+		contract.ShareSellerIdInit = companyProduct.ShareSellerId
+		contract.SellerIdLast = companyProduct.SellerId
+		contract.SellerNameLast = companyProduct.SellerName
+		contract.ShareSellerLast = companyProduct.ShareSeller
+		contract.ShareSellerIdLast = companyProduct.ShareSellerId
 		newId, err := company.AddCompanyContract(contract)
 		if err != nil {
 			br.Msg = "新增合同失败"
@@ -616,7 +626,7 @@ func (this *CompanyApplyController) ApplyTurnPositive() {
 		if productId == 2 {
 			//权益的新签合同重新定义,如果合同起始时间在新签合同起始日期 1年之内的,仍为新签合同。
 			raicontractType = contractType
-			if raicontractType != "新签合同" {
+			if raicontractType != "新签合同" && companyProduct.Status != utils.COMPANY_STATUS_FOREVER {
 				//startDateTime, _ := time.Parse(utils.FormatDate, req.StartDate)
 				//startDateTime = startDateTime.AddDate(-1, 0, 0)
 				totalLastYear, err := contractService.GetCompanyContractCountRaiByLastYear(req.CompanyId, req.StartDate)
@@ -693,6 +703,14 @@ func (this *CompanyApplyController) ApplyTurnPositive() {
 		contract.RaiPackageType = req.RaiPackageType
 		contract.CreateTime = time.Now()
 		contract.ModifyTime = time.Now()
+		contract.SellerIdInit = companyProduct.SellerId
+		contract.SellerNameInit = companyProduct.SellerName
+		contract.ShareSellerInit = companyProduct.ShareSeller
+		contract.ShareSellerIdInit = companyProduct.ShareSellerId
+		contract.SellerIdLast = companyProduct.SellerId
+		contract.SellerNameLast = companyProduct.SellerName
+		contract.ShareSellerLast = companyProduct.ShareSeller
+		contract.ShareSellerIdLast = companyProduct.ShareSellerId
 		newId, err := company.AddCompanyContract(contract)
 		if err != nil {
 			br.Msg = "新增合同失败"
@@ -1141,7 +1159,7 @@ func (this *CompanyApplyController) ApplyBySystemContract() {
 	if productId == 2 {
 		//权益的新签合同重新定义,如果合同起始时间在新签合同起始日期 1年之内的,仍为新签合同。
 		raicontractType = contractType
-		if raicontractType != "新签合同" {
+		if raicontractType != "新签合同" && companyProduct.Status != utils.COMPANY_STATUS_FOREVER {
 			//startDateTime := contractDetail.StartDate.AddDate(-1, 0, 0)
 			totalLastYear, err := contractService.GetCompanyContractCountRaiByLastYear(req.CompanyId, contractDetail.StartDate.Format(utils.FormatDate))
 			if err != nil {
@@ -1176,25 +1194,33 @@ func (this *CompanyApplyController) ApplyBySystemContract() {
 		//	return
 		//}
 		companyContract := &company.CompanyContract{
-			CompanyId:        req.CompanyId,
-			ProductId:        contractDetail.ProductId,
-			ContractType:     contractType,
-			RaiContractType:  raicontractType,
-			ProductName:      companyProduct.ProductName,
-			CompanyProductId: companyProduct.CompanyProductId,
-			ContractCode:     contractDetail.ContractCode,
-			StartDate:        contractDetail.StartDate.Format(utils.FormatDate),
-			EndDate:          contractDetail.EndDate.Format(utils.FormatDate),
-			Money:            contractDetail.Price,
-			PayMethod:        contractDetail.PayRemark,
-			PayChannel:       contractDetail.PayChannel,
-			ImgUrl:           contractDetail.CheckBackFileUrl,
-			Status:           0,
-			Source:           "系统合同",
-			PackageType:      packageType,
-			RaiPackageType:   raiPackageType,
-			CreateTime:       time.Now(),
-			ModifyTime:       time.Now(),
+			CompanyId:         req.CompanyId,
+			ProductId:         contractDetail.ProductId,
+			ContractType:      contractType,
+			RaiContractType:   raicontractType,
+			ProductName:       companyProduct.ProductName,
+			CompanyProductId:  companyProduct.CompanyProductId,
+			ContractCode:      contractDetail.ContractCode,
+			StartDate:         contractDetail.StartDate.Format(utils.FormatDate),
+			EndDate:           contractDetail.EndDate.Format(utils.FormatDate),
+			Money:             contractDetail.Price,
+			PayMethod:         contractDetail.PayRemark,
+			PayChannel:        contractDetail.PayChannel,
+			ImgUrl:            contractDetail.CheckBackFileUrl,
+			Status:            0,
+			Source:            "系统合同",
+			PackageType:       packageType,
+			RaiPackageType:    raiPackageType,
+			CreateTime:        time.Now(),
+			ModifyTime:        time.Now(),
+			SellerIdInit:      companyProduct.SellerId,
+			SellerNameInit:    companyProduct.SellerName,
+			ShareSellerInit:   companyProduct.ShareSeller,
+			ShareSellerIdInit: companyProduct.ShareSellerId,
+			SellerIdLast:      companyProduct.SellerId,
+			SellerNameLast:    companyProduct.SellerName,
+			ShareSellerLast:   companyProduct.ShareSeller,
+			ShareSellerIdLast: companyProduct.ShareSellerId,
 		}
 		newId, err := company.AddCompanyContract(companyContract)
 		if err != nil {

+ 20 - 1
controllers/company_renewal.go

@@ -4,6 +4,7 @@ import (
 	"encoding/json"
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/company"
+	"hongze/hz_crm_api/services"
 	"hongze/hz_crm_api/utils"
 	"time"
 )
@@ -159,12 +160,30 @@ func (this *CompanyRenewalController) CompanyNoRenewedNoteAdd() {
 	item.ProductId = productId
 	item.CreateTime = time.Now()
 	item.ModifyTime = time.Now()
-	err = company.AddCompanyNoRenewedNote(item)
+	var newId int64
+	newId, err = company.AddCompanyNoRenewedNote(item)
 	if err != nil {
 		br.Msg = "新建失败"
 		br.ErrMsg = "新建失败,Err:" + err.Error()
 		return
 	}
+
+	if productId == utils.COMPANY_PRODUCT_RAI_ID {
+		//权益客户新增历史备注总表
+		itemRecord := new(company.CompanyHistoryRemark)
+		itemRecord.CompanyId = req.CompanyId
+		itemRecord.Content = req.Content
+		itemRecord.SysAdminId = sysUser.AdminId
+		itemRecord.SysAdminName = sysUser.RealName
+		itemRecord.CreateTime = time.Now().Local()
+		itemRecord.ModifyTime = time.Now().Local()
+		itemRecord.ShowTime = time.Now().Local()
+		itemRecord.ProductId = 2
+		itemRecord.TableName = "company_no_renewed_note"
+		itemRecord.TableId = int(newId)
+		go services.AddCompanyHistoryRemark(itemRecord)
+	}
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "新建成功"

+ 1958 - 1
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
 	}
@@ -5529,3 +5529,1960 @@ func (this *CompanySellerController) RaiServeSellerList() {
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// CheckListV2
+// @Title 获取组长/组员下销售(根据部门、分组)-开票到款统计用 有特殊处理
+// @Description 获取组长/组员下销售(根据部门、分组)接口
+// @Param   AllSeller   query   bool  true       "是否获取部门所有的销售信息"
+// @Param   Status   query   int  true       "客户状态 1:流失 0:非流失"
+// @Param   AllEnabled   query   bool  true       "是否获取包含禁用的用户"
+// @Success 200 {object} company.DepartmentGroupSellersResp
+// @router /seller/check/invoice_payment/list [get]
+func (this *CompanySellerController) InvoicePaymentCheckList() {
+	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
+	}
+	roleCodeTypeStr := ``
+	productId := services.GetProductId(sysUser.RoleTypeCode)
+	switch productId {
+	case 1:
+		roleCodeTypeStr = `"` + utils.ROLE_TYPE_CODE_FICC_SELLER + `","` + utils.ROLE_TYPE_CODE_FICC_GROUP + `","` + utils.ROLE_TYPE_CODE_FICC_TEAM + `"`
+	case 2:
+		roleCodeTypeStr = `"` + utils.ROLE_TYPE_CODE_RAI_SELLER + `","` + utils.ROLE_TYPE_CODE_RAI_GROUP + `"`
+	}
+
+	// ficc管理员,不要只查销售
+	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN {
+		roleCodeTypeStr = ``
+	} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN {
+		// 权益管理员,查看所有权益的账号
+		roleCodeTypeStr = `"` + utils.ROLE_TYPE_CODE_RAI_SELLER + `","` + utils.ROLE_TYPE_CODE_RAI_GROUP + `","` + utils.ROLE_TYPE_CODE_RAI_RESEARCHR + `","` + utils.ROLE_TYPE_CODE_RAI_ADMIN + `"`
+	}
+
+	getAllSeller, _ := this.GetBool("AllSeller", false)
+	getAllUser, _ := this.GetBool("AllUser", false)
+	status, _ := this.GetInt("Status", 0)
+	//getAllEnabled, _ := this.GetBool("AllEnabled", false)
+	enabled := -1       //默认只获取正常状态的用户
+	//if getAllEnabled { //获取所有状态的用户
+	//	enabled = -1
+	//}
+	list := make([]company.DepartmentGroupSellers, 0)
+	if getAllUser {
+		departmentList, err := system.GetDepartmentList()
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取部门失败,Err:" + err.Error()
+			return
+		}
+		for _, department := range departmentList {
+			departmentGroupSellerList := make([]company.DepartmentGroupSellers, 0)
+			item := company.DepartmentGroupSellers{
+				AdminId: fmt.Sprint("department_", department.DepartmentId),
+				//AdminName string `description:"系统用户名称"`
+				RealName:     department.DepartmentName,
+				ChildrenList: departmentGroupSellerList,
+			}
+
+			groupList, err := system.GetSysGroupByDepartmentId(department.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,
+				}
+				teamList, err := system.GetSysTeamByDepartmentId(group.GroupId)
+				if err != nil {
+					br.Msg = "获取小组失败"
+					br.ErrMsg = "获取小组失败,Err:" + err.Error()
+					return
+				}
+				for _, team := range teamList {
+					teamSellerList := make([]company.DepartmentGroupSellers, 0)
+					teamItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint("team_", team.GroupId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     team.GroupName,
+						ChildrenList: teamSellerList,
+					}
+					sellerList, err := system.GetTeamSysUserList(team.GroupId, enabled)
+					if err != nil {
+						br.Msg = "获取销售失败"
+						br.ErrMsg = "获取销售失败,Err:" + err.Error()
+						return
+					}
+					for _, seller := range sellerList {
+						sellerItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint(seller.AdminId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     seller.RealName,
+							Authority:    seller.Authority,
+							RoleTypeCode: seller.RoleTypeCode,
+						}
+						//fmt.Println("seller.RealName:", seller.RealName)
+						teamSellerList = append(teamSellerList, sellerItem)
+					}
+					teamSellerList = sortDepartmentGroupSellers(teamSellerList)
+					teamItem.ChildrenList = teamSellerList
+					if len(teamSellerList) > 0 {
+						groupSellerList = append(groupSellerList, teamItem)
+					}
+				}
+				//分组为0的销售(直属分组)
+				groupTeamSellerList, err := system.GetGrooupsysUserList(group.GroupId, roleCodeTypeStr, enabled)
+				if err != nil {
+					br.Msg = "获取销售失败"
+					br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					return
+				}
+				if len(groupTeamSellerList) > 0 {
+					tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+					for _, seller := range groupTeamSellerList {
+						sellerItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint(seller.AdminId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     seller.RealName,
+							Authority:    seller.Authority,
+							RoleTypeCode: seller.RoleTypeCode,
+						}
+						tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+					}
+					//排个序
+					tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+					groupSellerList = append(groupSellerList, tmpDepartmentGroupSellersList...)
+				}
+
+				//groupItem.ChildrenList = groupSellerList
+				//if len(groupSellerList) > 0 {
+				//	list = append(list, item)
+				//}
+
+				//sellerList, err := system.GetGroupSysUserList(group.DepartmentId)
+				//if err != nil {
+				//	br.Msg = "获取销售失败"
+				//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				//	return
+				//}
+				//for _, seller := range sellerList {
+				//	sellerItem := company.DepartmentGroupSellers{
+				//		AdminId: fmt.Sprint(seller.AdminId),
+				//		//AdminName string `description:"系统用户名称"`
+				//		RealName:     seller.RealName,
+				//		Authority:    seller.Authority,
+				//		RoleTypeCode: seller.RoleTypeCode,
+				//	}
+				//	groupSellerList = append(groupSellerList, sellerItem)
+				//}
+				//groupSellerList = sortDepartmentGroupSellers(groupSellerList)
+				groupItem.ChildrenList = groupSellerList
+				if len(groupSellerList) > 0 {
+					departmentGroupSellerList = append(departmentGroupSellerList, groupItem)
+				}
+			}
+
+			//分组为0的销售(直属部门)
+			departmentSellerList, err := system.GetDepartmentGroupSysUserList(department.DepartmentId, 0, roleCodeTypeStr)
+			if err != nil {
+				br.Msg = "获取销售失败"
+				br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				return
+			}
+			if len(departmentSellerList) > 0 {
+				tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+				for _, seller := range departmentSellerList {
+					sellerItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint(seller.AdminId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     seller.RealName,
+						Authority:    seller.Authority,
+						RoleTypeCode: seller.RoleTypeCode,
+					}
+					tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+				}
+				//排个序
+				tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+				departmentGroupSellerList = append(departmentGroupSellerList, tmpDepartmentGroupSellersList...)
+			}
+
+			item.ChildrenList = departmentGroupSellerList
+			if len(departmentGroupSellerList) > 0 {
+				list = append(list, item)
+			}
+		}
+
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		br.Data = company.DepartmentGroupSellersResp{
+			List: list,
+		}
+
+		return
+	}
+	if getAllSeller == false {
+		//超管看部门、小组、销售
+		if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
+			departmentList, err := system.GetDepartmentList()
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取部门失败,Err:" + err.Error()
+				return
+			}
+			for _, department := range departmentList {
+				departmentGroupSellerList := make([]company.DepartmentGroupSellers, 0)
+				item := company.DepartmentGroupSellers{
+					AdminId: fmt.Sprint("department_", department.DepartmentId),
+					//AdminName string `description:"系统用户名称"`
+					RealName:     department.DepartmentName,
+					ChildrenList: departmentGroupSellerList,
+				}
+
+				groupList, err := system.GetSysGroupByDepartmentId(department.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,
+					}
+					teamList, err := system.GetSysTeamByDepartmentId(group.GroupId)
+					if err != nil {
+						br.Msg = "获取小组失败"
+						br.ErrMsg = "获取小组失败,Err:" + err.Error()
+						return
+					}
+					for _, team := range teamList {
+						teamSellerList := make([]company.DepartmentGroupSellers, 0)
+						teamItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint("team_", team.GroupId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     team.GroupName,
+							ChildrenList: teamSellerList,
+						}
+						sellerList, err := system.GetTeamSysUserList(team.GroupId, enabled)
+						if err != nil {
+							br.Msg = "获取销售失败"
+							br.ErrMsg = "获取销售失败,Err:" + err.Error()
+							return
+						}
+						for _, seller := range sellerList {
+							sellerItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint(seller.AdminId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     seller.RealName,
+								Authority:    seller.Authority,
+								RoleTypeCode: seller.RoleTypeCode,
+							}
+							//fmt.Println("seller.RealName:", seller.RealName)
+							teamSellerList = append(teamSellerList, sellerItem)
+						}
+						teamSellerList = sortDepartmentGroupSellers(teamSellerList)
+						teamItem.ChildrenList = teamSellerList
+						if len(teamSellerList) > 0 {
+							groupSellerList = append(groupSellerList, teamItem)
+						}
+					}
+					//分组为0的销售(直属分组)
+					groupTeamSellerList, err := system.GetGrooupsysUserList(group.GroupId, roleCodeTypeStr, enabled)
+					if err != nil {
+						br.Msg = "获取销售失败"
+						br.ErrMsg = "获取销售失败,Err:" + err.Error()
+						return
+					}
+					if len(groupTeamSellerList) > 0 {
+						tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+						for _, seller := range groupTeamSellerList {
+							sellerItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint(seller.AdminId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     seller.RealName,
+								Authority:    seller.Authority,
+								RoleTypeCode: seller.RoleTypeCode,
+							}
+							tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+						}
+						//排个序
+						tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+						groupSellerList = append(groupSellerList, tmpDepartmentGroupSellersList...)
+					}
+
+					//groupItem.ChildrenList = groupSellerList
+					//if len(groupSellerList) > 0 {
+					//	list = append(list, item)
+					//}
+
+					//sellerList, err := system.GetGroupSysUserList(group.DepartmentId)
+					//if err != nil {
+					//	br.Msg = "获取销售失败"
+					//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					//	return
+					//}
+					//for _, seller := range sellerList {
+					//	sellerItem := company.DepartmentGroupSellers{
+					//		AdminId: fmt.Sprint(seller.AdminId),
+					//		//AdminName string `description:"系统用户名称"`
+					//		RealName:     seller.RealName,
+					//		Authority:    seller.Authority,
+					//		RoleTypeCode: seller.RoleTypeCode,
+					//	}
+					//	groupSellerList = append(groupSellerList, sellerItem)
+					//}
+					//groupSellerList = sortDepartmentGroupSellers(groupSellerList)
+					groupItem.ChildrenList = groupSellerList
+					if len(groupSellerList) > 0 {
+						departmentGroupSellerList = append(departmentGroupSellerList, groupItem)
+					}
+				}
+
+				//分组为0的销售(直属部门)
+				departmentSellerList, err := system.GetDepartmentGroupSysUserList(department.DepartmentId, 0, roleCodeTypeStr)
+				if err != nil {
+					br.Msg = "获取销售失败"
+					br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					return
+				}
+				if len(departmentSellerList) > 0 {
+					tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+					for _, seller := range departmentSellerList {
+						sellerItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint(seller.AdminId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     seller.RealName,
+							Authority:    seller.Authority,
+							RoleTypeCode: seller.RoleTypeCode,
+						}
+						tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+					}
+					//排个序
+					tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+					departmentGroupSellerList = append(departmentGroupSellerList, tmpDepartmentGroupSellersList...)
+				}
+
+				item.ChildrenList = departmentGroupSellerList
+				if len(departmentGroupSellerList) > 0 {
+					list = append(list, item)
+				}
+			}
+		} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_TEAM || sysUser.Authority == 4 {
+			//销售组长看销售
+			if status == 0 {
+				directorId := sysUser.GroupId
+				fmt.Println("directorId:", directorId)
+				groupList, err := system.GetSysGroupByDirectorId(directorId)
+				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,
+					}
+					teamList, err := system.GetSysTeamByDepartmentId(group.GroupId)
+					if err != nil {
+						br.Msg = "获取小组失败"
+						br.ErrMsg = "获取小组失败,Err:" + err.Error()
+						return
+					}
+					for _, team := range teamList {
+						teamSellerList := make([]company.DepartmentGroupSellers, 0)
+						teamItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint("team_", team.GroupId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     team.GroupName,
+							ChildrenList: teamSellerList,
+						}
+						sellerList, err := system.GetTeamSysUserList(team.GroupId, enabled)
+						if err != nil {
+							br.Msg = "获取销售失败"
+							br.ErrMsg = "获取销售失败,Err:" + err.Error()
+							return
+						}
+						for _, seller := range sellerList {
+							sellerItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint(seller.AdminId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     seller.RealName,
+								Authority:    seller.Authority,
+								RoleTypeCode: seller.RoleTypeCode,
+							}
+							//fmt.Println("seller.RealName:", seller.RealName)
+							teamSellerList = append(teamSellerList, sellerItem)
+						}
+						teamSellerList = sortDepartmentGroupSellers(teamSellerList)
+						teamItem.ChildrenList = teamSellerList
+						if len(teamSellerList) > 0 {
+							groupSellerList = append(groupSellerList, teamItem)
+						}
+					}
+					//分组为0的销售(直属分组)
+					groupTeamSellerList, err := system.GetGrooupsysUserList(group.GroupId, roleCodeTypeStr, enabled)
+					if err != nil {
+						br.Msg = "获取销售失败"
+						br.ErrMsg = "获取销售失败,Err:" + err.Error()
+						return
+					}
+					if len(groupTeamSellerList) > 0 {
+						tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+						for _, seller := range groupTeamSellerList {
+							sellerItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint(seller.AdminId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     seller.RealName,
+								Authority:    seller.Authority,
+								RoleTypeCode: seller.RoleTypeCode,
+							}
+							tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+						}
+						//排个序
+						tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+						groupSellerList = append(groupSellerList, tmpDepartmentGroupSellersList...)
+					}
+
+					groupItem.ChildrenList = groupSellerList
+					if len(groupSellerList) > 0 {
+						list = append(list, groupItem)
+					}
+				}
+			} else {
+				departmentStr := `1,2`
+				departmentList, err := system.GetDepartmentListByIds(departmentStr)
+				if err != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取部门失败,Err:" + err.Error()
+					return
+				}
+				for _, department := range departmentList {
+					departmentGroupSellerList := make([]company.DepartmentGroupSellers, 0)
+					item := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint("department_", department.DepartmentId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     department.DepartmentName,
+						ChildrenList: departmentGroupSellerList,
+					}
+
+					groupList, err := system.GetSysGroupByDepartmentId(department.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,
+						}
+						teamList, err := system.GetSysTeamByDepartmentId(group.GroupId)
+						if err != nil {
+							br.Msg = "获取小组失败"
+							br.ErrMsg = "获取小组失败,Err:" + err.Error()
+							return
+						}
+						for _, team := range teamList {
+							teamSellerList := make([]company.DepartmentGroupSellers, 0)
+							teamItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint("team_", team.GroupId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     team.GroupName,
+								ChildrenList: teamSellerList,
+							}
+							sellerList, err := system.GetTeamSysUserList(team.GroupId, enabled)
+							if err != nil {
+								br.Msg = "获取销售失败"
+								br.ErrMsg = "获取销售失败,Err:" + err.Error()
+								return
+							}
+							for _, seller := range sellerList {
+								sellerItem := company.DepartmentGroupSellers{
+									AdminId: fmt.Sprint(seller.AdminId),
+									//AdminName string `description:"系统用户名称"`
+									RealName:     seller.RealName,
+									Authority:    seller.Authority,
+									RoleTypeCode: seller.RoleTypeCode,
+								}
+								//fmt.Println("seller.RealName:", seller.RealName)
+								teamSellerList = append(teamSellerList, sellerItem)
+							}
+							teamSellerList = sortDepartmentGroupSellers(teamSellerList)
+							teamItem.ChildrenList = teamSellerList
+							if len(teamSellerList) > 0 {
+								groupSellerList = append(groupSellerList, teamItem)
+							}
+						}
+						//分组为0的人,不光是销售(直属分组)
+						groupTeamSellerList, err := system.GetGroupSysUserList(group.GroupId)
+						if err != nil {
+							br.Msg = "获取销售失败"
+							br.ErrMsg = "获取销售失败,Err:" + err.Error()
+							return
+						}
+						if len(groupTeamSellerList) > 0 {
+							tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+							for _, seller := range groupTeamSellerList {
+								sellerItem := company.DepartmentGroupSellers{
+									AdminId: fmt.Sprint(seller.AdminId),
+									//AdminName string `description:"系统用户名称"`
+									RealName:     seller.RealName,
+									Authority:    seller.Authority,
+									RoleTypeCode: seller.RoleTypeCode,
+								}
+								tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+							}
+							//排个序
+							tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+							groupSellerList = append(groupSellerList, tmpDepartmentGroupSellersList...)
+						}
+
+						//groupItem.ChildrenList = groupSellerList
+						//if len(groupSellerList) > 0 {
+						//	list = append(list, item)
+						//}
+
+						//sellerList, err := system.GetGroupSysUserList(group.DepartmentId)
+						//if err != nil {
+						//	br.Msg = "获取销售失败"
+						//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+						//	return
+						//}
+						//for _, seller := range sellerList {
+						//	sellerItem := company.DepartmentGroupSellers{
+						//		AdminId: fmt.Sprint(seller.AdminId),
+						//		//AdminName string `description:"系统用户名称"`
+						//		RealName:     seller.RealName,
+						//		Authority:    seller.Authority,
+						//		RoleTypeCode: seller.RoleTypeCode,
+						//	}
+						//	groupSellerList = append(groupSellerList, sellerItem)
+						//}
+						//groupSellerList = sortDepartmentGroupSellers(groupSellerList)
+						groupItem.ChildrenList = groupSellerList
+						if len(groupSellerList) > 0 {
+							departmentGroupSellerList = append(departmentGroupSellerList, groupItem)
+						}
+					}
+
+					//分组为0的人,不光是销售(直属部门)
+					departmentSellerList, err := system.GetDepartmentGroupSysUserList(department.DepartmentId, 0, "")
+					if err != nil {
+						br.Msg = "获取销售失败"
+						br.ErrMsg = "获取销售失败,Err:" + err.Error()
+						return
+					}
+					if len(departmentSellerList) > 0 {
+						tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+						for _, seller := range departmentSellerList {
+							sellerItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint(seller.AdminId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     seller.RealName,
+								Authority:    seller.Authority,
+								RoleTypeCode: seller.RoleTypeCode,
+							}
+							tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+						}
+						//排个序
+						tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+						departmentGroupSellerList = append(departmentGroupSellerList, tmpDepartmentGroupSellersList...)
+					}
+
+					item.ChildrenList = departmentGroupSellerList
+					if len(departmentGroupSellerList) > 0 {
+						list = append(list, item)
+					}
+				}
+			}
+		} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_COMPLIANCE || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FINANCE || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN { //合规或财务或ficc管理员
+			departmentStr := `2,5,7` //合规
+			switch sysUser.RoleTypeCode {
+			case utils.ROLE_TYPE_CODE_FINANCE: //财务
+				departmentStr = `2,5,8`
+			case utils.ROLE_TYPE_CODE_FICC_ADMIN: //ficc管理员
+				departmentStr = utils.GetFiccAdminDepartmentIds()
+			}
+			departmentList, err := system.GetDepartmentListByIds(departmentStr)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取部门失败,Err:" + err.Error()
+				return
+			}
+			for _, department := range departmentList {
+				fmt.Println(department)
+				departmentGroupSellerList := make([]company.DepartmentGroupSellers, 0)
+				item := company.DepartmentGroupSellers{
+					AdminId: fmt.Sprint("department_", department.DepartmentId),
+					//AdminName string `description:"系统用户名称"`
+					RealName:     department.DepartmentName,
+					ChildrenList: departmentGroupSellerList,
+				}
+
+				groupList, err := system.GetSysGroupByDepartmentId(department.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,
+					}
+					teamList, err := system.GetSysTeamByDepartmentId(group.GroupId)
+					if err != nil {
+						br.Msg = "获取小组失败"
+						br.ErrMsg = "获取小组失败,Err:" + err.Error()
+						return
+					}
+					for _, team := range teamList {
+						teamSellerList := make([]company.DepartmentGroupSellers, 0)
+						teamItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint("team_", team.GroupId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     team.GroupName,
+							ChildrenList: teamSellerList,
+						}
+						sellerList, err := system.GetTeamSysUserList(team.GroupId, enabled)
+						if err != nil {
+							br.Msg = "获取销售失败"
+							br.ErrMsg = "获取销售失败,Err:" + err.Error()
+							return
+						}
+						for _, seller := range sellerList {
+							sellerItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint(seller.AdminId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     seller.RealName,
+								Authority:    seller.Authority,
+								RoleTypeCode: seller.RoleTypeCode,
+							}
+							//fmt.Println("seller.RealName:", seller.RealName)
+							teamSellerList = append(teamSellerList, sellerItem)
+						}
+						teamSellerList = sortDepartmentGroupSellers(teamSellerList)
+						teamItem.ChildrenList = teamSellerList
+						if len(teamSellerList) > 0 {
+							groupSellerList = append(groupSellerList, teamItem)
+						}
+					}
+					//分组为0的销售(直属分组)
+					groupTeamSellerList, err := system.GetGrooupsysUserList(group.GroupId, roleCodeTypeStr, enabled)
+					if err != nil {
+						br.Msg = "获取销售失败"
+						br.ErrMsg = "获取销售失败,Err:" + err.Error()
+						return
+					}
+					if len(groupTeamSellerList) > 0 {
+						tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+						for _, seller := range groupTeamSellerList {
+							sellerItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint(seller.AdminId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     seller.RealName,
+								Authority:    seller.Authority,
+								RoleTypeCode: seller.RoleTypeCode,
+							}
+							tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+						}
+						//排个序
+						tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+						groupSellerList = append(groupSellerList, tmpDepartmentGroupSellersList...)
+					}
+
+					//groupItem.ChildrenList = groupSellerList
+					//if len(groupSellerList) > 0 {
+					//	list = append(list, item)
+					//}
+
+					//sellerList, err := system.GetGroupSysUserList(group.DepartmentId)
+					//if err != nil {
+					//	br.Msg = "获取销售失败"
+					//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					//	return
+					//}
+					//for _, seller := range sellerList {
+					//	sellerItem := company.DepartmentGroupSellers{
+					//		AdminId: fmt.Sprint(seller.AdminId),
+					//		//AdminName string `description:"系统用户名称"`
+					//		RealName:     seller.RealName,
+					//		Authority:    seller.Authority,
+					//		RoleTypeCode: seller.RoleTypeCode,
+					//	}
+					//	groupSellerList = append(groupSellerList, sellerItem)
+					//}
+					//groupSellerList = sortDepartmentGroupSellers(groupSellerList)
+					groupItem.ChildrenList = groupSellerList
+					if len(groupSellerList) > 0 {
+						departmentGroupSellerList = append(departmentGroupSellerList, groupItem)
+					}
+				}
+
+				//分组为0的销售(直属部门)
+				departmentSellerList, err := system.GetDepartmentGroupSysUserList(department.DepartmentId, 0, roleCodeTypeStr)
+				if err != nil {
+					br.Msg = "获取销售失败"
+					br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					return
+				}
+				if len(departmentSellerList) > 0 {
+					tmpDepartmentGroupSellerList := make([]company.DepartmentGroupSellers, 0)
+					for _, seller := range departmentSellerList {
+						sellerItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint(seller.AdminId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     seller.RealName,
+							Authority:    seller.Authority,
+							RoleTypeCode: seller.RoleTypeCode,
+						}
+						tmpDepartmentGroupSellerList = append(tmpDepartmentGroupSellerList, sellerItem)
+					}
+					//排个序
+					tmpDepartmentGroupSellerList = sortDepartmentGroupSellers(tmpDepartmentGroupSellerList)
+					departmentGroupSellerList = append(departmentGroupSellerList, tmpDepartmentGroupSellerList...)
+				}
+
+				item.ChildrenList = departmentGroupSellerList
+				if len(departmentGroupSellerList) > 0 {
+					list = append(list, item)
+				}
+			}
+		} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN || sysUser.Authority == 1 {
+			//部门管理员看小组、销售
+			departmentId := sysUser.DepartmentId
+			switch sysUser.RoleTypeCode {
+			case utils.ROLE_TYPE_CODE_RAI_ADMIN: //权益管理员
+				departmentId = 5
+			case utils.ROLE_TYPE_CODE_FICC_ADMIN: //ficc管理员
+				departmentId = 2
+			}
+			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,
+				}
+				teamList, err := system.GetSysTeamByDepartmentId(group.GroupId)
+				if err != nil {
+					br.Msg = "获取小组失败"
+					br.ErrMsg = "获取小组失败,Err:" + err.Error()
+					return
+				}
+				for _, team := range teamList {
+					teamSellerList := make([]company.DepartmentGroupSellers, 0)
+					teamItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint("team_", team.GroupId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     team.GroupName,
+						ChildrenList: teamSellerList,
+					}
+					sellerList, err := system.GetTeamSysUserList(team.GroupId, enabled)
+					if err != nil {
+						br.Msg = "获取销售失败"
+						br.ErrMsg = "获取销售失败,Err:" + err.Error()
+						return
+					}
+					for _, seller := range sellerList {
+						sellerItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint(seller.AdminId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     seller.RealName,
+							Authority:    seller.Authority,
+							RoleTypeCode: seller.RoleTypeCode,
+						}
+						//fmt.Println("seller.RealName:", seller.RealName)
+						teamSellerList = append(teamSellerList, sellerItem)
+					}
+					teamSellerList = sortDepartmentGroupSellers(teamSellerList)
+					teamItem.ChildrenList = teamSellerList
+					if len(teamSellerList) > 0 {
+						groupSellerList = append(groupSellerList, teamItem)
+					}
+				}
+				//分组为0的销售(直属分组)
+				groupTeamSellerList, err := system.GetGrooupsysUserList(group.GroupId, roleCodeTypeStr, enabled)
+				if err != nil {
+					br.Msg = "获取销售失败"
+					br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					return
+				}
+				if len(groupTeamSellerList) > 0 {
+					tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+					for _, seller := range groupTeamSellerList {
+						sellerItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint(seller.AdminId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     seller.RealName,
+							Authority:    seller.Authority,
+							RoleTypeCode: seller.RoleTypeCode,
+						}
+						tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+					}
+					//排个序
+					tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+					groupSellerList = append(groupSellerList, tmpDepartmentGroupSellersList...)
+				}
+
+				//groupItem.ChildrenList = groupSellerList
+				//if len(groupSellerList) > 0 {
+				//	list = append(list, item)
+				//}
+
+				//sellerList, err := system.GetGroupSysUserList(group.DepartmentId)
+				//if err != nil {
+				//	br.Msg = "获取销售失败"
+				//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				//	return
+				//}
+				//for _, seller := range sellerList {
+				//	sellerItem := company.DepartmentGroupSellers{
+				//		AdminId: fmt.Sprint(seller.AdminId),
+				//		//AdminName string `description:"系统用户名称"`
+				//		RealName:     seller.RealName,
+				//		Authority:    seller.Authority,
+				//		RoleTypeCode: seller.RoleTypeCode,
+				//	}
+				//	groupSellerList = append(groupSellerList, sellerItem)
+				//}
+				//groupSellerList = sortDepartmentGroupSellers(groupSellerList)
+				groupItem.ChildrenList = groupSellerList
+				if len(groupSellerList) > 0 {
+					list = append(list, groupItem)
+				}
+			}
+
+			//分组为0的销售(直属部门)
+			departmentSellerList, err := system.GetDepartmentGroupSysUserList(departmentId, 0, roleCodeTypeStr)
+			if err != nil {
+				br.Msg = "获取销售失败"
+				br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				return
+			}
+			if len(departmentSellerList) > 0 {
+				tmpDepartmentGroupSeller := make([]company.DepartmentGroupSellers, 0)
+				for _, seller := range departmentSellerList {
+					sellerItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint(seller.AdminId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     seller.RealName,
+						Authority:    seller.Authority,
+						RoleTypeCode: seller.RoleTypeCode,
+					}
+					tmpDepartmentGroupSeller = append(tmpDepartmentGroupSeller, sellerItem)
+				}
+				tmpDepartmentGroupSeller = sortDepartmentGroupSellers(tmpDepartmentGroupSeller)
+				list = append(list, tmpDepartmentGroupSeller...)
+			}
+		} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP || (sysUser.Authority == 2 && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_FICC_GROUP) {
+			// 权益组长看小组
+			if status == 0 {
+				sellerList, err := system.GetTeamSysUserList(sysUser.GroupId, enabled)
+				if err != nil {
+					br.Msg = "获取销售失败"
+					br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					return
+				}
+				for _, seller := range sellerList {
+					sellerItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint(seller.AdminId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     seller.RealName,
+						Authority:    seller.Authority,
+						RoleTypeCode: seller.RoleTypeCode,
+					}
+					//fmt.Println("seller.RealName:", seller.RealName)
+					list = append(list, sellerItem)
+				}
+				list = sortDepartmentGroupSellers(list)
+
+				//正常来说没有所有人都应该在某个小组下,要不就是小组名为 无 的小组
+				//分组为0的销售(直属分组)
+				//groupTeamSellerList, err := system.GetGrooupsysUserList(sysUser.GroupId, 0, roleCodeTypeStr)
+				//if err != nil {
+				//	br.Msg = "获取销售失败"
+				//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				//	return
+				//}
+				//if len(groupTeamSellerList) > 0 {
+				//	tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+				//	for _, seller := range groupTeamSellerList {
+				//		sellerItem := company.DepartmentGroupSellers{
+				//			AdminId: fmt.Sprint(seller.AdminId),
+				//			//AdminName string `description:"系统用户名称"`
+				//			RealName:     seller.RealName,
+				//			Authority:    seller.Authority,
+				//			RoleTypeCode: seller.RoleTypeCode,
+				//		}
+				//		tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+				//	}
+				//	//排个序
+				//	tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+				//	list = append(list, tmpDepartmentGroupSellersList...)
+				//}
+				//sellerList, err := system.GetDepartmentGroupSysUserList(sysUser.DepartmentId, sysUser.GroupId, roleCodeTypeStr)
+				//if err != nil {
+				//	br.Msg = "获取销售失败"
+				//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				//	return
+				//}
+				//for _, seller := range sellerList {
+				//	sellerItem := company.DepartmentGroupSellers{
+				//		AdminId: fmt.Sprint(seller.AdminId),
+				//		//AdminName string `description:"系统用户名称"`
+				//		RealName:     seller.RealName,
+				//		Authority:    seller.Authority,
+				//		RoleTypeCode: seller.RoleTypeCode,
+				//	}
+				//	list = append(list, sellerItem)
+				//	list = sortDepartmentGroupSellers(list)
+				//}
+			} else {
+				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,
+					}
+					teamList, err := system.GetSysTeamByDepartmentId(group.GroupId)
+					if err != nil {
+						br.Msg = "获取小组失败"
+						br.ErrMsg = "获取小组失败,Err:" + err.Error()
+						return
+					}
+					for _, team := range teamList {
+						teamSellerList := make([]company.DepartmentGroupSellers, 0)
+						teamItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint("team_", team.GroupId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     team.GroupName,
+							ChildrenList: teamSellerList,
+						}
+						sellerList, err := system.GetTeamSysUserList(team.GroupId, enabled)
+						if err != nil {
+							br.Msg = "获取销售失败"
+							br.ErrMsg = "获取销售失败,Err:" + err.Error()
+							return
+						}
+						for _, seller := range sellerList {
+							sellerItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint(seller.AdminId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     seller.RealName,
+								Authority:    seller.Authority,
+								RoleTypeCode: seller.RoleTypeCode,
+							}
+							//fmt.Println("seller.RealName:", seller.RealName)
+							teamSellerList = append(teamSellerList, sellerItem)
+						}
+						teamSellerList = sortDepartmentGroupSellers(teamSellerList)
+						teamItem.ChildrenList = teamSellerList
+						if len(teamSellerList) > 0 {
+							groupSellerList = append(groupSellerList, teamItem)
+						}
+					}
+					//分组为0的销售(直属分组)
+					groupTeamSellerList, err := system.GetGrooupsysUserList(group.GroupId, roleCodeTypeStr, enabled)
+					if err != nil {
+						br.Msg = "获取销售失败"
+						br.ErrMsg = "获取销售失败,Err:" + err.Error()
+						return
+					}
+					if len(groupTeamSellerList) > 0 {
+						tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+						for _, seller := range groupTeamSellerList {
+							sellerItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint(seller.AdminId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     seller.RealName,
+								Authority:    seller.Authority,
+								RoleTypeCode: seller.RoleTypeCode,
+							}
+							tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+						}
+						//排个序
+						tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+						groupSellerList = append(groupSellerList, tmpDepartmentGroupSellersList...)
+					}
+
+					//groupItem.ChildrenList = groupSellerList
+					//if len(groupSellerList) > 0 {
+					//	list = append(list, item)
+					//}
+
+					//sellerList, err := system.GetGroupSysUserList(group.DepartmentId)
+					//if err != nil {
+					//	br.Msg = "获取销售失败"
+					//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					//	return
+					//}
+					//for _, seller := range sellerList {
+					//	sellerItem := company.DepartmentGroupSellers{
+					//		AdminId: fmt.Sprint(seller.AdminId),
+					//		//AdminName string `description:"系统用户名称"`
+					//		RealName:     seller.RealName,
+					//		Authority:    seller.Authority,
+					//		RoleTypeCode: seller.RoleTypeCode,
+					//	}
+					//	groupSellerList = append(groupSellerList, sellerItem)
+					//}
+					//groupSellerList = sortDepartmentGroupSellers(groupSellerList)
+					groupItem.ChildrenList = groupSellerList
+					if len(groupSellerList) > 0 {
+						list = append(list, groupItem)
+					}
+				}
+
+				//分组为0的销售(直属部门)
+				departmentSellerList, err := system.GetDepartmentGroupSysUserList(departmentId, 0, roleCodeTypeStr)
+				if err != nil {
+					br.Msg = "获取销售失败"
+					br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					return
+				}
+				if len(departmentSellerList) > 0 {
+					tmpDepartmentGroupSeller := make([]company.DepartmentGroupSellers, 0)
+					for _, seller := range departmentSellerList {
+						sellerItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint(seller.AdminId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     seller.RealName,
+							Authority:    seller.Authority,
+							RoleTypeCode: seller.RoleTypeCode,
+						}
+						tmpDepartmentGroupSeller = append(tmpDepartmentGroupSeller, sellerItem)
+					}
+					tmpDepartmentGroupSeller = sortDepartmentGroupSellers(tmpDepartmentGroupSeller)
+					list = append(list, tmpDepartmentGroupSeller...)
+				}
+			}
+
+		} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_GROUP || sysUser.Authority == 2 {
+			// 销售主管看小组
+			if status == 0 {
+				pid, err := company.GetParentIdFromGroup(sysUser.GroupId)
+				if err != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "查询父级id异常" + err.Error()
+					return
+				}
+				var realGroupId int
+				if pid != nil && *pid > 0 {
+					//主管角色放在了三级分组下
+					realGroupId = *pid
+				} else {
+					//主管角色放在了二级分组下
+					realGroupId = sysUser.GroupId
+				}
+				groupList, err := system.GetSysGroupByGroupId(realGroupId)
+				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,
+					//}
+					teamList, err := system.GetSysTeamByDepartmentId(group.GroupId)
+					if err != nil {
+						br.Msg = "获取小组失败"
+						br.ErrMsg = "获取小组失败,Err:" + err.Error()
+						return
+					}
+					for _, team := range teamList {
+						teamSellerList := make([]company.DepartmentGroupSellers, 0)
+						teamItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint("team_", team.GroupId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     team.GroupName,
+							ChildrenList: teamSellerList,
+						}
+						sellerList, err := system.GetTeamSysUserList(team.GroupId, enabled)
+						if err != nil {
+							br.Msg = "获取销售失败"
+							br.ErrMsg = "获取销售失败,Err:" + err.Error()
+							return
+						}
+						for _, seller := range sellerList {
+							sellerItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint(seller.AdminId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     seller.RealName,
+								Authority:    seller.Authority,
+								RoleTypeCode: seller.RoleTypeCode,
+							}
+							//fmt.Println("seller.RealName:", seller.RealName)
+							teamSellerList = append(teamSellerList, sellerItem)
+						}
+						teamSellerList = sortDepartmentGroupSellers(teamSellerList)
+						teamItem.ChildrenList = teamSellerList
+						if len(teamSellerList) > 0 {
+							groupSellerList = append(groupSellerList, teamItem)
+						}
+					}
+					//分组为0的销售(直属分组)
+					groupTeamSellerList, err := system.GetGrooupsysUserList(realGroupId, roleCodeTypeStr, enabled)
+					if err != nil {
+						br.Msg = "获取销售失败"
+						br.ErrMsg = "获取销售失败,Err:" + err.Error()
+						return
+					}
+					if len(groupTeamSellerList) > 0 {
+						tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+						for _, seller := range groupTeamSellerList {
+							sellerItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint(seller.AdminId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     seller.RealName,
+								Authority:    seller.Authority,
+								RoleTypeCode: seller.RoleTypeCode,
+							}
+							tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+						}
+						//排个序
+						tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+						groupSellerList = append(groupSellerList, tmpDepartmentGroupSellersList...)
+					}
+					list = groupSellerList
+					//groupItem.ChildrenList = groupSellerList
+					//if len(groupSellerList) > 0 {
+					//	list = append(list, item)
+					//}
+
+					//sellerList, err := system.GetGroupSysUserList(group.DepartmentId)
+					//if err != nil {
+					//	br.Msg = "获取销售失败"
+					//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					//	return
+					//}
+					//for _, seller := range sellerList {
+					//	sellerItem := company.DepartmentGroupSellers{
+					//		AdminId: fmt.Sprint(seller.AdminId),
+					//		//AdminName string `description:"系统用户名称"`
+					//		RealName:     seller.RealName,
+					//		Authority:    seller.Authority,
+					//		RoleTypeCode: seller.RoleTypeCode,
+					//	}
+					//	groupSellerList = append(groupSellerList, sellerItem)
+					//}
+					//groupSellerList = sortDepartmentGroupSellers(groupSellerList)
+
+					//groupItem.ChildrenList = groupSellerList
+					//if len(groupSellerList) > 0 {
+					//	list = append(list, groupItem)
+					//}
+
+				}
+
+				//分组为0的销售(直属二级分组)
+				//departmentSellerList, err := system.GetDepartmentGroupSysUserList(2, realGroupId, roleCodeTypeStr)
+				//if err != nil {
+				//	br.Msg = "获取销售失败"
+				//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				//	return
+				//}
+				//if len(departmentSellerList) > 0 {
+				//	tmpDepartmentGroupSeller := make([]company.DepartmentGroupSellers, 0)
+				//	for _, seller := range departmentSellerList {
+				//		sellerItem := company.DepartmentGroupSellers{
+				//			AdminId: fmt.Sprint(seller.AdminId),
+				//			//AdminName string `description:"系统用户名称"`
+				//			RealName:     seller.RealName,
+				//			Authority:    seller.Authority,
+				//			RoleTypeCode: seller.RoleTypeCode,
+				//		}
+				//		tmpDepartmentGroupSeller = append(tmpDepartmentGroupSeller, sellerItem)
+				//	}
+				//	tmpDepartmentGroupSeller = sortDepartmentGroupSellers(tmpDepartmentGroupSeller)
+				//	list = append(list, tmpDepartmentGroupSeller...)
+				//}
+				//pid, err := company.GetParentIdFromGroup(sysUser.GroupId)
+				//if err != nil {
+				//	br.Msg = "获取失败"
+				//	br.ErrMsg = "查询父级id异常" + err.Error()
+				//	return
+				//}
+				//if pid != nil && *pid > 0 {
+				//	//主管角色放在了三级分组下
+				//	//
+				//
+				//
+				//} else {
+				//	//主管角色放在了二级分组下
+				//
+				//}
+				//ids, err := company.GetGroupIdsByParentId(*pid)
+				//if err != nil {
+				//	br.Msg = "获取失败"
+				//	br.ErrMsg = "查询父级id异常" + err.Error()
+				//	return
+				//}
+				//var idSlice []string
+				//var sid string
+				//for _, id := range ids {
+				//	idSlice = append(idSlice, *id)
+				//}
+				//sid = strings.Join(idSlice, ",")
+				//sellerList, err := system.GetTeamSysUserListByIds(sid)
+				//if err != nil {
+				//	br.Msg = "获取销售失败"
+				//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				//	return
+				//}
+				//for _, seller := range sellerList {
+				//	sellerItem := company.DepartmentGroupSellers{
+				//		AdminId: fmt.Sprint(seller.AdminId),
+				//		//AdminName string `description:"系统用户名称"`
+				//		RealName:     seller.RealName,
+				//		Authority:    seller.Authority,
+				//		RoleTypeCode: seller.RoleTypeCode,
+				//	}
+				//	fmt.Println("seller.RealName:", seller.RealName)
+				//	list = append(list, sellerItem)
+				//}
+				//list = sortDepartmentGroupSellers(list)
+				//
+				////分组为0的销售(直属分组)
+				//groupTeamSellerList, err := system.GetGrooupsysUserList(sysUser.GroupId, roleCodeTypeStr)
+				//if err != nil {
+				//	br.Msg = "获取销售失败"
+				//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				//	return
+				//}
+				//if len(groupTeamSellerList) > 0 {
+				//	tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+				//	for _, seller := range groupTeamSellerList {
+				//		sellerItem := company.DepartmentGroupSellers{
+				//			AdminId: fmt.Sprint(seller.AdminId),
+				//			//AdminName string `description:"系统用户名称"`
+				//			RealName:     seller.RealName,
+				//			Authority:    seller.Authority,
+				//			RoleTypeCode: seller.RoleTypeCode,
+				//		}
+				//		tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+				//	}
+				//	//排个序
+				//	tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+				//	list = append(list, tmpDepartmentGroupSellersList...)
+				//}
+				//sellerList, err := system.GetDepartmentGroupSysUserList(sysUser.DepartmentId, sysUser.GroupId, roleCodeTypeStr)
+				//if err != nil {
+				//	br.Msg = "获取销售失败"
+				//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				//	return
+				//}
+				//for _, seller := range sellerList {
+				//	sellerItem := company.DepartmentGroupSellers{
+				//		AdminId: fmt.Sprint(seller.AdminId),
+				//		//AdminName string `description:"系统用户名称"`
+				//		RealName:     seller.RealName,
+				//		Authority:    seller.Authority,
+				//		RoleTypeCode: seller.RoleTypeCode,
+				//	}
+				//	list = append(list, sellerItem)
+				//	list = sortDepartmentGroupSellers(list)
+				//}
+
+				//正常来说没有所有人都应该在某个小组下,要不就是小组名为 无 的小组
+			} else {
+				//var departmentStr string
+				//if utils.RunMode == "release" {
+				//	departmentStr = `1,2`
+				//} else {
+				//	departmentStr = `1,2`
+				//}
+				departmentStr := `1,2`
+				departmentList, err := system.GetDepartmentListByIds(departmentStr)
+				if err != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取部门失败,Err:" + err.Error()
+					return
+				}
+				for _, department := range departmentList {
+					departmentGroupSellerList := make([]company.DepartmentGroupSellers, 0)
+					item := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint("department_", department.DepartmentId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     department.DepartmentName,
+						ChildrenList: departmentGroupSellerList,
+					}
+
+					groupList, err := system.GetSysGroupByDepartmentId(department.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,
+						}
+						teamList, err := system.GetSysTeamByDepartmentId(group.GroupId)
+						if err != nil {
+							br.Msg = "获取小组失败"
+							br.ErrMsg = "获取小组失败,Err:" + err.Error()
+							return
+						}
+						for _, team := range teamList {
+							teamSellerList := make([]company.DepartmentGroupSellers, 0)
+							teamItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint("team_", team.GroupId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     team.GroupName,
+								ChildrenList: teamSellerList,
+							}
+							sellerList, err := system.GetTeamSysUserList(team.GroupId, enabled)
+							if err != nil {
+								br.Msg = "获取销售失败"
+								br.ErrMsg = "获取销售失败,Err:" + err.Error()
+								return
+							}
+							for _, seller := range sellerList {
+								sellerItem := company.DepartmentGroupSellers{
+									AdminId: fmt.Sprint(seller.AdminId),
+									//AdminName string `description:"系统用户名称"`
+									RealName:     seller.RealName,
+									Authority:    seller.Authority,
+									RoleTypeCode: seller.RoleTypeCode,
+								}
+								//fmt.Println("seller.RealName:", seller.RealName)
+								teamSellerList = append(teamSellerList, sellerItem)
+							}
+							teamSellerList = sortDepartmentGroupSellers(teamSellerList)
+							teamItem.ChildrenList = teamSellerList
+							if len(teamSellerList) > 0 {
+								groupSellerList = append(groupSellerList, teamItem)
+							}
+						}
+						//分组为0的人,不光是销售(直属分组)
+						groupTeamSellerList, err := system.GetGroupSysUserList(group.GroupId)
+						if err != nil {
+							br.Msg = "获取销售失败"
+							br.ErrMsg = "获取销售失败,Err:" + err.Error()
+							return
+						}
+						if len(groupTeamSellerList) > 0 {
+							tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+							for _, seller := range groupTeamSellerList {
+								sellerItem := company.DepartmentGroupSellers{
+									AdminId: fmt.Sprint(seller.AdminId),
+									//AdminName string `description:"系统用户名称"`
+									RealName:     seller.RealName,
+									Authority:    seller.Authority,
+									RoleTypeCode: seller.RoleTypeCode,
+								}
+								tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+							}
+							//排个序
+							tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+							groupSellerList = append(groupSellerList, tmpDepartmentGroupSellersList...)
+						}
+
+						//groupItem.ChildrenList = groupSellerList
+						//if len(groupSellerList) > 0 {
+						//	list = append(list, item)
+						//}
+
+						//sellerList, err := system.GetGroupSysUserList(group.DepartmentId)
+						//if err != nil {
+						//	br.Msg = "获取销售失败"
+						//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+						//	return
+						//}
+						//for _, seller := range sellerList {
+						//	sellerItem := company.DepartmentGroupSellers{
+						//		AdminId: fmt.Sprint(seller.AdminId),
+						//		//AdminName string `description:"系统用户名称"`
+						//		RealName:     seller.RealName,
+						//		Authority:    seller.Authority,
+						//		RoleTypeCode: seller.RoleTypeCode,
+						//	}
+						//	groupSellerList = append(groupSellerList, sellerItem)
+						//}
+						//groupSellerList = sortDepartmentGroupSellers(groupSellerList)
+						groupItem.ChildrenList = groupSellerList
+						if len(groupSellerList) > 0 {
+							departmentGroupSellerList = append(departmentGroupSellerList, groupItem)
+						}
+					}
+
+					//分组为0的人,不光是销售(直属部门)
+					departmentSellerList, err := system.GetDepartmentGroupSysUserList(department.DepartmentId, 0, "")
+					if err != nil {
+						br.Msg = "获取销售失败"
+						br.ErrMsg = "获取销售失败,Err:" + err.Error()
+						return
+					}
+					if len(departmentSellerList) > 0 {
+						tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+						for _, seller := range departmentSellerList {
+							sellerItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint(seller.AdminId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     seller.RealName,
+								Authority:    seller.Authority,
+								RoleTypeCode: seller.RoleTypeCode,
+							}
+							tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+						}
+						//排个序
+						tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+						departmentGroupSellerList = append(departmentGroupSellerList, tmpDepartmentGroupSellersList...)
+					}
+
+					item.ChildrenList = departmentGroupSellerList
+					if len(departmentGroupSellerList) > 0 {
+						list = append(list, item)
+					}
+				}
+			}
+		} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_SELLER && status == 1 {
+			//var departmentStr string
+			//if utils.RunMode == "release" {
+			//	departmentStr = `1,2`
+			//} else {
+			//	departmentStr = `1,2`
+			//}
+			departmentStr := `1,2`
+			departmentList, err := system.GetDepartmentListByIds(departmentStr)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取部门失败,Err:" + err.Error()
+				return
+			}
+			for _, department := range departmentList {
+				departmentGroupSellerList := make([]company.DepartmentGroupSellers, 0)
+				item := company.DepartmentGroupSellers{
+					AdminId: fmt.Sprint("department_", department.DepartmentId),
+					//AdminName string `description:"系统用户名称"`
+					RealName:     department.DepartmentName,
+					ChildrenList: departmentGroupSellerList,
+				}
+
+				groupList, err := system.GetSysGroupByDepartmentId(department.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,
+					}
+					teamList, err := system.GetSysTeamByDepartmentId(group.GroupId)
+					if err != nil {
+						br.Msg = "获取小组失败"
+						br.ErrMsg = "获取小组失败,Err:" + err.Error()
+						return
+					}
+					for _, team := range teamList {
+						teamSellerList := make([]company.DepartmentGroupSellers, 0)
+						teamItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint("team_", team.GroupId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     team.GroupName,
+							ChildrenList: teamSellerList,
+						}
+						sellerList, err := system.GetTeamSysUserList(team.GroupId, enabled)
+						if err != nil {
+							br.Msg = "获取销售失败"
+							br.ErrMsg = "获取销售失败,Err:" + err.Error()
+							return
+						}
+						for _, seller := range sellerList {
+							sellerItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint(seller.AdminId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     seller.RealName,
+								Authority:    seller.Authority,
+								RoleTypeCode: seller.RoleTypeCode,
+							}
+							//fmt.Println("seller.RealName:", seller.RealName)
+							teamSellerList = append(teamSellerList, sellerItem)
+						}
+						teamSellerList = sortDepartmentGroupSellers(teamSellerList)
+						teamItem.ChildrenList = teamSellerList
+						if len(teamSellerList) > 0 {
+							groupSellerList = append(groupSellerList, teamItem)
+						}
+					}
+					//分组为0的人,不光是销售(直属分组)
+					groupTeamSellerList, err := system.GetGroupSysUserList(group.GroupId)
+					if err != nil {
+						br.Msg = "获取销售失败"
+						br.ErrMsg = "获取销售失败,Err:" + err.Error()
+						return
+					}
+					if len(groupTeamSellerList) > 0 {
+						tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+						for _, seller := range groupTeamSellerList {
+							sellerItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint(seller.AdminId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     seller.RealName,
+								Authority:    seller.Authority,
+								RoleTypeCode: seller.RoleTypeCode,
+							}
+							tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+						}
+						//排个序
+						tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+						groupSellerList = append(groupSellerList, tmpDepartmentGroupSellersList...)
+					}
+
+					//groupItem.ChildrenList = groupSellerList
+					//if len(groupSellerList) > 0 {
+					//	list = append(list, item)
+					//}
+
+					//sellerList, err := system.GetGroupSysUserList(group.DepartmentId)
+					//if err != nil {
+					//	br.Msg = "获取销售失败"
+					//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					//	return
+					//}
+					//for _, seller := range sellerList {
+					//	sellerItem := company.DepartmentGroupSellers{
+					//		AdminId: fmt.Sprint(seller.AdminId),
+					//		//AdminName string `description:"系统用户名称"`
+					//		RealName:     seller.RealName,
+					//		Authority:    seller.Authority,
+					//		RoleTypeCode: seller.RoleTypeCode,
+					//	}
+					//	groupSellerList = append(groupSellerList, sellerItem)
+					//}
+					//groupSellerList = sortDepartmentGroupSellers(groupSellerList)
+					groupItem.ChildrenList = groupSellerList
+					if len(groupSellerList) > 0 {
+						departmentGroupSellerList = append(departmentGroupSellerList, groupItem)
+					}
+				}
+
+				//分组为0的人,不光是销售(直属部门)
+				departmentSellerList, err := system.GetDepartmentGroupSysUserList(department.DepartmentId, 0, "")
+				if err != nil {
+					br.Msg = "获取销售失败"
+					br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					return
+				}
+				if len(departmentSellerList) > 0 {
+					tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+					for _, seller := range departmentSellerList {
+						sellerItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint(seller.AdminId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     seller.RealName,
+							Authority:    seller.Authority,
+							RoleTypeCode: seller.RoleTypeCode,
+						}
+						tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+					}
+					//排个序
+					tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+					departmentGroupSellerList = append(departmentGroupSellerList, tmpDepartmentGroupSellersList...)
+				}
+
+				item.ChildrenList = departmentGroupSellerList
+				if len(departmentGroupSellerList) > 0 {
+					list = append(list, item)
+				}
+			}
+		} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER && status == 1 {
+			// 权益销售可以看到权益销售部的所有人
+			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,
+				}
+				teamList, err := system.GetSysTeamByDepartmentId(group.GroupId)
+				if err != nil {
+					br.Msg = "获取小组失败"
+					br.ErrMsg = "获取小组失败,Err:" + err.Error()
+					return
+				}
+				for _, team := range teamList {
+					teamSellerList := make([]company.DepartmentGroupSellers, 0)
+					teamItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint("team_", team.GroupId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     team.GroupName,
+						ChildrenList: teamSellerList,
+					}
+					sellerList, err := system.GetTeamSysUserList(team.GroupId, enabled)
+					if err != nil {
+						br.Msg = "获取销售失败"
+						br.ErrMsg = "获取销售失败,Err:" + err.Error()
+						return
+					}
+					for _, seller := range sellerList {
+						sellerItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint(seller.AdminId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     seller.RealName,
+							Authority:    seller.Authority,
+							RoleTypeCode: seller.RoleTypeCode,
+						}
+						//fmt.Println("seller.RealName:", seller.RealName)
+						teamSellerList = append(teamSellerList, sellerItem)
+					}
+					teamSellerList = sortDepartmentGroupSellers(teamSellerList)
+					teamItem.ChildrenList = teamSellerList
+					if len(teamSellerList) > 0 {
+						groupSellerList = append(groupSellerList, teamItem)
+					}
+				}
+				//分组为0的销售(直属分组)
+				groupTeamSellerList, err := system.GetGrooupsysUserList(group.GroupId, roleCodeTypeStr, enabled)
+				if err != nil {
+					br.Msg = "获取销售失败"
+					br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					return
+				}
+				if len(groupTeamSellerList) > 0 {
+					tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+					for _, seller := range groupTeamSellerList {
+						sellerItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint(seller.AdminId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     seller.RealName,
+							Authority:    seller.Authority,
+							RoleTypeCode: seller.RoleTypeCode,
+						}
+						tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+					}
+					//排个序
+					tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+					groupSellerList = append(groupSellerList, tmpDepartmentGroupSellersList...)
+				}
+
+				//groupItem.ChildrenList = groupSellerList
+				//if len(groupSellerList) > 0 {
+				//	list = append(list, item)
+				//}
+
+				//sellerList, err := system.GetGroupSysUserList(group.DepartmentId)
+				//if err != nil {
+				//	br.Msg = "获取销售失败"
+				//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				//	return
+				//}
+				//for _, seller := range sellerList {
+				//	sellerItem := company.DepartmentGroupSellers{
+				//		AdminId: fmt.Sprint(seller.AdminId),
+				//		//AdminName string `description:"系统用户名称"`
+				//		RealName:     seller.RealName,
+				//		Authority:    seller.Authority,
+				//		RoleTypeCode: seller.RoleTypeCode,
+				//	}
+				//	groupSellerList = append(groupSellerList, sellerItem)
+				//}
+				//groupSellerList = sortDepartmentGroupSellers(groupSellerList)
+				groupItem.ChildrenList = groupSellerList
+				if len(groupSellerList) > 0 {
+					list = append(list, groupItem)
+				}
+			}
+
+			//分组为0的销售(直属部门)
+			departmentSellerList, err := system.GetDepartmentGroupSysUserList(departmentId, 0, roleCodeTypeStr)
+			if err != nil {
+				br.Msg = "获取销售失败"
+				br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				return
+			}
+			if len(departmentSellerList) > 0 {
+				tmpDepartmentGroupSeller := make([]company.DepartmentGroupSellers, 0)
+				for _, seller := range departmentSellerList {
+					sellerItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint(seller.AdminId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     seller.RealName,
+						Authority:    seller.Authority,
+						RoleTypeCode: seller.RoleTypeCode,
+					}
+					tmpDepartmentGroupSeller = append(tmpDepartmentGroupSeller, sellerItem)
+				}
+				tmpDepartmentGroupSeller = sortDepartmentGroupSellers(tmpDepartmentGroupSeller)
+				list = append(list, tmpDepartmentGroupSeller...)
+			}
+		} else {
+			//看自己
+			sellerItem := company.DepartmentGroupSellers{
+				AdminId: fmt.Sprint(sysUser.AdminId),
+				//AdminName string `description:"系统用户名称"`
+				RealName: sysUser.RealName,
+			}
+			list = append(list, sellerItem)
+		}
+	} else {
+		departmentId := sysUser.DepartmentId
+		switch productId {
+		case 1:
+			departmentId = 2
+		case 5:
+			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,
+			}
+			teamList, err := system.GetSysTeamByDepartmentId(group.GroupId)
+			if err != nil {
+				br.Msg = "获取小组失败"
+				br.ErrMsg = "获取小组失败,Err:" + err.Error()
+				return
+			}
+			for _, team := range teamList {
+				teamSellerList := make([]company.DepartmentGroupSellers, 0)
+				teamItem := company.DepartmentGroupSellers{
+					AdminId: fmt.Sprint("team_", team.GroupId),
+					//AdminName string `description:"系统用户名称"`
+					RealName:     team.GroupName,
+					ChildrenList: teamSellerList,
+				}
+				sellerList, err := system.GetTeamSysUserList(team.GroupId, enabled)
+				if err != nil {
+					br.Msg = "获取销售失败"
+					br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					return
+				}
+				for _, seller := range sellerList {
+					sellerItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint(seller.AdminId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     seller.RealName,
+						Authority:    seller.Authority,
+						RoleTypeCode: seller.RoleTypeCode,
+					}
+					//fmt.Println("seller.RealName:", seller.RealName)
+					teamSellerList = append(teamSellerList, sellerItem)
+				}
+				teamSellerList = sortDepartmentGroupSellers(teamSellerList)
+				teamItem.ChildrenList = teamSellerList
+				if len(teamSellerList) > 0 {
+					groupSellerList = append(groupSellerList, teamItem)
+				}
+			}
+			//分组为0的销售(直属分组)
+			groupTeamSellerList, err := system.GetGrooupsysUserList(group.GroupId, roleCodeTypeStr, enabled)
+			if err != nil {
+				br.Msg = "获取销售失败"
+				br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				return
+			}
+			if len(groupTeamSellerList) > 0 {
+				tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+				for _, seller := range groupTeamSellerList {
+					sellerItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint(seller.AdminId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     seller.RealName,
+						Authority:    seller.Authority,
+						RoleTypeCode: seller.RoleTypeCode,
+					}
+					tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+				}
+				//排个序
+				tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+				groupSellerList = append(groupSellerList, tmpDepartmentGroupSellersList...)
+			}
+
+			groupItem.ChildrenList = groupSellerList
+			if len(groupSellerList) > 0 {
+				list = append(list, groupItem)
+			}
+		}
+
+		//分组为0的销售(直属部门)
+		departmentSellerList, err := system.GetDepartmentGroupSysUserList(departmentId, 0, roleCodeTypeStr)
+		if err != nil {
+			br.Msg = "获取销售失败"
+			br.ErrMsg = "获取销售失败,Err:" + err.Error()
+			return
+		}
+		if len(departmentSellerList) > 0 {
+			tmpDepartmentGroupSeller := make([]company.DepartmentGroupSellers, 0)
+			for _, seller := range departmentSellerList {
+				sellerItem := company.DepartmentGroupSellers{
+					AdminId: fmt.Sprint(seller.AdminId),
+					//AdminName string `description:"系统用户名称"`
+					RealName:     seller.RealName,
+					Authority:    seller.Authority,
+					RoleTypeCode: seller.RoleTypeCode,
+				}
+				tmpDepartmentGroupSeller = append(tmpDepartmentGroupSeller, sellerItem)
+			}
+			//排个序
+			tmpDepartmentGroupSeller = sortDepartmentGroupSellers(tmpDepartmentGroupSeller)
+			list = append(list, tmpDepartmentGroupSeller...)
+		}
+	}
+
+	//// 海外销售部-目前无权限, 均可见
+	//seaDepartment, e := system.GetSysDepartmentByName("海外销售部")
+	//if e != nil && e.Error() != utils.ErrNoRow() {
+	//	br.Msg = "获取失败"
+	//	br.ErrMsg = "获取海外销售部失败, Err: " + e.Error()
+	//	return
+	//}
+	//if e == nil {
+	//	// 获取部门下的销售人员
+	//	seaSellers, e := system.GetDepartmentGroupSysUserList(seaDepartment.DepartmentId, 0, "")
+	//	if e != nil {
+	//		br.Msg = "获取失败"
+	//		br.ErrMsg = "获取海外销售失败, Err: " + e.Error()
+	//		return
+	//	}
+	//	// 获取分组
+	//	seaGroups, e := system.GetSysGroupListByDepartmentId(seaDepartment.DepartmentId)
+	//	if e != nil {
+	//		br.Msg = "获取失败"
+	//		br.ErrMsg = "获取海外销售部分组失败, Err: " + e.Error()
+	//		return
+	//	}
+	//
+	//	var d company.DepartmentGroupSellers
+	//	d.AdminId = fmt.Sprintf("department_%d", seaDepartment.DepartmentId)
+	//	d.RealName = seaDepartment.DepartmentName
+	//	children := make([]company.DepartmentGroupSellers, 0)
+	//	// 无分组
+	//	if len(seaGroups) == 0 {
+	//		for _, s := range seaSellers {
+	//			children = append(children, company.DepartmentGroupSellers{
+	//				AdminId:      strconv.Itoa(s.AdminId),
+	//				RealName:     s.RealName,
+	//				RoleTypeCode: s.RoleTypeCode,
+	//				Authority:    s.Authority,
+	//			})
+	//		}
+	//	}
+	//	// 有分组
+	//	if len(seaGroups) > 0 {
+	//		// 销售map
+	//		sellerMap := make(map[int][]company.DepartmentGroupSellers)
+	//		for _, s := range seaSellers {
+	//			sellerMap[s.GroupId] = append(sellerMap[s.GroupId], company.DepartmentGroupSellers{
+	//				AdminId:      strconv.Itoa(s.AdminId),
+	//				RealName:     s.RealName,
+	//				RoleTypeCode: s.RoleTypeCode,
+	//				Authority:    s.Authority,
+	//			})
+	//		}
+	//		// 小组map
+	//		childrenMap := make(map[int][]company.DepartmentGroupSellers)
+	//		for _, g := range seaGroups {
+	//			if g.ParentId == 0 {
+	//				continue
+	//			}
+	//			childrenMap[g.ParentId] = append(childrenMap[g.ParentId], company.DepartmentGroupSellers{
+	//				AdminId:      fmt.Sprintf("team_%d", g.GroupId),
+	//				RealName:     g.GroupName,
+	//				ChildrenList: sellerMap[g.GroupId],
+	//			})
+	//		}
+	//		// 大组
+	//		for _, g := range seaGroups {
+	//			if g.ParentId > 0 {
+	//				continue
+	//			}
+	//			c := childrenMap[g.GroupId]
+	//			if len(sellerMap[g.GroupId]) > 0 {
+	//				c = append(c, sellerMap[g.GroupId]...)
+	//			}
+	//			children = append(children, company.DepartmentGroupSellers{
+	//				AdminId:      fmt.Sprintf("group_%d", g.GroupId),
+	//				RealName:     g.GroupName,
+	//				ChildrenList: c,
+	//			})
+	//		}
+	//	}
+	//	d.ChildrenList = children
+	//	list = append(list, d)
+	//}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = company.DepartmentGroupSellersResp{
+		List: list,
+	}
+}

+ 20 - 1
controllers/company_service_record.go

@@ -5,6 +5,7 @@ import (
 	"fmt"
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/company"
+	"hongze/hz_crm_api/services"
 	"hongze/hz_crm_api/utils"
 	"strings"
 	"time"
@@ -128,12 +129,30 @@ func (this *CompanyServiceRecordController) ServiceRecordAdd() {
 	item.SysAdminName = sysUser.RealName
 	item.CreateTime = time.Now().Local()
 	item.ModifyTime = time.Now().Local()
-	if e := item.Create(); e != nil {
+
+	newId, e := item.Create()
+	if e != nil {
 		br.Msg = "操作失败"
 		br.ErrMsg = "新增沟通记录失败, Err: " + e.Error()
 		return
 	}
 
+	//权益客户新增历史备注总表
+	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN {
+		itemRecord := new(company.CompanyHistoryRemark)
+		itemRecord.CompanyId = req.CompanyId
+		itemRecord.Content = req.Content
+		itemRecord.SysAdminId = sysUser.AdminId
+		itemRecord.SysAdminName = sysUser.RealName
+		itemRecord.CreateTime = time.Now().Local()
+		itemRecord.ModifyTime = time.Now().Local()
+		itemRecord.ShowTime = time.Now().Local()
+		itemRecord.ProductId = 2
+		itemRecord.TableName = "company_service_record"
+		itemRecord.TableId = newId
+		go services.AddCompanyHistoryRemark(itemRecord)
+	}
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"

+ 56 - 13
controllers/company_share.go

@@ -78,12 +78,19 @@ func (this *CompanyController) CompanyShare() {
 		return
 	}
 	//新增操作记录
-	//{
-	//	remark := "移动到:" + seller.RealName
-	//	operation := "move_seller"
-	//	services.AddCompanyOperationRecord(req.CompanyId, seller.AdminId, sysUser.AdminId, productId, sysUser.AdminId, cp.CompanyName,
-	//		cp.ProductName, sysUser.RealName, remark, operation, "", sysUser.RealName, "", cp.Status)
-	//}
+	{
+		var remark string
+		var operation string
+		if req.IsShare == 1 {
+			remark = "设置共享"
+			operation = "set_share"
+		} else {
+			remark = "取消共享"
+			operation = "cancel_share"
+		}
+		services.AddCompanyOperationRecord(req.CompanyId, companyProductItem.SellerId, sysUser.AdminId, productId, sysUser.AdminId, companyProductItem.CompanyName,
+			companyProductItem.ProductName, sysUser.RealName, remark, operation, "", sysUser.RealName, "", companyProductItem.Status)
+	}
 
 	br.Ret = 200
 	br.Success = true
@@ -594,6 +601,10 @@ func (this *CompanyController) CompanyShareList() {
 				//如果已经是共享客户了,取消共享按钮全都显示,和修改销售权限一样
 				v.BtnItem.BtnShare = true
 			}
+			//解决共享客户正式筛选下是否标红的问题
+			if v.WeekViewActive == 0 && v.IsUserMaker == 1 {
+				v.WeekViewActive = 1
+			}
 
 			companyList := &company.CompanyListItem{
 				CompanyId:        v.CompanyId,
@@ -653,6 +664,7 @@ func (this *CompanyController) CompanyShareList() {
 				ShareSellerId:   v.ShareSellerId,
 				LastServiceTime: v.LastServiceTime,
 				ServiceTimes:    v.ServiceTimes,
+				IsUserMaker:     v.IsUserMaker,
 			}
 			if v.ShareSellerIds != "" {
 				shareSellerIds := strings.Split(v.ShareSellerIds, ",")
@@ -749,6 +761,7 @@ func (this *CompanyController) MoveShareSeller() {
 		br.ErrMsg = "查找客户失败,Err:" + err.Error()
 		return
 	}
+	oldShareSellerId := companyProductItem.ShareSellerId
 
 	//待更新字段
 	updateCol := make([]string, 0)
@@ -763,13 +776,25 @@ func (this *CompanyController) MoveShareSeller() {
 		br.ErrMsg = "修改客户信息失败,Err:" + err.Error()
 		return
 	}
+
+	{
+		services.UpdateCompanyContractSellerMove(req.CompanyId, productId) //益客户移动所属销售之后,更新所关联的销售信息
+	}
+
 	//新增操作记录
-	//{
-	//	remark := "移动到:" + seller.RealName
-	//	operation := "move_seller"
-	//	services.AddCompanyOperationRecord(req.CompanyId, seller.AdminId, sysUser.AdminId, productId, sysUser.AdminId, cp.CompanyName,
-	//		cp.ProductName, sysUser.RealName, remark, operation, "", sysUser.RealName, "", cp.Status)
-	//}
+	{
+		var remark string
+		var operation string
+		if oldShareSellerId == 0 {
+			remark = "分配给" + seller.RealName
+			operation = "set_share_seller"
+		} else {
+			remark = "移动到" + seller.RealName
+			operation = "set_share_seller"
+		}
+		services.AddCompanyOperationRecord(req.CompanyId, seller.AdminId, sysUser.AdminId, productId, sysUser.AdminId, companyProductItem.CompanyName,
+			companyProductItem.ProductName, sysUser.RealName, remark, operation, "", sysUser.RealName, "", companyProductItem.Status)
+	}
 	//变更销售员与联系人关系
 	//_ = models.UpdateUserSellerRelationByCompanyId(req.CompanyId, productId, seller.AdminId, seller.RealName)
 
@@ -848,7 +873,8 @@ func (this *CompanyController) CompanyShareAddRemark() {
 		SysUserId:   sysUser.AdminId,
 		SysRealName: sysUser.RealName,
 	}
-	err = company.AddCompanyRemark(&remark)
+	var newId int64
+	newId, err = company.AddCompanyRemark(&remark)
 	if err != nil {
 		br.Msg = "操作失败"
 		br.ErrMsg = "新增共享客户备注失败, Err: " + err.Error()
@@ -863,6 +889,23 @@ func (this *CompanyController) CompanyShareAddRemark() {
 			companyProduct.ProductName, sysUser.RealName, remark, operation, approveContent, sysUser.RealName, "", companyProduct.Status)
 	}()
 
+	//如果是权益的写入历史备注表
+	if productId == utils.COMPANY_PRODUCT_RAI_ID {
+		//权益客户新增历史备注总表
+		itemRecord := new(company.CompanyHistoryRemark)
+		itemRecord.CompanyId = req.CompanyId
+		itemRecord.Content = req.Remark
+		itemRecord.SysAdminId = sysUser.AdminId
+		itemRecord.SysAdminName = sysUser.RealName
+		itemRecord.CreateTime = time.Now().Local()
+		itemRecord.ModifyTime = time.Now().Local()
+		itemRecord.ShowTime = time.Now().Local()
+		itemRecord.ProductId = 2
+		itemRecord.TableName = "company_product_remark"
+		itemRecord.TableId = int(newId)
+		go services.AddCompanyHistoryRemark(itemRecord)
+	}
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "编辑成功"

+ 103 - 2
controllers/company_user.go

@@ -1107,7 +1107,7 @@ func (this *CompanyUserController) List() {
 		for _, v := range ybViewsList {
 			userYbViewsMap[v.UserId] = v.VisitCount
 		}
-
+		userHaveMoveMap := services.GetWxUserHaveMoveMap(mobilesSlice) // 处理用户是否移动过按钮回显
 		for i := 0; i < lenList; i++ {
 			item := list[i]
 			//企业名称
@@ -1261,6 +1261,10 @@ func (this *CompanyUserController) List() {
 			// 分产品阅读统计
 			list[i].YbProductViewTotal = userYbViewsMap[int(item.UserId)]
 			//list[i].LastViewTimeStr = list[i].RaiLastViewTime.Format(utils.FormatDateTime)
+
+			if item.Mobile != "" {
+				list[i].HaveMoveButton = userHaveMoveMap[item.Mobile]
+			}
 		}
 
 		isUserYanXuanButtonShow, err := services.CheckCompanyUserYanXuanButton(sysUser.RoleTypeCode, sysUser.Mobile)
@@ -1317,6 +1321,7 @@ func (this *CompanyUserController) List() {
 					}
 				}
 			}
+
 			for i := 0; i < lenList; i++ {
 				item := list[i]
 				// 分产品阅读统计
@@ -2740,6 +2745,7 @@ func (this *CompanyController) PotentialUserMove() {
 		OpUserName:             sysUser.RealName,
 		CreateTime:             time.Now(),
 	})
+	go services.AddWxUserMoveLog(wxUser, sysUser, req.CompanyId) // 添加用户移动日志记录
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "移动成功"
@@ -2852,6 +2858,8 @@ func (this *CompanyController) UserMove() {
 		CreateTime:             time.Now(),
 	})
 
+	go services.AddWxUserMoveLog(wxUser, sysUser, req.CompanyId) // 添加用户移动日志记录
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "移动成功"
@@ -3297,7 +3305,7 @@ func (this *CompanyUserController) ViewReportList() {
 			secondCondition += `AND create_time <  ?`
 			secondPars = append(secondPars, lastViewTime)
 
-			_, items, err = obj.GetViewReportList(lastViewTimeT.Year(), secondCondition, secondPars, int(total)-pageSize)
+			_, items, err = obj.GetViewReportList(lastViewTimeT.Year()-1, secondCondition, secondPars, pageSize-int(total))
 			if err != nil {
 				br.Msg = "获取失败"
 				br.Msg = "获取失败,Err:" + err.Error()
@@ -6418,3 +6426,96 @@ func (this *CompanyUserController) ListByReport() {
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// listMoveLog
+// @Title 联系人移动记录列表
+// @Description 联系人移动记录列表接口
+// @Param   Mobile   query   string  true       "手机号"
+// @Success 200 {object} company.CompanyUserListResp
+// @router /user/listMoveLog [get]
+func (this *CompanyUserController) ListMoveLog() {
+	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
+	}
+	mobile := this.GetString("Mobile")
+	if mobile == "" {
+		br.Msg = "手机号不能为空"
+		return
+	}
+	list, err := company.GetWxUserMoveLogListmByMobile(mobile)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	respList := make([]*company.WxUserMoveLogResp, 0)
+	for _, v := range list {
+		item := new(company.WxUserMoveLogResp)
+		item.UserName = v.RealName
+		item.Mobile = v.Mobile
+		item.Email = v.Email
+		item.CompanyId = v.CompanyId
+		item.CompanyName = v.CompanyName
+		item.CompanyIdMove = v.CompanyIdMove
+		item.CompanyNameMove = v.CompanyNameMove
+		item.CreateTime = v.CreateTime.Format(utils.FormatDateTime)
+		respList = append(respList, item)
+	}
+	resp := &company.WxUserMoveLogListResp{
+		List: respList,
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 修改联系人外呼手机号
+// @Description 修改联系人外呼手机号接口
+// @Param	request	body models.PotentialUserDealReq true "type json string"
+// @Success Ret=200 修改成功
+// @router /user/edit/outbound_mobile [post]
+func (this *CompanyController) EditUserOutboundMobile() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.EditUserOutboundMobileReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	if req.OutboundMobile == "" {
+		br.Msg = "手机号不能为空"
+		return
+	}
+	//if !utils.ValidateMobileFormatat(req.OutboundMobile) {
+	//	br.Msg = "手机号格式有误"
+	//	return
+	//}
+	err = models.UpdateUserOutboundMobile(req.OutboundMobile, req.OutboundCountryCode, req.UserId)
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "标记成功"
+}

+ 1 - 0
controllers/cygx/activity.go

@@ -471,6 +471,7 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 			item.IsShowHz = isShowHz
 			item.ChartPermissionIdDeputy = charInfo.ChartPermissionId
 			item.ChartPermissionNameDeputy = charInfo.PermissionName
+			item.IsZoom = req.IsZoom
 			if len(labelList) == 1 {
 				item.IsCanAppointmentMinutes = labelList[0].IsCanAppointmentMinutes
 			} else {

+ 150 - 82
controllers/cygx/activity_meet.go

@@ -1610,6 +1610,7 @@ func (this *ActivityMeetCoAntroller) AttendanceDetail() {
 // @Title 线上活动进门财经关联匹配列表
 // @Description 获取线上活动进门财经关联匹配列表接口
 // @Param   KeyWord   query   string  false       "搜索关键词"
+// @Param   ActivityId   query   int  false       "搜索关键词"
 // @Success 200 {object} cygx.RoadshowDataTitleList
 // @router /activityMeet/matchingList [get]
 func (this *ActivityMeetCoAntroller) MatchingList() {
@@ -1629,7 +1630,19 @@ func (this *ActivityMeetCoAntroller) MatchingList() {
 		br.Msg = "请输入搜索内容"
 		return
 	}
-	list, err := cygx.GetRoadshowDataTitleList(keyWord)
+	activityId, _ := this.GetInt("ActivityId")
+
+	detail, err := cygx.GetAddActivityInfoById(activityId)
+	if err != nil {
+		br.Msg = "活动不存在"
+		br.ErrMsg = "活动ID错误,Err:" + err.Error() + "activityId:" + strconv.Itoa(activityId)
+		return
+	}
+	dateTime := detail.ActivityTime
+	dateTime = utils.TimeRemoveHms2(dateTime)
+	startTime := dateTime + " 00:00:00'"
+	endTime := dateTime + " 23:59:59'"
+	list, err := cygx.GetRoadshowDataTitleList(startTime, endTime, keyWord)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "获取信息失败"
 		br.ErrMsg = "获取信息失败,Err:" + err.Error()
@@ -1648,6 +1661,21 @@ func (this *ActivityMeetCoAntroller) MatchingList() {
 			list[k].RoadshowTitle = activityName
 		}
 	}
+
+	param := new(cygxService.GetYiDongActivityByApiReq)
+	param.MeetingStatus = "2"
+	param.ConveneStartStr = dateTime
+	param.ConveneEndStr = dateTime
+	actList := cygxService.GetYiDongActivityListByApi(param)
+	for _, v := range actList {
+		if strings.Contains(v.Title, keyWord) {
+			item := new(cygx.RoadshowDataTitle)
+			item.RoadshowTitle = v.Title
+			item.ActivityTime = dateTime
+			list = append(list, item)
+		}
+	}
+
 	resplist.List = list
 	br.Ret = 200
 	br.Success = true
@@ -1703,103 +1731,143 @@ func (this *ActivityMeetCoAntroller) MatchingByHand() {
 	}
 	var condition string
 	dateTime := detail.ActivityTime
-	dateTime = utils.TimeRemoveHms(dateTime)
-	condition += ` AND roadshow_begin_time >= ` + "'" + dateTime + " 00:00:00'"
-	condition += ` AND roadshow_begin_time  <= ` + "'" + dateTime + " 23:59:59'"
-	if len(slice) > 0 {
-		keyWord = slice[0]
-	}
-	if keyWord != "" {
-		list, err := cygx.GetRoadshowDataList(keyWord, condition)
-		if err != nil {
-			br.Msg = "手动归类失败"
-			br.ErrMsg = "获取进门财经数据失败,Err:" + err.Error() + "activityId:" + strconv.Itoa(activityId)
-			return
-		}
-		var roadshowId string
-		for _, v := range list {
-			if v.RoadshowId != "" {
-				roadshowId = v.RoadshowId
+	dateTime = utils.TimeRemoveHms2(dateTime)
+
+	param := new(cygxService.GetYiDongActivityByApiReq)
+	param.MeetingStatus = "2"
+	param.ConveneStartStr = dateTime
+	param.ConveneEndStr = dateTime
+	actList := cygxService.GetYiDongActivityListByApi(param)
+
+	var ismatch bool // 是否匹配
+
+	//优先匹配易董的活动
+	if len(actList) > 0 {
+		for _, v := range actList {
+			var newActivityName string
+			titleSlice := strings.Split(v.Title, "】")
+
+			for _, vt := range titleSlice {
+				newActivityName = strings.Replace(vt, "-", "", -1)
+				newActivityName = strings.Replace(newActivityName, "-", "", -1)
+				newActivityName = strings.Replace(newActivityName, "—", "", -1)
+				newActivityName = strings.Replace(newActivityName, " ", "", -1)
+				newActivityName = strings.Replace(newActivityName, ":", "", -1)
+			}
+			//如果活动时间一致,而且标题还还包含关键词就建立匹配关系
+			if strings.Contains(detail.ActivityNameTask, newActivityName) && detail.ActivityTime == v.Start {
+				err = cygx.UpdateCygxActivityyidongActivityId(v.ID, activityId)
+				if err != nil {
+					br.Msg = "手动归类失败"
+					br.ErrMsg = "建立易董活动匹配关系失败,UpdateCygxActivityyidongActivityId Err:" + err.Error() + "activityId:" + strconv.Itoa(activityId)
+					return
+				}
+				ismatch = true
+				go cygxService.GetYiDongActivityMeeting(v.ID, activityId)
 				break
 			}
+
+		}
+	}
+
+	if !ismatch {
+		condition += ` AND roadshow_begin_time >= ` + "'" + dateTime + " 00:00:00'"
+		condition += ` AND roadshow_begin_time  <= ` + "'" + dateTime + " 23:59:59'"
+		if len(slice) > 0 {
+			keyWord = slice[0]
 		}
-		needAddAttendanc := make([]*cygx.CygxActivityAttendanceDetail, 0)
-		if len(list) > 0 {
-			err = cygx.UpdateActivityRoadshowTitle(activityId, keyWord, roadshowId)
+		if keyWord != "" {
+			list, err := cygx.GetRoadshowDataList(keyWord, condition)
 			if err != nil {
 				br.Msg = "手动归类失败"
-				br.ErrMsg = "关联匹配类型失败,Err:" + err.Error() + "activityId:" + strconv.Itoa(activityId)
+				br.ErrMsg = "获取进门财经数据失败,Err:" + err.Error() + "activityId:" + strconv.Itoa(activityId)
 				return
 			}
+			var roadshowId string
 			for _, v := range list {
-				if v.UserPhone != "" {
-					item := new(cygx.CygxActivityAttendanceDetail)
-					item.ActivityId = activityId
-					item.RealName = v.UserName
-					item.Mobile = v.UserPhone
-					item.CompanyName = v.Company
-					//item.SellerName = sellerName
-					item.FirstMeetingTime = v.FirstWatchTime
-					item.LastMeetingTime = v.LastWatchTime
-					item.Duration = utils.GetAttendanceDetailSeconds(v.JoinTime)
-					if v.JoinType == 1 {
-						item.MeetingTypeStr = "网络"
-					} else {
-						item.MeetingTypeStr = "电话"
-					}
-					item.MeetingAuthentication = v.AuthInfo
-					if v.DataType == 1 {
-						item.MeetingStatusStr = "直播"
-					} else {
-						item.MeetingStatusStr = "回放"
-					}
-					item.Position = v.Occupation
-					item.UseridEntity = v.UseridEntity
-					item.CrmCompanyMapStatusId = v.CrmCompanyMapStatusId
-					item.CreateTime = time.Now()
-					mobileStr += "'" + v.UserPhone + "'" + ","
-
-					needAddAttendanc = append(needAddAttendanc, item)
+				if v.RoadshowId != "" {
+					roadshowId = v.RoadshowId
+					break
 				}
 			}
-			mobileStr = strings.TrimRight(mobileStr, ",")
-			if mobileStr == "" {
-				mobileStr = "1"
-			}
-			listUser, err := cygx.GetWxUserOutboundMobile(mobileStr)
-			if err != nil {
-				br.Msg = "手动归类失败!"
-				br.ErrMsg = "获取用户列表失败,Err:" + err.Error()
-				return
-			}
-			for _, v := range listUser {
-				userIdArr = append(userIdArr, v.UserId)
-			}
+			needAddAttendanc := make([]*cygx.CygxActivityAttendanceDetail, 0)
+			if len(list) > 0 {
+				err = cygx.UpdateActivityRoadshowTitle(activityId, keyWord, roadshowId)
+				if err != nil {
+					br.Msg = "手动归类失败"
+					br.ErrMsg = "关联匹配类型失败,Err:" + err.Error() + "activityId:" + strconv.Itoa(activityId)
+					return
+				}
+				for _, v := range list {
+					if v.UserPhone != "" {
+						item := new(cygx.CygxActivityAttendanceDetail)
+						item.ActivityId = activityId
+						item.RealName = v.UserName
+						item.Mobile = v.UserPhone
+						item.CompanyName = v.Company
+						//item.SellerName = sellerName
+						item.FirstMeetingTime = v.FirstWatchTime
+						item.LastMeetingTime = v.LastWatchTime
+						item.Duration = utils.GetAttendanceDetailSeconds(v.JoinTime)
+						if v.JoinType == 1 {
+							item.MeetingTypeStr = "网络"
+						} else {
+							item.MeetingTypeStr = "电话"
+						}
+						item.MeetingAuthentication = v.AuthInfo
+						if v.DataType == 1 {
+							item.MeetingStatusStr = "直播"
+						} else {
+							item.MeetingStatusStr = "回放"
+						}
+						item.Position = v.Occupation
+						item.UseridEntity = v.UseridEntity
+						item.CrmCompanyMapStatusId = v.CrmCompanyMapStatusId
+						item.CreateTime = time.Now()
+						mobileStr += "'" + v.UserPhone + "'" + ","
+
+						needAddAttendanc = append(needAddAttendanc, item)
+					}
+				}
+				mobileStr = strings.TrimRight(mobileStr, ",")
+				if mobileStr == "" {
+					mobileStr = "1"
+				}
+				listUser, err := cygx.GetWxUserOutboundMobile(mobileStr)
+				if err != nil {
+					br.Msg = "手动归类失败!"
+					br.ErrMsg = "获取用户列表失败,Err:" + err.Error()
+					return
+				}
+				for _, v := range listUser {
+					userIdArr = append(userIdArr, v.UserId)
+				}
 
-			for k, v := range needAddAttendanc {
-				for _, v2 := range listUser {
-					if v2.OutboundMobile == v.Mobile {
-						needAddAttendanc[k].CompanyId = v2.CompanyId
-						needAddAttendanc[k].SellerName = v2.SellerName
-						needAddAttendanc[k].CompanyName = v2.CompanyName
-						needAddAttendanc[k].IsMeetingStr = 1
+				for k, v := range needAddAttendanc {
+					for _, v2 := range listUser {
+						if v2.OutboundMobile == v.Mobile {
+							needAddAttendanc[k].CompanyId = v2.CompanyId
+							needAddAttendanc[k].SellerName = v2.SellerName
+							needAddAttendanc[k].CompanyName = v2.CompanyName
+							needAddAttendanc[k].IsMeetingStr = 1
+						}
 					}
 				}
-			}
-			err = cygx.AddAttendancDetail(needAddAttendanc, activityId, mobileStr)
-			if err != nil {
+				err = cygx.AddAttendancDetail(needAddAttendanc, activityId, mobileStr)
+				if err != nil {
+					br.Msg = "手动归类失败"
+					br.ErrMsg = "手动归类失败,Err:" + err.Error() + "activityId:" + strconv.Itoa(activityId)
+					return
+				}
+				go cygxService.AddCygxActivityRestrictSignupByAdmin(activityId)
+				go cygx.AddCygxActivityMeetDetailLogOnline(needAddAttendanc, activityId)
+				go cygxService.ActivityUserLabelLogAdd(activityId, userIdArr)                 //添加用户活动到会标签到Redis
+				go cygxService.AddctivitySignupDetailListByHand(needAddAttendanc, activityId) //手动匹配进门财经信息
+			} else {
 				br.Msg = "手动归类失败"
-				br.ErrMsg = "手动归类失败,Err:" + err.Error() + "activityId:" + strconv.Itoa(activityId)
+				br.ErrMsg = "暂未找到匹配数据!"
 				return
 			}
-			go cygxService.AddCygxActivityRestrictSignupByAdmin(activityId)
-			go cygx.AddCygxActivityMeetDetailLogOnline(needAddAttendanc, activityId)
-			go cygxService.ActivityUserLabelLogAdd(activityId, userIdArr)                 //添加用户活动到会标签到Redis
-			go cygxService.AddctivitySignupDetailListByHand(needAddAttendanc, activityId) //手动匹配进门财经信息
-		} else {
-			br.Msg = "手动归类失败"
-			br.ErrMsg = "暂未找到匹配数据!"
-			return
 		}
 	}
 	//添加操作日志记录

+ 4 - 0
controllers/cygx/apply_record.go

@@ -212,6 +212,10 @@ func (this *ApplyRecordController) ListSysRole() {
 			list[i].HttpUrl = utils.CYGX_WEB_URL + "/recent/" + strconv.Itoa(v.SourceId)
 		case "yanxuanspecial": //研选专栏
 			list[i].HttpUrl = utils.CYGX_WEB_URL + "/column/detail/" + strconv.Itoa(v.SourceId)
+		case utils.CYGX_OBJ_FICC_REPORT: //FICC研报
+			list[i].HttpUrl = utils.CYGX_WEB_URL + "/material/ricc/yb/report/" + strconv.Itoa(v.SourceId)
+		case utils.CYGX_OBJ_FICC_REPORT_XCX: //FICC研报
+			list[i].IsGray = true
 		}
 	}
 

+ 476 - 0
controllers/cygx/gushou_time_line.go

@@ -0,0 +1,476 @@
+package cygx
+
+import (
+	"encoding/json"
+	"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"
+	cygxService "hongze/hz_crm_api/services/cygx"
+	"hongze/hz_crm_api/utils"
+	"os"
+	"path/filepath"
+	"strconv"
+	"time"
+)
+
+// 固收时间线
+type GushouTimeLineController struct {
+	controllers.BaseAuthController
+}
+
+// @Title 新增固收时间线
+// @Description 新增固收时间线接口
+// @Param	request	body cygx.AddGushouTimeLineReq true "type json string"
+// @Success 200 {object} "保存成功"
+// @router /gushouTimeLine/preserveAndPublish [post]
+func (this *GushouTimeLineController) PreserveAndPublish() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req cygx.AddGushouTimeLineReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	publishTime := utils.StrDateToDate(req.PublishTime) //时间字符串格式转时间格式
+	timeLineId := req.TimeLineId
+	link := req.Link
+	articleId, chartId := cygxService.HandleTacticsTimeLinLink(link)
+	item := new(cygx.CygxGushouTimeLine)
+	item.PublishTime = publishTime
+	item.CreateTime = time.Now()
+	item.ModifyTime = time.Now()
+	item.Content = req.Content
+	item.Link = req.Link
+	item.AdminId = sysUser.AdminId
+	if articleId > 0 {
+		item.ArticleId = articleId
+	}
+	if chartId > 0 {
+		item.ChartId = chartId
+	}
+	if timeLineId == 0 {
+		//新增
+		err = cygx.AddCygxGushouTimeLine(item)
+	} else {
+		//更新
+		item.TimeLineId = timeLineId
+		err = cygx.UpdateCygxGushouTimeLine(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   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   Status   query   int  false       "发布状态 ,1未发布,1已发布,传2查询所有"
+// @Success Ret=200 {object} cygx.GetCygxGushouTimeLineResp
+// @router /gushouTimeLine/list [get]
+func (this *GushouTimeLineController) List() {
+	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
+	}
+	resp := new(cygx.GetCygxGushouTimeLineResp)
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	status, _ := this.GetInt("Status")
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+	var condition string
+	var pars []interface{}
+	if status == 0 || status == 1 {
+		condition += ` AND art.status = ? `
+		pars = append(pars, status)
+	}
+	total, err := cygx.GetCygxGushouTimeLineCount(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	condition += "	ORDER BY art.publish_time DESC , art.time_line_id DESC "
+	list, err := cygx.GetCygxGushouTimeLineList(condition, pars, startSize, pageSize)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	var TimeLineIds []int
+	var ArticleIds []int
+	var ChartIds []int
+	for _, v := range list {
+		v.PublishTime = utils.TimeRemoveHms(v.PublishTime)
+		TimeLineIds = append(TimeLineIds, v.TimeLineId)
+		if v.ArticleId > 0 {
+			ArticleIds = append(ArticleIds, v.ArticleId)
+		}
+		if v.ChartId > 0 {
+			ChartIds = append(ChartIds, v.ChartId)
+		}
+	}
+	//获取关联的文章map
+	articleTitleMap := make(map[int]string)
+	if len(ArticleIds) > 0 {
+		articleTitleMap = cygxService.GetArticleTitleMapByid(ArticleIds)
+	}
+
+	chartTitleMap := make(map[int]string)
+	if len(ChartIds) > 0 {
+		chartTitleMap = cygxService.GetChartTitleMapByid(ChartIds)
+	}
+	//获取pv/Uv map
+	mapPv, mapUv := cygxService.GetCygxGushouTimeLineHistoryListMap(TimeLineIds)
+	for _, v := range list {
+		v.Pv = mapPv[v.TimeLineId]
+		v.Uv = mapUv[v.TimeLineId]
+		if v.ArticleId > 0 {
+			v.Title = articleTitleMap[v.ArticleId]
+		}
+		if v.ChartId > 0 {
+			v.Title = chartTitleMap[v.ChartId]
+		}
+	}
+	detail, err := cygx.GetCygxConfigDetailByCode(utils.CYGX_GUSHOU_TIME_LINE_STATUS)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	resp.Status, _ = strconv.Atoi(detail.ConfigValue)
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp.List = list
+	resp.Paging = page
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title  详情
+// @Description 获取详情接口
+// @Param   TimeLineId   query   int  true       "时间线ID"
+// @Success Ret=200 {object} cygx.ActivitySpecialDetail
+// @router /gushouTimeLine/detail [get]
+func (this *GushouTimeLineController) 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
+	}
+	resp := new(cygx.GetCygxGushouTimeLineDetailResp)
+	timeLineId, _ := this.GetInt("TimeLineId")
+	if timeLineId < 1 {
+		br.Msg = "请输入详情ID"
+		return
+	}
+	detail, err := cygx.GetCygxGushouTimeLineDetail(timeLineId)
+	if err != nil {
+		br.Msg = "详情不存在"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	detail.PublishTime = utils.TimeRemoveHms(detail.PublishTime)
+	resp.Detail = detail
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title  删除
+// @Description 获取详情接口
+// @Param	request	body cygx.GushouTimeLineTimeLineIdReq true "type json string"
+// @Success 200 {object} "操作成功"
+// @router /gushouTimeLine/delete [POST]
+func (this *GushouTimeLineController) Delete() {
+	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
+	}
+	var req cygx.GushouTimeLineTimeLineIdReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	timeLineId := req.TimeLineId
+	if timeLineId == 0 {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误,id不可为空"
+		return
+	}
+	err = cygx.DeleteCygxGushouTimeLine(timeLineId)
+	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.GushouTimeLineTimeLineIdReq true "type json string"
+// @Success 200 Ret=200 发布成功
+// @router /gushouTimeLine/publishAndcancel [post]
+func (this *GushouTimeLineController) PublishReport() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req cygx.GushouTimeLineTimeLineIdReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	timeLineId := req.TimeLineId
+	if timeLineId == 0 {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误,id不可为空"
+		return
+	}
+	detail, err := cygx.GetCygxGushouTimeLineDetail(timeLineId)
+	if err != nil {
+		br.Msg = "详情不存在"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	var status int
+	if detail.Status == 0 {
+		status = 1
+	} else {
+		status = 0
+	}
+	err = cygx.EditCygxGushouTimeLineStatus(status, timeLineId)
+	if err != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.IsAddLog = true
+	br.Msg = "操作成功"
+}
+
+// @Title 一键发布/取消发布报告接口
+// @Description 一键发布/取消发布报告
+// @Success 200 Ret=200 取消发布成功
+// @router /gushouTimeLine/all/publishAndcancel [post]
+func (this *GushouTimeLineController) PublishCancleReport() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	detail, err := cygx.GetCygxConfigDetailByCode(utils.CYGX_GUSHOU_TIME_LINE_STATUS)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	var status int
+	if detail.ConfigValue == "0" {
+		status = 1
+	} else {
+		status = 0
+	}
+	err = cygx.EditCygxGushouTimeLineStatusAll(status)
+	if err != nil {
+		br.Msg = "修改失败"
+		br.ErrMsg = "修改失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.IsAddLog = true
+	br.Msg = "操作成功"
+}
+
+// @Title  下载PV
+// @Description 下载PV接口
+// @Param   TimeLineId   query   int  true       "时间线ID"
+// @router /gushouTimeLine/PvExport [get]
+func (this *GushouTimeLineController) PvExport() {
+	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
+	}
+	timeLineId, _ := this.GetInt("TimeLineId")
+	if timeLineId < 1 {
+		br.Msg = "请输入详情ID"
+		return
+	}
+	var condition string
+	var pars []interface{}
+	condition = ` AND time_line_id = ? `
+	pars = append(pars, timeLineId)
+	var respList []*cygx.CygxGushouTimeLineHistory
+	//respList := new(cygx.CygxGushouTimeLineHistory)
+	list, err := cygx.GetCygxGushouTimeLineHistoryList(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	//超级管理员和权益管理员、权益研究员可以下载所有客户,销售组长能下载本组客户,销售只能下载本人名下客户
+	resp := new(cygx.CanDownload)
+	adminInfo, errAdmin := system.GetSysUserById(AdminUser.AdminId)
+	if errAdmin != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + errAdmin.Error()
+		return
+	}
+	if adminInfo.Role == "admin" || adminInfo.Role == "researcher" {
+		resp.IsCanDownload = true
+	}
+	//销售查看自己客户,销售组长查看组员
+	if resp.IsCanDownload == false {
+		mapMobile, err := cygxService.GetAdminLookUserMobile(adminInfo)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,销售对应权限,Err:" + err.Error()
+			return
+		}
+		for _, v := range list {
+			if _, ok := mapMobile[v.Mobile]; ok {
+				respList = append(respList, v)
+			}
+		}
+	} else {
+		respList = list
+	}
+
+	//创建excel
+	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
+	sheet, err := xlsxFile.AddSheet("阅读明细")
+	if err != nil {
+		br.Msg = "新增Sheet失败"
+		br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
+		return
+	}
+	rowTitle := sheet.AddRow()
+	cellA := rowTitle.AddCell()
+	cellA.Value = "姓名"
+	cellB := rowTitle.AddCell()
+	cellB.Value = "手机号"
+	cellC := rowTitle.AddCell()
+	cellC.Value = "公司名称"
+	cellD := rowTitle.AddCell()
+	cellD.Value = "所属权益销售"
+	cellE := rowTitle.AddCell()
+	cellE.Value = "点击时间"
+
+	for _, item := range respList {
+		row := sheet.AddRow()
+		cellA := row.AddCell()
+		cellA.Value = item.RealName
+		cellB := row.AddCell()
+		cellB.Value = item.Mobile
+		cellC := row.AddCell()
+		cellC.Value = item.CompanyName
+		cellD := row.AddCell()
+		cellD.Value = item.SellerName
+		cellE := row.AddCell()
+		cellE.Value = item.CreateTime.Format(utils.FormatDateTime)
+	}
+	err = xlsxFile.Save(downLoadnFilePath)
+	if err != nil {
+		br.Msg = "保存文件失败"
+		br.ErrMsg = "保存文件失败"
+		return
+	}
+	downloadFileName := time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
+	this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
+	defer func() {
+		os.Remove(downLoadnFilePath)
+	}()
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}

+ 1 - 1
controllers/cygx/industrial_management.go

@@ -102,7 +102,7 @@ func (this *IndustrialManagementController) ChartPermissionListIco() {
 	if havestrategy > 0 {
 		condition = ` AND chart_permission_id IN (19,20,21,22,23) `
 	} else {
-		condition = ` AND chart_permission_id IN (19,20,21,22) `
+		condition = ` AND chart_permission_id IN (19,20,21,22) OR ( chart_permission_name = '周期'  AND product_id = 2 )   `
 	}
 	list, err := cygx.GetChartPermissionIco(condition)
 	if err != nil {

+ 61 - 0
controllers/cygx/industrial_subject.go

@@ -628,3 +628,64 @@ func (this *IndustrialSubjectController) CountDetail() {
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// @Title 通过行业获取关联标的列表
+// @Description 通过行业获取关联标的列表接口
+// @Param   KeyWord   query   string  false       "搜索关键词"
+// @Param   ChartPermissionId   query   int  true       "分类ID"
+// @Success Ret=200  {object} cygx.CygxIndustrialSubjectList
+// @router /industrialAndSubject/search [get]
+func (this *IndustrialSubjectController) IndustrialAndSubjectSearch() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var condition string
+	keyWord := this.GetString("KeyWord")
+	chartPermissionId, _ := this.GetInt("ChartPermissionId")
+	if keyWord != "" {
+		condition = ` AND s.subject_name LIKE '%` + keyWord + `%'  `
+	}
+	if chartPermissionId > 0 {
+		condition += ` AND m.chart_permission_id = ` + strconv.Itoa(chartPermissionId)
+	}
+	listSubject, err := cygx.GetIndustrialSubjectListNameByChartId(condition)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	condition = ` AND industry_name LIKE '%` + keyWord + `%'  AND  chart_permission_id = ` + strconv.Itoa(chartPermissionId)
+	listIndustrial, err := cygx.GetIndustrialManagement(condition)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	listResp := make([]*cygx.CygxIndustrialSubjectListRep, 0)
+	for _, v := range listIndustrial {
+		item := new(cygx.CygxIndustrialSubjectListRep)
+		item.IndustryName = v.IndustryName
+		item.IndustrialManagementId = v.IndustrialManagementId
+		item.ShowName = v.IndustryName
+		listResp = append(listResp, item)
+	}
+	for _, v := range listSubject {
+		v.ShowName = v.SubjectName
+		listResp = append(listResp, v)
+	}
+	resp := new(cygx.CygxIndustrialSubjectList)
+	resp.List = listResp
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 6 - 2
controllers/cygx/morning_meeting_review.go

@@ -256,6 +256,7 @@ func (this *MorningMeetingController) PreserveAndPublish() {
 		} else {
 			for _, item := range reqList.List {
 				go services.SendWxMsgWithCygxMorningMeeting(int(meetingId), item.IndustryId, item.IndustryName)
+				go cygxService.UpdateIndustrialManagementTimeLineDateList3ByRedis(item.IndustryId) //处理产业管理时间线相关内容的数据
 			}
 			//添加到首页最新
 			listchapter, err := cygx.GetCygxMorningMeetingReviewsListById(int(meetingId))
@@ -440,6 +441,7 @@ func (this *MorningMeetingController) PreserveAndPublish() {
 		} else {
 			for _, item := range reqList.List {
 				go services.SendWxMsgWithCygxMorningMeeting(reqList.MeetingId, item.IndustryId, item.IndustryName)
+				go cygxService.UpdateIndustrialManagementTimeLineDateList3ByRedis(item.IndustryId) //处理产业管理时间线相关内容的数据
 			}
 			for _, itemchapter := range listchapter {
 				//go cygxService.UpdateResourceData(itemchapter.Id, "meetingreviewchapt", "add", time.Now().Format(utils.FormatDateTime))
@@ -599,6 +601,7 @@ func (this *MorningMeetingController) PublishReport() {
 		for _, item := range list {
 			fmt.Println(item.Id)
 			go services.SendWxMsgWithCygxMorningMeeting(vint, item.IndustryId, item.IndustryName)
+			go cygxService.UpdateIndustrialManagementTimeLineDateList3ByRedis(item.IndustryId) //处理产业管理时间线相关内容的数据
 			//go cygxService.UpdateResourceData(item.Id, "meetingreviewchapt", "add", time.Now().Format(utils.FormatDateTime))
 			go cygxService.UpdateMeetingreviewchaptResourceData(item.Id) //写入首页最新  cygx_resource_data 表
 			go elastic.AddComprehensiveMeetingreviewchapt(item.Id)       //Es添加晨会精华
@@ -648,8 +651,9 @@ func (this *MorningMeetingController) PublishCancleReport() {
 	}
 	for _, item := range list {
 		//go cygxService.UpdateResourceData(item.Id, "meetingreviewchapt", "delete", time.Now().Format(utils.FormatDateTime))
-		go cygxService.UpdateMeetingreviewchaptResourceData(item.Id) //写入首页最新  cygx_resource_data 表
-		go elastic.DeleteComprehensiveMeetingreviewchapt(item.Id)    //Es删除晨会精华
+		go cygxService.UpdateMeetingreviewchaptResourceData(item.Id)                       //写入首页最新  cygx_resource_data 表
+		go elastic.DeleteComprehensiveMeetingreviewchapt(item.Id)                          //Es删除晨会精华
+		go cygxService.UpdateIndustrialManagementTimeLineDateList3ByRedis(item.IndustryId) //处理产业管理时间线相关内容的数据
 	}
 	var condition string
 	var pars []interface{}

+ 175 - 11
controllers/cygx/rai_serve.go

@@ -1,12 +1,14 @@
 package cygx
 
 import (
+	"encoding/json"
 	"errors"
 	"fmt"
 	"github.com/rdlucklib/rdluck_tools/paging"
 	"github.com/tealeg/xlsx"
 	"hongze/hz_crm_api/controllers"
 	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/company"
 	"hongze/hz_crm_api/models/cygx"
 	"hongze/hz_crm_api/models/roadshow"
 	cygxService "hongze/hz_crm_api/services/cygx"
@@ -80,7 +82,14 @@ func (this *RaiServeCoAntroller) SearchTag() {
 	}
 
 	resp := new(cygx.RaiServeTagListResp)
-	list, err := cygx.GetRaiServeSearchTagRespList(keyWord)
+	var chartPermissionId string
+
+	if utils.RunMode == "release" {
+		chartPermissionId = "19, 20, 21, 22 ,62 "
+	} else {
+		chartPermissionId = "19, 20, 21, 22 ,148 "
+	}
+	list, err := cygx.GetRaiServeSearchTagRespList(keyWord, chartPermissionId)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
@@ -166,7 +175,7 @@ func (this *RaiServeCoAntroller) SearchTagCalendar() {
 			hasCelue = true
 		}
 	}
-
+	permissionName = append(permissionName, utils.ZHOU_QI_NAME) //所有行业默认添加周期行业
 	var permissionNameSql []string
 	for _, v := range permissionName {
 		permissionNameSql = append(permissionNameSql, "'"+v+"'")
@@ -314,6 +323,7 @@ func (this *RaiServeCoAntroller) ChcckPermissionName() {
 // @Param   TagId   int   string  false       "标签ID"
 // @Param   Status   query   string  false       "客户状态,正式、未续约(除了正式之外的所有)"
 // @Param   SortType   query   string  true       "如何排序,是正序还是倒序,枚举值:`asc 正序`,`desc 倒叙`"
+// @Param   SortParam   query   string  false       "排序字段参数,用来排序的字段, 枚举值:'money':金额 、 'endDate':结束时间"
 // @Param   KeyWord   query   string  false       "搜索关键词"
 // @Param   IsExport   query   bool  false       "是否导出excel,默认是false"
 // @Success 200 {object} cygx.RaiServeTagListResp
@@ -337,6 +347,8 @@ func (this *RaiServeCoAntroller) List() {
 	status := this.GetString("Status")
 	sellerId := this.GetString("SellerId")
 	shareSellerId := this.GetString("ShareSellerId")
+	//排序参数
+	sortParam := this.GetString("SortParam")
 	sortType := this.GetString("SortType")
 	tagType, _ := this.GetInt("TagType")
 	tagId, _ := this.GetInt("TagId")
@@ -377,11 +389,17 @@ func (this *RaiServeCoAntroller) List() {
 		//pars = append(pars, shareSellerId)
 	}
 
-	if sortType != "" {
+	if sortType != "" && sortParam != "" {
+		if sortParam == "money" {
+			sortStr = " ORDER BY money   "
+		}
+		if sortParam == "endDate" {
+			sortStr = " ORDER BY end_date   "
+		}
 		if sortType == "asc" {
-			sortStr = " ORDER BY money  ASC "
-		} else if sortType == "desc" {
-			sortStr = " ORDER BY money DESC "
+			sortStr += " ASC "
+		} else {
+			sortStr += " DESC "
 		}
 	} else {
 		sortStr = " ORDER BY end_date DESC "
@@ -485,9 +503,7 @@ func (this *RaiServeCoAntroller) List() {
 		item.ShareSellerId = v.ShareSellerId
 		item.Status = v.Status
 		item.PermissionName = v.PermissionName
-		if v.IsUserMaker == 0 {
-			item.IsRed = true
-		}
+		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)]
@@ -579,7 +595,7 @@ func RaiServeListExport(this *RaiServeCoAntroller, resp *cygx.CygxRaiServeCompan
 
 	cellD := titleRow.AddCell()
 	cellD.SetStyle(style)
-	cellD.SetValue("咨询销售")
+	cellD.SetValue("服务销售")
 
 	cellE := titleRow.AddCell()
 	cellE.SetStyle(style)
@@ -624,7 +640,7 @@ func RaiServeListExport(this *RaiServeCoAntroller, resp *cygx.CygxRaiServeCompan
 		dataRow.SetHeight(20)
 
 		cellA := dataRow.AddCell()
-		if v.IsRed {
+		if v.IsUserMaker == -1 {
 			cellA.SetStyle(redStyle)
 		} else {
 			cellA.SetStyle(style)
@@ -1034,3 +1050,151 @@ func (this *RaiServeCoAntroller) BillList() {
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// AddCompanyHistoryRemark
+// @Title 新增历史备注
+// @Description 新增历史备注
+// @Param	request	body company.CompanyHistoryRemarkReq true "type json string"
+// @Success 200 编辑成功
+// @router /rai_serve/remark/add [post]
+func (this *RaiServeCoAntroller) AddRemark() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req company.CompanyHistoryRemarkReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.CompanyId <= 0 {
+		br.Msg = "参数缺失"
+		br.ErrMsg = "参数缺失,客户编号未传!"
+		return
+	}
+	if req.Content == "" {
+		br.Msg = "参数缺失"
+		br.ErrMsg = "参数缺失,备注说明未传!"
+		return
+	}
+	var productId int
+	//var productName string
+	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_SELLER || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_TEAM || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_GROUP {
+		br.Msg = "角色类型错误"
+		br.ErrMsg = "角色类型错误,该角色不能添加备注!"
+		return
+	}
+	productId = 2
+
+	item := new(company.CompanyHistoryRemark)
+	item.CompanyId = req.CompanyId
+	item.ProductId = productId
+	item.Content = req.Content
+	item.SysAdminId = sysUser.AdminId
+	item.SysAdminName = sysUser.RealName
+	item.CreateTime = time.Now()
+	item.ModifyTime = time.Now()
+	item.ShowTime = time.Now()
+	item.TableName = "company_history_remark"
+
+	err = company.AddCompanyHistoryRemark(item)
+
+	//{
+	//	approveContent := req.Remark
+	//	remark := "新增备注"
+	//	operation := "add_remark"
+	//	services.AddCompanyOperationRecord(req.CompanyId, companyProduct.SellerId, sysUser.AdminId, companyProduct.ProductId, sysUser.AdminId, companyProduct.CompanyName,
+	//		companyProduct.ProductName, sysUser.RealName, remark, operation, approveContent, sysUser.RealName, "", companyProduct.Status)
+	//}
+
+	if err != nil {
+		br.Msg = "编辑失败"
+		br.ErrMsg = "编辑失败,Err:" + err.Error()
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "编辑成功"
+}
+
+// RemarkList 备注列表
+// @Title 备注列表
+// @Description 备注列表
+// @Param   CompanyId   query   string  true       "客户id"
+// @Success 200 {object} company.RemarkResp
+// @router /rai_serve/remark/list [get]
+func (this *RaiServeCoAntroller) RemarkList() {
+	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
+	}
+
+	companyId := this.GetString("CompanyId")
+	var remarkList []*company.CompanyHistoryRemark
+	var err error
+
+	groupFicc := []string{
+		utils.ROLE_TYPE_CODE_FICC_SELLER, utils.ROLE_TYPE_CODE_FICC_TEAM, utils.ROLE_TYPE_CODE_FICC_GROUP,
+		utils.ROLE_TYPE_CODE_FICC_DEPARTMENT, utils.ROLE_TYPE_CODE_FICC_ADMIN,
+	}
+
+	if utils.InArrayByStr(groupFicc, sysUser.RoleTypeCode) {
+		br.Msg = "角色类型错误"
+		br.ErrMsg = "角色类型错误,该角色不能添加备注!"
+		return
+	}
+
+	remarkList, err = company.GetCompanyHistoryRemarkList(companyId, "2")
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	resp := new(company.CompanyHistoryRemarkListResp)
+	for _, v := range remarkList {
+		item := new(company.CompanyHistoryRemarkResp)
+		item.CompanyId = v.CompanyId
+		item.Content = v.Content
+		item.SysAdminName = v.SysAdminName
+		item.CreateTime = v.ShowTime.Format(utils.FormatDateTime)
+		switch v.TableName {
+		case "company_service_record":
+			item.RemarkType = "沟通记录"
+		case "company_product_remark":
+			item.RemarkType = "备注"
+		case "company_no_renewed_note":
+			item.RemarkType = "未续约备注"
+		case "company_renewal_reason":
+			item.RemarkType = "未续约说明"
+		case "cygx_user_feedback":
+			item.RemarkType = "交流反馈(" + v.RealName + ")"
+		default:
+			item.RemarkType = "备注"
+		}
+		resp.List = append(resp.List, item)
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 8 - 0
controllers/cygx/report_article.go

@@ -240,6 +240,7 @@ func (this *ReportArticleController) ReportArticleList() {
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
+	//return
 	condition += `	GROUP BY art.article_id  ORDER BY art.publish_date DESC `
 	//fmt.Println(condition)
 	list, err := cygx.GetReportArticleList(condition, pars, startSize, pageSize, isClass)
@@ -369,6 +370,13 @@ func (this *ReportArticleController) ReportArticleList() {
 		list[k].CommentNum = mapCommment[v.ArticleId]
 		list[k].ListIndustrial = mapIndustrialList[v.ArticleId]
 		list[k].ListSubject = mapSubjectList[v.ArticleId]
+
+		if v.ReportId > 0 {
+			list[k].HttpUrl = utils.CYGX_WEB_URL + "/material/ricc/yb/report/" + strconv.Itoa(v.ReportId)
+		} else {
+			list[k].HttpUrl = utils.CYGX_WEB_URL + "/material/info/" + strconv.Itoa(v.ArticleId)
+			list[k].ReportId = v.Id
+		}
 	}
 	page := paging.GetPaging(currentIndex, pageSize, total)
 	resp := new(cygx.GetReportArticleListRep)

+ 142 - 42
controllers/cygx/report_selection.go

@@ -123,6 +123,12 @@ func (this *ReportSelectionController) PreserveAndPublish() {
 		item.IndustrialSubjectId = v.IndustrialSubjectId
 		item.SubjectName = v.IndustrialSubjectName
 		item.IndustrialManagementId = v.IndustrialManagementId
+		item.IndustrialManagementNames = v.IndustrialManagementName
+		if v.IndustrialManagementNames != "" {
+			item.IndustrialManagementNames = v.IndustrialManagementNames
+		}
+		item.ThirdId = v.ThirdId
+		item.ThirdName = v.ThirdName
 		item.OverviewArticleId = v.OverviewArticleId
 		item.IsNew = v.IsNew
 		item.IsShowOverviewArticle = v.IsShowOverviewArticle
@@ -394,23 +400,37 @@ func (this *ReportSelectionController) Detail() {
 			return
 		}
 		for kIndustrial, vIndustrial := range listSon {
+			var industrialNames string
 			//如果报告精选关联的产业被删除了 则做以下处理
-			//if vIndustrial.IndustrialManagementName == "" {
-			industrialNames, err := cygx.GetindustrialManagementNamesBySubjectName(vIndustrial.IndustrialSubjectName, vIndustrial.ChartPermissionId)
-			if err != nil {
-				br.Msg = "获取失败!"
-				br.ErrMsg = "获取删除删除之后的产业失败,Err:" + err.Error() + vIndustrial.IndustrialSubjectId
-				return
+			if vIndustrial.IndustrialSubjectName == "" {
+				industrialNames = vIndustrial.IndustrialManagementNames
+			} else {
+				industrialNames, err = cygx.GetindustrialManagementNamesBySubjectName(vIndustrial.IndustrialSubjectName, vIndustrial.ChartPermissionId)
+				if err != nil {
+					br.Msg = "获取失败!"
+					br.ErrMsg = "获取删除删除之后的产业失败,Err:" + err.Error() + vIndustrial.IndustrialSubjectId
+					return
+				}
 			}
+
 			if vIndustrial.Label != "" {
 				vIndustrial.CompanyLabel = strings.Split(vIndustrial.Label, "{|}")
 			}
 			listSon[kIndustrial].IndustrialManagementName = industrialNames
+			listSon[kIndustrial].IndustrialManagementNames = industrialNames
 			listSon[kIndustrial].OverviewArticleId = articleStockMap[vIndustrial.IndustrialSubjectName]
 			listSon[kIndustrial].OverviewArticleTitle = mapArticle[listSon[kIndustrial].OverviewArticleId]
 			if periods != "" {
 				listSon[kIndustrial].IsNew = 0
 			}
+
+			if vIndustrial.ThirdName != "" {
+				listSon[kIndustrial].ShowName = vIndustrial.ThirdName
+			} else if vIndustrial.SubjectName == "" {
+				listSon[kIndustrial].ShowName = vIndustrial.IndustrialManagementNames
+			} else {
+				listSon[kIndustrial].ShowName = vIndustrial.SubjectName
+			}
 		}
 		list[k].List = listSon
 		list[k].BodyChartSummary = mapChartLog[v.ChartPermissionName]
@@ -654,6 +674,8 @@ func (this *ReportSelectionController) ListPeriods() {
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
+
+	condition += `	GROUP BY  periods `
 	list, err := cygx.GetReportSelectionListPeriods(condition, pars, startSize, pageSize)
 	if err != nil {
 		br.Msg = "获取失败"
@@ -849,41 +871,40 @@ func (this *ReportSelectionController) GetArticle() {
 		br.ErrMsg = "请登录,SysUser Is Empty"
 		return
 	}
-	industrialSubjectId, _ := this.GetInt("IndustrialSubjectId")
-	if industrialSubjectId < 1 {
-		br.Msg = "请输入标的ID"
-		return
-	}
-	detailSubjecj, err := cygx.GetIndustrialSubjectDetailById(industrialSubjectId)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		br.Msg = "获取信息失败"
-		br.ErrMsg = "获取品种信息失败,Err:" + err.Error()
-		return
-	}
 	resp := new(cygx.OverviewArticle)
-	if detailSubjecj != nil {
-		var pars []interface{}
-		conditionArticle := `  AND type_name = '综述报告'  AND  stock LIKE ? `
-		subjectName := "%" + detailSubjecj.SubjectName + "%"
-		pars = append(pars, subjectName)
-		articleList, err := cygx.GetCygxArticleList(conditionArticle, pars, 0, 10)
-		if err != nil {
-			br.Msg = "获取失败"
-			br.ErrMsg = "GetCygxArticleList,Err:" + err.Error()
+	industrialSubjectId, _ := this.GetInt("IndustrialSubjectId")
+	if industrialSubjectId > 0 {
+		detailSubjecj, err := cygx.GetIndustrialSubjectDetailById(industrialSubjectId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取品种信息失败,Err:" + err.Error()
 			return
 		}
-		//一对一精准匹配
-		for _, v := range articleList {
-			sliceSubjects := strings.Split(v.Stock, "/")
-			if len(sliceSubjects) > 0 {
-				for _, vSubject := range sliceSubjects {
-					sliceKuohao := strings.Split(vSubject, "(")           //过滤括号
-					sliceXiahuaxian := strings.Split(sliceKuohao[0], "-") //过滤下划线
-					subject := sliceXiahuaxian[0]
-					if subject == detailSubjecj.SubjectName {
-						resp.ArticleId = v.ArticleId
-						resp.Title = v.Title
-						continue
+
+		if detailSubjecj != nil {
+			var pars []interface{}
+			conditionArticle := `  AND type_name = '综述报告'  AND  stock LIKE ? `
+			subjectName := "%" + detailSubjecj.SubjectName + "%"
+			pars = append(pars, subjectName)
+			articleList, err := cygx.GetCygxArticleList(conditionArticle, pars, 0, 10)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "GetCygxArticleList,Err:" + err.Error()
+				return
+			}
+			//一对一精准匹配
+			for _, v := range articleList {
+				sliceSubjects := strings.Split(v.Stock, "/")
+				if len(sliceSubjects) > 0 {
+					for _, vSubject := range sliceSubjects {
+						sliceKuohao := strings.Split(vSubject, "(")           //过滤括号
+						sliceXiahuaxian := strings.Split(sliceKuohao[0], "-") //过滤下划线
+						subject := sliceXiahuaxian[0]
+						if subject == detailSubjecj.SubjectName {
+							resp.ArticleId = v.ArticleId
+							resp.Title = v.Title
+							continue
+						}
 					}
 				}
 			}
@@ -1009,9 +1030,17 @@ func (this *ReportSelectionController) History() {
 		br.ErrMsg = "GetCygxReportSelectionSubjectHistoryList,Err:" + err.Error()
 		return
 	}
-	mapSubjectHistory := make(map[string]int)
+	mapSubjectHistory := make(map[string]int)    // 标的点击数量
+	mapIndustrialHistory := make(map[string]int) // 产业点击数量
+	mapThirdIdHistory := make(map[int]int)       // 三方产业点击数量
 	for _, v := range listSelectionSubjectHistory {
+		if v.ThirdId > 0 {
+			mapThirdIdHistory[v.ThirdId]++
+		}
 		mapSubjectHistory[v.IndustrialSubjectId]++
+		if v.IndustrialSubjectId == "0" && v.IndustrialManagementId > 0 {
+			mapIndustrialHistory[strconv.Itoa(v.IndustrialManagementId)]++
+		}
 	}
 
 	//排序方式修改
@@ -1021,10 +1050,18 @@ func (this *ReportSelectionController) History() {
 		for _, v2 := range listSelectionLog {
 			if v.ChartPermissionName == v2.PermissionName {
 				item := new(cygx.HistoryReportSelectionLogResp)
-				item.SubjectName = v2.SubjectName
-				item.IndustrialSubjectId = v2.IndustrialSubjectId
+				if v2.ThirdId > 0 {
+					item.SubjectName = v2.ThirdName
+					item.Count = mapThirdIdHistory[v2.ThirdId]
+				} else if (v2.IndustrialSubjectId == "" || v2.IndustrialSubjectId == "0") && v2.IndustrialManagementId != "" {
+					item.SubjectName = v2.IndustrialManagementNames
+					item.Count = mapIndustrialHistory[v2.IndustrialManagementId]
+				} else {
+					item.SubjectName = v2.SubjectName
+					item.IndustrialSubjectId = v2.IndustrialSubjectId
+					item.Count = mapSubjectHistory[v2.IndustrialSubjectId]
+				}
 				item.IsNew = v2.IsNew
-				item.Count = mapSubjectHistory[v2.IndustrialSubjectId]
 				resp.Count += item.Count
 				v.List = append(v.List, item)
 			}
@@ -1076,3 +1113,66 @@ func (this *ReportSelectionController) RarryList() {
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// @Title   添加三方名称
+// @Description   添加三方名称接口
+// @Param	request	body cygx.AddReportSelectionThirdNameReq true "type json string"
+// @Success Ret=200 {object} cygx.AddReportSelectionThirdNameResp
+// @router /reportSelection/add/third_name [post]
+func (this *ReportSelectionController) AddThirdName() {
+	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
+	}
+	var req cygx.AddReportSelectionThirdNameReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	thirdName := req.ThirdName
+	chartPermissionId := req.ChartPermissionId
+	if thirdName == "" {
+		br.Msg = "名称不能为空"
+		return
+	}
+
+	// 品种信息
+	chartPermission, err := models.GetChartPermissionById(chartPermissionId)
+	if err != nil {
+		br.Msg = "品种信息有误"
+		br.ErrMsg = "获取品种信息失败,Err:" + err.Error()
+		return
+	}
+
+	item := new(cygx.CygxReportSelectionThirdName)
+	item.ThirdName = thirdName
+	item.ChartPermissionId = chartPermissionId
+	item.ChartPermissionName = chartPermission.ChartPermissionName
+	item.CreateTime = time.Now()
+
+	newId, err := cygx.AddCygxReportSelectionThirdName(item)
+	if err != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "操作失败,Err:" + err.Error()
+		return
+	}
+	resp := new(cygx.AddReportSelectionThirdNameResp)
+	resp.ThirdName = thirdName
+	resp.ThirdId = fmt.Sprint(newId)
+	br.Ret = 200
+	br.Data = resp
+	br.Success = true
+	br.Msg = "操作成功"
+	br.IsAddLog = true
+}

+ 610 - 197
controllers/cygx/user.go

@@ -114,199 +114,6 @@ func (this *UserController) List() {
 	//流失客户统计
 	lossCondition += ` AND status='流失' `
 
-	//productId := services.GetProductId(roleTypeCode)
-	//productId := 2
-	//权限控制
-	//{
-	//	//如果不是超级管理员或者财务
-	//	if roleTypeCode != utils.ROLE_TYPE_CODE_ADMIN && roleTypeCode != utils.ROLE_TYPE_CODE_FINANCE {
-	//		//如果是部门管理员
-	//		if roleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN || roleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN {
-	//			condition += ` AND b.product_id= '` + strconv.Itoa(productId) + `'`
-	//
-	//			lossCondition += ` AND b.product_id= '` + strconv.Itoa(productId) + `'`
-	//
-	//			permissionCondition += ` AND b.product_id= '` + strconv.Itoa(productId) + `'`
-	//
-	//		} else {
-	//			condition += ` AND b.product_id= '` + strconv.Itoa(productId) + `'`
-	//
-	//			lossCondition += ` AND b.product_id= '` + strconv.Itoa(productId) + `'`
-	//
-	//			permissionCondition += ` AND b.product_id= '` + strconv.Itoa(productId) + `'`
-	//
-	//			if status == "全部" {
-	//				////如果是筛选了流失客户状态
-	//				if sysUser.Authority <= 0 {
-	//					condition += ` AND (b.seller_id= '` + strconv.Itoa(sysUser.AdminId) + `' OR status='流失')  `
-	//
-	//					permissionCondition += ` AND b.seller_id= ` + strconv.Itoa(sysUser.AdminId)
-	//				} else {
-	//					if sysUser.Authority == 1 {
-	//						condition += ` AND (b.department_id=` + strconv.Itoa(sysUser.DepartmentId) + `  OR status='流失')`
-	//						permissionCondition += ` AND b.department_id=` + strconv.Itoa(sysUser.DepartmentId)
-	//					}
-	//					if sysUser.Authority == 2 && sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP {
-	//						if status != utils.COMPANY_STATUS_LOSE {
-	//							condition += ` AND (b.group_id=` + strconv.Itoa(sysUser.GroupId) + `  OR status='流失') `
-	//						}
-	//						permissionCondition += ` AND b.group_id=` + strconv.Itoa(sysUser.GroupId)
-	//
-	//					}
-	//
-	//					if sysUser.Authority == 2 && sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_GROUP {
-	//						pid, err := company.GetParentIdFromGroup(sysUser.GroupId)
-	//						if err != nil {
-	//							br.Msg = "获取失败"
-	//							br.ErrMsg = "查询父级id异常" + err.Error()
-	//							return
-	//						}
-	//						var ids []*string
-	//						if pid != nil {
-	//							if *pid != 0 {
-	//								//销售主管放在三级列表中
-	//								ids, err = company.GetGroupIdsByParentId(*pid)
-	//								if err != nil {
-	//									fmt.Println(err.Error())
-	//								}
-	//							} else {
-	//								//销售主管放在二级列表中
-	//								ids, err = company.GetGroupIdsByParentId(sysUser.GroupId)
-	//								if err != nil {
-	//									fmt.Println(err.Error())
-	//								}
-	//							}
-	//						}
-	//						var idSlice []string
-	//						var sid string
-	//						for _, id := range ids {
-	//							idSlice = append(idSlice, *id)
-	//						}
-	//						//加入父级groupId
-	//						if *pid > 0 {
-	//							idSlice = append(idSlice, strconv.Itoa(*pid))
-	//						} else {
-	//							idSlice = append(idSlice, strconv.Itoa(sysUser.GroupId))
-	//						}
-	//
-	//						sid = strings.Join(idSlice, ",")
-	//						if len(sid) > 0 {
-	//							if status != utils.COMPANY_STATUS_LOSE {
-	//								condition += ` AND (b.group_id IN (` + sid + `) OR status='流失') `
-	//							}
-	//
-	//							permissionCondition += ` AND b.group_id IN (` + sid + `) `
-	//						} else {
-	//							if status != utils.COMPANY_STATUS_LOSE {
-	//								condition += ` AND (b.group_id IN (` + strconv.Itoa(sysUser.GroupId) + `) OR status='流失') `
-	//							}
-	//							permissionCondition += ` AND b.group_id IN (` + strconv.Itoa(sysUser.GroupId) + `) `
-	//						}
-	//					}
-	//					if sysUser.Authority == 4 {
-	//						if status != utils.COMPANY_STATUS_LOSE {
-	//							condition += ` AND (b.group_id =` + strconv.Itoa(sysUser.GroupId) + ` OR status='流失') `
-	//							//pars = append(pars, sysUser.GroupId)
-	//						}
-	//						permissionCondition += ` AND b.group_id=` + strconv.Itoa(sysUser.GroupId)
-	//						//permissionPars = append(permissionPars, sysUser.GroupId)
-	//					}
-	//				}
-	//			} else {
-	//				//如果没有筛选了流失客户状态,那么需要加客户归属条件加入到查询中去
-	//				if sysUser.Authority <= 0 {
-	//					if status != utils.COMPANY_STATUS_LOSE {
-	//						condition += ` AND b.seller_id=` + strconv.Itoa(sysUser.AdminId)
-	//						//pars = append(pars, sysUser.AdminId)
-	//					}
-	//
-	//					permissionCondition += ` AND b.seller_id=` + strconv.Itoa(sysUser.AdminId)
-	//					//permissionPars = append(permissionPars, sysUser.AdminId)
-	//				} else {
-	//					if sysUser.Authority == 1 {
-	//						if status != utils.COMPANY_STATUS_LOSE {
-	//							condition += ` AND b.department_id=` + strconv.Itoa(sysUser.DepartmentId)
-	//							//pars = append(pars, sysUser.DepartmentId)
-	//						}
-	//						permissionCondition += ` AND b.department_id=` + strconv.Itoa(sysUser.DepartmentId)
-	//						//permissionPars = append(permissionPars, sysUser.DepartmentId)
-	//					}
-	//					if sysUser.Authority == 2 && sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP {
-	//						if status != utils.COMPANY_STATUS_LOSE {
-	//							condition += ` AND b.group_id= ` + strconv.Itoa(sysUser.GroupId)
-	//							//pars = append(pars, sysUser.GroupId)
-	//						}
-	//						permissionCondition += ` AND b.group_id=` + strconv.Itoa(sysUser.GroupId)
-	//						//permissionPars = append(permissionPars, sysUser.GroupId)
-	//					}
-	//					if sysUser.Authority == 2 && sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_GROUP {
-	//						pid, err := company.GetParentIdFromGroup(sysUser.GroupId)
-	//						if err != nil {
-	//							br.Msg = "获取失败"
-	//							br.ErrMsg = "查询父级id异常" + err.Error()
-	//							return
-	//						}
-	//						var ids []*string
-	//						if pid != nil {
-	//							if *pid != 0 {
-	//								//销售主管放在三级列表中
-	//								ids, err = company.GetGroupIdsByParentId(*pid)
-	//								if err != nil {
-	//									fmt.Println(err.Error())
-	//								}
-	//							} else {
-	//								//销售主管放在二级列表中
-	//								ids, err = company.GetGroupIdsByParentId(sysUser.GroupId)
-	//								if err != nil {
-	//									fmt.Println(err.Error())
-	//								}
-	//							}
-	//						}
-	//						var idSlice []string
-	//						var sid string
-	//						for _, id := range ids {
-	//							idSlice = append(idSlice, *id)
-	//						}
-	//						//加入父级groupId
-	//						if *pid > 0 {
-	//							idSlice = append(idSlice, strconv.Itoa(*pid))
-	//						} else {
-	//							idSlice = append(idSlice, strconv.Itoa(sysUser.GroupId))
-	//						}
-	//
-	//						sid = strings.Join(idSlice, ",")
-	//						if len(sid) > 0 {
-	//							if status != utils.COMPANY_STATUS_LOSE {
-	//								condition += ` AND (b.group_id IN (` + sid + `) OR status='流失') `
-	//								//pars = append(pars, sysUser.GroupId)
-	//							}
-	//
-	//							permissionCondition += ` AND b.group_id IN (` + sid + `) `
-	//						} else {
-	//							if status != utils.COMPANY_STATUS_LOSE {
-	//								condition += ` AND (b.group_id IN (` + strconv.Itoa(sysUser.GroupId) + `) OR status='流失') `
-	//								//pars = append(pars, sysUser.GroupId)
-	//							}
-	//
-	//							permissionCondition += ` AND b.group_id IN (` + strconv.Itoa(sysUser.GroupId) + `) `
-	//						}
-	//					}
-	//
-	//					if sysUser.Authority == 4 {
-	//						if status != utils.COMPANY_STATUS_LOSE {
-	//							condition += ` AND b.group_id =` + strconv.Itoa(sysUser.GroupId)
-	//							//pars = append(pars, sysUser.GroupId)
-	//						}
-	//
-	//						permissionCondition += ` AND b.group_id=` + strconv.Itoa(sysUser.GroupId)
-	//						//permissionPars = append(permissionPars, sysUser.GroupId)
-	//					}
-	//				}
-	//			}
-	//		}
-	//	}
-	//}
-
 	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER { //权益销售的查询逻辑
 		condition += ` AND ( cp.seller_id = ` + strconv.Itoa(sysUser.AdminId) + `  OR cp.share_seller_id = ` + strconv.Itoa(sysUser.AdminId) + `)`
 	} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP { // 权益销售组长查询逻辑
@@ -440,6 +247,8 @@ func (this *UserController) List() {
 	}
 	var userIds string
 	var userIdArr []int
+	var companyIds []int
+	var mobilesSlice []string
 	if list != nil {
 		for k, v := range list {
 			if v.RegisterTime != "" {
@@ -477,6 +286,11 @@ func (this *UserController) List() {
 			if !isAdminRole {
 				list[k].CompanyInteractionNum = v.CompanyInteractionNumSeller
 			}
+			companyIds = append(companyIds, v.CompanyId)
+
+			if v.Mobile != "" {
+				mobilesSlice = append(mobilesSlice, v.Mobile)
+			}
 		}
 		userIds = strings.TrimRight(userIds, ",")
 		splitList, err := cygx.GetCygxCompanyUserListSplit(userIds)
@@ -500,6 +314,8 @@ func (this *UserController) List() {
 		}
 
 		UserRemindListMap := cygxService.GetCygxUserRemindListMap(userIdArr)
+		mapIsUserMaker := cygxService.GetCompanyProductIsUserMakerByCompanyIds(companyIds) //根据公司ID获取近四周之内有决策人互动的客户
+		userHaveMoveMap := services.GetWxUserHaveMoveMap(mobilesSlice)                     // 处理用户是否移动过按钮回显
 
 		for k, v := range list {
 			for _, vsplit := range splitList {
@@ -523,6 +339,10 @@ func (this *UserController) List() {
 				list[k].Content = mapUserRemarks[int(v.UserId)]
 			}
 			list[k].IsRemind = UserRemindListMap[int(v.UserId)]
+			list[k].IsUserMaker = mapIsUserMaker[v.CompanyId]
+			if v.Mobile != "" {
+				v.HaveMoveButton = userHaveMoveMap[v.Mobile]
+			}
 		}
 		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
@@ -731,7 +551,8 @@ func (this *UserController) TableList() {
 // @Param   StartDate   query   string  true       "开始时间"
 // @Param   EndDate   query   string  true       "结束时间"
 // @Param   KeyWord   query   string  true       "搜索关键词"
-// @Param  ClassType   query   int  true       "列表类型,1:权益,2:研选,默认1"
+// @Param   ClassType   query   int  true       "列表类型,1:权益,2:研选,默认1"
+// @Param   IsExport   query   bool  false       "是否导出excel,默认是false"
 // @Success 200 {object} cygx.UserInteractionListResp
 // @router /user/interaction/detail [get]
 func (this *UserController) TableDetail() {
@@ -766,6 +587,12 @@ func (this *UserController) TableDetail() {
 	source, _ := this.GetInt("Source")
 	identityType, _ := this.GetInt("IdentityType")
 	classType, _ := this.GetInt("ClassType", 1)
+	//是否导出报表
+	isExport, _ := this.GetBool("IsExport")
+	if isExport {
+		pageSize = 10000
+		currentIndex = 1
+	}
 	if userId < 1 {
 		br.Msg = "用户不存在"
 		return
@@ -874,7 +701,17 @@ func (this *UserController) TableDetail() {
 				} else {
 					list[k].HttpUrl = utils.CYGX_MFYX_URL + "/material/info/" + strconv.Itoa(v.ArticleId)
 				}
+				if v.ReportId > 0 {
+					list[k].HttpUrl = utils.CYGX_WEB_URL + "/material/ricc/yb/report/" + strconv.Itoa(v.ReportId)
+				}
+			}
+
+			//导出excel
+			if isExport {
+				exportListArticle(this, list, 1, br)
+				return
 			}
+
 		}
 
 	} else if source == 2 {
@@ -948,6 +785,11 @@ func (this *UserController) TableDetail() {
 				}
 			}
 		}
+		//导出excel
+		if isExport {
+			exportListActivity(this, list, 1, br)
+			return
+		}
 	} else if source == 3 {
 		if classType == 1 {
 			condition += "  AND art.article_type_id =  0 "
@@ -979,6 +821,9 @@ func (this *UserController) TableDetail() {
 				} else {
 					list[k].HttpUrl = utils.CYGX_MFYX_URL + "/material/info/" + strconv.Itoa(v.ArticleId)
 				}
+				if v.ReportId > 0 {
+					list[k].HttpUrl = utils.CYGX_WEB_URL + "/material/ricc/yb/report/" + strconv.Itoa(v.ReportId)
+				}
 			}
 		}
 	} else if source == 4 {
@@ -1016,7 +861,7 @@ func (this *UserController) TableDetail() {
 	} else if source == 5 {
 
 		if classType == 1 {
-			condition += "  AND a.chart_permission_id  = 31 "
+			condition += "  AND a.chart_permission_id  != 31 "
 		} else {
 			condition += "  AND a.chart_permission_id  = 31 "
 		}
@@ -1173,6 +1018,11 @@ func (this *UserController) TableDetail() {
 				list[k].HttpUrl = utils.CYGX_MFYX_URL + "/column/detail/" + strconv.Itoa(v.ArticleId)
 			}
 		}
+		//导出excel
+		if isExport {
+			exportListYanxuanSpecial(this, list, 1, br)
+			return
+		}
 	} else if source == 12 { //收藏的专栏文章
 		if startDate != "" {
 			startDate += " 00:00:00"
@@ -1244,11 +1094,9 @@ func (this *UserController) TableDetail() {
 		}
 	} else if source == 15 { //1V1路演
 		if startDate != "" {
-			//startDate += " 00:00:00"
 			condition += ` AND b.start_date >= '` + startDate + `' `
 		}
 		if endDate != "" {
-			//endDate += " 23:59:59"
 			condition += ` AND b.start_date <= '` + endDate + `' `
 		}
 		if wxUser.Mobile == "" {
@@ -1270,6 +1118,12 @@ func (this *UserController) TableDetail() {
 			return
 		}
 
+		//导出excel
+		if isExport {
+			exportListRsCalendar(this, list, 1, br)
+			return
+		}
+
 	}
 	page := paging.GetPaging(currentIndex, pageSize, total)
 	resp := new(cygx.UserInteractionListResp)
@@ -2567,6 +2421,7 @@ func (this *UserController) CompanyTableList() {
 // @Param   KeyWord   query   string  false       "搜索关键词"
 // @Param   ActivityName    query   string  false       "活动名称"
 // @Param  ClassType   query   int  true       "列表类型,1:权益,2:研选,默认1"
+// @Param   IsExport   query   bool  false       "是否导出excel,默认是false"
 // @Success 200 {object} cygx.UserInteractionListResp
 // @router /user/company/interaction/detail [get]
 func (this *UserController) CompanyTableDetail() {
@@ -2605,6 +2460,11 @@ func (this *UserController) CompanyTableDetail() {
 		br.Msg = "用户不存在"
 		return
 	}
+	isExport, _ := this.GetBool("IsExport")
+	if isExport {
+		pageSize = 10000
+		currentIndex = 1
+	}
 
 	// 1.标记用户表
 	//操作权限校验
@@ -2684,6 +2544,14 @@ func (this *UserController) CompanyTableDetail() {
 			} else {
 				list[k].HttpUrl = utils.CYGX_MFYX_URL + "/material/info/" + strconv.Itoa(v.ArticleId)
 			}
+			if v.ReportId > 0 {
+				list[k].HttpUrl = utils.CYGX_WEB_URL + "/material/ricc/yb/report/" + strconv.Itoa(v.ReportId)
+			}
+		}
+		//导出excel
+		if isExport {
+			exportListArticle(this, list, 2, br)
+			return
 		}
 	} else if source == 2 {
 
@@ -2768,6 +2636,11 @@ func (this *UserController) CompanyTableDetail() {
 				}
 			}
 		}
+		//导出excel
+		if isExport {
+			exportListActivity(this, list, 2, br)
+			return
+		}
 	} else if source == 3 {
 		if classType == 1 {
 			condition += " AND art.article_type_id = 0  "
@@ -2814,6 +2687,9 @@ func (this *UserController) CompanyTableDetail() {
 				} else {
 					list[k].HttpUrl = utils.CYGX_MFYX_URL + "/material/info/" + strconv.Itoa(v.ArticleId)
 				}
+				if v.ReportId > 0 {
+					list[k].HttpUrl = utils.CYGX_WEB_URL + "/material/ricc/yb/report/" + strconv.Itoa(v.ReportId)
+				}
 			}
 		}
 	} else if source == 4 {
@@ -3087,6 +2963,11 @@ func (this *UserController) CompanyTableDetail() {
 				list[k].HttpUrl = utils.CYGX_MFYX_URL + "/column/detail/" + strconv.Itoa(v.ArticleId)
 			}
 		}
+		//导出excel
+		if isExport {
+			exportListYanxuanSpecial(this, list, 2, br)
+			return
+		}
 	} else if source == 12 { //收藏的专栏文章
 		if isAdminRole {
 			total, list, err = cygx.GetCygxYanxuanSpecialCollectByUser(condition, startSize, pageSize)
@@ -3150,6 +3031,12 @@ func (this *UserController) CompanyTableDetail() {
 			}
 		}
 	} else if source == 15 { //1V1路演
+		if startDate != "" {
+			condition += ` AND b.start_date >= '` + startDate + `' `
+		}
+		if endDate != "" {
+			condition += ` AND b.start_date <= '` + endDate + `' `
+		}
 		var totalRsCalendar int
 		var listRsCalendar []*roadshow.RsCalendarMeetingUserByRai
 		if isAdminRole {
@@ -3174,6 +3061,11 @@ func (this *UserController) CompanyTableDetail() {
 			br.ErrMsg = "HandleListRsCalendar,Err:" + err.Error()
 			return
 		}
+		//导出excel
+		if isExport {
+			exportListRsCalendar(this, list, 2, br)
+			return
+		}
 	}
 
 	page := paging.GetPaging(currentIndex, pageSize, total)
@@ -3608,6 +3500,7 @@ func (this *UserController) CompanyExportInteraction() {
 // @Param   KeyWord   query   string  false       "搜索关键词"
 // @Param   ActivityName    query   string  false       "活动名称"
 // @Param  ClassType   query   int  true       "列表类型,1:权益,2:研选,默认1"
+// @Param   IsExport   query   bool  false       "是否导出excel,默认是false"
 // @Success 200 {object} cygx.UserInteractionListResp
 // @router /user/company/list [get]
 func (this *UserController) CompanyList() {
@@ -3640,6 +3533,11 @@ func (this *UserController) CompanyList() {
 	//packageType, _ := this.GetInt("PackageType")
 	keyWord = strings.Trim(keyWord, " ")
 	keyWord = strings.Replace(keyWord, "'", "", -1)
+	isExport, _ := this.GetBool("IsExport")
+	if isExport {
+		pageSize = 10000
+		currentIndex = 1
+	}
 
 	var total int
 
@@ -3954,6 +3852,14 @@ func (this *UserController) CompanyList() {
 			} else {
 				list[k].HttpUrl = utils.CYGX_MFYX_URL + "/material/info/" + strconv.Itoa(v.ArticleId)
 			}
+			if v.ReportId > 0 {
+				list[k].HttpUrl = utils.CYGX_WEB_URL + "/material/ricc/yb/report/" + strconv.Itoa(v.ReportId)
+			}
+		}
+		//导出excel
+		if isExport {
+			exportListArticle(this, list, 3, br)
+			return
 		}
 	} else if source == 2 {
 
@@ -4040,6 +3946,11 @@ func (this *UserController) CompanyList() {
 				v.SellerName = sellNameMap[v.CompanyId]
 			}
 		}
+		//导出excel
+		if isExport {
+			exportListActivity(this, list, 3, br)
+			return
+		}
 	} else if source == 3 {
 		if classType == 1 {
 			condition += " AND art.article_type_id = 0  "
@@ -4093,6 +4004,9 @@ func (this *UserController) CompanyList() {
 				} else {
 					list[k].HttpUrl = utils.CYGX_MFYX_URL + "/material/info/" + strconv.Itoa(v.ArticleId)
 				}
+				if v.ReportId > 0 {
+					list[k].HttpUrl = utils.CYGX_WEB_URL + "/material/ricc/yb/report/" + strconv.Itoa(v.ReportId)
+				}
 			}
 		}
 	} else if source == 4 {
@@ -4409,6 +4323,16 @@ func (this *UserController) CompanyList() {
 				list[k].RegisterPlatformText = cygxService.GetArticleSourcePlatformText(v.RegisterPlatform)
 				list[k].HttpUrl = utils.CYGX_MFYX_URL + "/column/detail/" + strconv.Itoa(v.ArticleId)
 			}
+			for k, v := range list {
+				list[k].RegisterPlatform = cygxService.GetArticleSourcePlatform(v.SourcePlatform)
+				list[k].RegisterPlatformText = cygxService.GetArticleSourcePlatformText(v.RegisterPlatform)
+				list[k].HttpUrl = utils.CYGX_MFYX_URL + "/column/detail/" + strconv.Itoa(v.ArticleId)
+			}
+		}
+		//导出excel
+		if isExport {
+			exportListYanxuanSpecial(this, list, 3, br)
+			return
 		}
 	} else if source == 12 { //收藏的专栏文章
 		if isAdminRole {
@@ -4473,6 +4397,12 @@ func (this *UserController) CompanyList() {
 			}
 		}
 	} else if source == 15 {
+		if startDate != "" {
+			condition += ` AND b.start_date >= '` + startDate + `' `
+		}
+		if endDate != "" {
+			condition += ` AND b.start_date <= '` + endDate + `' `
+		}
 		var totalRsCalendar int
 		var listRsCalendar []*roadshow.RsCalendarMeetingUserByRai
 		if isAdminRole {
@@ -4497,6 +4427,11 @@ func (this *UserController) CompanyList() {
 			br.ErrMsg = "HandleListRsCalendar,Err:" + err.Error()
 			return
 		}
+		//导出excel
+		if isExport {
+			exportListRsCalendar(this, list, 3, br)
+			return
+		}
 	}
 	page := paging.GetPaging(currentIndex, pageSize, total)
 
@@ -5826,3 +5761,481 @@ func (this *UserController) UserRemind() {
 	br.Success = true
 	br.Data = resp
 }
+
+// exportListRsCalendar  1v1路演导出Excel
+func exportListRsCalendar(this *UserController, list []*cygx.UserInteraction, excelType int, 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()
+	border := xlsx.NewBorder("thin", "thin", "thin", "thin")
+	alignment := xlsx.Alignment{
+		Horizontal: "center",
+		Vertical:   "center",
+		WrapText:   true,
+	}
+
+	redStyle := xlsx.NewStyle()
+	redStyle.Alignment = alignment
+	redStyle.ApplyAlignment = true
+	redStyle.Font.Color = "ff0000"
+	redStyle.Border = *border
+
+	style.Alignment = alignment
+	style.ApplyAlignment = true
+
+	sheel, err := xlsxFile.AddSheet("1V1路演")
+	if err != nil {
+		br.Msg = "新增Sheet失败"
+		br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
+		return
+	}
+	sheel.SetColWidth(0, 0, 30)
+	sheel.SetColWidth(1, 1, 15)
+	sheel.SetColWidth(2, 2, 15)
+	sheel.SetColWidth(3, 3, 18)
+
+	titleRow := sheel.AddRow()
+
+	if excelType > 2 {
+		cellA := titleRow.AddCell()
+		cellA.SetStyle(style)
+		cellA.SetValue("客户名称")
+	}
+
+	if excelType > 1 {
+		cellB := titleRow.AddCell()
+		cellB.SetStyle(style)
+		cellB.SetValue("姓名")
+
+		cellC := titleRow.AddCell()
+		cellC.SetStyle(style)
+		cellC.SetValue("手机号")
+	}
+
+	cellD := titleRow.AddCell()
+	cellD.SetStyle(style)
+	cellD.SetValue("路演时间")
+
+	cellE := titleRow.AddCell()
+	cellE.SetStyle(style)
+	cellE.SetValue("研究员")
+
+	cellF := titleRow.AddCell()
+	cellF.SetStyle(style)
+	cellF.SetValue("路演形式")
+
+	cellG := titleRow.AddCell()
+	cellG.SetStyle(style)
+	cellG.SetValue("主题标签")
+
+	for _, v := range list {
+		dataRow := sheel.AddRow()
+		dataRow.SetHeight(20)
+
+		if excelType > 2 {
+			cellAData := dataRow.AddCell()
+			cellAData.SetStyle(style)
+			cellAData.Value = v.CompanyName
+		}
+
+		if excelType > 1 {
+			cellBData := dataRow.AddCell()
+			cellBData.SetStyle(style)
+			cellBData.Value = v.RealName
+
+			cellCData := dataRow.AddCell()
+			cellCData.SetStyle(style)
+			cellCData.Value = v.Mobile
+		}
+
+		cellDData := dataRow.AddCell()
+		cellDData.SetStyle(style)
+		cellDData.Value = v.ActivityTimeText
+
+		cellEData := dataRow.AddCell()
+		cellEData.SetStyle(style)
+		cellEData.Value = v.ResearcherName
+
+		cellFData := dataRow.AddCell()
+		cellFData.SetStyle(style)
+		if v.ActivityType == 1 {
+			cellFData.Value = "线上"
+		} else {
+			cellFData.Value = "线下"
+		}
+
+		cellGData := dataRow.AddCell()
+		cellGData.SetStyle(style)
+		cellGData.Value = v.LabelKeyWord
+
+	}
+	err = xlsxFile.Save(downLoadnFilePath)
+	if err != nil {
+		br.Msg = "保存文件失败"
+		br.ErrMsg = "保存文件失败"
+		return
+	}
+	randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
+	downloadFileName := "1V1路演导出数据_" + randStr + ".xlsx"
+	this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
+	defer func() {
+		os.Remove(downLoadnFilePath)
+	}()
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "导出成功"
+}
+
+// exportListArticle  文章阅读数据导出
+func exportListArticle(this *UserController, list []*cygx.UserInteraction, excelType int, br *models.BaseResponse) {
+	//创建excel
+	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
+	sheet, err := xlsxFile.AddSheet("报告阅读列表")
+	if err != nil {
+		br.Msg = "新增Sheet失败"
+		br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
+		return
+	}
+
+	//标头
+	rowTitle := sheet.AddRow()
+	if excelType > 2 {
+		cellA := rowTitle.AddCell()
+		cellA.Value = "客户名称"
+		cellB := rowTitle.AddCell()
+		cellB.Value = "所属销售"
+	}
+	if excelType > 1 {
+		cellC := rowTitle.AddCell()
+		cellC.Value = "姓名"
+		cellD := rowTitle.AddCell()
+		cellD.Value = "手机号"
+	}
+	cellE := rowTitle.AddCell()
+	cellE.Value = "报告标题"
+	cellF := rowTitle.AddCell()
+	cellF.Value = "所属行业"
+	cellG := rowTitle.AddCell()
+	cellG.Value = "所属产业"
+	cellH := rowTitle.AddCell()
+	cellH.Value = "关联标的"
+	cellI := rowTitle.AddCell()
+	cellI.Value = "发布时间"
+	cellJ := rowTitle.AddCell()
+	cellJ.Value = "阅读时间"
+	cellK := rowTitle.AddCell()
+	cellK.Value = "阅读时长"
+
+	for _, item := range list {
+		row := sheet.AddRow()
+		if excelType > 2 {
+			cellA := row.AddCell()
+			cellA.Value = item.CompanyName
+			cellB := row.AddCell()
+			cellB.Value = item.SellerName
+		}
+		if excelType > 1 {
+			cellC := row.AddCell()
+			cellC.Value = item.RealName
+			cellD := row.AddCell()
+			cellD.Value = item.Mobile
+		}
+		cellEData := row.AddCell()
+		cellEData.Value = item.Title
+		cellFData := row.AddCell()
+		cellFData.Value = item.PermissionName
+		cellGData := row.AddCell()
+		cellGData.Value = item.IndustryName
+		cellHData := row.AddCell()
+		cellHData.Value = item.SubjectNameStr
+		cellIData := row.AddCell()
+		cellIData.Value = item.PublishDate
+		cellJData := row.AddCell()
+		cellJData.Value = item.CreateTime
+		cellKData := row.AddCell()
+		cellKData.Value = item.StopTime
+	}
+	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 = "导出成功"
+}
+
+// exportListArticle  文章阅读数据导出
+func exportListActivity(this *UserController, list []*cygx.UserInteraction, excelType int, br *models.BaseResponse) {
+	//创建excel
+	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
+	sheet, err := xlsxFile.AddSheet("客户参会记录")
+	if err != nil {
+		br.Msg = "新增Sheet失败"
+		br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
+		return
+	}
+
+	//标头
+	rowTitle := sheet.AddRow()
+
+	if excelType > 2 {
+		cellA := rowTitle.AddCell()
+		cellA.Value = "客户名称"
+		cellB := rowTitle.AddCell()
+		cellB.Value = "所属销售"
+	}
+
+	if excelType > 1 {
+		cellC := rowTitle.AddCell()
+		cellC.Value = "姓名"
+		cellD := rowTitle.AddCell()
+		cellD.Value = "手机号"
+	}
+
+	cellE := rowTitle.AddCell()
+	cellE.Value = "活动名称"
+	cellF := rowTitle.AddCell()
+	cellF.Value = "所属行业"
+	cellG := rowTitle.AddCell()
+	cellG.Value = "活动类型"
+	cellH := rowTitle.AddCell()
+	cellH.Value = "活动主题"
+	cellI := rowTitle.AddCell()
+	cellI.Value = "活动时间"
+	cellJ := rowTitle.AddCell()
+	cellJ.Value = "是否到会"
+	cellK := rowTitle.AddCell()
+	cellK.Value = "首次入会时间"
+	cellL := rowTitle.AddCell()
+	cellL.Value = "最后退出时间"
+	cellM := rowTitle.AddCell()
+	cellM.Value = "参与总时长"
+	cellN := rowTitle.AddCell()
+	cellN.Value = "参会方式"
+	cellO := rowTitle.AddCell()
+	cellO.Value = "参会权鉴"
+	cellP := rowTitle.AddCell()
+	cellP.Value = "参会状态"
+
+	for _, item := range list {
+		row := sheet.AddRow()
+		if excelType > 2 {
+			cellAData := row.AddCell()
+			cellAData.Value = item.CompanyName
+			cellBData := row.AddCell()
+			cellBData.Value = item.SellerName
+		}
+
+		if excelType > 1 {
+			cellCData := row.AddCell()
+			cellCData.Value = item.RealName
+			cellDData := row.AddCell()
+			cellDData.Value = item.Mobile
+		}
+
+		cellEData := row.AddCell()
+		cellEData.Value = item.ActivityName
+		cellFData := row.AddCell()
+		cellFData.Value = item.PermissionName
+		cellGData := row.AddCell()
+		cellGData.Value = item.ActivityTypeName
+		cellHData := row.AddCell()
+		cellHData.Value = item.Label
+		cellIData := row.AddCell()
+		cellIData.Value = item.ActivityTime
+		cellJData := row.AddCell()
+		if item.IsMeeting == 1 {
+			cellJData.Value = "到会"
+		} else {
+			cellJData.Value = "未到会"
+		}
+		cellKData := row.AddCell()
+		cellKData.Value = item.FirstMeetingTime
+		cellLData := row.AddCell()
+		cellLData.Value = item.LastMeetingTime
+		cellMData := row.AddCell()
+		cellMData.Value = item.Duration
+		cellNData := row.AddCell()
+		cellNData.Value = item.LastMeetingTime
+		cellOData := row.AddCell()
+		cellOData.Value = item.MeetingTypeStr
+		cellPData := row.AddCell()
+		cellPData.Value = item.MeetingStatusStr
+	}
+
+	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 = "导出成功"
+}
+
+// exportListYanxuanSpecial 研选专栏阅读记录
+func exportListYanxuanSpecial(this *UserController, list []*cygx.UserInteraction, excelType int, br *models.BaseResponse) {
+	//创建excel
+	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
+	sheet, err := xlsxFile.AddSheet("客户参会记录")
+	if err != nil {
+		br.Msg = "新增Sheet失败"
+		br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
+		return
+	}
+
+	//标头
+	rowTitle := sheet.AddRow()
+
+	if excelType > 2 {
+		cellAy := rowTitle.AddCell()
+		cellAy.Value = "客户名称"
+		cellBy := rowTitle.AddCell()
+		cellBy.Value = "所属销售"
+	}
+
+	if excelType > 1 {
+		cellC := rowTitle.AddCell()
+		cellC.Value = "姓名"
+		cellD := rowTitle.AddCell()
+		cellD.Value = "手机号"
+	}
+
+	cellA := rowTitle.AddCell()
+	cellA.Value = "文章标题"
+	cellB := rowTitle.AddCell()
+	cellB.Value = "文章类型"
+	cellC := rowTitle.AddCell()
+	cellC.Value = "标签"
+	cellD := rowTitle.AddCell()
+	cellD.Value = "发布时间"
+	cellE := rowTitle.AddCell()
+	cellE.Value = "阅读时间"
+	cellF := rowTitle.AddCell()
+	cellF.Value = "阅读时长"
+	cellG := rowTitle.AddCell()
+	cellG.Value = "阅读来源"
+
+	for _, item := range list {
+		row := sheet.AddRow()
+
+		if excelType > 2 {
+			cellADatay := row.AddCell()
+			cellADatay.Value = item.CompanyName
+			cellBDatay := row.AddCell()
+			cellBDatay.Value = item.SellerName
+		}
+
+		if excelType > 1 {
+			cellCData := row.AddCell()
+			cellCData.Value = item.RealName
+			cellDData := row.AddCell()
+			cellDData.Value = item.Mobile
+		}
+
+		cellAData := row.AddCell()
+		cellAData.Value = item.Title
+		cellBData := row.AddCell()
+		if item.SpecialType == 1 {
+			cellBData.Value = "笔记"
+		} else {
+			cellBData.Value = "观点"
+		}
+		cellCData := row.AddCell()
+		cellCData.Value = item.IndustryName
+		cellDData := row.AddCell()
+		cellDData.Value = item.PublishDate
+		cellEData := row.AddCell()
+		cellEData.Value = item.CreateTime
+		cellFData := row.AddCell()
+		cellFData.Value = item.StopTime
+		cellGData := row.AddCell()
+		cellGData.Value = cygxService.GetArticleSourcePlatformText(item.RegisterPlatform)
+	}
+
+	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 = "导出成功"
+}

+ 26 - 2
controllers/cygx/user_feedback.go

@@ -4,7 +4,9 @@ import (
 	"encoding/json"
 	"hongze/hz_crm_api/controllers"
 	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/company"
 	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/services"
 	"time"
 )
 
@@ -60,12 +62,32 @@ func (this *UserFeedbackController) UserFeedbackAdd() {
 	item.RealName = wxUser.RealName
 	item.AdminId = sysUser.AdminId
 	item.CreateTime = time.Now()
-	_, err = cygx.AddCygxUserFeedback(item)
+	var newId int64
+	newId, err = cygx.AddCygxUserFeedback(item)
 	if err != nil {
 		br.Msg = "新增失败."
 		br.ErrMsg = "新增失败,Err:" + err.Error()
 		return
 	}
+
+	//权益客户新增历史备注总表
+	itemRecord := new(company.CompanyHistoryRemark)
+	itemRecord.CompanyId = wxUser.CompanyId
+	itemRecord.Content = req.Content
+	itemRecord.SysAdminId = sysUser.AdminId
+	itemRecord.SysAdminName = sysUser.RealName
+	itemRecord.CreateTime = time.Now().Local()
+	itemRecord.ModifyTime = time.Now().Local()
+	itemRecord.ShowTime = time.Now().Local()
+	itemRecord.ProductId = 2
+	itemRecord.UserId = wxUser.UserId
+	itemRecord.Mobile = wxUser.Mobile
+	itemRecord.Email = wxUser.Email
+	itemRecord.RealName = wxUser.RealName
+	itemRecord.TableName = "cygx_user_feedback"
+	itemRecord.TableId = int(newId)
+	go services.AddCompanyHistoryRemark(itemRecord)
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"
@@ -134,7 +156,6 @@ func (this *UserFeedbackController) UserFeedbackDel() {
 		return
 	}
 	userFeedbackId := req.UserFeedbackId
-
 	if userFeedbackId < 0 {
 		br.Msg = "参数错误!"
 		return
@@ -146,6 +167,9 @@ func (this *UserFeedbackController) UserFeedbackDel() {
 		br.ErrMsg = "删除失败,Err:" + err.Error()
 		return
 	}
+
+	go services.DelCompanyHistoryRemark("cygx_user_feedback", userFeedbackId) // 删除
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "删除成功"

+ 13 - 1
controllers/help_doc/doc.go

@@ -3,7 +3,6 @@ package help_doc
 import (
 	"encoding/json"
 	"fmt"
-	"github.com/rdlucklib/rdluck_tools/paging"
 	"hongze/hz_crm_api/controllers"
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/help_doc"
@@ -12,6 +11,8 @@ import (
 	"strconv"
 	"strings"
 	"time"
+
+	"github.com/rdlucklib/rdluck_tools/paging"
 )
 
 // HelpDocController 帮助文档
@@ -87,6 +88,17 @@ func (this *HelpDocController) Add() {
 	if req.Status == 2 {
 		item.PublishTime = time.Now()
 	}
+	if req.Id > 0 {
+		tmpHelpDoc, err := help_doc.GetHelpDocById(int(req.Id))
+		if err != nil {
+			br.Msg = "保存失败"
+			br.ErrMsg = "查询帮助文档失败,Err:" + err.Error()
+			return
+		}
+		if tmpHelpDoc.Status != req.Status {
+			req.IsChange = true
+		}
+	}
 
 	if req.Id == 0 {
 		id, e := help_doc.AddHelpDoc(item)

+ 212 - 56
controllers/roadshow/calendar.go

@@ -194,6 +194,20 @@ func (this *CalendarController) Add() {
 		return
 	}
 
+	//如果是权益客户,添加销售跟共享销售的信息
+	var productItemRai *company.CompanyProduct
+	roleTypeCode := sysUser.RoleTypeCode
+	//如果是权益销售、权益销售组长、权益管理员 添加的路演信息,做销售与共享销售信息关联查看
+	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)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "客户信息有误"
+			br.ErrMsg = "获取客户信息失败, Err: " + err.Error()
+			return
+		}
+	}
+
 	rsCalendar := new(roadshow.RsCalendar)
 	rsCalendar.SysUserId = sysUser.AdminId
 	rsCalendar.SysUserRealName = sysUser.RealName
@@ -215,6 +229,10 @@ func (this *CalendarController) Add() {
 	rsCalendar.Source = 0
 	rsCalendar.EnglishCompany = req.EnglishCompany
 	rsCalendar.Title = getTitle(req.ActivityType, req.RoadshowType, req.ActivityCategory, req.RoadshowPlatform, req.Province, req.City)
+	if productItemRai != nil {
+		rsCalendar.SellerId = productItemRai.SellerId
+		rsCalendar.ShareSellerId = productItemRai.ShareSellerId
+	}
 	rsCalendarId, err := roadshow.AddRsCalendar(rsCalendar)
 	if err != nil {
 		br.Msg = "保存失败!"
@@ -546,54 +564,73 @@ func (this *CalendarController) Edit() {
 
 	calendarWhereParams["rs_calendar_id"] = req.RsCalendarId
 
-	if req.ActivityType != "" {
-		calendarUpdateParams["activity_type"] = req.ActivityType
-	}
+	//if req.ActivityType != "" {
+	calendarUpdateParams["activity_type"] = req.ActivityType
+	//}
 
-	if req.RoadshowType != "" {
-		calendarUpdateParams["roadshow_type"] = req.RoadshowType
-	}
+	//if req.RoadshowType != "" {
+	calendarUpdateParams["roadshow_type"] = req.RoadshowType
+	//	}
 
-	if req.RoadshowPlatform != "" {
-		calendarUpdateParams["roadshow_platform"] = req.RoadshowPlatform
-	}
+	//if req.RoadshowPlatform != "" {
+	calendarUpdateParams["roadshow_platform"] = req.RoadshowPlatform
+	//}
 
-	if req.CompanyId > 0 {
-		calendarUpdateParams["company_id"] = req.CompanyId
-	}
+	//if req.CompanyId > 0 {
+	calendarUpdateParams["company_id"] = req.CompanyId
+	//}
 
-	if req.CompanyName != "" {
-		calendarUpdateParams["company_name"] = req.CompanyName
-	}
+	//if req.CompanyName != "" {
+	calendarUpdateParams["company_name"] = req.CompanyName
+	//}
 
-	if req.ActivityCategory != "" {
-		calendarUpdateParams["activity_category"] = req.ActivityCategory
-	}
+	//if req.ActivityCategory != "" {
+	calendarUpdateParams["activity_category"] = req.ActivityCategory
+	//	}
 
-	if req.Theme != "" {
-		calendarUpdateParams["theme"] = req.Theme
-	}
+	//if req.Theme != "" {
+	calendarUpdateParams["theme"] = req.Theme
+	//}
 
-	if req.CooperationName != "" {
-		calendarUpdateParams["cooperation_name"] = req.CooperationName
-	}
+	//if req.CooperationName != "" {
+	calendarUpdateParams["cooperation_name"] = req.CooperationName
+	//}
 
-	if req.Province != "" {
-		calendarUpdateParams["province"] = req.Province
-	}
+	//if req.Province != "" {
+	calendarUpdateParams["province"] = req.Province
+	//}
 
-	if req.City != "" {
-		calendarUpdateParams["city"] = req.City
-	}
+	//if req.City != "" {
+	calendarUpdateParams["city"] = req.City
+	//	}
 
-	if req.District != "" {
-		calendarUpdateParams["district"] = req.District
-	}
+	//if req.District != "" {
+	calendarUpdateParams["district"] = req.District
+	//}
 
 	calendarUpdateParams["english_company"] = req.EnglishCompany
 
 	calendarUpdateParams["modify_time"] = time.Now()
 	calendarUpdateParams["title"] = getTitle(req.ActivityType, req.RoadshowType, req.ActivityCategory, req.RoadshowPlatform, req.Province, req.City)
+
+	//如果是权益客户,添加销售跟共享销售的信息
+	roleTypeCode := sysUser.RoleTypeCode
+	//如果是权益销售、权益销售组长、权益管理员 添加的路演信息,做销售与共享销售信息关联查看
+	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) {
+		var productItemRai *company.CompanyProduct
+		productItemRai, err = company.GetCompanyProductByCompanyIdAndProductId(req.CompanyId, utils.COMPANY_PRODUCT_RAI_ID)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "客户信息有误"
+			br.ErrMsg = "获取客户信息失败, Err: " + err.Error()
+			return
+		}
+		if productItemRai != nil {
+			calendarUpdateParams["seller_id"] = productItemRai.SellerId
+			calendarUpdateParams["share_seller_id"] = productItemRai.ShareSellerId
+		}
+	}
+
 	err = roadshow.UpdateRsCalendar(calendarWhereParams, calendarUpdateParams)
 	if err != nil {
 		br.Msg = "保存失败!"
@@ -690,6 +727,7 @@ func (this *CalendarController) Edit() {
 			calendar := roadshow.RsCalendar{
 				RsCalendarId: req.RsCalendarId,
 				SysUserId:    this.SysUser.AdminId,
+				CompanyName:  req.CompanyName,
 				Title:        getTitle(req.ActivityType, req.RoadshowType, req.ActivityCategory, req.RoadshowPlatform, req.Province, req.City),
 			}
 			researcher := *rsCalendarResearcherItem
@@ -699,6 +737,7 @@ func (this *CalendarController) Edit() {
 			researcher.EndTime = v.EndTime
 			researcher.StartWeek = v.StartWeek
 			researcher.EndWeek = v.EndWeek
+			roadshowService.DeleteSHCalendar(req.RsCalendarResearcherId) //删除老的
 			go roadshowService.CalendarToSH(calendar, researcher)
 
 			if req.EditType == 2 {
@@ -1159,9 +1198,9 @@ func (this *CalendarController) CalendarList() {
 	roleTypeCode := sysUser.RoleTypeCode
 	//销售
 	if roleTypeCode == utils.ROLE_TYPE_CODE_FICC_SELLER ||
-		roleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER ||
+		//roleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER ||
 		roleTypeCode == utils.ROLE_TYPE_CODE_FICC_GROUP ||
-		roleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP ||
+		//roleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP ||
 		roleTypeCode == utils.ROLE_TYPE_CODE_FICC_TEAM ||
 		roleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN {
 		condition += ` AND a.sys_user_id=?`
@@ -1169,6 +1208,15 @@ func (this *CalendarController) CalendarList() {
 		//condition += ` AND a.activity_type IN('路演','公开会议') `
 	}
 
+	//权益销售
+	if roleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER ||
+		roleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP {
+		//if calendarType == 2 {
+		condition += ` AND  ( a.sys_user_id=?  OR a.seller_id=?  OR a.share_seller_id=?  )  `
+		pars = append(pars, sysUser.AdminId, sysUser.AdminId, sysUser.AdminId)
+		//}
+	}
+
 	if roleTypeCode == utils.ROLE_TYPE_CODE_FICC_RESEARCHR ||
 		roleTypeCode == utils.ROLE_TYPE_CODE_RESEARCHR ||
 		roleTypeCode == utils.ROLE_TYPE_CODE_RAI_RESEARCHR ||
@@ -1208,7 +1256,7 @@ func (this *CalendarController) CalendarList() {
 		br.ErrMsg = "参数错误,calendarType:" + strconv.Itoa(calendarType)
 		return
 	}
-
+	fmt.Println(condition)
 	resp := new(roadshow.CalendarListResp)
 	total, err := roadshow.GetCalendarListCount(condition, pars, calendarType)
 	if err != nil && err.Error() != utils.ErrNoRow() {
@@ -1253,6 +1301,18 @@ func (this *CalendarController) CalendarList() {
 			englishMap[englishList[i].CompanyId] = englishList[i]
 		}
 	}
+
+	//获取所有自定义的权益研究员
+	sysUserList, err := cygx.GetAskEmailList()
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,GetAskEmailList Err: " + err.Error()
+		return
+	}
+	raiAskadminMap := make(map[string]bool, 0)
+	for _, v := range sysUserList {
+		raiAskadminMap[strconv.Itoa(v.AdminId)] = true
+	}
 	mapRaiSllerId := make(map[int]bool)  // 是否为权益销售
 	mapMeetingCount := make(map[int]int) // 路演参会人员数量
 	if len(adminIds) > 0 {
@@ -1294,6 +1354,15 @@ func (this *CalendarController) CalendarList() {
 				dataList[i].ViewButton = true
 			}
 		}
+		//权益研究员的【路演】和【沙龙】,未结束时,显示修改按钮
+		if raiAskadminMap[dataList[i].ResearcherId] && utils.InArrayByStr([]string{"路演", "沙龙"}, dataList[i].ActivityType) && dataList[i].Status == 2 {
+			//未开始的才展示修改按钮
+			startTimeStr := dataList[i].StartDate + " " + dataList[i].StartTime
+			startTime := utils.StrTimeToTime(startTimeStr)
+			if startTime.After(time.Now()) {
+				dataList[i].EditButton = true
+			}
+		}
 	}
 
 	resp.Paging = page
@@ -1380,6 +1449,16 @@ func (this *CalendarController) Accept() {
 		return
 	}
 
+	rsCalendarResearcherItemList, err := roadshow.GetRsCalendarResearcherListById(req.RsCalendarId)
+	if err != nil {
+		br.Msg = "获取数据失败!"
+		br.ErrMsg = "获取数据失败!GetRsCalendarResearcherById:" + err.Error()
+		return
+	}
+	for _, v := range rsCalendarResearcherItemList {
+		go roadshowService.CalendarToSH(*rsCalendar, *v)
+	}
+
 	//模板消息通知
 	{
 		if rsCalendar != nil {
@@ -1698,7 +1777,17 @@ func (this *CalendarController) Delete() {
 			br.ErrMsg = "删除失败!UpdateCalendarResearcher:" + err.Error()
 			return
 		}
+
 	}
+	itemApiLog := new(roadshow.RsCalendarApiLog)
+	itemApiLog.CreateTime = time.Now()
+	itemApiLog.Remark = "CRM手动删除"
+	itemApiLog.Url = sysUser.RealName
+	itemApiLog.Body = ""
+	itemApiLog.Result = ""
+	itemApiLog.RsCalendarResearcherId = req.RsCalendarResearcherId
+	itemApiLog.RsCalendarId = req.RsCalendarId
+	go roadshow.AddRsCalendarApiLog(itemApiLog)
 	//`status` int(11) DEFAULT '0' COMMENT '1:待接受,2:已接受,3:已拒绝,4:已删除,5:已撤回,6:已结束',
 	//待接受、已接受的情况,需要同步删除上海那边的日程
 	for _, rsCalendarResearcherItem := range rsCalendarResearcherItemList {
@@ -2021,11 +2110,11 @@ func (this *CalendarController) MattersUpdate() {
 		updateParams["matter_content"] = req.MatterContent
 	}
 	req.EditReason = strings.TrimSpace(req.EditReason)
-	if req.EditReason == "" {
-		br.Msg = "请填写修改原因"
-		return
-	}
-	updateParams["edit_reason"] = req.EditReason
+	//if req.EditReason == "" {
+	//	br.Msg = "请填写修改原因"
+	//	return
+	//}
+	//updateParams["edit_reason"] = req.EditReason
 
 	startDateTime := req.StartDate + " " + req.StartTime
 	endDateTime := req.EndDate + " " + req.EndTime
@@ -2276,11 +2365,16 @@ func (this *CalendarController) ResearcherCalendarDetail() {
 	//go roadshowService.SyncCalendarFromShanghai(researcherInfo.Mobile, startDate, endDate)
 	go roadshowService.InsertSyncCalendarFromShanghaiLPush(researcherInfo.Mobile, startDate, endDate)
 
-	condition += ` AND b.start_date>=?`
-	pars = append(pars, startDate)
-	condition += ` AND b.end_date<=?`
-	pars = append(pars, endDate)
-
+	//condition += ` AND b.start_date>=?`
+	//pars = append(pars, startDate)
+	//condition += ` AND b.end_date<=?`
+	//pars = append(pars, endDate)
+	//解决研究员休假,产生跨周的数据查询不到的bug,
+	condition += ` AND ( b.start_date >= ? AND b.end_date <= ? 
+						OR ( b.start_date >= ?  AND  b.start_date <= ? )
+						OR ( b.start_date <= ?  AND  b.end_date  >=  ? ) 
+						OR ( b.end_date >= ?    AND  b.end_date  <=  ? ) )  `
+	pars = append(pars, startDate, endDate, startDate, endDate, startDate, endDate, startDate, endDate)
 	condition += ` AND b.status IN(2) `
 	//pars = append(pars, 2)
 
@@ -2396,13 +2490,22 @@ func (this *CalendarController) MyCalendarDetail() {
 
 	roleTypeCode := sysUser.RoleTypeCode
 	fmt.Println("roleTypeCode:", roleTypeCode)
-	//销售
-	sales := isSellerRole(sysUser.RoleTypeCode)
-	if sales || roleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN { // 王芳也作为销售身份处理
-		condition += ` AND a.sys_user_id=?`
-		pars = append(pars, sysUser.AdminId)
 
-		condition += ` AND a.activity_type IN('路演','公开会议','沙龙') `
+	//权益销售
+	if roleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER ||
+		roleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP {
+		//if calendarType == 2 {
+		condition += ` AND  ( a.sys_user_id=?  OR a.seller_id=?  OR a.share_seller_id=?  )  `
+		pars = append(pars, sysUser.AdminId, sysUser.AdminId, sysUser.AdminId)
+		//}
+	} else {
+		//销售
+		sales := isSellerRole(sysUser.RoleTypeCode)
+		if sales || roleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN { // 王芳也作为销售身份处理
+			condition += ` AND a.sys_user_id=?`
+			pars = append(pars, sysUser.AdminId)
+			condition += ` AND a.activity_type IN('路演','公开会议','沙龙') `
+		}
 	}
 
 	//研究员
@@ -2429,10 +2532,16 @@ func (this *CalendarController) MyCalendarDetail() {
 		pars = append(pars, sysUser.AdminId)
 	}
 
-	condition += ` AND b.start_date>=?`
-	pars = append(pars, startDate)
-	condition += ` AND b.end_date<=?`
-	pars = append(pars, endDate)
+	//condition += ` AND b.start_date>=?`
+	//pars = append(pars, startDate)
+	//condition += ` AND b.end_date<=?`
+	//pars = append(pars, endDate)
+	//解决研究员休假,产生跨周的数据查询不到的bug,
+	condition += ` AND ( b.start_date >= ? AND b.end_date <= ? 
+						OR ( b.start_date >= ?  AND  b.start_date <= ? )
+						OR ( b.start_date <= ?  AND  b.end_date  >=  ? ) 
+						OR ( b.end_date >= ?    AND  b.end_date  <=  ? ) )  `
+	pars = append(pars, startDate, endDate, startDate, endDate, startDate, endDate, startDate, endDate)
 
 	condition += ` AND b.status IN(2) `
 	//pars = append(pars, 2)
@@ -2827,3 +2936,50 @@ func isSellerRole(roleType string) (ok bool) {
 	}
 	return
 }
+
+//func init() {
+//	init16_2()
+//}
+//func init16_2() {
+//	listDate, err := roadshow.GetRsCalendarResearcherListInit16_2()
+//	if err != nil {
+//		fmt.Println(err)
+//		return
+//	}
+//
+//	sysUserList, err := system.GetAdminList()
+//	if err != nil {
+//		fmt.Println(err)
+//		return
+//	}
+//	adminMap := make(map[int]*system.Admin, 0)
+//	for _, v := range sysUserList {
+//		adminMap[v.AdminId] = v
+//	}
+//
+//	for k, v := range listDate {
+//		fmt.Println(k, "__", v.CompanyId)
+//		//如果是权益客户,添加销售跟共享销售的信息
+//		var productItemRai *company.CompanyProduct
+//
+//		productItemRai, err = company.GetCompanyProductByCompanyIdAndProductId(v.CompanyId, utils.COMPANY_PRODUCT_RAI_ID)
+//		if err != nil && err.Error() != utils.ErrNoRow() {
+//			fmt.Println(err)
+//			return
+//		}
+//
+//		var RoleTypeCode string
+//		if adminMap[v.SysUserId] != nil {
+//			RoleTypeCode = adminMap[v.SysUserId].RoleTypeCode
+//		}
+//
+//		if productItemRai != nil && (RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP || RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER || RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN) {
+//			err = roadshow.UpdateRsCalendarSeller(productItemRai.SellerId, productItemRai.ShareSellerId, v.RsCalendarId)
+//			if err != nil && err.Error() != utils.ErrNoRow() {
+//				fmt.Println(err)
+//				return
+//			}
+//		}
+//	}
+//
+//}

+ 18 - 9
controllers/roadshow/calendar_meeting_user.go

@@ -49,12 +49,18 @@ func (this *CalendarMeetingUserController) Add() {
 	rsCalendarId := req.RsCalendarId
 	userIds := req.UserId
 	tagList := req.TagList
+	roadShowTheme := req.RoadShowTheme
 
 	if rsCalendarId == 0 {
 		br.Msg = "路演信息错误!"
 		return
 	}
 
+	if roadShowTheme == "" {
+		br.Msg = "请输入路演主题名称!"
+		return
+	}
+
 	var itemsGroup []*roadshow.RsCalendarMeetingLabelGroup
 	for _, v := range tagList {
 		itemGroup := new(roadshow.RsCalendarMeetingLabelGroup)
@@ -73,7 +79,7 @@ func (this *CalendarMeetingUserController) Add() {
 		br.ErrMsg = "获取信息失败-AddRsCalendarMeetingLabelGroupMulti!Err:" + err.Error()
 		return
 	}
-
+	var items []*roadshow.RsCalendarMeetingUser
 	if len(userIds) > 0 {
 		var userIdsStr []string
 		for _, v := range userIds {
@@ -85,8 +91,6 @@ func (this *CalendarMeetingUserController) Add() {
 			br.ErrMsg = "获取用户信息失败-GetWxUserListByUserIdsHaveCompany!Err:" + err.Error()
 			return
 		}
-
-		var items []*roadshow.RsCalendarMeetingUser
 		for _, v := range listUser {
 			item := new(roadshow.RsCalendarMeetingUser)
 			item.RsCalendarId = rsCalendarId
@@ -99,16 +103,17 @@ func (this *CalendarMeetingUserController) Add() {
 			item.Position = v.Position
 			item.AdminId = sysUser.AdminId
 			item.AdminName = sysUser.RealName
+			item.RoadShowTheme = req.RoadShowTheme
 			item.CreateTime = time.Now()
 			item.ModifyTime = time.Now()
 			items = append(items, item)
 		}
-		err = roadshow.MultiAddRsCalendarMeetingUser(items)
-		if err != nil {
-			br.Msg = "操作失败!"
-			br.ErrMsg = "操作失败-MultiAddRsCalendarMeetingUserErr:" + err.Error()
-			return
-		}
+	}
+	err = roadshow.MultiAddRsCalendarMeetingUser(items, roadShowTheme, rsCalendarId)
+	if err != nil {
+		br.Msg = "操作失败!"
+		br.ErrMsg = "操作失败-MultiAddRsCalendarMeetingUser!Err:" + err.Error()
+		return
 	}
 	br.Ret = 200
 	br.Success = true
@@ -220,6 +225,10 @@ func (this *CalendarMeetingUserController) List() {
 	}
 	if len(list) == 0 {
 		list = make([]*roadshow.RsCalendarMeetingUserResp, 0)
+	} else {
+		for _, v := range list {
+			resp.RoadShowTheme = v.RoadShowTheme
+		}
 	}
 	if len(lebelDetail) == 0 {
 		lebelDetail = make([]*cygx.RaiServeTagResp, 0)

+ 1 - 1
controllers/roadshow/company.go

@@ -40,7 +40,7 @@ func (this *CalendarController) CompanySearch() {
 		groupId = -1
 	}
 
-	list, err := roadshow.CompanySearchV2(sysUser.AdminId, groupId, KeyWord)
+	list, err := roadshow.CompanySearchV2(sysUser.AdminId, groupId, KeyWord, sysUser.RoleTypeCode)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "搜索客户失败!"
 		br.ErrMsg = "搜索客户失败!Err:" + err.Error()

+ 312 - 7
controllers/seal/seal_approval.go

@@ -2,14 +2,24 @@ package seal
 
 import (
 	"encoding/json"
+	"errors"
+	"fmt"
 	"github.com/rdlucklib/rdluck_tools/paging"
+	"github.com/tealeg/xlsx"
 	"hongze/hz_crm_api/controllers"
 	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/company"
+	"hongze/hz_crm_api/models/contract"
+	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/seal"
 	"hongze/hz_crm_api/utils"
+	"os"
+	"path/filepath"
+	"strconv"
 	"strings"
+	"time"
 )
 
 // 用印审批管理
@@ -28,6 +38,8 @@ type SealApprovalController struct {
 // @Param   StartTime   	query   string  false	"提交开始时间"
 // @Param   EndTime   		query   string  false	"提交结束时间"
 // @Param   Keyword   		query   string  false	"搜索关键词(客户名称/社会信用码)"
+// @Param   IsExport   		query   bool  	false   "是否导出excel,默认是false"
+// @Param   AffiliatedCompany   query   string  	false   "归属公司"
 // @Success 200 {object} response.SealApprovalListResp
 // @router /getApprovalPageList [get]
 func (this *SealApprovalController) List() {
@@ -55,7 +67,7 @@ func (this *SealApprovalController) List() {
 		currentIndex = 1
 	}
 	startSize = paging.StartIndex(currentIndex, pageSize)
-
+	isExport, _ := this.GetBool("IsExport", false)
 	// 筛选条件
 	condition := ""
 	joinCondition := " AND a.curr_node_id = d.node_id" // contract_approval和contract_approval_record的join条件
@@ -158,6 +170,19 @@ func (this *SealApprovalController) List() {
 		pars = append(pars, keywords, keywords, keywords)
 	}
 
+	// 归属公司
+	affiliatedCompany := this.GetString("AffiliatedCompany")
+	if affiliatedCompany != "" {
+		condition += ` AND c.affiliated_company = ?`
+		pars = append(pars, affiliatedCompany)
+	}
+
+	//导出excel
+	if isExport {
+		ApprovalListExport(this, condition, joinCondition, pars, br)
+		return
+	}
+
 	// 列表
 	listData, listTotal, err := seal.GetSealApprovalPageList(condition, joinCondition, pars, startSize, pageSize, sysUser)
 	if err != nil {
@@ -176,6 +201,242 @@ func (this *SealApprovalController) List() {
 	}
 }
 
+// ApprovalListExport 审批列表导出
+func ApprovalListExport(this *SealApprovalController, condition, joinCondition string, pars []interface{}, br *models.BaseResponse) {
+	list, err := sealModels.GetSealApprovalList(condition, joinCondition, pars)
+	if err != nil {
+		br.Msg = "审批列表获取失败!"
+		br.ErrMsg = "审批列表获取失败!" + err.Error()
+		return
+	}
+	////超级管理员和权益管理员、权益研究员可以下载所有客户,销售组长能下载本组客户,销售只能下载本人名下客户
+	//resp := new(cygx.CanDownload)
+	//adminInfo, errAdmin := system.GetSysUserById(sysUser.AdminId)
+	//if errAdmin != nil {
+	//	br.Msg = "获取失败"
+	//	br.ErrMsg = "获取失败,Err:" + errAdmin.Error()
+	//	return
+	//}
+	//if adminInfo.Role == "admin" || adminInfo.Role == "researcher" {
+	//	resp.IsCanDownload = true
+	//}
+
+	if len(list) > 0 {
+		// 取出所有列表的关联合同id
+		contractIdSlice := make([]string, 0)
+		contractApprovalIdSlice := make([]string, 0)
+		for i := 0; i < len(list); i++ {
+			contractIdSlice = append(contractIdSlice, strconv.Itoa(list[i].ContractId))
+			contractApprovalIdSlice = append(contractApprovalIdSlice, strconv.Itoa(list[i].ContractApprovalId))
+		}
+
+		// 获取所有关联的合同列表
+		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]
+				}
+			}
+		}
+
+		selfContractApprovalRecordMap := make(map[int][]*contract.ContractApprovalRecord)
+		{
+			if len(contractApprovalIdSlice) > 0 {
+				contractApprovalIdStr := strings.Join(contractApprovalIdSlice, ",")
+				contractApprovalList, tempErr := contract.GetContractApprovalRecordListByContractApprovalIds(contractApprovalIdStr)
+				if tempErr != nil {
+					err = errors.New(fmt.Sprint("获取合同审批记录失败,Err:"+tempErr.Error(), err))
+					return
+				}
+				for i := 0; i < len(contractApprovalList); i++ {
+					selfContractApprovalRecordMap[contractApprovalList[i].ContractApprovalId] = append(selfContractApprovalRecordMap[contractApprovalList[i].ContractApprovalId], contractApprovalList[i])
+				}
+			}
+		}
+
+		for i, v := range list {
+			// 合同编码
+			if selfContract, has := selfContractMap[v.ContractId]; has {
+				list[i].ContractCode = selfContract.ContractCode
+			}
+
+			// 审批人和抄送人
+			if recordList, ok := selfContractApprovalRecordMap[v.ContractApprovalId]; ok {
+				keySort := make([]int, 0)
+				flowNodeMap := make(map[int][]contract.ContractApprovalRecord, 0)
+				for _, approvalRecord := range recordList {
+					if tmpFlowNodeList, ok := flowNodeMap[approvalRecord.NodeId]; ok {
+						flowNodeMap[approvalRecord.NodeId] = append(tmpFlowNodeList, *approvalRecord)
+					} else {
+						tmpFlowNodeList := make([]contract.ContractApprovalRecord, 1)
+						tmpFlowNodeList[0] = *approvalRecord
+						flowNodeMap[approvalRecord.NodeId] = tmpFlowNodeList
+
+						keySort = append(keySort, approvalRecord.NodeId)
+					}
+				}
+				approversList := make([][]string, 0)
+				ccList := make([][]string, 0)
+				for _, key := range keySort {
+					approver := make([]string, 0)
+					cc := make([]string, 0)
+					if node, ok := flowNodeMap[key]; ok {
+						for _, vv := range node {
+							if vv.NodeType == "check" {
+								approver = append(approver, vv.ApproveUserName)
+							} else if vv.NodeType == "cc" {
+								cc = append(cc, vv.ApproveUserName)
+							}
+						}
+						if len(approver) > 0 {
+							approversList = append(approversList, approver)
+						}
+						if len(cc) > 0 {
+							ccList = append(ccList, cc)
+						}
+					}
+				}
+				if len(approversList) > 0 {
+					list[i].FirstLevelApprovers = strings.Join(approversList[0], ",")
+				}
+				if len(ccList) > 0 {
+					list[i].FirstLevelCC = strings.Join(ccList[0], ",")
+				}
+				if len(approversList) > 1 {
+					list[i].SecondLevelApprovers = strings.Join(approversList[1], ",")
+				}
+				if len(ccList) > 1 {
+					list[i].SecondLevelCC = strings.Join(ccList[1], ",")
+				}
+				if len(approversList) > 2 {
+					list[i].ThirdLevelApprovers = strings.Join(approversList[2], ",")
+				}
+				if len(ccList) > 2 {
+					list[i].ThirdLevelCC = strings.Join(ccList[2], ",")
+				}
+			}
+		}
+	}
+	//创建excel
+	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
+
+	sheetName := "审批列表"
+	sheet, err := xlsxFile.AddSheet(sheetName)
+	if err != nil {
+		br.Msg = "新增Sheet失败"
+		br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
+		return
+	}
+	//标头
+	rowTitle := sheet.AddRow()
+	cellA := rowTitle.AddCell()
+	cellA.Value = "归属公司"
+	cellB := rowTitle.AddCell()
+	cellB.Value = "客户名称"
+	cellC := rowTitle.AddCell()
+	cellC.Value = "社会信用码"
+	cellD := rowTitle.AddCell()
+	cellD.Value = "用印用途"
+	cellE := rowTitle.AddCell()
+	cellE.Value = "合同编号"
+	cellF := rowTitle.AddCell()
+	cellF.Value = "合同类型"
+	cellG := rowTitle.AddCell()
+	cellG.Value = "加盖印章"
+	cellH := rowTitle.AddCell()
+	cellH.Value = "所属销售"
+	cellI := rowTitle.AddCell()
+	cellI.Value = "提交时间"
+	cellJ := rowTitle.AddCell()
+	cellJ.Value = "用印状态"
+	cellK := rowTitle.AddCell()
+	cellK.Value = "一级审批人"
+	cellL := rowTitle.AddCell()
+	cellL.Value = "一级抄送人"
+	cellM := rowTitle.AddCell()
+	cellM.Value = "二级审批人"
+	cellN := rowTitle.AddCell()
+	cellN.Value = "二级抄送人"
+	cellO := rowTitle.AddCell()
+	cellO.Value = "三级审批人"
+	cellP := rowTitle.AddCell()
+	cellP.Value = "三级抄送人"
+
+	for _, v := range list {
+		row := sheet.AddRow()
+		cellA := row.AddCell()
+		cellA.Value = v.AffiliatedCompany
+		cellB := row.AddCell()
+		cellB.Value = v.CompanyName
+		cellC := row.AddCell()
+		cellC.Value = v.CreditCode
+		cellD := row.AddCell()
+		cellD.Value = v.Use
+		cellE := row.AddCell()
+		cellE.Value = v.ContractCode
+		cellF := row.AddCell()
+		cellF.Value = v.ContractType
+		cellG := row.AddCell()
+		cellG.Value = v.SealType
+		cellH := row.AddCell()
+		cellH.Value = v.ApplyUserName
+		cellI := row.AddCell()
+		cellI.Value = v.CreateTime.Format(utils.FormatDateTime)
+		cellJ := row.AddCell()
+		cellJ.Value = v.Status
+		cellK := row.AddCell()
+		cellK.Value = v.FirstLevelApprovers
+		cellL := row.AddCell()
+		cellL.Value = v.FirstLevelCC
+		cellM := row.AddCell()
+		cellM.Value = v.SecondLevelApprovers
+		cellN := row.AddCell()
+		cellN.Value = v.SecondLevelCC
+		cellO := row.AddCell()
+		cellO.Value = v.ThirdLevelApprovers
+		cellP := row.AddCell()
+		cellP.Value = v.ThirdLevelCC
+	}
+
+	err = xlsxFile.Save(downLoadnFilePath)
+	if err != nil {
+		br.Msg = "保存文件失败"
+		br.ErrMsg = "保存文件失败"
+		return
+	}
+	downloadFileName := "用印审批列表" + time.Now().Format("2006.01.02")+ ".xlsx"
+	this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
+	defer func() {
+		os.Remove(downLoadnFilePath)
+	}()
+	br.Success = true
+	br.Ret = 200
+	br.IsAddLog = true
+}
+
 // 用印申请
 // @Title 用印申请
 // @Description 用印申请
@@ -204,12 +465,13 @@ func (this *SealApprovalController) Apply() {
 		return
 	}
 	reqVerify := utils.Rules{
-		"Use":         {utils.NotEmpty()},
-		"CompanyName": {utils.NotEmpty()},
-		"CreditCode":  {utils.NotEmpty()},
-		"ServiceType": {utils.NotEmpty()},
-		"SealType":    {utils.NotEmpty()},
-		"FileUrls":    {utils.NotEmpty()},
+		"Use":               {utils.NotEmpty()},
+		"CompanyName":       {utils.NotEmpty()},
+		"CreditCode":        {utils.NotEmpty()},
+		"ServiceType":       {utils.NotEmpty()},
+		"SealType":          {utils.NotEmpty()},
+		"FileUrls":          {utils.NotEmpty()},
+		"AffiliatedCompany": {utils.NotEmpty()},
 	}
 
 	err = utils.Verify(req, reqVerify, utils.LANG_CN)
@@ -294,6 +556,11 @@ func (this *SealApprovalController) Edit() {
 		br.ErrMsg = "合同附件不能为空"
 		return
 	}
+	if req.AffiliatedCompany == "" {
+		br.Msg = "归属公司不能为空"
+		br.ErrMsg = "归属公司不能为空"
+		return
+	}
 
 	// 编辑用印
 	err = seal.EditApply(this.SysUser, req)
@@ -370,6 +637,11 @@ func (this *SealApprovalController) VerifierEdit() {
 		br.ErrMsg = "合同附件不能为空"
 		return
 	}
+	if req.AffiliatedCompany == "" {
+		br.Msg = "归属公司不能为空"
+		br.ErrMsg = "归属公司不能为空"
+		return
+	}
 
 	// 审批者编辑
 	err = seal.VerifierEditApply(this.SysUser, req)
@@ -693,3 +965,36 @@ func (this *SealApprovalController) OperationList() {
 		List: list,
 	}
 }
+
+// 关联公司列表
+// @Title 关联公司列表
+// @Description 关联公司列表
+// @Success 200 {object} response.SealApprovalListResp
+// @router /getAffiliatedCompany [get]
+func (this *SealApprovalController) AffiliatedCompanyList() {
+	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
+	}
+	crmConfig, err := company.GetConfigDetailByCode("affiliated_company")
+	if err != nil {
+		br.Msg = "获取配置失败"
+		br.ErrMsg = "获取配置失败"
+		br.IsSendEmail = false
+		return
+	}
+	list := strings.Split(crmConfig.ConfigValue, ",")
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = list
+}

+ 743 - 53
controllers/statistic_company_merge.go

@@ -7,6 +7,7 @@ import (
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/company"
 	"hongze/hz_crm_api/models/response"
+	"hongze/hz_crm_api/models/system"
 	"hongze/hz_crm_api/services"
 	cygxService "hongze/hz_crm_api/services/cygx"
 	"os"
@@ -40,7 +41,7 @@ type StatisticCompanyMergerController struct {
 // @Param   DataType   query   string  false       "报表类型,枚举值:`新增试用`,`新签客户`,`续约客户`,`未续约客户`"
 // @Param   TryOutType   query   string  false       " '试用', '非试用' 非试用即为冻结/流失"
 // @Param   IsExport   query   bool  false       "是否导出excel,默认是false"
-// @Param   IsConfirm   query   int  false       "是否确认续约: -1-默认全部; 0-待确认; 1-已确认"
+// @Param   IsConfirm   query   int  false       "是否确认续约: -1-默认全部; 0-待确认; 1-已确认 ;2-到期合同"
 // @Param   CompanyAscribeId   query   int  false       "归因ID"
 // @Param   PackageDifference   query   string  false       "和上一份合同的区别,枚举值:`增加套餐`,`减少套餐`,`维持套餐`"
 // @Success 200 {object} response.IncrementalCompanyListResp
@@ -108,15 +109,21 @@ func (this *StatisticCompanyMergerController) MergeCompanyList() {
 	var pars []interface{}
 
 	//条件
-	if adminId != "" {
-		condition += ` AND c.seller_id in  (` + adminId + `) `
-		//pars = append(pars, adminId)
-	} else {
-
-		//根据当前角色来获取查询条件
-		condition, pars = getQueryParams(condition, pars, sysUser, "c.")
-
-	}
+	//if adminId != "" {
+	//	//condition += ` AND a.seller_id_init in  (` + adminId + `) `
+	//	//condition += ` AND c.seller_id in  (` + adminId + `) `
+	//	//pars = append(pars, adminId)
+	//} else {
+	//
+	//	//if dataType == "未续约客户" {
+	//	//	//根据当前角色来获取查询条件
+	//	//	condition, pars = getQueryParams(condition, pars, sysUser, "c.")
+	//	//} else {
+	//	//	//根据当前角色来获取查询条件
+	//	//	condition, pars = getQueryParamsInit(condition, pars, sysUser, "c.")
+	//	//}
+	//
+	//}
 	if regionType != "" {
 		condition += ` AND b.region_type = ? `
 		pars = append(pars, regionType)
@@ -160,10 +167,14 @@ func (this *StatisticCompanyMergerController) MergeCompanyList() {
 	if isConfirm != -1 {
 		if isConfirm == 0 {
 			conditionAscribRai += ` AND  a.company_contract_id NOT IN (` + utils.GetOrmInReplace(len(noRenewedcompanyContractIds)) + `)  ` // 待确认
-		} else {
+			parsAscribeRai = append(parsAscribeRai, noRenewedcompanyContractIds)
+		} else if isConfirm == 1 {
 			conditionAscribRai += ` AND  a.company_contract_id IN (` + utils.GetOrmInReplace(len(noRenewedcompanyContractIds)) + `)    ` // 已确认
+			parsAscribeRai = append(parsAscribeRai, noRenewedcompanyContractIds)
+		} else if isConfirm == 2 {
+			conditionAscribRai += ` AND  a.start_date  < ? ` // 已确认
+			parsAscribeRai = append(parsAscribeRai, time.Now().Format(utils.FormatDate))
 		}
-		parsAscribeRai = append(parsAscribeRai, noRenewedcompanyContractIds)
 	}
 	//归因ID CRM 13.9
 	if companyAscribeId > 0 {
@@ -189,7 +200,7 @@ func (this *StatisticCompanyMergerController) MergeCompanyList() {
 		parsAscribeRai = append(parsAscribeRai, noRenewedcompanyContractIds)
 	}
 
-	condition += ` AND c.product_id = ?   AND  a.status = 1 `
+	condition += ` AND c.product_id = ?   `
 	pars = append(pars, 2)
 
 	var list []*models.IncrementalList
@@ -201,14 +212,66 @@ func (this *StatisticCompanyMergerController) MergeCompanyList() {
 	var dataTotal, trialTotal, renewalCompanyTotal int
 	var notRenewalTryOut, notRenewalNotTryOut int
 
+	//试用客户数
+	{
+		condition1 := condition
+		pars1 := pars
+		//销售筛选条件
+		if adminId != "" {
+			condition1 += ` AND c.seller_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 = '试用' `
+		pars1 = append(pars1, startDate, endDate)
+
+		total, err := models.GetIncrementalCompanyCountByOperationRecord(condition1, pars1)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		trialTotal = total
+
+		if dataType == "新增试用" {
+			//列表数据数量
+			total, err := models.GetIncrementalCompanyProductCountByOperationRecord(condition1, pars1)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取失败,Err:" + err.Error()
+				return
+			}
+
+			//列表页数据
+			tmpList, err := models.GetIncrementalCompanyListByOperationRecord(condition1, pars1, startSize, pageSize)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取失败,Err:" + err.Error()
+				return
+			}
+			for _, v := range tmpList {
+				v.SellerName = v.SellerNameInit
+			}
+			list = tmpList
+			dataTotal = total
+		}
+	}
+
 	//新签客户数
 	{
 		condition1 := condition
 		pars1 := pars
-		condition1 += ` AND a.start_date >= ? AND a.start_date <= ?  `
+		//销售筛选条件
+		if adminId != "" {
+			condition1 += ` AND a.seller_id_init in  (` + adminId + `) `
+		} else {
+			condition1, pars1 = getQueryParamsInit(condition1, pars1, sysUser, "c.")
+		}
+		condition1 += ` AND  a.status = 1  AND a.start_date >= ?  AND a.start_date <= ?  `
 		pars1 = append(pars1, startDate, endDate)
-		condition1 += ` AND a.rai_contract_type = ? `
+		condition1 += `  AND a.rai_contract_type = ? `
 		pars1 = append(pars1, "新签合同")
+
 		newCompanyTotal, err = company.GetIncrementalNewCompanyProductMergeCount(condition1, pars1)
 		if err != nil && err.Error() != utils.ErrNoRow() {
 			br.Msg = "获取失败"
@@ -241,10 +304,16 @@ func (this *StatisticCompanyMergerController) MergeCompanyList() {
 	{
 		condition1 := condition
 		pars1 := pars
-		condition1 += ` AND a.start_date >= ? AND a.start_date <= ? `
+		condition1 += ` AND  a.status = 1 AND a.start_date >= ? AND a.start_date <= ? `
 		pars1 = append(pars1, startDate, endDate)
 		condition1 += ` AND a.rai_contract_type = ? `
 		pars1 = append(pars1, "续约合同")
+		//销售筛选条件
+		if adminId != "" {
+			condition1 += ` AND a.seller_id_init in  (` + adminId + `) `
+		} else {
+			condition1, pars1 = getQueryParamsInit(condition1, pars1, sysUser, "c.")
+		}
 		////额外条件(续约合同的起始日期包含在所选时间段内且不包含在新签合同存续期内的客户)
 		//pars1 = append(pars1, endDate)
 
@@ -288,11 +357,26 @@ func (this *StatisticCompanyMergerController) MergeCompanyList() {
 		condition1 := condition
 		pars1 := pars
 
-		condition1 += ` AND a.end_date >= ? AND a.end_date  <= ? `
+		condition1 += condition
+		pars1 = append(pars1, pars)
+
+		condition1 += `    AND a.status = 1  AND  a.end_date >= ? AND a.end_date  <= ? `
 		pars1 = append(pars1, startDate, endDate)
 		//condition1 += ` AND a.operation = ? `
 		//pars1 = append(pars1, "try_out")
-		condition1 += ` AND c.status not in ("永续","正式","关闭")  `
+
+		//销售筛选条件
+		if adminId != "" {
+			condition1 += ` AND a.seller_id_last in  (` + adminId + `) `
+		} else {
+			condition1, pars1 = getQueryParamsLast(condition1, pars1, sysUser, "c.")
+		}
+
+		//未续约待确认数量
+		notRenewalToBeCondition := condition1
+		notRenewalToBePars := pars1
+		notRenewalToBeCondition += conditionAscribRaiToBeTotal
+		notRenewalToBePars = append(notRenewalToBePars, parsAscribeRaiTobeTotal)
 
 		//未续约已确认数量
 		notRenewalCondition := condition1
@@ -307,18 +391,20 @@ func (this *StatisticCompanyMergerController) MergeCompanyList() {
 		}
 		notRenewalCompanyTotal = total
 
-		//未续约待确认数量
-		notRenewalToBeCondition := condition1
-		notRenewalToBePars := pars1
-		notRenewalToBeCondition += conditionAscribRaiToBeTotal
-		notRenewalToBePars = append(notRenewalToBePars, parsAscribeRaiTobeTotal)
-		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()
 			return
 		}
 
+		if isConfirm != 2 {
+			condition1 += `  AND a.not_renewal_hide = 0  AND c.status not in ("永续","正式","关闭") `
+		}
+
+		//if isConfirm == 1 {
+		//	condition1 += ` AND  a.company_ascribe_id  > 0 AND  a.company_ascribe_id  !=9   ` // 已确认未续约
+		//}
 		condition1 += conditionAscribRai
 		pars1 = append(pars1, parsAscribeRai)
 		if dataType == "未续约客户" {
@@ -403,6 +489,7 @@ func (this *StatisticCompanyMergerController) MergeCompanyList() {
 		list = make([]*models.IncrementalList, 0)
 	}
 	var companyContractIds []int
+	var companyIds []int
 	for i := 0; i < listLen; i++ {
 		item := list[i]
 		companyContractIds = append(companyContractIds, item.CompanyContractId)
@@ -415,6 +502,7 @@ func (this *StatisticCompanyMergerController) MergeCompanyList() {
 			expireDay := fmt.Sprintf("%v", int(sub.Hours()/24))
 			list[i].ExpireDay = expireDay
 		}
+		companyIds = append(companyIds, item.CompanyId)
 	}
 
 	//合并合同所对应的权限
@@ -424,8 +512,11 @@ func (this *StatisticCompanyMergerController) MergeCompanyList() {
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
+
+	mapIsUserMaker := cygxService.GetCompanyProductIsUserMakerByCompanyIds(companyIds) //根据公司ID获取近四周之内有决策人互动的客户
 	for _, v := range list {
 		v.PermissionName = mappermissionName[v.CompanyContractId]
+		v.IsUserMaker = mapIsUserMaker[v.CompanyId]
 	}
 
 	page := paging.GetPaging(currentIndex, pageSize, dataTotal)
@@ -512,17 +603,23 @@ func MergeCompanyListListExport(this *StatisticCompanyMergerController, dataType
 	cellName.SetStyle(style)
 	cellName.SetValue("客户名称")
 
-	cellProName := titleRow.AddCell()
-	cellProName.SetStyle(style)
-	cellProName.SetValue("客户类型")
+	//cellProName := titleRow.AddCell()
+	//cellProName.SetStyle(style)
+	//cellProName.SetValue("客户类型")
 
 	cellSellerName := titleRow.AddCell()
 	cellSellerName.SetStyle(style)
 	cellSellerName.SetValue("所属销售")
 
-	cellMoney := titleRow.AddCell()
-	cellMoney.SetStyle(style)
-	cellMoney.SetValue("合同金额")
+	if dataType != "新增试用" {
+		cellShareSeller := titleRow.AddCell()
+		cellShareSeller.SetStyle(style)
+		cellShareSeller.SetValue("服务销售")
+
+		cellMoney := titleRow.AddCell()
+		cellMoney.SetStyle(style)
+		cellMoney.SetValue("合同金额")
+	}
 
 	cellTime := titleRow.AddCell()
 	cellTime.SetStyle(style)
@@ -530,11 +627,11 @@ func MergeCompanyListListExport(this *StatisticCompanyMergerController, dataType
 	case "新增试用":
 		cellTime.SetValue("新增时间")
 	case "新签客户":
-		cellTime.SetValue("签约时间")
+		cellTime.SetValue("合同期限")
 	case "续约客户":
-		cellTime.SetValue("续约时间")
+		cellTime.SetValue("合同期限")
 	case "未续约客户":
-		cellTime.SetValue("最近合同到期时间")
+		cellTime.SetValue("合同期限")
 
 		cellAscribeContent := titleRow.AddCell()
 		cellAscribeContent.SetStyle(style)
@@ -544,9 +641,13 @@ func MergeCompanyListListExport(this *StatisticCompanyMergerController, dataType
 		cellContent.SetStyle(style)
 		cellContent.SetValue("详细原因")
 	}
-	cellPermissionName := titleRow.AddCell()
-	cellPermissionName.SetStyle(style)
-	cellPermissionName.SetValue("签约套餐")
+
+	if dataType != "新增试用" {
+		cellPermissionName := titleRow.AddCell()
+		cellPermissionName.SetStyle(style)
+		cellPermissionName.SetValue("签约套餐")
+	}
+
 	for _, v := range resp.List {
 		dataRow := sheel.AddRow()
 		dataRow.SetHeight(20)
@@ -555,18 +656,26 @@ func MergeCompanyListListExport(this *StatisticCompanyMergerController, dataType
 		cellDataName.SetStyle(style)
 		cellDataName.SetValue(v.CompanyName)
 
-		cellDataProName := dataRow.AddCell()
-		cellDataProName.SetStyle(style)
-		cellDataProName.SetValue(v.ProductName)
+		//cellDataProName := dataRow.AddCell()
+		//cellDataProName.SetStyle(style)
+		//cellDataProName.SetValue(v.ProductName)
 
 		cellDataSellerName := dataRow.AddCell()
 		cellDataSellerName.SetStyle(style)
 		cellDataSellerName.SetValue(v.SellerName)
 
+		if dataType != "新增试用" {
+			cellDataShareSeller := dataRow.AddCell()
+			cellDataShareSeller.SetStyle(style)
+			cellDataShareSeller.SetValue(v.ShareSeller)
+
+			cellDataMoney := dataRow.AddCell()
+			cellDataMoney.SetStyle(style)
+			cellDataMoney.SetValue(v.Money)
+		}
+
 		//if dataType == "新签客户" || dataType == "续约客户" {
-		cellDataMoney := dataRow.AddCell()
-		cellDataMoney.SetStyle(style)
-		cellDataMoney.SetValue(v.Money)
+
 		//}
 
 		cellDataTime := dataRow.AddCell()
@@ -575,11 +684,11 @@ func MergeCompanyListListExport(this *StatisticCompanyMergerController, dataType
 		case "新增试用":
 			cellDataTime.SetValue(v.CreateTime)
 		case "新签客户":
-			cellDataTime.SetValue(v.StartDate)
+			cellDataTime.SetValue(fmt.Sprint(v.StartDate, " ~  ", v.EndDate))
 		case "续约客户":
-			cellDataTime.SetValue(v.StartDate)
+			cellDataTime.SetValue(fmt.Sprint(v.StartDate, " ~  ", v.EndDate))
 		case "未续约客户":
-			cellDataTime.SetValue(v.EndDate)
+			cellDataTime.SetValue(fmt.Sprint(v.StartDate, " ~  ", v.EndDate))
 
 			cellAscribeContent := dataRow.AddCell()
 			cellAscribeContent.SetStyle(style)
@@ -1545,10 +1654,10 @@ func (this *StatisticCompanyMergerController) CompanyContractPercentageListV2()
 	//}
 
 	//判断结束时间是否晚于当前时间,如果晚于当前时间,那么就把当前时间作为截止时间。
-	endDateTime, _ := time.Parse(utils.FormatDate, endDate)
-	if endDateTime.After(time.Now()) {
-		endDate = time.Now().Format(utils.FormatDate)
-	}
+	//endDateTime, _ := time.Parse(utils.FormatDate, endDate)
+	//if endDateTime.After(time.Now()) {
+	//	endDate = time.Now().Format(utils.FormatDate)
+	//}
 	//fmt.Println("endDate", endDate)
 	if contractDataType == "" {
 		contractDataType = "续约合同"
@@ -1568,10 +1677,10 @@ func (this *StatisticCompanyMergerController) CompanyContractPercentageListV2()
 
 	//条件
 	if adminId != "" {
-		condition += ` AND c.seller_id in  (` + adminId + `) `
+		condition += ` AND a.seller_id_last in  (` + adminId + `) `
 	} else {
 		//根据当前角色来获取查询条件
-		condition, pars = getQueryParams(condition, pars, sysUser, "c.")
+		condition, pars = getQueryParamsLast(condition, pars, sysUser, "c.")
 	}
 
 	//权益有效合同
@@ -1667,7 +1776,7 @@ func (this *StatisticCompanyMergerController) CompanyContractPercentageListV2()
 	pars1 = append(pars1, startDate, endDate)
 	//condition1 += ` AND a.rai_contract_type = ? `
 	//pars1 = append(pars1, "续约合同")
-	condition1 += ` AND  a.company_ascribe_id  > 0 AND  a.company_ascribe_id  !=9   ` // 已确认未续约
+	condition1 += ` AND  a.company_ascribe_id  > 0 AND  a.company_ascribe_id  !=9    AND c.STATUS NOT IN ( "永续", "正式", "关闭" )  ` // 已确认未续约
 
 	totalNo, err := company.GetIncrementalRenewalCompanyProductMergeCount(condition1, pars1)
 	if err != nil && err.Error() != utils.ErrNoRow() {
@@ -1708,7 +1817,7 @@ func (this *StatisticCompanyMergerController) CompanyContractPercentageListV2()
 	//	condition1 += ` AND a.end_date >= ? AND a.end_date <= ? `
 	//}
 
-	conditionEnd1 += ` AND a.end_date >= ? AND a.end_date <= ?  AND  a.company_ascribe_id  !=9   `
+	conditionEnd1 += ` AND a.end_date >= ? AND a.end_date <= ?  `
 	parsEnd1 = append(parsEnd1, startDate, endDate)
 
 	//condition1 += ` AND a.start_date  < ?   `
@@ -1720,12 +1829,14 @@ func (this *StatisticCompanyMergerController) CompanyContractPercentageListV2()
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
+
 	totalMoneyEnd, err := company.GetIncrementalRenewalCompanyProductMergeSumMoney(conditionEnd1, parsEnd1)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
+	fmt.Println("totalMoneyEnd", int(totalMoneyEnd))
 	expireRenewalContractTotal = totalEnd
 	expireRenewalContractMoney = int(totalMoneyEnd)
 	if contractDataType == "到期合同" {
@@ -1778,6 +1889,7 @@ func (this *StatisticCompanyMergerController) CompanyContractPercentageListV2()
 			v.AscribeContent = mapGetCompanyAscribeContent[v.CompanyContractId]
 			v.IsShowNoRenewedNote = true
 		}
+		v.SellerName = v.SellerNameLast
 	}
 
 	page := paging.GetPaging(currentIndex, pageSize, dataTotal)
@@ -1799,6 +1911,406 @@ func (this *StatisticCompanyMergerController) CompanyContractPercentageListV2()
 	br.Data = resp
 }
 
+// @Title 权益客户未续约率下载
+// @Description 权益客户未续约率下载接口
+// @Param   AdminId   query   string  true       "销售id,多个用英文逗号隔开,空字符串为全部"
+// @Param   StartDate   query   string  false       "开始日期"
+// @Param   EndDate   query   string  false       "结束日期"
+// @Param   ExportType   query   int	  true	       "下载类型 1:下载当前销售的合同明细数据;2:下载所有销售未续约数据列表"
+// @Success 200 {object} response.IncrementalCompanyListResp
+// @router /merge_company/company_contract_percentage/list_export [get]
+func (this *StatisticCompanyMergerController) CompanyContractPercentageListExport() {
+	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")
+	exportType, _ := this.GetInt("ExportType")
+	adminId := this.GetString("AdminId")
+	contractDataType := this.GetString("ContractDataType")
+	startDate := this.GetString("StartDate")
+	endDate := this.GetString("EndDate")
+	//initendDate := this.GetString("EndDate")
+	if startDate == "" || endDate == "" {
+		br.Msg = "开始时间或结束时间不能为空"
+		return
+	}
+
+	//判断结束时间是否晚于当前时间,如果晚于当前时间,那么就把当前时间作为截止时间。
+	//endDateTime, _ := time.Parse(utils.FormatDate, endDate)
+	//if endDateTime.After(time.Now()) {
+	//	endDate = time.Now().Format(utils.FormatDate)
+	//}
+	//fmt.Println("endDate", endDate)
+	if contractDataType == "" {
+		contractDataType = "续约合同"
+	}
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = 10000
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+
+	var condition string
+	var pars []interface{}
+
+	if exportType == 1 {
+		//条件
+		if adminId != "" {
+			condition += ` AND a.seller_id_last in  (` + adminId + `) `
+		}
+	}
+
+	//权益有效合同
+	condition += ` AND c.product_id = 2   AND  a.status = 1 `
+
+	//var list []*models.IncrementalList
+
+	condition1 := condition
+	pars1 := pars
+	condition1 += ` AND a.end_date >= ? AND a.end_date <= ? `
+	pars1 = append(pars1, startDate, endDate)
+	condition1 += ` AND  a.company_ascribe_id  > 0 AND  a.company_ascribe_id  !=9   ` // 已确认未续约
+	condition1 += ` AND c.status not in ("永续","正式","关闭")  `
+
+	//if contractDataType == "续约合同" || contractDataType == "确认不续约合同" {
+	//不续约列表数据
+	listRenewal, err := models.GetIncrementalCompanyMergeListEnd(condition1, pars1, startSize, pageSize)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	conditionEnd1 := condition
+	parsEnd1 := pars
+
+	conditionEnd1 += ` AND a.end_date >= ? AND a.end_date <= ?     `
+	parsEnd1 = append(parsEnd1, startDate, endDate)
+
+	//if contractDataType == "到期合同" {
+	//到期列表数据
+	listEndDate, err := models.GetIncrementalCompanyMergeListEnd(conditionEnd1, parsEnd1, startSize, pageSize)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	//return
+
+	var companyContractIds []int
+	for _, v := range listRenewal {
+		companyContractIds = append(companyContractIds, v.CompanyContractId)
+		v.SellerId = v.SellerIdLast
+	}
+	for _, v := range listEndDate {
+		companyContractIds = append(companyContractIds, v.CompanyContractId)
+		v.SellerId = v.SellerIdLast
+	}
+
+	//合同归因标签
+	mapGetCompanyAscribeContent, mapContent := services.GetCompanyContractAscribeContentMap(companyContractIds)
+
+	//合并合同所对应的权限
+	mappermissionName, err := cygxService.GetCompanyContractPermissionNameMapById(companyContractIds)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	for _, v := range listRenewal {
+		v.PermissionName = mappermissionName[v.CompanyContractId]
+		if mapGetCompanyAscribeContent[v.CompanyContractId] != "" {
+			v.Content = mapContent[v.CompanyContractId]
+			v.AscribeContent = mapGetCompanyAscribeContent[v.CompanyContractId]
+			v.IsShowNoRenewedNote = true
+		}
+	}
+	for _, v := range listEndDate {
+		v.PermissionName = mappermissionName[v.CompanyContractId]
+		if mapGetCompanyAscribeContent[v.CompanyContractId] != "" {
+			v.Content = mapContent[v.CompanyContractId]
+			v.AscribeContent = mapGetCompanyAscribeContent[v.CompanyContractId]
+			v.IsShowNoRenewedNote = true
+		}
+	}
+	//创建excel
+	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
+	if exportType == 1 {
+		for pidIndex := 0; pidIndex <= 1; pidIndex++ {
+			var sheetName string
+			var listDate []*models.IncrementalList
+			if pidIndex == 0 {
+				sheetName = "确认不续约合同"
+				listDate = listRenewal
+			} else {
+				sheetName = "到期合同"
+				listDate = listEndDate
+			}
+			sheet, err := xlsxFile.AddSheet(sheetName)
+			if err != nil {
+				br.Msg = "新增Sheet失败"
+				br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
+				return
+			}
+			//标头
+			rowTitle := sheet.AddRow()
+			cellA := rowTitle.AddCell()
+			cellA.Value = "客户名称"
+			cellB := rowTitle.AddCell()
+			cellB.Value = "客户状态"
+			cellC := rowTitle.AddCell()
+			cellC.Value = "所属销售"
+			cellCSeller := rowTitle.AddCell()
+			cellCSeller.Value = "服务销售"
+			cellD := rowTitle.AddCell()
+			cellD.Value = "合同期限"
+			cellE := rowTitle.AddCell()
+			cellE.Value = "签约套餐"
+			cellF := rowTitle.AddCell()
+			cellF.Value = "合同金额"
+
+			if pidIndex == 0 {
+				cellG := rowTitle.AddCell()
+				cellG.Value = "不续约归因"
+				cellH := rowTitle.AddCell()
+				cellH.Value = "详细说明"
+			}
+
+			for _, item := range listDate {
+				row := sheet.AddRow()
+				cellAData := row.AddCell()
+				cellAData.Value = item.CompanyName
+				cellBData := row.AddCell()
+				cellBData.Value = item.ProductStatus
+				cellCData := row.AddCell()
+				cellCData.Value = item.SellerNameLast
+				cellCSellerData := row.AddCell()
+				cellCSellerData.Value = item.ShareSellerLast
+				cellDData := row.AddCell()
+				cellDData.Value = item.StartDate + "~" + item.EndDate
+				cellEData := row.AddCell()
+				cellEData.Value = item.PermissionName
+				cellFData := row.AddCell()
+				cellFData.Value = fmt.Sprint(item.Money)
+				if pidIndex == 0 {
+					cellGData := row.AddCell()
+					cellGData.Value = item.AscribeContent
+
+					cellHData := row.AddCell()
+					cellHData.Value = item.Content
+				}
+			}
+		}
+		err = xlsxFile.Save(downLoadnFilePath)
+		if err != nil {
+			br.Msg = "保存文件失败"
+			br.ErrMsg = "保存文件失败"
+			return
+		}
+	} else {
+
+		var sheetName string
+		//var listDate []*models.IncrementalList
+		sheetName = "未续约率"
+		sheet, err := xlsxFile.AddSheet(sheetName)
+		if err != nil {
+			br.Msg = "新增Sheet失败"
+			br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
+			return
+		}
+		//标头
+		rowTitle := sheet.AddRow()
+		cellA := rowTitle.AddCell()
+		cellA.Value = "姓名"
+		cellB := rowTitle.AddCell()
+		cellB.Value = "确认不续约合同数"
+		cellC := rowTitle.AddCell()
+		cellC.Value = "确认不续约合同金额"
+		cellD := rowTitle.AddCell()
+		cellD.Value = "到期合同数"
+		cellE := rowTitle.AddCell()
+		cellE.Value = "到期合同金额"
+		cellF := rowTitle.AddCell()
+		cellF.Value = "确认不续约率"
+
+		listRaiSeller, err := system.GetSysuserRaiListNoServer()
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取权益销售信息失败,Err:" + err.Error()
+			return
+		}
+
+		//NoRenewalContractTotal      int    `description:"确认不续约合同数"`
+		//NoRenewalContractMoney      int    `description:"确认不续约合同金额"`
+		//ExpireRenewalContractTotal  int    `description:"到期合同数量"`
+		//ExpireRenewalContractMoney  int    `description:"到期合同总金额"`
+		//NoRenewalContractPercentage string `description:"确认不续约率"`
+		mapNoRenewalContractTotal := make(map[int]int)
+		mapNoRenewalContractMoney := make(map[int]float64)
+		mapExpireRenewalContractTotal := make(map[int]int)
+		mapExpireRenewalContractMoney := make(map[int]float64)
+
+		//mapData := make(map[int]*response.IncrementalCompanyPercentageExportResp)
+		for _, v := range listRenewal {
+			mapNoRenewalContractTotal[v.SellerIdLast]++
+			mapNoRenewalContractMoney[v.SellerIdLast] += v.Money
+		}
+
+		for _, v := range listEndDate {
+			mapExpireRenewalContractTotal[v.SellerIdLast]++
+			mapExpireRenewalContractMoney[v.SellerIdLast] += v.Money
+		}
+
+		for _, item := range listRaiSeller {
+			if item.Enabled == 0 && mapNoRenewalContractTotal[item.AdminId] == 0 && mapExpireRenewalContractTotal[item.AdminId] == 0 {
+				continue
+			}
+			row := sheet.AddRow()
+			cellAData := row.AddCell()
+			cellAData.Value = item.RealName
+			cellBData := row.AddCell()
+			cellBData.Value = fmt.Sprint(mapNoRenewalContractTotal[item.AdminId])
+			cellCData := row.AddCell()
+			cellCData.Value = utils.SubFloatToString(mapNoRenewalContractMoney[item.AdminId], 2)
+
+			cellEData := row.AddCell()
+			cellEData.Value = fmt.Sprint(mapExpireRenewalContractTotal[item.AdminId])
+			cellFData := row.AddCell()
+			cellFData.Value = utils.SubFloatToString(mapExpireRenewalContractMoney[item.AdminId], 2)
+
+			cellGData := row.AddCell()
+
+			//分子或者分母为零的时候,不做计算
+			if mapNoRenewalContractMoney[item.AdminId] == 0 || mapExpireRenewalContractMoney[item.AdminId] == 0 {
+				cellGData.Value = "0%"
+			} else {
+				cellGData.Value = fmt.Sprint(utils.SubFloatToString(float64(mapNoRenewalContractMoney[item.AdminId])/float64(mapExpireRenewalContractMoney[item.AdminId])*100, 2), "%")
+			}
+		}
+		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"
+// @Success Ret=200 {object} company.GetCompanyContractDetailListResp
+// @router /merge_company_previous/last_year [get]
+func (this *StatisticCompanyMergerController) CompanyPreviousLastYear() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	AdminUser := this.SysUser
+	if AdminUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	resp := new(company.GetCompanyContractDetailListResp)
+	companyContractId, _ := this.GetInt("CompanyContractId")
+	if companyContractId < 1 {
+		br.Msg = "请输入合同ID"
+		return
+	}
+	var condition string
+	var pars []interface{}
+	//获取最新的一条到期的合同信息
+
+	condition = " AND company_contract_id = ?  "
+	pars = append(pars, companyContractId)
+	detail, err := company.GetCompanyContracDetail(condition, pars)
+	if err != nil {
+		br.Msg = "详情不存在"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	startDateContrac := detail.StartDate                                            // 合同开始时间
+	startDateYear := utils.StrDateToDate(startDateContrac).AddDate(-1, 0, 0).Year() //所要查询的年份
+	startDate := fmt.Sprint(startDateYear, "-01-01")
+	endDate := fmt.Sprint(startDateYear, "-12-31")
+
+	//获取前一份合同的信息
+	pars = make([]interface{}, 0)
+	condition = " AND company_id = ?   AND status = 1  AND  start_date >= ? AND  start_date <= ? AND product_id = 2  ORDER BY start_date DESC   "
+	pars = append(pars, detail.CompanyId, startDate, endDate)
+	detailPreviousList, err := company.GetCompanyContracList(condition, pars)
+	if err != nil {
+		br.Msg = "详情不存在"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	var companyContractIds []int
+	for _, v := range detailPreviousList {
+		companyContractIds = append(companyContractIds, v.CompanyContractId)
+	}
+	//合并合同所对应的权限
+	mappermissionName, err := cygxService.GetCompanyContractPermissionNameMapById(companyContractIds)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	for _, v := range detailPreviousList {
+		v.PermissionName = mappermissionName[v.CompanyContractId]
+	}
+	resp.List = detailPreviousList
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
 func init213() {
 	var condition string
 	var pars []interface{}
@@ -1850,3 +2362,181 @@ func init323() {
 		}
 	}
 }
+
+//func init() {
+//	init16_1_06()
+//}
+
+func init16_1_01() {
+	var condition string
+	var pars []interface{}
+
+	condition = "  AND  product_id = 2 "
+	var companyIds []int
+	companyContractList, e := company.GetCompanyContractList(condition, pars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		fmt.Println(e)
+		return
+	}
+
+	for _, v := range companyContractList {
+		if utils.InArrayByInt(companyIds, v.CompanyId) {
+			continue
+		}
+		companyIds = append(companyIds, v.CompanyId)
+	}
+
+	condition = "   AND company_id IN (" + (utils.GetOrmInReplace(len(companyIds))) + ") AND product_id = 2  AND share_seller_id > 0  "
+	pars = append(pars, companyIds)
+	listCompanyProduct, e := company.GetCompanyProductList(condition, pars)
+	if e != nil {
+		fmt.Println(e)
+		return
+	}
+	for _, v := range listCompanyProduct {
+		fmt.Println(v.ShareSellerId, v.ShareSeller)
+
+		e = company.UpdateCompanyContractTypeinit16_1_01(v.ShareSeller, v.ShareSellerId, v.CompanyId)
+		if e != nil {
+			fmt.Println(e)
+			return
+		}
+	}
+}
+
+func init16_1_02() {
+	var condition string
+	var pars []interface{}
+
+	condition = "  AND  product_id = 2  AND company_contract_id > 0  "
+
+	CompanyApprovalList, e := company.GetCompanyApprovalList(condition, pars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		fmt.Println(e)
+		return
+	}
+
+	for _, v := range CompanyApprovalList {
+		fmt.Println(v.CompanyId, v.CompanyContractId, "__", v.CompanyApprovalId)
+
+		e = company.UpdateCompanyContractTypeinit16_1_02(v.ApplyRealName, v.ApplyUserId, v.CompanyContractId)
+		if e != nil {
+			fmt.Println(e)
+			return
+		}
+	}
+}
+
+func init16_1_03() {
+	CompanyApprovalList, e := company.GetCompanyOperationRecordListinitcrm16_1()
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		fmt.Println(e)
+		return
+	}
+
+	for _, v := range CompanyApprovalList {
+		fmt.Println(v.CompanyId, v.SellerId, "__", v.SysRealName)
+		e = company.UpdateCompanyProductsellerInit(v.SellerId, v.SysRealName, v.CompanyId, 2)
+		if e != nil {
+			fmt.Println(e)
+			return
+		}
+	}
+}
+
+func init16_1_04() {
+	var condition string
+	var pars []interface{}
+
+	condition = "  AND  product_id = 2  AND  seller_id_init = 0    "
+
+	CompanyApprovalList, e := company.GetCompanyContracList(condition, pars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		fmt.Println(e)
+		return
+	}
+
+	for _, v := range CompanyApprovalList {
+		productItem, e := company.GetCompanyProductByCompanyIdAndProductId(v.CompanyId, 2)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			fmt.Println(e)
+			return
+		}
+		if productItem == nil {
+			continue
+		}
+		e = company.UpdateCompanyContractTypeinit16_1_02(productItem.SellerName, productItem.SellerId, v.CompanyContractId)
+		if e != nil {
+			fmt.Println(e)
+			return
+		}
+	}
+}
+
+//func init16_1_05() {
+//	var condition string
+//	var pars []interface{}
+//
+//	condition = "  AND  product_id = 2    "
+//
+//	listProduct, e := company.GetCompanyProductList(condition, pars)
+//	if e != nil {
+//		fmt.Println(e)
+//		return
+//	}
+//	for _, v := range listProduct {
+//		e = company.UpdateCompanyProductSellerUnexpiredInitinit16_1_05(v.SellerId, v.SellerName, v.CompanyId)
+//		if e != nil {
+//			fmt.Println(e)
+//			return
+//		}
+//	}
+//	fmt.Println("end")
+//}
+
+//func init() {
+//	UpdateCompanyContracthide(5593)
+//}
+
+func UpdateCompanyContracthide(companyId int) {
+	var condition string
+	var pars []interface{}
+
+	if companyId > 0 {
+		condition = ` AND a.company_id = ? `
+		pars = append(pars, companyId)
+	}
+
+	listContractMax, e := company.GetCompanyContracListMaxStartDate(condition, pars)
+	if e != nil {
+		fmt.Println(e)
+		return
+	}
+	maxId := make(map[int]time.Time)
+	for _, v := range listContractMax {
+		maxId[v.CompanyId] = v.MaxStartDate
+	}
+
+	fmt.Println(maxId[5593])
+	listContract, e := company.GetCompanyContracListInit_CRM_16_1(condition, pars)
+	if e != nil {
+		fmt.Println(e)
+		return
+	}
+	var updateId []string
+	for _, v := range listContract {
+		if v.EndDate.After(maxId[v.CompanyId]) {
+			continue
+		}
+		updateId = append(updateId, strconv.Itoa(v.CompanyContractId))
+	}
+
+	//err := company.UpdateCompanyContracthide(updateId)
+	//fmt.Println((err))
+	fmt.Println((updateId))
+}
+
+//更新权益销客户后一个正式的销售为当前销售
+//func init(){
+//	SELECT * FROM company_product  WHERE 1= 1  AND  product_id =2   AND  share_seller_id > 0 ;
+//}

+ 923 - 26
controllers/statistic_report.go

@@ -17,6 +17,7 @@ import (
 	"hongze/hz_crm_api/services"
 	"hongze/hz_crm_api/services/alarm_msg"
 	contractService "hongze/hz_crm_api/services/contract"
+	cygxService "hongze/hz_crm_api/services/cygx"
 	fmsService "hongze/hz_crm_api/services/fms"
 	"hongze/hz_crm_api/services/statistic_report"
 	"hongze/hz_crm_api/utils"
@@ -111,6 +112,225 @@ func getQueryParams(condition string, pars []interface{}, sysUser *system.Admin,
 	return
 }
 
+// getQueryParamsInit 获取基础查询信息(最开始关联的销售信息)
+func getQueryParamsInit(condition string, pars []interface{}, sysUser *system.Admin, tableAlias string) (newCondition string, newPars []interface{}) {
+	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN {
+		condition += " AND " + tableAlias + "product_id=?"
+		pars = append(pars, 1)
+	} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN {
+		condition += " AND " + tableAlias + "product_id=?"
+		pars = append(pars, 2)
+	} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FINANCE {
+		//超级管理员账户,不做条件限制
+	} else {
+		//如果不是研究员,那么去找对应的 部门、小组、销售
+		if sysUser.Authority == 0 {
+			//普通用户
+			condition += " AND a.seller_id_init=?"
+			pars = append(pars, sysUser.AdminId)
+		} else if sysUser.Authority == 1 {
+			//部门主管
+			condition += " AND " + tableAlias + "department_id=?"
+			pars = append(pars, sysUser.DepartmentId)
+		} else if sysUser.Authority == 2 && sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP {
+			//权益小组负责人
+			condition += " AND " + tableAlias + "group_id=?"
+			pars = append(pars, sysUser.GroupId)
+		} else if sysUser.Authority == 2 && sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_GROUP {
+			//ficc销售主管
+			pid, err := company.GetParentIdFromGroup(sysUser.GroupId)
+			if err != nil {
+				fmt.Println(err.Error())
+				return
+			}
+			var ids []*string
+			if pid != nil && *pid != 0 {
+				ids, err = company.GetGroupIdsByParentId(*pid)
+				if err != nil {
+					fmt.Println(err.Error())
+				}
+			} else {
+				ids, err = company.GetGroupIdsByParentId(sysUser.GroupId)
+				if err != nil {
+					fmt.Println(err.Error())
+				}
+			}
+			var idSlice []string
+			var sid string
+			for _, id := range ids {
+				idSlice = append(idSlice, *id)
+			}
+			//加入父级groupId
+			if *pid > 0 {
+				idSlice = append(idSlice, strconv.Itoa(*pid))
+			} else {
+				idSlice = append(idSlice, strconv.Itoa(sysUser.GroupId))
+			}
+			sid = strings.Join(idSlice, ",")
+			condition += " AND " + tableAlias + `group_id IN (` + sid + `) `
+			fmt.Println("condition:", condition)
+			//pars = append(pars, sysUser.GroupId)
+		} else if sysUser.Authority == 4 {
+			//ficc小组负责人
+			condition += " AND " + tableAlias + "group_id=?"
+			pars = append(pars, sysUser.GroupId)
+		} else {
+			//不知道什么类型的用户(后面新增的位置类型客户)
+			condition += " AND a.seller_id_init=?"
+			pars = append(pars, sysUser.AdminId)
+		}
+	}
+	newCondition = condition
+	newPars = pars
+	return
+}
+
+// getQueryParams 获取基础查询信息(最开始关联的销售信息)
+func getQueryParamsLast(condition string, pars []interface{}, sysUser *system.Admin, tableAlias string) (newCondition string, newPars []interface{}) {
+	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN {
+		condition += " AND " + tableAlias + "product_id=?"
+		pars = append(pars, 1)
+	} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN {
+		condition += " AND " + tableAlias + "product_id=?"
+		pars = append(pars, 2)
+	} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FINANCE {
+		//超级管理员账户,不做条件限制
+	} else {
+		//如果不是研究员,那么去找对应的 部门、小组、销售
+		if sysUser.Authority == 0 {
+			//普通用户
+			condition += " AND a.seller_id_last=?"
+			pars = append(pars, sysUser.AdminId)
+		} else if sysUser.Authority == 1 {
+			//部门主管
+			condition += " AND " + tableAlias + "department_id=?"
+			pars = append(pars, sysUser.DepartmentId)
+		} else if sysUser.Authority == 2 && sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP {
+			//权益小组负责人
+			condition += " AND " + tableAlias + "group_id=?"
+			pars = append(pars, sysUser.GroupId)
+		} else if sysUser.Authority == 2 && sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_GROUP {
+			//ficc销售主管
+			pid, err := company.GetParentIdFromGroup(sysUser.GroupId)
+			if err != nil {
+				fmt.Println(err.Error())
+				return
+			}
+			var ids []*string
+			if pid != nil && *pid != 0 {
+				ids, err = company.GetGroupIdsByParentId(*pid)
+				if err != nil {
+					fmt.Println(err.Error())
+				}
+			} else {
+				ids, err = company.GetGroupIdsByParentId(sysUser.GroupId)
+				if err != nil {
+					fmt.Println(err.Error())
+				}
+			}
+			var idSlice []string
+			var sid string
+			for _, id := range ids {
+				idSlice = append(idSlice, *id)
+			}
+			//加入父级groupId
+			if *pid > 0 {
+				idSlice = append(idSlice, strconv.Itoa(*pid))
+			} else {
+				idSlice = append(idSlice, strconv.Itoa(sysUser.GroupId))
+			}
+			sid = strings.Join(idSlice, ",")
+			condition += " AND " + tableAlias + `group_id IN (` + sid + `) `
+			fmt.Println("condition:", condition)
+			//pars = append(pars, sysUser.GroupId)
+		} else if sysUser.Authority == 4 {
+			//ficc小组负责人
+			condition += " AND " + tableAlias + "group_id=?"
+			pars = append(pars, sysUser.GroupId)
+		} else {
+			//不知道什么类型的用户(后面新增的位置类型客户)
+			condition += " AND a.seller_id_last=?"
+			pars = append(pars, sysUser.AdminId)
+		}
+	}
+	newCondition = condition
+	newPars = pars
+	return
+}
+
+// getQueryParamsLastCompanyProduct 获取基础查询信息(最后一次正式转试用的时间点)
+func getQueryParamsLastCompanyProduct(condition string, pars []interface{}, sysUser *system.Admin, tableAlias string) (newCondition string, newPars []interface{}) {
+	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN {
+		condition += " AND " + tableAlias + "product_id=?"
+		pars = append(pars, 1)
+	} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN {
+		condition += " AND " + tableAlias + "product_id=?"
+		pars = append(pars, 2)
+	} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FINANCE {
+		//超级管理员账户,不做条件限制
+	} else {
+		//如果不是研究员,那么去找对应的 部门、小组、销售
+		if sysUser.Authority == 0 {
+			//普通用户
+			condition += " AND " + tableAlias + "seller_id_last=?"
+			pars = append(pars, sysUser.AdminId)
+		} else if sysUser.Authority == 1 {
+			//部门主管
+			condition += " AND " + tableAlias + "department_id=?"
+			pars = append(pars, sysUser.DepartmentId)
+		} else if sysUser.Authority == 2 && sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP {
+			//权益小组负责人
+			condition += " AND " + tableAlias + "group_id=?"
+			pars = append(pars, sysUser.GroupId)
+		} else if sysUser.Authority == 2 && sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_GROUP {
+			//ficc销售主管
+			pid, err := company.GetParentIdFromGroup(sysUser.GroupId)
+			if err != nil {
+				fmt.Println(err.Error())
+				return
+			}
+			var ids []*string
+			if pid != nil && *pid != 0 {
+				ids, err = company.GetGroupIdsByParentId(*pid)
+				if err != nil {
+					fmt.Println(err.Error())
+				}
+			} else {
+				ids, err = company.GetGroupIdsByParentId(sysUser.GroupId)
+				if err != nil {
+					fmt.Println(err.Error())
+				}
+			}
+			var idSlice []string
+			var sid string
+			for _, id := range ids {
+				idSlice = append(idSlice, *id)
+			}
+			//加入父级groupId
+			if *pid > 0 {
+				idSlice = append(idSlice, strconv.Itoa(*pid))
+			} else {
+				idSlice = append(idSlice, strconv.Itoa(sysUser.GroupId))
+			}
+			sid = strings.Join(idSlice, ",")
+			condition += " AND " + tableAlias + `group_id IN (` + sid + `) `
+			fmt.Println("condition:", condition)
+			//pars = append(pars, sysUser.GroupId)
+		} else if sysUser.Authority == 4 {
+			//ficc小组负责人
+			condition += " AND " + tableAlias + "group_id=?"
+			pars = append(pars, sysUser.GroupId)
+		} else {
+			//不知道什么类型的用户(后面新增的位置类型客户)
+			condition += " AND  " + tableAlias + "seller_id_last=?"
+			pars = append(pars, sysUser.AdminId)
+		}
+	}
+	newCondition = condition
+	newPars = pars
+	return
+}
+
 // Home
 // @Title 获取首页工作台数据
 // @Description 获取首页工作台数据接口
@@ -2339,35 +2559,218 @@ func StackCompanyListExport(this *StatisticReportController, dataType string, re
 	br.Msg = "导出成功"
 }
 
-// 获取历史的数据
-func getHistoryStackCompanyList(sysUser *system.Admin, currentIndex, pageSize, isConfirm, companyAscribeId int, adminId, regionType, companyType, dataType, tryOutType, date, keyword string) (returnData response.StackCompanyListResp, err error) {
-	if date == "" {
-		err = errors.New("请选择日期")
+// StackCompanyListExportRai 获取存量客户数据报表导出
+func StackCompanyListExportRai(this *StatisticReportController, dataType string, resp response.StackCompanyListResp, 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
 	}
-
-	var startSize int
-	if pageSize <= 0 {
-		pageSize = utils.PageSize20
-	}
-	if currentIndex <= 0 {
-		currentIndex = 1
+	style := xlsx.NewStyle()
+	alignment := xlsx.Alignment{
+		Horizontal: "center",
+		Vertical:   "center",
+		WrapText:   true,
 	}
-	startSize = utils.StartIndex(currentIndex, pageSize)
 
-	var condition string
-	var pars []interface{}
+	style.Alignment = alignment
+	style.ApplyAlignment = true
 
-	//条件
-	condition += ` AND date = ? `
-	pars = append(pars, date)
+	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)
 
-	var conditionAscribRai string // 处理权益未续约客户检索列表SQL查询条件
-	var parsAscribeRai []interface{}
-	//是否确认续约 CRM 13.9
-	if isConfirm != -1 {
-		var conditionConfirm string
-		var parsConfirm []interface{}
+	//统计数据
+	statisticRow := sheel.AddRow()
+
+	cell1 := statisticRow.AddCell()
+	cell1.SetStyle(style)
+	cell1.SetValue(fmt.Sprint("新签客户数:", resp.NewCompanyTotal))
+
+	cell2 := statisticRow.AddCell()
+	cell2.SetStyle(style)
+	cell2.SetValue(fmt.Sprint("续约客户数:", resp.RenewalCompanyTotal))
+
+	cell3 := statisticRow.AddCell()
+	cell3.SetStyle(style)
+	cell3.SetValue(fmt.Sprint("未续约客户数:", resp.NotRenewalCompanyTotal))
+	//表头
+
+	titleRow := sheel.AddRow()
+
+	cellName := titleRow.AddCell()
+	cellName.SetStyle(style)
+	cellName.SetValue("客户名称")
+
+	cellProName := titleRow.AddCell()
+	cellProName.SetStyle(style)
+	cellProName.SetValue("客户类型")
+
+	cellSellerName := titleRow.AddCell()
+	cellSellerName.SetStyle(style)
+	cellSellerName.SetValue("所属销售")
+
+	switch dataType {
+	case "未续约客户":
+		cellTime := titleRow.AddCell()
+		cellTime.SetStyle(style)
+		cellTime.SetValue("最近合同到期时间")
+
+		cellRemark := titleRow.AddCell()
+		cellRemark.SetStyle(style)
+		cellRemark.SetValue("未续约说明")
+
+		cellDay := titleRow.AddCell()
+		cellDay.SetStyle(style)
+		cellDay.SetValue("超出过期天数")
+
+		cellAscribeContent := titleRow.AddCell()
+		cellAscribeContent.SetStyle(style)
+		cellAscribeContent.SetValue("不续约归因")
+
+		cellContent := titleRow.AddCell()
+		cellContent.SetStyle(style)
+		cellContent.SetValue("详细原因")
+	default:
+
+		cellShareSeller := titleRow.AddCell()
+		cellShareSeller.SetStyle(style)
+		cellShareSeller.SetValue("服务销售")
+
+		cellTime := titleRow.AddCell()
+		cellTime.SetStyle(style)
+		cellTime.SetValue("合同期限")
+
+		cellMoney := titleRow.AddCell()
+		cellMoney.SetStyle(style)
+		cellMoney.SetValue("合同金额")
+
+		cellPermissionName := titleRow.AddCell()
+		cellPermissionName.SetStyle(style)
+		cellPermissionName.SetValue("签约套餐")
+	}
+
+	for _, v := range resp.List {
+		dataRow := sheel.AddRow()
+		dataRow.SetHeight(20)
+
+		cellDataName := dataRow.AddCell()
+		cellDataName.SetStyle(style)
+		cellDataName.SetValue(v.CompanyName)
+
+		cellDataProName := dataRow.AddCell()
+		cellDataProName.SetStyle(style)
+		cellDataProName.SetValue(v.ProductName)
+
+		cellDataSellerName := dataRow.AddCell()
+		cellDataSellerName.SetStyle(style)
+		cellDataSellerName.SetValue(v.SellerName)
+
+		if dataType != "未续约客户" {
+			cellDataShareSeller := dataRow.AddCell()
+			cellDataShareSeller.SetStyle(style)
+			cellDataShareSeller.SetValue(v.ShareSeller)
+		}
+
+		cellDataTime := dataRow.AddCell()
+		cellDataTime.SetStyle(style)
+		switch dataType {
+		case "新签客户":
+			cellDataTime.SetValue(fmt.Sprint(v.StartDate, " ~  ", v.EndDate))
+		case "续约客户":
+			cellDataTime.SetValue(fmt.Sprint(v.StartDate, " ~  ", v.EndDate))
+		case "未续约客户":
+			cellDataTime.SetValue(v.EndDate)
+
+			//未续约说明
+			cellDataRemark := dataRow.AddCell()
+			cellDataRemark.SetStyle(style)
+			cellDataRemark.SetValue(v.RenewalReason)
+
+			cellDay := dataRow.AddCell()
+			cellDay.SetStyle(style)
+			cellDay.SetValue(v.ExpireDay)
+		}
+
+		if dataType == "新签客户" || dataType == "续约客户" {
+			cellMoney := dataRow.AddCell()
+			cellMoney.SetStyle(style)
+			cellMoney.SetValue(v.Money)
+
+			cellPermissionName := dataRow.AddCell()
+			cellPermissionName.SetStyle(style)
+			cellPermissionName.SetValue(v.PermissionName)
+		}
+
+		switch dataType {
+		case "未续约客户":
+			cellAscribeContent := dataRow.AddCell()
+			cellAscribeContent.SetStyle(style)
+			cellAscribeContent.SetValue(v.AscribeContent)
+
+			cellContent := dataRow.AddCell()
+			cellContent.SetStyle(style)
+			cellContent.SetValue(v.Content)
+		}
+
+	}
+	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 = "导出成功"
+}
+
+// 获取历史的数据
+func getHistoryStackCompanyList(sysUser *system.Admin, currentIndex, pageSize, isConfirm, companyAscribeId int, adminId, regionType, companyType, dataType, tryOutType, date, keyword string) (returnData response.StackCompanyListResp, err error) {
+	if date == "" {
+		err = errors.New("请选择日期")
+		return
+	}
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+
+	var condition string
+	var pars []interface{}
+
+	//条件
+	condition += ` AND date = ? `
+	pars = append(pars, date)
+
+	var conditionAscribRai string // 处理权益未续约客户检索列表SQL查询条件
+	var parsAscribeRai []interface{}
+	//是否确认续约 CRM 13.9
+	if isConfirm != -1 {
+		var conditionConfirm string
+		var parsConfirm []interface{}
 
 		companyConfirmList, e := company.GetCompanyNoRenewedAscribeList(conditionConfirm, parsConfirm, 0, 0)
 		if e != nil && e.Error() != utils.ErrNoRow() {
@@ -3802,6 +4205,9 @@ func (this *StatisticReportController) IncrementalCompanyList() {
 				item.AscribeContent = mapGetCompanyAscribeContent[fmt.Sprint("CID_", item.CompanyId, "PID_", item.ProductId)]
 				item.Content = mapContent[fmt.Sprint("CID_", item.CompanyId, "PID_", item.ProductId)]
 				item.IsShowNoRenewedNote = mapNoRenewedNote[fmt.Sprint("CID_", item.CompanyId, "PID_", item.ProductId)]
+				if item.ProductId == utils.COMPANY_PRODUCT_RAI_ID { //权益客户的销售,按照创建时候对应的销售展示
+					item.SellerName = item.SellerNameInit
+				}
 			}
 			list = tmpList
 			dataTotal = total
@@ -5733,9 +6139,9 @@ func (this *StatisticReportController) InvoicePaymentList() {
 		pars = append(pars, kw)
 	}
 	if sellerIdstr != "" {
-		sellerIds := strings.Split(sellerIdstr, ",")
-		cond += ` AND (c.seller_id in ? OR d.seller_id in ?)`
-		pars = append(pars, sellerIds, sellerIds)
+		//sellerIds := strings.Split(sellerIdstr, ",")
+		cond += ` AND (c.seller_id in (` + sellerIdstr + `) OR d.seller_id in  (` + sellerIdstr + `))`
+		//pars = append(pars, sellerIds, sellerIds)
 	}
 	// 套餐筛选
 	if serviceType != "" {
@@ -5761,6 +6167,10 @@ func (this *StatisticReportController) InvoicePaymentList() {
 		depId = 5
 	}
 
+	dshiAdminId := 13
+	if utils.RunMode == "debug" {
+		dshiAdminId = 233
+	}
 	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN {
 		sellerIdsList, err := system.GetSellerIdsByDepId(depId)
 		if err != nil {
@@ -5769,6 +6179,21 @@ func (this *StatisticReportController) InvoicePaymentList() {
 			return
 		}
 		cond += ` AND (c.seller_id IN (` + strings.Join(sellerIdsList, ",") + `) OR d.seller_id IN (` + strings.Join(sellerIdsList, ",") + `))`
+	} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_GROUP && sysUser.AdminId == dshiAdminId {
+		groupTeamSellerList, err := system.GetSysUserByParentIdGroupId(5)
+		if err != nil {
+			br.Msg = "获取销售失败"
+			br.ErrMsg = "获取销售失败,Err:" + err.Error()
+			return
+		}
+		sellerIdsList := ""
+		for _, v := range groupTeamSellerList {
+			sellerIdsList += strconv.Itoa(v.AdminId) + ","
+		}
+		sellerIdsList = strings.TrimRight(sellerIdsList, ",")
+
+		cond += ` AND (c.seller_id IN (` + sellerIdsList + `) OR d.seller_id IN (` + sellerIdsList + `))`
+		pars = append(pars)
 	} else if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN {
 		cond += ` AND (c.seller_id=? OR d.seller_id=?)`
 		pars = append(pars, sysUser.AdminId, sysUser.AdminId)
@@ -6511,3 +6936,475 @@ func (this *StatisticReportController) UnusualRenewCompanyList() {
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// StackCompanyListRai
+// @Title 获取权益存量客户数据列表
+// @Description 获取权益存量客户数据列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   Keyword   query   string  true       "客户名称"
+// @Param   AdminId   query   string  true       "销售id,多个用英文逗号隔开,空字符串为全部"
+// @Param   RegionType   query   string  false       "所属区域:传空字符串或者不传为全部,'国内','海外'"
+// @Param   DataType   query   string  false       "报表类型,枚举值:`新签客户`,`续约客户`,`未续约客户`"
+// @Param   TryOutType   query   string  false       " '试用', '非试用' 非试用即为冻结/流失"
+// @Param   IsExport   query   bool  false       "是否导出excel,默认是false"
+// @Param   CompanyAscribeId   query   int  false       "归因ID"
+// @Success 200 {object} response.StackCompanyListResp
+// @router /stack_company_list_rai [get]
+func (this *StatisticReportController) StackCompanyListRai() {
+	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")
+
+	//是否导出报表
+	isExport, _ := this.GetBool("IsExport")
+	if isExport {
+		pageSize = 10000
+		currentIndex = 1
+	}
+
+	adminId := this.GetString("AdminId")
+	regionType := this.GetString("RegionType")
+	companyType := this.GetString("CompanyType")
+	dataType := this.GetString("DataType")
+	tryOutType := this.GetString("TryOutType")
+	keyword := this.GetString("Keyword")
+
+	companyAscribeId, _ := this.GetInt("CompanyAscribeId", -1) // CRM 13.9
+
+	var resp response.StackCompanyListResp
+	//历史统计数据
+	//获取实时统计数据(今天数据)
+	tmpResp, err := getTodayStackCompanyListV2Rai(sysUser, currentIndex, pageSize, companyAscribeId, adminId, regionType, companyType, dataType, tryOutType, keyword)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	resp = tmpResp
+
+	//导出excel
+	if isExport {
+		StackCompanyListExportRai(this, dataType, resp, br)
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+func getTodayStackCompanyListV2Rai(sysUser *system.Admin, currentIndex, pageSize, companyAscribeId int, adminId, regionType, companyType, dataType, tryOutType, keyword string) (returnData response.StackCompanyListResp, err error) {
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+
+	var condition, listCondition string
+	var pars, listPars []interface{}
+
+	today := utils.GetToday(utils.FormatDate)
+	//条件
+	var conditionAscribRai string // 处理权益未续约客户检索列表SQL查询条件
+	var parsAscribeRai []interface{}
+
+	//归因ID CRM 13.9
+	if companyAscribeId > 0 {
+		var conditionAscribe string
+		var parsAscribe []interface{}
+		conditionAscribe = "  AND  company_ascribe_id = ? "
+		parsAscribe = append(parsAscribe, companyAscribeId)
+		companyNoRenewedAscribeList, e := company.GetCompanyNoRenewedAscribeList(conditionAscribe, parsAscribe, 0, 0)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			err = errors.New("GetCompanyNoRenewedAscribeList" + e.Error())
+			return
+		}
+		var companyIds []int
+		if len(companyNoRenewedAscribeList) == 0 {
+			companyIds = append(companyIds, 0) // 给一个不存在的ID
+		} else {
+			for _, v := range companyNoRenewedAscribeList {
+				companyIds = append(companyIds, v.CompanyId)
+			}
+		}
+		conditionAscribRai += ` AND c.company_id IN (` + utils.GetOrmInReplace(len(companyIds)) + `)`
+		parsAscribeRai = append(parsAscribeRai, companyIds)
+	}
+
+	//if adminId != "" {
+	//	//condition += ` AND c.seller_id in  (` + adminId + `) `
+	//	//pars = append(pars, adminId)
+	//} else {
+	//	//根据当前角色来获取查询条件
+	//	condition, pars = getQueryParamsInit(condition, pars, sysUser, "c.")
+	//
+	//}
+	if regionType != "" {
+		condition += ` AND b.region_type = ? `
+		pars = append(pars, regionType)
+	}
+	//关键字搜索
+	if keyword != "" {
+		condition += ` and b.company_name like "%` + keyword + `%" `
+	}
+
+	condition += ` AND a.product_id = ? `
+	pars = append(pars, 2)
+
+	var dataTotal, newCompanyTotal, renewalCompanyTotal, notRenewalCompanyTotal int
+	var notRenewalTryOut, notRenewalNotTryOut int
+	var list []*models.IncrementalList
+
+	//var condition1 string
+	//var pars1 []interface{}
+	//新签客户数
+	{
+		//if adminId != "" {
+		//	//condition += ` AND c.seller_id in  (` + adminId + `) `
+		//	//pars = append(pars, adminId)
+		//} else {
+		//	//根据当前角色来获取查询条件
+		//	condition, pars = getQueryParamsInit(condition, pars, sysUser, "c.")
+		//
+		//}
+		condition1 := condition
+		pars1 := pars
+		if adminId != "" {
+			condition1 += ` AND a.seller_id_init in  (` + adminId + `) `
+		} else {
+			condition1, pars1 = getQueryParamsInit(condition1, pars1, sysUser, "c.")
+			//condition1 += condition2
+			//pars1 = append(pars1, pars2)
+		}
+
+		//condition1 += condition
+		//pars1 := pars
+		//condition1 += ` AND c.status = "正式"  `
+		condition1 += ` AND a.start_date <= ? AND a.end_date >= ? `
+		pars1 = append(pars1, today, today)
+		condition1 += ` AND a.contract_type = ? `
+		pars1 = append(pars1, "新签合同")
+
+		total, countErr := models.GetIncrementalNewCompanyCount(condition1, pars1)
+		if countErr != nil && countErr.Error() != utils.ErrNoRow() {
+			err = countErr
+			return
+		}
+		newCompanyTotal = total
+
+		if dataType == "新签客户" {
+			//页表页数据总和
+			total, countErr = models.GetTodayStackCompanyProductCount(condition1, pars1)
+			if countErr != nil && countErr.Error() != utils.ErrNoRow() {
+				err = countErr
+				return
+			}
+			dataTotal = total
+			listCondition = condition1
+			listPars = pars1
+		}
+	}
+
+	//续约客户数
+	{
+		condition1 := condition
+		pars1 := pars
+		if adminId != "" {
+			condition1 += ` AND a.seller_id_init in  (` + adminId + `) `
+		} else {
+			condition1, pars1 = getQueryParamsInit(condition1, pars1, sysUser, "c.")
+		}
+		//condition1 += condition
+		//pars1 = append(pars1, pars)
+		//pars1 := pars
+		//condition1 += ` AND c.status  = "正式" `
+		condition1 += ` AND a.start_date <= ? AND a.end_date >= ? `
+		pars1 = append(pars1, today, today)
+		condition1 += ` AND a.contract_type = ? `
+		pars1 = append(pars1, "续约合同")
+
+		//额外条件(续约合同的起始日期包含在所选时间段内且不包含在新签合同存续期内的客户)
+		pars1 = append(pars1, today)
+		total, countErr := models.GetIncrementalNewCompanyCountV2(condition1, pars1)
+		if countErr != nil && countErr.Error() != utils.ErrNoRow() {
+			err = countErr
+			return
+		}
+		renewalCompanyTotal = total
+
+		if dataType == "续约客户" {
+			//页表页数据总和
+			total, countErr = models.GetTodayStackCompanyProductCountV2(condition1, pars1)
+			if countErr != nil && countErr.Error() != utils.ErrNoRow() {
+				err = countErr
+				return
+			}
+			dataTotal = total
+			listCondition = condition1
+			listPars = pars1
+		}
+	}
+	//未续约客户数
+	{
+		condition1 := condition
+		pars1 := pars
+		if adminId != "" {
+			//condition1 += ` AND a.seller_id_last in  (` + adminId + `) `
+			condition1 += ` AND c.seller_id_last in  (` + adminId + `) `
+		} else {
+			condition1, pars1 = getQueryParamsLastCompanyProduct(condition1, pars1, sysUser, "c.")
+		}
+
+		//condition1 += condition
+		//pars1 = append(pars1, pars)
+
+		//condition1 := condition
+		//pars1 := pars
+		condition1 += ` AND c.status not in ("永续","正式") AND a.create_time <= ? `
+		pars1 = append(pars1, time.Now().Format(utils.FormatDateTime))
+		condition1 += ` AND a.operation = 'try_out' `
+
+		total, countErr := models.GetIncrementalCompanyCountByOperationRecord(condition1, pars1)
+		if countErr != nil && countErr.Error() != utils.ErrNoRow() {
+			err = countErr
+			return
+		}
+
+		notRenewalCompanyTotal = total
+		condition1 += conditionAscribRai
+		pars1 = append(pars1, parsAscribeRai)
+		if dataType == "未续约客户" {
+			//页表页数据总和
+			//统计数据
+			for _, v := range []string{"试用", "非试用"} {
+				totalCondition1 := condition1
+				totalPars1 := pars1
+				var tmpTotal int
+				if v == "试用" {
+					totalCondition1 += ` AND c.status = "试用" `
+					tmpTotal, err = models.GetIncrementalCompanyProductCountByOperationRecord(totalCondition1, totalPars1)
+					if err != nil {
+						return
+					}
+					notRenewalTryOut = tmpTotal
+				} else if v == "非试用" {
+					totalCondition1 += ` AND c.status IN ("冻结","流失") `
+					tmpTotal, err = models.GetIncrementalCompanyProductCountByOperationRecord(totalCondition1, totalPars1)
+					if err != nil && err.Error() != utils.ErrNoRow() {
+						return
+					}
+					notRenewalNotTryOut = tmpTotal
+				}
+
+			}
+			//列表数据数量
+			if tryOutType == "试用" {
+				condition1 += ` AND c.status = "试用" `
+				total = notRenewalTryOut
+			} else if tryOutType == "非试用" {
+				condition1 += ` AND c.status IN ("冻结","流失") `
+				total = notRenewalNotTryOut
+			}
+
+			//total, countErr := models.GetIncrementalCompanyProductCountByOperationRecord(condition1, pars1)
+			//if countErr != nil && countErr.Error() != utils.ErrNoRow() {
+			//	err = countErr
+			//	return
+			//}
+
+			dataTotal = total
+			listCondition = condition1
+			listPars = pars1
+			if tryOutType == "试用" {
+				listCondition += ` AND c.status = "试用" `
+			} else if tryOutType == "非试用" {
+				listCondition += ` AND c.status IN ("冻结","流失") `
+			}
+			tmpList, countErr := models.GetIncrementalCompanyListByOperationRecordLast(listCondition, listPars, startSize, pageSize)
+			if countErr != nil {
+				err = countErr
+				return
+			}
+			for i := 0; i < len(tmpList); i++ {
+				endDateTime, parseErr := time.Parse(utils.FormatDateTime, tmpList[i].CreateTime)
+				if parseErr != nil {
+					err = parseErr
+					return
+				}
+				tmpList[i].EndDate = endDateTime.Format(utils.FormatDate)
+			}
+			list = tmpList
+
+		}
+	}
+
+	switch dataType {
+	case "新签客户":
+		tmpList, countErr := models.GetTodayStackCompanyList(listCondition, listPars, startSize, pageSize)
+		if countErr != nil {
+			err = countErr
+			return
+		}
+		list = tmpList
+	case "续约客户":
+		tmpList, countErr := models.GetTodayStackCompanyListV2(listCondition, listPars, startSize, pageSize)
+		if countErr != nil {
+			err = countErr
+			return
+		}
+		list = tmpList
+	}
+
+	if dataType == "续约客户" {
+		var ids []string
+		oldCompanyMap := make(map[int]*models.IncrementalList)
+		oldMoneyMap := make(map[int]float64)
+		countMap := make(map[int]int)
+		for _, item := range list {
+			ids = append(ids, strconv.Itoa(item.CompanyId))
+		}
+		if len(ids) > 0 {
+			idStr := strings.Join(ids, ",")
+			lists, contractErr := models.GetLastContractMoney(idStr)
+			if contractErr != nil {
+				err = contractErr
+				return
+			}
+
+			for _, item := range lists {
+				_, countOk := countMap[item.CompanyId]
+				_, ok := oldCompanyMap[item.CompanyId]
+				if !ok {
+					oldCompanyMap[item.CompanyId] = item
+					oldMoneyMap[item.CompanyId] = item.Money
+				} else if !countOk {
+					countMap[item.CompanyId] = 1
+					oldCompanyMap[item.CompanyId] = item
+				}
+			}
+
+			//给list赋值
+			for _, item := range list {
+				if item.ProductName == "权益" {
+					oldMoney, _ := oldMoneyMap[item.CompanyId]
+					lastContract, _ := oldCompanyMap[item.CompanyId]
+					if oldMoney > lastContract.Money {
+						item.PackageDifference = "增加套餐"
+					} else if oldMoney < lastContract.Money {
+						item.PackageDifference = "减少套餐"
+					} else {
+						item.PackageDifference = "维持套餐"
+					}
+				}
+			}
+		}
+	}
+
+	var ascribecompanyIds []int
+	for _, item := range list {
+		ascribecompanyIds = append(ascribecompanyIds, item.CompanyId)
+	}
+	//归因标签
+	mapGetCompanyAscribeContent, mapContent := services.GetCompanyAscribeContentMap(ascribecompanyIds)
+	mapNoRenewedNote := services.GetCompanyNoRenewedNoteMap(ascribecompanyIds)
+	mapIsUserMaker := cygxService.GetCompanyProductIsUserMakerByCompanyIds(ascribecompanyIds) //根据公司ID获取近四周之内有决策人互动的客户
+	for _, item := range list {
+		item.AscribeContent = mapGetCompanyAscribeContent[fmt.Sprint("CID_", item.CompanyId, "PID_", item.ProductId)]
+		item.Content = mapContent[fmt.Sprint("CID_", item.CompanyId, "PID_", item.ProductId)]
+		item.IsShowNoRenewedNote = mapNoRenewedNote[fmt.Sprint("CID_", item.CompanyId, "PID_", item.ProductId)]
+	}
+
+	listLen := len(list)
+	var companyContractIds []int
+	for i := 0; i < listLen; i++ {
+		item := list[i]
+
+		//剩余可用天数
+		expireDay := "0"
+		endDateTime, _ := time.Parse(utils.FormatDate, item.EndDate)
+		var sub time.Duration
+		if dataType != "未续约客户" {
+			endDateTime = endDateTime.AddDate(0, 0, 1)
+			sub = endDateTime.Sub(time.Now())
+			//if sub < 0 {
+			//	sub = 0
+			//}
+		} else {
+			sub = time.Now().Sub(endDateTime)
+		}
+		expireDay = fmt.Sprintf("%v", int(sub.Hours()/24))
+		list[i].ExpireDay = expireDay
+		companyContractIds = append(companyContractIds, item.CompanyContractId)
+	}
+
+	//合并合同所对应的权限
+	mappermissionName, err := cygxService.GetCompanyContractPermissionNameMapById(companyContractIds)
+	if err != nil {
+		return
+	}
+	for _, v := range list {
+		v.PermissionName = mappermissionName[v.CompanyContractId]
+	}
+
+	var stackCompanyStatisticList []*models.StackCompanyStatisticList
+	for _, v := range list {
+		stackCompanyStatistic := models.StackCompanyStatisticList{
+			Type:        dataType,
+			CompanyId:   v.CompanyId,
+			CompanyName: v.CompanyName,
+			ProductId:   v.ProductId,
+			ProductName: v.ProductName,
+			ContractNum: v.Count,
+			SellerId:    v.SellerId,
+			SellerName:  v.SellerNameInit,
+			ShareSeller: v.ShareSellerInit,
+			Date:        today,
+			StartDate:   v.StartDate,
+			EndDate:     v.EndDate,
+			RegionType:  v.RegionType,
+			//CreateTime   :v.CreateTime,
+			CreateTimeStr:       v.CreateTime,
+			ExpireDay:           v.ExpireDay,
+			RenewalReason:       v.RenewalReason,
+			RenewalTodo:         v.RenewalTodo,
+			Status:              v.Status,
+			PackageDifference:   v.PackageDifference,
+			AscribeContent:      v.AscribeContent,
+			IsShowNoRenewedNote: v.IsShowNoRenewedNote,
+			Content:             v.Content,
+			PermissionName:      mappermissionName[v.CompanyContractId],
+			Money:               v.Money,
+			IsUserMaker:         mapIsUserMaker[v.CompanyId],
+		}
+		stackCompanyStatisticList = append(stackCompanyStatisticList, &stackCompanyStatistic)
+	}
+	page := paging.GetPaging(currentIndex, pageSize, dataTotal)
+	resp := response.StackCompanyListResp{
+		Paging:                 page,
+		List:                   stackCompanyStatisticList,
+		NewCompanyTotal:        newCompanyTotal,
+		RenewalCompanyTotal:    renewalCompanyTotal,
+		NotRenewalCompanyTotal: notRenewalCompanyTotal,
+		NotRenewalTryOut:       notRenewalTryOut,
+		NotRenewalNotTryOut:    notRenewalNotTryOut,
+	}
+	return resp, err
+}

+ 4 - 0
models/business_trip/business_apply.go

@@ -28,6 +28,7 @@ type BusinessApply struct {
 	CloseTime       time.Time `description:"关闭时间"`
 	CreateTime      time.Time `description:"创建时间"`
 	ModifyTime      time.Time `description:"修改时间"`
+	Itinerary       string    `description:"行程说明"`
 }
 
 // 添加出差申请
@@ -49,6 +50,7 @@ type BusinessApplyReq struct {
 	Transportation string `description:"交通工具"`
 	PeerPeopleId   string `description:"同行人id"`
 	PeerPeopleName string `description:"同行人"`
+	Itinerary      string `description:"行程说明"`
 }
 
 type BusinessApplyView struct {
@@ -73,6 +75,7 @@ type BusinessApplyView struct {
 	ModifyTime      string `description:"修改时间"`
 	IsClose         bool   `description:"true,可关闭,false,不可关闭"`
 	CloseReason     string `description:"关闭理由"`
+	Itinerary       string `description:"行程说明"`
 }
 
 func GetBusinessApplyListCount(condition string, pars []interface{}) (count int, err error) {
@@ -161,6 +164,7 @@ type BusinessApplyEditReq struct {
 	Transportation  string `description:"交通工具"`
 	PeerPeopleId    string `description:"同行人id"`
 	PeerPeopleName  string `description:"同行人"`
+	Itinerary       string `description:"行程说明"`
 }
 
 func CheckBusinessApplyDateCount(condition string, pars []interface{}) (count int, err error) {

+ 28 - 25
models/company/company.go

@@ -213,6 +213,7 @@ type CompanyItem struct {
 	CloseReason         string               `description:"关闭原因"`
 	CloseTime           string               `description:"关闭时间"`
 	Nation              string               `description:"所属国家"`
+	IsUserMaker         int                  `description:"近四周之内是否包含决策人互动过 ,0否,1是"`
 	LatestServiceRecord time.Time            `description:"最近沟通时间"`
 	FirstDate           time.Time            `description:"首次服务时间"`
 }
@@ -281,6 +282,7 @@ type CompanyListItem struct {
 	CloseReason      string               `description:"关闭客户原因"`
 	CloseTime        string               `description:"关闭客户时间"`
 	IsScrounge       int                  `description:"是否白嫖 0不是 1是"`
+	IsUserMaker      int                  `description:"近四周之内是否包含决策人互动过 ,0否,1是"`
 }
 
 type TryStageSliceItem struct {
@@ -320,7 +322,7 @@ func GetCompanyList(condition, status, sortStr string, pars []interface{}, start
 	// 权益客户: 以权益最后一次阅读时间作为参考
 	t := time.Now().Local().AddDate(0, 0, -7).Format(utils.FormatDate)
 
-	sql := `SELECT a.company_id,a.company_name,a.credit_code,a.company_code,a.created_time,a.province,a.city,a.address,a.region_type,b.group_id,b.road_show_total,b.is_share,
+	sql := `SELECT a.company_id,a.company_name,a.credit_code,a.company_code,a.created_time,a.province,a.city,a.address,a.region_type,b.group_id,b.road_show_total,b.is_share,b.is_user_maker,
 			CASE 
      WHEN GROUP_CONCAT(b.status) LIKE "%永续%" THEN 1
 	 WHEN GROUP_CONCAT(b.status) LIKE "%正式%" THEN 2
@@ -1235,29 +1237,30 @@ type CheckCompanyInfoRepeatResp struct {
 }
 
 type ButtonPermission struct {
-	BtnView          bool `description:"查看按钮权限:true显示,false不显示"`
-	BtnEdit          bool `description:"编辑按钮权限:true显示,false不显示"`
-	BtnDelete        bool `description:"删除按钮权限:true显示,false不显示"`
-	BtnSuspend       bool `description:"暂停/启用按钮权限:true显示,false不显示"`
-	BtnDelay         bool `description:"申请延期按钮权限:true显示,false不显示"`
-	BtnTurnPositive  bool `description:"申请转正按钮权限:true显示,false不显示"`
-	BtnUpdate        bool `description:"服务更新按钮权限:true显示,false不显示"`
-	BtnAddAgreement  bool `description:"补充协议按钮权限:true显示,false不显示"`
-	BtnThaw          bool `description:"申请解冻按钮权限:true显示,false不显示"`
-	BtnApplyReceive  bool `description:"申请领取按钮权限:true显示,false不显示"`
-	BtnReceive       bool `description:"领取客户按钮权限:true显示,false不显示"`
-	BtnModifySeller  bool `description:"修改销售按钮权限:true显示,false不显示"`
-	BtnReceiveOther  bool `description:"领取其他部门客户按钮权限:true显示,false不显示"`
-	BtnFreeze        bool `description:"冻结按钮权限:true显示,false不显示"`
-	BtnTryOut        bool `description:"增开试用:true显示,false不显示"`
-	BtnDetail        bool `description:"详情按钮:true显示,false不显示"`
-	BtnRemarkEdit    bool `description:"编辑备注按钮:true显示,false不显示"`
-	BtnRemarkView    bool `description:"查看备注按钮:true显示,false不显示"`
-	BtnShare         bool `description:"设置共享按钮:true显示,false不显示"`
-	BtnServiceRecord bool `description:"查看服务记录按钮:true显示,false不显示"`
-	BtnClose         bool `description:"关闭客户按钮:true显示,false不显示"`
-	BtnLoss          bool `description:"转流失按钮:true显示,false不显示"`
-	IsResearchShow   bool `description:"研选详情展示控制:true显示,false不显示"`
+	BtnView              bool `description:"查看按钮权限:true显示,false不显示"`
+	BtnEdit              bool `description:"编辑按钮权限:true显示,false不显示"`
+	BtnDelete            bool `description:"删除按钮权限:true显示,false不显示"`
+	BtnSuspend           bool `description:"暂停/启用按钮权限:true显示,false不显示"`
+	BtnDelay             bool `description:"申请延期按钮权限:true显示,false不显示"`
+	BtnTurnPositive      bool `description:"申请转正按钮权限:true显示,false不显示"`
+	BtnUpdate            bool `description:"服务更新按钮权限:true显示,false不显示"`
+	BtnAddAgreement      bool `description:"补充协议按钮权限:true显示,false不显示"`
+	BtnThaw              bool `description:"申请解冻按钮权限:true显示,false不显示"`
+	BtnApplyReceive      bool `description:"申请领取按钮权限:true显示,false不显示"`
+	BtnReceive           bool `description:"领取客户按钮权限:true显示,false不显示"`
+	BtnModifySeller      bool `description:"修改销售按钮权限:true显示,false不显示"`
+	BtnReceiveOther      bool `description:"领取其他部门客户按钮权限:true显示,false不显示"`
+	BtnFreeze            bool `description:"冻结按钮权限:true显示,false不显示"`
+	BtnTryOut            bool `description:"增开试用:true显示,false不显示"`
+	BtnDetail            bool `description:"详情按钮:true显示,false不显示"`
+	BtnRemarkEdit        bool `description:"编辑备注按钮:true显示,false不显示"`
+	BtnRemarkView        bool `description:"查看备注按钮:true显示,false不显示"`
+	BtnRemarkViewHistory bool `description:"查看历史备注按钮:true显示,false不显示"`
+	BtnShare             bool `description:"设置共享按钮:true显示,false不显示"`
+	BtnServiceRecord     bool `description:"查看服务记录按钮:true显示,false不显示"`
+	BtnClose             bool `description:"关闭客户按钮:true显示,false不显示"`
+	BtnLoss              bool `description:"转流失按钮:true显示,false不显示"`
+	IsResearchShow       bool `description:"研选详情展示控制:true显示,false不显示"`
 }
 
 type ButtonSearchPermission struct {
@@ -1762,7 +1765,7 @@ func GetShareCompanyList(condition, sortStr string, pars []interface{}, startSiz
 	t := time.Now().Local().AddDate(0, 0, -7).Format(utils.FormatDate)
 
 	sql := `SELECT a.company_id,a.company_name,a.credit_code,a.company_code,a.created_time,a.province,a.city,
-a.address,a.region_type,b.group_id,b.road_show_total,b.is_share,b.share_seller_id,b.share_seller,
+a.address,a.region_type,b.group_id,b.road_show_total,b.is_share,b.share_seller_id,b.share_seller,b.is_user_maker,
 			CASE 
      WHEN GROUP_CONCAT(b.status) LIKE "%永续%" THEN 1
 	 WHEN GROUP_CONCAT(b.status) LIKE "%正式%" THEN 2

+ 11 - 0
models/company/company_approval.go

@@ -1665,3 +1665,14 @@ GROUP BY
 
 	return
 }
+
+func GetCompanyApprovalList(condition string, pars []interface{}) (items []*CompanyApproval, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM company_approval WHERE 1 = 1  `
+
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}

+ 138 - 0
models/company/company_contract.go

@@ -3,6 +3,7 @@ package company
 import (
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
+	"strings"
 	"time"
 )
 
@@ -27,6 +28,14 @@ type CompanyContract struct {
 	PackageType       int       `description:"套餐类型,0:无,1:大套餐,2:小套餐"`
 	RaiPackageType    int       `description:"权益套餐类型: 0-无; 1-70w大套餐; 2-45w大套餐"`
 	RaiContractType   string    `description:"权益合同类型:枚举值:'新签合同','续约合同','补充协议'"`
+	SellerIdInit      int       `description:"销售id"`
+	SellerNameInit    string    `description:"销售名称"`
+	ShareSellerInit   string    `description:"共享销售员"`
+	ShareSellerIdInit int       `description:"共享销售员id"`
+	SellerIdLast      int       `description:"合同到期之前最后所属销售id"`
+	SellerNameLast    string    `description:"合同到期之前最后所属销售名称"`
+	ShareSellerLast   string    `description:"合同到期之前最后所属共享销售员"`
+	ShareSellerIdLast int       `description:"合同到期之前最后所属共享销售员id"`
 }
 
 // 新增客户合同
@@ -287,10 +296,22 @@ 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
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
 type GetCompanyContractDetailResp struct {
 	Detail *CompanyContractResp
 }
 
+type GetCompanyContractDetailListResp struct {
+	List []*CompanyContractResp
+}
+
 // UpdateCompanyContractPackageDifference 更改合同与上一份合同金额对比信息
 func UpdateCompanyContractPackageDifference(packageDifference string, companyContractId int) (err error) {
 	o := orm.NewOrm()
@@ -346,3 +367,120 @@ func GetFirstContractRai(companyId int) (item *CompanyContract, err error) {
 	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()
+	sql := `UPDATE company_contract SET share_seller_init = ? , share_seller_id_init = ?  WHERE company_id = ?  AND product_id= 2 `
+	_, err = o.Raw(sql, share_seller_init, share_seller_id_init, companyId).Exec()
+	return
+}
+
+// 更新合同类型
+func UpdateCompanyContractTypeinit16_1_02(seller_name_init string, seller_id_init, company_contract_id int) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE company_contract SET seller_name_init = ? , seller_id_init = ?  WHERE company_contract_id = ?  AND product_id= 2 `
+	_, err = o.Raw(sql, seller_name_init, seller_id_init, company_contract_id).Exec()
+	return
+}
+
+// 合同未生效更新对应销售的信息
+func UpdateCompanyContractSellerNotEffective(sellerId, shareSellerInit int, sellerName, shareSeller string, companyContractId int) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE company_contract SET seller_id_init = ? , seller_name_init = ? ,                         
+                            share_seller_id_init = ? , share_seller_init = ? ,
+                            seller_id_last = ? , seller_name_last = ? ,                          
+                           share_seller_id_last = ? ,    share_seller_last= ?
+                            WHERE company_contract_id = ?  AND product_id= 2 `
+	_, err = o.Raw(sql, sellerId, sellerName, shareSellerInit, shareSeller, sellerId, sellerName, shareSellerInit, shareSeller, companyContractId).Exec()
+	return
+}
+
+// 合同未到期更新对应销售的信息
+func UpdateCompanyContractSellerUnexpired(sellerId, shareSellerInit int, sellerName, shareSeller string, companyContractId int) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE company_contract SET
+                            seller_id_last = ? , 
+                            seller_name_last = ? , 
+                            share_seller_id_last  = ? , 
+                            share_seller_last= ?  WHERE company_contract_id = ?  AND product_id= 2 `
+	_, err = o.Raw(sql, sellerId, sellerName, shareSellerInit, shareSeller, companyContractId).Exec()
+	return
+}
+
+type CompanyContractRespInit struct {
+	MaxCompanyContractId int
+	CompanyContractId    int       `orm:"column(company_contract_id);pk" description:"客户合同id"`
+	ContractType         string    `description:"合同类型:枚举值:'新签合同','续约合同','补充协议'"`
+	ProductId            int       `description:"产品id"`
+	ProductName          string    `description:"产品名称"`
+	CompanyId            int       `description:"客户id"`
+	CompanyProductId     int       `description:"客户产品id"`
+	ContractCode         string    `description:"合同编码"`
+	StartDate            string    `description:"合同开始时间"`
+	EndDate              time.Time `description:"合同结束时间"`
+	MaxStartDate         time.Time `description:"合同结束时间"`
+	Money                float64   `description:"合同金额"`
+	PayMethod            string    `description:"支付方式"`
+	PayChannel           string    `description:"支付渠道"`
+	ImgUrl               string    `description:"合同图片,多个用#隔开"`
+	CreateTime           time.Time `description:"合同创建时间"`
+	ModifyTime           time.Time `description:"合同修改时间"`
+	Status               int       `description:"状态"`
+	Source               string    `description:"合同来源,枚举值:上传附件、系统合同,默认上传附件"`
+	PackageType          int       `description:"套餐类型,0:无,1:大套餐,2:小套餐"`
+	RaiPackageType       int       `description:"权益套餐类型: 0-无; 1-70w大套餐; 2-45w大套餐"`
+	PermissionName       string    `description:"权限名"`
+}
+
+// 通过ID获取详情
+func GetCompanyContracListMaxStartDate(condition string, pars []interface{}) (items []*CompanyContractRespInit, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+			MAX( a.start_date ) AS max_start_date,
+			COUNT(a.company_id) AS cc ,
+			a.* 
+		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 
+			
+			AND c.product_id = 2 
+			AND a.not_renewal_hide = 0 
+			AND a.STATUS = 1 
+			AND a.company_contract_id  NOT IN (SELECT company_contract_id FROM company_contract_no_renewed_ascribe )` + condition + ` GROUP BY a.company_id `
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// 通过ID获取详情
+func GetCompanyContracListInit_CRM_16_1(condition string, pars []interface{}) (items []*CompanyContractRespInit, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+			a.* 
+		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 
+			AND c.product_id = 2
+			AND a.not_renewal_hide = 0 
+			AND a.STATUS = 1 
+			AND a.company_contract_id  NOT IN (SELECT company_contract_id FROM company_contract_no_renewed_ascribe ) ` + condition
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// 合同未生效更新对应销售的信息
+func UpdateCompanyContracthide(companyContractId []string) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE company_contract SET not_renewal_hide = 1                                
+                            WHERE company_contract_id  IN  (` + strings.Join(companyContractId, ",") + `) `
+	_, err = o.Raw(sql).Exec()
+	return
+}

+ 96 - 0
models/company/company_history_remark.go

@@ -0,0 +1,96 @@
+package company
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CompanyHistoryRemark struct {
+	HistoryId    int       `orm:"column(history_id);pk" comment:"备注id"`
+	CompanyId    int       `comment:"客户ID"`
+	ProductId    int       `comment:"产品id"`
+	Content      string    `comment:"备注内容"`
+	SysAdminId   int       `comment:"创建人ID"`
+	SysAdminName string    `comment:"创建人姓名"`
+	CreateTime   time.Time `comment:"创建时间"`
+	ModifyTime   time.Time `comment:"更新时间"`
+	TableName    string    `comment:"表名"`
+	TableId      int       `comment:"表ID"`
+	UserId       int       `comment:"用户ID"`
+	Mobile       string    `comment:"手机号"`
+	Email        string    `comment:"邮箱"`
+	RealName     string    `comment:"用户实际名称"`
+	ShowTime     time.Time `comment:"对外展示的创建时间"`
+}
+
+// CompanyHistoryRemarkReq 新增历史备注请求
+type CompanyHistoryRemarkReq struct {
+	CompanyId int    `description:"客户id"`
+	Content   string `description:"备注内容"`
+}
+
+// 新增
+func AddCompanyHistoryRemark(remark *CompanyHistoryRemark) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Insert(remark)
+	return
+}
+
+type CompanyHistoryRemarkResp struct {
+	CompanyId    int    `comment:"客户ID"`
+	Content      string `comment:"备注内容"`
+	SysAdminName string `comment:"创建人姓名"`
+	RemarkType   string `comment:"备注类型"`
+	CreateTime   string `comment:"对外展示的创建时间"`
+}
+
+type CompanyHistoryRemarkListResp struct {
+	List []*CompanyHistoryRemarkResp
+}
+
+// GetCompanyHistoryRemarkList 获取备注列表
+func GetCompanyHistoryRemarkList(CompanyId, ProductId string) (items []*CompanyHistoryRemark, err error) {
+	o := orm.NewOrm()
+	sql := "SELECT * FROM company_history_remark WHERE company_id=? AND product_id=? ORDER BY show_time DESC "
+	_, err = o.Raw(sql, CompanyId, ProductId).QueryRows(&items)
+	return
+}
+
+// DelCompanyHistoryRemark 删除客户历史备注
+func DelCompanyHistoryRemark(tableName string, tableId int) (err error) {
+	o := orm.NewOrm()
+	sql := `DELETE FROM company_history_remark WHERE table_name = ? AND  table_id = ?   `
+	_, err = o.Raw(sql, tableName, tableId).Exec()
+	return
+}
+
+// GetCompanyHistoryRemarkList 获取备注列表
+func GetCompanyHistoryRemarkListinit() (items []*CompanyHistoryRemark, err error) {
+	o := orm.NewOrm()
+	sql := "SELECT * FROM company_history_remark  WHERE	 table_id > 0   "
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+// AddCompanyHistoryRemarkMultiinit 批量添加
+func AddCompanyHistoryRemarkMultiinit(items []*CompanyHistoryRemark) (err error) {
+	if len(items) == 0 {
+		return
+	}
+	o, err := orm.NewOrm().Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err == nil {
+			o.Commit()
+		} else {
+			o.Rollback()
+		}
+	}()
+	if len(items) > 0 {
+		//批量添加流水信息
+		_, err = o.InsertMulti(len(items), items)
+	}
+	return
+}

+ 2 - 2
models/company/company_no_renewed_note.go

@@ -35,9 +35,9 @@ type CompanyNoRenewedNoteReq struct {
 }
 
 // 添加
-func AddCompanyNoRenewedNote(item *CompanyNoRenewedNote) (err error) {
+func AddCompanyNoRenewedNote(item *CompanyNoRenewedNote) (newId int64, err error) {
 	o := orm.NewOrm()
-	_, err = o.Insert(item)
+	newId, err = o.Insert(item)
 	return
 }
 

+ 9 - 2
models/company/company_operation_record.go

@@ -40,7 +40,7 @@ type CompanyOperationRecordList struct {
 	ProductName         string
 }
 
-//新增客户操作记录
+// 新增客户操作记录
 func AddCompanyOperationRecord(item *CompanyOperationRecord) (lastId int64, err error) {
 	o := orm.NewOrm()
 	lastId, err = o.Insert(item)
@@ -59,7 +59,7 @@ type CompanyOperationRecordListResp struct {
 	ShowButton bool
 }
 
-//获取客户正式转试用的次数
+// 获取客户正式转试用的次数
 func GetCompanyProductOperationRecordCount(companyId, productId int) (total int64, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT count(1) ct FROM company_operation_record 
@@ -88,3 +88,10 @@ func GetTryOutCompanyOperationRecordList() (list []*CompanyOperationRecord, err
 	_, err = o.Raw(sql).QueryRows(&list)
 	return
 }
+
+func GetCompanyOperationRecordListinitcrm16_1() (items []*CompanyOperationRecord, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT  * FROM company_operation_record WHERE  product_id =2 AND operation = 'add'     `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}

+ 46 - 4
models/company/company_product.go

@@ -61,6 +61,9 @@ type CompanyProduct struct {
 	ShareSeller         string    `description:"共享销售员"`
 	ShareSellerId       int       `description:"共享销售员id"`
 	ShareGroupId        int       `description:"共享销售员所属分组ID"`
+	IsUserMaker         int       `description:"近四周之内是否包含决策人互动过 ,0否,1是"`
+	SellerIdInit        int       `description:"初始化所属销售id"`
+	SellerNameInit      string    `description:"初始化所属销售名称"`
 }
 
 // 新增客户产品
@@ -300,9 +303,9 @@ type CompanyRenewalReason struct {
 }
 
 // AddRenewalReason 新增续约情况说明
-func AddRenewalReason(renewalReason *CompanyRenewalReason) (err error) {
+func AddRenewalReason(renewalReason *CompanyRenewalReason) (newId int64, err error) {
 	o := orm.NewOrm()
-	_, err = o.Insert(renewalReason)
+	newId, err = o.Insert(renewalReason)
 	return
 }
 
@@ -366,9 +369,9 @@ type CompanyProductRemark struct {
 	SysRealName            string    `description:"创建人姓名"`
 }
 
-func AddCompanyRemark(remark *CompanyProductRemark) (err error) {
+func AddCompanyRemark(remark *CompanyProductRemark) (newId int64, err error) {
 	o := orm.NewOrm()
-	_, err = o.Insert(remark)
+	newId, err = o.Insert(remark)
 	return
 }
 
@@ -380,6 +383,14 @@ func GetRemarkList(CompanyId, ProductId string) (items []*CompanyProductRemark,
 	return
 }
 
+// GetRemarkList 获取备注列表15.9.1job
+func GetRemarkListInit() (items []*CompanyProductRemark, err error) {
+	o := orm.NewOrm()
+	sql := "SELECT * FROM company_product_remark WHERE product_id=2 ORDER BY create_time DESC"
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
 // GetRemarkList 获取备注列表
 func GetRemarkListByCompanyId(CompanyId string) (items []*CompanyProductRemark, err error) {
 	o := orm.NewOrm()
@@ -692,3 +703,34 @@ func UpdateSharGroupid(sharGroupid, shareSellerId int) (err error) {
 	_, err = o.Raw(sql, sharGroupid, shareSellerId).Exec()
 	return
 }
+
+// 更新公司初始化销售
+func UpdateCompanyProductsellerInit(seller_id_init int, seller_name_init string, companyId, productId int) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE company_product SET seller_id_init=? , seller_name_init = ? WHERE company_id=? AND product_id=? `
+	_, err = o.Raw(sql, seller_id_init, seller_name_init, companyId, productId).Exec()
+	return
+}
+
+// 合同未到期更新对应销售的信息
+func UpdateCompanyProductSellerUnexpired(sellerId, shareSellerInit int, sellerName, shareSeller string, companyId int) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE company_product SET
+                            seller_id_last = ? , 
+                            seller_name_last = ? , 
+                            share_seller_id_last  = ? , 
+                            share_seller_last = ?  WHERE company_id = ?  AND product_id= 2 `
+	_, err = o.Raw(sql, sellerId, sellerName, shareSellerInit, shareSeller, companyId).Exec()
+	return
+}
+
+// 合同未到期更新对应销售的信息
+func UpdateCompanyProductSellerUnexpiredInitinit16_1_05(sellerId int, sellerName string, companyId int) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE company_product SET
+                            seller_id_last = ? , 
+                            seller_name_last = ? 
+                            WHERE company_id = ?  AND product_id= 2 `
+	_, err = o.Raw(sql, sellerId, sellerName, companyId).Exec()
+	return
+}

+ 2 - 2
models/company/company_service_record.go

@@ -45,13 +45,13 @@ func (m *CompanyServiceRecord) TableName() string {
 	return "company_service_record"
 }
 
-func (m *CompanyServiceRecord) Create() (err error) {
+func (m *CompanyServiceRecord) Create() (newId int, err error) {
 	o := orm.NewOrm()
 	id, err := o.Insert(m)
 	if err != nil {
 		return
 	}
-	m.CompanyServiceRecordId = int(id)
+	newId = int(id)
 	return
 }
 

+ 5 - 1
models/company/company_user.go

@@ -64,6 +64,7 @@ type CompanyUser struct {
 	IsFollow                 int       `description:"是否特别关注: 0-未关注; 1-已关注"`
 	IsSubscribeHzyj          int       `description:"是否关注了弘则研究微信公众号: 0-未关注; 1-已关注"`
 	IsSubscribeCygx          int       `description:"是否关注了查研观向微信公众号: 0-未关注; 1-已关注"`
+	IsSubscribeMfyx          int       `description:"是否关注了买方研选微信公众号: 0-未关注; 1-已关注"`
 	FiccViewTotal            int       `description:"ficc报告的阅读次数" json:"-"`
 	FiccLastViewTime         time.Time `description:"ficc报告最近一次阅读时间" json:"-"`
 	RaiViewTotal             int       `description:"权益报告的阅读次数" json:"-"`
@@ -75,6 +76,9 @@ type CompanyUser struct {
 	MfyxInteractionNum       int       `description:"互动量"`
 	MfyxIsBinding            bool      `description:"买方研选是否绑定"`
 	MfyxBindingTime          string    `description:"买方研选绑定时间"`
+	HaveMoveButton           bool      `description:"是否移动过"`
+	OutboundMobile           string    `description:"外呼手机号"`
+	OutboundCountryCode      string    `description:"外呼手机号区号"`
 }
 
 type CompanyUserListResp struct {
@@ -136,7 +140,7 @@ func GetCompanyUserListCountV2(condition string, pars []interface{}, companyId i
 func GetCompanyUserListV2(condition string, pars []interface{}, companyId, startSize, pageSize int) (items []*CompanyUser, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT
-				a.*, a.cygx_subscribe as is_subscribe_cygx,  c.subscribe AS is_subscribe_hzyj   
+				a.*, a.cygx_subscribe AS is_subscribe_cygx,  a.mfyx_subscribe AS is_subscribe_mfyx , c.subscribe AS is_subscribe_hzyj   
 			FROM
 				wx_user AS a
 			LEFT JOIN user_seller_relation AS b ON a.user_id = b.user_id

+ 65 - 0
models/company/wx_user_move_log.go

@@ -0,0 +1,65 @@
+package company
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"hongze/hz_crm_api/utils"
+	"time"
+)
+
+// WxUserOpLog 联系人操作日志表
+type WxUserMoveLog struct {
+	Id              int       `orm:"column(id);pk"`
+	UserId          int       `description:"联系人id"`
+	RealName        string    `description:"联系人姓名"`
+	Mobile          string    `description:"当前手机号"`
+	Email           string    `description:"当前邮箱"`
+	CompanyId       int       `description:"当前客户id"`
+	CompanyName     string    `description:"当前客户名称"`
+	SysUserId       int       `description:"操作人ID"`
+	SysUserRealName string    `description:"操作人姓名"`
+	CompanyIdMove   int       `description:"移动后客户id"`
+	CompanyNameMove string    `description:"移动后客户名称"`
+	CreateTime      time.Time `description:"日志创建时间"`
+}
+
+// AddWxUserOpLog 联系人移动日志记录
+func AddWxUserMoveLog(item *WxUserMoveLog) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Insert(item)
+	return
+}
+
+// 列表
+func GetWxUserMoveLogListmByMobiles(mobiles []string) (items []*WxUserMoveLog, err error) {
+	lenarr := len(mobiles)
+	if lenarr == 0 {
+		return
+	}
+	o := orm.NewOrm()
+	sql := `SELECT mobile FROM wx_user_move_log   WHERE  mobile	 IN (` + utils.GetOrmInReplace(lenarr) + `)  GROUP BY mobile   `
+	_, err = o.Raw(sql, mobiles).QueryRows(&items)
+	return
+}
+
+// 列表
+func GetWxUserMoveLogListmByMobile(mobile string) (items []*WxUserMoveLog, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM wx_user_move_log   WHERE  mobile	 = ?  ORDER BY   id  ASC    `
+	_, err = o.Raw(sql, mobile).QueryRows(&items)
+	return
+}
+
+type WxUserMoveLogResp struct {
+	UserName        string `description:"联系人姓名"`
+	Mobile          string `description:"手机号"`
+	Email           string `description:"邮箱地址"`
+	CompanyId       int    `description:"当前客户id"`
+	CompanyName     string `description:"当前客户名称"`
+	CompanyIdMove   int    `description:"移动后客户id"`
+	CompanyNameMove string `description:"移动后客户名称"`
+	CreateTime      string `description:"日志创建时间"`
+}
+
+type WxUserMoveLogListResp struct {
+	List []*WxUserMoveLogResp
+}

+ 34 - 0
models/cygx/activity.go

@@ -93,6 +93,7 @@ type ActivityRep struct {
 	BackgroundImg           string                       `description:"封面图片"`
 	ShareImg                string                       `description:"分享图片"`
 	AreaType                int                          `description:"地区,1国内,2海外,默认1"`
+	IsZoom                  int                          `description:"是否是Zoom模版  1是,0否"`
 }
 
 // 活动添加、修改入参
@@ -130,6 +131,7 @@ type ActivityDetail struct {
 	Theme                     string `description:"主题"`
 	Expert                    string `description:"专家"`
 	ActivityName              string `description:"活动名称"`
+	ActivityNameTask          string `description:"活动名称定时任务同步的时候使用"`
 	OnlineParticipation       string `description:"网络参会"`
 	ReportLink                string `description:"报告链接"`
 	City                      string `description:"城市"`
@@ -179,6 +181,7 @@ type ActivityDetail struct {
 	ShareImg                  string                     `description:"分享图片"`
 	TopTime                   int                        `description:"置顶时间"`
 	AreaType                  int                        `description:"地区,1国内,2海外,默认1"`
+	IsZoom                    int                        `description:"是否是Zoom模版  1是,0否"`
 }
 
 type ActivityDetailRep struct {
@@ -252,6 +255,8 @@ type CygxActivity struct {
 	ChartPermissionNameDeputy string    `description:"行业名称"`
 	CancelDeadline            string    `description:"取消报名截止时间"`
 	AreaType                  int       `description:"地区,1国内,2海外,默认1"`
+	IsZoom                    int       `description:"是否是Zoom模版  1是,0否"`
+	MeetingId                 string    `description:"会议ID"`
 }
 
 type CygxActivityEditDetail struct {
@@ -425,6 +430,8 @@ func EditActivity(item *CygxActivity, oldPublishStatus int, industrialActivityIt
 	updateParams["ChartPermissionIdDeputy"] = item.ChartPermissionIdDeputy
 	updateParams["CancelDeadline"] = item.CancelDeadline
 	updateParams["AreaType"] = item.AreaType
+	updateParams["MeetingId"] = item.MeetingId
+	updateParams["IsZoom"] = item.IsZoom
 	//修改活动信息
 	ptrStructOrTableName := "cygx_activity"
 	whereParam := map[string]interface{}{"activity_id": item.ActivityId}
@@ -732,3 +739,30 @@ func UpdateCygxActivityMomentsImg(momentsImg string, activityId int) (err error)
 	_, err = o.Raw(sql, momentsImg, activityId).Exec()
 	return
 }
+
+// UpdateCygxActivityyidongActivityId  ,建立与易董的活动关联
+func UpdateCygxActivityyidongActivityId(yidongActivityId string, activityId int) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ` UPDATE cygx_activity SET yidong_activity_id_by_cygx = ?  WHERE activity_id=?   `
+	_, err = o.Raw(sql, yidongActivityId, activityId).Exec()
+	return
+}
+
+// UpdateCygxActivitySubmitMeetingByYidong  ,跟易董返回的用户状态修改活动以提交到会状态
+func UpdateCygxActivitySubmitMeetingByYidong(yidongActivityId string) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `UPDATE cygx_activity SET is_submit_meeting = 1 WHERE yidong_activity_id=? OR  yidong_activity_id_by_cygx = ? `
+	_, err = o.Raw(sql, yidongActivityId, yidongActivityId).Exec()
+	return
+}
+
+// UpdateCygxActivitySignupisMeetList 批量修改易董的活动,用户已到会
+func UpdateCygxActivitySignupisMeetList(condition string, pars []interface{}) (err error) {
+	if condition == "" {
+		return
+	}
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `UPDATE cygx_activity_signup SET is_meeting=1 WHERE  1= 1 ` + condition
+	_, err = o.Raw(sql, pars).Exec()
+	return
+}

+ 13 - 8
models/cygx/activity_attendance_detail.go

@@ -97,11 +97,16 @@ func AddAttendancDetail(items []*CygxActivityAttendanceDetail, activityId int, m
 		return
 	}
 	//插入提交信息
-	for _, v := range items {
-		_, err = to.Insert(v)
-		if err != nil {
-			return
-		}
+	//for _, v := range items {
+	//	_, err = to.Insert(v)
+	//	if err != nil {
+	//		return
+	//	}
+	//}
+
+	_, err = o.InsertMulti(len(items), items)
+	if err != nil {
+		return err
 	}
 	return
 }
@@ -246,10 +251,10 @@ type RoadshowDataTitleResp struct {
 	ActivityId int    `description:"活动ID"`
 }
 
-func GetRoadshowDataTitleList(title string) (list []*RoadshowDataTitle, err error) {
+func GetRoadshowDataTitleList(startTime, endTime, title string) (list []*RoadshowDataTitle, err error) {
 	o := orm.NewOrmUsingDB("comein_data")
-	sql := `SELECT roadshow_title, roadshow_begin_time as activity_time  FROM roadshow_data WHERE roadshow_title LIKE '%` + title + `%'  GROUP BY  roadshow_id `
-	_, err = o.Raw(sql).QueryRows(&list)
+	sql := `SELECT roadshow_title, roadshow_begin_time as activity_time  FROM roadshow_data WHERE  roadshow_begin_time > ? AND  roadshow_end_time < ?   AND roadshow_title LIKE '%` + title + `%'  GROUP BY  roadshow_id `
+	_, err = o.Raw(sql, startTime, endTime).QueryRows(&list)
 	return
 }
 

+ 35 - 0
models/cygx/activity_signup_detail.go

@@ -121,3 +121,38 @@ func UpdateActivitySignupDetailMulti(items []*CygxActivitySignupDetail) (err err
 	}
 	return
 }
+
+// UpdateActivitySignupDetailMultiByYiDong 易董批量修改用户报名信息且报名的人
+func UpdateActivitySignupDetailMultiByYiDong(items []*CygxActivitySignupDetail) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	p, err := o.Raw(` UPDATE cygx_activity_signup_detail SET 
+							first_meeting_time = ?,
+							last_meeting_time = ?,
+							meeting_status_str = ?,
+							position = ?,
+							real_name = ?,
+							duration = ?,
+							is_meeting = ?
+							WHERE mobile = ? AND activity_id = ? `).Prepare()
+	if err != nil {
+		return
+	}
+	defer func() {
+		_ = p.Close() // 别忘记关闭 statement
+	}()
+	for _, v := range items {
+		_, err = p.Exec(
+			v.FirstMeetingTime,
+			v.LastMeetingTime,
+			v.MeetingStatusStr,
+			v.Position,
+			v.RealName,
+			v.Duration,
+			v.IsMeeting,
+			v.Mobile, v.ActivityId)
+		if err != nil {
+			return
+		}
+	}
+	return
+}

+ 45 - 0
models/cygx/activity_user_template_record.go

@@ -0,0 +1,45 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+//活动发布推送的Openid记录
+
+type CygxActivityUserTemplateRecord struct {
+	TemplateId int       `orm:"column(template_id);pk"description:"主键ID"`
+	ActivityId int       ` description:"活动ID"`
+	UserId     int       ` description:"用户ID"`
+	OpenId     string    ` description:"open_id "`
+	SendType   int       ` description:"类型 "`
+	CreateTime time.Time `description:"创建时间"`
+}
+
+// AddCygxActivityUserTemplateRecordMulti 批量添加
+func AddCygxActivityUserTemplateRecordMulti(items []*CygxActivityUserTemplateRecord) (err error) {
+	o, err := orm.NewOrmUsingDB("hz_cygx").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err == nil {
+			o.Commit()
+		} else {
+			o.Rollback()
+		}
+	}()
+	//批量插入新的关联数据
+	if len(items) > 0 {
+		_, err = o.InsertMulti(len(items), items)
+	}
+	return
+}
+
+// GeUserTemplateRecordListBysendType 根据模板消息会议类型,获取已推送的用户的信息
+func GeCygxActivityUserTemplateRecordListByActivityId(activityId, sendType int) (items []*CygxActivityUserTemplateRecord, err error) {
+	sql := `SELECT * FROM cygx_activity_user_template_record WHERE activity_id = ?  AND  send_type = ?  `
+	o := orm.NewOrmUsingDB("hz_cygx")
+	_, err = o.Raw(sql, activityId, sendType).QueryRows(&items)
+	return
+}

+ 1 - 0
models/cygx/apply_record.go

@@ -65,6 +65,7 @@ type CygxApplyRecordResp struct {
 	Source                   string `description:"资源类型 报告 :article 、图表 :newchart、微路演 :roadshow、活动 :activity、活动视频:activityvideo、活动音频:activityvoice、专项调研活动:activityspecial"`
 	Title                    string `description:"标题"`
 	HttpUrl                  string `description:"跳转地址"`
+	IsGray                   bool   `description:"是否置灰"`
 }
 
 func GetCygxApplyRecord(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxApplyRecordResp, err error) {

+ 1 - 1
models/cygx/chart.go

@@ -167,7 +167,7 @@ type ChartCollectReq struct {
 // 获取图表列表
 func GetChartList(condition string, pars []interface{}, startSize, pageSize int) (items []*HomeChartListResp, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
-	sql := ` SELECT * FROM cygx_chart AS a WHERE a.publish_status=1 `
+	sql := ` SELECT * FROM cygx_chart AS a WHERE 1=1 `
 	if condition != "" {
 		sql += condition
 	}

+ 1 - 1
models/cygx/cygx_report_mapping.go

@@ -16,7 +16,7 @@ type CygxReportMappingListRep struct {
 // 主题列表
 func CygxReportMappingist(chartPermissionId int) (items []*CygxReportMapping, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
-	sql := `SELECT sub_category_name FROM cygx_report_mapping WHERE  chart_permission_id = ? GROUP BY sub_category_name`
+	sql := `SELECT sub_category_name FROM cygx_report_mapping WHERE  chart_permission_id = ? GROUP BY sub_category_name   ORDER BY sort DESC , id  ASC  `
 	_, err = o.Raw(sql, chartPermissionId).QueryRows(&items)
 	return
 }

+ 15 - 1
models/cygx/cygx_user.go

@@ -44,11 +44,18 @@ type CygxCompanyUser struct {
 	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:"职位"`
 }
 
 type CompanyUserListResp struct {
@@ -104,8 +111,10 @@ func GetCygxCompanyUserList(userCondition, keyWord, kwywordcondition, condition,
 			u.real_name,
 			u.is_register,
 			u.is_maker,
+			u.position,
 			u.user_label as  labels,
 			u.cygx_subscribe as is_subscribe_cygx, 
+			u.mfyx_subscribe as is_subscribe_mfyx, 
 			c.company_name,
 			c.company_id,
 			c.interaction_num as company_interaction_num,
@@ -203,7 +212,9 @@ func GetCygxCompanyUserListSplit(userIds string) (items []*CygxCompanyUser, err
 			( SELECT COUNT( 1 ) FROM cygx_micro_roadshow_video_history AS h  INNER JOIN cygx_micro_roadshow_video as v ON v.video_id = h.video_id WHERE  h.mobile = u.mobile  ) AS roadshow_video_num,
 			( SELECT COUNT( 1 ) FROM cygx_activity_video_history AS h  INNER JOIN cygx_activity_video as v ON v.video_id = h.video_id WHERE  h.mobile = u.mobile  ) AS activity_video_num,
 			( SELECT COUNT( 1 ) FROM cygx_activity_voice_history AS h  INNER JOIN cygx_activity_voice as v ON v.activity_voice_id = h.activity_voice_id WHERE  h.mobile = u.mobile  ) AS activity_voice_num,
-			( SELECT COUNT( 1 ) FROM cygx_yanxuan_special_record AS h  INNER JOIN cygx_yanxuan_special as v ON v.id = h.yanxuan_special_id WHERE  h.mobile = u.mobile  ) AS yanxuanspecial_num
+			( SELECT COUNT( 1 ) FROM cygx_yanxuan_special_record AS h  INNER JOIN cygx_yanxuan_special as v ON v.id = h.yanxuan_special_id WHERE  h.mobile = u.mobile  ) AS yanxuanspecial_num,
+			( SELECT COUNT(1) FROM cygx_user_feedback as h WHERE h.mobile = u.mobile   ) AS feedback_num,
+			( SELECT COUNT(1) FROM  ` + databaseName + `.rs_calendar_meeting_user as h WHERE h.mobile = u.mobile    ) AS rs_calendar_num
 		FROM ` + databaseName + `.wx_user AS u WHERE  u.user_id IN (` + userIds + `)  AND u.mobile != ''	GROUP BY u.user_id  `
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
@@ -296,6 +307,7 @@ type UserInteractionListResp struct {
 
 type UserInteraction struct {
 	ArticleId             int    `description:"文章id"`
+	ReportId              int    `description:"研报文章id"`
 	ActivityId            int    `description:"活动ID"`
 	ArticleType           int    `description:"文章类型 1:查研观向, 2:策略平台"`
 	ArticleIdMd5          string `description:"文章MD5id"`
@@ -366,6 +378,7 @@ type UserInteraction struct {
 	ArticleNum            int    // 已发布的文章数量
 	FansNum               int    // 粉丝数量
 	ResearcherName        string `description:"研究员姓名"`
+	RoadShowTheme         string `description:"路演主题"`
 }
 
 // 查研观向图表
@@ -732,6 +745,7 @@ func GetCygxArticleCollectByUser(uid, startSize, pageSize int, condition string)
 	sql := ` SELECT
 			art.title,
 			art.article_id,
+			art.report_id,
 			art.article_id_md5,
 			art.publish_date,
 			re.chart_permission_name,

+ 3 - 23
models/cygx/cygx_user_company.go

@@ -284,6 +284,7 @@ func GetCygxArticleCollectByCompanyWeekly(startSize, pageSize int, condition str
 	sql := ` SELECT
 			art.title,
 			art.article_id,
+			art.report_id,
 			art.article_id_md5,
 			art.publish_date,
 			re.chart_permission_name,
@@ -839,7 +840,7 @@ func GetCygxRoadshowByCompanyList(condition string, startSize, pageSize int) (it
 func GetCompanyInteractionTableCountBytime(companyId int, startDate, endDate string) (item *GetUserInteractionTableCountResp, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
 	sql := `SELECT
-			( SELECT COUNT( 1 ) FROM cygx_article_history_record_all AS h  INNER JOIN cygx_article  as art  ON  art.article_id = h.article_id  WHERE h.company_id = ? AND h.is_del = 0  	AND create_time BETWEEN '` + startDate + `'AND '` + endDate + `'   AND h.create_time < date_format(now(),'%Y-%m-%d')  ) AS history_num,
+			( SELECT COUNT( 1 ) FROM cygx_article_history_record_all AS h  INNER JOIN cygx_article  as art  ON  art.article_id = h.article_id  WHERE h.company_id = ? AND h.is_del = 0  	AND h.create_time BETWEEN '` + startDate + `'AND '` + endDate + `'   AND h.create_time < date_format(now(),'%Y-%m-%d')  ) AS history_num,
 			( SELECT COUNT( 1 ) FROM cygx_article_collect AS h WHERE h.company_id = ?  AND create_time BETWEEN '` + startDate + `'AND '` + endDate + `'  AND h.create_time < date_format(now(),'%Y-%m-%d') ) AS count_num,
 			( SELECT COUNT( 1 ) FROM cygx_chart_collect AS h WHERE h.company_id = ?  AND create_time BETWEEN '` + startDate + `'AND '` + endDate + `'  AND h.create_time < date_format(now(),'%Y-%m-%d') ) AS chart_num,
 			( SELECT COUNT( 1 ) FROM cygx_industry_fllow AS h WHERE h.company_id = ? AND h.type = 1  AND create_time BETWEEN '` + startDate + `'AND '` + endDate + `'   AND h.create_time < date_format(now(),'%Y-%m-%d') ) AS industry_fllow_num,
@@ -855,28 +856,6 @@ func GetCompanyInteractionTableCountBytime(companyId int, startDate, endDate str
 	return
 }
 
-// 根据时间获取机构互动总数统计
-func GetCompanyInteractionTableCountBytimeold(companyId int, startDate, endDate string) (item *GetUserInteractionTableCountResp, err error) {
-	o := orm.NewOrm()
-	sql := `SELECT
-			( SELECT COUNT( 1 ) FROM cygx_article_history_record_all AS h  INNER JOIN cygx_article  as art  ON  art.article_id = h.article_id  WHERE h.company_id = u.company_id AND h.is_del = 0  	AND create_time BETWEEN '` + startDate + `'AND '` + endDate + `'   AND h.create_time < date_format(now(),'%Y-%m-%d')  ) AS history_num,
-			( SELECT COUNT( 1 ) FROM cygx_article_collect AS h WHERE h.company_id = u.company_id  AND create_time BETWEEN '` + startDate + `'AND '` + endDate + `'  AND h.create_time < date_format(now(),'%Y-%m-%d') ) AS count_num,
-			( SELECT COUNT( 1 ) FROM cygx_chart_collect AS h WHERE h.company_id = u.company_id  AND create_time BETWEEN '` + startDate + `'AND '` + endDate + `'  AND h.create_time < date_format(now(),'%Y-%m-%d') ) AS chart_num,
-			( SELECT COUNT( 1 ) FROM cygx_industry_fllow AS h WHERE h.company_id = u.company_id AND h.type = 1  AND create_time BETWEEN '` + startDate + `'AND '` + endDate + `'   AND h.create_time < date_format(now(),'%Y-%m-%d') ) AS industry_fllow_num,
-			( SELECT COUNT( 1 ) FROM cygx_article_department_follow AS h WHERE h.company_id = u.company_id  AND h.type = 1 AND create_time BETWEEN '` + startDate + `'AND '` + endDate + `'   AND h.create_time < date_format(now(),'%Y-%m-%d') ) AS department_follow_num,
-			( SELECT COUNT( 1 ) FROM cygx_search_key_word AS h WHERE h.company_id = u.company_id AND create_time BETWEEN '` + startDate + `'AND '` + endDate + `'  AND h.create_time < date_format(now(),'%Y-%m-%d') ) AS key_word_num,
-			( SELECT 	COUNT( DISTINCT a.activity_id )  as count  FROM cygx_activity_signup AS h INNER JOIN cygx_activity as a ON a.activity_id = h.activity_id  INNER JOIN cygx_activity_type as t ON t.activity_type_id = a.activity_type_id   WHERE h.company_id = u.company_id  
-					 AND t.activity_type=1 AND h.do_fail_type = 0 AND a.activity_time BETWEEN '` + startDate + `'AND '` + endDate + `'   AND h.create_time < date_format(now(),'%Y-%m-%d') ) AS on_line_num,
-			( SELECT  	COUNT( DISTINCT a.activity_id )  as count  FROM cygx_activity_signup AS h INNER JOIN cygx_activity as a ON a.activity_id = h.activity_id  INNER JOIN cygx_activity_type as t ON t.activity_type_id = a.activity_type_id   WHERE h.company_id = u.company_id  
-					 AND t.activity_type = 0 AND h.do_fail_type = 0  AND a.activity_time BETWEEN '` + startDate + `'AND '` + endDate + `'  AND h.create_time < date_format(now(),'%Y-%m-%d') ) AS office_num
-		FROM
-			company  as u
-		WHERE
-			u.company_id = ?`
-	err = o.Raw(sql, companyId).QueryRow(&item)
-	return
-}
-
 // 机构阅读记录列表
 func GetCygxArticleHistoryRecordByCompanyList(condition string, startSize, pageSize int) (items []*UserInteraction, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
@@ -961,6 +940,7 @@ func GetCygxArticleCollectByCompanyList(startSize, pageSize int, condition strin
 	sql := ` SELECT
 			art.title,
 			art.article_id,
+			art.report_id,
 			art.article_id_md5,
 			art.publish_date,
 			re.chart_permission_name,

+ 7 - 3
models/cygx/cygx_user_record.go

@@ -231,7 +231,7 @@ func GetCygxActiviyUserFllowOpenid(activityId int) (items []*OpenIdList, err err
 //}
 
 // GetCygxUserRecordPowerByActivitySet 根据活动设置,获取所有有权限的用户的opid
-func GetCygxUserRecordPowerByActivitySet(chartPermissionIds, condition string) (items []*OpenIdList, err error) {
+func GetCygxUserRecordPowerByActivitySet(chartPermissionIds, condition string) (items []*OpenIdList, itemsYx []*OpenIdList, err error) {
 	//o := orm.NewOrm()
 	//sql := `SELECT
 	//		cr.open_id,
@@ -269,6 +269,11 @@ func GetCygxUserRecordPowerByActivitySet(chartPermissionIds, condition string) (
 	}
 	items = openIdList
 
+	openIdListYx, err := GetMfyxUserRecordListByMobileArr(mobileArr)
+	if err != nil {
+		return
+	}
+	itemsYx = openIdListYx
 	return
 }
 
@@ -478,7 +483,6 @@ func GetMfyxActivityOpenIdList(activityId int) (items []*OpenIdList, err error)
 	return
 }
 
-
 // 根据手机号获取用户的openid
 func GetMfyxUserRecordListByMobileArr(bindAccount []string) (items []*OpenIdList, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
@@ -510,4 +514,4 @@ func GetMfyxUserRecordOpenidByMobile(bindAccount string) (item *OpenIdList, err
 			WHERE cr.cygx_bind_account = ?`
 	err = o.Raw(sql, bindAccount).QueryRow(&item)
 	return
-}
+}

+ 152 - 0
models/cygx/gushou_time_line.go

@@ -0,0 +1,152 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"hongze/hz_crm_api/utils"
+	"time"
+)
+
+type CygxGushouTimeLine struct {
+	TimeLineId  int       `orm:"column(time_line_id);pk"`
+	PublishTime time.Time `description:"发布日期"`
+	CreateTime  time.Time `description:"创建时间"`
+	ModifyTime  time.Time `description:"更新时间"`
+	Status      int       `description:"0:未发布,1:已发布"`
+	Content     string    `description:"内容"`
+	ArticleId   int       `description:"文章ID"`
+	ChartId     int       `description:"图表ID"`
+	Link        string    `description:"文章或图表链接"`
+	AdminId     int       `description:"管理员ID"`
+}
+
+type AddGushouTimeLineReq struct {
+	TimeLineId  int    `orm:"column(time_line_id);pk"`
+	PublishTime string `description:"发布日期"`
+	Content     string `description:"内容"`
+	Link        string `description:"文章或图表链接"`
+}
+type GushouTimeLineTimeLineIdReq struct {
+	TimeLineId int `description:"ID"`
+}
+
+// 添加
+func AddCygxGushouTimeLine(item *CygxGushouTimeLine) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	_, err = o.Insert(item)
+	return
+}
+
+// 修改
+func UpdateCygxGushouTimeLine(item *CygxGushouTimeLine) (err error) {
+	to := orm.NewOrmUsingDB("hz_cygx")
+	updateParams := make(map[string]interface{})
+	updateParams["PublishTime"] = item.PublishTime
+	updateParams["ModifyTime"] = item.ModifyTime
+	updateParams["Content"] = item.Content
+	updateParams["ArticleId"] = item.ArticleId
+	updateParams["ChartId"] = item.ChartId
+	updateParams["Link"] = item.Link
+	ptrStructOrTableName := "cygx_gushou_time_line"
+	whereParam := map[string]interface{}{"time_line_id": item.TimeLineId}
+	qs := to.QueryTable(ptrStructOrTableName)
+	for expr, exprV := range whereParam {
+		qs = qs.Filter(expr, exprV)
+	}
+	_, err = qs.Update(updateParams)
+	return
+}
+
+type GetCygxGushouTimeLineResp struct {
+	Status int                `description:"0:内部可见,1:全部可见"`
+	Paging *paging.PagingItem `description:"分页数据"`
+	List   []*CygxGushouTimeLineResp
+}
+
+type CygxGushouTimeLineResp struct {
+	TimeLineId  int    `description:"ID"`
+	PublishTime string `description:"发布日期"`
+	CreateTime  string `description:"创建时间"`
+	ModifyTime  string `description:"更新时间"`
+	Status      int    `description:"0:未发布,1:已发布"`
+	Content     string `description:"内容"`
+	ArticleId   int    `description:"文章ID"`
+	ChartId     int    `description:"图表ID"`
+	Link        string `description:"文章或图表链接"`
+	Pv          int    `description:"PV"`
+	Uv          int    `description:"UV"`
+	Title       string `description:"标题"`
+}
+
+// 获取数量
+func GetCygxGushouTimeLineCount(condition string, pars []interface{}) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_gushou_time_line as art WHERE 1= 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	o := orm.NewOrmUsingDB("hz_cygx")
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+// 列表
+func GetCygxGushouTimeLineList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxGushouTimeLineResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_gushou_time_line as art WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` LIMIT ?,?  `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+type GetCygxGushouTimeLineDetailResp struct {
+	Detail *CygxGushouTimeLineResp
+}
+
+// 通过ID获取详情
+func GetCygxGushouTimeLineDetail(timeLineId int) (item *CygxGushouTimeLineResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_gushou_time_line  WHERE time_line_id=? `
+	err = o.Raw(sql, timeLineId).QueryRow(&item)
+	return
+}
+
+// 删除数据
+func DeleteCygxGushouTimeLine(timeLineId int) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ` DELETE FROM cygx_gushou_time_line WHERE time_line_id = ?`
+	_, err = o.Raw(sql, timeLineId).Exec()
+	return
+}
+
+// 修改是否展示
+func EditCygxGushouTimeLineStatus(status, timeLineId int) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `UPDATE cygx_gushou_time_line SET status=?, modify_time=NOW()   WHERE time_line_id=? `
+	_, err = o.Raw(sql, status, timeLineId).Exec()
+	return
+}
+
+// 一键修改所有的是否展示
+func EditCygxGushouTimeLineStatusAll(status int) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+	sql := ` UPDATE cygx_config SET  config_value=?   WHERE config_code= ?  `
+	_, err = to.Raw(sql, status, utils.CYGX_GUSHOU_TIME_LINE_STATUS).Exec()
+	if err != nil {
+		return
+	}
+	return
+}

+ 32 - 0
models/cygx/gushou_time_line_history.go

@@ -0,0 +1,32 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxGushouTimeLineHistory struct {
+	Id          int `orm:"column(id);pk"`
+	TimeLineId  int
+	UserId      int
+	CreateTime  time.Time
+	Mobile      string    `description:"手机号"`
+	Email       string    `description:"邮箱"`
+	CompanyId   int       `description:"公司id"`
+	CompanyName string    `description:"公司名称"`
+	ModifyTime  time.Time `description:"修改时间"`
+	RealName    string    `description:"用户实际名称"`
+	SellerName  string    `description:"所属销售"`
+}
+
+// 列表
+func GetCygxGushouTimeLineHistoryList(condition string, pars []interface{}) (items []*CygxGushouTimeLineHistory, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_gushou_time_line_history as art WHERE 1= 1 `
+	//condition += `  AND company_id != ` + strconv.Itoa(utils.HZ_COMPANY_ID) // 过滤弘则来源
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}

+ 1 - 1
models/cygx/industrial_management.go

@@ -222,7 +222,7 @@ func DeleteIndustrialManagement(industrialManagementId int) (err error) {
 // 获取产业数量
 func GetIndustrialManagementInfo(industrialManagementId int) (item *CygxIndustrialManagement, err error) {
 	sqlCount := ` SELECT *  FROM cygx_industrial_management WHERE industrial_management_id= ? `
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("hz_cygx")
 	err = o.Raw(sqlCount, industrialManagementId).QueryRow(&item)
 	return
 }

+ 1 - 0
models/cygx/industrial_subject.go

@@ -230,6 +230,7 @@ type CygxIndustrialSubjectListRep struct {
 	IndustrialManagementId int    `description:"产业id"`
 	SubjectName            string `description:"标的名称"`
 	IndustryName           string `description:"分析师名称"`
+	ShowName               string `description:"产业与标的展示名称"`
 }
 
 type CygxIndustrialSubjectList struct {

+ 3 - 3
models/cygx/rai_serve_bill.go

@@ -53,7 +53,7 @@ type RaiServeCoverageRateResp struct {
 }
 
 // 服务类型列表
-func GetRaiServeSearchTagRespList(keywords string) (items []*RaiServeTagResp, err error) {
+func GetRaiServeSearchTagRespList(keywords, chartPermissionId string) (items []*RaiServeTagResp, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
 	sql := `SELECT
 			1 AS tag_type,
@@ -64,7 +64,7 @@ func GetRaiServeSearchTagRespList(keywords string) (items []*RaiServeTagResp, er
 			cygx_industrial_management AS i 
 		WHERE
 			1 = 1 
-			AND i.chart_permission_id IN ( 19, 20, 21, 22 ) 
+			AND i.chart_permission_id IN (` + chartPermissionId + ` ) 
 			AND  (i.industry_name LIKE '%` + keywords + `%' ) UNION ALL
 		SELECT
 			2 AS tag_type,
@@ -76,7 +76,7 @@ func GetRaiServeSearchTagRespList(keywords string) (items []*RaiServeTagResp, er
 			INNER JOIN cygx_industrial_management AS i ON i.industrial_management_id = s.industrial_management_id 
 		WHERE
 			1 = 1 
-			AND i.chart_permission_id IN ( 19, 20, 21, 22 ) 
+			AND i.chart_permission_id IN (` + chartPermissionId + ` ) 
 			AND ( s.subject_name LIKE  '%` + keywords + `%') 
 		ORDER BY
 			create_time ASC `

+ 1 - 1
models/cygx/rai_serve_company.go

@@ -27,7 +27,7 @@ type CygxRaiServeCompany struct {
 type CygxRaiServeCompanyResp struct {
 	CompanyId         int     `comment:"公司ID"`
 	CompanyName       string  `comment:"公司名称"`
-	IsRed             bool    `comment:"是否标红"`
+	IsUserMaker       int     `description:"近四周之内是否包含决策人互动过 ,0否,1是"`
 	Money             float64 `comment:"合同金额"`
 	ServeCoverageRate string  `comment:"近四周服务覆盖率"`
 	SellerId          int     `comment:"所属销售id"`

+ 16 - 2
models/cygx/report_article.go

@@ -32,7 +32,8 @@ type CygxReportArticleID struct {
 }
 
 type CygxReportArticle struct {
-	ReportId          int    `orm:"column(id);pk"description:"报告id"`
+	Id                int    `description:"主键ID"`
+	ReportId          int    `description:"报告id"`
 	ArticleId         int    `description:"文章id"`
 	Title             string `description:"标题"`
 	PublishDate       string `description:"发布时间"`
@@ -62,6 +63,7 @@ type CygxReportArticle struct {
 	Stock             string `description:"个股标签(上海策略品台同步)"`
 	FieldName         string `description:"产业标签(上海策略品台同步)"`
 	Label             string `description:"标签"`
+	HttpUrl           string `description:"跳转地址"`
 	ListIndustrial    []*IndustrialActivityGroupManagementRep
 	ListSubject       []*SubjectActivityGroupManagementRep
 }
@@ -87,6 +89,7 @@ func GetReportArticleList(condition string, pars []interface{}, startSize, pageS
 		sql = `SELECT
 				art.title,
 				art.article_id,
+				art.report_id,
 				art.category_id,
 				art.publish_date,
 				art.is_class,
@@ -110,6 +113,7 @@ func GetReportArticleList(condition string, pars []interface{}, startSize, pageS
 		sql = `SELECT
 				art.title,
 				art.article_id,
+				art.report_id,
 				art.category_id,
 				art.publish_date,
 				art.is_class,
@@ -1042,7 +1046,17 @@ WHERE
 // 列表
 func GetArticleRoadshowEssenceList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxResearchSummaryRep, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
-	sql := `SELECT *,
+	sql := `SELECT 
+    			article_id,
+				title,
+				department,
+				abstract,
+				publish_status,
+				publish_date,
+				last_updated_time,
+				periods,
+				have_publish,
+				visible_range,
 				(SELECT COUNT(1) FROM cygx_article_history_record AS h WHERE h.article_id=art.article_id) AS pv,
         		(SELECT COUNT(DISTINCT user_id) FROM cygx_article_history_record AS h WHERE h.article_id=art.article_id) AS uv
 				FROM cygx_article as art WHERE 1= 1 `

+ 1 - 1
models/cygx/report_selection.go

@@ -310,7 +310,7 @@ func GetReportSelectionListPeriods(condition string, pars []interface{}, startSi
 	if condition != "" {
 		sql += condition
 	}
-	sql += ` ORDER BY  rs.periods  DESC    LIMIT ?,?`
+	sql += `  ORDER BY  rs.periods  DESC    LIMIT ?,?`
 	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
 	return
 }

+ 63 - 51
models/cygx/report_selection_log.go

@@ -6,18 +6,21 @@ import (
 )
 
 type CygxReportSelectionLog struct {
-	ArticleSunId           int       `orm:"column(article_sun_id);pk"description:"子级报告id"`
-	ArticleId              int       `description:"父级报告Id"`
-	ChartPermissionId      int       `description:"行业ID"`
-	CreateTime             time.Time `description:"创建时间"`
-	Body                   string    `description:"内容"`
-	IndustrialSubjectId    string    `description:"标的ID"`
-	SubjectName            string    `description:"标的名称"`
-	IndustrialManagementId string    `description:"产业资源包Id  多个用 , 隔开"`
-	CompanyLabel           string    `description:"公司标签多个用{|}隔开"`
-	OverviewArticleId      int       `description:"关联的综述报告ID"`
-	IsNew                  int       `description:"是否为New标签"`
-	IsShowOverviewArticle  int       `description:"是否展示综述报告 1展示,0隐藏"`
+	ArticleSunId              int       `orm:"column(article_sun_id);pk"description:"子级报告id"`
+	ArticleId                 int       `description:"父级报告Id"`
+	ChartPermissionId         int       `description:"行业ID"`
+	CreateTime                time.Time `description:"创建时间"`
+	Body                      string    `description:"内容"`
+	IndustrialSubjectId       string    `description:"标的ID"`
+	SubjectName               string    `description:"标的名称"`
+	IndustrialManagementId    string    `description:"产业资源包Id  多个用 , 隔开"`
+	IndustrialManagementNames string    `description:"产业资源包名称  多个用 , 隔开"`
+	CompanyLabel              string    `description:"公司标签多个用{|}隔开"`
+	OverviewArticleId         int       `description:"关联的综述报告ID"`
+	IsNew                     int       `description:"是否为New标签"`
+	IsShowOverviewArticle     int       `description:"是否展示综述报告 1展示,0隐藏"`
+	ThirdId                   string    `description:"类似产业、标的的三方ID"`
+	ThirdName                 string    `description:"类似产业、标的的三方名称"`
 }
 
 type CygxReportSelectionLogRep struct {
@@ -31,35 +34,42 @@ type CygxReportSelectionLogRep struct {
 }
 
 type AddCygxReportSelectionLog struct {
-	ChartPermissionId        int      `description:"行业ID"`
-	IndustrialSubjectId      string   `description:"标的ID"`
-	SubjectName              string   `description:"标的名称"`
-	IndustrialSubjectName    string   `description:"标的ID"`
-	Body                     string   `description:"内容"`
-	IndustrialManagementId   string   `description:"产业资源包Id  多个用 , 隔开"`
-	IndustrialManagementName string   `description:"产业资源包Id  多个用 , 隔开"`
-	CompanyLabel             []string `description:"公司标签"`
-	Label                    string   `description:"公司标签"`
-	OverviewArticleId        int      `description:"综述报告Id"`
-	IsNew                    int      `description:"是否为New标签"`
-	IsShowOverviewArticle    int      `description:"是否展示综述报告 1展示,0隐藏"`
+	ChartPermissionId         int      `description:"行业ID"`
+	IndustrialSubjectId       string   `description:"标的ID"`
+	SubjectName               string   `description:"标的名称"`
+	IndustrialSubjectName     string   `description:"标的ID"`
+	Body                      string   `description:"内容"`
+	IndustrialManagementId    string   `description:"产业资源包Id  多个用 , 隔开"`
+	IndustrialManagementName  string   `description:"产业资源包Id  多个用 , 隔开"`
+	IndustrialManagementNames string   `description:"产业资源包Id  多个用 , 隔开"`
+	CompanyLabel              []string `description:"公司标签"`
+	Label                     string   `description:"公司标签"`
+	OverviewArticleId         int      `description:"综述报告Id"`
+	IsNew                     int      `description:"是否为New标签"`
+	IsShowOverviewArticle     int      `description:"是否展示综述报告 1展示,0隐藏"`
+	ThirdId                   string   `description:"类似产业、标的的三方ID"`
+	ThirdName                 string   `description:"类似产业、标的的三方名称"`
 }
 
 type CygxReportSelectionLogResp struct {
-	ChartPermissionId        int      `description:"行业ID"`
-	IndustrialSubjectId      string   `description:"标的ID"`
-	SubjectName              string   `description:"标的名称"`
-	IndustrialSubjectName    string   `description:"标的ID"`
-	Body                     string   `description:"内容"`
-	IndustrialManagementId   string   `description:"产业资源包Id  多个用 , 隔开"`
-	IndustrialManagementName string   `description:"产业资源包Id  多个用 , 隔开"`
-	CompanyLabel             []string `description:"公司标签"`
-	Label                    string   `description:"公司标签"`
-	OverviewArticleId        int      `description:"综述报告Id"`
-	OverviewArticleTitle     string   `description:"综述报告标题"`
-	IsNew                    int      `description:"是否为New标签"`
-	IsShowOverviewArticle    int      `description:"是否展示综述报告 1展示,0隐藏"`
-	ChartPermissionSort      int      `description:"品种排序"`
+	ChartPermissionId         int      `description:"行业ID"`
+	IndustrialSubjectId       string   `description:"标的ID"`
+	SubjectName               string   `description:"标的名称"`
+	ShowName                  string   `description:"产业与标的展示名称"`
+	IndustrialSubjectName     string   `description:"标的ID"`
+	Body                      string   `description:"内容"`
+	IndustrialManagementId    string   `description:"产业资源包Id  多个用 , 隔开"`
+	IndustrialManagementName  string   `description:"产业资源包Id  多个用 , 隔开"`
+	IndustrialManagementNames string   `description:"产业资源包Id  多个用 , 隔开"`
+	CompanyLabel              []string `description:"公司标签"`
+	Label                     string   `description:"公司标签"`
+	OverviewArticleId         int      `description:"综述报告Id"`
+	OverviewArticleTitle      string   `description:"综述报告标题"`
+	IsNew                     int      `description:"是否为New标签"`
+	IsShowOverviewArticle     int      `description:"是否展示综述报告 1展示,0隐藏"`
+	ChartPermissionSort       int      `description:"品种排序"`
+	ThirdId                   string   `description:"类似产业、标的的三方ID"`
+	ThirdName                 string   `description:"类似产业、标的的三方名称"`
 }
 
 type CygxReportSelectionChart struct {
@@ -92,18 +102,21 @@ func GetCygxReportSelectionSjdpList(articleId int, typeStr string) (items []*Cyg
 }
 
 type CygxReportSelectionLoglist struct {
-	ArticleSunId           int       `description:"子级报告id"`
-	ArticleId              int       `description:"父级报告Id"`
-	ChartPermissionId      int       `description:"行业ID"`
-	PermissionName         string    `description:"行业ID"`
-	CreateTime             time.Time `description:"创建时间"`
-	Body                   string    `description:"内容"`
-	IndustrialSubjectId    string    `description:"标的ID"`
-	IndustrialManagementId string    `description:"产业资源包Id  多个用 , 隔开"`
-	SubjectName            string    `description:"标的名称"`
-	IcoLink                string    `orm:"column(image_url)"description:"图标链接"`
-	OverviewArticleId      int       `description:"关联的综述报告ID"`
-	IsNew                  int       `description:"是否为New标签"`
+	ArticleSunId              int       `description:"子级报告id"`
+	ArticleId                 int       `description:"父级报告Id"`
+	ChartPermissionId         int       `description:"行业ID"`
+	PermissionName            string    `description:"行业ID"`
+	CreateTime                time.Time `description:"创建时间"`
+	Body                      string    `description:"内容"`
+	IndustrialSubjectId       string    `description:"标的ID"`
+	IndustrialManagementId    string    `description:"产业资源包Id  多个用 , 隔开"`
+	IndustrialManagementNames string    `description:"产业资源包名称  多个用 , 隔开"`
+	SubjectName               string    `description:"标的名称"`
+	ThirdId                   int       `description:"类似产业、标的的三方ID"`
+	ThirdName                 string    `description:"类似产业、标的的三方名称"`
+	IcoLink                   string    `orm:"column(image_url)"description:"图标链接"`
+	OverviewArticleId         int       `description:"关联的综述报告ID"`
+	IsNew                     int       `description:"是否为New标签"`
 }
 
 // 列表
@@ -112,7 +125,6 @@ func GetReportSelectionlogListAll(articleId int) (items []*CygxReportSelectionLo
 	sql := `SELECT  l.* 
 			FROM
 			cygx_report_selection_log AS l
-			INNER JOIN cygx_industrial_subject AS s ON s.industrial_subject_id = l.industrial_subject_id 
 			WHERE l.article_id = ? `
 	_, err = o.Raw(sql, articleId).QueryRows(&items)
 	return

+ 12 - 10
models/cygx/report_selection_subject_history.go

@@ -6,16 +6,18 @@ import (
 )
 
 type CygxReportSelectionSubjectHistory struct {
-	Id                  int       `orm:"column(id);pk"`
-	ArticleId           int       `description:"文章ID"`
-	UserId              int       `description:"用户ID"`
-	CreateTime          time.Time `description:"创建时间"`
-	ModifyTime          time.Time `description:"修改时间"`
-	Mobile              string    `description:"手机号"`
-	Email               string    `description:"邮箱"`
-	CompanyId           int       `description:"公司id"`
-	CompanyName         string    `description:"公司名称"`
-	IndustrialSubjectId string    `description:"标的ID"`
+	Id                     int       `orm:"column(id);pk"`
+	ArticleId              int       `description:"文章ID"`
+	UserId                 int       `description:"用户ID"`
+	CreateTime             time.Time `description:"创建时间"`
+	ModifyTime             time.Time `description:"修改时间"`
+	Mobile                 string    `description:"手机号"`
+	Email                  string    `description:"邮箱"`
+	CompanyId              int       `description:"公司id"`
+	CompanyName            string    `description:"公司名称"`
+	IndustrialSubjectId    string    `description:"标的ID"`
+	IndustrialManagementId int       `description:"产业ID"`
+	ThirdId                int       `description:"类似产业、标的的三方ID"`
 }
 
 // 列表

+ 33 - 0
models/cygx/report_selection_third_name.go

@@ -0,0 +1,33 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+//重点公司三方名称 类似产业、标的的三方名称
+
+type CygxReportSelectionThirdName struct {
+	ThirdId             int       `orm:"column(third_id);pk"description:"类似产业、标的的三方ID"`
+	ThirdName           string    `description:"类似产业、标的的三方名称"`
+	ChartPermissionId   int       `description:"行业ID"`
+	ChartPermissionName string    `description:"行业名称"`
+	CreateTime          time.Time `description:"创建时间"`
+}
+
+type AddReportSelectionThirdNameReq struct {
+	ThirdName         string `description:"类似产业、标的的三方名称"`
+	ChartPermissionId int    `description:"行业ID"`
+}
+
+type AddReportSelectionThirdNameResp struct {
+	ThirdName string `description:"类似产业、标的的三方名称"`
+	ThirdId   string `description:"类似产业、标的的三方ID"`
+}
+
+// 添加
+func AddCygxReportSelectionThirdName(item *CygxReportSelectionThirdName) (lastId int64, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	lastId, err = o.Insert(item)
+	return
+}

+ 11 - 1
models/cygx/user_feedback.go

@@ -68,7 +68,7 @@ type CygxCygxUserFeedbackResp struct {
 	List []*CygxUserFeedbackResp
 }
 
-func GetCygxUserFeedbackList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxOrderResp, err error) {
+func GetCygxUserFeedbackList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxUserFeedback, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
 	sql := `SELECT *
 			FROM
@@ -79,6 +79,16 @@ func GetCygxUserFeedbackList(condition string, pars []interface{}, startSize, pa
 	return
 }
 
+func GetCygxUserFeedbackListInit() (items []*CygxUserFeedback, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT *
+			FROM
+			cygx_user_feedback
+			WHERE 1 = 1 `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
 // 获取数量
 func GetCygxUserFeedbackCount(condition string, pars []interface{}) (count int, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")

+ 6 - 0
models/db.go

@@ -268,6 +268,8 @@ func initCompany() {
 		new(company.CompanyContractNoRenewedAscribeLog),      // 合同确认不续约记录日志
 		new(company.CrmConfig),                               // 管理后台基本配置表
 		new(company.CompanyRenewalRecord),                    // 客户续约状态记录表
+		new(company.CompanyHistoryRemark),                    // 客户记录历史记录表
+		new(company.WxUserMoveLog),                           // 客户联系人移动记录日志表
 	)
 }
 
@@ -385,6 +387,7 @@ func initRoadShow() {
 		new(roadshow.RsReportRecord),              //路演统计表
 		new(roadshow.RsCalendarMeetingUser),       //路演参会名单表
 		new(roadshow.RsCalendarMeetingLabelGroup), //路演参会名单关联的标签表
+		new(roadshow.RsCalendarApiLog),            //上海路演三方接口请求记录日志表
 	)
 }
 
@@ -402,6 +405,7 @@ func initCygx() {
 		new(cygx.CygxActivityRestrictSignup),
 		new(cygx.CygxActivityAttendanceDetail),
 		new(cygx.CygxActivityOfflineMeetingDetail),
+		new(cygx.CygxActivityUserTemplateRecord),
 		new(cygx.CygxSummaryFastsearchKeywords),
 		new(cygx.CygxMySchedule),
 		new(cygx.CygxIndustrialArticleGroupManagement),
@@ -483,6 +487,8 @@ func initCygx() {
 		new(cygx.CygxOrder),
 		new(cygx.CygxOrderAction),
 		new(cygx.CygxUserFeedback),
+		new(cygx.CygxReportSelectionThirdName),
+		new(cygx.CygxGushouTimeLine),
 	)
 }
 

+ 9 - 0
models/response/statistic_report.go

@@ -143,3 +143,12 @@ type IncrementalCompanyPercentageListResp struct {
 	ExpireRenewalContractTotal int    `description:"到期合同数量"`
 	ExpireRenewalContractMoney int    `description:"到期合同总金额"`
 }
+
+// 权益客户统计,续约率,返回类
+type IncrementalCompanyPercentageExportResp struct {
+	NoRenewalContractTotal      int    `description:"确认不续约合同数"`
+	NoRenewalContractMoney      int    `description:"确认不续约合同金额"`
+	ExpireRenewalContractTotal  int    `description:"到期合同数量"`
+	ExpireRenewalContractMoney  int    `description:"到期合同总金额"`
+	NoRenewalContractPercentage string `description:"确认不续约率"`
+}

+ 20 - 1
models/roadshow/calendar.go

@@ -64,6 +64,8 @@ type RsCalendar struct {
 	IsSynced         int    `description:"是否与上海同步 0:未同步 1:已同步"`
 	UnionCode        string `description:"公开会议联合编码"`
 	EnglishCompany   int    `description:"是否为英文客户: 0-否; 1-是"`
+	SellerId         int    `description:"销售id"`
+	ShareSellerId    int    `description:"共享销售员id"`
 }
 
 type RsCalendarResearcher struct {
@@ -298,6 +300,7 @@ type CalendarListView struct {
 	EnglishViewTotal       int    `description:"英文客户-累计点击量"`
 	SubmitButton           bool   `description:"提交按钮是否展示"`
 	ViewButton             bool   `description:"查看按钮是否展示"`
+	EditButton             bool   `description:"修改按钮是否展示"`
 }
 
 type CalendarListResp struct {
@@ -369,7 +372,8 @@ func GetCalendarList(condition string, pars []interface{}, startSize, pageSize,
 		if calendarType == 1 {
 			sql += ` ORDER BY b.create_time ASC LIMIT ?,? `
 		} else {
-			sql += ` ORDER BY b.create_time DESC LIMIT ?,? `
+			//sql += ` ORDER BY b.create_time DESC LIMIT ?,? `
+			sql += ` ORDER BY b.start_date DESC , b.start_time DESC  LIMIT ?,? ` // 已处理申请,按照活动开始时间倒序(包括ficc的)
 		}
 		_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&list)
 	}
@@ -999,3 +1003,18 @@ func GetOverseaCustomCalendarList2(sellerId, researcherId, startDate, endDate, c
 
 	return
 }
+
+func GetRsCalendarResearcherListInit16_2() (item []*RsCalendar, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM  rs_calendar WHERE activity_type = '路演' AND company_id > 0  	AND sys_user_id IN (SELECT  admin_id  FROM admin WHERE role_type_code  IN  ('rai_seller','rai_group','rai_admin') )    AND seller_id = 0 `
+	_, err = o.Raw(sql).QueryRows(&item)
+	return
+}
+
+// 修改可见范围
+func UpdateRsCalendarSeller(seller_id, share_seller_id, rs_calendar_id int) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE rs_calendar SET seller_id=?, share_seller_id= ?   WHERE rs_calendar_id =?  `
+	_, err = o.Raw(sql, seller_id, share_seller_id, rs_calendar_id).Exec()
+	return
+}

+ 33 - 6
models/roadshow/company.go

@@ -2,6 +2,7 @@ package roadshow
 
 import (
 	"github.com/beego/beego/v2/client/orm"
+	"hongze/hz_crm_api/utils"
 )
 
 type CompanySearchView struct {
@@ -25,13 +26,15 @@ func CompanySearch(sellerId int, keyWord string) (list []*CompanySearchView, err
 	return
 }
 
-func CompanySearchV2(sellerId, groupId int, keyWord string) (list []*CompanySearchView, err error) {
+func CompanySearchV2(sellerId, groupId int, keyWord, roleTypeCode string) (list []*CompanySearchView, err error) {
 	list = make([]*CompanySearchView, 0)
 
 	// 中文客户
 	companies := make([]*CompanySearchView, 0)
 	o := orm.NewOrm()
-	sql := `SELECT
+	var sql string
+	if roleTypeCode == utils.ROLE_TYPE_CODE_ADMIN || roleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN { // 权益管理员跟管理员的筛选
+		sql = `SELECT
 				b.company_id,
 				a.company_name,
 				0 AS english_company
@@ -39,13 +42,37 @@ func CompanySearchV2(sellerId, groupId int, keyWord string) (list []*CompanySear
 				company AS a
 			INNER JOIN company_product AS b ON a.company_id = b.company_id 
 			WHERE
-				b.status IN ('正式', '试用', '永续') AND (b.seller_id = ? OR b.share_seller_id = ?  OR b.group_id = ? OR b.share_group_id = ?  ) AND a.company_name LIKE ?
+			     1=1 
+			     AND IF  ( b.product_id = 1 , b.status IN ('正式', '试用', '永续') ,1=1 )  
+			     AND IF  ( b.product_id = 2 , b.status IN ('正式', '试用', '永续', '冻结', '流失') ,1=1 )  
+				 AND a.company_name LIKE ?
 			GROUP BY
 				b.company_id `
-	_, err = o.Raw(sql, sellerId, sellerId, groupId, groupId, keyWord).QueryRows(&companies)
-	if err != nil {
-		return
+		_, err = o.Raw(sql, keyWord).QueryRows(&companies)
+		if err != nil {
+			return
+		}
+	} else {
+		sql = `SELECT
+				b.company_id,
+				a.company_name,
+				0 AS english_company
+			FROM
+				company AS a
+			INNER JOIN company_product AS b ON a.company_id = b.company_id 
+			WHERE
+			     1=1 
+			     AND IF  ( b.product_id = 1 , b.status IN ('正式', '试用', '永续') ,1=1 )  
+			     AND IF  ( b.product_id = 2 , b.status IN ('正式', '试用', '永续', '冻结', '流失') ,1=1 )  
+				 AND (b.seller_id = ? OR b.share_seller_id = ?  OR b.group_id = ? OR b.share_group_id = ?  ) AND a.company_name LIKE ?
+			GROUP BY
+				b.company_id `
+		_, err = o.Raw(sql, sellerId, sellerId, groupId, groupId, keyWord).QueryRows(&companies)
+		if err != nil {
+			return
+		}
 	}
+
 	list = append(list, companies...)
 
 	// 英文客户

+ 35 - 0
models/roadshow/rs_calendar_api_log.go

@@ -0,0 +1,35 @@
+package roadshow
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type RsCalendarApiLog struct {
+	Id                     int       `orm:"column(id);pk"`
+	Url                    string    `description:"链接"`
+	Body                   string    `description:"请求参数"`
+	Result                 string    `description:"返回参数"`
+	CreateTime             time.Time `description:"创建时间"`
+	Remark                 string    `description:"备注说明"`
+	RsCalendarResearcherId int       `description:"表rs_calendar_researcher 主键ID"`
+	RsCalendarId           int       `description:"日历活动id"`
+}
+
+// 添加日志记录
+func AddRsCalendarApiLog(item *RsCalendarApiLog) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.Insert(item)
+	return
+}
+
+// 批量添加
+func AddRsCalendarApiLogList(items []*RsCalendarApiLog) (lastId int64, err error) {
+	lenitems := len(items)
+	if lenitems == 0 {
+		return
+	}
+	o := orm.NewOrm()
+	_, err = o.InsertMulti(lenitems, items)
+	return
+}

+ 7 - 7
models/roadshow/rs_calendar_meeting_label_group.go

@@ -26,9 +26,6 @@ func AddRsCalendarMeetingLabelGroup(item *RsCalendarMeetingLabelGroup) (err erro
 
 // AddRsCalendarMeetingLabelGroupMulti 批量添加
 func AddRsCalendarMeetingLabelGroupMulti(items []*RsCalendarMeetingLabelGroup, rsCalendarId int) (err error) {
-	if len(items) == 0 {
-		return
-	}
 	o, err := orm.NewOrm().Begin()
 	if err != nil {
 		return
@@ -48,11 +45,14 @@ func AddRsCalendarMeetingLabelGroupMulti(items []*RsCalendarMeetingLabelGroup, r
 		return
 	}
 
-	//批量插入
-	_, err = o.InsertMulti(len(items), items)
-	if err != nil {
-		return
+	if len(items) > 0 {
+		_, err = o.InsertMulti(len(items), items)
+		if err != nil {
+			return
+		}
 	}
+	//批量插入
+
 	return
 }
 

+ 46 - 11
models/roadshow/rs_calendar_meeting_user.go

@@ -9,9 +9,10 @@ import (
 )
 
 type AddRsCalendarMeetingUserReq struct {
-	RsCalendarId int   `description:"日程ID"`
-	UserId       []int // 用户ID
-	TagList      []*AddRsCalendarMeetingUserTagReq
+	RsCalendarId  int   `description:"日程ID"`
+	UserId        []int // 用户ID
+	TagList       []*AddRsCalendarMeetingUserTagReq
+	RoadShowTheme string `description:"路演主题"`
 }
 
 type AddRsCalendarMeetingUserTagReq struct {
@@ -31,6 +32,7 @@ type RsCalendarMeetingUser struct {
 	Position                string    `description:"职位"`
 	AdminId                 int       `description:"管理员ID"`
 	AdminName               string    `description:"管理员姓名"`
+	RoadShowTheme           string    `description:"路演主题"`
 	CreateTime              time.Time `description:"创建时间"`
 	ModifyTime              time.Time `description:"修改时间"`
 }
@@ -39,6 +41,7 @@ type RsCalendarMeetingUserResp struct {
 	RsCalendarMeetingUserId int    `description:"参会名单主键ID"`
 	RealName                string `description:"用户实际名称"`
 	Position                string `description:"职位"`
+	RoadShowTheme           string `description:"路演主题"`
 }
 
 type DeleteRsCalendarMeetingUserReq struct {
@@ -46,17 +49,46 @@ type DeleteRsCalendarMeetingUserReq struct {
 }
 
 type RsCalendarMeetingUserListResp struct {
-	List      []*RsCalendarMeetingUserResp
-	ListLebel []*cygx.RaiServeTagResp
+	List          []*RsCalendarMeetingUserResp
+	ListLebel     []*cygx.RaiServeTagResp
+	RoadShowTheme string `description:"路演主题"`
 }
 
 // MultiAddRsCalendarMeetingUser 批量添加RsCalendarMeetingUser
-func MultiAddRsCalendarMeetingUser(items []*RsCalendarMeetingUser) (err error) {
-	if len(items) == 0 {
+func MultiAddRsCalendarMeetingUser(items []*RsCalendarMeetingUser, roadShowTheme string, rsCalendarId int) (err error) {
+	to, err := orm.NewOrm().Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	sql := ` UPDATE rs_calendar_meeting_user SET road_show_theme=? WHERE rs_calendar_id=? `
+	_, err = to.Raw(sql, roadShowTheme, rsCalendarId).Exec()
+	if err != nil {
 		return
 	}
+
+	if len(items) > 0 {
+		_, err = to.InsertMulti(len(items), items)
+		if err != nil {
+			return
+		}
+	}
+
+	return
+}
+
+// 获取第一个提交参会信息内容
+func GetRsCalendarMeetingUserFirst(rsCalendarId int) (item *RsCalendarResearcher, err error) {
 	o := orm.NewOrm()
-	_, err = o.InsertMulti(len(items), items)
+	sql := `SELECT * FROM rs_calendar_meeting_user WHERE rs_calendar_id=? LIMIT 1   `
+	err = o.Raw(sql, rsCalendarId).QueryRow(&item)
 	return
 }
 
@@ -154,6 +186,7 @@ type RsCalendarMeetingUserByRai struct {
 	RoadshowType            string `description:"路演形式"`
 	ResearcherName          string `description:"研究员姓名"`
 	TagType                 int    `description:"标签类型,1产业,2标的,3行业权限"`
+	RoadShowTheme           string `description:"路演主题"`
 }
 
 // 权益联系人列表获取相关信息
@@ -165,6 +198,7 @@ func GetRsCalendarMeetingUserByRai(condition string, startSize, pageSize int) (t
 			r.company_name,
 			r.real_name,
 			r.mobile,
+			r.road_show_theme,
 			b.start_date,
 			b.end_date,
 			b.start_time,
@@ -180,7 +214,7 @@ func GetRsCalendarMeetingUserByRai(condition string, startSize, pageSize int) (t
 			INNER JOIN rs_calendar_researcher AS b ON a.rs_calendar_id = b.rs_calendar_id 
 			LEFT JOIN rs_calendar_meeting_label_group AS g ON g.rs_calendar_id = b.rs_calendar_id 
 		WHERE
-			1 = 1 ` + condition + ` GROUP  BY a.rs_calendar_id  `
+			1 = 1 ` + condition + ` GROUP  BY 	r.rs_calendar_meeting_user_id   `
 
 	totalSql := `SELECT COUNT(1) total FROM (` + sql + `) z `
 	err = o.Raw(totalSql).QueryRow(&total)
@@ -188,7 +222,7 @@ func GetRsCalendarMeetingUserByRai(condition string, startSize, pageSize int) (t
 		return
 	}
 
-	sql += ` ORDER BY  start_date  DESC `
+	sql += ` ORDER BY  b.start_date   DESC ,b.start_time   DESC , a.rs_calendar_id DESC  `
 	if startSize > 0 || pageSize > 0 {
 		sql += ` LIMIT ` + strconv.Itoa(startSize) + "," + strconv.Itoa(pageSize)
 	}
@@ -204,6 +238,7 @@ func GetRsCalendarMeetingUserByRaiWeekly(condition string, startSize, pageSize i
 			r.company_name,
 			r.real_name,
 			r.mobile,
+			r.road_show_theme,
 			b.start_date,
 			b.end_date,
 			b.start_time,
@@ -226,7 +261,7 @@ func GetRsCalendarMeetingUserByRaiWeekly(condition string, startSize, pageSize i
 		return
 	}
 
-	sql += ` ORDER BY  start_date  DESC `
+	sql += `ORDER BY  b.start_date   DESC ,b.start_time   DESC , a.rs_calendar_id DESC   `
 	if startSize > 0 || pageSize > 0 {
 		sql += ` LIMIT ` + strconv.Itoa(startSize) + "," + strconv.Itoa(pageSize)
 	}

+ 31 - 29
models/seal/request/seal_approval.go

@@ -2,56 +2,58 @@ package request
 
 // 用印审批申请请求
 type SealApprovalApplyReq struct {
-	ContractId     int      `description:"系统合同id"`
-	Use            string   `description:"用印用途,枚举值:'销售合同','渠道合同','付款通知函','招投标','战略合作协议','代付合同','总对总协议';默认:销售合同"`
-	CompanyName    string   `description:"客户名称,甲方名称,长度32位"`
-	UseCompanyName string   `description:"实际适用方客户名称,长度32位"`
-	CreditCode     string   `description:"社会统一信用代码,长度64位"`
-	ServiceType    string   `description:"业务类型,枚举值:'新签合同','续约合同','补充协议';默认:新签合同"`
-	SealType       string   `description:"加盖印章类型,多选,逗号拼接,值:'合同章','公章','法人章'"`
-	Remark         string   `description:"备注,长度255位"`
-	FileUrls       []string `description:"多个文件附件地址"`
-	FileNum        int      `description:"文件份数"`
+	ContractId        int      `description:"系统合同id"`
+	Use               string   `description:"用印用途,枚举值:'销售合同','渠道合同','付款通知函','招投标','战略合作协议','代付合同','总对总协议';默认:销售合同"`
+	CompanyName       string   `description:"客户名称,甲方名称,长度32位"`
+	UseCompanyName    string   `description:"实际适用方客户名称,长度32位"`
+	CreditCode        string   `description:"社会统一信用代码,长度64位"`
+	ServiceType       string   `description:"业务类型,枚举值:'新签合同','续约合同','补充协议';默认:新签合同"`
+	SealType          string   `description:"加盖印章类型,多选,逗号拼接,值:'合同章','公章','法人章'"`
+	Remark            string   `description:"备注,长度255位"`
+	FileUrls          []string `description:"多个文件附件地址"`
+	FileNum           int      `description:"文件份数"`
+	AffiliatedCompany string   `description:"归属公司"`
 }
 
 // 用印审批编辑请求
 type SealApprovalEditReq struct {
-	SealId         int      `description:"用印id"`
-	ContractId     int      `description:"系统合同id"`
-	Use            string   `description:"用印用途,枚举值:'销售合同', '渠道合同', '付款通知函', '招投标', '战略合作协议';默认:销售合同"`
-	CompanyName    string   `description:"客户名称,甲方名称,长度32位"`
-	UseCompanyName string   `description:"实际适用方客户名称,长度32位"`
-	CreditCode     string   `description:"社会统一信用代码,长度64位"`
-	ServiceType    string   `description:"业务类型,枚举值:'新签合同','续约合同','补充协议';默认:新签合同"`
-	SealType       string   `description:"加盖印章类型,多选,逗号拼接,值:'合同章','公章','法人章'"`
-	Remark         string   `description:"备注,长度255位"`
-	FileUrls       []string `description:"多个文件附件地址"`
-	FileNum        int      `description:"文件份数"`
+	SealId            int      `description:"用印id"`
+	ContractId        int      `description:"系统合同id"`
+	Use               string   `description:"用印用途,枚举值:'销售合同', '渠道合同', '付款通知函', '招投标', '战略合作协议';默认:销售合同"`
+	CompanyName       string   `description:"客户名称,甲方名称,长度32位"`
+	UseCompanyName    string   `description:"实际适用方客户名称,长度32位"`
+	CreditCode        string   `description:"社会统一信用代码,长度64位"`
+	ServiceType       string   `description:"业务类型,枚举值:'新签合同','续约合同','补充协议';默认:新签合同"`
+	SealType          string   `description:"加盖印章类型,多选,逗号拼接,值:'合同章','公章','法人章'"`
+	Remark            string   `description:"备注,长度255位"`
+	FileUrls          []string `description:"多个文件附件地址"`
+	FileNum           int      `description:"文件份数"`
+	AffiliatedCompany string   `description:"归属公司"`
 }
 
 // 用印审批撤回请求
 type SealApprovalCancelReq struct {
-	SealId		int		`description:"用印ID"`
+	SealId int `description:"用印ID"`
 }
 
 // 用印审批删除请求
 type SealApprovalDelReq struct {
-	SealId		int		`description:"用印ID"`
+	SealId int `description:"用印ID"`
 }
 
 // 用印审批作废请求
 type SealApprovalInvalidReq struct {
-	SealId		int		`description:"用印ID"`
+	SealId int `description:"用印ID"`
 }
 
 // 用印审批通过请求
 type SealApplyApprovedReq struct {
-	SealId	int		`description:"用印id"`
-	Remark	string 	`description:"备注字段"`
+	SealId int    `description:"用印id"`
+	Remark string `description:"备注字段"`
 }
 
 // 用印审批驳回请求
 type SealApplyRejectReq struct {
-	SealId	int		`description:"用印id"`
-	Remark	string 	`description:"驳回理由"`
-}
+	SealId int    `description:"用印id"`
+	Remark string `description:"驳回理由"`
+}

+ 65 - 1
models/seal/seal.go

@@ -33,6 +33,7 @@ type Seal struct {
 	ModifyTime        time.Time `description:"最近一次修改时间"`
 	CreateTime        time.Time `description:"添加时间"`
 	CheckBackFileTime time.Time `description:"签回用印附件时间"`
+	AffiliatedCompany string    `description:"归属公司"`
 }
 
 var EnumUse = []string{"销售合同", "渠道合同", "付款通知函", "招投标", "战略合作协议", "代付合同", "总对总协议"}
@@ -193,13 +194,14 @@ type SealApprovalItem struct {
 	InvalidTimeStr       string    `description:"作废时间(字符串)"`
 	CheckBackFileTimeStr string    `description:"签回用印附件时间(字符串)"`
 	ContractCode         string    `description:"合同编码"`
+	AffiliatedCompany    string    `description:"归属公司"`
 }
 
 // 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.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 `
 	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 
@@ -217,3 +219,65 @@ WHERE c.is_delete = 0 AND a.approval_type="seal" `
 
 	return
 }
+
+type SealApprovaExportlItem struct {
+	ContractApprovalId       int `description:"审批单ID"`
+	ContractId               int `description:"合同ID"`
+	ContractApprovalRecordId int `description:"审批流ID"`
+	//ContractCode             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:"归属公司"`
+	FirstLevelApprovers  string    `description:"一级审批人"`
+	SecondLevelApprovers string    `description:"二级审批人"`
+	ThirdLevelApprovers  string    `description:"三级审批人"`
+	FirstLevelCC         string    `description:"一级抄送人"`
+	SecondLevelCC        string    `description:"二级抄送人"`
+	ThirdLevelCC         string    `description:"三级抄送人"`
+}
+
+// GetSealApprovalList 获取用印审批列表
+func GetSealApprovalList(condition, joinCondition string, pars []interface{}) (list []*SealApprovaExportlItem, 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.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`
+	_, err = o.Raw(sql, pars).QueryRows(&list)
+
+	return
+}

+ 4 - 0
models/stack_company_statistic.go

@@ -90,6 +90,7 @@ type StackCompanyStatisticList struct {
 	ContractNum         int       `description:"第几份合同,默认是:1"`
 	SellerId            int       `description:"所属销售id"`
 	SellerName          string    `description:"所属销售名称"`
+	ShareSeller         string    `description:"共享销售员"`
 	GroupId             int       `description:"所属销售分组id"`
 	DepartmentId        int       `description:"所属销售部门id"`
 	Date                string    `description:"记录日期"`
@@ -106,6 +107,9 @@ type StackCompanyStatisticList struct {
 	AscribeContent      string    `description:"归因标签说明"`
 	IsShowNoRenewedNote bool      `description:"是否展示未续约备注按钮"`
 	Content             string    `description:"归因内容说明"`
+	PermissionName      string    `description:"权限名"`
+	Money               float64   `description:"合同金额"`
+	IsUserMaker         int       `description:"近四周之内是否包含决策人互动过 ,0否,1是"`
 }
 
 func GetStackCompanyList(condition, orderBy string, pars []interface{}, startSize, pageSize int) (items []*StackCompanyStatisticList, err error) {

+ 50 - 5
models/statistic_report.go

@@ -377,6 +377,7 @@ type IncrementalList struct {
 	CompanyName          string                             `description:"企业客户名称"`
 	ProductId            int                                `description:"产品id"`
 	ProductName          string                             `description:"产品名称"`
+	ProductStatus        string                             `description:"产品名称"`
 	CompanyProductId     int                                `description:"客户购买产品授权id"`
 	ContractCode         string                             `description:"合同编码"`
 	StartDate            string                             `description:"合同开始日期"`
@@ -391,6 +392,9 @@ type IncrementalList struct {
 	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:"合同数"`
@@ -405,6 +409,11 @@ type IncrementalList struct {
 	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"`
+	ShareSellerInit string `description:"共享销售员"`
 }
 
 // GetIncrementalNewCompanyCount 获取增量客户报表列表统计数据(根据合同来展示)
@@ -793,7 +802,36 @@ 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, 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 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
+}
+
+// GetIncrementalCompanyListByOperationRecordLast 获取试用客户报表列表数据(根据新增客户时间来展示)
+func GetIncrementalCompanyListByOperationRecordLast(condition string, pars []interface{}, startSize, pageSize int) (items []*IncrementalList, 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,a.create_time,b.region_type,c.renewal_reason,c.status 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 `
+
+	//查询出最大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.company_id, a.product_id `
+
+	//查询真正的数据
+	sql := `SELECT a.id, a.company_id, b.company_name, c.seller_id_last AS seller_id, c.seller_name_last  AS seller_name_init, c.share_seller_last  AS share_seller, 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
 		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
@@ -842,6 +880,14 @@ func GetMoreRenewalReason(CompanyId, ProductId string) (items []*company.Company
 	return
 }
 
+// GetMoreRenewalReason 获取更多未续约说明列表15.9.1
+func GetMoreRenewalReasoninit() (items []*company.CompanyRenewalReason, err error) {
+	o := orm.NewOrm()
+	sql := "SELECT * FROM company_renewal_reason WHERE  product_id=2 ORDER BY create_time DESC"
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
 // GetLastContractMoney 获取上一份权益合同的金额
 func GetLastContractMoney(CompanyIds string) (items []*IncrementalList, err error) {
 	o := orm.NewOrm()
@@ -854,7 +900,7 @@ func GetLastContractMoney(CompanyIds string) (items []*IncrementalList, err erro
 func GetIncrementalCompanyMergeList(condition string, pars []interface{}, startSize, pageSize int) (items []*IncrementalList, err error) {
 	o := orm.NewOrm()
 
-	sql := `SELECT a.*,b.region_type,c.seller_id,c.seller_name,b.company_name,c.renewal_reason FROM company_contract a
+	sql := `SELECT a.*,b.region_type,c.seller_id,a.seller_name_init as seller_name ,a.share_seller_init as share_seller ,b.company_name,c.renewal_reason 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 `
 
@@ -870,7 +916,7 @@ func GetIncrementalCompanyMergeList(condition string, pars []interface{}, startS
 func GetIncrementalCompanyMergeListEnd(condition string, pars []interface{}, startSize, pageSize int) (items []*IncrementalList, err error) {
 	o := orm.NewOrm()
 
-	sql := `SELECT a.*,b.region_type,c.seller_id,c.seller_name,b.company_name,c.renewal_reason FROM company_contract a
+	sql := `SELECT a.*,b.region_type,c.seller_id,c.seller_name,b.company_name,c.renewal_reason,c.status AS product_status 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 `
 
@@ -887,7 +933,7 @@ func GetIncrementalCompanyListByOperationRecordMerge(condition string, pars []in
 	o := orm.NewOrm()
 
 	//查询真正的数据
-	sql := `SELECT a.company_contract_id,a.contract_type ,a.company_product_id ,a.contract_code ,a.pay_method ,a.pay_channel ,a.package_difference ,a.company_id, a.start_date, a.end_date, a.money, b.company_name, c.seller_id, c.seller_name, a.product_id, a.product_name, a.create_time, b.region_type, c.renewal_reason, c.renewal_todo, c.status FROM company_contract a
+	sql := `SELECT a.company_contract_id,a.contract_type ,a.company_product_id ,a.contract_code ,a.pay_method ,a.pay_channel ,a.package_difference ,a.company_id, a.start_date, a.end_date, a.money, b.company_name, a.seller_id_last as seller_id, a.seller_name_last as  seller_name, a.share_seller_last as  share_seller, a.product_id, a.product_name, a.create_time, b.region_type, c.renewal_reason, c.renewal_todo, c.status  FROM company_contract 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  `
@@ -902,7 +948,6 @@ func GetIncrementalCompanyListByOperationRecordMerge(condition string, pars []in
 	return
 }
 
-// GetIncrementalCompanyListByOperationRecordMerge 未续约合同
 func GetIncrementalCompanyListByOperationRecordMerge879() (items []*IncrementalList, err error) {
 	o := orm.NewOrm()
 	//查询真正的数据

+ 11 - 4
models/system/sys_admin.go

@@ -470,11 +470,18 @@ func GetSysuserRaiList() (items []*AdminItem, err error) {
 		FROM
 			admin 
 		WHERE
-			role_type_code LIKE '%rai%' 
-			AND group_id NOT IN ( 19, 10, 17 ) 
+			role_type_code IN ('rai_group','rai_seller')
+			AND group_id NOT IN ( 19, 10, 17 )
 			AND enabled = 1 
-			OR real_name IN ( '沈涛', '张传星' )  
-			OR mobile IN ( '15011263967', '18935318900' , '15600639653', '18010097689', '13520990566') ` // 先写死,看情况要不要改
+			OR real_name IN ( '沈涛', '张传星' ) ` // 先写死,看情况要不要改
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+// GetSysuserRaiList 获取除服务组之外的所有权益销售
+func GetSysuserRaiListNoServer() (items []*AdminItem, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT  * FROM admin WHERE role_type_code  IN ('rai_group','rai_seller')   AND role_name NOT IN ('权益服务销售','权益服务组长')  `
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }

+ 7 - 0
models/system/sys_group.go

@@ -238,3 +238,10 @@ type RoadshowGroupSellers struct {
 	AdminId   int    `description:"销售ID"`
 	AdminName string `description:"销售名称"`
 }
+
+func GetAllSysGroupByGroupId(groupId int) (items []*SysGroup, err error) {
+	sql := `SELECT * FROM sys_group WHERE parent_id=? OR parent_id = ? ORDER BY sort ASC, create_time ASC`
+	o := orm.NewOrm()
+	_, err = o.Raw(sql, groupId, groupId).QueryRows(&items)
+	return
+}

+ 15 - 0
models/wx_user.go

@@ -636,3 +636,18 @@ func GetWxUserItemByUserId(userId int) (item *WxUserItem, err error) {
 	err = o.Raw(sql, userId).QueryRow(&item)
 	return
 }
+
+// 修改用户外呼号请求
+type EditUserOutboundMobileReq struct {
+	UserId              int    `description:"用户id"`
+	OutboundMobile      string `description:"外呼手机号"`
+	OutboundCountryCode string `description:"外呼手机号区号"`
+}
+
+// 修改用户外呼手机号
+func UpdateUserOutboundMobile(outboundMobile, outboundCountryCode string, userId int) (err error) {
+	o := orm.NewOrm()
+	sql := ` UPDATE wx_user SET outbound_mobile=? , outbound_country_code = ? WHERE user_id=? `
+	_, err = o.Raw(sql, outboundMobile, outboundCountryCode, userId).Exec()
+	return
+}

+ 6 - 6
models/yb/apply_record.go

@@ -170,10 +170,10 @@ FROM
 	LEFT JOIN (SELECT * from yb_apply_record where apply_record_id in (SELECT max(apply_record_id) from yb_apply_record GROUP BY user_id)) as y on a.user_id = y.user_id
 WHERE
 	b.enabled = 1 
-	AND ( y.apply_record_id > 0 or a.company_id=1 or bp.company_product_id is null)
+	AND ( y.apply_record_id > 0 or a.company_id=1 )
 	AND ( a.mobile IS NOT NULL || a.email IS NOT NULL ) 
 	AND ( a.mobile <> '' OR a.email <> '' ) 
-	AND ( c.create_platform in (1,3,6,9) OR c.create_platform IS NULL )
+	AND ( c.create_platform in (1,3,6,9) OR (c.create_platform IS NULL and a.register_platform!=7) )
     AND ((y.apply_record_id > 0 and y.create_time > ?) OR (y.apply_record_id is null AND a.created_time > ?) )
 	AND ( y.source > 0 OR y.source IS NULL)
 `
@@ -201,10 +201,10 @@ FROM
 	LEFT JOIN (SELECT * from yb_apply_record where apply_record_id in (SELECT max(apply_record_id) from yb_apply_record GROUP BY user_id)) as y on a.user_id = y.user_id
 WHERE
 	b.enabled = 1
-	AND ( y.apply_record_id > 0 or a.company_id=1 or bp.company_product_id is null)
+	AND ( y.apply_record_id > 0 or a.company_id=1)
 	AND ( a.mobile IS NOT NULL || a.email IS NOT NULL ) 
 	AND ( a.mobile <> '' OR a.email <> '' ) 
-	AND ( c.create_platform <> 4 OR c.create_platform IS NULL )
+	AND ( c.create_platform in (1,3,6,9) OR (c.create_platform IS NULL and a.register_platform!=7) )
     AND ((y.apply_record_id > 0 and y.create_time > ?) OR (y.apply_record_id is null AND a.created_time > ?) )
 	AND ( y.source > 0 OR y.source IS NULL)
 `
@@ -256,10 +256,10 @@ FROM
 	LEFT JOIN (SELECT * from yb_apply_record where apply_record_id in (SELECT max(apply_record_id) from yb_apply_record GROUP BY user_id)) as y on a.user_id = y.user_id
 WHERE
 	b.enabled = 1
-	AND ( y.apply_record_id > 0 or a.company_id=1 or bp.company_product_id is null)
+	AND ( y.apply_record_id > 0 or a.company_id=1)
 	AND ( a.mobile IS NOT NULL || a.email IS NOT NULL ) 
 	AND ( a.mobile <> '' OR a.email <> '' ) 
-	AND ( c.create_platform in (1,3,6,9) OR c.create_platform IS NULL )
+	AND ( c.create_platform in (1,3,6,9) OR (c.create_platform IS NULL and a.register_platform!=7) )
     AND ((y.apply_record_id > 0 and y.create_time > ?) OR (y.apply_record_id is null AND a.created_time > ?) )
 	AND ( y.source > 0 OR y.source IS NULL)
 `

+ 162 - 0
routers/commentsRouter.go

@@ -1519,6 +1519,69 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:GushouTimeLineController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:GushouTimeLineController"],
+        beego.ControllerComments{
+            Method: "PvExport",
+            Router: `/gushouTimeLine/PvExport`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:GushouTimeLineController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:GushouTimeLineController"],
+        beego.ControllerComments{
+            Method: "PublishCancleReport",
+            Router: `/gushouTimeLine/all/publishAndcancel`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:GushouTimeLineController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:GushouTimeLineController"],
+        beego.ControllerComments{
+            Method: "Delete",
+            Router: `/gushouTimeLine/delete`,
+            AllowHTTPMethods: []string{"POST"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:GushouTimeLineController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:GushouTimeLineController"],
+        beego.ControllerComments{
+            Method: "Detail",
+            Router: `/gushouTimeLine/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:GushouTimeLineController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:GushouTimeLineController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/gushouTimeLine/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:GushouTimeLineController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:GushouTimeLineController"],
+        beego.ControllerComments{
+            Method: "PreserveAndPublish",
+            Router: `/gushouTimeLine/preserveAndPublish`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:GushouTimeLineController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:GushouTimeLineController"],
+        beego.ControllerComments{
+            Method: "PublishReport",
+            Router: `/gushouTimeLine/publishAndcancel`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:IndustrialAnalystController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:IndustrialAnalystController"],
         beego.ControllerComments{
             Method: "IndustrialAnalystAdd",
@@ -1708,6 +1771,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:IndustrialSubjectController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:IndustrialSubjectController"],
+        beego.ControllerComments{
+            Method: "IndustrialAndSubjectSearch",
+            Router: `/industrialAndSubject/search`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:IndustrialSubjectController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:IndustrialSubjectController"],
         beego.ControllerComments{
             Method: "IndustrialSubjectAdd",
@@ -2329,6 +2401,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"],
+        beego.ControllerComments{
+            Method: "AddRemark",
+            Router: `/rai_serve/remark/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"],
+        beego.ControllerComments{
+            Method: "RemarkList",
+            Router: `/rai_serve/remark/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"],
         beego.ControllerComments{
             Method: "SearchTag",
@@ -2464,6 +2554,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ReportSelectionController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ReportSelectionController"],
+        beego.ControllerComments{
+            Method: "AddThirdName",
+            Router: `/reportSelection/add/third_name`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ReportSelectionController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ReportSelectionController"],
         beego.ControllerComments{
             Method: "ArticleHistoryExport",
@@ -7882,6 +7981,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: "AffiliatedCompanyList",
+            Router: `/getAffiliatedCompany`,
+            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: "List",
@@ -9772,6 +9880,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanyController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanyController"],
+        beego.ControllerComments{
+            Method: "EditUserOutboundMobile",
+            Router: `/user/edit/outbound_mobile`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanyController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanyController"],
         beego.ControllerComments{
             Method: "CompanyUserExport",
@@ -9970,6 +10087,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: "InvoicePaymentCheckList",
+            Router: `/seller/check/invoice_payment/list`,
+            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: "CheckList",
@@ -10330,6 +10456,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanyUserController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanyUserController"],
+        beego.ControllerComments{
+            Method: "ListMoveLog",
+            Router: `/user/listMoveLog`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanyUserController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanyUserController"],
         beego.ControllerComments{
             Method: "GetOtherProduct",
@@ -10897,6 +11032,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticCompanyMergerController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticCompanyMergerController"],
+        beego.ControllerComments{
+            Method: "CompanyContractPercentageListExport",
+            Router: `/merge_company/company_contract_percentage/list_export`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticCompanyMergerController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticCompanyMergerController"],
         beego.ControllerComments{
             Method: "CompanyContractPermissionList",
@@ -10933,6 +11077,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticCompanyMergerController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticCompanyMergerController"],
+        beego.ControllerComments{
+            Method: "CompanyPreviousLastYear",
+            Router: `/merge_company_previous/last_year`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticReportController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticReportController"],
         beego.ControllerComments{
             Method: "InvoicePaymentList",
@@ -11095,6 +11248,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticReportController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticReportController"],
+        beego.ControllerComments{
+            Method: "StackCompanyListRai",
+            Router: `/stack_company_list_rai`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticReportController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticReportController"],
         beego.ControllerComments{
             Method: "WillExpireList",

+ 1 - 0
routers/router.go

@@ -164,6 +164,7 @@ func init() {
 				&cygx.OrderController{},
 				&cygx.RaiServeCoAntroller{},
 				&cygx.UserFeedbackController{},
+				&cygx.GushouTimeLineController{},
 			),
 		),
 		web.NSNamespace("/advisory",

+ 130 - 8
services/company.go

@@ -8,6 +8,7 @@ import (
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/company"
 	"hongze/hz_crm_api/models/company_user"
+	"hongze/hz_crm_api/models/cygx"
 	"hongze/hz_crm_api/models/system"
 	"hongze/hz_crm_api/services/alarm_msg"
 	"hongze/hz_crm_api/utils"
@@ -867,12 +868,20 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 		if !strings.Contains(status, "/") {
 			if status == utils.COMPANY_STATUS_FORMAL { //正式
 				//button.BtnModifySeller = true
-				button.BtnRemarkView = true
+				if productId == utils.COMPANY_PRODUCT_RAI_ID {
+					button.BtnRemarkViewHistory = true
+				} else {
+					button.BtnRemarkView = true
+				}
 				return
 			} else if status == utils.COMPANY_STATUS_TRY_OUT { //试用
 				button.BtnEdit = true
 				button.BtnDelete = true
-				button.BtnRemarkView = true
+				if productId == utils.COMPANY_PRODUCT_RAI_ID {
+					button.BtnRemarkViewHistory = true
+				} else {
+					button.BtnRemarkView = true
+				}
 				//button.BtnModifySeller = true
 				button.BtnFreeze = false
 				if productId == utils.COMPANY_PRODUCT_FICC_ID {
@@ -881,11 +890,18 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 				return
 			} else if status == utils.COMPANY_STATUS_FREEZE { //冻结
 				//button.BtnModifySeller = true
-				button.BtnRemarkView = true
+				if productId == utils.COMPANY_PRODUCT_RAI_ID {
+					button.BtnRemarkViewHistory = true
+				} else {
+					button.BtnRemarkView = true
+				}
 				return
 			} else if status == utils.COMPANY_STATUS_LOSE { //流失
 				//button.BtnModifySeller = true
 				button.BtnDelete = true
+				if productId == utils.COMPANY_PRODUCT_RAI_ID {
+					button.BtnRemarkViewHistory = true
+				}
 				return
 			} else if status == utils.COMPANY_STATUS_CLOSE { // 关闭
 				//button.BtnModifySeller = true
@@ -898,6 +914,9 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 				//button.BtnModifySeller = true
 				button.BtnDelete = true
 				button.BtnEdit = true
+				if productId == utils.COMPANY_PRODUCT_RAI_ID {
+					button.BtnRemarkViewHistory = true
+				}
 				return
 			}
 		}
@@ -949,6 +968,7 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 			if productStatus == utils.COMPANY_STATUS_FORMAL { //正式
 				button.BtnModifySeller = true
 				button.BtnShare = true
+				button.BtnRemarkViewHistory = true
 			} else if productStatus == utils.COMPANY_STATUS_TRY_OUT { //试用
 				button.BtnEdit = true
 				//button.BtnDelete = true
@@ -956,13 +976,17 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 				button.BtnFreeze = false
 				// CRM14.7.2 权益管理员可以设置试用客户为共享
 				button.BtnShare = true
+				button.BtnRemarkViewHistory = true
 			} else if productStatus == utils.COMPANY_STATUS_FREEZE { //冻结
 				button.BtnModifySeller = true
+				button.BtnRemarkViewHistory = true
 			} else if productStatus == utils.COMPANY_STATUS_LOSE { //流失
 				//button.BtnDelete = true
+				button.BtnRemarkViewHistory = true
 			} else { //永续
 				button.BtnModifySeller = true
 				button.BtnShare = true
+				button.BtnRemarkViewHistory = true
 			}
 		} else {
 			productStatus2, hasProduct2 := productStatusMap[1]
@@ -1163,7 +1187,8 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 						button.BtnModifySeller = true
 						//button.BtnShare = true
 						button.BtnRemarkEdit = true
-						button.BtnRemarkView = true
+						//button.BtnRemarkView = true //权益销售隐藏
+						button.BtnRemarkViewHistory = true
 					} else if productStatus == utils.COMPANY_STATUS_TRY_OUT { //试用
 						button.BtnEdit = true
 						button.BtnDelete = true
@@ -1173,7 +1198,8 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 						button.BtnModifySeller = true
 						button.BtnFreeze = true
 						button.BtnRemarkEdit = true
-						button.BtnRemarkView = true
+						//button.BtnRemarkView = true //权益销售隐藏
+						button.BtnRemarkViewHistory = true
 						//button.BtnShare = true
 					} else if productStatus == utils.COMPANY_STATUS_FREEZE { //冻结
 						button.BtnThaw = true
@@ -1182,12 +1208,15 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 						button.BtnRemarkView = true
 					} else if productStatus == utils.COMPANY_STATUS_LOSE { //流失
 						button.BtnApplyReceive = true
+						button.BtnRemarkViewHistory = true
 					} else if productStatus == utils.COMPANY_STATUS_FOREVER { //永续
 						button.BtnTurnPositive = true
+						button.BtnRemarkViewHistory = true
 					}
 				} else {
 					if productStatus == utils.COMPANY_STATUS_LOSE { //流失
 						button.BtnView = true //显示权限、详情
+						button.BtnRemarkViewHistory = true
 						//如果不是自己客户,那么判断是否是本小组的,如果是本小组,那么还是申请领取,非本小组的话,那就是领取
 						if groupId == sysUserGroupId {
 							button.BtnApplyReceive = true
@@ -1201,25 +1230,31 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 			//如果是组长,且该客户属于本组客户
 			if authority == 2 && hasGroupId && groupId == sysUserGroupId {
 				button.BtnView = true                             //查看详情权限
+				button.BtnRemarkViewHistory = true                //历史备注
 				if productStatus == utils.COMPANY_STATUS_FORMAL { //正式
 					button.BtnModifySeller = true
 					//button.BtnShare = true
-					button.BtnRemarkView = true
+					//button.BtnRemarkView = true //权益销售隐藏
+					//button.BtnRemarkViewHistory = true
 				} else if productStatus == utils.COMPANY_STATUS_TRY_OUT { //试用
 					button.BtnModifySeller = true
-					button.BtnRemarkView = true
+					//button.BtnRemarkView = true //权益销售隐藏
+					//button.BtnRemarkViewHistory = true
 					//button.BtnShare = true
 				} else if productStatus == utils.COMPANY_STATUS_FREEZE { //冻结
 					button.BtnModifySeller = true
-					button.BtnRemarkView = true
+					//button.BtnRemarkView = true //权益销售隐藏
+					//button.BtnRemarkViewHistory = true
 				} else if productStatus == utils.COMPANY_STATUS_LOSE { //流失
 					if sellerId == sysUserId || groupId == sysUserGroupId || utils.InArrayByStr(shareSellerIdArr, strconv.Itoa(sysUserId)) || shareSellerId == sysUserId {
 						button.BtnApplyReceive = true
 					} else {
 						button.BtnReceive = true
 					}
+					//button.BtnRemarkViewHistory = true
 				} else { //永续
 					//button.BtnDelete = true
+					//button.BtnRemarkViewHistory = true
 				}
 			}
 
@@ -2389,6 +2424,7 @@ func FilterReadAndContractAuth(chartPermissions, contractPermissions, condition
 
 // GetShareCompanyPermissionButton 正式客户共享-权限按钮
 func GetShareCompanyPermissionButton(roleTypeCode, statuses string, productId int, item *company.CompanyItem, sysUser *system.Admin) (button *company.ButtonPermission) {
+	statuses = strings.Replace(statuses, "(共享)", "", -1)
 	statusMap := make(map[int]string)
 	statusMap[productId] = statuses
 	if strings.Contains(statuses, "/") {
@@ -2470,5 +2506,91 @@ func GetShareCompanyPermissionButton(roleTypeCode, statuses string, productId in
 	if companyButton.BtnShare == true {
 		button.BtnShare = true
 	}
+	//备注与历史备注修改 CRM15.9.1
+	button.BtnRemarkView = companyButton.BtnRemarkView
+
+	if productId == 2 {
+		button.BtnRemarkView = false
+		button.BtnRemarkViewHistory = true
+	}
+
+	if utils.InArrayByStr([]string{utils.ROLE_TYPE_CODE_RAI_ADMIN, utils.ROLE_TYPE_CODE_RAI_SELLER, utils.ROLE_TYPE_CODE_RAI_GROUP}, roleTypeCode) {
+		button.BtnServiceRecord = false //王芳,权益销售,权益销售组长,这三种身份看不到这个按钮
+	}
+	return
+}
+
+// AddWxUserMoveLog 添加用户移动日志记录
+func AddWxUserMoveLog(wxUser *models.WxUser, adminUser *system.Admin, newCompanyId int) (err error) {
+	if wxUser.CompanyId == newCompanyId {
+		return
+	}
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg("添加用户移动日志记录失败,AddWxUserMoveLog "+fmt.Sprint("UserId:", wxUser.UserId, ";err:", err), 3)
+		}
+	}()
+	//获取老的客户信息
+	companyInfoOld, e := company.GetCompanyById(wxUser.CompanyId)
+	if e != nil {
+		err = errors.New("GetCompanyById, Old Err: " + e.Error())
+		return
+	}
+
+	//获取老的客户信息
+	companyInfoNew, e := company.GetCompanyById(newCompanyId)
+	if e != nil {
+		err = errors.New("GetCompanyById, New Err: " + e.Error())
+		return
+	}
+
+	item := new(company.WxUserMoveLog)
+	item.UserId = int(wxUser.UserId)
+	item.RealName = wxUser.RealName
+	item.Mobile = wxUser.Mobile
+	item.Email = wxUser.Email
+	item.CompanyId = wxUser.CompanyId
+	item.CompanyName = companyInfoOld.CompanyName
+	item.CompanyIdMove = companyInfoNew.CompanyId
+	item.CompanyNameMove = companyInfoNew.CompanyName
+	item.SysUserId = adminUser.AdminId
+	item.SysUserRealName = adminUser.RealName
+	item.CreateTime = time.Now()
+	e = company.AddWxUserMoveLog(item)
+	if e != nil {
+		err = errors.New("AddWxUserMoveLog, New Err: " + e.Error())
+		return
+	}
+
+	e = cygx.RemoveCygxUserRemind(int(wxUser.UserId)) //取消个人提醒
+	if e != nil {
+		err = errors.New("RemoveCygxUserRemind, New Err: " + e.Error())
+		return
+	}
+	return
+}
+
+// GetWxUserHaveMoveMap 根据手机号,获取用户是否有过移动的记录
+func GetWxUserHaveMoveMap(mobiles []string) (moveMap map[string]bool) {
+	lenArr := len(mobiles)
+	if lenArr == 0 {
+		return
+	}
+	var err error
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg("添加用户移动日志记录失败,GetWxUserHaveMoveMap "+fmt.Sprint("mobiles:", mobiles, ";err:", err), 3)
+		}
+	}()
+
+	listMobileMove, e := company.GetWxUserMoveLogListmByMobiles(mobiles)
+	if e != nil {
+		err = errors.New("GetWxUserMoveLogListmByMobiles Err: " + e.Error())
+		return
+	}
+	moveMap = make(map[string]bool)
+	for _, v := range listMobileMove {
+		moveMap[v.Mobile] = true
+	}
 	return
 }

+ 4 - 2
services/company_apply/company_approval.go

@@ -423,8 +423,10 @@ func Approved(approvalRecord *contract.ContractApprovalRecord, opUser *system.Ad
 				cygxService.YanXuanCompanyApproval(recordInfo.CompanyId, recordInfo.CompanyContractId) //研选审批通过的时候研选扣点更新
 				cygxService.HandleCompanyContractTypeByRaiXClass(recordInfo.CompanyContractId)         //所有x类试用转正的合同都记为 :打分派点
 				//cygxService.HandleAllocationCompanyContractByYanXuan(recordInfo.CompanyContractId)     //如果合同只有研选的时候,自动处理派点
-				cygxService.HandleCompanyContractPackageDifference(recordInfo.CompanyContractId)      // 更新与上一份合同的金额的对比 '增加套餐','减少套餐','维持套餐'
-				cygxService.HandleCompanyContractPermissionContractType(recordInfo.CompanyContractId) // 更新合同权限表中的权限名称,以及对应的行业权限类型(行业新签、行业续约)
+				cygxService.HandleCompanyContractPackageDifference(recordInfo.CompanyContractId)          // 更新与上一份合同的金额的对比 '增加套餐','减少套餐','维持套餐'
+				cygxService.HandleCompanyContractPermissionContractType(recordInfo.CompanyContractId)     // 更新合同权限表中的权限名称,以及对应的行业权限类型(行业新签、行业续约)
+				services.UpdateCompanyProductSellerMove(recordInfo.CompanyId, recordInfo.ProductId)       // 权益客户创建新的有效合同之后,更新所关联的销售信息
+				services.UpdateCompanyContracthideBycompanyId(recordInfo.CompanyId, recordInfo.ProductId) // 权益客户创建新的有效合同之后,对相关合同进行隐藏
 			}
 		}()
 	} else {

+ 192 - 0
services/company_contract.go

@@ -1,5 +1,15 @@
 package services
 
+import (
+	"errors"
+	"fmt"
+	"hongze/hz_crm_api/models/company"
+	"hongze/hz_crm_api/services/alarm_msg"
+	"hongze/hz_crm_api/utils"
+	"strconv"
+	"time"
+)
+
 //func init() {
 //	InitCompanyContractMerge()
 //	//GetCompanyContractPermissionNameMapById(map[int]string{6513: "182,183", 6663: "435,542"})
@@ -396,3 +406,185 @@ package services
 //
 //	return
 //}
+
+//func init() {
+//	UpdateCompanyContractSellerMove(7034, 2)
+//}
+
+// UpdateCompanyContractSellerMove 权益客户移动所属销售之后,更新所关联的销售信息
+func UpdateCompanyContractSellerMove(companyId, productId int) {
+	if productId != utils.COMPANY_PRODUCT_RAI_ID {
+		return
+	}
+	time.Sleep(1 * time.Second) // 延迟1秒
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg("权益客户移动所属销售之后,更新所关联的销售信息失败,UpdateCompanyContractSellerMove "+fmt.Sprint("companyId:", companyId, ";err:", err), 3)
+		}
+	}()
+
+	cp, e := company.GetCompanyProductByCompanyIdAndProductId(companyId, productId)
+	if e != nil {
+		err = errors.New("GetCompanyProductByCompanyIdAndProductId Err: " + e.Error())
+		return
+	}
+
+	var updateCompanyProduct bool
+	//更新还没有生效的合同
+	{
+		var condition string
+		var pars []interface{}
+		pars = make([]interface{}, 0)
+		condition = " AND  company_id = ?  AND  product_id = ?  AND  start_date > ? "
+		pars = append(pars, companyId, productId, time.Now())
+		list, e := company.GetCompanyContracList(condition, pars) // 获取还没有生效的合同信息
+		if e != nil {
+			err = errors.New("GetCompanyContracList, Err: " + e.Error())
+			return
+		}
+		//fmt.Println("list1", len(list))
+		if len(list) > 0 {
+			for _, v := range list {
+				e = company.UpdateCompanyContractSellerNotEffective(cp.SellerId, cp.ShareSellerId, cp.SellerName, cp.ShareSeller, v.CompanyContractId)
+				if e != nil {
+					err = errors.New("UpdateCompanyContractSellerNotEffective, Err: " + e.Error())
+					return
+				}
+			}
+			e = company.UpdateCompanyProductSellerUnexpired(cp.SellerId, cp.ShareSellerId, cp.SellerName, cp.ShareSeller, cp.CompanyId)
+			if e != nil {
+				err = errors.New("UpdateCompanyProductSellerUnexpired, Err: " + e.Error())
+				return
+			}
+			updateCompanyProduct = true
+		}
+	}
+
+	//更新还没有到期的合同
+	{
+		var condition string
+		var pars []interface{}
+		pars = make([]interface{}, 0)
+		condition = " AND  company_id = ?  AND  product_id = ?  AND  start_date < ?  AND  end_date > ? "
+		pars = append(pars, companyId, productId, time.Now(), time.Now())
+		list, e := company.GetCompanyContracList(condition, pars) // 获取还没有到期的合同信息
+		if e != nil {
+			err = errors.New("GetCompanyContracList, Err: " + e.Error())
+			return
+		}
+		//fmt.Println("list2", len(list))
+		if len(list) > 0 {
+			for _, v := range list {
+				e = company.UpdateCompanyContractSellerUnexpired(cp.SellerId, cp.ShareSellerId, cp.SellerName, cp.ShareSeller, v.CompanyContractId)
+				if e != nil {
+					err = errors.New("UpdateCompanyContractSellerUnexpired, Err: " + e.Error())
+					return
+				}
+			}
+
+			if !updateCompanyProduct {
+				e = company.UpdateCompanyProductSellerUnexpired(cp.SellerId, cp.ShareSellerId, cp.SellerName, cp.ShareSeller, cp.CompanyId)
+				if e != nil {
+					err = errors.New("UpdateCompanyProductSellerUnexpired, Err: " + e.Error())
+					return
+				}
+			}
+
+		}
+	}
+
+	return
+}
+
+// 权益客户创建新的有效合同之后,更新所关联的销售信息
+func UpdateCompanyProductSellerMove(companyId, productId int) {
+	if productId != utils.COMPANY_PRODUCT_RAI_ID {
+		return
+	}
+	time.Sleep(1 * time.Second) // 延迟1秒
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg("权益客户创建新的有效合同之后,更新所关联的销售信息,UpdateCompanyProductSellerMove "+fmt.Sprint("companyId:", companyId, ";err:", err), 3)
+		}
+	}()
+
+	cp, e := company.GetCompanyProductByCompanyIdAndProductId(companyId, productId)
+	if e != nil {
+		err = errors.New("GetCompanyProductByCompanyIdAndProductId Err: " + e.Error())
+		return
+	}
+
+	e = company.UpdateCompanyProductSellerUnexpired(cp.SellerId, cp.ShareSellerId, cp.SellerName, cp.ShareSeller, cp.CompanyId)
+	if e != nil {
+		err = errors.New("UpdateCompanyProductSellerUnexpired, Err: " + e.Error())
+		return
+	}
+
+	return
+}
+
+//func init() {
+//	UpdateCompanyContracthideBycompanyId(5593, 2)
+//}
+
+// 权益客户创建新的有效合同之后,对相关合同进行隐藏
+func UpdateCompanyContracthideBycompanyId(companyId, productId int) {
+	if productId != utils.COMPANY_PRODUCT_RAI_ID {
+		return
+	}
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg("权益客户创建新的有效合同之后,对相关合同进行隐藏,UpdateCompanyContracthideBycompanyId "+fmt.Sprint("companyId:", companyId, ";err:", err), 3)
+		}
+	}()
+
+	var condition string
+	var pars []interface{}
+
+	if companyId > 0 {
+		condition = ` AND a.company_id = ? `
+		pars = append(pars, companyId)
+	}
+
+	listContractMax, e := company.GetCompanyContracListMaxStartDate(condition, pars)
+	if e != nil {
+		err = errors.New("GetCompanyContracListMaxStartDate, Err: " + e.Error())
+		return
+	}
+	//如果合同结束时间,早于最新一份合同的开始时间,这份合同就隐藏
+	maxId := make(map[int]time.Time)
+	for _, v := range listContractMax {
+		maxId[v.CompanyId] = v.MaxStartDate
+	}
+
+	listContract, e := company.GetCompanyContracListInit_CRM_16_1(condition, pars)
+	if e != nil {
+		err = errors.New("GetCompanyContracListInit_CRM_16_1, Err: " + e.Error())
+		return
+	}
+	var updateId []string
+	for _, v := range listContract {
+		if v.EndDate.After(maxId[v.CompanyId]) {
+			continue
+		}
+		updateId = append(updateId, strconv.Itoa(v.CompanyContractId))
+	}
+
+	if len(updateId) == 0 {
+		return
+	}
+	e = company.UpdateCompanyContracthide(updateId)
+	if e != nil {
+		err = errors.New("UpdateCompanyContracthide, Err: " + e.Error())
+		return
+	}
+	fmt.Println((updateId))
+
+	return
+}

+ 243 - 0
services/company_record.go

@@ -0,0 +1,243 @@
+package services
+
+import (
+	"fmt"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/company"
+	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/models/system"
+	"hongze/hz_crm_api/services/alarm_msg"
+	"hongze/hz_crm_api/utils"
+	"time"
+)
+
+// 权益客户新增历史备注
+func AddCompanyHistoryRemark(item *company.CompanyHistoryRemark) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg("权益客户新增历史备注,失败:"+err.Error()+fmt.Sprint(item), 2)
+		}
+	}()
+	err = company.AddCompanyHistoryRemark(item)
+	return
+}
+
+// 删除权益客户新增历史备注
+func DelCompanyHistoryRemark(tableName string, tableId int) {
+	if tableName == "" {
+		return
+	}
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg(fmt.Sprintf("权益客户新增历史备注,失败:"+err.Error()+"tableName:", tableName, "tableId", tableId), 2)
+		}
+	}()
+	err = company.DelCompanyHistoryRemark(tableName, tableId)
+	return
+}
+
+//func init() {
+//	AddCompanyHistoryRemarkInit()
+//}
+
+// 权益客户新增历史备注脚本
+func AddCompanyHistoryRemarkInit() {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+		}
+	}()
+
+	sysUserList, err := system.GetAdminList()
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+
+	mapadmin := make(map[int]string)
+	for _, v := range sysUserList {
+		mapadmin[v.AdminId] = v.RealName
+	}
+
+	listHistory, e := company.GetCompanyHistoryRemarkListinit()
+	if e != nil {
+		fmt.Println(e)
+		return
+	}
+
+	makHistoryMap := make(map[string]bool)
+
+	for _, v := range listHistory {
+		makHistoryMap[fmt.Sprintf("id_", v.TableId, "name_", v.TableName)] = true
+	}
+
+	var items []*company.CompanyHistoryRemark
+
+	recordOB := new(company.CompanyServiceRecord)
+	recordCond := ""
+	recordPars := make([]interface{}, 0)
+	records, e := recordOB.GetItemsByCondition(recordCond, recordPars, []string{}, "")
+	if e != nil {
+		fmt.Println(e)
+		return
+	}
+
+	//company_service_record
+	for _, v := range records {
+		if makHistoryMap[fmt.Sprintf("id_", v.CompanyServiceRecordId, "name_", v.TableName)] {
+			continue
+		}
+		item := new(company.CompanyHistoryRemark)
+		item.CompanyId = v.CompanyId
+		item.Content = v.Content
+		item.SysAdminId = v.SysAdminId
+		item.SysAdminName = v.SysAdminName
+		item.CreateTime = time.Now()
+		item.ModifyTime = time.Now()
+		item.ShowTime = v.CreateTime
+		item.CompanyId = v.CompanyId
+		item.TableId = v.CompanyServiceRecordId
+		item.TableName = "company_service_record"
+		items = append(items, item)
+	}
+
+	//company_product_remark
+	listRemark, e := company.GetRemarkListInit()
+	if e != nil {
+		fmt.Println(e)
+		return
+	}
+	for _, v := range listRemark {
+		if makHistoryMap[fmt.Sprintf("id_", v.CompanyProductRemarkId, "name_", "company_product_remark")] {
+			continue
+		}
+		item := new(company.CompanyHistoryRemark)
+		item.CompanyId = v.CompanyId
+		item.Content = v.Remark
+		item.SysAdminId = v.SysUserId
+		item.SysAdminName = v.SysRealName
+		item.CreateTime = time.Now()
+		item.ModifyTime = time.Now()
+		item.ShowTime = v.CreateTime
+		item.CompanyId = v.CompanyId
+		item.TableId = v.CompanyProductRemarkId
+		item.TableName = "company_product_remark"
+		items = append(items, item)
+	}
+	//company_product_remark  end
+
+	var condition string
+	var pars []interface{}
+	condition += ` AND product_id = 2  ORDER  BY  create_time DESC   `
+	listrenewed_note, err := company.GetCompanyNoRenewedNoteList(condition, pars, 0, 0)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+	//company_no_renewed_note
+	for _, v := range listrenewed_note {
+		if makHistoryMap[fmt.Sprintf("id_", v.NoRenewedNoteId, "name_", "company_no_renewed_note")] {
+			continue
+		}
+		item := new(company.CompanyHistoryRemark)
+		item.CompanyId = v.CompanyId
+		item.Content = v.Content
+		item.SysAdminId = v.AdminId
+		item.SysAdminName = mapadmin[v.AdminId]
+		item.CreateTime = time.Now()
+		item.ModifyTime = time.Now()
+		item.ShowTime = utils.StrTimeToTime(v.CreateTime)
+		item.CompanyId = v.CompanyId
+		item.TableId = v.NoRenewedNoteId
+		item.TableName = "company_no_renewed_note"
+		items = append(items, item)
+	}
+	//company_no_renewed_note end
+
+	//company_renewal_reason
+	listRenewa, e := models.GetMoreRenewalReasoninit()
+	if e != nil {
+		fmt.Println(e)
+		return
+	}
+	for _, v := range listRenewa {
+		if makHistoryMap[fmt.Sprintf("id_", v.CompanyRenewalReasonId, "name_", "company_renewal_reason")] {
+			continue
+		}
+		item := new(company.CompanyHistoryRemark)
+		item.CompanyId = v.CompanyId
+		item.Content = v.RenewalReason
+		//item.SysAdminId = v.SysUserId
+		//item.SysAdminName = v.SysRealName
+		item.CreateTime = time.Now()
+		item.ModifyTime = time.Now()
+		item.ShowTime = v.CreateTime
+		item.CompanyId = v.CompanyId
+		item.TableId = v.CompanyRenewalReasonId
+		item.TableName = "company_renewal_reason"
+		items = append(items, item)
+	}
+	//company_renewal_reason end
+
+	//cygx_user_feedback
+	// 权益服务明细表
+	listUserFeedback, e := cygx.GetCygxUserFeedbackListInit()
+	if e != nil {
+		fmt.Println(e)
+		return
+	}
+	for _, v := range listUserFeedback {
+		if makHistoryMap[fmt.Sprintf("id_", v.UserFeedbackId, "name_", "cygx_user_feedback")] {
+			continue
+		}
+		item := new(company.CompanyHistoryRemark)
+		item.CompanyId = v.CompanyId
+		item.Content = v.Content
+		item.SysAdminId = v.AdminId
+		item.SysAdminName = mapadmin[v.AdminId]
+		item.CreateTime = time.Now()
+		item.ModifyTime = time.Now()
+		item.ShowTime = v.CreateTime
+		item.CompanyId = v.CompanyId
+		item.UserId = v.UserId
+		item.Mobile = v.Mobile
+		item.Email = v.Email
+		item.RealName = v.RealName
+		item.TableId = v.UserFeedbackId
+		item.TableName = "cygx_user_feedback"
+		items = append(items, item)
+	}
+
+	if len(items) > 0 {
+		var itemsAdd []*company.CompanyHistoryRemark
+		for k, v := range items {
+			v.ProductId = 2
+			itemsAdd = append(itemsAdd, v)
+			if len(itemsAdd)%2000 == 0 {
+				fmt.Println(k)
+				e = company.AddCompanyHistoryRemarkMultiinit(itemsAdd)
+				if e != nil {
+					fmt.Println(e)
+					return
+				}
+				itemsAdd = make([]*company.CompanyHistoryRemark, 0)
+			}
+		}
+		e = company.AddCompanyHistoryRemarkMultiinit(itemsAdd)
+		if e != nil {
+			fmt.Println(e)
+			return
+		}
+	}
+
+	//cygx_user_feedback end
+
+	fmt.Println(len(items))
+	fmt.Println(len(records))
+	return
+}

+ 28 - 1
services/contract/contract.go

@@ -86,6 +86,29 @@ func AddContract(req request.AddContractReq, sellerId, productId int, sellerName
 		err = errors.New(fmt.Sprint("合同编号生成异常,Err:", err))
 		return
 	}
+
+	//权益的新签合同重新定义,如果合同起始时间在第一份新签合同起始日期 1年之内的,仍为新签合同。
+	if productId == utils.COMPANY_PRODUCT_RAI_ID && req.ContractType == "" {
+		//根据社会信用码获取客户信息
+		companyInfo, tmpErr := company.GetCompanyByCreditCode(creditCode)
+		//如果查询异常,且并不是在系统中找不到该社会信用码,那么就异常返回
+		if tmpErr != nil {
+			err = errors.New(fmt.Sprint("根据社会信用码获取客户信息,Err:", tmpErr))
+			return
+		}
+		totalLastYear, tmpErr := GetCompanyContractCountRaiByLastYear(companyInfo.CompanyId, req.StartDate)
+		if tmpErr != nil {
+			err = errors.New(fmt.Sprint("获取第一份新签合同起始日期是否1年之内失败,Err:", tmpErr))
+			return
+		}
+		if totalLastYear > 0 {
+			req.ContractType = "新签合同"
+		} else {
+			req.ContractType = "续约合同"
+		}
+
+	}
+
 	contractInfo := &contract.Contract{
 		ContractCode:         contractCode,
 		SellerId:             sellerId,
@@ -1275,6 +1298,7 @@ func GetServicePermissionMap(serviceList []*contract.ContractServiceAndDetail) (
 			}
 		case 4, 5, 6: //权益大套餐
 			permissionFiccClassifyArr := []string{"权益"}
+			permissionFilterrr := []string{"固收", "路演服务", "研选扣点包", "调研", "专家", "研选订阅"} //不在大套餐中展示的权益权限
 			for _, v := range permissionFiccClassifyArr {
 				items, tmpErr := company.GetPermissionLookItems(2, v)
 				if tmpErr != nil {
@@ -1283,7 +1307,10 @@ func GetServicePermissionMap(serviceList []*contract.ContractServiceAndDetail) (
 				}
 				for _, n := range items {
 					//如果是专家行业,那么 结束当前循环,进入下一循环(产品需求:专家行业不在里面)
-					if n.ChartPermissionId == 29 || n.ChartPermissionId == 31 {
+					//if n.ChartPermissionId == 29 || n.ChartPermissionId == 31 {
+					//	continue
+					//}
+					if utils.InArrayByStr(permissionFilterrr, n.PermissionName) {
 						continue
 					}
 					checkPermissionIdMap[n.ChartPermissionId] = n.ChartPermissionId

+ 109 - 46
services/cygx/acitvity.go

@@ -690,6 +690,9 @@ func ActivityBodyAnalysis(body string, activeState int, req cygx.ActivityRep) (i
 		if strings.Contains(contentTxt, "腾讯会议号:") {
 			item.TencentConferenceNumber = strings.Replace(contentTxt, "腾讯会议号:", "", -1)
 		}
+		if strings.Contains(contentTxt, "会议ID:") {
+			item.MeetingId = strings.Replace(contentTxt, "会议ID:", "", -1)
+		}
 	})
 
 	strnum := strings.Index(body, "活动亮点:")
@@ -1227,6 +1230,7 @@ func DoActivityOnenIdWxTemplateMsg(activityId int) (err error) {
 			mapUserIdChooseTypeSend[v.UserId] = v.UserId
 		}
 	}
+
 	//fmt.Println(chooseSendtList)
 	//获取关注这个活动对应产业的用户的 openid
 	mapOpenidFllow := make(map[int]string)
@@ -1239,12 +1243,12 @@ func DoActivityOnenIdWxTemplateMsg(activityId int) (err error) {
 	}
 
 	//fmt.Println(mapOpenidFllow)
-	openidPowerByActivitySetList, err := cygx.GetCygxUserRecordPowerByActivitySet(chartPermissionIds, condition)
+	openidPowerByActivitySetList, openidPowerByActivitySetListYx, err := cygx.GetCygxUserRecordPowerByActivitySet(chartPermissionIds, condition)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		return err
 	}
 	//已经推送过的不做二次推送
-	listSendOpendId, err := models.GeUserTemplateRecordListBysendType(utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD, strconv.Itoa(activityId))
+	listSendOpendId, err := cygx.GeCygxActivityUserTemplateRecordListByActivityId(activityId, utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		return err
 	}
@@ -1271,67 +1275,126 @@ func DoActivityOnenIdWxTemplateMsg(activityId int) (err error) {
 			}
 		}
 	}
-	if len(OpenIdList) == 0 {
-		return err
-	}
 
-	openIdArr := make([]string, len(OpenIdList))
-	for i, v := range OpenIdList {
-		openIdArr[i] = v.OpenId
+	var openiditems []*cygx.CygxActivityUserTemplateRecord
+
+	var openIdArr []string
+	for _, v := range OpenIdList {
+		//openIdArr[i] = v.OpenId
+		openIdArr = append(openIdArr, v.OpenId)
+
+		openiditem := new(cygx.CygxActivityUserTemplateRecord)
+		openiditem.ActivityId = activityId
+		openiditem.UserId = v.UserId
+		openiditem.OpenId = v.OpenId
+		openiditem.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD
+		openiditem.CreateTime = time.Now()
+		openiditems = append(openiditems, openiditem)
 	}
 
-	activityInfo.ActivityTypeName = strings.Replace(activityInfo.ActivityTypeName, "(C类)", "", -1)
-	first := "您关注的赛道,有【" + activityInfo.ActivityTypeName + "】活动发布,欢迎参与"
-	keyword1 := "新活动:" + activityInfo.ActivityName
-	keyword2 := activityInfo.ActivityTimeText + ",【" + activityInfo.Label + "】"
-
-	redirectUrl := utils.WX_MSG_PATH_ACTIVITY_DETAIL + strconv.Itoa(activityId)
-	sendInfo := new(services.SendWxTemplate)
-	sendInfo.First = first
-	sendInfo.Keyword1 = keyword1
-	sendInfo.Keyword2 = keyword2
-
-	sendInfo.TemplateId = utils.WxMsgTemplateIdActivityChangeApplyXzs
-	sendInfo.RedirectUrl = redirectUrl
-	sendInfo.RedirectTarget = 3
-	sendInfo.Resource = strconv.Itoa(activityId)
-	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_LIMIT_PEOPLE
-	sendInfo.OpenIdArr = openIdArr
-	e := services.SendTemplateMsg(sendInfo)
-	if e != nil {
-		err = errors.New("SendTemplateMsg, Err: " + e.Error())
-		return
+	var OpenIdListYx []*models.OpenIdList
+	for _, v := range openidPowerByActivitySetListYx {
+		if mapSendOpenid[v.OpenId] > 0 {
+			//fmt.Println("已经推过了")
+			continue
+		}
+		item := new(models.OpenIdList)
+		item.UserId = v.UserId
+		item.OpenId = v.OpenId
+		if mapUserIdChooseSend[v.UserId] == 0 {
+			//如果小助手没有选择过权限信息,那么做消息推送
+			OpenIdListYx = append(OpenIdListYx, item)
+		} else {
+			//如果勾选了权限信息,则要满足 1选择产业,2没有选择不接受任何消息推送,3活动对应的主客观跟自己选择的一致。
+			if mapOpenidFllow[v.UserId] != "" && mapOpenidRefuset[v.UserId] == "" && mapUserIdChooseTypeSend[v.UserId] != 0 {
+				OpenIdListYx = append(OpenIdListYx, item)
+			}
+		}
 	}
 
-	industrialName := ""
-	for _, v := range industrialList {
-		industrialName += v.IndustryName + ","
+	var openIdArrYx []string
+	for _, v := range OpenIdListYx {
+		//openIdArr[i] = v.OpenId
+		openIdArrYx = append(openIdArrYx, v.OpenId)
+
+		openiditem := new(cygx.CygxActivityUserTemplateRecord)
+		openiditem.ActivityId = activityId
+		openiditem.UserId = v.UserId
+		openiditem.OpenId = v.OpenId
+		openiditem.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD
+		openiditem.CreateTime = time.Now()
+		openiditems = append(openiditems, openiditem)
 	}
-	industrialName = strings.TrimRight(industrialName, ",")
-	// 发类目模版消息
-	if activityInfo.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
-		actTime, _ := time.Parse(utils.FormatDateTime, activityInfo.ActivityTime)
-		first := industrialName
-		keyword1 := "发布了新活动"
-		keyword2 := utils.TruncateActivityNameString(activityInfo.ActivityName)
-		keyword3 := actTime.Format(utils.FormatDateTimeMinute2)
 
-		redirectUrl := utils.WX_MSG_PATH_YX_ACTIVITY_DETAIL + strconv.Itoa(activityId)
-		sendInfo := new(services.SendWxCategoryTemplate)
-		sendInfo.Keywords = []string{first, keyword1, keyword2, keyword3}
+	if len(OpenIdList)+len(OpenIdListYx) == 0 {
+		return err
+	}
 
-		sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdActivityPublishApply
+	activityInfo.ActivityTypeName = strings.Replace(activityInfo.ActivityTypeName, "(C类)", "", -1)
+	if len(openIdArr) > 0 {
+		first := "您关注的赛道,有【" + activityInfo.ActivityTypeName + "】活动发布,欢迎参与"
+		keyword1 := "新活动:" + activityInfo.ActivityName
+		keyword2 := activityInfo.ActivityTimeText + ",【" + activityInfo.Label + "】"
+
+		redirectUrl := utils.WX_MSG_PATH_ACTIVITY_DETAIL + strconv.Itoa(activityId)
+		sendInfo := new(services.SendWxTemplate)
+		sendInfo.First = first
+		sendInfo.Keyword1 = keyword1
+		sendInfo.Keyword2 = keyword2
+
+		sendInfo.TemplateId = utils.WxMsgTemplateIdActivityChangeApplyXzs
 		sendInfo.RedirectUrl = redirectUrl
 		sendInfo.RedirectTarget = 3
 		sendInfo.Resource = strconv.Itoa(activityId)
-		sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_LIMIT_PEOPLE
+		sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD
 		sendInfo.OpenIdArr = openIdArr
-		e := services.SendCategoryTemplateMsg(sendInfo)
+		e := services.SendTemplateMsg(sendInfo)
 		if e != nil {
 			err = errors.New("SendTemplateMsg, Err: " + e.Error())
 			return
 		}
 	}
+
+	if len(OpenIdListYx) > 0 {
+		industrialName := ""
+		for _, v := range industrialList {
+			industrialName += v.IndustryName + ","
+		}
+		industrialName = strings.TrimRight(industrialName, ",")
+		// 发类目模版消息
+		if activityInfo.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+			actTime, _ := time.Parse(utils.FormatDateTime, activityInfo.ActivityTime)
+			first := industrialName
+			keyword1 := "发布了新活动"
+			keyword2 := utils.TruncateActivityNameString(activityInfo.ActivityName)
+			keyword3 := actTime.Format(utils.FormatDateTimeMinute2)
+
+			redirectUrl := utils.WX_MSG_PATH_YX_ACTIVITY_DETAIL + strconv.Itoa(activityId)
+			sendInfo := new(services.SendWxCategoryTemplate)
+			sendInfo.Keywords = []string{first, keyword1, keyword2, keyword3}
+
+			sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdActivityPublishApply
+			sendInfo.RedirectUrl = redirectUrl
+			sendInfo.RedirectTarget = 3
+			sendInfo.Resource = strconv.Itoa(activityId)
+			sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD
+			sendInfo.OpenIdArr = openIdArrYx
+			e := services.SendCategoryTemplateMsg(sendInfo)
+			if e != nil {
+				err = errors.New("SendTemplateMsg, Err: " + e.Error())
+				return
+			}
+		}
+	}
+
+	//活动发布推送的Openid记录
+	if len(openiditems) > 0 {
+		e := cygx.AddCygxActivityUserTemplateRecordMulti(openiditems)
+		if e != nil {
+			err = errors.New("AddCygxActivityUserTemplateRecordMulti, Err: " + e.Error())
+			return
+		}
+	}
 	return
 }
 

+ 14 - 17
services/cygx/activity_special.go

@@ -557,13 +557,21 @@ func GetChartPermissionSpecialSurplusByCompany(companyId int) (userType int, tri
 
 // 审批通过的时候专项调研次数更新
 func ActivitySpecialCompanyApproval(companyId, companyContractId int, companyName string) (err error) {
-	userType, packageType, _, _, _ := GetUserType(companyId)
+	//userType, packageType, _, _, _ := GetUserType(companyId)
 	// 获取继承点数
 	//inheritList, e := cygx.GetCygxActivitySpecialInheritPointsByCompanyId(companyId)
 	//if e != nil && e.Error() != utils.ErrNoRow() {
 	//	err = errors.New("GetCygxActivitySpecialInheritPointsByCompanyId, Err: " + e.Error())
 	//}
 	//chartNameMap := map[string]int{utils.YI_YAO_NAME: 0, utils.XIAO_FEI_NAME: 0, utils.KE_JI_NAME: 0, utils.ZHI_ZAO_NAME: 0}
+
+	// 获取合同信息-套餐信息
+	companyContract, e := company.GetCompanyContractById(companyContractId)
+	if e != nil {
+		err = errors.New("GetCompanyContractById, Err: " + e.Error())
+		return
+	}
+	packageType := companyContract.RaiPackageType
 	var items []*cygx.CygxActivitySpecialPermissionPoints
 
 	itemBill := new(cygx.CygxActivitySpecialTripBill)
@@ -573,12 +581,12 @@ func ActivitySpecialCompanyApproval(companyId, companyContractId int, companyNam
 	itemBill.Source = 2
 	itemBill.DoType = 2
 	itemBill.Way = 3
-	if userType == 2 {
-		packageTypeMap := map[int]int{1: 16, 2: 10}
+	if packageType > 0 {
+		packageTypeMap := map[int]int{1: 16, 2: 12}
 		totalTrip := packageTypeMap[packageType]
 		itemBill.BillDetailed = totalTrip
 		itemBill.Total = strconv.Itoa(itemBill.BillDetailed) + "次"
-		if totalTrip == 10 {
+		if packageType == 2 {
 			itemBill.Content = "45w大套餐转正"
 		} else {
 			itemBill.Content = "70w大套餐转正"
@@ -594,13 +602,6 @@ func ActivitySpecialCompanyApproval(companyId, companyContractId int, companyNam
 		items = append(items, item)
 
 	} else {
-		//list, e := company.GetCompanyReportPermissionByCompanyIdAndProductId(companyId, 2)
-		//if e != nil && e.Error() != utils.ErrNoRow() {
-		//	err = errors.New("GetCompanyReportPermissionUpgrade, Err: " + e.Error())
-		//}
-		//if len(list) == 0 {
-		//	return
-		//}
 
 		var condition string
 		var pars []interface{}
@@ -612,10 +613,6 @@ func ActivitySpecialCompanyApproval(companyId, companyContractId int, companyNam
 			err = errors.New("GetCompanyContractPermissionList, Err: " + e.Error())
 			return
 		}
-		if e != nil && e.Error() != utils.ErrNoRow() {
-			err = errors.New("GetCygxAllocationCompanyContractPermissionListById, Err: " + e.Error())
-			return
-		}
 
 		if len(list) == 0 {
 			return
@@ -649,12 +646,12 @@ func ActivitySpecialCompanyApproval(companyId, companyContractId int, companyNam
 		itemBill.Content = "行业升级套餐转正"
 	}
 
-	e := cygx.MultiAddCygxActivitySpecialPermissionPoints(items)
+	e = cygx.MultiAddCygxActivitySpecialPermissionPoints(items)
 	if e != nil {
 		err = errors.New("MultiAddCygxActivitySpecialPermissionPoints, Err:" + e.Error())
 		return
 	}
-	if userType != 2 && len(items) > 0 {
+	if packageType == 0 && len(items) > 0 {
 		var condition string
 		var pars []interface{}
 		pars = make([]interface{}, 0)

+ 36 - 7
services/cygx/activity_wx_msg.go

@@ -10,6 +10,7 @@ import (
 	"hongze/hz_crm_api/services/alarm_msg"
 	"hongze/hz_crm_api/utils"
 	"strconv"
+	"time"
 )
 
 // 修改活动人数限制之后,对于因为人数已满而失败的用户,推送模板消息
@@ -31,7 +32,13 @@ func SendWxMsgWithCygxActivityUpdateLimitPeople(activityId int) (err error) {
 		return
 	}
 	//已经推送过的不做二次推送
-	listSendOpendId, err := models.GeUserTemplateRecordListBysendType(utils.TEMPLATE_MSG_CYGX_ACTIVITY_LIMIT_PEOPLE, strconv.Itoa(activityId))
+	//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
 	}
@@ -73,13 +80,27 @@ func SendWxMsgWithCygxActivityUpdateLimitPeople(activityId int) (err error) {
 	if len(openIdList) == 0 {
 		return
 	}
-	openIdArr := make([]string, len(openIdList))
-	for i, v := range openIdList {
-		if mapSendOpenid[v.OpenId] > 0 {
-			continue
-		}
-		openIdArr[i] = v.OpenId
+	//openIdArr := make([]string, len(openIdList))
+	//for i, v := range openIdList {
+	//	if mapSendOpenid[v.OpenId] > 0 {
+	//		continue
+	//	}
+	//	openIdArr[i] = v.OpenId
+	//}
+
+	var openiditems []*cygx.CygxActivityUserTemplateRecord
+	var openIdArr []string
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+		openiditem := new(cygx.CygxActivityUserTemplateRecord)
+		openiditem.ActivityId = activityId
+		openiditem.UserId = v.UserId
+		openiditem.OpenId = v.OpenId
+		openiditem.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_LIMIT_PEOPLE
+		openiditem.CreateTime = time.Now()
+		openiditems = append(openiditems, openiditem)
 	}
+
 	first := "您好,本场活动已增加活动名额至" + activityInfo.LimitPeopleNum + "人,欢迎报名"
 	keyword1 := activityInfo.ActivityName
 	keyword2 := "已增加活动名额至" + activityInfo.LimitPeopleNum + "人,欢迎报名"
@@ -105,6 +126,14 @@ func SendWxMsgWithCygxActivityUpdateLimitPeople(activityId int) (err error) {
 		err = errors.New("SendTemplateMsg, Err: " + e.Error())
 		return
 	}
+	//活动发布推送的Openid记录
+	if len(openiditems) > 0 {
+		e = cygx.AddCygxActivityUserTemplateRecordMulti(openiditems)
+		if e != nil {
+			err = errors.New("AddCygxActivityUserTemplateRecordMulti, Err: " + e.Error())
+			return
+		}
+	}
 	return
 }
 

+ 19 - 0
services/cygx/article.go

@@ -4,6 +4,7 @@ import (
 	"errors"
 	"fmt"
 	"github.com/PuerkitoBio/goquery"
+	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/company"
 	"hongze/hz_crm_api/models/cygx"
 	"hongze/hz_crm_api/services"
@@ -221,6 +222,7 @@ func HandleArticleAndYanxuanRecordList(items []*cygx.CygxArticleAndYanxuanRecord
 		var articleIds []int        // 文章ID
 		var yanxuanSpecialIds []int // 研选专栏ID
 		var sellerCompanyIds []int  // 公司ID
+		var mobiles []string        // 手机号
 		for _, v := range items {
 			if v.Source == utils.CYGX_OBJ_ARTICLE {
 				articleIds = append(articleIds, v.SourceId)
@@ -229,12 +231,25 @@ func HandleArticleAndYanxuanRecordList(items []*cygx.CygxArticleAndYanxuanRecord
 				yanxuanSpecialIds = append(yanxuanSpecialIds, v.SourceId)
 			}
 			sellerCompanyIds = append(sellerCompanyIds, v.CompanyId)
+			mobiles = append(mobiles, v.Mobile)
 		}
 
 		sellNameMap := services.GetSellNameMapByCompanyIds(sellerCompanyIds)
 
 		mapIndustrialLabel := GetArticleIndustrialLabelByArticleId(articleIds) // 关联产业
 		mapSubjectLabel := GetArticleSubjectLabelByArticleId(articleIds)       // 关联标的
+
+		//根据手机号获取这些用户的信息
+		listUser, e := models.GetWxUserByOutboundMobiles(mobiles)
+		if e != nil {
+			err = errors.New("GetWxUserOutboundMobiles, Err: " + e.Error())
+			return
+		}
+		mapUserRealname := make(map[string]string)
+		for _, v := range listUser {
+			mapUserRealname[v.Mobile] = v.RealName
+		}
+
 		var condition string
 		var pars []interface{}
 
@@ -292,6 +307,7 @@ func HandleArticleAndYanxuanRecordList(items []*cygx.CygxArticleAndYanxuanRecord
 					item.PublishDate = mapArticle[v.SourceId].PublishDate
 					item.PermissionName = mapArticle[v.SourceId].PermissionName
 					item.ArticleIdMd5 = mapArticle[v.SourceId].ArticleIdMd5
+					item.ReportId = mapArticle[v.SourceId].ReportId
 				}
 			}
 			if v.Source == utils.CYGX_OBJ_YANXUANSPECIAL {
@@ -307,6 +323,9 @@ func HandleArticleAndYanxuanRecordList(items []*cygx.CygxArticleAndYanxuanRecord
 			item.CreateTime = v.CreateTime
 			item.UserId = v.UserId
 			item.RealName = v.RealName
+			if item.RealName == "" {
+				item.RealName = mapUserRealname[v.Mobile]
+			}
 			item.Mobile = v.Mobile
 			item.CompanyId = v.CompanyId
 			item.CompanyName = v.CompanyName

+ 31 - 0
services/cygx/contract_allocation.go

@@ -952,3 +952,34 @@ func UpdateCygxallocationCompanyContractByEnterScoreInit() {
 	fmt.Println("END")
 	return
 }
+
+// 根据公司ID获取近四周之内有决策人互动的客户
+func GetCompanyProductIsUserMakerByCompanyIds(companyIds []int) (mapIsUserMakerResp map[int]int) {
+	var err error
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg("根据公司ID获取近四周之内有决策人互动的客户失败 GetCompanyProductIsUserMakerByCompanyIds ErrMsg:"+err.Error(), 2)
+
+		}
+	}()
+	lenArr := len(companyIds)
+	if lenArr == 0 {
+		return
+	}
+	var condition string
+	var pars []interface{}
+
+	condition += " AND  company_id IN (" + utils.GetOrmInReplace(lenArr) + ")  AND product_id = 2  AND status IN  ('正式','试用','永续') AND  company_id > 1  "
+	pars = append(pars, companyIds)
+
+	productList, e := company.GetCompanyProductList(condition, pars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCompanyProductList, Err: " + e.Error())
+		return
+	}
+	mapIsUserMakerResp = make(map[int]int)
+	for _, v := range productList {
+		mapIsUserMakerResp[v.CompanyId] = v.IsUserMaker
+	}
+	return
+}

+ 20 - 0
services/cygx/industrial_management.go

@@ -129,3 +129,23 @@ func AddUserIndustryFllowByNewId(industrialManagementId int) (err error) {
 	//}
 	return
 }
+
+// 处理产业管理时间线相关内容的数据
+func UpdateIndustrialManagementTimeLineDateList3ByRedis(industrialManagementId int) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			msg := fmt.Sprint("industrialManagementId:", industrialManagementId)
+			go alarm_msg.SendAlarmMsg("处理产业管理时间线相关内容的数据,写入Redis队列消息失败: UpdateIndustrialManagementTimeLineDateList3ByRedis"+err.Error()+msg, 2)
+		}
+	}()
+	//SourceType int       `description:"1:报名、 2:取消报名、3:活动编辑、4:活动发布,取消发布、5:活动到会。"`
+	log := &cygx.IndustrialManagementDelte{IndustrialManagementId: industrialManagementId}
+	if utils.Re == nil {
+		err := utils.Rc.LPush(utils.CYGX_ARTICLE_TIME_LINE_KEY, log)
+		if err != nil {
+			fmt.Println("UpdateIndustrialManagementTimeLineDateList3ByRedis LPush Err:" + err.Error())
+		}
+	}
+	return
+}

+ 4 - 4
services/cygx/mail.go

@@ -16,7 +16,7 @@ func SendResearchSummaryEmail(detail *cygx.DetailCygxResearchSummaryRep, touser
 	//	return false
 	//}
 	m := gomail.NewMessage()
-	m.SetHeader("From", "cygx@hzinsights.com ")
+	m.SetHeader("From", "hzcygx@hzinsights.com ")
 	//m.SetHeader("To", touser...)
 	var user []string
 	user = append(user, "zwxi@hzinsights.com ")
@@ -271,7 +271,7 @@ func SendResearchSummaryEmail(detail *cygx.DetailCygxResearchSummaryRep, touser
 	}
 	bodyEnd := " </body>\n</html>"
 	m.SetBody("text/html", head+div+allBody+bodyEnd)
-	d := gomail.NewDialer("smtp.mxhichina.com", 465, "cygx@hzinsights.com", "Hzinsights2022")
+	d := gomail.NewDialer("smtp.mxhichina.com", 465, "hzcygx@hzinsights.com", "Hzinsights2024")
 	if err := d.DialAndSend(m); err != nil {
 		return false
 	}
@@ -285,7 +285,7 @@ func SendMinutesSummaryEmail(detail *cygx.DetailCygxMinutesSummaryRep, touser []
 	//	return false
 	//}
 	m := gomail.NewMessage()
-	m.SetHeader("From", "cygx@hzinsights.com ")
+	m.SetHeader("From", "hzcygx@hzinsights.com ")
 	//m.SetHeader("To", touser...)
 	var user []string
 	user = append(user, "zwxi@hzinsights.com ")
@@ -429,7 +429,7 @@ func SendMinutesSummaryEmail(detail *cygx.DetailCygxMinutesSummaryRep, touser []
 	}
 	bodyEnd := " </body>\n</html>"
 	m.SetBody("text/html", head+div+allBody+bodyEnd)
-	d := gomail.NewDialer("smtp.mxhichina.com", 465, "cygx@hzinsights.com", "Hzinsights2022")
+	d := gomail.NewDialer("smtp.mxhichina.com", 465, "hzcygx@hzinsights.com", "Hzinsights2024")
 	if err := d.DialAndSend(m); err != nil {
 		return false
 	}

+ 1 - 1
services/cygx/resource_data.go

@@ -674,7 +674,7 @@ func UpdateMeetingreviewchaptResourceData(sourceId int) {
 		item.PublishDate = publishDate
 		item.ChartPermissionId = detail.ChartPermissionId
 		item.CreateTime = time.Now()
-		item.SearchTitle = industrialName + subjectName
+		item.SearchTitle = industrialName + subjectName + "晨会精华"
 		content, e := utils.GetHtmlContentText(detail.Content)
 		if e != nil && e.Error() != utils.ErrNoRow() {
 			err = errors.New("GetHtmlContentText, Err: " + e.Error() + "sourceId:" + strconv.Itoa(sourceId))

+ 33 - 0
services/cygx/tactics_time_line.go

@@ -84,3 +84,36 @@ func GetArticleTitleMapByid(articleIds []int) (mapResp map[int]string) {
 	}
 	return
 }
+
+// 获取固收时间线的阅读数据
+func GetCygxGushouTimeLineHistoryListMap(timeLineIds []int) (mapPv, mapUv map[int]int) {
+	var err error
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg("获取固收时间线的阅读数据,信息失败,GetCygxGushouTimeLineHistoryListMap Err:"+err.Error(), 3)
+		}
+	}()
+	lentimeLineIds := len(timeLineIds)
+	if lentimeLineIds == 0 {
+		return
+	}
+	var condition string
+	var pars []interface{}
+	condition = ` AND time_line_id IN (` + utils.GetOrmInReplace(lentimeLineIds) + `)`
+	pars = append(pars, timeLineIds)
+	list, err := cygx.GetCygxGushouTimeLineHistoryList(condition, pars)
+	if err != nil {
+		return
+	}
+	mapPv = make(map[int]int, 0)
+	mapUv = make(map[int]int, 0)
+	mapUvCount := make(map[string]int, 0)
+	for _, v := range list {
+		mapPv[v.TimeLineId]++
+		if _, ok := mapUvCount[fmt.Sprint("UID_", v.UserId, "TimeLineId_", v.TimeLineId)]; !ok {
+			mapUvCount[fmt.Sprint("UID_", v.UserId, "TimeLineId_", v.TimeLineId)] = v.TimeLineId
+			mapUv[v.TimeLineId]++
+		}
+	}
+	return
+}

+ 2 - 1
services/cygx/user_label.go

@@ -267,7 +267,7 @@ func GetUserInteractionNumMap(userIds []int) (mapResp map[int]int) {
 	}
 	mapResp = make(map[int]int, 0)
 	for k, v := range list {
-		mapResp[int(v.UserId)] = 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
+		mapResp[int(v.UserId)] = 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 + list[k].FeedbackNum + list[k].RsCalendarNum
 	}
 	return
 }
@@ -359,6 +359,7 @@ func HandleListRsCalendar(list []*roadshow.RsCalendarMeetingUserByRai) (items []
 		item.Mobile = v.Mobile
 		item.CompanyId = v.CompanyId
 		item.CompanyName = v.CompanyName
+		item.RoadShowTheme = v.RoadShowTheme
 		//switch v.TagType {
 		//case 1:
 		//	item.LabelKeyWord = strings.Join(mapGroupindustrialManagementName[v.RsCalendarId], ",")

+ 369 - 0
services/cygx/yidong.go

@@ -83,6 +83,74 @@ type PersonUser struct {
 	CreatePersonName string `description:"创建人姓名:创建时必填" json:"createPersonName"`
 }
 
+type YidongActivityResult struct {
+	ActivityJoinType               string  `json:"activityJoinType"`               // 活动入会类型,01报名审核后可入会 02预约即可入会 03仅定向邀请人员可入会
+	Banner                         string  `json:"banner"`                         // 宣传图
+	BusinessCardOpen               string  `json:"businessCardOpen"`               // 上传名片是否开启,1是 0否
+	BusinessCardRequired           string  `json:"businessCardRequired"`           // 上传名片是否必填,1是 0否
+	CertificateInformationOpen     string  `json:"certificateInformationOpen"`     // 证件信息是否开启,1是 0否
+	CertificateInformationRequired string  `json:"certificateInformationRequired"` // 证件信息是否必填,1是 0否
+	CompanyCodeOpen                string  `json:"companyCodeOpen"`                // 公司代码是否开启,1是 0否
+	CompanyCodeRequired            string  `json:"companyCodeRequired"`            // 公司代码是否必填,1是 0否
+	CompanyInfo                    string  `json:"companyInfo"`                    // 公司名称
+	CompanyShortNameOpen           string  `json:"companyShortNameOpen"`           // 公司名称是否开启,1是 0否
+	CompanyShortNameRequired       string  `json:"companyShortNameRequired"`       // 公司名称是否必填,1是 0否
+	End                            string  `json:"end"`                            // 活动结束时间
+	ID                             string  `json:"id"`                             // 活动主键id
+	IndustrySwName                 string  `json:"industrySwName"`                 // 行业
+	InviteeOpen                    *string `json:"inviteeOpen"`                    // 邀请机构是否开启,1是 0否
+	InviteeRequired                *string `json:"inviteeRequired"`                // 邀请机构是否必填,1是 0否
+	JobNameOpen                    string  `json:"jobNameOpen"`                    // 职务是否开启,1是 0否
+	JobNameRequired                string  `json:"jobNameRequired"`                // 职务是否必填,1是 0否
+	MailOpen                       string  `json:"mailOpen"`                       // 邮箱是否开启,1是 0否
+	MailRequired                   string  `json:"mailRequired"`                   // 邮箱是否必填,1是 0否
+	PersonNameOpen                 string  `json:"personNameOpen"`                 // 姓名是否开启,1是 0否
+	PersonNameRequired             string  `json:"personNameRequired"`             // 姓名是否必填,1是 0否
+	PersonTelephoneOpen            string  `json:"personTelephoneOpen"`            // 手机号是否开启,1是 0否
+	PersonTelephoneRequired        string  `json:"personTelephoneRequired"`        // 手机号是否必填,1是 0否
+	SignUpEnd                      string  `json:"signUpEnd"`                      // 报名结束时间,适应于报名审核后可入会,为空表示不限制报名时间
+	SignUpStart                    string  `json:"signUpStart"`                    // 报名开始时间,适应于报名审核后可入会,为空表示不限制报名时间
+	Start                          string  `json:"start"`                          // 活动开始时间
+	SyncFlag                       string  `json:"syncFlag"`                       // 同步有效性,同步有效性 1有效,0失效
+	Title                          string  `json:"title"`                          // 活动主题
+	Type                           string  `json:"type"`                           // 路演类型
+	URL                            string  `json:"url"`                            // 活动短链接
+}
+
+type YidongApifoxModal struct {
+	ErrorCode interface{}            `json:"errorCode"`
+	ErrorMsg  interface{}            `json:"errorMsg"`
+	Result    []YidongActivityResult `json:"result"`
+	Success   bool                   `json:"success"`
+	Timestamp int64                  `json:"timestamp"`
+}
+
+type YidongResultuser struct {
+	DeviceType        string `json:"deviceType"`       // 参会方式,1-PC,2-Mac,3-Android,4-IOS,5-Web,6-iPad,7-Android Pad,8-小程序,0-PSTN
+	Duration          string `json:"duration"`         // 云会议参会时长
+	DurationInteract  string `json:"durationInteract"` // 互动交流参会时长
+	DurationLive      string `json:"durationLive"`     // 直播参会时长
+	DurationReview    string `json:"durationReview"`   // 回看参会时长
+	EndTime           string `json:"endTime"`          // 云会议最后退会时间
+	EndTimeInteract   string `json:"endTimeInteract"`  // 互动交流最后退会时间
+	EndTimeLive       string `json:"endTimeLive"`      // 直播最后退会时间
+	EndTimeReview     string `json:"endTimeReview"`    // 回看最后退会时间
+	ID                string `json:"id"`               // 主键id
+	Mail              string `json:"mail" comment:"电子邮件"`
+	CompanyName       string `json:"company_name" comment:"公司名称"`
+	JobName           string `json:"jobName"`           // 职务
+	MobileCountryCode string `json:"mobileCountryCode"` // 手机号国际区号码
+	PersonName        string `json:"personName"`        // 姓名
+	PersonTelephone   string `json:"personTelephone"`   // 用户手机号
+	StartTime         string `json:"startTime"`         // 云会议最早入会时间
+	StartTimeInteract string `json:"startTimeInteract"` // 互动交流最早入会时间
+	StartTimeLive     string `json:"startTimeLive"`     // 直播最早入会时间
+	StartTimeReview   string `json:"startTimeReview"`   // 回看最早入会时间
+	Status            string `json:"status"`            // 状态,D表示被删除
+	UserID            string `json:"userId,omitempty"`  // 用户id
+	SignUpStatus      string `json:"sign_up_status" comment:"报名状态"`
+}
+
 // CheckYidongActivitySignupTime 校验易董的活动是否可以 添加报名
 func CheckYidongActivitySignupTime(activityInfo *cygx.ActivityDetail) (errstr string) {
 	if activityInfo.YidongSignUpEnd == "0000-00-00 00:00:00" {
@@ -752,3 +820,304 @@ func YiDongUpdateActivityStatus(activityId int) {
 	err = cygx.UpdateCygxActivityTencentConferenceNumber(activityInfo)
 	return
 }
+
+// GetLoginAuthCodeReq 获取登录编码请求体
+type GetYiDongActivityByApiReq struct {
+	MeetingStatus   string `json:"meetingStatus" description:"会议状态必需(0未开始1进行中2已结束)多个逗号分隔"`
+	ConveneStartStr string `json:"conveneStartStr" description:"活动日期范围开始"`
+	ConveneEndStr   string `json:"conveneEndStr" description:"活动日期范围结束"`
+	LastUpdateTime  string `json:"lastUpdateTime" description:"上次同步时间(用于筛选更新时间大于同步时间的活动数据)"`
+}
+
+// 根据条件获取易董建会列表信息
+func GetYiDongActivityListByApi(param *GetYiDongActivityByApiReq) (yiDongResult []YidongActivityResult) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("根据条件获取易董建会列表信息  GetYiDongActivityListByApi"+err.Error(), param), 2)
+		}
+	}()
+	var token string
+	token, _ = GetYidongToken()
+	url := utils.YiDongZhengTongYunUrl + "interact/activityManageApi/getRoadshowList?access_token=" + token
+	method := "POST"
+	data, e := json.Marshal(param)
+	if e != nil {
+		err = errors.New("data json marshal err: " + e.Error())
+		return
+	}
+
+	payload := strings.NewReader(string(data))
+	client := &http.Client{}
+	req, e := http.NewRequest(method, url, payload)
+	if e != nil {
+		err = errors.New(" http.NewRequest err: " + e.Error())
+		return
+	}
+	req.Header.Add("Content-Type", "application/json")
+
+	res, e := client.Do(req)
+	if e != nil {
+		err = errors.New(" client.Do err: " + e.Error())
+		return
+	}
+	defer res.Body.Close()
+	var ApifoxModal *YidongApifoxModal
+	body, e := ioutil.ReadAll(res.Body)
+	if e != nil {
+		err = errors.New("  ioutil.ReadAll: " + e.Error())
+		return
+	}
+
+	//添加请求日志记录
+	itemApiLog := new(cygx.CygxThreeApiLog)
+	itemApiLog.CreateTime = time.Now()
+	itemApiLog.Source = 1
+	itemApiLog.Url = url
+	itemApiLog.Body = utils.ReplaceSpaceAndWrap(fmt.Sprint(payload))
+	itemApiLog.Result = string(body)
+	go cygx.AddCygxThreeApiLog(itemApiLog)
+
+	err = json.Unmarshal(body, &ApifoxModal)
+	if err != nil {
+		fmt.Println("Getres.PublicGetDate Err:", err.Error())
+		return
+	}
+	if len(ApifoxModal.Result) > 0 {
+		yiDongResult = ApifoxModal.Result
+	} else {
+		yiDongResult = make([]YidongActivityResult, 0)
+	}
+	return
+}
+
+type GetYiDongActivityMeetByActivityIdReq struct {
+	ActivityId string `json:"activityId" description:"活动ID"`
+}
+
+type YidongApifoxModaluser struct {
+	ErrorCode interface{}        `json:"errorCode"`
+	ErrorMsg  interface{}        `json:"errorMsg"`
+	Result    []YidongResultuser `json:"result"`
+	Success   bool               `json:"success"`
+	Timestamp int64              `json:"timestamp"`
+}
+
+// 根据条件获取易董活动ID获取到会信息
+func GetYiDongActivityMeetDataByaAtivityId(ativityId string) (yiDongResult []YidongResultuser) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("根据条件获取易董建会列表信息  GetYiDongActivityListByApi"+err.Error(), ativityId), 2)
+		}
+	}()
+	var token string
+	token, _ = GetYidongToken()
+	url := utils.YiDongZhengTongYunUrl + "interact/activityManageApi/getAttendPersonList?access_token=" + token
+	method := "POST"
+	param := new(GetYiDongActivityMeetByActivityIdReq)
+	param.ActivityId = ativityId
+	data, e := json.Marshal(param)
+	if e != nil {
+		err = errors.New("data json marshal err: " + e.Error())
+		return
+	}
+
+	payload := strings.NewReader(string(data))
+	client := &http.Client{}
+	req, e := http.NewRequest(method, url, payload)
+	if e != nil {
+		err = errors.New(" http.NewRequest err: " + e.Error())
+		return
+	}
+	req.Header.Add("Content-Type", "application/json")
+	res, e := client.Do(req)
+	if e != nil {
+		err = errors.New(" client.Do err: " + e.Error())
+		return
+	}
+	defer res.Body.Close()
+	var ApifoxModal *YidongApifoxModaluser
+	body, e := ioutil.ReadAll(res.Body)
+	if e != nil {
+		err = errors.New(" ioutil.ReadAll err: " + e.Error())
+		return
+	}
+	e = json.Unmarshal(body, &ApifoxModal)
+	if e != nil {
+		err = errors.New(" json.Unmarshal  err: " + e.Error())
+		return
+	}
+
+	//添加请求日志记录
+	itemApiLog := new(cygx.CygxThreeApiLog)
+	itemApiLog.CreateTime = time.Now()
+	itemApiLog.Source = 1
+	itemApiLog.Url = url
+	itemApiLog.Body = utils.ReplaceSpaceAndWrap(fmt.Sprint(payload))
+	itemApiLog.Result = string(body)
+	go cygx.AddCygxThreeApiLog(itemApiLog)
+
+	err = json.Unmarshal(body, &ApifoxModal)
+	if err != nil {
+		fmt.Println("Getres.PublicGetDate Err:", err.Error())
+		return
+	}
+	if len(ApifoxModal.Result) > 0 {
+		yiDongResult = ApifoxModal.Result
+	} else {
+		yiDongResult = make([]YidongResultuser, 0)
+	}
+	return
+}
+
+// 根据条件获取易董活动ID获取到会信息
+func GetYiDongActivityMeeting(yidongActivityId string, cygxActivityId int) (yiDongResult []YidongResultuser) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("根据条件获取易董建会列表信息  GetYiDongActivityMeeting"+err.Error(), cygxActivityId), 2)
+		}
+	}()
+
+	//跟易董返回的用户状态修改活动以提交到会状态
+	e := cygx.UpdateCygxActivitySubmitMeetingByYidong(yidongActivityId)
+	if e != nil {
+		err = errors.New("UpdateCygxActivitySubmitMeetingByYidong err: " + e.Error())
+		return
+	}
+	meetDataList := GetYiDongActivityMeetDataByaAtivityId(yidongActivityId)
+	var mobiles []string
+	var mobileStr string
+	var mobileStrMeet string
+	mapActivityAttendanceDetail := make(map[string]*cygx.CygxActivityAttendanceDetail)
+	if len(meetDataList) > 0 {
+
+		var itemsUpdate []*cygx.CygxActivitySignupDetail
+		needAddAttendanc := make([]*cygx.CygxActivityAttendanceDetail, 0)
+
+		for _, vresult := range meetDataList {
+			if vresult.PersonTelephone == "" {
+				continue
+			}
+			if vresult.Duration != "" || vresult.DurationReview != "" {
+				mobiles = append(mobiles, vresult.PersonTelephone)
+				var itemDetail = new(cygx.CygxActivitySignupDetail)
+				if vresult.Duration != "" {
+					itemDetail.FirstMeetingTime = vresult.StartTime
+					itemDetail.LastMeetingTime = vresult.EndTime
+					itemDetail.Duration = vresult.Duration
+					itemDetail.MeetingStatusStr = "直播"
+				} else if vresult.DurationReview != "" {
+					itemDetail.FirstMeetingTime = vresult.StartTimeReview
+					itemDetail.LastMeetingTime = vresult.EndTimeReview
+					itemDetail.Duration = vresult.DurationReview
+					itemDetail.MeetingStatusStr = "回放"
+				}
+				itemDetail.Position = vresult.JobName
+				itemDetail.RealName = vresult.PersonName
+
+				itemDetail.Mobile = vresult.PersonTelephone
+				itemDetail.OutboundMobile = vresult.PersonTelephone
+				itemDetail.IsMeeting = 1
+				itemDetail.ActivityId = cygxActivityId
+				mapActivityAttendanceDetail[vresult.PersonTelephone] = new(cygx.CygxActivityAttendanceDetail)
+				mapActivityAttendanceDetail[vresult.PersonTelephone].FirstMeetingTime = vresult.StartTime
+				mapActivityAttendanceDetail[vresult.PersonTelephone].LastMeetingTime = vresult.EndTime
+				mapActivityAttendanceDetail[vresult.PersonTelephone].Duration = utils.GetAttendanceDetailSecondsByYiDong(vresult.Duration)
+				itemsUpdate = append(itemsUpdate, itemDetail)
+			}
+
+			item := new(cygx.CygxActivityAttendanceDetail)
+			item.ActivityId = cygxActivityId
+			item.Mobile = vresult.PersonTelephone
+			if vresult.Duration != "" {
+				if vresult.Duration != "" {
+					item.FirstMeetingTime = vresult.StartTime
+					item.LastMeetingTime = vresult.EndTime
+					item.Duration = vresult.Duration
+					item.MeetingStatusStr = "直播"
+				} else if vresult.DurationReview != "" {
+					item.FirstMeetingTime = vresult.StartTimeReview
+					item.LastMeetingTime = vresult.EndTimeReview
+					item.Duration = vresult.DurationReview
+					item.MeetingStatusStr = "回放"
+				}
+				item.Position = vresult.JobName
+				item.RealName = vresult.PersonName
+
+				item.FirstMeetingTime = vresult.StartTime
+				item.LastMeetingTime = vresult.EndTime
+				item.Duration = vresult.Duration
+				item.IsMeetingStr = 1
+				mobileStrMeet += "'" + vresult.PersonTelephone + "'" + ","
+				item.CreateTime = time.Now()
+				needAddAttendanc = append(needAddAttendanc, item)
+			}
+			mobileStr += "'" + vresult.PersonTelephone + "'" + ","
+
+		}
+		lenmobiles := len(mobiles)
+		if lenmobiles > 0 {
+			var parsYd []interface{}
+			var conditionYd string
+			conditionYd = ` AND mobile  IN (` + utils.GetOrmInReplace(lenmobiles) + `) AND  activity_id=?  `
+			parsYd = append(parsYd, mobiles, cygxActivityId)
+			e = cygx.UpdateCygxActivitySignupisMeetList(conditionYd, parsYd)
+			if e != nil {
+				err = errors.New("UpdateCygxActivitySignupisMeetList err: " + e.Error())
+				return
+			}
+			e = cygx.UpdateActivitySignupDetailMultiByYiDong(itemsUpdate)
+			if e != nil {
+				err = errors.New("UpdateActivitySignupDetailMultiByYiDong err: " + e.Error())
+				return
+			}
+		}
+
+		mobileStr = strings.TrimRight(mobileStr, ",")
+		if mobileStr == "" {
+			mobileStr = "1"
+		}
+		mobileStrMeet = strings.TrimRight(mobileStrMeet, ",")
+		if mobileStrMeet == "" {
+			mobileStrMeet = "1"
+		}
+
+		listUser, e := cygx.GetWxUserOutboundMobile(mobileStr)
+		if e != nil {
+			err = errors.New("GetWxUserOutboundMobile err: " + e.Error())
+			return
+		}
+		for kAdd, vAdd := range needAddAttendanc {
+			for _, v2 := range listUser {
+				if v2.OutboundMobile == vAdd.Mobile || v2.Mobile == vAdd.Mobile {
+					if needAddAttendanc[kAdd].CompanyId <= 1 {
+						needAddAttendanc[kAdd].CompanyId = v2.CompanyId
+						needAddAttendanc[kAdd].SellerName = v2.SellerName
+						needAddAttendanc[kAdd].CompanyName = v2.CompanyName
+						//needAddAttendanc[k].IsMeetingStr = 1
+					}
+				}
+			}
+		}
+
+		//参会记录
+		e = cygx.AddAttendancDetail(needAddAttendanc, cygxActivityId, mobileStrMeet)
+		if e != nil {
+			err = errors.New("AddAttendancDetail err: " + e.Error())
+			return
+		}
+		////处理是否限制报名
+		e = AddCygxActivityRestrictSignupByAdmin(cygxActivityId)
+		if e != nil {
+			err = errors.New("AddCygxActivityRestrictSignupByAdmin err: " + e.Error())
+			return
+		}
+		AddctivitySignupDetailListByHand(needAddAttendanc, cygxActivityId)
+	}
+	return
+}

+ 36 - 4
services/roadshow/calendar.go

@@ -294,6 +294,15 @@ func getCurl(urlStr string, params url.Values, num int) (body []byte, err error)
 		err = errors.New(response.Msg)
 		return
 	}
+
+	itemApiLog := new(roadshow.RsCalendarApiLog)
+	itemApiLog.CreateTime = time.Now()
+	itemApiLog.Remark = "get请求上海接口"
+	itemApiLog.Url = getUrl
+	itemApiLog.Body = utils.ReplaceSpaceAndWrap(fmt.Sprint(params))
+	itemApiLog.Result = string(body)
+	go roadshow.AddRsCalendarApiLog(itemApiLog)
+
 	return
 }
 
@@ -342,7 +351,13 @@ func postCurl(urlStr string, form url.Values, num int) (body []byte, err error,
 		return
 	}
 	utils.FileLog.Info(fmt.Sprint("post request url:", finalUrl, ";params:", form.Encode(), ";response:", string(body)))
-
+	itemApiLog := new(roadshow.RsCalendarApiLog)
+	itemApiLog.CreateTime = time.Now()
+	itemApiLog.Remark = "post请求上海接口"
+	itemApiLog.Url = urlStr
+	itemApiLog.Body = utils.ReplaceSpaceAndWrap(fmt.Sprint(form))
+	itemApiLog.Result = string(body)
+	go roadshow.AddRsCalendarApiLog(itemApiLog)
 	//如果是token失效,同时只是第一次请求(没有尝试强制刷新token,那么重新请求)
 	if response.Code == 4001 && num <= 0 {
 		//token失效
@@ -378,6 +393,9 @@ func GetAccessToken(isRefresh bool) (token string, err error) {
 
 // CalendarToSH 创建活动时同步上海的前置函数
 func CalendarToSH(rsCalendar roadshow.RsCalendar, researcher roadshow.RsCalendarResearcher) {
+	if researcher.Status != 2 { //研究员的路演申请,需要研究员接受后,再同步到老CRM
+		return
+	}
 	var err error
 	errMsg := ``
 	defer func() {
@@ -405,7 +423,7 @@ func CalendarToSH(rsCalendar roadshow.RsCalendar, researcher roadshow.RsCalendar
 	endTime := eTime.Format("2006-01-02 15:04")
 
 	// 创建上海路演日程
-	err, errMsg = creatSHCalendar(userInfo.Mobile, researcherInfo.Mobile, rsCalendar.Title, startTime, endTime, 1, researcher.RsCalendarResearcherId)
+	err, errMsg = creatSHCalendar(userInfo.Mobile, researcherInfo.Mobile, rsCalendar.CompanyName+rsCalendar.Title, startTime, endTime, 1, researcher.RsCalendarResearcherId)
 	if err != nil {
 		utils.FileLog.Info("CreatSHCalendar err: " + err.Error())
 		fmt.Println(err)
@@ -568,6 +586,7 @@ func UpdateSHCalendarByMatter(req roadshow.UpdateMattersReq) (err error) {
 	if err != nil {
 		err = errors.New("GetRelationByPars err:" + err.Error())
 		fmt.Println(err)
+		return
 	}
 
 	sTime, _ := time.ParseInLocation(utils.FormatDateTime, req.StartDate+" "+req.StartTime, time.Now().Location())
@@ -576,7 +595,7 @@ func UpdateSHCalendarByMatter(req roadshow.UpdateMattersReq) (err error) {
 	endTime := eTime.Format("2006-01-02 15:04")
 	//发送更新请求
 
-	_, err = updateSHCalendar(fmt.Sprintf("%v", relationItem.ThirdCalendarId), relationItem.ResearcherMobile, req.MatterContent, startTime, endTime)
+	_, err = updateSHCalendar(fmt.Sprintf("%v", relationItem.ThirdCalendarId), relationItem.ResearcherMobile, relationItem.CustomerName+req.MatterContent, startTime, endTime)
 	if err == nil {
 		updateParams := make(map[string]interface{})
 		whereParams := make(map[string]interface{})
@@ -930,6 +949,7 @@ func SyncCalendarFromShanghai(userPhone, startDate, endDate string) (err error)
 		}
 	}
 
+	var itemsApiLog []*roadshow.RsCalendarApiLog
 	//上海那边已经删除了路演,这边也要同步删除
 	for _, deleteRsCalendarResearcherList := range deleteRsCalendarResearcherMap {
 		for _, deleteRsCalendarResearcher := range deleteRsCalendarResearcherList {
@@ -945,7 +965,14 @@ func SyncCalendarFromShanghai(userPhone, startDate, endDate string) (err error)
 				errMsgList = append(errMsgList, fmt.Sprint("第三方日历ID:", deleteRsCalendarResearcher.ThirdCalendarId, "删除关联关系失败;err:"+tmpErr.Error(), ";"))
 				continue
 			}
-
+			itemApiLog := new(roadshow.RsCalendarApiLog)
+			itemApiLog.CreateTime = time.Now()
+			itemApiLog.Remark = "对比上海接口之后手动删除"
+			itemApiLog.Url = fmt.Sprint("userPhone", userPhone, "currDay", currDay, "endDate", endDate)
+			itemApiLog.Body = ""
+			itemApiLog.Result = ""
+			itemApiLog.RsCalendarResearcherId = deleteRsCalendarResearcher.RsCalendarResearcherId
+			itemsApiLog = append(itemsApiLog, itemApiLog)
 			// 更新路演的同步字段
 			//calWhereParams := make(map[string]interface{})
 			//calUpdateParams := make(map[string]interface{})
@@ -954,6 +981,11 @@ func SyncCalendarFromShanghai(userPhone, startDate, endDate string) (err error)
 			//err = roadshow.UpdateRsCalendar(calWhereParams, calUpdateParams)
 		}
 	}
+
+	if len(itemsApiLog) > 0 {
+		go roadshow.AddRsCalendarApiLogList(itemsApiLog)
+	}
+
 	return
 }
 

+ 13 - 5
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)
+	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)
 	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) (sealInfo *seal.Seal, err error) {
+func addSeal(userId, contractId, fileNum int, userName, use, companyName, useCompanyName, creditCode, serviceType, sealType, remark string, fileUrls []string, affiliatedCompany string) (sealInfo *seal.Seal, err error) {
 	if !strings.Contains(strings.Join(seal.EnumUse, ","), use) {
 		err = errors.New("用印用途异常")
 		return
@@ -177,6 +177,7 @@ func addSeal(userId, contractId, fileNum int, userName, use, companyName, useCom
 		ContractId:     contractId,
 		ModifyTime:     now,
 		CreateTime:     now,
+		AffiliatedCompany:  affiliatedCompany,
 	}
 	err = seal.AddSeal(sealInfo)
 	if err != nil {
@@ -213,7 +214,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)
+	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)
 	if err != nil {
 		return
 	}
@@ -230,7 +231,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) (sealInfo *seal.Seal, err error) {
+func editSeal(sealId, userId, contractId, fileNum int, use, companyName, userCompanyName, creditCode, serviceType, sealType, remark string, fileUrls []string, affiliatedCompany string) (sealInfo *seal.Seal, err error) {
 	if !strings.Contains(strings.Join(seal.EnumUse, ","), use) {
 		err = errors.New("用印用途异常")
 		return
@@ -276,7 +277,8 @@ func editSeal(sealId, userId, contractId, fileNum int, use, companyName, userCom
 	sealInfo.ModifyTime = now
 	sealInfo.CreateTime = now // 更新提交时间
 	sealInfo.Status = "待提交"
-	err = sealInfo.Update([]string{"Use", "CompanyName", "UseCompanyName", "CreditCode", "ServiceType", "SealType", "Remark", "FileUrl", "FileNum", "ContractId", "ModifyTime", "CreateTime", "Status"})
+	sealInfo.AffiliatedCompany = affiliatedCompany
+	err = sealInfo.Update([]string{"Use", "CompanyName", "UseCompanyName", "CreditCode", "ServiceType", "SealType", "Remark", "FileUrl", "FileNum", "ContractId", "ModifyTime", "CreateTime", "Status", "AffiliatedCompany"})
 	if err != nil {
 		return
 	}
@@ -365,6 +367,10 @@ func VerifierEditApply(sysUser *system.Admin, req request.SealApprovalEditReq) (
 		updateContent = append(updateContent, "文件附件")
 		attachmentFlag = true
 	}
+	if sealInfo.AffiliatedCompany != req.AffiliatedCompany {
+		updateCol = append(updateCol, "AffiliatedCompany")
+		updateContent = append(updateContent, "归属公司")
+	}
 	if len(updateCol) <= 0 {
 		err = errors.New("没有变更信息")
 		return
@@ -393,6 +399,7 @@ func VerifierEditApply(sysUser *system.Admin, req request.SealApprovalEditReq) (
 		sealInfo.FileNum = req.FileNum
 		sealInfo.FileUrl = newFileUrl
 		sealInfo.ModifyTime = time.Now()
+		sealInfo.AffiliatedCompany = req.AffiliatedCompany
 		verifierEdit(sealInfo, updateCol, approvalRecord.ContractApprovalRecordId, content, sysUser, attachmentFlag, req.FileUrls)
 		// 重新获取最新的用印单
 		sealInfo, tmpErr := seal.GetSealInfoById(sealInfo.SealId)
@@ -413,6 +420,7 @@ func VerifierEditApply(sysUser *system.Admin, req request.SealApprovalEditReq) (
 		sealInfo.FileNum = req.FileNum
 		sealInfo.FileUrl = newFileUrl
 		sealInfo.ModifyTime = time.Now()
+		sealInfo.AffiliatedCompany = req.AffiliatedCompany
 		verifierEdit(sealInfo, updateCol, approvalRecord.ContractApprovalRecordId, content, sysUser, attachmentFlag, req.FileUrls)
 		// 审核通过
 		err = ApprovedApproval(sealInfo.SealId, sysUser, "")

+ 29 - 12
services/wechat_send_category_template_msg.go

@@ -306,7 +306,9 @@ func SendWxCategoryMsgWithCygxActivityUpdateLimitPeople(activityId int) (err err
 		return
 	}
 	//已经推送过的不做二次推送
-	listSendOpendId, err := models.GeUserTemplateRecordListBysendType(utils.TEMPLATE_MSG_CYGX_ACTIVITY_LIMIT_PEOPLE, strconv.Itoa(activityId))
+	//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
 	}
@@ -345,16 +347,21 @@ func SendWxCategoryMsgWithCygxActivityUpdateLimitPeople(activityId int) (err err
 		err = errors.New("GetWxOpenIdBList, Err: " + e.Error())
 		return
 	}
-	if len(openIdList) == 0 {
-		return
-	}
-	openIdArr := make([]string, len(openIdList))
-	for i, v := range openIdList {
-		if mapSendOpenid[v.OpenId] > 0 {
-			continue
-		}
-		openIdArr[i] = v.OpenId
+
+	var openiditems []*cygx.CygxActivityUserTemplateRecord
+	var openIdArr []string
+	for _, v := range openIdList {
+		//openIdArr[i] = v.OpenId
+		openIdArr = append(openIdArr, v.OpenId)
+		openiditem := new(cygx.CygxActivityUserTemplateRecord)
+		openiditem.ActivityId = activityId
+		openiditem.UserId = v.UserId
+		openiditem.OpenId = v.OpenId
+		openiditem.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_LIMIT_PEOPLE
+		openiditem.CreateTime = time.Now()
+		openiditems = append(openiditems, openiditem)
 	}
+
 	keyword1 := utils.TruncateActivityNameString(activityInfo.ActivityName)
 	keyword2 := "活动名额增加"
 	keyword3 := "名额增至" + activityInfo.LimitPeopleNum + "人,欢迎报名"
@@ -374,6 +381,16 @@ func SendWxCategoryMsgWithCygxActivityUpdateLimitPeople(activityId int) (err err
 		err = errors.New("SendTemplateMsg, Err: " + e.Error())
 		return
 	}
+
+	//活动发布推送的Openid记录
+	if len(openiditems) > 0 {
+		e := cygx.AddCygxActivityUserTemplateRecordMulti(openiditems)
+		if e != nil {
+			err = errors.New("AddCygxActivityUserTemplateRecordMulti, Err: " + e.Error())
+			return
+		}
+	}
+
 	return
 }
 
@@ -578,7 +595,7 @@ func SendWxCategoryMsgWithCygxActivitySignUpBySell(items []*cygx.CygxSignupUser)
 			keyword2 := wxUser.CompanyName
 			keyword3 := sellerItem.RealName
 			keyword4 := resultTime.Format(utils.FormatDateTimeMinute2)
-			keyword5 := utils.TruncateActivityNameString("报名:"+activityInfo.ActivityName)
+			keyword5 := utils.TruncateActivityNameString("报名:" + activityInfo.ActivityName)
 
 			sendInfo := new(SendWxCategoryTemplate)
 			sendInfo.Keywords = []string{keyword1, keyword2, keyword3, keyword4, keyword5}
@@ -810,7 +827,7 @@ func SendWxCategoryMsgWithYxActivityCancelSignUpBySell(uid, activityId int) (err
 	keyword2 := wxUser.CompanyName
 	keyword3 := sellerItem.RealName
 	keyword4 := resultTime.Format(utils.FormatDateTimeMinute2)
-	keyword5 := utils.TruncateActivityNameString("取消报名:"+activityInfo.ActivityName)
+	keyword5 := utils.TruncateActivityNameString("取消报名:" + activityInfo.ActivityName)
 
 	sendInfo := new(SendWxCategoryTemplate)
 	sendInfo.Keywords = []string{keyword1, keyword2, keyword3, keyword4, keyword5}

+ 8 - 0
utils/common.go

@@ -2353,3 +2353,11 @@ func TruncateActivityNameString(s string) string {
 func GetLikeKeyword(keyword string) string {
 	return `%` + keyword + `%`
 }
+
+// 用户参会时间转换
+func GetAttendanceDetailSecondsByYiDong(str string) string {
+	var timeStr string
+	timeStr = strings.Replace(str, ":", "'", -1)
+	timeStr += "''"
+	return timeStr
+}

+ 4 - 0
utils/constants.go

@@ -405,6 +405,7 @@ const (
 	CYGX_LYJH                               string = "路演精华"
 	PERMISSION_ID_UPGRADE                   int    = 100000 //行业权限升级的时候所添加的起步值
 	CYGX_TACTICS_TIME_LINE_STATUS           string = "cygx_tactics_time_line_status"
+	CYGX_GUSHOU_TIME_LINE_STATUS            string = "cygx_gushou_time_line_status"     //固收时间线展示配置
 	CYGX_TAG_HOT_ACTIVITY_ID                string = "cygx_tag_hot_activity_id"         //标签管理自定义的热门活动ID
 	TEMPLATE_MSG_CYGX_ACTIVITY_LIMIT_PEOPLE int    = 1001                               //查研观向修改活动人数限制之后,对于因为人数已满而失败的用户,推送模板消息 1001
 	YI_DONG_ZHENG_TONG_YUN_TOKEN_KEY        string = "YI_DONG_ZHENG_TONG_YUN_TOKEN_KEY" //易董证通云的token,存Redis使用
@@ -423,6 +424,7 @@ const (
 	CHART_PERMISSION_NAME_45W                      = "45w大套餐" // 权益45w大套餐名称
 	CHART_PERMISSION_ID_45W                        = 2002     // 权益45w大套餐表示的权限ID(自定义)
 	HONG_GUAN_NAME                          string = "宏观"
+	CYGX_ARTICLE_TIME_LINE_KEY                     = "CYGX_ARTICLE_TIME_LINE_KEY" //产业时间线关联的文章key
 )
 
 // 权益cygx_config配置主键以后放这里
@@ -455,6 +457,8 @@ const (
 	CYGX_OBJ_YANXUANSPECIAL     string = "yanxuanspecial"     // 对象类型:研选专栏
 	CYGX_OBJ_ASKSERIEVIDEO      string = "askserievideo"      // 对象类型:问答系列视频
 	CYGX_OBJ_RS_CALENDAR        string = "rscalendar"         // 对象类型:研究员日历安排
+	CYGX_OBJ_FICC_REPORT        string = "ficcreport"         // 对象类型:FICC研报
+	CYGX_OBJ_FICC_REPORT_XCX    string = "ficcreportxcx"      // 对象类型:FICC研报小程序
 )
 
 const (