Browse Source

Merge branch 'master' of http://8.136.199.33:3000/hongze/hz_crm_api into cygx/cygx_12.1

xingzai 1 year ago
parent
commit
43f807cf66
73 changed files with 5186 additions and 1569 deletions
  1. 1 1
      .gitignore
  2. 2 2
      controllers/base_auth.go
  3. 107 0
      controllers/company_apply.go
  4. 384 151
      controllers/company_user.go
  5. 108 54
      controllers/cygx/activity_meet.go
  6. 292 100
      controllers/cygx/activity_signup.go
  7. 12 7
      controllers/cygx/activity_special_trip.go
  8. 6 2
      controllers/cygx/apply_record.go
  9. 1198 0
      controllers/cygx/contract_allocation.go
  10. 59 23
      controllers/cygx/interview_apply.go
  11. 16 15
      controllers/cygx/report_article.go
  12. 21 6
      controllers/cygx/report_selection.go
  13. 20 27
      controllers/cygx/search_keyword.go
  14. 11 6
      controllers/cygx/summary_manage.go
  15. 116 11
      controllers/cygx/user.go
  16. 296 0
      controllers/cygx/yanxuan_special.go
  17. 2 1
      controllers/day_new.go
  18. 8 0
      controllers/eta_business/eta_business.go
  19. 1 13
      controllers/roadshow/company.go
  20. 3 3
      controllers/user_login.go
  21. 23 1
      models/chart_permission.go
  22. 16 0
      models/company/company_apply.go
  23. 47 1
      models/company/company_contract.go
  24. 23 0
      models/company/company_product.go
  25. 104 309
      models/company/company_user.go
  26. 11 3
      models/cygx/activity_ask_email.go
  27. 2 2
      models/cygx/activity_attendance_detail.go
  28. 1 0
      models/cygx/activity_help_ask.go
  29. 4 1
      models/cygx/activity_meet.go
  30. 1 1
      models/cygx/activity_signup.go
  31. 1 1
      models/cygx/activity_special.go
  32. 250 0
      models/cygx/allocation_company_contract.go
  33. 2 11
      models/cygx/apply_record.go
  34. 6 9
      models/cygx/chart.go
  35. 92 0
      models/cygx/company_contract.go
  36. 6 6
      models/cygx/cygx_user.go
  37. 13 12
      models/cygx/cygx_user_company.go
  38. 83 4
      models/cygx/cygx_user_record.go
  39. 151 0
      models/cygx/cygx_yanxuan_special.go
  40. 78 0
      models/cygx/cygx_yanxuan_special_user.go
  41. 28 0
      models/cygx/industry_fllow.go
  42. 16 3
      models/cygx/report_article.go
  43. 1 1
      models/cygx/report_mapping_cygx.go
  44. 8 0
      models/cygx/resource_data.go
  45. 3 3
      models/cygx/summary_manage.go
  46. 7 1
      models/db.go
  47. 13 1
      models/help_doc/classify.go
  48. 15 0
      models/report.go
  49. 56 1
      models/research_report.go
  50. 148 0
      models/user_report_view_record.go
  51. 88 60
      models/user_view_history.go
  52. 18 251
      models/wechat_send_msg.go
  53. 30 1
      models/wx_user.go
  54. 90 0
      routers/commentsRouter.go
  55. 2 0
      routers/router.go
  56. 109 62
      services/company.go
  57. 3 2
      services/company_apply/company_approval.go
  58. 7 9
      services/company_approval_message.go
  59. 28 7
      services/company_permission.go
  60. 36 0
      services/company_product.go
  61. 25 85
      services/cygx/acitvity.go
  62. 23 3
      services/cygx/activity_power_check.go
  63. 124 11
      services/cygx/activity_signup.go
  64. 38 1
      services/cygx/admin_power.go
  65. 256 0
      services/cygx/contract_allocation.go
  66. 273 0
      services/cygx/cygx_yanxuan_special.go
  67. 6 6
      services/cygx/research_summary.go
  68. 15 42
      services/cygx/special_wx_msg.go
  69. 40 0
      services/cygx/user_remind.go
  70. 35 0
      services/elastic/es_comprehensive.go
  71. 30 225
      services/wechat_send_msg.go
  72. 12 0
      utils/common.go
  73. 26 11
      utils/constants.go

+ 1 - 1
.gitignore

@@ -15,4 +15,4 @@
 *DS_Store
 /static/images/*.svg
 hz_crm_api.exe
-hz_crm_api.exe~
+hz_crm_api.exe~

+ 2 - 2
controllers/base_auth.go

@@ -185,10 +185,10 @@ func (this *BaseAuthController) Prepare() {
 					this.StopRun()
 					return
 				}
-				utils.Rc.Put(loginKey, "1", 30*time.Minute)
+				utils.Rc.Put(loginKey, "1", utils.LoginCacheTime*time.Minute)
 				// 不信任名单也同步更新
 				noTrustLoginKey := fmt.Sprint(utils.CACHE_ACCESS_TOKEN_LOGIN_NO_TRUST, admin.AdminId)
-				utils.Rc.Put(noTrustLoginKey, session.Id, 30*time.Minute)
+				utils.Rc.Put(noTrustLoginKey, session.Id, utils.LoginCacheTime*time.Minute)
 			}
 
 			admin.RoleTypeCode = GetSysUserRoleTypeCode(admin.RoleTypeCode)

+ 107 - 0
controllers/company_apply.go

@@ -2306,3 +2306,110 @@ func (this *CompanyApplyController) GetLastContractDetailWithoutDate() {
 	br.Msg = "获取成功"
 	br.Data = contractInfo
 }
+
+// @Title 申请服务更新-签约历史(单个详情)
+// @Description 申请服务更新-签约历史接口(单个详情)
+// @Param   ContractCode   query   string  true       "合同编码"
+// @Success 200 {object} company.CompanyContractHistoryResp
+// @router /apply/contract/history/detail [get]
+func (this *CompanyApplyController) ApplyContractHistoryDetail() {
+	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
+	}
+	contractCode := this.GetString("ContractCode")
+	if contractCode == "" {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误,客户id小于等于0"
+		return
+	}
+	roleTypeCode := sysUser.RoleTypeCode
+	productId := services.GetProductId(roleTypeCode)
+
+	list, err := company.GetCompanyContractHistoryListByContractCode(contractCode)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取信息失败,Err:" + err.Error()
+		return
+	}
+	listLen := len(list)
+	if listLen == 0 {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "签约信息不存在 contractCode:" + contractCode
+		return
+	}
+	expMap := map[int]string{0: "(3w)", 1: "(5w)"} // 买方研选价格
+	for i := 0; i < listLen; i++ {
+		companyContract := list[i]
+		list[i].ModifyTimeStr = companyContract.ModifyTime.Format(utils.FormatDateTime)
+		productId = list[i].ProductId
+		if productId == utils.COMPANY_PRODUCT_RAI_ID {
+			//classifyName := "权益"
+			checkList := make([]int, 0)
+			plist := new(company.ContractPermissionList)
+			hasPermissions, e := company.GetCompanyContractPermissionByCompanyContractId(companyContract.CompanyContractId)
+			if e != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取合同权限信息失败,Err:" + e.Error()
+				return
+			}
+			hasMap := make(map[int]*company.CompanyContractPermission)
+			for _, p := range hasPermissions {
+				hasMap[p.ChartPermissionId] = p
+			}
+			checkItems := make([]*company.PermissionLookItem, 0)
+			// PS:本来想把这个移到循环外面去优化一下...但是发现有指针引用变量被改掉的问题, BUG太多了改不完了先这样吧=_=!
+			raiPermissions, e := company.GetPermissionLookItemsExt("2", utils.COMPANY_PRODUCT_RAI_NAME)
+			if e != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取权益权限列表失败, Err: " + e.Error()
+				return
+			}
+
+			for _, n := range raiPermissions {
+				match := hasMap[n.ChartPermissionId]
+				if match == nil {
+					continue
+				}
+				// 升级
+				if match.IsUpgrade == 1 {
+					n.IsUpgrade = 1
+					checkList = append(checkList, n.ChartPermissionId)
+					checkItems = append(checkItems, n)
+					continue
+				}
+				// 买方研选(3w/5w)
+				if n.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN {
+					n.PermissionName += expMap[match.ExpensiveYx]
+					checkList = append(checkList, n.ChartPermissionId)
+					checkItems = append(checkItems, n)
+					continue
+				}
+				checkList = append(checkList, n.ChartPermissionId)
+				checkItems = append(checkItems, n)
+			}
+			plist.Items = checkItems
+			plist.ClassifyName = utils.COMPANY_PRODUCT_RAI_NAME
+			plist.CheckList = checkList
+			list[i].PermissionList = append(list[i].PermissionList, plist)
+
+			// CRM8.8-权限主客观合并
+			newPermissionLookList := contractService.HandleEquityContractPermissionList(list[i].PermissionList)
+			list[i].PermissionList = newPermissionLookList
+		}
+	}
+	resp := new(company.CompanyContractHistoryResp)
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 384 - 151
controllers/company_user.go

@@ -12,6 +12,7 @@ import (
 	"hongze/hz_crm_api/models/company_user"
 	"hongze/hz_crm_api/models/company_user/request"
 	"hongze/hz_crm_api/models/company_user/response"
+	"hongze/hz_crm_api/models/cygx"
 	"hongze/hz_crm_api/models/system"
 	"hongze/hz_crm_api/models/yb"
 	"hongze/hz_crm_api/services"
@@ -966,64 +967,64 @@ func (this *CompanyUserController) List() {
 		//}
 
 		//报告统计删除晨报部分统计加入每日资讯 2021-4-9
-		//手机号
-		userViewMobileTotalMap := make(map[string]*models.UserViewMobileTotalSlice)
-		userReportViewMobileTotalMap := make(map[string]*models.ReportViewMobileRecord)
-		userAdvisoryViewMobileTotalMap := make(map[string]*advisory.UserViewMobileTotalSlice)
-		userCygxArticleHistoryRecordViewMobileTotalMap := make(map[string]*models.UserViewMobileTotalSlice)
-		if len(mobilesSlice) > 0 {
-			//用户浏览数据
-			userViewMobileTotalList, _ := models.GetCountUserViewHistoryByMobiles(mobileStr)
-			for _, userViewMobile := range userViewMobileTotalList {
-				userViewMobileTotalMap[userViewMobile.Mobile] = userViewMobile
-			}
-
-			//每日点评手机号数据
-			userReportViewMobileTotalList, _ := models.GetReportViewMaxTimeByMobiles(mobileStr)
-			for _, userReportViewMobile := range userReportViewMobileTotalList {
-				userReportViewMobileTotalMap[userReportViewMobile.Mobile] = userReportViewMobile
-			}
-
-			//每日资讯
-			userAdvisoryViewMobileTotalList, _ := advisory.GetCountUserViewHistoryByMobiles(mobileStr)
-			//fmt.Println(userAdvisoryViewMobileTotalList)
-			for _, userAdvisoryViewMobile := range userAdvisoryViewMobileTotalList {
-				userAdvisoryViewMobileTotalMap[userAdvisoryViewMobile.Mobile] = userAdvisoryViewMobile
-			}
-			//查研观向
-			userCygxArticleHistoryRecordViewMobileTotalList, _ := models.GetCountCygxArticleHistoryRecordByMobiles(mobileStr)
-			for _, userCygxArticleHistoryRecordViewMobile := range userCygxArticleHistoryRecordViewMobileTotalList {
-				userCygxArticleHistoryRecordViewMobileTotalMap[userCygxArticleHistoryRecordViewMobile.Mobile] = userCygxArticleHistoryRecordViewMobile
-			}
-		}
+		////手机号
+		//userViewMobileTotalMap := make(map[string]*models.UserViewMobileTotalSlice)
+		//userReportViewMobileTotalMap := make(map[string]*models.ReportViewMobileRecord)
+		//userAdvisoryViewMobileTotalMap := make(map[string]*advisory.UserViewMobileTotalSlice)
+		//userCygxArticleHistoryRecordViewMobileTotalMap := make(map[string]*models.UserViewMobileTotalSlice)
+		//if len(mobilesSlice) > 0 {
+		//	//用户浏览数据
+		//	userViewMobileTotalList, _ := models.GetCountUserViewHistoryByMobiles(mobileStr)
+		//	for _, userViewMobile := range userViewMobileTotalList {
+		//		userViewMobileTotalMap[userViewMobile.Mobile] = userViewMobile
+		//	}
+		//
+		//	//每日点评手机号数据
+		//	userReportViewMobileTotalList, _ := models.GetReportViewMaxTimeByMobiles(mobileStr)
+		//	for _, userReportViewMobile := range userReportViewMobileTotalList {
+		//		userReportViewMobileTotalMap[userReportViewMobile.Mobile] = userReportViewMobile
+		//	}
+		//
+		//	//每日资讯
+		//	userAdvisoryViewMobileTotalList, _ := advisory.GetCountUserViewHistoryByMobiles(mobileStr)
+		//	//fmt.Println(userAdvisoryViewMobileTotalList)
+		//	for _, userAdvisoryViewMobile := range userAdvisoryViewMobileTotalList {
+		//		userAdvisoryViewMobileTotalMap[userAdvisoryViewMobile.Mobile] = userAdvisoryViewMobile
+		//	}
+		//	//查研观向
+		//	userCygxArticleHistoryRecordViewMobileTotalList, _ := models.GetCountCygxArticleHistoryRecordByMobiles(mobileStr)
+		//	for _, userCygxArticleHistoryRecordViewMobile := range userCygxArticleHistoryRecordViewMobileTotalList {
+		//		userCygxArticleHistoryRecordViewMobileTotalMap[userCygxArticleHistoryRecordViewMobile.Mobile] = userCygxArticleHistoryRecordViewMobile
+		//	}
+		//}
 
-		//邮箱
-		userViewEmailTotalMap := make(map[string]*models.UserViewEmailTotalSlice)
-		userReportViewEmailTotalMap := make(map[string]*models.ReportViewEmailRecord)
-		userAdvisoryViewEmailTotalMap := make(map[string]*advisory.UserViewEmailTotalSlice)
-		userCygxViewEmailTotalMap := make(map[string]*models.UserViewEmailTotalSlice)
-		if len(emailsSlice) > 0 {
-			//用户浏览数据
-			userViewEmailTotalList, _ := models.GetCountUserViewHistoryByEmails(emailStr)
-			for _, userViewEmail := range userViewEmailTotalList {
-				userViewEmailTotalMap[userViewEmail.Email] = userViewEmail
-			}
-			//每日点评手机号数据
-			userReportViewEmailTotalList, _ := models.GetReportViewMaxTimeByEmails(emailStr)
-			for _, userReportViewEmail := range userReportViewEmailTotalList {
-				userReportViewEmailTotalMap[userReportViewEmail.Email] = userReportViewEmail
-			}
-			//每日资讯
-			userAdvisoryViewEmailTotalList, _ := advisory.GetCountUserViewHistoryByEmails(emailStr)
-			for _, userAdvisoryViewEmail := range userAdvisoryViewEmailTotalList {
-				userAdvisoryViewEmailTotalMap[userAdvisoryViewEmail.Email] = userAdvisoryViewEmail
-			}
-			//查研观向
-			userCygxViewEmailTotalList, _ := models.GetCountCygxArticleHistoryRecordByEmails(emailStr)
-			for _, userCygxReportViewEmail := range userCygxViewEmailTotalList {
-				userCygxViewEmailTotalMap[userCygxReportViewEmail.Email] = userCygxReportViewEmail
-			}
-		}
+		////邮箱
+		//userViewEmailTotalMap := make(map[string]*models.UserViewEmailTotalSlice)
+		//userReportViewEmailTotalMap := make(map[string]*models.ReportViewEmailRecord)
+		//userAdvisoryViewEmailTotalMap := make(map[string]*advisory.UserViewEmailTotalSlice)
+		//userCygxViewEmailTotalMap := make(map[string]*models.UserViewEmailTotalSlice)
+		//if len(emailsSlice) > 0 {
+		//	//用户浏览数据
+		//	userViewEmailTotalList, _ := models.GetCountUserViewHistoryByEmails(emailStr)
+		//	for _, userViewEmail := range userViewEmailTotalList {
+		//		userViewEmailTotalMap[userViewEmail.Email] = userViewEmail
+		//	}
+		//	//每日点评手机号数据
+		//	userReportViewEmailTotalList, _ := models.GetReportViewMaxTimeByEmails(emailStr)
+		//	for _, userReportViewEmail := range userReportViewEmailTotalList {
+		//		userReportViewEmailTotalMap[userReportViewEmail.Email] = userReportViewEmail
+		//	}
+		//	//每日资讯
+		//	userAdvisoryViewEmailTotalList, _ := advisory.GetCountUserViewHistoryByEmails(emailStr)
+		//	for _, userAdvisoryViewEmail := range userAdvisoryViewEmailTotalList {
+		//		userAdvisoryViewEmailTotalMap[userAdvisoryViewEmail.Email] = userAdvisoryViewEmail
+		//	}
+		//	//查研观向
+		//	userCygxViewEmailTotalList, _ := models.GetCountCygxArticleHistoryRecordByEmails(emailStr)
+		//	for _, userCygxReportViewEmail := range userCygxViewEmailTotalList {
+		//		userCygxViewEmailTotalMap[userCygxReportViewEmail.Email] = userCygxReportViewEmail
+		//	}
+		//}
 
 		//获取联系人关联产品的条数
 		userSellerRelationTotalSlice, err := models.GetUserSellerRelationCountByUserIds(userIdStr)
@@ -1089,23 +1090,6 @@ func (this *CompanyUserController) List() {
 			item := list[i]
 			//企业名称
 			list[i].CompanyName = companyInfo.CompanyName
-			//手机号用户累计浏览次数
-			if userView, ok := userViewMobileTotalMap[item.Mobile]; ok {
-				list[i].ViewTotal += userView.Total
-				if userView.CreatedTime.After(list[i].LastViewTime) {
-					list[i].LastViewTime = userView.CreatedTime
-					list[i].LastViewTimeStr = userView.CreatedTime.Format(utils.FormatDateTime)
-				}
-			}
-			//邮箱用户累计浏览次数
-			if userView, ok := userViewEmailTotalMap[item.Email]; ok {
-				//总共浏览的报表数据需要调整为(手机号用户浏览晨报数+邮箱号用户浏览晨报数)
-				list[i].ViewTotal += userView.Total
-				if userView.CreatedTime.After(list[i].LastViewTime) {
-					list[i].LastViewTime = userView.CreatedTime
-					list[i].LastViewTimeStr = userView.CreatedTime.Format(utils.FormatDateTime)
-				}
-			}
 
 			if item.OpenId != "" {
 				list[i].IsRegister = true
@@ -1120,78 +1104,111 @@ func (this *CompanyUserController) List() {
 					list[i].IsRegister = false
 				}
 			}
-			//如果存在手机号用户日评数据,那么需要做处理
-			if reportView, ok := userReportViewMobileTotalMap[item.Mobile]; ok {
-				//对日评数据做校验,日评时间晚于晨报时间,那么将最近一次浏览时间替换
-				if reportView.LastViewTime.After(list[i].LastViewTime) {
-					list[i].LastViewTime = reportView.LastViewTime
-					list[i].LastViewTimeStr = reportView.LastViewTime.Format(utils.FormatDateTime)
-				}
-				//总共浏览的报表数据需要调整为(浏览晨报数+浏览日评数)
-				list[i].ViewTotal += reportView.ViewTotal
-			}
-			//如果存在手机号用户日评数据,那么需要做处理
-			if reportView, ok := userReportViewEmailTotalMap[item.Email]; ok {
-				//对日评数据做校验,日评时间晚于晨报时间,那么将最近一次浏览时间替换
-				if reportView.LastViewTime.After(list[i].LastViewTime) {
-					list[i].LastViewTime = reportView.LastViewTime
-					list[i].LastViewTimeStr = reportView.LastViewTime.Format(utils.FormatDateTime)
-				}
-				//总共浏览的报表数据需要调整为(浏览晨报数+浏览日评数)
-				list[i].ViewTotal += reportView.ViewTotal
-			}
 
-			//如果存在手机号用户每日资讯,那么需要做处理
-			if advisoryView, ok := userAdvisoryViewMobileTotalMap[item.Mobile]; ok {
-				//fmt.Println("蝴蝶眨几次眼睛")
-				//对每日资讯数据做校验,每日资讯时间晚日评报时间,那么将最近一次浏览时间替换
-				if advisoryView.CreatedTime.After(list[i].LastViewTime) {
-					list[i].LastViewTime = advisoryView.CreatedTime
-					list[i].LastViewTimeStr = advisoryView.CreatedTime.Format(utils.FormatDateTime)
-				}
-				//总共浏览的报表数据需要调整为(浏览晨报数+浏览日评数+每日资讯数)
-				list[i].ViewTotal += advisoryView.Total
-			}
-			//如果存在邮箱号用户每日资讯,那么需要做处理
-			if advisoryView, ok := userAdvisoryViewEmailTotalMap[item.Email]; ok {
-				//对每日资讯数据做校验,每日资讯时间晚日评报时间,那么将最近一次浏览时间替换
-				if advisoryView.CreatedTime.After(list[i].LastViewTime) {
-					list[i].LastViewTime = advisoryView.CreatedTime
-					list[i].LastViewTimeStr = advisoryView.CreatedTime.Format(utils.FormatDateTime)
-				}
-				//总共浏览的报表数据需要调整为(浏览晨报数+浏览日评数+每日资讯数)
-				list[i].ViewTotal += advisoryView.Total
-			}
+			////手机号用户累计浏览次数
+			//if userView, ok := userViewMobileTotalMap[item.Mobile]; ok {
+			//	list[i].ViewTotal += userView.Total
+			//	if userView.CreatedTime.After(list[i].LastViewTime) {
+			//		list[i].LastViewTime = userView.CreatedTime
+			//		list[i].LastViewTimeStr = userView.CreatedTime.Format(utils.FormatDateTime)
+			//	}
+			//}
+			////邮箱用户累计浏览次数
+			//if userView, ok := userViewEmailTotalMap[item.Email]; ok {
+			//	//总共浏览的报表数据需要调整为(手机号用户浏览晨报数+邮箱号用户浏览晨报数)
+			//	list[i].ViewTotal += userView.Total
+			//	if userView.CreatedTime.After(list[i].LastViewTime) {
+			//		list[i].LastViewTime = userView.CreatedTime
+			//		list[i].LastViewTimeStr = userView.CreatedTime.Format(utils.FormatDateTime)
+			//	}
+			//}
+			////如果存在手机号用户日评数据,那么需要做处理
+			//if reportView, ok := userReportViewMobileTotalMap[item.Mobile]; ok {
+			//	//对日评数据做校验,日评时间晚于晨报时间,那么将最近一次浏览时间替换
+			//	if reportView.LastViewTime.After(list[i].LastViewTime) {
+			//		list[i].LastViewTime = reportView.LastViewTime
+			//		list[i].LastViewTimeStr = reportView.LastViewTime.Format(utils.FormatDateTime)
+			//	}
+			//	//总共浏览的报表数据需要调整为(浏览晨报数+浏览日评数)
+			//	list[i].ViewTotal += reportView.ViewTotal
+			//}
+			////如果存在手机号用户日评数据,那么需要做处理
+			//if reportView, ok := userReportViewEmailTotalMap[item.Email]; ok {
+			//	//对日评数据做校验,日评时间晚于晨报时间,那么将最近一次浏览时间替换
+			//	if reportView.LastViewTime.After(list[i].LastViewTime) {
+			//		list[i].LastViewTime = reportView.LastViewTime
+			//		list[i].LastViewTimeStr = reportView.LastViewTime.Format(utils.FormatDateTime)
+			//	}
+			//	//总共浏览的报表数据需要调整为(浏览晨报数+浏览日评数)
+			//	list[i].ViewTotal += reportView.ViewTotal
+			//}
+			//
+			////如果存在手机号用户每日资讯,那么需要做处理
+			//if advisoryView, ok := userAdvisoryViewMobileTotalMap[item.Mobile]; ok {
+			//	//fmt.Println("蝴蝶眨几次眼睛")
+			//	//对每日资讯数据做校验,每日资讯时间晚日评报时间,那么将最近一次浏览时间替换
+			//	if advisoryView.CreatedTime.After(list[i].LastViewTime) {
+			//		list[i].LastViewTime = advisoryView.CreatedTime
+			//		list[i].LastViewTimeStr = advisoryView.CreatedTime.Format(utils.FormatDateTime)
+			//	}
+			//	//总共浏览的报表数据需要调整为(浏览晨报数+浏览日评数+每日资讯数)
+			//	list[i].ViewTotal += advisoryView.Total
+			//}
+			////如果存在邮箱号用户每日资讯,那么需要做处理
+			//if advisoryView, ok := userAdvisoryViewEmailTotalMap[item.Email]; ok {
+			//	//对每日资讯数据做校验,每日资讯时间晚日评报时间,那么将最近一次浏览时间替换
+			//	if advisoryView.CreatedTime.After(list[i].LastViewTime) {
+			//		list[i].LastViewTime = advisoryView.CreatedTime
+			//		list[i].LastViewTimeStr = advisoryView.CreatedTime.Format(utils.FormatDateTime)
+			//	}
+			//	//总共浏览的报表数据需要调整为(浏览晨报数+浏览日评数+每日资讯数)
+			//	list[i].ViewTotal += advisoryView.Total
+			//}
+			//
+			////如果存在手机号用户查研观向,那么需要做处理
+			//if cygxView, ok := userCygxArticleHistoryRecordViewMobileTotalMap[item.Mobile]; ok {
+			//	//对每日资讯数据做校验,每日资讯时间晚日评报时间,那么将最近一次浏览时间替换
+			//	if cygxView.CreatedTime.After(list[i].LastViewTime) {
+			//		list[i].LastViewTime = cygxView.CreatedTime
+			//		list[i].LastViewTimeStr = cygxView.CreatedTime.Format(utils.FormatDateTime)
+			//	}
+			//	//总共浏览的报表数据需要调整为(浏览晨报数+浏览日评数+每日资讯数+查研观向)
+			//	list[i].ViewTotal += cygxView.Total
+			//}
+			////如果存在邮箱号用户查研观向,那么需要做处理
+			//if cygxView, ok := userCygxViewEmailTotalMap[item.Email]; ok {
+			//	//对每日资讯数据做校验,每日资讯时间晚日评报时间,那么将最近一次浏览时间替换
+			//	if cygxView.CreatedTime.After(list[i].LastViewTime) {
+			//		list[i].LastViewTime = cygxView.CreatedTime
+			//		list[i].LastViewTimeStr = cygxView.CreatedTime.Format(utils.FormatDateTime)
+			//	}
+			//	//总共浏览的报表数据需要调整为(浏览晨报数+浏览日评数+每日资讯数+查研观向)
+			//	list[i].ViewTotal += cygxView.Total
+			//}
+			///*if reportView, ok := userReportViewTotalMap[int(item.UserId)]; ok {
+			//	//对日评数据做校验,日评时间晚于晨报时间,那么将最近一次浏览时间替换
+			//	if reportView.LastViewTime.After(list[i].LastViewTime) {
+			//		list[i].LastViewTime = reportView.LastViewTime
+			//		list[i].LastViewTimeStr = reportView.LastViewTime.Format(utils.FormatDateTime)
+			//	}
+			//	//总共浏览的报表数据需要调整为(浏览晨报数+浏览日评数)
+			//	list[i].ViewTotal += reportView.ViewTotal
+			//}*/
 
-			//如果存在手机号用户查研观向,那么需要做处理
-			if cygxView, ok := userCygxArticleHistoryRecordViewMobileTotalMap[item.Mobile]; ok {
-				//对每日资讯数据做校验,每日资讯时间晚日评报时间,那么将最近一次浏览时间替换
-				if cygxView.CreatedTime.After(list[i].LastViewTime) {
-					list[i].LastViewTime = cygxView.CreatedTime
-					list[i].LastViewTimeStr = cygxView.CreatedTime.Format(utils.FormatDateTime)
+			list[i].ViewTotal = list[i].FiccViewTotal + list[i].RaiViewTotal
+			var tmpLastViewTime time.Time
+			tmpLastViewTime = list[i].FiccLastViewTime
+
+			if !list[i].RaiLastViewTime.IsZero() {
+				if tmpLastViewTime.IsZero() || list[i].RaiLastViewTime.After(tmpLastViewTime) {
+					tmpLastViewTime = list[i].RaiLastViewTime
 				}
-				//总共浏览的报表数据需要调整为(浏览晨报数+浏览日评数+每日资讯数+查研观向)
-				list[i].ViewTotal += cygxView.Total
 			}
-			//如果存在邮箱号用户查研观向,那么需要做处理
-			if cygxView, ok := userCygxViewEmailTotalMap[item.Email]; ok {
-				//对每日资讯数据做校验,每日资讯时间晚日评报时间,那么将最近一次浏览时间替换
-				if cygxView.CreatedTime.After(list[i].LastViewTime) {
-					list[i].LastViewTime = cygxView.CreatedTime
-					list[i].LastViewTimeStr = cygxView.CreatedTime.Format(utils.FormatDateTime)
-				}
-				//总共浏览的报表数据需要调整为(浏览晨报数+浏览日评数+每日资讯数+查研观向)
-				list[i].ViewTotal += cygxView.Total
+
+			list[i].LastViewTime = tmpLastViewTime
+			if !tmpLastViewTime.IsZero() {
+				list[i].LastViewTimeStr = tmpLastViewTime.Format(utils.FormatDateTime)
 			}
-			/*if reportView, ok := userReportViewTotalMap[int(item.UserId)]; ok {
-				//对日评数据做校验,日评时间晚于晨报时间,那么将最近一次浏览时间替换
-				if reportView.LastViewTime.After(list[i].LastViewTime) {
-					list[i].LastViewTime = reportView.LastViewTime
-					list[i].LastViewTimeStr = reportView.LastViewTime.Format(utils.FormatDateTime)
-				}
-				//总共浏览的报表数据需要调整为(浏览晨报数+浏览日评数)
-				list[i].ViewTotal += reportView.ViewTotal
-			}*/
 
 			//如果有绑定数据,那么将数据返回对应的注册绑定数据
 			if _, ok := userRecordRegisterMap[int(item.UserId)]; ok {
@@ -2910,10 +2927,13 @@ Loop:
 	br.Data = resp
 }
 
+// ViewReportList
 // @Title 联系人阅读报告记录
 // @Description 联系人阅读报告记录
 // @Param   UserId   query   int  true       "用户id"
 // @Param   TxtType   query   int  true       "类型0全部,1权益,2ficc"
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   LastViewTime   query   string  true       "最近一次的阅读时间,没有的话,那就是获取最新数据"
 // @Success 200 {object} company.ViewReportListResp
 // @router /view/report/list [get]
 func (this *CompanyUserController) ViewReportList() {
@@ -2931,10 +2951,16 @@ func (this *CompanyUserController) ViewReportList() {
 	}
 	userId, _ := this.GetInt("UserId")
 	txtType, _ := this.GetInt("TxtType")
+	pageSize, _ := this.GetInt("PageSize")
+	lastViewTime := this.GetString("LastViewTime")
 	if userId <= 0 {
 		br.Msg = "参数错误"
 		return
 	}
+	// 默认20条数据
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
 
 	item, err := models.GetWxUserByUserId(userId)
 	if err != nil {
@@ -2943,28 +2969,235 @@ func (this *CompanyUserController) ViewReportList() {
 		return
 	}
 
-	list := make([]*company.ViewReportList, 0)
-
-	if item.Mobile != "" {
-		items, err := company.GetViewReportListByMobile(item.Mobile, txtType)
+	var lastViewTimeT time.Time
+	if lastViewTime != `` {
+		lastViewTimeT, err = time.ParseInLocation(utils.FormatDateTime, lastViewTime, time.Local)
 		if err != nil {
 			br.Msg = "获取失败"
-			br.Msg = "获取失败,Err:" + err.Error()
+			br.Msg = "最近一次阅读时间转换异常,Err:" + err.Error()
 			return
 		}
-		list = append(list, items...)
 	}
 
-	if item.Email != "" && item.Mobile == "" {
-		items, err := company.GetViewReportListByEmail2(item.Email, txtType)
+	list := make([]*company.ViewReportList, 0)
+	recordList := make([]*models.UserReportViewRecord, 0)
+
+	obj := models.UserReportViewRecord{}
+
+	var baseCondition string // 基础条件
+	var basePars []interface{}
+	if item.Mobile != "" {
+		baseCondition = ` AND mobile = ? `
+		basePars = append(basePars, item.Mobile)
+	} else if item.Email == "" {
+		baseCondition = ` AND email = ? `
+		basePars = append(basePars, item.Email)
+	}
+
+	// 阅读记录汇总数
+	total := item.FiccViewTotal + item.RaiViewTotal
+
+	switch txtType {
+	case 1:
+		baseCondition += ` AND source = ? `
+		basePars = append(basePars, 4)
+
+		total = item.RaiViewTotal
+		if lastViewTimeT.IsZero() {
+			if item.RaiLastViewTime != `` && item.RaiLastViewTime != `0000-00-00 00:00:00` {
+				lastViewTimeT, _ = time.ParseInLocation(utils.FormatDateTime, item.RaiLastViewTime, time.Local)
+			} else {
+				lastViewTimeT = time.Now()
+			}
+			lastViewTime = lastViewTimeT.Format(utils.FormatDateTime)
+		}
+	// 权益
+	case 2: // ficc
+		baseCondition += ` AND source in (?,?,?) `
+		basePars = append(basePars, 1, 2, 3)
+		total = item.FiccViewTotal
+
+		if lastViewTimeT.IsZero() {
+			if item.FiccLastViewTime != `` && item.FiccLastViewTime != `0000-00-00 00:00:00` {
+				lastViewTimeT, _ = time.ParseInLocation(utils.FormatDateTime, item.FiccLastViewTime, time.Local)
+			} else {
+				lastViewTimeT = time.Now()
+			}
+			lastViewTime = lastViewTimeT.Format(utils.FormatDateTime)
+		}
+	default:
+		if lastViewTimeT.IsZero() {
+			var ficcViewTime, raiViewTime time.Time
+			if item.FiccLastViewTime != `` && item.FiccLastViewTime != `0000-00-00 00:00:00` {
+				ficcViewTime, _ = time.ParseInLocation(utils.FormatDateTime, item.FiccLastViewTime, time.Local)
+			}
+			if item.RaiLastViewTime != `` && item.RaiLastViewTime != `0000-00-00 00:00:00` {
+				raiViewTime, _ = time.ParseInLocation(utils.FormatDateTime, item.RaiLastViewTime, time.Local)
+			}
+
+			// 如果两个都没有值的话,那么就是当前时间
+			if ficcViewTime.IsZero() && raiViewTime.IsZero() {
+				lastViewTimeT = time.Now()
+			} else if !ficcViewTime.IsZero() && !raiViewTime.IsZero() {
+				if ficcViewTime.After(raiViewTime) {
+					lastViewTimeT = ficcViewTime
+				} else {
+					lastViewTimeT = raiViewTime
+				}
+			} else if !ficcViewTime.IsZero() {
+				lastViewTimeT = ficcViewTime
+			} else {
+				lastViewTimeT = raiViewTime
+			}
+			// 默认要把最新的记录列出来,所以往后加1s
+			lastViewTime = lastViewTimeT.Add(1 * time.Second).Format(utils.FormatDateTime)
+		}
+	}
+
+	// 开始实际的查询
+	{
+		condition := baseCondition
+		pars := basePars
+
+		condition += `AND create_time <  ?`
+		pars = append(pars, lastViewTime)
+
+		total, items, err := obj.GetViewReportList(lastViewTimeT.Year(), condition, pars, pageSize)
 		if err != nil {
 			br.Msg = "获取失败"
 			br.Msg = "获取失败,Err:" + err.Error()
 			return
 		}
-		list = append(list, items...)
+
+		recordList = append(recordList, items...)
+
+		// 查询去年的表
+		if total < int64(pageSize) {
+			secondCondition := baseCondition
+			secondPars := basePars
+
+			secondCondition += `AND create_time <  ?`
+			secondPars = append(secondPars, lastViewTime)
+
+			_, items, err = obj.GetViewReportList(lastViewTimeT.Year(), secondCondition, secondPars, int(total)-pageSize)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.Msg = "获取失败,Err:" + err.Error()
+				return
+			}
+
+			recordList = append(recordList, items...)
+		}
+	}
+
+	viewReportMap := make(map[string]company.ViewReportList) // 阅读记录map
+	sourceReportIdListMap := make(map[int8][]int)
+
+	for _, v := range recordList {
+		tmpList, ok := sourceReportIdListMap[v.Source]
+		if !ok {
+			tmpList = make([]int, 0)
+		}
+		tmpList = append(tmpList, v.ReportId)
+		sourceReportIdListMap[v.Source] = tmpList
+
+		tmpTxtType := `ficc`
+		if v.Source == 4 {
+			tmpTxtType = `rights`
+		}
+		stopTime := `--`
+		if v.StopTime > 0 {
+			stopTime = fmt.Sprint(stopTime)
+		}
+		viewReportMap[fmt.Sprint(v.Source, "_", v.ReportId)] = company.ViewReportList{
+			ResearchReportName: "",
+			ReportType:         "",
+			CreatedTime:        v.CreateTime,
+			TxtType:            tmpTxtType,
+			MatchTypeName:      "--",
+			StopTime:           stopTime,
+		}
+	}
+
+	// 获取报告详情
+	for source, reportIdList := range sourceReportIdListMap {
+		switch source {
+		case 1: // rddp报告
+			tmpReportList, err := models.GetReportByIdList(reportIdList)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.Msg = "获取weekly报告详情失败,Err:" + err.Error()
+				return
+			}
+			for _, v := range tmpReportList {
+				tmpKey := fmt.Sprint(source, "_", v.Id)
+				if tmpInfo, ok := viewReportMap[tmpKey]; ok {
+					tmpInfo.ResearchReportName = v.Title
+					tmpInfo.ReportType = `rddp`
+					tmpInfo.MatchTypeName = v.ClassifyNameFirst
+					viewReportMap[tmpKey] = tmpInfo
+				}
+			}
+		case 2: // weekly报告
+			tmpReportList, err := models.GetResearchReportListByIdList(reportIdList)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.Msg = "获取weekly报告详情失败,Err:" + err.Error()
+				return
+			}
+			for _, v := range tmpReportList {
+				tmpKey := fmt.Sprint(source, "_", v.ResearchReportId)
+				if tmpInfo, ok := viewReportMap[tmpKey]; ok {
+					tmpInfo.ResearchReportName = v.ResearchReportName
+					tmpInfo.ReportType = v.Type
+					viewReportMap[tmpKey] = tmpInfo
+				}
+			}
+		case 3: // weekly_report商品的报告(应该是作废了);
+			tmpReportList, err := models.GetChartPermissionByIdList(reportIdList)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.Msg = "获取weekly报告详情失败,Err:" + err.Error()
+				return
+			}
+			for _, v := range tmpReportList {
+				tmpKey := fmt.Sprint(source, "_", v.ChartPermissionId)
+				if tmpInfo, ok := viewReportMap[tmpKey]; ok {
+					tmpInfo.ResearchReportName = v.ChartPermissionName
+					tmpInfo.ReportType = `advisory`
+					tmpInfo.MatchTypeName = v.ClassifyName
+					viewReportMap[tmpKey] = tmpInfo
+				}
+			}
+		case 4: // 察研观向的报告
+			tmpReportList, err := cygx.GetArticleListByIdList(reportIdList)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.Msg = "获取weekly报告详情失败,Err:" + err.Error()
+				return
+			}
+			for _, v := range tmpReportList {
+				tmpKey := fmt.Sprint(source, "_", v.ArticleId)
+				if tmpInfo, ok := viewReportMap[tmpKey]; ok {
+					tmpInfo.ResearchReportName = v.Title
+					tmpInfo.ReportType = `cygx`
+					tmpInfo.MatchTypeName = v.MatchTypeName
+					viewReportMap[tmpKey] = tmpInfo
+				}
+			}
+
+		}
+	}
+
+	// 报告标题处理
+	for _, v := range recordList {
+		tmpKey := fmt.Sprint(v.Source, "_", v.ReportId)
+		if tmpInfo, ok := viewReportMap[tmpKey]; ok {
+			list = append(list, &tmpInfo)
+		}
 	}
 
+	// 类型处理
 	for k, v := range list {
 		if v.ReportType == "day" {
 			list[k].MatchTypeName = "晨报"
@@ -2990,7 +3223,7 @@ func (this *CompanyUserController) ViewReportList() {
 	}
 	resp := new(company.ViewReportListResp)
 	resp.List = list
-	resp.Total = len(list)
+	resp.Total = total
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"

+ 108 - 54
controllers/cygx/activity_meet.go

@@ -10,6 +10,7 @@ import (
 	"hongze/hz_crm_api/models/company"
 	"hongze/hz_crm_api/models/cygx"
 	"hongze/hz_crm_api/models/system"
+	"hongze/hz_crm_api/services"
 	"hongze/hz_crm_api/services/alarm_msg"
 	cygxService "hongze/hz_crm_api/services/cygx"
 	"hongze/hz_crm_api/utils"
@@ -351,17 +352,17 @@ func (this *ActivityMeetCoAntroller) MeetingDo() {
 		br.ErrMsg = "操作失败,Err:" + errInfo.Error()
 		return
 	}
-	//校验活动后台管理员、销售是否有修改权限
-	havePower, popupMsg, err := cygxService.CheckActivityUpdatePower(AdminUser.AdminId, activityInfo)
-	if err != nil {
-		br.Msg = "获取管理员身份信息失败"
-		br.ErrMsg = "获取管理员身份信息失败,Err:" + err.Error()
-		return
-	}
-	if !havePower {
-		br.Msg = popupMsg
-		return
-	}
+	////校验活动后台管理员、销售是否有修改权限
+	//havePower, popupMsg, err := cygxService.CheckActivityUpdatePower(AdminUser.AdminId, activityInfo)
+	//if err != nil {
+	//	br.Msg = "获取管理员身份信息失败"
+	//	br.ErrMsg = "获取管理员身份信息失败,Err:" + err.Error()
+	//	return
+	//}
+	//if !havePower {
+	//	br.Msg = popupMsg
+	//	return
+	//}
 	noMeetingUids, err := cygx.GetSignupUserIds(activityId, meetingUids) //未到会的用户ID
 	if err != nil {
 		br.Msg = "获取信息失败"
@@ -512,6 +513,8 @@ func (this *ActivityMeetCoAntroller) OfflineMeetingList() {
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
+
+	var mobileArr []string
 	resp := new(cygx.CygxActivitySignupListRep)
 	if len(list) == 0 {
 		list = make([]*cygx.CygxActivitySignupList, 0)
@@ -526,6 +529,25 @@ func (this *ActivityMeetCoAntroller) OfflineMeetingList() {
 			if list[k].Channel == 0 && list[k].IsMeeting == 1 {
 				list[k].IsAirborne = 1
 			}
+			mobileArr = append(mobileArr, v.Mobile)
+		}
+	}
+	mapMobileUser := make(map[string]string)
+
+	if len(mobileArr) > 0 {
+
+		listUser, err := models.GetWxUserListByUserMobileHaveCompany(mobileArr)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetWxUserListByUserMobileHaveCompany Err:" + err.Error()
+			return
+		}
+		for _, v := range listUser {
+			mapMobileUser[v.Mobile] = v.RealName
+		}
+
+		for _, v := range list {
+			v.RealName = mapMobileUser[v.Mobile]
 		}
 	}
 
@@ -616,19 +638,32 @@ func (this *ActivityMeetCoAntroller) BreakAppointment() {
 	var list []*cygx.CygxBreakAppointmentList
 	var err error
 	if respDownload.IsCanDownload == false {
-		if adminInfo.RoleTypeCode == "rai_group" {
-			//组长查看本组所有组员
-			condition = ` AND s.user_id IN (SELECT user_id FROM user_seller_relation WHERE seller_id IN (SELECT  admin_id FROM admin WHERE group_id = (SELECT group_id FROM admin WHERE admin_id = ` + strconv.Itoa(sysUser.AdminId) + ` ) )) `
-		} else {
-			//组员查看自己
-			condition = ` AND s.user_id IN (SELECT user_id FROM user_seller_relation WHERE seller_id  = ` + strconv.Itoa(sysUser.AdminId) + `) `
+		//if adminInfo.RoleTypeCode == "rai_group" {
+		//	//组长查看本组所有组员
+		//	condition = ` AND s.user_id IN (SELECT user_id FROM user_seller_relation WHERE seller_id IN (SELECT  admin_id FROM admin WHERE group_id = (SELECT group_id FROM admin WHERE admin_id = ` + strconv.Itoa(sysUser.AdminId) + ` ) )) `
+		//} else {
+		//	//组员查看自己
+		//	condition = ` AND s.user_id IN (SELECT user_id FROM user_seller_relation WHERE seller_id  = ` + strconv.Itoa(sysUser.AdminId) + `) `
+		//}
+
+		//权益申请销售只能看到自己名下的客户的申请
+		companyIds, err := cygxService.GetAdminLookUserCompanyIds(sysUser)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetAdminLookUserCompanyIds Err:" + err.Error()
+			return
+		}
+		var companyIdstr []string
+		for _, v := range companyIds {
+			companyIdstr = append(companyIdstr, strconv.Itoa(v))
 		}
+		condition += ` AND s.company_id IN (` + strings.Join(companyIdstr, ",") + `) `
 	}
 	if keyWord != "" {
 		condition += ` AND (s.company_name LIKE '%` + keyWord + `%' OR s.mobile LIKE '%` + keyWord + `%') `
 	}
 	if sellerName != "" {
-		condition += ` 	AND p.seller_name = '` + sellerName + `' `
+		condition += ` 	AND s.seller_name = '` + sellerName + `' `
 	}
 	condition += ` AND a.is_limit_people > 0  `
 	total, err := cygx.GetCygxBreakAppointmentCount(condition, pars)
@@ -870,17 +905,6 @@ func (this *ActivityMeetCoAntroller) AppointmentList() {
 	}
 	sqlStr := `  AND s.do_fail_type = 0`
 	memberType := "Admin"
-	if resp.IsCanDownload == false {
-		if adminInfo.RoleTypeCode == "rai_group" {
-			//组长查看本组所有组员
-			memberType = "GroupLeader"
-			sqlStr += ` AND s.user_id IN (SELECT user_id FROM user_seller_relation WHERE seller_id IN (SELECT  admin_id FROM admin WHERE group_id = (SELECT group_id FROM admin WHERE admin_id = ` + strconv.Itoa(sysUser.AdminId) + ` ) )) `
-		} else {
-			//组员查看自己
-			memberType = "Sale"
-			sqlStr += ` AND s.user_id IN (SELECT user_id FROM user_seller_relation WHERE seller_id  = ` + strconv.Itoa(sysUser.AdminId) + `) `
-		}
-	}
 
 	list, err := cygx.GetCygxAppointmentList(activityId, sqlStr)
 	if err != nil {
@@ -905,6 +929,26 @@ func (this *ActivityMeetCoAntroller) AppointmentList() {
 		list[k].SellerName = v.PsellerName
 	}
 	respList := new(cygx.GetAppointmentListRep)
+	//销售查看自己客户,销售组长查看组员
+	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.List = append(respList.List, v)
+			}
+		}
+	} else {
+		respList.List = list
+	}
+	if len(respList.List) == 0 {
+		respList.List = make([]*cygx.CygxAppointmentList, 0)
+	}
+
 	respList.List = list
 	respList.Total = total
 	respList.MyTotal = myTotal
@@ -912,8 +956,7 @@ func (this *ActivityMeetCoAntroller) AppointmentList() {
 	respList.MemberType = memberType
 	respList.IsLimitPeople = activityInfo.IsLimitPeople
 	activityTypeId := activityInfo.ActivityTypeId
-	fmt.Println(activityTypeId)
-	//ExcelType     string `description:"EXcel下载类型 AppointmentCall:预约外呼、ExpertSalon:专家沙龙报名、Teleconference:公司调研电话会、OfflineResearch:公司线下调研  CClass C类"`
+
 	if activityTypeId == 1 || activityTypeId == 2 {
 		respList.ExcelType = "AppointmentCall"
 	} else if activityTypeId == 5 || activityTypeId == 6 {
@@ -961,21 +1004,30 @@ func (this *ActivityMeetCoAntroller) SignupFailExport() {
 	}
 	var err error
 	var condition string
-	if resp.IsCanDownload == false {
-		if adminInfo.RoleTypeCode == "rai_group" {
-			//组长查看本组所有组员
-			condition = ` AND s.company_id IN (SELECT company_id FROM user_seller_relation WHERE seller_id IN (SELECT  admin_id FROM admin WHERE group_id = (SELECT group_id FROM admin WHERE admin_id = ` + strconv.Itoa(AdminUser.AdminId) + ` ) ) GROUP BY company_id) `
-		} else {
-			//组员查看自己
-			condition = ` AND s.company_id IN (SELECT company_id FROM user_seller_relation WHERE seller_id  = ` + strconv.Itoa(AdminUser.AdminId) + ` GROUP  BY company_id) `
-		}
-	}
-	items, err := cygx.GetMeetingExportAll(condition)
+	var items []*cygx.MeetingExportRep
+	list, err := cygx.GetMeetingExportAll(condition)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
+	//销售查看自己客户,销售组长查看组员
+	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 {
+				items = append(items, v)
+			}
+		}
+	} else {
+		items = list
+	}
+
 	//创建excel
 	dir, err := os.Executable()
 	exPath := filepath.Dir(dir)
@@ -1354,17 +1406,7 @@ func (this *ActivityMeetCoAntroller) AttendanceDetail() {
 	}
 	var condition string
 	var condition2 string
-	//if resp.IsCanDownload == false {
-	//	if adminInfo.RoleTypeCode == "rai_group" {
-	//		//组长查看本组所有组员
-	//		condition = ` AND s.mobile IN (SELECT mobile FROM user_seller_relation WHERE seller_id IN (SELECT  admin_id FROM admin WHERE group_id = (SELECT group_id FROM admin WHERE admin_id = ` + strconv.Itoa(sysUser.AdminId) + ` ) )) `
-	//		condition2 = ` AND d.mobile IN (SELECT mobile FROM user_seller_relation WHERE seller_id IN (SELECT  admin_id FROM admin WHERE group_id = (SELECT group_id FROM admin WHERE admin_id = ` + strconv.Itoa(sysUser.AdminId) + ` ) )) `
-	//	} else {
-	//		//组员查看自己
-	//		condition = ` AND s.mobile IN (SELECT mobile FROM user_seller_relation WHERE seller_id  = ` + strconv.Itoa(sysUser.AdminId) + `) `
-	//		condition2 = ` AND d.mobile IN (SELECT mobile FROM user_seller_relation WHERE seller_id  = ` + strconv.Itoa(sysUser.AdminId) + `) `
-	//	}
-	//}
+
 	//同一用户上传多次参会记录时,到会与未到会分开查询
 	list1, err := cygx.GetAttendanceDetailListGroup(activityId, condition+` AND s.is_meeting = 1 AND d.userid_entity != 3  GROUP BY s.user_id `)
 	if err != nil {
@@ -1379,6 +1421,7 @@ func (this *ActivityMeetCoAntroller) AttendanceDetail() {
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
+	var sellerCompanyIds []int
 	if len(listGroup) > 0 {
 		for _, v := range listGroup {
 			list1 = append(list1, v)
@@ -1392,19 +1435,20 @@ func (this *ActivityMeetCoAntroller) AttendanceDetail() {
 		if v.Mobile != "" {
 			mobileStr += v.Mobile + ","
 		}
+		sellerCompanyIds = append(sellerCompanyIds, v.CompanyId)
 	}
 	mobileStr = strings.TrimRight(mobileStr, ",")
 	if mobileStr == "" {
 		mobileStr = "1"
 	}
 	condition2 += ` AND d.mobile NOT IN ( ` + mobileStr + ` )  `
-	list2, err := cygx.GetAttendanceDetailList2(activityId, condition2+` AND u.company_id != 1 `)
+	list2, err := cygx.GetAttendanceDetailList2(activityId, condition2+` AND d.company_id > 1 `)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
-	listNoAppointment, err := cygx.GetAttendanceDetailList2(activityId, ` AND d.mobile NOT IN ( `+mobileStr+` )  `+` AND u.company_id != 1 `) //未预约 所有
+	listNoAppointment, err := cygx.GetAttendanceDetailList2(activityId, ` AND d.mobile NOT IN ( `+mobileStr+` )  `+` AND d.company_id > 1  `) //未预约 所有
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
@@ -1455,6 +1499,16 @@ func (this *ActivityMeetCoAntroller) AttendanceDetail() {
 			list2[k].FirstMeetingTime = ""
 			list2[k].LastMeetingTime = ""
 		}
+		sellerCompanyIds = append(sellerCompanyIds, v.CompanyId)
+	}
+
+	//获取公司ID所对应的销售名称
+	sellNameMap := services.GetSellNameMapByCompanyIds(sellerCompanyIds)
+	for k, v := range list1 {
+		list1[k].SellerName = sellNameMap[v.CompanyId]
+	}
+	for k, v := range list2 {
+		list2[k].SellerName = sellNameMap[v.CompanyId]
 	}
 	mobileStr = ""
 	for k, v := range list3 {

+ 292 - 100
controllers/cygx/activity_signup.go

@@ -276,23 +276,18 @@ func (this *ActivitySignupCoAntroller) AppointmentList() {
 	memberType := "Admin"
 	sqlStr := `  AND s.do_fail_type = 0  `
 	totalStr := sqlStr
-	if resp.IsCanDownload == false && (activityInfo.ActivityTypeId == 1 || activityInfo.ActivityTypeId == 2 || activityInfo.ActivityTypeId == 3 || activityInfo.IsYidongConduct == 1) {
-		if adminInfo.RoleTypeCode == "rai_group" {
-			//组长查看本组所有组员
-			memberType = "GroupLeader"
-			sqlStr += ` AND s.company_id IN (SELECT company_id FROM user_seller_relation WHERE seller_id IN (SELECT  admin_id FROM admin WHERE group_id = (SELECT group_id FROM admin WHERE admin_id = ` + strconv.Itoa(sysUser.AdminId) + ` ) )) `
-		} else {
-			//组员查看自己
-			memberType = "Sale"
-			sqlStr += ` AND s.company_id IN (SELECT company_id FROM user_seller_relation WHERE seller_id  = ` + strconv.Itoa(sysUser.AdminId) + `) `
-		}
-	}
 	list, err := cygx.GetCygxAppointmentList(activityId, sqlStr)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
+	//根据公司ID获取对应销售
+	var companyIds []int
+	for _, v := range list {
+		companyIds = append(companyIds, v.CompanyId)
+	}
+	sellNameMap := services.GetSellNameMapByCompanyIds(companyIds)
 	totalStr += " AND  s.company_id != 16  "
 	total, errtotal := cygx.GetCygxAppointmentCount(activityId, totalStr)
 	if errtotal != nil {
@@ -307,18 +302,29 @@ func (this *ActivitySignupCoAntroller) AppointmentList() {
 		return
 	}
 	for k, v := range list {
-		//公司调研电话会的活动,研选扣点的展示自主拨入,非扣点的展示预约外呼
-		//if activityInfo.ActivityTypeId == 3 {
-		//	if activityInfo.IsResearchPoints == 1 {
-		//		v.SignupType = 2
-		//	} else {
-		//		v.SignupType = 1
-		//	}
-		//}
-		list[k].SellerName = v.PsellerName
+		list[k].SellerName = sellNameMap[v.CompanyId]
 	}
 	respList := new(cygx.GetAppointmentListRep)
-	respList.List = list
+	//销售查看自己客户,销售组长查看组员
+	if resp.IsCanDownload == false && (activityInfo.ActivityTypeId == 1 || activityInfo.ActivityTypeId == 2 || activityInfo.ActivityTypeId == 3 || activityInfo.IsYidongConduct == 1) {
+		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.List = append(respList.List, v)
+			}
+		}
+	} else {
+		respList.List = list
+	}
+
+	if len(respList.List) == 0 {
+		respList.List = make([]*cygx.CygxAppointmentList, 0)
+	}
 	respList.Total = total
 	respList.MyTotal = myTotal
 	respList.ActivityId = activityId
@@ -651,17 +657,6 @@ func (this *ActivitySignupCoAntroller) SalonFailSignupList() {
 	}
 	memberType := "Admin"
 	sqlStr := ""
-	if resp.IsCanDownload == false && (activityInfo.ActivityTypeId == 1 || activityInfo.ActivityTypeId == 2 || activityInfo.ActivityTypeId == 3) {
-		if adminInfo.RoleTypeCode == "rai_group" {
-			//组长查看本组所有组员
-			memberType = "GroupLeader"
-			sqlStr = ` AND s.user_id IN (SELECT user_id FROM user_seller_relation WHERE seller_id IN (SELECT  admin_id FROM admin WHERE group_id = (SELECT group_id FROM admin WHERE admin_id = ` + strconv.Itoa(sysUser.AdminId) + ` ) )) `
-		} else {
-			//组员查看自己
-			memberType = "Sale"
-			sqlStr = ` AND s.user_id IN (SELECT user_id FROM user_seller_relation WHERE seller_id  = ` + strconv.Itoa(sysUser.AdminId) + `) `
-		}
-	}
 	sqlStr += ` AND s.fail_type >0 `
 	list, err := cygx.GetFailSignupList(activityId, sqlStr)
 	if err != nil {
@@ -669,6 +664,12 @@ func (this *ActivitySignupCoAntroller) SalonFailSignupList() {
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
+	//根据公司ID获取对应销售
+	var sellerCompanyIds []int
+	for _, v := range list {
+		sellerCompanyIds = append(sellerCompanyIds, v.CompanyId)
+	}
+	sellNameMap := services.GetSellNameMapByCompanyIds(sellerCompanyIds)
 	sqlStrtotal := ` AND s.fail_type >0 `
 	total, errtotal := cygx.GetCygxAppointmentCount(activityId, sqlStrtotal)
 	if errtotal != nil {
@@ -676,7 +677,21 @@ func (this *ActivitySignupCoAntroller) SalonFailSignupList() {
 		br.ErrMsg = "客户总数获取失败,Err:" + errtotal.Error()
 		return
 	}
-	myTotalsqlStr := ` AND s.user_id IN (SELECT user_id FROM user_seller_relation WHERE seller_id  = ` + strconv.Itoa(sysUser.AdminId) + `) AND s.fail_type >0 `
+
+	//权益申请销售只能看到自己名下的客户的申请 查研观向11.1
+	companyIds, err := cygxService.GetAdminLookUserCompanyIds(sysUser)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,GetAdminLookUserCompanyIds Err:" + err.Error()
+		return
+	}
+
+	var companyIdstr []string
+	for _, v := range companyIds {
+		companyIdstr = append(companyIdstr, strconv.Itoa(v))
+	}
+
+	myTotalsqlStr := ` AND s.company_id  IN (` + strings.Join(companyIdstr, ",") + `) AND s.fail_type >0 `
 	myTotal, errmyTotal := cygx.GetCygxAppointmentCount(activityId, myTotalsqlStr)
 	if errmyTotal != nil {
 		br.Msg = "获取失败"
@@ -703,6 +718,7 @@ func (this *ActivitySignupCoAntroller) SalonFailSignupList() {
 		}
 	}
 	for k, v := range list {
+		list[k].SellerName = sellNameMap[v.CompanyId]
 		if v.DoFailType == 0 {
 			list[k].SalonOperation = true
 			list[k].CallOperation = v.SignupType
@@ -710,7 +726,26 @@ func (this *ActivitySignupCoAntroller) SalonFailSignupList() {
 			list[k].CallOperation = 3
 		}
 	}
-	respList.List = list
+	//销售查看自己客户,销售组长查看组员
+	if resp.IsCanDownload == false && (activityInfo.ActivityTypeId == 1 || activityInfo.ActivityTypeId == 2 || activityInfo.ActivityTypeId == 3) {
+		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.List = append(respList.List, v)
+			}
+		}
+	} else {
+		respList.List = list
+	}
+	if len(respList.List) == 0 {
+		respList.List = make([]*cygx.FailSignupListRep, 0)
+	}
+
 	respList.Total = total
 	respList.MyTotal = myTotal
 	respList.IsLimitPeople = activityInfo.IsLimitPeople
@@ -927,17 +962,7 @@ func (this *ActivitySignupCoAntroller) FailSignupList() {
 	memberType := "Admin"
 	var err error
 	sqlStr := ""
-	if resp.IsCanDownload == false && (activityInfo.ActivityTypeId == 1 || activityInfo.ActivityTypeId == 2 || activityInfo.ActivityTypeId == 3) {
-		if adminInfo.RoleTypeCode == "rai_group" {
-			//组长查看本组所有组员
-			memberType = "GroupLeader"
-			sqlStr = ` AND s.user_id IN (SELECT user_id FROM user_seller_relation WHERE seller_id IN (SELECT  admin_id FROM admin WHERE group_id = (SELECT group_id FROM admin WHERE admin_id = ` + strconv.Itoa(sysUser.AdminId) + ` ) )) `
-		} else {
-			//组员查看自己
-			memberType = "Sale"
-			sqlStr = ` AND s.user_id IN (SELECT user_id FROM user_seller_relation WHERE seller_id  = ` + strconv.Itoa(sysUser.AdminId) + `) `
-		}
-	}
+
 	sqlStr += ` AND s.fail_type >0 `
 	listSeller, errSeller := cygx.GetFailSignupList(activityId, sqlStr)
 	list = listSeller
@@ -953,7 +978,20 @@ func (this *ActivitySignupCoAntroller) FailSignupList() {
 		br.ErrMsg = "客户总数获取失败,Err:" + errtotal.Error()
 		return
 	}
-	myTotalsqlStr := ` AND s.user_id IN (SELECT user_id FROM user_seller_relation WHERE seller_id  = ` + strconv.Itoa(sysUser.AdminId) + `) `
+	//权益申请销售只能看到自己名下的客户的申请 查研观向11.1
+	companyIds, err := cygxService.GetAdminLookUserCompanyIds(sysUser)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,GetAdminLookUserCompanyIds Err:" + err.Error()
+		return
+	}
+
+	var companyIdstr []string
+	for _, v := range companyIds {
+		companyIdstr = append(companyIdstr, strconv.Itoa(v))
+	}
+
+	myTotalsqlStr := ` AND s.company_id  IN (` + strings.Join(companyIdstr, ",") + `) AND s.fail_type >0 `
 	myTotal, errmyTotal := cygx.GetCygxAppointmentCount(activityId, myTotalsqlStr)
 	if errmyTotal != nil {
 		br.Msg = "获取失败"
@@ -983,6 +1021,27 @@ func (this *ActivitySignupCoAntroller) FailSignupList() {
 		}
 	}
 	respList := new(cygx.GetFailSignupListRep)
+	//销售查看自己客户,销售组长查看组员
+	if resp.IsCanDownload == false && (activityInfo.ActivityTypeId == 1 || activityInfo.ActivityTypeId == 2 || activityInfo.ActivityTypeId == 3) {
+		mapMobile, err := cygxService.GetAdminLookUserMobile(adminInfo)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,销售对应权限,Err:" + err.Error()
+			return
+		}
+		for _, v := range listNew {
+			if _, ok := mapMobile[v.Mobile]; ok {
+				respList.List = append(respList.List, v)
+			}
+		}
+	} else {
+		respList.List = listNew
+	}
+
+	if len(respList.List) == 0 {
+		respList.List = make([]*cygx.FailSignupListRep, 0)
+	}
+
 	respList.List = listNew
 	respList.Total = total
 	respList.MyTotal = myTotal
@@ -1127,26 +1186,19 @@ func (this *ActivitySignupCoAntroller) CallExport() {
 	//var err error
 	sqlStr := " "
 
-	//if resp.IsCanDownload == false && (activityInfo.ActivityTypeId == 1 || activityInfo.ActivityTypeId == 2 || activityInfo.ActivityTypeId == 3) {
-	//	if adminInfo.RoleTypeCode == "rai_group" {
-	//		//组长查看本组所有组员
-	//		sqlStr = ` AND s.user_id IN (SELECT user_id FROM user_seller_relation WHERE seller_id IN (SELECT  admin_id FROM admin WHERE group_id = (SELECT group_id FROM admin WHERE admin_id = ` + strconv.Itoa(sysUser.AdminId) + ` ) )) `
-	//	} else {
-	//		//组员查看自己
-	//		sqlStr = ` AND s.user_id IN (SELECT user_id FROM user_seller_relation WHERE seller_id  = ` + strconv.Itoa(sysUser.AdminId) + `) `
-	//	}
-	//}
-	//sqlStr += ` AND s.do_fail_type = 0  GROUP BY s.id`
-	//list, errSeller := cygx.GetSignupExport(activityId, sqlStr)
-
 	if resp.IsCanDownload == false && (activityInfo.ActivityTypeId == 1 || activityInfo.ActivityTypeId == 2 || activityInfo.ActivityTypeId == 3) {
-		if adminInfo.RoleTypeCode == "rai_group" {
-			//组长查看本组所有组员
-			sqlStr += ` AND s.company_id IN (SELECT company_id FROM user_seller_relation WHERE seller_id IN (SELECT  admin_id FROM admin WHERE group_id = (SELECT group_id FROM admin WHERE admin_id = ` + strconv.Itoa(sysUser.AdminId) + ` ) )) `
-		} else {
-			//组员查看自己
-			sqlStr += ` AND s.company_id IN (SELECT company_id FROM user_seller_relation WHERE seller_id  = ` + strconv.Itoa(sysUser.AdminId) + `) `
+		//权益申请销售只能看到自己名下的客户的申请 查研观向11.1
+		companyIds, err := cygxService.GetAdminLookUserCompanyIds(sysUser)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetAdminLookUserCompanyIds Err:" + err.Error()
+			return
+		}
+		var companyIdstr []string
+		for _, v := range companyIds {
+			companyIdstr = append(companyIdstr, strconv.Itoa(v))
 		}
+		sqlStr += ` AND s.company_id  IN (` + strings.Join(companyIdstr, ",") + `) `
 	}
 	//公司调研电话会下载全部
 	if activityInfo.ActivityTypeId != 3 {
@@ -1176,6 +1228,19 @@ func (this *ActivitySignupCoAntroller) CallExport() {
 		return
 	}
 
+	//根据公司ID获取对应销售
+	var sellerCompanyIds []int
+	for _, v := range list {
+		sellerCompanyIds = append(sellerCompanyIds, v.CompanyId)
+	}
+	for _, v := range listReminder {
+		sellerCompanyIds = append(sellerCompanyIds, v.CompanyId)
+	}
+	for _, v := range listSummary {
+		sellerCompanyIds = append(sellerCompanyIds, v.CompanyId)
+	}
+	sellNameMap := services.GetSellNameMapByCompanyIds(sellerCompanyIds)
+
 	//创建excel
 	dir, err := os.Executable()
 	exPath := filepath.Dir(dir)
@@ -1253,7 +1318,7 @@ func (this *ActivitySignupCoAntroller) CallExport() {
 					cellE := row.AddCell()
 					cellE.Value = item.CompanyName
 					cellF := row.AddCell()
-					cellF.Value = item.SellerName
+					cellF.Value = sellNameMap[item.CompanyId]
 				}
 			} else {
 				rowTitle := sheet.AddRow()
@@ -1282,7 +1347,7 @@ func (this *ActivitySignupCoAntroller) CallExport() {
 					cellD := row.AddCell()
 					cellD.Value = item.CompanyName
 					cellE := row.AddCell()
-					cellE.Value = item.SellerName
+					cellE.Value = sellNameMap[item.CompanyId]
 				}
 			}
 		} else {
@@ -1300,7 +1365,7 @@ func (this *ActivitySignupCoAntroller) CallExport() {
 				cellB := row.AddCell()
 				cellB.Value = item.CompanyName
 				cellC := row.AddCell()
-				cellC.Value = item.SellerName
+				cellC.Value = sellNameMap[item.CompanyId]
 			}
 		}
 	}
@@ -1363,13 +1428,19 @@ func (this *ActivitySignupCoAntroller) SignupFailExport() {
 
 	sqlStr := ""
 	if resp.IsCanDownload == false && (activityInfo.ActivityTypeId == 1 || activityInfo.ActivityTypeId == 2 || activityInfo.ActivityTypeId == 3 || activityInfo.IsYidongConduct == 1) {
-		if adminInfo.RoleTypeCode == "rai_group" {
-			//组长查看本组所有组员
-			sqlStr += ` AND s.company_id IN (SELECT company_id FROM user_seller_relation WHERE seller_id IN (SELECT  admin_id FROM admin WHERE group_id = (SELECT group_id FROM admin WHERE admin_id = ` + strconv.Itoa(AdminUser.AdminId) + ` ) )) `
-		} else {
-			//组员查看自己
-			sqlStr += ` AND s.company_id IN (SELECT company_id FROM user_seller_relation WHERE seller_id  = ` + strconv.Itoa(AdminUser.AdminId) + `) `
+		//权益申请销售只能看到自己名下的客户的申请 查研观向11.1
+		companyIds, err := cygxService.GetAdminLookUserCompanyIds(AdminUser)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetAdminLookUserCompanyIds Err:" + err.Error()
+			return
+		}
+
+		var companyIdstr []string
+		for _, v := range companyIds {
+			companyIdstr = append(companyIdstr, strconv.Itoa(v))
 		}
+		sqlStr += ` AND s.company_id IN  (` + strings.Join(companyIdstr, ",") + `)`
 	}
 	sqlStrOther := sqlStr
 	var listReminder []*cygx.CygxAppointmentList
@@ -1403,6 +1474,19 @@ func (this *ActivitySignupCoAntroller) SignupFailExport() {
 		return
 	}
 
+	//根据公司ID获取对应销售
+	var sellerCompanyIds []int
+	for _, v := range listReminder {
+		sellerCompanyIds = append(sellerCompanyIds, v.CompanyId)
+	}
+	for _, v := range summaryList {
+		sellerCompanyIds = append(sellerCompanyIds, v.CompanyId)
+	}
+	for _, v := range list {
+		sellerCompanyIds = append(sellerCompanyIds, v.CompanyId)
+	}
+	sellNameMap := services.GetSellNameMapByCompanyIds(sellerCompanyIds)
+
 	//创建excel
 	dir, err := os.Executable()
 	exPath := filepath.Dir(dir)
@@ -1476,7 +1560,7 @@ func (this *ActivitySignupCoAntroller) SignupFailExport() {
 					cellE := row.AddCell()
 					cellE.Value = item.CompanyName
 					cellF := row.AddCell()
-					cellF.Value = item.SellerName
+					cellF.Value = sellNameMap[item.CompanyId]
 				}
 			} else {
 				rowTitle := sheet.AddRow()
@@ -1494,7 +1578,7 @@ func (this *ActivitySignupCoAntroller) SignupFailExport() {
 					cellB := row.AddCell()
 					cellB.Value = item.CompanyName
 					cellC := row.AddCell()
-					cellC.Value = item.SellerName
+					cellC.Value = sellNameMap[item.CompanyId]
 				}
 			}
 		} else {
@@ -1512,7 +1596,7 @@ func (this *ActivitySignupCoAntroller) SignupFailExport() {
 				cellB := row.AddCell()
 				cellB.Value = item.CompanyName
 				cellC := row.AddCell()
-				cellC.Value = item.SellerName
+				cellC.Value = sellNameMap[item.CompanyId]
 			}
 		}
 	}
@@ -2372,15 +2456,18 @@ func (this *ActivitySignupCoAntroller) SummaryList() {
 	totalStr := sqlStr
 	if isShowMobile {
 		if resp.IsCanDownload == false && (activityInfo.ActivityTypeId == 1 || activityInfo.ActivityTypeId == 2 || activityInfo.ActivityTypeId == 3) {
-			if adminInfo.RoleTypeCode == "rai_group" {
-				//组长查看本组所有组员
-				memberType = "GroupLeader"
-				sqlStr += ` AND s.company_id IN (SELECT company_id FROM user_seller_relation WHERE seller_id IN (SELECT  admin_id FROM admin WHERE group_id = (SELECT group_id FROM admin WHERE admin_id = ` + strconv.Itoa(sysUser.AdminId) + ` ) )) `
-			} else {
-				//组员查看自己
-				memberType = "Sale"
-				sqlStr += ` AND s.company_id IN (SELECT company_id FROM user_seller_relation WHERE seller_id  = ` + strconv.Itoa(sysUser.AdminId) + `) `
+			//权益申请销售只能看到自己名下的客户的申请
+			companyIds, err := cygxService.GetAdminLookUserCompanyIds(sysUser)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取失败,GetAdminLookUserCompanyIds Err:" + err.Error()
+				return
+			}
+			var companyIdstr []string
+			for _, v := range companyIds {
+				companyIdstr = append(companyIdstr, strconv.Itoa(v))
 			}
+			sqlStr += ` AND s.company_id IN (` + strings.Join(companyIdstr, ",") + `) `
 		}
 	}
 	list, err := cygx.GetCygxAppointmentSummaryList(activityId, sqlStr)
@@ -2389,6 +2476,13 @@ func (this *ActivitySignupCoAntroller) SummaryList() {
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
+	//根据公司ID获取对应销售
+	var sellerCompanyIds []int
+	for _, v := range list {
+		sellerCompanyIds = append(sellerCompanyIds, v.CompanyId)
+	}
+	sellNameMap := services.GetSellNameMapByCompanyIds(sellerCompanyIds)
+
 	total, errtotal := cygx.GetCygxAppointmentSummaryCount(activityId, totalStr)
 	if errtotal != nil {
 		br.Msg = "获取失败"
@@ -2402,12 +2496,13 @@ func (this *ActivitySignupCoAntroller) SummaryList() {
 		return
 	}
 	for k, v := range list {
-		list[k].SellerName = v.PsellerName
+		list[k].SellerName = sellNameMap[v.CompanyId]
 		if !isShowMobile {
 			list[k].Mobile = ""
 		}
 	}
 	respList := new(cygx.GetAppointmentListRep)
+
 	respList.List = list
 	respList.Total = total
 	respList.MyTotal = myTotal
@@ -2650,15 +2745,19 @@ func (this *ActivitySignupCoAntroller) ReminderList() {
 	totalStr := sqlStr
 
 	if resp.IsCanDownload == false && (activityInfo.ActivityTypeId == 1 || activityInfo.ActivityTypeId == 2 || activityInfo.ActivityTypeId == 3) {
-		if adminInfo.RoleTypeCode == "rai_group" {
-			//组长查看本组所有组员
-			memberType = "GroupLeader"
-			sqlStr += ` AND s.company_id IN (SELECT company_id FROM user_seller_relation WHERE seller_id IN (SELECT  admin_id FROM admin WHERE group_id = (SELECT group_id FROM admin WHERE admin_id = ` + strconv.Itoa(sysUser.AdminId) + ` ) )) `
-		} else {
-			//组员查看自己
-			memberType = "Sale"
-			sqlStr += ` AND s.company_id IN (SELECT company_id FROM user_seller_relation WHERE seller_id  = ` + strconv.Itoa(sysUser.AdminId) + `) `
+		//权益申请销售只能看到自己名下的客户的申请
+		companyIds, err := cygxService.GetAdminLookUserCompanyIds(sysUser)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetAdminLookUserCompanyIds Err:" + err.Error()
+			return
 		}
+
+		var companyIdstr []string
+		for _, v := range companyIds {
+			companyIdstr = append(companyIdstr, strconv.Itoa(v))
+		}
+		sqlStr += ` AND s.company_id IN (` + strings.Join(companyIdstr, ",") + `) `
 	}
 
 	list, err := cygx.GetCygxActivityMeetingReminderList(activityId, sqlStr)
@@ -2667,6 +2766,35 @@ func (this *ActivitySignupCoAntroller) ReminderList() {
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
+	//根据公司ID获取对应销售
+	//var sellerCompanyIds []int
+	var userIds []int
+	for _, v := range list {
+		//sellerCompanyIds = append(sellerCompanyIds, v.CompanyId)
+		userIds = append(userIds, v.UserId)
+	}
+
+	listUser, err := models.GetWxUserRaiSllerListByUserIds(userIds)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	//拼接用户相关信息
+	mapUser := make(map[int]*models.WxUserSller)
+	for _, v := range listUser {
+		mapUser[v.UserId] = v
+	}
+	for _, v := range list {
+		if mapUser[v.UserId] != nil {
+			v.RealName = mapUser[v.UserId].RealName
+			v.Mobile = mapUser[v.UserId].Mobile
+			v.CompanyName = mapUser[v.UserId].CompanyName
+			v.SellerName = mapUser[v.UserId].SellerName
+		}
+	}
+
+	//sellNameMap := services.GetSellNameMapByCompanyIds(sellerCompanyIds)
 	total, errtotal := cygx.GetCygxActivityMeetingReminderCount(activityId, totalStr)
 	if errtotal != nil {
 		br.Msg = "获取失败"
@@ -2680,9 +2808,9 @@ func (this *ActivitySignupCoAntroller) ReminderList() {
 		return
 	}
 	if len(list) > 0 {
-		for k, v := range list {
-			list[k].SellerName = v.PsellerName
-		}
+		//for k, v := range list {
+		//	list[k].SellerName = sellNameMap[v.CompanyId]
+		//}
 	} else {
 		list = make([]*cygx.CygxAppointmentList, 0)
 	}
@@ -2795,10 +2923,10 @@ func (this *ActivitySignupCoAntroller) TempMsg() {
 			br.ErrMsg = "参数解析异常, Err:" + e.Error()
 			return
 		}
-		var openIdList []*models.OpenIdList
+		var openIdList []*cygx.OpenIdList
 		idMap := make(map[string]string, 0)
 		if strings.Contains(req.SendGroup, "1") {
-			list, err := models.GetCygxUserIndustryFllowOpneidByActivityIds(id)
+			list, err := cygx.GetCygxUserIndustryFllowOpneidByActivityIds(id)
 			if err != nil {
 				br.Msg = "查询openId失败"
 				br.ErrMsg = "查询openId失败,Err:" + err.Error()
@@ -2810,12 +2938,40 @@ func (this *ActivitySignupCoAntroller) TempMsg() {
 			}
 		}
 		if strings.Contains(req.SendGroup, "2") {
-			list, err := models.GetCygxForeverUserIndustryFllowOpneidByActivityIds(id)
+			var condition string
+			var pars []interface{}
+
+			condition = " AND p.STATUS IN ('永续') "
+			listmobileYongxu, err := models.GetActivitySpecialOpenIdListMobile(condition, pars)
 			if err != nil {
 				br.Msg = "查询openId失败"
 				br.ErrMsg = "查询openId失败,Err:" + err.Error()
 				return
 			}
+			mapMobileYongxu := make(map[string]string)
+			for _, v := range listmobileYongxu {
+				mapMobileYongxu[v.Mobile] = v.Mobile
+			}
+
+			var mobiles []string
+			listFllow, err := cygx.GetCygxForeverUserIndustryFllowOpneidByActivityIds(id)
+			if err != nil {
+				br.Msg = "查询openId失败"
+				br.ErrMsg = "查询openId失败,Err:" + err.Error()
+				return
+			}
+
+			for _, v := range listFllow {
+				if mapMobileYongxu[v.Mobile] != "" {
+					mobiles = append(mobiles, v.Mobile)
+				}
+			}
+			list, err := cygx.GetUserRecordListByMobileArr(mobiles)
+			if err != nil {
+				br.Msg = "查询openId失败"
+				br.ErrMsg = "查询openId失败,GetUserRecordListByMobileArr Err:" + err.Error()
+				return
+			}
 			for _, idList := range openIdList {
 				idMap[idList.OpenId] = idList.OpenId
 			}
@@ -2882,12 +3038,48 @@ func (this *ActivitySignupCoAntroller) TempMsg() {
 			}
 		}
 		if strings.Contains(req.SendGroup, "6") {
-			list, err := models.GetCygxTryOutUserIndustryFllowOpneidByActivityIds(id)
+			//list, err := models.GetCygxTryOutUserIndustryFllowOpneidByActivityIds(id)
+			//if err != nil {
+			//	br.Msg = "查询openId失败"
+			//	br.ErrMsg = "查询openId失败,Err:" + err.Error()
+			//	return
+			//}
+
+			var condition string
+			var pars []interface{}
+
+			condition = " AND p.STATUS IN ('试用') "
+			listmobileShiyong, err := models.GetActivitySpecialOpenIdListMobile(condition, pars)
+			if err != nil {
+				br.Msg = "查询openId失败"
+				br.ErrMsg = "查询openId失败,Err:" + err.Error()
+				return
+			}
+			mapMobileShiyong := make(map[string]string)
+			for _, v := range listmobileShiyong {
+				mapMobileShiyong[v.Mobile] = v.Mobile
+			}
+
+			var mobiles []string
+			listFllow, err := cygx.GetCygxForeverUserIndustryFllowOpneidByActivityIds(id)
 			if err != nil {
 				br.Msg = "查询openId失败"
 				br.ErrMsg = "查询openId失败,Err:" + err.Error()
 				return
 			}
+
+			for _, v := range listFllow {
+				if mapMobileShiyong[v.Mobile] != "" {
+					mobiles = append(mobiles, v.Mobile)
+				}
+			}
+			list, err := cygx.GetUserRecordListByMobileArr(mobiles)
+			if err != nil {
+				br.Msg = "查询openId失败"
+				br.ErrMsg = "查询openId失败,GetUserRecordListByMobileArr Err:" + err.Error()
+				return
+			}
+
 			for _, idList := range openIdList {
 				idMap[idList.OpenId] = idList.OpenId
 			}

+ 12 - 7
controllers/cygx/activity_special_trip.go

@@ -183,7 +183,7 @@ func (this *ActivitySpecialTripCoAntroller) AddUser() {
 					}
 					items = append(items, item)
 				} else {
-					err = cygx.UpdateSpecialTrip(1,0,uid, activityId)
+					err = cygx.UpdateSpecialTrip(1, 0, uid, activityId)
 					if err != nil {
 						br.Msg = "报名失败,"
 						br.ErrMsg = "二次报名,更改报名是否有效状态失败,Err:" + err.Error()
@@ -202,7 +202,7 @@ func (this *ActivitySpecialTripCoAntroller) AddUser() {
 					return
 				}
 				if userType == 2 {
-					tripRemaining = tripRemaining + itemBill.BillDetailed-i
+					tripRemaining = tripRemaining + itemBill.BillDetailed - i
 					itemBill.Total = strconv.Itoa(tripRemaining) + "次"
 				} else {
 					for k, num := range mapChartName {
@@ -982,7 +982,7 @@ func (this *ActivitySpecialTripCoAntroller) TempMsg() {
 			br.ErrMsg = "参数解析异常, Err:" + e.Error()
 			return
 		}
-		var openIdList []*models.OpenIdList
+		var openIdList []*cygx.OpenIdList
 		idMap := make(map[string]string, 0)
 		//1已报名
 		if strings.Contains(req.SendGroup, "1") {
@@ -1008,12 +1008,17 @@ func (this *ActivitySpecialTripCoAntroller) TempMsg() {
 				condition += ` AND u.mobile IN (` + utils.GetOrmInReplace(mobileLen) + `)`
 				pars = append(pars, mobileArr)
 			}
-			list, err := models.GetActivitySpecialOpenIdListMobile(condition, pars)
-			if err != nil {
-				br.Msg = "查询openId失败"
-				br.ErrMsg = "查询openId失败,Err:" + err.Error()
+			//list, err := models.GetActivitySpecialOpenIdListMobile(condition, pars)
+			//if err != nil {
+			//	br.Msg = "查询openId失败"
+			//	br.ErrMsg = "查询openId失败,Err:" + err.Error()
+			//	return
+			//}
+
+			if mobileLen == 0 {
 				return
 			}
+			list, err := cygx.GetUserRecordListByMobileArr(mobileArr)
 			for _, idList := range list {
 				openIdList = append(openIdList, idList)
 				idMap[idList.OpenId] = idList.OpenId

+ 6 - 2
controllers/cygx/apply_record.go

@@ -6,6 +6,7 @@ import (
 	"hongze/hz_crm_api/controllers"
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/services"
 	cygxService "hongze/hz_crm_api/services/cygx"
 	"hongze/hz_crm_api/utils"
 	"strconv"
@@ -69,7 +70,7 @@ func (this *ApplyRecordController) ListSysRole() {
 	}
 
 	//权益申请销售只能看到自己名下的客户的申请 查研观向11.1
-	companyIds, err := cygxService.GetAdminLookUserCompanyIds(sysUser)
+	companyIds, err := cygxService.GetAdminLookUserCompanyIdsBySelf(sysUser)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,GetAdminLookUserCompanyIds Err:" + err.Error()
@@ -94,13 +95,15 @@ func (this *ApplyRecordController) ListSysRole() {
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
-
+	var sellerCompanyIds []int
 	var microvideoIds []int
 	for _, v := range list {
 		if v.Source == "roadshow" {
 			microvideoIds = append(microvideoIds, v.SourceId)
 		}
+		sellerCompanyIds = append(sellerCompanyIds, v.CompanyIdPay)
 	}
+	sellNameMap := services.GetSellNameMapByCompanyIds(sellerCompanyIds)
 	lenmicrovideoIds := len(microvideoIds)
 	mapmicrovideoChartPermissionId := make(map[int]int) //产业视频ID所对应的行业ID
 	mapmicrovideoIndustryId := make(map[int]int)        //产业视频ID所对应的行业ID
@@ -134,6 +137,7 @@ func (this *ApplyRecordController) ListSysRole() {
 		if v.InviteeCompany != "" {
 			list[i].ApplySource = "免费送月卡"
 		}
+		list[i].SellerName = sellNameMap[v.CompanyIdPay]
 		//用户状态,1:潜在客户 、2:现有客户 、3:FICC客户 、4:现有客户(正式,无对应权限) 、5:现有客户(试用,无对应权限)  、6:现有客户(试用暂停) 、7:现有客户(冻结) 、8:现有客户(流失)
 		switch v.CompanyIdType {
 		case 1:

+ 1198 - 0
controllers/cygx/contract_allocation.go

@@ -0,0 +1,1198 @@
+package cygx
+
+import (
+	"encoding/json"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"github.com/tealeg/xlsx"
+	"hongze/hz_crm_api/controllers"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/company"
+	"hongze/hz_crm_api/models/contract"
+	"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"
+	"strings"
+	"time"
+)
+
+// ContractAllocationController 权益合同派单
+type ContractAllocationController struct {
+	controllers.BaseAuthController
+}
+
+// getQueryParams 获取基础查询信息
+func getQueryParams(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=?"
+			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=?"
+			pars = append(pars, sysUser.AdminId)
+		}
+	}
+	newCondition = condition
+	newPars = pars
+	return
+}
+
+// @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   StartDate   query   string  false       "开始日期"
+// @Param   EndDate   query   string  false       "结束日期"
+// @Param   ContractType   query   string  false       "合同类型,枚举值:“,`新签合同`,`续约合同`,`补充协议`"
+// @Param   FormalType   query   string  false     "转正类型,枚举值:“,`标准`,`非标`"
+// @Param   IsExport   query   bool  false       "是否导出excel,默认是false"
+// @Param   ResearcherRealName   query   string  false       "研究员姓名"
+// @Param   IsAllocation   query   int  false       "派点状态: -1-默认全部; 0-未派点; 1-已派点"
+// @Success 200 {object}  cygx.CompanyContractListResp
+// @router /allocation/company_contract_list [get]
+func (this *ContractAllocationController) CompanyContractList() {
+	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")
+	adminId := this.GetString("AdminId")
+	formalType := this.GetString("FormalType")
+	contractType := this.GetString("ContractType")
+	keyword := this.GetString("Keyword")
+	startDate := this.GetString("StartDate")
+	endDate := this.GetString("EndDate")
+	researcherRealName := this.GetString("ResearcherRealName")
+	isAllocation, _ := this.GetInt("IsAllocation", -1) // CRM 13.9
+	if startDate == "" {
+		startDate = "2015-01-01"
+	}
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+	//是否导出报表
+	isExport, _ := this.GetBool("IsExport")
+	if isExport {
+		pageSize = 10000
+		currentIndex = 1
+	}
+
+	var condition string
+	var pars []interface{}
+
+	if endDate != "" {
+		condition += ` AND a.start_date >= ? AND a.start_date <= ? `
+		pars = append(pars, startDate+" 00:00:01", endDate+" 23:59:59")
+	}
+
+	//条件
+	if adminId != "" {
+		condition += ` AND c.seller_id in  (` + adminId + `) `
+		//pars = append(pars, adminId)
+	}
+
+	//权益申请销售只能看到自己名下的客户的申请
+	companyIds, err := cygxService.GetAdminLookUserCompanyIdsBySelf(sysUser)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,GetAdminLookUserCompanyIds Err:" + err.Error()
+		return
+	}
+	lencompanyIds := len(companyIds)
+	if lencompanyIds > 0 {
+		condition += ` AND c.company_id IN (` + utils.GetOrmInReplace(lencompanyIds) + `)`
+		pars = append(pars, companyIds)
+	}
+
+	//关键字搜索
+	if keyword != "" {
+		condition += ` and b.company_name like "%` + keyword + `%" `
+	}
+
+	//是否派点
+	if isAllocation != -1 {
+		condition += ` AND a.is_allocation = ? `
+		pars = append(pars, isAllocation)
+	}
+
+	// 标准非标查询
+	switch formalType {
+	case "标准":
+		condition += ` AND a.source = ? `
+		pars = append(pars, "系统合同")
+	case "非标":
+		condition += ` AND a.source = ? `
+		pars = append(pars, "上传附件")
+	}
+
+	if contractType != "" {
+		condition += ` AND a.contract_type = ? `
+		pars = append(pars, contractType)
+	}
+
+	//默认只查询权益 2023-06-01 之后的合同
+	condition += ` AND c.product_id = ?  AND a.start_date > ? `
+	pars = append(pars, 2, "2023-05-31")
+
+	mapMoneyPoint := make(map[int]float64)
+	//研究员姓名查询
+	if researcherRealName != "" {
+		var conditionAllocation string
+		var parsAllocation []interface{}
+
+		conditionAllocation = " AND  real_name = ? AND money != 0 "
+		parsAllocation = append(parsAllocation, researcherRealName)
+		allocationCompanyContractList, err := cygx.GetCygxAllocationCompanyContractList(conditionAllocation, parsAllocation)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetCygxAllocationCompanyContractListErr:" + err.Error()
+			return
+		}
+		var companyContractIds []int
+		for _, v := range allocationCompanyContractList {
+			companyContractIds = append(companyContractIds, v.CompanyContractId)
+			mapMoneyPoint[v.CompanyContractId] = v.Money
+		}
+		lenCon := len(companyContractIds)
+		if lenCon == 0 {
+			condition += ` AND a.company_contract_id = 0 `
+		} else {
+			condition += ` AND a.company_contract_id IN   (` + utils.GetOrmInReplace(lenCon) + `)`
+			pars = append(pars, companyContractIds)
+		}
+	}
+
+	var list []*cygx.CompanyContractResp
+
+	total, err := cygx.GetCompanyContractCountJoinCompany(condition, pars)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	//列表页数据
+	list, err = cygx.GetCompanyContractListJoinCompany(condition, pars, startSize, pageSize)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	//mapCompamy := make(map[int]string)
+	listLen := len(list)
+	if listLen == 0 {
+		list = make([]*cygx.CompanyContractResp, 0)
+	} else {
+
+		var contractCodes []string
+		var companyContractIds []int
+		for _, v := range list {
+			switch v.Source {
+			case "系统合同":
+				v.FormalType = "标准"
+			case "上传附件":
+				v.FormalType = "非标"
+			}
+			contractCodes = append(contractCodes, v.ContractCode)
+			companyContractIds = append(companyContractIds, v.CompanyContractId)
+			//mapCompamy[v.CompanyId] = strconv.Itoa(v.CompanyContractId)
+		}
+		lencontractCodes := len(contractCodes)
+		if lencontractCodes > 0 {
+			//获取标准合同的ID,这里上面的查询已经关联了三张表,拆分吧。。。
+			condition = ""
+			joinStr := ""
+			pars = make([]interface{}, 0)
+			condition = " AND  a.contract_code  IN (" + utils.GetOrmInReplace(lencontractCodes) + ") "
+			pars = append(pars, contractCodes)
+			listContract, err := contract.GetContractList(condition, joinStr, pars, 0, lencontractCodes)
+			if err != nil {
+				br.Msg = "获取合同列表失败!"
+				br.ErrMsg = "获取合同列表失败,Err:" + err.Error()
+				return
+			}
+
+			mapContractCode := make(map[string]int)
+			for _, v := range listContract {
+				mapContractCode[v.ContractCode] = v.ContractId
+			}
+
+			mapIsGray, err := cygxService.GetMapIsGrayByCompanyContractIds(companyContractIds)
+			if err != nil {
+				br.Msg = "获取合同列表失败!"
+				br.ErrMsg = "获取合同列表失败,GetMapIsGrayByCompanyContractIds Err:" + err.Error()
+				return
+			}
+
+			//合并合同所对应的权限
+			mappermissionName, err := cygxService.GetCompanyContractPermissionNameMapById(companyContractIds)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取失败,Err:" + err.Error()
+				return
+			}
+
+			for _, v := range list {
+				v.ContractId = mapContractCode[v.ContractCode]
+				v.MoneyPoint = mapMoneyPoint[v.CompanyContractId]
+				v.PermissionName = mappermissionName[v.CompanyContractId]
+				v.IsGray = mapIsGray[v.CompanyContractId]
+			}
+		}
+	}
+
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp := cygx.CompanyContractListResp{
+		Paging: page,
+		List:   list,
+	}
+	//导出excel
+	if isExport {
+		CompanyContractListExport(this, resp, br)
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// CompanyContractListExport 导出Excel
+func CompanyContractListExport(this *ContractAllocationController, resp cygx.CompanyContractListResp, br *models.BaseResponse) {
+	dir, err := os.Executable()
+	exPath := filepath.Dir(dir)
+	downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
+	xlsxFile := xlsx.NewFile()
+	if err != nil {
+		br.Msg = "生成文件失败"
+		br.ErrMsg = "生成文件失败"
+		return
+	}
+	style := xlsx.NewStyle()
+	alignment := xlsx.Alignment{
+		Horizontal: "center",
+		Vertical:   "center",
+		WrapText:   true,
+	}
+
+	style.Alignment = alignment
+	style.ApplyAlignment = true
+
+	sheel, err := xlsxFile.AddSheet("派点导出数据")
+	if err != nil {
+		br.Msg = "新增Sheet失败"
+		br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
+		return
+	}
+	sheel.SetColWidth(0, 0, 30)
+	sheel.SetColWidth(1, 1, 15)
+	sheel.SetColWidth(2, 2, 15)
+	sheel.SetColWidth(3, 3, 18)
+
+	titleRow := sheel.AddRow()
+
+	cellA := titleRow.AddCell()
+	cellA.SetStyle(style)
+	cellA.SetValue("合同编号")
+
+	cellB := titleRow.AddCell()
+	cellB.SetStyle(style)
+	cellB.SetValue("转正类型")
+
+	cellC := titleRow.AddCell()
+	cellC.SetStyle(style)
+	cellC.SetValue("合同类型")
+
+	cellD := titleRow.AddCell()
+	cellD.SetStyle(style)
+	cellD.SetValue("公司名称")
+
+	cellE := titleRow.AddCell()
+	cellE.SetStyle(style)
+	cellE.SetValue("所属销售")
+
+	cellF := titleRow.AddCell()
+	cellF.SetStyle(style)
+	cellF.SetValue("合同金额")
+
+	cellG := titleRow.AddCell()
+	cellG.SetStyle(style)
+	cellG.SetValue("合同期限")
+
+	cellH := titleRow.AddCell()
+	cellH.SetStyle(style)
+	cellH.SetValue("签约套餐")
+
+	cellI := titleRow.AddCell()
+	cellI.SetStyle(style)
+	cellI.SetValue("状态")
+
+	for _, v := range resp.List {
+		dataRow := sheel.AddRow()
+		dataRow.SetHeight(20)
+
+		cellA := dataRow.AddCell()
+		cellA.SetStyle(style)
+		cellA.SetValue(v.ContractCode)
+
+		cellB := dataRow.AddCell()
+		cellB.SetStyle(style)
+		cellB.SetValue(v.FormalType)
+
+		cellC := dataRow.AddCell()
+		cellC.SetStyle(style)
+		cellC.SetValue(v.ContractType)
+
+		cellD := dataRow.AddCell()
+		cellD.SetStyle(style)
+		cellD.SetValue(v.CompanyName)
+
+		cellE := dataRow.AddCell()
+		cellE.SetStyle(style)
+		cellE.SetValue(v.SellerName)
+
+		cellF := dataRow.AddCell()
+		cellF.SetStyle(style)
+		cellF.SetValue(v.Money)
+
+		cellG := dataRow.AddCell()
+		cellG.SetStyle(style)
+		cellG.SetValue(fmt.Sprint(v.StartDate, " ~  ", v.EndDate))
+
+		cellH := dataRow.AddCell()
+		cellH.SetStyle(style)
+		cellH.SetValue(v.PermissionName)
+
+		cellI := dataRow.AddCell()
+		cellI.SetStyle(style)
+		if v.IsAllocation == 1 {
+			cellI.SetValue("已派点")
+		} else {
+			cellI.SetValue("未派点")
+		}
+	}
+	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"
+// @Param   ShowDetail   query   bool  false      "是否是派点详情展示"
+// @Success Ret=200 {object} cygx.CygxAllocationCompanyContractDetailResp
+// @router /allocation/detail [get]
+func (this *ContractAllocationController) CompanyContracDetail() {
+	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.CygxAllocationCompanyContractDetailResp)
+	companyContractId, _ := this.GetInt("CompanyContractId")
+	if companyContractId < 1 {
+		br.Msg = "请输入详情ID"
+		return
+	}
+	showDetail, _ := this.GetBool("ShowDetail", false)
+	contractItem, err := company.GetCompanyContractById(companyContractId)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取合同信息失败,Err:" + err.Error()
+		return
+	}
+	total, err := cygx.GetCygxAllocationCompanyContractCountByCompanyContractId(companyContractId)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取合同信息失败,GetCygxAllocationCompanyContractCountByCompanyContractId Err:" + err.Error()
+		return
+	}
+
+	//var contractPermissionList []*company.ContractPermissionList
+	expMap := map[int]string{0: "(3w)", 1: "(5w)"} // 买方研选价格
+	hasPermissions, e := company.GetCompanyContractPermissionByCompanyContractId(companyContractId)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取合同权限信息失败,Err:" + e.Error()
+		return
+	}
+	hasMap := make(map[int]*company.CompanyContractPermission)
+	for _, p := range hasPermissions {
+		hasMap[p.ChartPermissionId] = p
+	}
+
+	raiPermissions, e := company.GetPermissionLookItemsExt("2", utils.COMPANY_PRODUCT_RAI_NAME)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取权益权限列表失败, Err: " + e.Error()
+		return
+	}
+	mapPermissionNameHave := make(map[string]bool) // 判断合同是否存在某一行业权限种类
+	var expensiveYx int
+	for _, n := range raiPermissions {
+		match := hasMap[n.ChartPermissionId]
+		if match == nil {
+			continue
+		}
+
+		mapPermissionNameHave[n.PermissionName] = true
+		// 买方研选(3w/5w)
+		if n.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN {
+			expensiveYx = match.ExpensiveYx
+			n.PermissionName += expMap[match.ExpensiveYx]
+			continue
+		}
+	}
+
+	resp.Money = contractItem.Money / 10000
+	//有研选时,对研选套餐类型做文案处理
+	respItemYx := new(cygx.AllocationPermissionListResp)
+	if mapPermissionNameHave[utils.CHART_PERMISSION_NAME_MF_YANXUAN] {
+		var moneyYx float64
+		if expensiveYx == 0 {
+			moneyYx = 3
+		}
+		if expensiveYx == 1 {
+			moneyYx = 5
+		}
+		resp.TotalPointsContent = fmt.Sprint(resp.Money, "W,", "其中", moneyYx, "w默认归属买方研选,请对剩余", resp.Money-moneyYx, "w按照100%进行比值分配")
+		if showDetail {
+			resp.TotalPointsContent = fmt.Sprint(resp.Money, "W")
+		}
+		resp.Money = resp.Money - moneyYx
+		respItemYx.Proportion = 0
+		respItemYx.Money = moneyYx
+		respItemYx.ChartPermissionName = utils.CHART_PERMISSION_NAME_MF_YANXUAN
+		respItemYx.List = append(respItemYx.List, &cygx.AllocationRealNameListResp{utils.CHART_PERMISSION_NAME_MF_YANXUAN, 0, moneyYx})
+	} else {
+		resp.TotalPointsContent = fmt.Sprint(resp.Money, "W")
+	}
+	sysUserList, err := cygx.GetAskEmailList()
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,GetAskEmailList Err: " + err.Error()
+		return
+	}
+	mapPermissionUser := make(map[string][]*cygx.AllocationRealNameListResp)
+
+	var respList []*cygx.AllocationPermissionListResp
+	if total == 0 {
+		for _, v := range sysUserList {
+			if !mapPermissionNameHave[v.ChartPermissionName] {
+				continue
+			}
+			item := new(cygx.AllocationRealNameListResp)
+			item.RealName = v.Name
+			mapPermissionUser[v.ChartPermissionName] = append(mapPermissionUser[v.ChartPermissionName], item)
+		}
+
+		for k, v := range mapPermissionUser {
+			respItem := new(cygx.AllocationPermissionListResp)
+			respItem.ChartPermissionName = k
+			respItem.List = v
+			respList = append(respList, respItem)
+		}
+		if respItemYx.ChartPermissionName != "" {
+			respList = append(respList, respItemYx)
+		}
+	} else {
+		listUser, err := cygx.GetCygxAllocationCompanyContractListById(companyContractId)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetCygxAllocationCompanyContractListById Err: " + err.Error()
+			return
+		}
+		for _, v := range listUser {
+			if showDetail && v.Money == 0 {
+				continue
+			}
+			item := new(cygx.AllocationRealNameListResp)
+			item.RealName = v.RealName
+			item.Money = v.Money
+			item.Proportion = v.Proportion
+			mapPermissionUser[v.ChartPermissionName] = append(mapPermissionUser[v.ChartPermissionName], item)
+		}
+		listPermission, err := cygx.GetCygxAllocationCompanyContractPermissionListById(companyContractId)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetCygxAllocationCompanyContractPermissionListById Err: " + err.Error()
+			return
+		}
+		for _, v := range listPermission {
+			if showDetail && v.Money == 0 {
+				continue
+			}
+			respItem := new(cygx.AllocationPermissionListResp)
+			respItem.ChartPermissionName = v.ChartPermissionName
+			respItem.Money = v.Money
+			respItem.Proportion = v.Proportion
+			respItem.List = mapPermissionUser[v.ChartPermissionName]
+			respList = append(respList, respItem)
+		}
+	}
+	//处理是否置灰
+	mapIsGray, err := cygxService.GetMapIsGrayByCompanyContractIds([]int{companyContractId})
+	if err != nil {
+		br.Msg = "获取合同列表失败!"
+		br.ErrMsg = "获取合同列表失败,GetMapIsGrayByCompanyContractIds Err:" + err.Error()
+		return
+	}
+
+	permissionNameArr := []string{"医药", "消费", "科技", "智造", "策略", "买方研选"}
+	for _, v := range permissionNameArr {
+		for _, v2 := range respList {
+			if v2.ChartPermissionName == v {
+				resp.List = append(resp.List, v2)
+			}
+		}
+	}
+	resp.IsGray = mapIsGray[companyContractId]
+	//resp.List = respList
+	resp.CompanyContractId = companyContractId
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 更新派点
+// @Description 更新派点接口
+// @Param	request	body cygx.AddProductInteriorReq true "type json string"
+// @Success 200 {object} "保存成功"
+// @router /allocation/update [post]
+func (this *ContractAllocationController) CompanyContracUpdate() {
+	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.UpdateAllocationCompanyContractReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	companyContractId := req.CompanyContractId
+	if companyContractId == 0 {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误,id不可为空"
+		return
+	}
+	mapIsGray, err := cygxService.GetMapIsGrayByCompanyContractIds([]int{companyContractId})
+	if err != nil {
+		br.Msg = "获取合同列表失败!"
+		br.ErrMsg = "获取合同列表失败,GetMapIsGrayByCompanyContractIds Err:" + err.Error()
+		return
+	}
+	if mapIsGray[companyContractId] {
+		br.Msg = "超过180天,无法修改!"
+		br.ErrMsg = "超过180天,无法修改,companyContractId :" + strconv.Itoa(companyContractId)
+		return
+	}
+
+	contractItem, err := company.GetCompanyContractById(companyContractId)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取合同信息失败,Err:" + err.Error()
+		return
+	}
+	money := contractItem.Money / 10000 // 合同金额,万为单位
+	var moneyAvg float64                // 行业所占合同的平均金额
+	hasPermissions, e := company.GetCompanyContractPermissionByCompanyContractId(companyContractId)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取合同权限信息失败,Err:" + e.Error()
+		return
+	}
+
+	hasMap := make(map[int]*company.CompanyContractPermission)
+	for _, p := range hasPermissions {
+		hasMap[p.ChartPermissionId] = p
+	}
+
+	raiPermissions, e := company.GetPermissionLookItemsExt("2", utils.COMPANY_PRODUCT_RAI_NAME)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取权益权限列表失败, Err: " + e.Error()
+		return
+	}
+	mapPermissionNameHave := make(map[string]bool) // 判断合同是否存在某一行业权限种类
+	for _, n := range raiPermissions {
+		//只计算,医药、消费、科技、智造、策略、买方研选的
+		if n.PermissionName != utils.YI_YAO_NAME && n.PermissionName != utils.XIAO_FEI_NAME && n.PermissionName != utils.KE_JI_NAME && n.PermissionName != utils.ZHI_ZAO_NAME && n.PermissionName != utils.CE_LUE_NAME && n.PermissionName != utils.CHART_PERMISSION_NAME_MF_YANXUAN {
+			continue
+		}
+		match := hasMap[n.ChartPermissionId]
+		if match == nil {
+			continue
+		}
+
+		// 买方研选(3w/5w)
+		if n.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN {
+			if match.ExpensiveYx == 1 {
+				money = money - 5
+			} else {
+				money = money - 3
+			}
+		} else {
+			mapPermissionNameHave[n.PermissionName] = true
+		}
+	}
+
+	if len(mapPermissionNameHave) > 0 {
+		moneyAvg = money / float64(len(mapPermissionNameHave))
+	}
+
+	list := req.List
+	var items []*cygx.CygxAllocationCompanyContract
+	var itemsPermission []*cygx.CygxAllocationCompanyContractPermission
+
+	var proportionSum float64 // 校验前端传过来的占比使用
+	for _, v := range list {
+		itemPermission := new(cygx.CygxAllocationCompanyContractPermission)
+		itemPermission.CompanyContractId = companyContractId
+		itemPermission.AdminId = sysUser.AdminId
+		itemPermission.AdminName = sysUser.RealName
+		itemPermission.Proportion = v.Proportion
+		itemPermission.Money = v.Money
+		if v.ChartPermissionName != utils.CHART_PERMISSION_NAME_MF_YANXUAN {
+			itemPermission.MoneyAvg = moneyAvg
+			if v.Money < moneyAvg/2 {
+				br.Msg = "单行业占比值不得低于平均值的一半"
+				br.ErrMsg = "单行业占比值不得低于平均值的一半,Err:" + fmt.Sprint(proportionSum)
+				return
+			}
+		}
+		itemPermission.ChartPermissionName = v.ChartPermissionName
+		itemPermission.CreateTime = time.Now()
+		itemPermission.ModifyTime = time.Now()
+		itemsPermission = append(itemsPermission, itemPermission)
+		var userProportionSum float64 // 校验前端传过来的占比使用
+
+		for _, v2 := range v.List {
+			if v2.Proportion < -20 {
+				br.Msg = "研究员占比值不得小于总额的-20%"
+				br.ErrMsg = "研究员占比值不得小于总额的20%,Err:" + fmt.Sprint(proportionSum)
+				return
+			}
+			item := new(cygx.CygxAllocationCompanyContract)
+			item.CompanyContractId = companyContractId
+			item.AdminId = sysUser.AdminId
+			item.AdminName = sysUser.RealName
+			item.Proportion = v2.Proportion
+			item.Money = v2.Money
+			item.RealName = v2.RealName
+			item.ChartPermissionName = v.ChartPermissionName
+			item.CreateTime = time.Now()
+			item.ModifyTime = time.Now()
+			items = append(items, item)
+			proportionSum += v2.Proportion
+			userProportionSum += v2.Proportion
+		}
+		//先添加0.2%的精度校验
+		if userProportionSum > (v.Proportion+0.2) || userProportionSum < (v.Proportion-0.2) {
+			br.Msg = "单行业下的研究员比值之和不等于行业占比值"
+			br.ErrMsg = "单行业下的研究员比值之和不等于行业占比值"
+			return
+		}
+	}
+
+	//先添加0.5%的精度校验
+	if proportionSum > 100.5 || proportionSum < 99.5 {
+		br.Msg = "行业总比值相加不等于100%"
+		br.ErrMsg = "行业总比值相加不等于100%,Err:"
+		return
+	}
+
+	err = cygx.AddAndUpdateCygxAllocationCompanyContract(items, itemsPermission, companyContractId)
+	if err != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "操作失败,AddAndUpdateCygxAllocationCompanyContract Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.IsAddLog = true
+	br.Msg = "操作成功"
+}
+
+// @Title 研究员派点统计
+// @Description 研究员派点统计接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   Keyword   query   string  true       "客户名称"
+// @Param   StartDate   query   string  false       "开始日期"
+// @Param   EndDate   query   string  false       "结束日期"
+// @Param   IsExport   query   bool  false       "是否导出excel,默认是false"
+// @Success 200 {object}  cygx.CompanyContractListResp
+// @router /allocation/statistics [get]
+func (this *ContractAllocationController) CompanyContractStatistics() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	keyword := this.GetString("Keyword")
+	startDate := this.GetString("StartDate")
+	endDate := this.GetString("EndDate")
+	if startDate == "" {
+		startDate = "2015-01-01"
+	}
+
+	//是否导出报表
+	isExport, _ := this.GetBool("IsExport")
+
+	var condition string
+
+	var pars []interface{}
+	if endDate != "" {
+		condition += ` AND a.start_date >= ? AND a.start_date <= ? `
+		pars = append(pars, startDate+" 00:00:01", endDate+" 23:59:59")
+	}
+	//根据当前角色来获取查询条件
+	//condition, pars = getQueryParams(condition, pars, sysUser, "c.")
+
+	companyIds, err := cygxService.GetAdminLookUserCompanyIdsBySelf(sysUser)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,GetAdminLookUserCompanyIds Err:" + err.Error()
+		return
+	}
+	lencompanyIds := len(companyIds)
+	if lencompanyIds > 0 {
+		condition += ` AND c.company_id IN (` + utils.GetOrmInReplace(lencompanyIds) + `)`
+		pars = append(pars, companyIds)
+	}
+
+	//关键字搜索
+	if keyword != "" {
+		condition += ` and b.company_name like "%` + keyword + `%" `
+	}
+
+	//默认只查询权益 2023-06-01 之后的合同
+	condition += ` AND c.product_id = ?  AND a.start_date > ?   `
+	pars = append(pars, 2, "2023-05-31")
+
+	//列表页数据
+	listContract, err := cygx.GetCompanyContractListJoinCompany(condition, pars, 0, 1000)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	//return
+	var companyContractIds []int
+	companyContractIdBool := make(map[int]bool)
+	for _, v := range listContract {
+		companyContractIds = append(companyContractIds, v.CompanyContractId)
+	}
+
+	lenArr := len(companyContractIds)
+	mapUserAllocation := make(map[string]float64) // 关联合同
+	mapUserMoney := make(map[string]float64)      // 派点金额
+	mapPermissionAllocation := make(map[string]float64)
+	mapPermissionMoney := make(map[string]float64)
+	mapPermissionMoneyAvg := make(map[string]float64)
+
+	//totalContract := lenArr //所有的关联合同
+	var totalMoney float64 //所有的关联合同的金额 单位万
+	if lenArr > 0 {
+		var conditionAllocation string
+		var parsAllocation []interface{}
+		conditionAllocation = ` AND company_contract_id IN(` + utils.GetOrmInReplace(lenArr) + ` ) `
+		parsAllocation = append(parsAllocation, companyContractIds)
+		allocationCompanyContractList, err := cygx.GetCygxAllocationCompanyContractList(conditionAllocation, parsAllocation)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		allocationCompanyContractPermissionList, err := cygx.GetCygxAllocationCompanyContractPermissionList(conditionAllocation, parsAllocation)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		for _, v := range allocationCompanyContractList {
+
+			if v.Proportion != 0 && v.ChartPermissionName != utils.CHART_PERMISSION_NAME_MF_YANXUAN {
+				mapUserAllocation[v.RealName] += 1
+				mapUserMoney[v.RealName] += v.Money
+				mapPermissionAllocation[v.ChartPermissionName] += 1
+				mapPermissionMoney[v.ChartPermissionName] += v.Money
+				totalMoney += v.Money
+				companyContractIdBool[v.CompanyContractId] = true
+			}
+		}
+		for _, v := range allocationCompanyContractPermissionList {
+			mapPermissionMoneyAvg[v.ChartPermissionName] += v.MoneyAvg
+		}
+	}
+
+	sysUserList, err := cygx.GetAskEmailList()
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,GetAskEmailList Err: " + err.Error()
+		return
+	}
+
+	mapPermissionUser := make(map[string][]*cygx.AllocationRealNameStatisticsListResp) //行业分组 map
+
+	for _, v := range sysUserList {
+		item := new(cygx.AllocationRealNameStatisticsListResp)
+		item.RealName = v.Name
+		item.TotalRelatedContract = mapUserAllocation[v.Name]
+		item.TotalDispatchPoint = utils.SubFloatToString(mapUserMoney[v.Name], 2)
+		if item.TotalDispatchPoint == "" {
+			item.TotalDispatchPoint = "0"
+		}
+		//组内占比
+		if mapUserMoney[v.Name] == 0 {
+			item.GroupProportion = ""
+		} else {
+			item.GroupProportion = utils.SubFloatToString(mapUserMoney[v.Name]/mapPermissionMoney[v.ChartPermissionName]*100, 2)
+		}
+		if item.GroupProportion == "" {
+			item.GroupProportion = "0"
+		}
+		item.GroupProportion += "%"
+
+		//部门占比
+		if totalMoney == 0 {
+			item.DepartmentProportion = ""
+		} else {
+			item.DepartmentProportion = utils.SubFloatToString(mapUserMoney[v.Name]/totalMoney*100, 2)
+		}
+		if item.DepartmentProportion == "" {
+			item.DepartmentProportion = "0"
+		}
+		item.DepartmentProportion += "%"
+		mapPermissionUser[v.ChartPermissionName] = append(mapPermissionUser[v.ChartPermissionName], item)
+	}
+
+	for k, v := range mapPermissionUser {
+		lenUser := len(v)
+		item := new(cygx.AllocationRealNameStatisticsListResp)
+		item.RealName = "合计"
+		item.TotalRelatedContract = mapPermissionAllocation[k]
+		item.TotalDispatchPoint = fmt.Sprint(utils.SubFloatToString(mapPermissionMoney[k], 2), "/", mapPermissionMoneyAvg[k])
+		item.GroupProportion = "100%"
+
+		//部门占比
+		if totalMoney == 0 {
+			item.DepartmentProportion = ""
+		} else {
+			item.DepartmentProportion = utils.SubFloatToString(mapPermissionMoney[k]/totalMoney*100, 2)
+		}
+		if item.DepartmentProportion == "" {
+			item.DepartmentProportion = "0"
+		}
+		item.DepartmentProportion += "%"
+		mapPermissionUser[k] = append(mapPermissionUser[k], item)
+
+		item = new(cygx.AllocationRealNameStatisticsListResp)
+		item.RealName = "平均"
+		item.TotalRelatedContract = utils.SubFloatToFloat(mapPermissionAllocation[k]/float64(lenUser), 2)
+		item.TotalDispatchPoint = utils.SubFloatToString(mapPermissionMoney[k]/float64(lenUser), 2)
+
+		//组内占比
+		if mapPermissionMoney[k] == 0 {
+			item.GroupProportion = ""
+		} else {
+			item.GroupProportion = utils.SubFloatToString(1/(float64(len(mapPermissionUser[k])-1))*100, 2)
+		}
+		if item.GroupProportion == "" {
+			item.GroupProportion = "0"
+		}
+		item.GroupProportion += "%"
+
+		// 部门占比
+		if totalMoney == 0 {
+			item.DepartmentProportion = ""
+		} else {
+			item.DepartmentProportion = utils.SubFloatToString(mapPermissionMoney[k]/totalMoney*100/float64(len(mapPermissionUser[k])-1), 2)
+		}
+
+		if item.DepartmentProportion == "" {
+			item.DepartmentProportion = "0"
+		}
+		item.DepartmentProportion += "%"
+		mapPermissionUser[k] = append(mapPermissionUser[k], item)
+	}
+
+	var list []*cygx.AllocationPermissionStatisticsListResp
+	permissionNameArr := []string{"医药", "消费", "科技", "智造", "策略"}
+	for _, v := range permissionNameArr {
+		item := new(cygx.AllocationPermissionStatisticsListResp)
+		item.ChartPermissionName = v
+		item.List = mapPermissionUser[v]
+		list = append(list, item)
+	}
+
+	resp := cygx.CygxAllocationCompanyContractDetailStatisticsResp{
+		List: list,
+	}
+	resp.TotalContract = len(companyContractIdBool)
+	resp.TotalMoney = utils.SubFloatToFloat(totalMoney, 2)
+	//导出excel
+	if isExport {
+		CompanyContractStatisticsExport(this, resp, br)
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// CompanyContractStatisticsExport 导出Excel
+func CompanyContractStatisticsExport(this *ContractAllocationController, resp cygx.CygxAllocationCompanyContractDetailStatisticsResp, br *models.BaseResponse) {
+	dir, err := os.Executable()
+	exPath := filepath.Dir(dir)
+	downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
+	xlsxFile := xlsx.NewFile()
+	if err != nil {
+		br.Msg = "生成文件失败"
+		br.ErrMsg = "生成文件失败"
+		return
+	}
+	style := xlsx.NewStyle()
+	alignment := xlsx.Alignment{
+		Horizontal: "center",
+		Vertical:   "center",
+		WrapText:   true,
+	}
+
+	style.Alignment = alignment
+	style.ApplyAlignment = true
+
+	sheel, err := xlsxFile.AddSheet("研究员派点统计")
+	if err != nil {
+		br.Msg = "新增Sheet失败"
+		br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
+		return
+	}
+	sheel.SetColWidth(0, 0, 30)
+	sheel.SetColWidth(1, 1, 15)
+	sheel.SetColWidth(2, 2, 15)
+	sheel.SetColWidth(3, 3, 18)
+
+	titleRow := sheel.AddRow()
+
+	cellA := titleRow.AddCell()
+	cellA.SetStyle(style)
+	cellA.SetValue("组别")
+
+	cellB := titleRow.AddCell()
+	cellB.SetStyle(style)
+	cellB.SetValue("研究员")
+
+	cellC := titleRow.AddCell()
+	cellC.SetStyle(style)
+	cellC.SetValue("关联合同")
+
+	cellD := titleRow.AddCell()
+	cellD.SetStyle(style)
+	cellD.SetValue("总派点")
+
+	cellE := titleRow.AddCell()
+	cellE.SetStyle(style)
+	cellE.SetValue("组内占比")
+
+	cellF := titleRow.AddCell()
+	cellF.SetStyle(style)
+	cellF.SetValue("部门占比")
+
+	for _, v := range resp.List {
+		for k2, v2 := range v.List {
+
+			dataRow := sheel.AddRow()
+			dataRow.SetHeight(20)
+
+			cellA := dataRow.AddCell()
+			cellA.SetStyle(style)
+			cellA.SetValue(v.ChartPermissionName)
+			if k2 < len(v.List)-1 {
+				cellA.VMerge = 1
+			}
+
+			cellB := dataRow.AddCell()
+			cellB.SetStyle(style)
+			cellB.SetValue(v2.RealName)
+
+			cellC := dataRow.AddCell()
+			cellC.SetStyle(style)
+			cellC.SetValue(v2.TotalRelatedContract)
+
+			cellD := dataRow.AddCell()
+			cellD.SetStyle(style)
+			cellD.SetValue(v2.TotalDispatchPoint)
+
+			cellE := dataRow.AddCell()
+			cellE.SetStyle(style)
+			cellE.SetValue(v2.GroupProportion)
+
+			cellF := dataRow.AddCell()
+			cellF.SetStyle(style)
+			cellF.SetValue(v2.DepartmentProportion)
+		}
+	}
+
+	titleRow = sheel.AddRow()
+	cellA = titleRow.AddCell()
+	cellA.HMerge = 1
+	cellA.SetStyle(style)
+	cellA.SetValue("部门合计")
+
+	cellB = titleRow.AddCell()
+	cellB.SetStyle(style)
+	cellB.SetValue("")
+
+	cellC = titleRow.AddCell()
+	cellC.SetStyle(style)
+	cellC.SetValue(resp.TotalContract)
+
+	cellD = titleRow.AddCell()
+	cellD.SetStyle(style)
+	cellD.SetValue(resp.TotalMoney)
+
+	cellE = titleRow.AddCell()
+	cellE.SetStyle(style)
+	cellE.SetValue("-")
+
+	cellF = titleRow.AddCell()
+	cellF.SetStyle(style)
+	cellF.SetValue("100%")
+
+	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 = "导出成功"
+}

+ 59 - 23
controllers/cygx/interview_apply.go

@@ -6,6 +6,7 @@ import (
 	"hongze/hz_crm_api/controllers"
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/cygx"
+	cygxService "hongze/hz_crm_api/services/cygx"
 	"hongze/hz_crm_api/utils"
 	"strings"
 )
@@ -45,28 +46,46 @@ func (this *InterviewApplyController) List() {
 	roleTypeCode := sysUser.RoleTypeCode
 	var condition string
 	var pars []interface{}
+	//{
+	//	if roleTypeCode != utils.ROLE_TYPE_CODE_ADMIN {
+	//		if roleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN {
+	//			condition += ` AND c.product_id=? `
+	//			pars = append(pars, 1)
+	//		} else if roleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN {
+	//			condition += ` AND c.product_id=? `
+	//			pars = append(pars, 2)
+	//		} else {
+	//			if sysUser.Authority <= 0 {
+	//				condition += ` AND c.seller_id=?  `
+	//				pars = append(pars, sysUser.AdminId)
+	//			} else {
+	//				if sysUser.Authority == 1 {
+	//					condition += ` AND c.department_id=? `
+	//					pars = append(pars, sysUser.DepartmentId)
+	//				}
+	//				if sysUser.Authority == 2 {
+	//					condition += ` AND c.group_id=? `
+	//					pars = append(pars, sysUser.GroupId)
+	//				}
+	//			}
+	//		}
+	//	}
+	//}
+
 	{
 		if roleTypeCode != utils.ROLE_TYPE_CODE_ADMIN {
-			if roleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN {
-				condition += ` AND c.product_id=? `
-				pars = append(pars, 1)
-			} else if roleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN {
-				condition += ` AND c.product_id=? `
-				pars = append(pars, 2)
-			} else {
-				if sysUser.Authority <= 0 {
-					condition += ` AND c.seller_id=?  `
-					pars = append(pars, sysUser.AdminId)
-				} else {
-					if sysUser.Authority == 1 {
-						condition += ` AND c.department_id=? `
-						pars = append(pars, sysUser.DepartmentId)
-					}
-					if sysUser.Authority == 2 {
-						condition += ` AND c.group_id=? `
-						pars = append(pars, sysUser.GroupId)
-					}
-				}
+			//权益申请销售只能看到自己名下的客户的申请
+			companyIds, err := cygxService.GetAdminLookUserCompanyIds(sysUser)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取失败,GetAdminLookUserCompanyIds Err:" + err.Error()
+				return
+			}
+
+			lencompanyIds := len(companyIds)
+			if lencompanyIds > 0 {
+				condition += ` AND a.company_id  IN (` + utils.GetOrmInReplace(lencompanyIds) + `)`
+				pars = append(pars, companyIds)
 			}
 		}
 	}
@@ -81,7 +100,25 @@ func (this *InterviewApplyController) List() {
 	startSize = paging.StartIndex(currentIndex, pageSize)
 
 	if keyWord != "" {
-		condition += ` AND (b.mobile LIKE '%` + keyWord + `%' OR b.email LIKE '%` + keyWord + `%' OR b.real_name LIKE '%` + keyWord + `%') `
+		var conditionuiUser string
+		var parsUser []interface{}
+		conditionuiUser += ` AND (mobile LIKE '%` + keyWord + `%' OR email LIKE '%` + keyWord + `%' OR real_name LIKE '%` + keyWord + `%') `
+		listUser, err := models.GetWxUserList(conditionuiUser, parsUser)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = ",GetWxUserListErr:" + err.Error()
+			return
+		}
+		var userIds []int
+
+		for _, v := range listUser {
+			userIds = append(userIds, int(v.UserId))
+		}
+		lenuserIds := len(userIds)
+		if lenuserIds > 0 {
+			condition += ` AND a.user_id  IN (` + utils.GetOrmInReplace(lenuserIds) + `)`
+			pars = append(pars, userIds)
+		}
 	}
 
 	total, err := cygx.GetInterviewApplyListCount(condition, pars)
@@ -102,7 +139,6 @@ func (this *InterviewApplyController) List() {
 	for _, v := range list {
 		userIds = append(userIds, v.UserId)
 	}
-
 	listUser, err := models.GetWxUserRaiSllerListByUserIds(userIds)
 	if err != nil {
 		br.Msg = "获取失败"
@@ -119,7 +155,7 @@ func (this *InterviewApplyController) List() {
 			v.UserRealName = mapUser[v.UserId].RealName
 			v.Mobile = mapUser[v.UserId].Mobile
 			v.CompanyName = mapUser[v.UserId].CompanyName
-			v.SalesRealName = mapUser[v.UserId].SalesName
+			v.SalesRealName = mapUser[v.UserId].SellerName
 		}
 	}
 	if list == nil {

+ 16 - 15
controllers/cygx/report_article.go

@@ -562,22 +562,22 @@ func (this *IndustrialSubjectController) Export() {
 	var list []*cygx.ReportExportRep
 	var err error
 	if resp.IsCanDownload == false {
-		if adminInfo.RoleTypeCode == "rai_group" {
-			//if sysUser.Authority == 2 {
-			//组长查看本组所有组员
-			//fmt.Println("组长")
-			sqlStr := ` AND h.user_id IN (SELECT user_id FROM user_seller_relation WHERE seller_id IN (SELECT  admin_id FROM admin WHERE group_id = (SELECT group_id FROM admin WHERE admin_id = ` + strconv.Itoa(sysUser.AdminId) + ` ) )) `
-			listSeller, errSeller := cygx.GetReportExportRep(reportId, sqlStr)
-			list = listSeller
-			err = errSeller
-		} else {
-			//组员查看自己
-			//fmt.Println("组员")
-			sqlStr := ` AND h.user_id IN (SELECT user_id FROM user_seller_relation WHERE seller_id  = ` + strconv.Itoa(sysUser.AdminId) + `) `
-			listSeller, errSeller := cygx.GetReportExportRep(reportId, sqlStr)
-			list = listSeller
-			err = errSeller
+		//权益申请销售只能看到自己名下的客户的申请
+		companyIds, err := cygxService.GetAdminLookUserCompanyIds(sysUser)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetAdminLookUserCompanyIds Err:" + err.Error()
+			return
 		}
+		var companyIdstr []string
+		for _, v := range companyIds {
+			companyIdstr = append(companyIdstr, strconv.Itoa(v))
+		}
+		sqlStr := ` AND h.company_id IN  (` + strings.Join(companyIdstr, ",") + `) `
+		listSeller, errSeller := cygx.GetReportExportRep(reportId, sqlStr)
+		list = listSeller
+		err = errSeller
+
 	} else {
 		sqlStr := ""
 		listAdmin, errAdmin := cygx.GetReportExportRep(reportId, sqlStr)
@@ -600,6 +600,7 @@ func (this *IndustrialSubjectController) Export() {
 			listNew = append(listNew, v)
 		}
 	}
+
 	//创建excel
 	dir, err := os.Executable()
 	exPath := filepath.Dir(dir)

+ 21 - 6
controllers/cygx/report_selection.go

@@ -9,6 +9,7 @@ import (
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/cygx"
 	"hongze/hz_crm_api/models/system"
+	"hongze/hz_crm_api/services"
 	cygxService "hongze/hz_crm_api/services/cygx"
 	"hongze/hz_crm_api/utils"
 	"os"
@@ -325,13 +326,22 @@ func (this *ReportSelectionController) Detail() {
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
+
+	permissionNameMap, err := services.GetPermissionNameMap()
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败 GetPermissionNameMap,Err:" + err.Error()
+		return
+	}
 	mapChartLog := make(map[string]string)
 	for _, v := range listChartLog {
+		v.ChartPermissionName = permissionNameMap[v.ChartPermissionId]
 		mapChartLog[v.ChartPermissionName] = v.BodyChartSummary
 		permissionNameList = append(permissionNameList, cygx.CygxChartPermissionName{v.ChartPermissionName})
 	}
 	for _, v := range permissionNameList {
 		for _, v2 := range listMore {
+			v2.ChartPermissionName = permissionNameMap[v2.ChartPermissionId]
 			if v.ChartPermissionName == v2.ChartPermissionName {
 				item := new(cygx.CygxReportSelectionChart)
 				item.ChartPermissionName = v2.ChartPermissionName
@@ -699,13 +709,18 @@ func (this *ReportSelectionController) ArticleHistoryExport() {
 
 	var condition string
 	if resp.IsCanDownload == false {
-		if adminInfo.RoleTypeCode == "rai_group" {
-			//组长查看本组所有组员
-			condition = ` AND h.company_id IN (SELECT company_id FROM user_seller_relation WHERE seller_id IN (SELECT  admin_id FROM admin WHERE group_id = (SELECT group_id FROM admin WHERE admin_id = ` + strconv.Itoa(AdminUser.AdminId) + ` ) ) GROUP BY company_id) `
-		} else {
-			//组员查看自己
-			condition = ` AND h.company_id IN (SELECT company_id FROM user_seller_relation WHERE seller_id  = ` + strconv.Itoa(AdminUser.AdminId) + ` GROUP  BY company_id) `
+		//权益申请销售只能看到自己名下的客户的申请
+		companyIds, err := cygxService.GetAdminLookUserCompanyIds(AdminUser)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetAdminLookUserCompanyIds Err:" + err.Error()
+			return
+		}
+		var companyIdstr []string
+		for _, v := range companyIds {
+			companyIdstr = append(companyIdstr, strconv.Itoa(v))
 		}
+		condition = ` AND h.company_id IN (` + strings.Join(companyIdstr, ",") + `)`
 	}
 
 	condition += `  AND h.company_id != ` + strconv.Itoa(utils.HZ_COMPANY_ID) // 过滤弘则来源

+ 20 - 27
controllers/cygx/search_keyword.go

@@ -1,12 +1,12 @@
 package cygx
 
 import (
-	"fmt"
 	"github.com/rdlucklib/rdluck_tools/paging"
 	"github.com/tealeg/xlsx"
 	"hongze/hz_crm_api/controllers"
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/cygx"
+	cygxService "hongze/hz_crm_api/services/cygx"
 	"hongze/hz_crm_api/utils"
 	"os"
 	"path/filepath"
@@ -107,40 +107,33 @@ func (this *SearchKeywordController) HostKeywordDownload() {
 	currentTime := time.Now()
 	starTime := currentTime.AddDate(0, 0, -7).Format("2006-01-02") + " 00:00:00"
 	endTime := currentTime.AddDate(0, 0, -1).Format("2006-01-02") + " 23:59:59"
-	fmt.Println(starTime)
-	fmt.Println(endTime)
+
 	var list []*cygx.KeyWordListDownload
 	var err error
-	fmt.Println(sysUser.AdminId)
-	fmt.Println(sysUser)
-	if resp.IsCanDownload == false {
-		//if sysUser.RoleTypeCode == "rai_group" {
-		if sysUser.Authority == 2 {
-			//组长查看本组所有组员
-			//fmt.Println("组长")
-			sqlStr := ` AND kw.user_id IN (SELECT user_id FROM user_seller_relation WHERE seller_id IN (SELECT  admin_id FROM admin WHERE group_id = (SELECT group_id FROM admin WHERE admin_id = ` + strconv.Itoa(sysUser.AdminId) + ` ) )) `
-			listSeller, errSeller := cygx.GetSearchKeyWordListDownloadSeller(starTime, endTime, sqlStr)
-			list = listSeller
-			err = errSeller
-		} else {
-			//组员查看自己
-			//fmt.Println("组员")
-			sqlStr := ` AND kw.user_id IN (SELECT user_id FROM user_seller_relation WHERE seller_id  = ` + strconv.Itoa(sysUser.AdminId) + `) `
-			listSeller, errSeller := cygx.GetSearchKeyWordListDownloadSeller(starTime, endTime, sqlStr)
-			list = listSeller
-			err = errSeller
-		}
-	} else {
-		listAdmin, errAdmin := cygx.GetSearchKeyWordListDownload(starTime, endTime)
-		list = listAdmin
-		err = errAdmin
-	}
+	listAdmin, err := cygx.GetSearchKeyWordListDownload(starTime, endTime)
+
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
 
+	if resp.IsCanDownload == false {
+		mapMobile, err := cygxService.GetAdminLookUserMobile(sysUser)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,销售对应权限,Err:" + err.Error()
+			return
+		}
+		for _, v := range listAdmin {
+			if _, ok := mapMobile[v.Mobile]; ok {
+				list = append(list, v)
+			}
+		}
+	} else {
+		list = listAdmin
+	}
+
 	listComPany, err := cygx.GetCompanyProductMoreOneList(starTime, endTime)
 	var strId string
 	for _, v := range listComPany {

+ 11 - 6
controllers/cygx/summary_manage.go

@@ -1148,13 +1148,18 @@ func (this *SummaryManage) ArticleHistoryExport() {
 
 	var condition string
 	if resp.IsCanDownload == false {
-		if adminInfo.RoleTypeCode == "rai_group" {
-			//组长查看本组所有组员
-			condition = ` AND h.company_id IN (SELECT company_id FROM user_seller_relation WHERE seller_id IN (SELECT  admin_id FROM admin WHERE group_id = (SELECT group_id FROM admin WHERE admin_id = ` + strconv.Itoa(AdminUser.AdminId) + ` ) ) GROUP BY company_id) `
-		} else {
-			//组员查看自己
-			condition = ` AND h.company_id IN (SELECT company_id FROM user_seller_relation WHERE seller_id  = ` + strconv.Itoa(AdminUser.AdminId) + ` GROUP  BY company_id) `
+		//权益申请销售只能看到自己名下的客户的申请
+		companyIds, err := cygxService.GetAdminLookUserCompanyIds(AdminUser)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetAdminLookUserCompanyIds Err:" + err.Error()
+			return
+		}
+		var companyIdstr []string
+		for _, v := range companyIds {
+			companyIdstr = append(companyIdstr, strconv.Itoa(v))
 		}
+		condition = ` AND h.company_id IN (` + strings.Join(companyIdstr, ",") + `) `
 	}
 
 	mapMobileSellWithUser := make(map[string]string)

+ 116 - 11
controllers/cygx/user.go

@@ -397,6 +397,7 @@ func (this *UserController) List() {
 		return
 	}
 	var userIds string
+	var userIdArr []int
 	if list != nil {
 		for k, v := range list {
 			if v.RegisterTime != "" {
@@ -426,6 +427,7 @@ func (this *UserController) List() {
 				}
 			}
 			userIds += strconv.Itoa(int(v.UserId)) + ","
+			userIdArr = append(userIdArr, int(v.UserId))
 		}
 		userIds = strings.TrimRight(userIds, ",")
 		splitList, err := cygx.GetCygxCompanyUserListSplit(userIds)
@@ -448,6 +450,8 @@ func (this *UserController) List() {
 			}
 		}
 
+		UserRemindListMap := cygxService.GetCygxUserRemindListMap(userIdArr)
+
 		for k, v := range list {
 			for _, vsplit := range splitList {
 				if vsplit.UserId == v.UserId {
@@ -468,6 +472,7 @@ func (this *UserController) List() {
 			if mapUserRemarks[int(v.UserId)] != "" {
 				list[k].Content = mapUserRemarks[int(v.UserId)]
 			}
+			list[k].IsRemind = UserRemindListMap[int(v.UserId)]
 		}
 		for k := range list {
 			list[k].InteractionNum = list[k].HistoryNum + list[k].CountNum + list[k].IndustryFllowNum + list[k].DepartmentFollowNum + list[k].KeyWordNum + list[k].OnLineNum + list[k].OfficeNum + list[k].ChartNum + list[k].TripNum + list[k].RoadshowVideoNum + list[k].ActivityVideoNum + list[k].ActivityVoiceNum
@@ -2039,7 +2044,8 @@ func (this *UserController) CompanyTableDetail() {
 	var condition string
 	condition += ` AND r.company_id  =   ` + strconv.Itoa(companyId) + ` AND r.create_time < '` + time.Now().Format(utils.FormatDate) + `' `
 	if keyWord != "" {
-		condition += ` AND r.mobile IN (SELECT mobile FROM wx_user WHERE mobile LIKE '%` + keyWord + `%' OR email LIKE '%` + keyWord + `%' OR real_name LIKE '%` + keyWord + `%')`
+		//condition += ` AND r.mobile IN (SELECT mobile FROM wx_user WHERE mobile LIKE '%` + keyWord + `%' OR email LIKE '%` + keyWord + `%' OR real_name LIKE '%` + keyWord + `%')`
+		condition += ` AND ( r.mobile LIKE '%` + keyWord + `%' OR r.email LIKE '%` + keyWord + `%' OR r.real_name LIKE '%` + keyWord + `%')`
 	}
 
 	if source == 1 {
@@ -2445,7 +2451,8 @@ func (this *UserController) CompanyExportInteraction() {
 	var condition string
 	condition += ` AND r.company_id  =   ` + strconv.Itoa(companyId) + ` AND r.create_time < date_format(now(),'%Y-%m-%d') ` //过滤当天时间
 	if keyWord != "" {
-		condition += ` AND r.user_id IN (SELECT user_id FROM wx_user WHERE mobile LIKE '%` + keyWord + `%' OR email LIKE '%` + keyWord + `%' OR real_name LIKE '%` + keyWord + `%')`
+		//condition += ` AND r.user_id IN (SELECT user_id FROM wx_user WHERE mobile LIKE '%` + keyWord + `%' OR email LIKE '%` + keyWord + `%' OR real_name LIKE '%` + keyWord + `%')`
+		condition += ` AND ( r.mobile LIKE '%` + keyWord + `%' OR r.email LIKE '%` + keyWord + `%' OR r.real_name LIKE '%` + keyWord + `%')`
 	}
 	if source == 1 {
 		if startDate != "" {
@@ -2987,7 +2994,7 @@ func (this *UserController) CompanyList() {
 		br.ErrMsg = "获取公司ID数据失败,Err:" + err.Error()
 		return
 	}
-	condition = ` AND r.company_id  IN  (   ` + companyCondition + `  )AND r.create_time < date_format(now(),'%Y-%m-%d') ` //过滤当天时间
+	condition = ` AND r.company_id  IN  (   ` + companyIds + `  )AND r.create_time < date_format(now(),'%Y-%m-%d') ` //过滤当天时间
 	if keyWord != "" {
 		condition += ` AND  (r.mobile LIKE '%` + keyWord + `%' OR r.email LIKE '%` + keyWord + `%' OR r.real_name LIKE '%` + keyWord + `%'` + ` OR r.company_name LIKE '%` + keyWord + `%') `
 	}
@@ -3019,7 +3026,10 @@ func (this *UserController) CompanyList() {
 		//}
 
 		//fmt.Println("es 搜索")
-		_, esList, err := services.SearcCygxArticleHistoryData(utils.IndexNameArticleHistory, keyWord, startDate, endDate, companyIds, startSize, pageSize)
+		totalEs, esList, err := services.SearcCygxArticleHistoryData(utils.IndexNameArticleHistory, keyWord, startDate, endDate, companyIds, startSize, pageSize)
+		if keyWord+startDate+endDate != "" {
+			total = int(totalEs)
+		}
 		var articleIds string
 		if len(esList) > 0 {
 			articleIdMap := make(map[int]int)
@@ -3034,9 +3044,12 @@ func (this *UserController) CompanyList() {
 		articleIds = strings.TrimRight(articleIds, ",")
 		if articleIds != "" {
 			condition = ` AND r.id IN (` + articleIds + `) `
+		} else {
+			condition = ` AND r.id  = 0  `
 		}
-
-		list, err = cygx.GetCygxArticleHistoryRecordByCompanyList(condition, 0, 0)
+		//fmt.Println(articleIds)
+		//return
+		list, err = cygx.GetCygxArticleHistoryRecordByCompanyList(condition, 0, pageSize)
 		if err != nil && err.Error() != utils.ErrNoRow() {
 			br.Msg = "获取信息失败"
 			br.ErrMsg = "获取用户阅读记录,Err:" + err.Error()
@@ -3046,6 +3059,7 @@ func (this *UserController) CompanyList() {
 			var articleIds string
 			mapAricleId := make(map[int]int)
 			mapAricleIndustrialSubjectName := make(map[int]*cygx.ArticleIndustrialSubjectNameResp)
+			var sellerCompanyIds []int
 			for k, v := range list {
 				if v.ArticleId >= utils.SummaryArticleId {
 					list[k].ArticleType = 1
@@ -3060,7 +3074,10 @@ func (this *UserController) CompanyList() {
 					mapAricleId[v.ArticleId] = v.ArticleId
 				}
 				list[k].RegisterPlatform = cygxService.GetArticleSourcePlatform(v.SourcePlatform)
+				sellerCompanyIds = append(sellerCompanyIds, v.CompanyId)
 			}
+
+			sellNameMap := services.GetSellNameMapByCompanyIds(sellerCompanyIds)
 			articleIds = strings.TrimRight(articleIds, ",")
 			if articleIds != "" {
 				listArticleIndustrialSubjectList, err := cygx.GetCygxArticleIndustrialSubjectName(articleIds)
@@ -3078,6 +3095,7 @@ func (this *UserController) CompanyList() {
 							list[k].IndustryName = mapAricleIndustrialSubjectName[v.ArticleId].IndustryName
 							list[k].SubjectNameStr = mapAricleIndustrialSubjectName[v.ArticleId].SubjectNameStr
 						}
+						list[k].SellerName = sellNameMap[v.CompanyId]
 					}
 				}
 			}
@@ -3122,6 +3140,13 @@ func (this *UserController) CompanyList() {
 			br.Msg = "获取参会人数列表失败"
 			return
 		}
+		//根据公司ID获取对应销售
+		var sellerCompanyIds []int
+		for _, v := range list {
+			sellerCompanyIds = append(sellerCompanyIds, v.CompanyId)
+		}
+		sellNameMap := services.GetSellNameMapByCompanyIds(sellerCompanyIds)
+
 		if len(list) > 0 {
 			for k, v := range list {
 				if v.ActivityType == 1 {
@@ -3138,6 +3163,7 @@ func (this *UserController) CompanyList() {
 					list[k].FirstMeetingTime = ""
 					list[k].LastMeetingTime = ""
 				}
+				v.SellerName = sellNameMap[v.CompanyId]
 			}
 		}
 	} else if source == 3 {
@@ -3153,6 +3179,13 @@ func (this *UserController) CompanyList() {
 			br.ErrMsg = "获取用户搜藏记录失败,Err:" + err.Error()
 			return
 		}
+		//根据公司ID获取对应销售
+		var sellerCompanyIds []int
+		for _, v := range list {
+			sellerCompanyIds = append(sellerCompanyIds, v.CompanyId)
+		}
+		sellNameMap := services.GetSellNameMapByCompanyIds(sellerCompanyIds)
+
 		if len(list) > 0 {
 			for k, v := range list {
 				if v.ArticleId >= utils.SummaryArticleId {
@@ -3160,6 +3193,7 @@ func (this *UserController) CompanyList() {
 				} else {
 					list[k].ArticleType = 2
 				}
+				v.SellerName = sellNameMap[v.CompanyId]
 			}
 		}
 	} else if source == 4 {
@@ -3227,6 +3261,16 @@ func (this *UserController) CompanyList() {
 			br.Msg = "获取用户关注总数失败"
 			return
 		}
+		//根据公司ID获取对应销售
+		var sellerCompanyIds []int
+		for _, v := range list {
+			sellerCompanyIds = append(sellerCompanyIds, v.CompanyId)
+		}
+		sellNameMap := services.GetSellNameMapByCompanyIds(sellerCompanyIds)
+		for _, v := range list {
+			v.SellerName = sellNameMap[v.CompanyId]
+		}
+
 	} else if source == 6 {
 		total, err = cygx.GetCygArticleDepartmentFollowCountByCompany(condition)
 		if err != nil {
@@ -3241,7 +3285,15 @@ func (this *UserController) CompanyList() {
 			return
 		}
 		if len(list) > 0 {
+			//根据公司ID获取对应销售
+			var sellerCompanyIds []int
+			for _, v := range list {
+				sellerCompanyIds = append(sellerCompanyIds, v.CompanyId)
+			}
+			sellNameMap := services.GetSellNameMapByCompanyIds(sellerCompanyIds)
+
 			for k, v := range list {
+				v.SellerName = sellNameMap[v.CompanyId]
 				var conditionDepartment string
 				var pars []interface{}
 				conditionDepartment += ` WHERE art.source = 1 AND art.is_summary = 1 AND art.department_id =  ` + strconv.Itoa(v.DepartmentId)
@@ -3296,6 +3348,16 @@ func (this *UserController) CompanyList() {
 			br.ErrMsg = "获取搜索记录列表失败,Err:" + err.Error()
 			return
 		}
+		//根据公司ID获取对应销售
+		var sellerCompanyIds []int
+		for _, v := range list {
+			sellerCompanyIds = append(sellerCompanyIds, v.CompanyId)
+		}
+		sellNameMap := services.GetSellNameMapByCompanyIds(sellerCompanyIds)
+		for _, v := range list {
+			v.SellerName = sellNameMap[v.CompanyId]
+		}
+
 	} else if source == 8 {
 		total, err = cygx.GetCygxActivitySpecialTripCountByCompany(condition)
 		if err != nil {
@@ -3322,6 +3384,17 @@ func (this *UserController) CompanyList() {
 			br.ErrMsg = "获取搜索记录列表失败,Err:" + err.Error()
 			return
 		}
+
+		//根据公司ID获取对应销售
+		var sellerCompanyIds []int
+		for _, v := range list {
+			sellerCompanyIds = append(sellerCompanyIds, v.CompanyId)
+		}
+		sellNameMap := services.GetSellNameMapByCompanyIds(sellerCompanyIds)
+		for _, v := range list {
+			v.SellerName = sellNameMap[v.CompanyId]
+		}
+
 	} else if source == 10 { //标签点击记录
 		condition = ``
 		if adminId != "" {
@@ -3610,13 +3683,30 @@ func (this *UserController) CompanyExportInteractionList() {
 		}
 	}
 
+	//condition += ` AND b.status IN ('正式','试用','冻结') `
+	//companyCondition := `SELECT a.company_id FROM company AS a  INNER JOIN company_product AS b ON a.company_id=b.company_id   WHERE a.enabled=1  `
+	//if condition != "" {
+	//	companyCondition += condition
+	//}
+
 	condition += ` AND b.status IN ('正式','试用','冻结') `
 	companyCondition := `SELECT a.company_id FROM company AS a  INNER JOIN company_product AS b ON a.company_id=b.company_id   WHERE a.enabled=1  `
+	companyIdsCondition := `SELECT GROUP_CONCAT( DISTINCT  a.company_id SEPARATOR ',' )  AS company_ids   FROM company AS a  INNER JOIN company_product AS b ON a.company_id=b.company_id   WHERE a.enabled=1  `
 	if condition != "" {
 		companyCondition += condition
 	}
+	companyIdsCondition += condition
+	var companyIds string
+	companyIds, err = cygx.GetCompanyIdsCondition(companyIdsCondition)
+
+	companyIds, err = cygx.GetCompanyIdsCondition(companyIdsCondition)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取公司ID数据失败,Err:" + err.Error()
+		return
+	}
 
-	condition = ` AND r.company_id  IN  (   ` + companyCondition + `  )AND r.create_time < date_format(now(),'%Y-%m-%d') ` //过滤当天时间
+	condition = ` AND r.company_id  IN  (   ` + companyIds + `  )AND r.create_time < date_format(now(),'%Y-%m-%d') ` //过滤当天时间
 	if keyWord != "" {
 		condition += ` AND  (r.mobile LIKE '%` + keyWord + `%' OR r.email LIKE '%` + keyWord + `%' OR r.real_name LIKE '%` + keyWord + `%'` + ` OR r.company_name LIKE '%` + keyWord + `%') `
 	}
@@ -4120,14 +4210,13 @@ func (this *UserController) TableCompanyList() {
 			}
 		}
 	}
-
 	condition += ` AND b.status IN ('正式','试用','冻结') `
-	companyCondition := `SELECT a.company_id FROM company AS a  INNER JOIN company_product AS b ON a.company_id=b.company_id   WHERE a.enabled=1  `
+	companyCondition := ` AND  a.enabled=1  `
 	if condition != "" {
 		companyCondition += condition
 	}
 
-	condition = ` AND r.company_id  IN  (   ` + companyCondition + `  )AND r.create_time < date_format(now(),'%Y-%m-%d') ` //过滤当天时间
+	//condition = ` AND r.company_id  IN  (   ` + companyCondition + `  )AND r.create_time < date_format(now(),'%Y-%m-%d') ` //过滤当天时间
 
 	//historyNum, err := cygx.GetCygxArticleHistoryCountByCompany(condition)
 	//if err != nil {
@@ -4142,6 +4231,22 @@ func (this *UserController) TableCompanyList() {
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
 		return
 	}
+	var pars []interface{}
+
+	lsitCompany, err := company.GetCompanyProductListBycondition(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,GetCompanyProductListBycondition Err:" + err.Error()
+		return
+	}
+
+	var companyIds []string
+	for _, v := range lsitCompany {
+		companyIds = append(companyIds, strconv.Itoa(v.CompanyId))
+	}
+	condition = " AND  r.company_id IN (" + strings.Join(companyIds, ",") + ")"
+	condition += `  AND r.create_time < date_format(now(),'%Y-%m-%d') ` //过滤当天时间
+
 	historyNum, _ := strconv.Atoi(detailConfig.ConfigValue)
 	//获取参会总数
 	activityNum, err := cygx.GetActivityMeetByCompanyCount(condition)
@@ -4199,7 +4304,7 @@ func (this *UserController) TableCompanyList() {
 		br.ErrMsg = "获取搜索记录失败,Err:" + err.Error()
 		return
 	}
-	tagNum, err := cygx.GetCygxTagHistoryCountByCompanyIds(companyCondition, "")
+	tagNum, err := cygx.GetCygxTagHistoryCountByCompanyIds(strings.Join(companyIds, ","), "")
 	if err != nil {
 		br.ErrMsg = "获取信息失败,Err:" + err.Error()
 		br.Msg = "获取搜索记录失败"

+ 296 - 0
controllers/cygx/yanxuan_special.go

@@ -0,0 +1,296 @@
+package cygx
+
+import (
+	"encoding/json"
+	"hongze/hz_crm_api/controllers"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/cygx"
+	cygxService "hongze/hz_crm_api/services/cygx"
+	"hongze/hz_crm_api/services/elastic"
+	"hongze/hz_crm_api/utils"
+	"strconv"
+	"time"
+)
+
+// YanxuanSpecialController 研选专栏
+type YanxuanSpecialController struct {
+	controllers.BaseAuthController
+}
+
+// @Title 新增研选专栏作者
+// @Description 新增研选专栏作者
+// @Param	request	body help_doc.AddHelpDocReq true "type json string"
+// @Success 200 {object} models.AddEnglishReportResp
+// @router /yanxuan_special/author/add [post]
+func (this *YanxuanSpecialController) Add() {
+	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.AddCygxYanxuanSpecialAuthorReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if req.UserId <= 0 {
+		br.Msg = "请输入用户信息"
+		return
+	}
+	if req.RealName == "" {
+		br.Msg = "请输入真实姓名"
+		return
+	}
+	if req.Mobile == "" {
+		br.Msg = "请输入手机号"
+		return
+	}
+	rnd := utils.GetRandInt(1, 5)
+	item := cygx.CygxYanxuanSpecialAuthor{
+		UserId:     req.UserId,
+		RealName:   req.RealName,
+		Mobile:     req.Mobile,
+		CreateTime: time.Now(),
+		ModifyTime: time.Now(),
+		HeadImg:    utils.CYGX_YANXUAN_SPECIAL_HEAD_IMG_URL + strconv.Itoa(rnd) + ".png",
+		BgImg:      utils.CYGX_YANXUAN_SPECIAL_BG_IMG_URL + strconv.Itoa(rnd) + "a.png",
+		BgImgDown:  utils.CYGX_YANXUAN_SPECIAL_BG_IMG_URL + strconv.Itoa(rnd) + "b.png",
+		BgImgPc:    utils.CYGX_YANXUAN_SPECIAL_BG_IMG_URL_PC + strconv.Itoa(rnd) + ".png",
+		Status:     1,
+	}
+
+	_, err = cygx.AddCygxYanxuanSpecialAuthor(&item)
+	if err != nil {
+		br.Msg = "新增失败"
+		br.ErrMsg = "新增失败,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "新增成功"
+}
+
+// @Title 禁用/启用研选专栏作者
+// @Description 禁用/启用研选专栏作者
+// @Param	request	body help_doc.AddHelpDocReq true "type json string"
+// @Success 200 {object} models.AddEnglishReportResp
+// @router /yanxuan_special/author/enable [post]
+func (this *YanxuanSpecialController) AuthorEnable() {
+	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.EnableCygxYanxuanSpecialAuthorReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if req.UserId <= 0 {
+		br.Msg = "用户id错误"
+		return
+	}
+	if req.Status <= 0 {
+		br.Msg = "参数错误"
+		return
+	}
+	if tmpErr := cygx.EnableYanxuanSpecialAuthor(req.UserId, req.Status); tmpErr != nil {
+		br.Msg = "启用/禁用作者失败"
+		br.ErrMsg = "启用/禁用作者失败, Err:" + tmpErr.Error()
+		return
+	}
+
+	if req.Status == 1 {
+		br.Msg = "启用成功"
+	} else {
+		br.Msg = "禁用成功"
+	}
+
+	br.Ret = 200
+	br.Success = true
+}
+
+// @Title 作者列表
+// @Description 作者列表
+// @Param	request	body help_doc.AddHelpDocReq true "type json string"
+// @Success 200 {object} models.AddEnglishReportResp
+// @router /yanxuan_special/author/list [get]
+func (this *YanxuanSpecialController) AuthorList() {
+	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
+	}
+
+	list, tmpErr := cygx.GetYanxuanSpecialAuthorList()
+	if tmpErr != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败, Err:" + tmpErr.Error()
+		return
+	}
+
+	br.Data = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// @Title 审核列表
+// @Description 审核列表
+// @Param	request	body help_doc.AddHelpDocReq true "type json string"
+// @Success 200 {object} models.AddEnglishReportResp
+// @router /yanxuan_special/list [get]
+func (this *YanxuanSpecialController) 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
+	}
+
+	userId, _ := this.GetInt("UserId", 0)
+	var condition string
+	var pars []interface{}
+
+	if userId > 0 {
+		condition += ` AND a.user_id = ? `
+		pars = append(pars, userId)
+	}
+
+	condition += ` AND a.status = 2 `
+
+	list, tmpErr := cygx.GetYanxuanSpecialList(condition, pars)
+	if tmpErr != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败, Err:" + tmpErr.Error()
+		return
+	}
+	for _, v := range list {
+		hasImg, err := utils.ArticleHasImgUrl(v.Content)
+		if err != nil {
+			return
+		}
+		if hasImg {
+			v.ContentHasImg = 1
+		}
+		if v.DocUrl != "" {
+			var docs []cygx.Doc
+			err := json.Unmarshal([]byte(v.DocUrl), &docs)
+			if err != nil {
+				br.Msg = "参数解析异常!"
+				br.ErrMsg = "参数解析失败,Err:" + err.Error()
+				return
+			}
+			v.Docs = docs
+		}
+		if v.Type == 1 {
+			v.Title = "【笔记】" + v.Title
+		} else if v.Type == 2 {
+			v.Title = "【观点】" + v.Title
+		}
+		if v.CompanyTags != "" {
+			v.Tags += v.CompanyTags
+		}
+		if v.IndustryTags != "" {
+			if v.Tags != "" {
+				v.Tags += ","
+			}
+			v.Tags += v.IndustryTags
+		}
+	}
+
+	br.Data = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// @Title 审批研选专栏
+// @Description 审批研选专栏
+// @Param	request	body help_doc.AddHelpDocReq true "type json string"
+// @Success 200 {object} models.AddEnglishReportResp
+// @router /yanxuan_special/enable [post]
+func (this *YanxuanSpecialController) Enable() {
+	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.EnableCygxYanxuanSpecialReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if req.Id <= 0 {
+		br.Msg = "文章id错误"
+		return
+	}
+	if req.Status <= 0 {
+		br.Msg = "参数错误"
+		return
+	}
+	status := 0
+	if req.Status == 1 {
+		status = 3
+	} else {
+		status = 4
+	}
+	if tmpErr := cygx.EnableYanxuanSpecial(req.Id, status, req.Reason); tmpErr != nil {
+		br.Msg = "审批失败"
+		br.ErrMsg = "审批失败, Err:" + tmpErr.Error()
+		return
+	}
+	if req.Status == 1 {
+		go cygxService.SendWxMsgSpecialFollow(req.Id)
+	}
+	go cygxService.SendWxMsgSpecialAuthor(req.Id, req.Status) // 研选专栏审核完成时,给提交人发送模板消息
+	go cygxService.UpdateYanxuanSpecialResourceData(req.Id)   //  写入首页最新  cygx_resource_data 表
+	go elastic.EsAddYanxuanSpecial(req.Id)                    //  写入es 综合搜索
+	br.Msg = "审批成功"
+	br.Ret = 200
+	br.Success = true
+}

+ 2 - 1
controllers/day_new.go

@@ -365,7 +365,8 @@ func (this *DayNewController) AddReport() {
 				br.Msg = "生成失败,列表未全部完成英文翻译"
 				return
 			}
-			content += `<p>` + v.ContentEn + `</p></br>`
+
+			content += `<p>` + time.Unix(v.MsgTime/1e3, 0).Format(utils.FormatDateTimeMinute) + ` ` + v.ContentEn + `</p></br>`
 			msgIds += `"` + v.MsgId + `",`
 		}
 

+ 8 - 0
controllers/eta_business/eta_business.go

@@ -7,6 +7,7 @@ import (
 	"hongze/hz_crm_api/controllers"
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/eta_business"
+	"hongze/hz_crm_api/models/help_doc"
 	etaBusinessService "hongze/hz_crm_api/services/eta_business"
 	"hongze/hz_crm_api/utils"
 	"strconv"
@@ -451,6 +452,13 @@ func (this *EtaBusinessController) Add() {
 		return
 	}
 
+	// 给商家帮助文档所有分类的权限
+	if e = help_doc.AddAllHelpDocClassifyVisible(businessItem.EtaBusinessId); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "新增商家分类文档权限失败, Err: " + e.Error()
+		return
+	}
+
 	// 操作日志
 	go func() {
 		recordOb := new(eta_business.EtaBusinessOperationRecord)

+ 1 - 13
controllers/roadshow/company.go

@@ -4,9 +4,7 @@ import (
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/company"
 	"hongze/hz_crm_api/models/roadshow"
-	"hongze/hz_crm_api/services"
 	"hongze/hz_crm_api/utils"
-	"strconv"
 	"strings"
 )
 
@@ -101,23 +99,13 @@ func (this *CalendarController) CompanyDetail() {
 		for _, v := range permissionList {
 			permissionArr = append(permissionArr, v.PermissionName)
 		}
-		readMap, err := services.GetFiccCountUserViewHistoryByCompanyIds(strconv.Itoa(companyId))
-		if err != nil {
-			br.Msg = "获取阅读次数失败!"
-			br.ErrMsg = "获取阅读次数失败!Err:" + err.Error()
-			return
-		}
-		readNum, ok := readMap[companyId]
-		if !ok {
-			readNum = 0
-		}
 		detailView.CompanyId = companyProductItem.CompanyId
 		detailView.CompanyName = companyProductItem.CompanyName
 		detailView.Status = companyProductItem.Status
 		detailView.IndustryId = companyProductItem.IndustryId
 		detailView.IndustryName = companyProductItem.IndustryName
 		detailView.PermissionName = strings.Join(permissionArr, "/")
-		detailView.ReportReadTotal = readNum //ficc报告-累计阅读次数
+		detailView.ReportReadTotal = companyProductItem.ViewTotal //ficc报告-累计阅读次数
 		br.Ret = 200
 		br.Success = true
 		br.Msg = "获取成功"

+ 3 - 3
controllers/user_login.go

@@ -532,13 +532,13 @@ func (this *UserLoginController) Login() {
 		noTrustLoginId, _ := utils.Rc.RedisString(noTrustLoginKey)
 		if noTrustLoginId != `` { // 如果存在不可信设备,那么将其下架
 			oldNoTrustLoginKey := fmt.Sprint(utils.CACHE_ACCESS_TOKEN_LOGIN, noTrustLoginId)
-			_ = utils.Rc.Put(oldNoTrustLoginKey, "0", 30*time.Minute)
+			_ = utils.Rc.Put(oldNoTrustLoginKey, "0", utils.LoginCacheTime*time.Minute)
 		}
 
 		// 如果当前是不可信设备,那么将其加入到不可信名单
 		loginKey := fmt.Sprint(utils.CACHE_ACCESS_TOKEN_LOGIN, sysSession.Id)
-		_ = utils.Rc.Put(loginKey, "1", 30*time.Minute)
-		_ = utils.Rc.Put(noTrustLoginKey, sysSession.Id, 30*time.Minute)
+		_ = utils.Rc.Put(loginKey, "1", utils.LoginCacheTime*time.Minute)
+		_ = utils.Rc.Put(noTrustLoginKey, sysSession.Id, utils.LoginCacheTime*time.Minute)
 	}
 
 	// 新增登录记录

+ 23 - 1
models/chart_permission.go

@@ -2,6 +2,7 @@ package models
 
 import (
 	"github.com/beego/beego/v2/client/orm"
+	"hongze/hz_crm_api/utils"
 	"time"
 )
 
@@ -108,7 +109,21 @@ func GetChartPermissionByIds(permissionIds []string) (list []*ChartPermission, e
 	return
 }
 
-// GetChartPermissionByIds 主键获取权限
+// GetChartPermissionByIdList 主键获取权限
+func GetChartPermissionByIdList(chartPermissionIdList []int) (list []*ChartPermission, err error) {
+	num := len(chartPermissionIdList)
+	if num <= 0 {
+		return
+	}
+
+	o := orm.NewOrm()
+	sql := `select * from chart_permission where chart_permission_id in (` + utils.GetOrmInReplace(num) + `)`
+	_, err = o.Raw(sql, chartPermissionIdList).QueryRows(&list)
+
+	return
+}
+
+// GetChartPermissionByNames 主键获取权限
 func GetChartPermissionByNames(permissionNames []string) (list []*ChartPermission, err error) {
 	qb, _ := orm.NewQueryBuilder("mysql")
 	// 构建查询对象
@@ -130,3 +145,10 @@ func GetChartPermissionList() (list []*ChartPermission, err error) {
 	_, err = o.Raw(sql).QueryRows(&list)
 	return
 }
+
+func GetChartPermissionListRai() (items []*ChartPermission, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM chart_permission WHERE product_id=2  ORDER BY sort ASC `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}

+ 16 - 0
models/company/company_apply.go

@@ -79,6 +79,22 @@ func GetCompanyContractHistoryList(companyId int, productId string) (items []*Co
 	return
 }
 
+func GetCompanyContractHistoryListByContractCode(contractCode string) (items []*CompanyContractHistory, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+				a.*,
+				b.contract_id
+			FROM
+				company_contract AS a
+			LEFT JOIN contract AS b ON a.contract_code = b.contract_code
+			WHERE
+				a.contract_code = ?  AND a.status = 1
+			ORDER BY
+				a.modify_time DESC`
+	_, err = o.Raw(sql, contractCode).QueryRows(&items)
+	return
+}
+
 type CompanyContractDetail struct {
 	CompanyContractId int
 	CompanyId         int       `description:"客户id"`

+ 47 - 1
models/company/company_contract.go

@@ -194,4 +194,50 @@ func GetCompanyContractUpgradePermissionCheckByContractId(companyId, companyCont
 	sql := `SELECT COUNT(1) AS count FROM company_contract_permission AS a WHERE a.company_id=? AND company_contract_id=? AND a.chart_permission_id=? AND a.is_upgrade=? `
 	err = o.Raw(sql, companyId, companyContractId, permissionId, isUpgrade).QueryRow(&count)
 	return
-}
+}
+
+type CompanyContractResp struct {
+	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         time.Time `description:"合同开始时间"`
+	EndDate           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大套餐"`
+}
+
+// 获取合同列表
+func GetCompanyContractList(condition string, pars []interface{}) (items []*CompanyContractResp, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM company_contract WHERE 1 = 1  `
+
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// 获取合同对应的权限列表
+func GetCompanyContractPermissionList(condition string, pars []interface{}) (items []*CompanyContractPermission, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM company_contract_permission WHERE 1 = 1  `
+
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}

+ 23 - 0
models/company/company_product.go

@@ -376,6 +376,7 @@ func GetRemarkListByCompanyId(CompanyId string) (items []*CompanyProductRemark,
 	_, err = o.Raw(sql, CompanyId).QueryRows(&items)
 	return
 }
+
 // 冻结客户
 //func FreezeCompany(productId, companyId, adminId int, remark, realName string) (msg, errMsg string){
 //	time.Sleep(time.Second)
@@ -558,3 +559,25 @@ func DelCompanyRemark(remarkId int) (err error) {
 	_, err = o.Raw(sql, remarkId).Exec()
 	return
 }
+
+// 获取列表
+func GetCompanyProductList(condition string, pars []interface{}) (items []*CompanyProduct, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT *  FROM company_product WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// 获取列表
+func GetCompanyProductListBycondition(condition string, pars []interface{}) (items []*CompanyProduct, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT a.company_id FROM company AS a  INNER JOIN company_product AS b ON a.company_id=b.company_id   WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}

+ 104 - 309
models/company/company_user.go

@@ -63,6 +63,10 @@ type CompanyUser struct {
 	IsSubscribe              int       `description:"是否关注了微信公众号: 0-未关注; 1-已关注"`
 	IsSubscribeHzyj          int       `description:"是否关注了弘则研究微信公众号: 0-未关注; 1-已关注"`
 	IsSubscribeCygx          int       `description:"是否关注了查研观向微信公众号: 0-未关注; 1-已关注"`
+	FiccViewTotal            int       `description:"ficc报告的阅读次数" json:"-"`
+	FiccLastViewTime         time.Time `description:"ficc报告最近一次阅读时间" json:"-"`
+	RaiViewTotal             int       `description:"权益报告的阅读次数" json:"-"`
+	RaiLastViewTime          time.Time `description:"权益报告的最近一次阅读时间" json:"-"`
 }
 
 type CompanyUserListResp struct {
@@ -283,315 +287,6 @@ type ViewReportListResp struct {
 	List  []*ViewReportList
 }
 
-func GetViewReportListByMobile(mobile string, txtType int) (items []*ViewReportList, err error) {
-	dataName := ""
-	sql := ``
-	if utils.RunMode == "debug" {
-		dataName = "test_v2_hongze_rddp"
-	} else {
-		dataName = "hongze_rddp"
-	}
-
-	ficcSql := `SELECT
-	rr.research_report_name,
-		rr.type AS report_type,
-		'ficc' AS txt_type,
-		'--' AS match_type_name,
-		'--' AS stop_time,
-	uvh.created_time AS created_time
-	FROM
-	user_view_history uvh
-	LEFT JOIN research_report rr ON rr.research_report_id = uvh.research_report_id
-	WHERE
-	uvh.mobile = ?
-	UNION ALL
-	SELECT
-	r.title AS research_report_name,
-		'rddp' AS report_type,
-		'ficc' AS txt_type,
-		r.classify_name_first AS match_type_name,
-		'--' AS stop_time,
-		rvr.create_time AS created_time
-	FROM %s.report_view_record rvr
-	LEFT JOIN %s.report r ON r.id = rvr.report_id
-	WHERE
-	rvr.mobile=?
-	UNION ALL
-	SELECT
-	cha.permission_name AS research_report_name,
-		'advisory' AS report_type,
-		'ficc' AS txt_type,
-		cha.classify_name AS match_type_name,
-		'--' AS stop_time,
-		auc.create_time AS created_time
-	FROM
-	advisory_user_chart_article_record auc
-	LEFT JOIN chart_permission cha ON cha.chart_permission_id = auc.chart_permission_id
-	WHERE
-	auc.mobile = ?`
-
-	rightsSql := `SELECT
-		art.title AS research_report_name,
-		'cygx' AS report_type,
-		'rights' AS txt_type,
-		art.match_type_name,
-		h.stop_time,
-		h.create_time AS created_time 
-	FROM
-		cygx_article_history_record_all h
-		INNER JOIN cygx_article art ON art.article_id = h.article_id
-	WHERE
-		h.mobile = ? AND h.company_id != 16  AND h.is_del = 0 `
-
-	if txtType == 1 {
-		sql = ` SELECT * FROM ( ` + rightsSql + `
-	      )AS t ORDER BY t.created_time DESC`
-	} else if txtType == 2 {
-		sql = ` SELECT * FROM ( ` + ficcSql + `
-	      )AS t ORDER BY t.created_time DESC`
-	} else {
-		sql = ` SELECT * FROM ( ` + ficcSql + " UNION ALL " + rightsSql + `
-	      )AS t ORDER BY t.created_time DESC`
-	}
-
-	//报告统计删除晨报部分统计加入每日资讯 2021-4-9
-	//sql := ` SELECT * FROM (
-	//					SELECT
-	//							r.title AS research_report_name,
-	//							'rddp' AS report_type,
-	//							rvr.create_time AS created_time
-	//						FROM %s.report_view_record rvr
-	//						INNER JOIN %s.report r ON r.id = rvr.report_id
-	//						WHERE
-	//							rvr.mobile=?
-	//					UNION ALL
-	//					SELECT
-	//					cha.permission_name AS research_report_name,
-	//					'advisory' AS report_type,
-	//					auc.create_time AS created_time
-	//				FROM
-	//					advisory_user_chart_article_record auc
-	//					INNER JOIN chart_permission cha ON cha.chart_permission_id = auc.chart_permission_id
-	//				WHERE
-	//					auc.mobile = ?
-	//       )AS t ORDER BY t.created_time DESC
-	//    `
-
-	o := orm.NewOrm()
-
-	if txtType == 1 {
-		_, err = o.Raw(sql, mobile).QueryRows(&items)
-	} else if txtType == 2 {
-		sql = fmt.Sprintf(sql, dataName, dataName)
-		_, err = o.Raw(sql, mobile, mobile, mobile).QueryRows(&items)
-	} else {
-		sql = fmt.Sprintf(sql, dataName, dataName)
-		_, err = o.Raw(sql, mobile, mobile, mobile, mobile).QueryRows(&items)
-	}
-
-	return
-}
-
-func GetViewReportListByEmail2(email string, txtType int) (items []*ViewReportList, err error) {
-	dataName := ""
-	sql := ``
-	if utils.RunMode == "debug" {
-		dataName = "test_v2_hongze_rddp"
-	} else {
-		dataName = "hongze_rddp"
-	}
-
-	ficcSql := `SELECT
-	rr.research_report_name,
-		rr.type AS report_type,
-		'ficc' AS txt_type,
-		'--' AS match_type_name,
-		'--' AS stop_time,
-	uvh.created_time AS created_time
-	FROM
-	user_view_history uvh
-	INNER JOIN research_report rr ON rr.research_report_id = uvh.research_report_id
-	WHERE
-	uvh.email = ?
-	UNION ALL
-	SELECT
-	r.title AS research_report_name,
-		'rddp' AS report_type,
-		'ficc' AS txt_type,
-		r.classify_name_first AS match_type_name,
-		'--' AS stop_time,
-		rvr.create_time AS created_time
-	FROM %s.report_view_record rvr
-	INNER JOIN %s.report r ON r.id = rvr.report_id
-	WHERE
-	rvr.email=?
-	UNION ALL
-	SELECT
-	cha.permission_name AS research_report_name,
-		'advisory' AS report_type,
-		'ficc' AS txt_type,
-		cha.classify_name AS match_type_name,
-		'--' AS stop_time,
-		auc.create_time AS created_time
-	FROM
-	advisory_user_chart_article_record auc
-	INNER JOIN chart_permission cha ON cha.chart_permission_id = auc.chart_permission_id
-	WHERE
-	auc.email = ?`
-
-	rightsSql := `SELECT
-		art.title AS research_report_name,
-		'cygx' AS report_type,
-		'rights' AS txt_type,
-		art.match_type_name,
-		h.stop_time,
-		h.create_time AS created_time 
-	FROM
-		cygx_article_history_record_all h
-		INNER JOIN cygx_article art ON art.article_id = h.article_id
-	WHERE
-		h.email = ? AND h.company_id != 16 AND h.is_del = 0 `
-
-	if txtType == 1 {
-		sql = ` SELECT * FROM ( ` + rightsSql + `
-	      )AS t ORDER BY t.created_time DESC`
-	} else if txtType == 2 {
-		sql = ` SELECT * FROM ( ` + ficcSql + `
-	      )AS t ORDER BY t.created_time DESC`
-	} else {
-		sql = ` SELECT * FROM ( ` + ficcSql + " UNION ALL " + rightsSql + `
-	      )AS t ORDER BY t.created_time DESC`
-	}
-
-	//报告统计删除晨报部分统计加入每日资讯 2021-4-9
-	//sql := ` SELECT * FROM (
-	//					SELECT
-	//							r.title AS research_report_name,
-	//							'rddp' AS report_type,
-	//							rvr.create_time AS created_time
-	//						FROM %s.report_view_record rvr
-	//						INNER JOIN %s.report r ON r.id = rvr.report_id
-	//						WHERE
-	//							rvr.mobile=?
-	//					UNION ALL
-	//					SELECT
-	//					cha.permission_name AS research_report_name,
-	//					'advisory' AS report_type,
-	//					auc.create_time AS created_time
-	//				FROM
-	//					advisory_user_chart_article_record auc
-	//					INNER JOIN chart_permission cha ON cha.chart_permission_id = auc.chart_permission_id
-	//				WHERE
-	//					auc.mobile = ?
-	//       )AS t ORDER BY t.created_time DESC
-	//    `
-
-	o := orm.NewOrm()
-	if txtType == 1 {
-		_, err = o.Raw(sql, email).QueryRows(&items)
-	} else if txtType == 2 {
-		sql = fmt.Sprintf(sql, dataName, dataName)
-		_, err = o.Raw(sql, email, email, email).QueryRows(&items)
-	} else {
-		sql = fmt.Sprintf(sql, dataName, dataName)
-		_, err = o.Raw(sql, email, email, email, email).QueryRows(&items)
-	}
-
-	return
-}
-
-func GetViewReportListByEmail(email string) (items []*ViewReportList, err error) {
-	dataName := ""
-	if utils.RunMode == "debug" {
-		dataName = "test_v2_hongze_rddp"
-	} else {
-		dataName = "hongze_rddp"
-	}
-	sql := ` SELECT * FROM (
-				SELECT
-							rr.research_report_name,
-							rr.type AS report_type,
-							uvh.created_time AS created_time
-						FROM
-							user_view_history uvh
-							INNER JOIN research_report rr ON rr.research_report_id = uvh.research_report_id
-						WHERE
-							uvh.email = ?
-						UNION ALL
-						SELECT
-								r.title AS research_report_name,
-								'rddp' AS report_type,
-								rvr.create_time AS created_time
-							FROM %s.report_view_record rvr
-							INNER JOIN %s.report r ON r.id = rvr.report_id
-							WHERE
-								rvr.email=?
-						UNION ALL
-						SELECT
-						cha.permission_name AS research_report_name,
-						'advisory' AS report_type,
-						auc.create_time AS created_time 
-					FROM
-						advisory_user_chart_article_record auc
-						INNER JOIN chart_permission cha ON cha.chart_permission_id = auc.chart_permission_id 
-					WHERE
-						auc.email = ?
-	      )AS t ORDER BY t.created_time DESC
-       `
-	//报告统计删除晨报部分统计加入每日资讯 2021-4-9
-	//sql := ` SELECT * FROM (
-	//					SELECT
-	//							r.title AS research_report_name,
-	//							'rddp' AS report_type,
-	//							rvr.create_time AS created_time
-	//						FROM %s.report_view_record rvr
-	//						INNER JOIN %s.report r ON r.id = rvr.report_id
-	//						WHERE
-	//							rvr.email=?
-	//					UNION ALL
-	//					SELECT
-	//					cha.permission_name AS research_report_name,
-	//					'advisory' AS report_type,
-	//					auc.create_time AS created_time
-	//				FROM
-	//					advisory_user_chart_article_record auc
-	//					INNER JOIN chart_permission cha ON cha.chart_permission_id = auc.chart_permission_id
-	//				WHERE
-	//					auc.email = ?
-	//       )AS t ORDER BY t.created_time DESC
-	//    `
-	sql = fmt.Sprintf(sql, dataName, dataName)
-	o := orm.NewOrm()
-	_, err = o.Raw(sql, email, email, email).QueryRows(&items)
-	return
-}
-
-func GetCompanyUserByCompanyId(companyId int) (items []*CompanyUser, err error) {
-	o := orm.NewOrm()
-	sql := ` SELECT a.*,b.company_name,
-             (SELECT count(1) FROM user_view_history AS uvh WHERE uvh.user_id=a.user_id GROUP BY a.user_id) AS view_total,
-             (SELECT max(uvh.created_time) FROM user_view_history AS uvh WHERE uvh.user_id=a.user_id GROUP BY a.user_id) AS last_view_time
-              FROM wx_user AS a 
-			 INNER JOIN company AS b ON a.company_id=b.company_id
-			 WHERE a.company_id=? `
-	sql += `ORDER BY  a.last_updated_time DESC `
-	_, err = o.Raw(sql, companyId).QueryRows(&items)
-	return
-}
-
-func GetCompanyUserExportByCompanyId(companyId int) (items []*CompanyUser, err error) {
-	o := orm.NewOrm()
-	sql := ` SELECT a.*,b.company_name,
-             (SELECT count(1) FROM user_view_history AS uvh WHERE uvh.user_id=a.user_id GROUP BY a.user_id) AS view_total,
-             (SELECT max(uvh.created_time) FROM user_view_history AS uvh WHERE uvh.user_id=a.user_id GROUP BY a.user_id) AS last_view_time
-              FROM wx_user AS a 
-			 INNER JOIN company AS b ON a.company_id=b.company_id
-			 WHERE a.company_id=? AND a.company_id<>1 `
-	sql += `ORDER BY  a.last_updated_time DESC `
-	_, err = o.Raw(sql, companyId).QueryRows(&items)
-	return
-}
-
 func ModifyCompanyUserCompanyId(userId, companyId int) (err error) {
 	o := orm.NewOrm()
 	sql := ` UPDATE wx_user SET company_id=?  WHERE user_id=? `
@@ -676,3 +371,103 @@ func GetCompanyUsersByCondition(condition string, pars []interface{}) (list []*C
 	_, err = orm.NewOrm().Raw(sql, pars).QueryRows(&list)
 	return
 }
+
+type ViewReportListV2 struct {
+	Id                 int    `description:"阅读记录id"`
+	UserId             int    `description:"用户id"`
+	Mobile             string `description:"手机号"`
+	Email              string `description:"邮箱"`
+	RealName           string `description:"真实姓名"`
+	CompanyName        string `description:"客户名称"`
+	ResearchReportName string `description:"报告标题"`
+	ReportType         int8   `description:"来源:1:rddp的报告;2:weekly_report的PHP报告;3:weekly_report商品的报告(应该是作废了);4:察研观向的报告""`
+	CreatedTime        string `description:"创建时间"`
+	TxtType            string `description:"类型 ficc:ficc  、 rights:权益"`
+	MatchTypeName      string `description:"匹配类型"`
+	StopTime           int    `description:"停留时间"`
+	ReportId           int    `description:"报告id"`
+	ReportChapterId    int    `description:"报告章节id"`
+}
+
+func GetViewReportListByDate(startDate, endDate string) (items []*ViewReportListV2, err error) {
+	dataName := ""
+	sql := ``
+	if utils.RunMode == "debug" {
+		dataName = "test_v2_hongze_rddp"
+	} else {
+		dataName = "hongze_rddp"
+	}
+
+	ficcSql := `SELECT
+    uvh.user_id,uvh.mobile,uvh.email,uvh.view_history_id AS id,uvh.real_name,uvh.company_name,
+    uvh.research_report_id as report_id,
+    uvh.research_report_type_id as report_chapter_id,
+	rr.research_report_name,
+		"2" AS report_type,
+		'ficc' AS txt_type,
+		'--' AS match_type_name,
+		'0' AS stop_time,
+	uvh.created_time AS created_time
+	FROM
+	user_view_history uvh
+	LEFT JOIN research_report rr ON rr.research_report_id = uvh.research_report_id
+	WHERE
+	uvh.created_time >= ? AND uvh.created_time< ?
+	UNION ALL
+	SELECT
+    rvr.user_id,rvr.mobile,rvr.email,rvr.id,rvr.real_name,rvr.company_name,
+    rvr.report_id,
+    rvr.report_chapter_id,
+	r.title AS research_report_name,
+		'1' AS report_type,
+		'ficc' AS txt_type,
+		r.classify_name_first AS match_type_name,
+		'0' AS stop_time,
+		rvr.create_time AS created_time
+	FROM %s.report_view_record rvr
+	LEFT JOIN %s.report r ON r.id = rvr.report_id
+	WHERE
+	rvr.create_time >= ? AND rvr.create_time< ?
+	UNION ALL
+	SELECT
+    auc.user_id,auc.mobile,auc.email,auc.id,auc.real_name,auc.company_name,
+    auc.chart_permission_id as report_id,
+    '0' AS report_chapter_id,
+	cha.permission_name AS research_report_name,
+		'3' AS report_type,
+		'ficc' AS txt_type,
+		cha.classify_name AS match_type_name,
+		'0' AS stop_time,
+		auc.create_time AS created_time
+	FROM
+	advisory_user_chart_article_record auc
+	LEFT JOIN chart_permission cha ON cha.chart_permission_id = auc.chart_permission_id
+	WHERE
+	auc.create_time >= ? AND auc.create_time< ?`
+
+	rightsSql := `SELECT
+    h.user_id,h.mobile,h.email,h.id,h.company_name,'' AS real_name,
+    h.article_id AS  report_id,
+    '0' AS report_chapter_id,
+		art.title AS research_report_name,
+		'4' AS report_type,
+		'rights' AS txt_type,
+		art.match_type_name,
+		h.stop_time,
+		h.create_time AS created_time 
+	FROM
+		cygx_article_history_record_newpv h
+		INNER JOIN cygx_article art ON art.article_id = h.article_id
+	WHERE
+	h.create_time >= ? AND h.create_time< ? `
+
+	sql = ` SELECT * FROM ( ` + ficcSql + " UNION ALL " + rightsSql + `
+	      )AS t ORDER BY t.created_time asc`
+
+	o := orm.NewOrm()
+
+	sql = fmt.Sprintf(sql, dataName, dataName)
+	_, err = o.Raw(sql, startDate, endDate, startDate, endDate, startDate, endDate, startDate, endDate).QueryRows(&items)
+
+	return
+}

+ 11 - 3
models/cygx/activity_ask_email.go

@@ -5,9 +5,10 @@ import (
 )
 
 type AskEmailRep struct {
-	Name   string `description:"姓名"`
-	Email  string `description:"邮箱"`
-	Mobile string `description:"手机号"`
+	Name                string `description:"姓名"`
+	Email               string `description:"邮箱"`
+	Mobile              string `description:"手机号"`
+	ChartPermissionName string `description:"权限名称"`
 }
 
 func GetAskEmail() (item []*AskEmailRep, err error) {
@@ -16,3 +17,10 @@ func GetAskEmail() (item []*AskEmailRep, err error) {
 	_, err = o.Raw(sql).QueryRows(&item)
 	return
 }
+
+func GetAskEmailList() (item []*AskEmailRep, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_activity_ask_email WHERE    chart_permission_name != ''  ORDER BY sort  DESC`
+	_, err = o.Raw(sql).QueryRows(&item)
+	return
+}

+ 2 - 2
models/cygx/activity_attendance_detail.go

@@ -36,6 +36,7 @@ type AttendanceDetail struct {
 	RealName              string `description:"姓名"`
 	Mobile                string `description:"手机号"`
 	CompanyName           string `description:"公司名称"`
+	CompanyId             int    `description:"公司ID"`
 	SellerName            string `orm:"column(pseller_name);"description:"销售姓名"`
 	IsMeeting             int    `description:"是否到会"`
 	FirstMeetingTime      string `description:"首次入会时间"`
@@ -119,7 +120,6 @@ func GetAttendanceDetailList(activityId int, sqlStr string) (item []*AttendanceD
 			AND s.fail_type = 0 
 			AND s.is_cancel = 0
 			AND d.userid_entity != 3
-			AND u.mobile != ''
 			AND s.activity_id = ?` + sqlStr + `  GROUP BY s.id  ORDER BY s.is_meeting DESC`
 	_, err = o.Raw(sql, activityId).QueryRows(&item)
 	return
@@ -159,7 +159,7 @@ func GetAttendanceDetailList2(activityId int, sqlStr string) (item []*Attendance
 	sql := `SELECT d.activity_id,d.real_name,d.company_id,d.first_meeting_time,d.last_meeting_time,d.meeting_type_str,d.meeting_authentication,d.meeting_status_str,d.mobile,d.duration,d.company_name,d.position,d.userid_entity
 			FROM
 			cygx_activity_attendance_detail AS d
-			WHERE 1 = 1 AND d.activity_id = ? AND is_meeting_str = 1 AND d.userid_entity != 3 AND u.mobile != '' ` + sqlStr + ` GROUP BY d.mobile`
+			WHERE 1 = 1 AND d.activity_id = ? AND is_meeting_str = 1 AND d.userid_entity != 3  ` + sqlStr + ` GROUP BY d.mobile`
 	_, err = o.Raw(sql, activityId).QueryRows(&item)
 	return
 }

+ 1 - 0
models/cygx/activity_help_ask.go

@@ -11,6 +11,7 @@ type ActivityHelpAsk struct {
 	CreateTime  string `description:"创建时间"`
 	Mobile      string `description:"手机号"`
 	CompanyName string `description:"公司名称"`
+	CompanyId   int    `description:"公司ID"`
 	RealName    string `description:"姓名"`
 	Content     string `description:"内容"`
 }

+ 4 - 1
models/cygx/activity_meet.go

@@ -166,7 +166,7 @@ func MeetingDo(meetingUids, noMeetingUids string, ActivityId int, items []*CygxA
 
 // 获取数量
 func GetCygxBreakAppointmentCount(condition string, pars []interface{}) (count int, err error) {
-	sqlCount := ` SELECT COUNT(1)  count FROM ( SELECT u.user_id 
+	sqlCount := ` SELECT COUNT(1)  count FROM ( SELECT s.user_id 
 				FROM
 				cygx_activity_signup_break AS s
 				INNER JOIN cygx_activity AS a ON a.activity_id = s.activity_id
@@ -204,6 +204,8 @@ func GetCygxBreakAppointmentList(condition string, pars []interface{}, startSize
 			FROM
 				cygx_activity_signup_break AS s
 				INNER JOIN cygx_activity AS a ON a.activity_id = s.activity_id
+				WHERE
+				s.user_id = cs.user_id 
 			) AS break_appointment_num,
 			s.real_name,
 			s.mobile,
@@ -214,6 +216,7 @@ func GetCygxBreakAppointmentList(condition string, pars []interface{}, startSize
 		FROM
 			cygx_activity_signup_break AS s
 			INNER JOIN cygx_activity AS a ON a.activity_id = s.activity_id
+			INNER JOIN cygx_activity_signup AS cs ON cs.activity_id = s.activity_id 
 		WHERE
 			1 = 1 `
 	if condition != "" {

+ 1 - 1
models/cygx/activity_signup.go

@@ -384,7 +384,7 @@ type GetFailSignupListRep struct {
 }
 
 func GetFailSignupList(activity_id int, sqlStr string) (item []*FailSignupListRep, err error) {
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("hz_cygx")
 	sql := `SELECT s.* ,a.is_limit_people
 			FROM
 			cygx_activity_signup AS s

+ 1 - 1
models/cygx/activity_special.go

@@ -461,7 +461,7 @@ func GetAdminMobileByCompany(condition string, pars []interface{}) (list []*Admi
 }
 
 // 获取预约活动的用户的openID
-func GetActivitySpecialOpenIdList() (items []*AdminOpenIdList, err error) {
+func GeFollowSpecialOpenIdList() (items []*AdminOpenIdList, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
 	sql := `SELECT DISTINCT u.open_id,u.cygx_user_id as  user_id ,m.company_id
 			FROM

+ 250 - 0
models/cygx/allocation_company_contract.go

@@ -0,0 +1,250 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// 研究员派点
+type CygxAllocationCompanyContract struct {
+	AllocationCompanyContractId int       `orm:"column(allocation_company_contract_id);pk"`
+	CompanyContractId           int       `description:"合同id"`
+	CreateTime                  time.Time `description:"创建时间"`
+	ModifyTime                  time.Time `description:"更新时间"`
+	AdminId                     int       `description:"操作人ID"`
+	AdminName                   string    `description:"内容"`
+	Proportion                  float64   `description:"占比"`
+	Money                       float64   `description:"金额"`
+	RealName                    string    `description:"研究员姓名"`
+	ChartPermissionName         string    `description:"行业名称"`
+}
+
+// 研究员派点日志
+type CygxAllocationCompanyContractLog struct {
+	AllocationCompanyContractId int       `orm:"column(allocation_company_contract_id);pk"`
+	CompanyContractId           int       `description:"合同id"`
+	CreateTime                  time.Time `description:"创建时间"`
+	ModifyTime                  time.Time `description:"更新时间"`
+	AdminId                     int       `description:"操作人ID"`
+	AdminName                   string    `description:"内容"`
+	Proportion                  float64   `description:"占比"`
+	Money                       float64   `description:"金额"`
+	RealName                    string    `description:"研究员姓名"`
+	ChartPermissionName         string    `description:"行业名称"`
+}
+
+// 行业派点
+type CygxAllocationCompanyContractPermission struct {
+	AllocationCompanyContractId int       `orm:"column(allocation_company_contract_id);pk"`
+	CompanyContractId           int       `description:"合同id"`
+	CreateTime                  time.Time `description:"创建时间"`
+	ModifyTime                  time.Time `description:"更新时间"`
+	AdminId                     int       `description:"操作人ID"`
+	AdminName                   string    `description:"内容"`
+	Proportion                  float64   `description:"占比"`
+	Money                       float64   `description:"金额"`
+	MoneyAvg                    float64   `description:"行业所占合同的平均金额"`
+	ChartPermissionName         string    `description:"行业名称"`
+}
+
+// 行业派点日志
+type CygxAllocationCompanyContractPermissionLog struct {
+	AllocationCompanyContractId int       `orm:"column(allocation_company_contract_id);pk"`
+	CompanyContractId           int       `description:"合同id"`
+	CreateTime                  time.Time `description:"创建时间"`
+	ModifyTime                  time.Time `description:"更新时间"`
+	AdminId                     int       `description:"操作人ID"`
+	AdminName                   string    `description:"内容"`
+	Proportion                  float64   `description:"占比"`
+	Money                       float64   `description:"金额"`
+	MoneyAvg                    float64   `description:"行业所占合同的平均金额"`
+	ChartPermissionName         string    `description:"行业名称"`
+}
+
+// 更新派点信息
+func AddAndUpdateCygxAllocationCompanyContract(items []*CygxAllocationCompanyContract, itemsPermission []*CygxAllocationCompanyContractPermission, companyContractId int) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	//组合研究员派点日志结构体
+	var itemsLog []*CygxAllocationCompanyContractLog
+	for _, v := range items {
+		item := new(CygxAllocationCompanyContractLog)
+		item.CompanyContractId = v.CompanyContractId
+		item.AdminId = v.AdminId
+		item.CompanyContractId = v.CompanyContractId
+		item.AdminName = v.AdminName
+		item.RealName = v.RealName
+		item.ChartPermissionName = v.ChartPermissionName
+		item.Proportion = v.Proportion
+		item.Money = v.Money
+		item.Money = v.Money
+		item.CreateTime = time.Now()
+		item.ModifyTime = time.Now()
+		itemsLog = append(itemsLog, item)
+	}
+
+	//组合行业派点日志结构体
+	var itemsPermissionLog []*CygxAllocationCompanyContractPermissionLog
+	for _, v := range itemsPermission {
+		item := new(CygxAllocationCompanyContractPermissionLog)
+		item.CompanyContractId = v.CompanyContractId
+		item.AdminId = v.AdminId
+		item.CompanyContractId = v.CompanyContractId
+		item.AdminName = v.AdminName
+		item.ChartPermissionName = v.ChartPermissionName
+		item.Proportion = v.Proportion
+		item.Money = v.Money
+		item.MoneyAvg = v.MoneyAvg
+		item.CreateTime = time.Now()
+		item.ModifyTime = time.Now()
+		itemsPermissionLog = append(itemsPermissionLog, item)
+	}
+
+	//删除原有的研究员派点信息
+	sql := `DELETE FROM cygx_allocation_company_contract WHERE company_contract_id = ?`
+	_, err = to.Raw(sql, companyContractId).Exec()
+	if err != nil {
+		return
+	}
+	//删除原有的行业派点信息
+	sql = `	DELETE FROM cygx_allocation_company_contract_permission WHERE company_contract_id = ?`
+	_, err = to.Raw(sql, companyContractId).Exec()
+	if err != nil {
+		return
+	}
+
+	//批量添加研究员派点信息
+	_, err = to.InsertMulti(len(items), items)
+	if err != nil {
+		return
+	}
+
+	_, err = to.InsertMulti(len(itemsLog), itemsLog)
+	if err != nil {
+		return
+	}
+
+	//批量添加行业派点信息
+	_, err = to.InsertMulti(len(itemsPermission), itemsPermission)
+	if err != nil {
+		return
+	}
+
+	_, err = to.InsertMulti(len(itemsPermissionLog), itemsPermissionLog)
+	if err != nil {
+		return
+	}
+
+	ow := orm.NewOrm()
+	sqlW := `UPDATE company_contract SET is_allocation=1   WHERE company_contract_id=? `
+	_, err = ow.Raw(sqlW, companyContractId).Exec()
+
+	return
+}
+
+type UpdateAllocationCompanyContractReq struct {
+	CompanyContractId int `description:"合同ID"`
+	List              []*AllocationPermissionListResp
+}
+
+type CygxAllocationCompanyContractDetailResp struct {
+	CompanyContractId  int     `description:"合同ID"`
+	Money              float64 `description:"金额(单位万)"`
+	TotalPointsContent string  `description:"总点数描述"`
+	IsGray             bool    `description:"是否置灰"`
+	List               []*AllocationPermissionListResp
+}
+
+// 行业
+type AllocationPermissionListResp struct {
+	ChartPermissionName string  `description:"行业名称"`
+	Proportion          float64 `description:"占比"`
+	Money               float64 `description:"金额(单位万)"`
+	MoneyAvg            float64 `description:"行业所占合同的平均金额"`
+	List                []*AllocationRealNameListResp
+}
+
+// 行业
+type AllocationRealNameListResp struct {
+	RealName   string  `description:"研究员姓名"`
+	Proportion float64 `description:"占比"`
+	Money      float64 `description:"金额(单位万)"`
+}
+
+// 获取数量
+func GetCygxAllocationCompanyContractCountByCompanyContractId(companyContractId int) (count int, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_allocation_company_contract WHERE company_contract_id = ? `
+	err = o.Raw(sqlCount, companyContractId).QueryRow(&count)
+	return
+}
+
+// 研究员列表
+func GetCygxAllocationCompanyContractListById(companyContractId int) (items []*CygxAllocationCompanyContract, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_allocation_company_contract WHERE company_contract_id = ? `
+	_, err = o.Raw(sql, companyContractId).QueryRows(&items)
+	return
+}
+
+// 研究员列表
+func GetCygxAllocationCompanyContractList(condition string, pars []interface{}) (items []*CygxAllocationCompanyContract, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_allocation_company_contract as art WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// 行业列表
+func GetCygxAllocationCompanyContractPermissionListById(companyContractId int) (items []*AllocationPermissionListResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ` SELECT * FROM cygx_allocation_company_contract_permission WHERE company_contract_id = ? `
+	_, err = o.Raw(sql, companyContractId).QueryRows(&items)
+	return
+}
+
+// 行业列表
+func GetCygxAllocationCompanyContractPermissionList(condition string, pars []interface{}) (items []*AllocationPermissionListResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ` SELECT * FROM cygx_allocation_company_contract_permission  as art WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+type CygxAllocationCompanyContractDetailStatisticsResp struct {
+	List          []*AllocationPermissionStatisticsListResp
+	TotalContract int     `description:"关联合同总计"`
+	TotalMoney    float64 `description:"总派点总计"`
+}
+
+// 行业
+type AllocationPermissionStatisticsListResp struct {
+	ChartPermissionName string `description:"行业名称"`
+	List                []*AllocationRealNameStatisticsListResp
+}
+
+// 行业
+type AllocationRealNameStatisticsListResp struct {
+	RealName             string  `description:"研究员姓名"`
+	TotalRelatedContract float64 `description:"关联合同"`
+	TotalDispatchPoint   string  `description:"总派点"`
+	GroupProportion      string  `description:"组内占比"`
+	DepartmentProportion string  `description:"部门占比"`
+}

+ 2 - 11
models/cygx/apply_record.go

@@ -69,7 +69,7 @@ type CygxApplyRecordResp struct {
 func GetCygxApplyRecord(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxApplyRecordResp, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
 	sql := ` SELECT DISTINCT a.*
-        FROM cygx_apply_record AS a `
+        FROM cygx_apply_record AS a  WHERE  1 = 1  `
 	if condition != "" {
 		sql += condition
 	}
@@ -80,19 +80,10 @@ func GetCygxApplyRecord(condition string, pars []interface{}, startSize, pageSiz
 
 func GetCygxApplyRecordCount(condition string, pars []interface{}) (count int, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
-	//sql := `SELECT COUNT(1) AS count FROM cygx_apply_record AS a
-	//	LEFT JOIN company_product AS b ON a.company_id_pay=b.company_id
-	//	LEFT JOIN wx_user AS c ON a.user_id=c.user_id WHERE 1=1 `
-	//
-	//if condition != "" {
-	//	sql += condition
-	//}
-	sql := `SELECT COUNT(1) AS count FROM ( SELECT DISTINCT a.*
-        FROM cygx_apply_record AS a `
+	sql := `SELECT COUNT( 1 ) AS count FROM cygx_apply_record AS a WHERE  1 = 1  `
 	if condition != "" {
 		sql += condition
 	}
-	sql += ` GROUP BY a.apply_record_id ) b `
 	err = o.Raw(sql, pars).QueryRow(&count)
 	return
 }

+ 6 - 9
models/cygx/chart.go

@@ -275,9 +275,8 @@ func GetChartCollectList(condition string) (items []*UserInteraction, err error)
 	//		WHERE 1= 1 ` + condition + `   GROUP BY r.mobile  ORDER BY ui.chart_count_num DESC `
 	//_, err = o.Raw(sql).QueryRows(&items)
 
-	o := orm.NewOrm()
-	sql := `SELECT u.mobile,u.user_id,u.real_name FROM cygx_chart_collect AS r
-			INNER JOIN wx_user AS u ON u.mobile = r.mobile
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT  *  FROM cygx_chart_collect AS r
 			WHERE 1= 1 ` + condition + `   GROUP BY r.mobile `
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
@@ -285,7 +284,7 @@ func GetChartCollectList(condition string) (items []*UserInteraction, err error)
 
 // 获取图表列表
 func GetChartCollectBycompanyList(condition string, startSize, pageSize int) (items []*UserInteraction, err error) {
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("hz_cygx")
 	//sql := `SELECT u.mobile,u.user_id,u.real_name,r.company_name,
 	//		cp.seller_name FROM cygx_chart_collect AS r
 	//		INNER JOIN wx_user AS u ON u.user_id = r.user_id
@@ -294,10 +293,8 @@ func GetChartCollectBycompanyList(condition string, startSize, pageSize int) (it
 	//		INNER JOIN cygx_company_interaction_num AS ci ON ci.company_id = r.company_id
 	//		WHERE 1= 1 ` + condition + `   GROUP BY r.mobile  ORDER BY ci.chart_count_num DESC , ui.chart_count_num DESC `
 
-	sql := `SELECT u.mobile,u.user_id,u.real_name,r.company_name,
-			cp.seller_name FROM cygx_chart_collect AS r
-			INNER JOIN wx_user AS u ON u.user_id = r.user_id
-			LEFT JOIN company_product AS cp ON cp.company_id = r.company_id AND cp.product_id = 2
+	sql := `SELECT r.*
+			FROM cygx_chart_collect AS r
 			WHERE 1= 1 ` + condition + `   GROUP BY r.mobile   `
 	if startSize > 0 || pageSize > 0 {
 		sql += ` LIMIT ` + strconv.Itoa(startSize) + "," + strconv.Itoa(pageSize)
@@ -319,7 +316,7 @@ func GetChartCountByUserCount(condition string) (count int, err error) {
 				cygx_chart_collect AS r
 				INNER JOIN cygx_user_interaction_num AS ui ON ui.user_id = r.user_id
 				INNER JOIN cygx_company_interaction_num AS ci ON ci.company_id = r.company_id 
-				WHERE 1= 1 ` + condition + ` GROUP BY u.user_id ) AS count`
+				WHERE 1= 1 ` + condition + ` GROUP BY r.user_id ) AS count`
 	err = o.Raw(sql).QueryRow(&count)
 	return
 }

+ 92 - 0
models/cygx/company_contract.go

@@ -0,0 +1,92 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+)
+
+// 增量客户统计报表列表数据结构
+type CompanyContractResp struct {
+	CompanyContractId int     `description:"合同id"`
+	ContractType      string  `description:"合同类型"`
+	CompanyId         int     `description:"企业客户id"`
+	CompanyName       string  `description:"企业客户名称"`
+	ContractCode      string  `description:"合同编码"`
+	StartDate         string  `description:"合同开始日期"`
+	EndDate           string  `description:"合同结束日期"`
+	Money             float64 `description:"合同金额"`
+	CreateTime        string  `description:"合同创建时间"`
+	ModifyTime        string  `description:"合同修改时间"`
+	SellerId          int     `description:"归属销售id"`
+	SellerName        string  `description:"归属销售名称"`
+	IsAllocation      int     `description:"是否派点: 0-未派点; 1-已派点"`
+	Source            string  `description:"合同来源,枚举值:上传附件、系统合同,默认上传附件"`
+	FormalType        string  `description:"转正类型,枚举值: 标准、非标"`
+	IsGray            bool    `description:"是否置灰"`
+	ContractId        int     `description:"合同唯一id"`
+	MoneyPoint        float64 `description:"派点金额"`
+	PermissionName    string  `description:"权限名"`
+}
+
+// 增量客户统计报表返回类
+type CompanyContractListResp struct {
+	Paging *paging.PagingItem `description:"分页数据"`
+	List   []*CompanyContractResp
+}
+
+// 获取存量客户未续约报表列表统计数据(根据合同来展示)
+func GetCompanyContractCountJoinCompany(condition string, pars []interface{}) (total int, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT
+	count(*) AS count 
+FROM
+	(
+	SELECT
+		COUNT(*) 
+	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
+		a.STATUS = 1 
+		` + condition + `
+	GROUP BY
+	a.company_contract_id 
+	) b`
+	err = o.Raw(sql, pars).QueryRow(&total)
+	return
+}
+
+// 获取存量客户未续约报表列表数据(根据合同来展示)
+func GetCompanyContractListJoinCompany(condition string, pars []interface{}, startSize, pageSize int) (items []*CompanyContractResp, err error) {
+	o := orm.NewOrm()
+	//
+	//sql := `SELECT a.*,b.region_type,c.seller_id,c.seller_name,b.company_name 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 a.status = 1 `
+	//
+	//if condition != "" {
+	//	sql += condition
+	//}
+	//sql += " order by a.start_date desc "
+	//sql = `select *,count(*) count from (` + sql + `) b group by company_id  order by end_date asc,company_id desc limit ?,?`
+
+	sql := ` SELECT
+			a.*,
+			b.region_type,
+			c.seller_id,
+			c.seller_name,
+			b.company_name 
+		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
+			a.STATUS = 1`
+	sql += condition
+	sql += `GROUP BY a.company_contract_id ORDER BY a.start_date DESC   , a.company_contract_id DESC  	LIMIT  ?,? `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}

+ 6 - 6
models/cygx/cygx_user.go

@@ -180,8 +180,8 @@ func GetCygxCompanyUserListByNoLoss() (items []*CygxCompanyUserAndSellerResp, er
 
 // 对于上面的SQL的拆分优化查询速度
 func GetCygxCompanyUserListSplit(userIds string) (items []*CygxCompanyUser, err error) {
-	return
-	o := orm.NewOrm()
+
+	o := orm.NewOrmUsingDB("hz_cygx")
 	sql := `SELECT
 			u.user_id,
 			( 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.mobile = u.mobile AND h.is_del = 0   AND h.mobile <>'' ) AS history_num,
@@ -215,7 +215,7 @@ func GetCygxCompanyUserListSplit(userIds string) (items []*CygxCompanyUser, err
 				man.activity_id IN ( SELECT activity_id FROM cygx_activity_signup AS f WHERE f.user_id = u.user_id  AND label != '') 
 			) AS activity_label
 		FROM
-			wx_user AS u WHERE  u.user_id IN( ` + userIds + `) `
+			cygx_user_label AS u WHERE  u.user_id IN (` + userIds + `)  AND u.mobile != ''	GROUP BY u.user_id  `
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
@@ -353,6 +353,7 @@ type UserInteraction struct {
 	ChartId               int    `description:"图表id"`
 	RealName              string `description:"姓名"`
 	CompanyName           string `description:"公司名称"`
+	CompanyId             int    `description:"公司ID"`
 	SellerName            string `description:"所属销售"`
 	Mobile                string `description:"手机号"`
 	UserId                int    `description:"用户ID"`
@@ -605,7 +606,7 @@ func GetCygxActivitySpecialTripByUser(uid, startSize, pageSize int) (items []*Us
 		WHERE
 			1 = 1
 			 AND a.publish_status = 1 AND a.activity_time_end < NOW()
-			AND u.user_id = ?
+			AND h.user_id = ?
 			ORDER BY  a.activity_time DESC LIMIT ?,? `
 	_, err = o.Raw(sql, uid, startSize, pageSize).QueryRows(&items)
 	return
@@ -672,7 +673,6 @@ func GetCygxRoadshowByUser(uid, startSize, pageSize int) (items []*UserInteracti
 		FROM
 			cygx_activity_voice_history AS r
 			INNER JOIN cygx_activity_voice AS v ON r.activity_id = v.activity_id
-			INNER JOIN wx_user AS u ON r.mobile = u.mobile 
 		WHERE
 			r.user_id = ?
 		ORDER BY create_time DESC   LIMIT ?,? `
@@ -906,7 +906,7 @@ type GetUserInteractionTableCountResp struct {
 func GetUserInteractionTableCount(uid int) (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.user_id = ? ) 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.user_id = ?  AND h.is_del = 0 ) AS history_num,
 			( SELECT COUNT( 1 ) FROM cygx_article_collect AS h WHERE h.user_id = ? AND  h.article_id > 0  ) AS count_num,
 			( SELECT COUNT( 1 ) FROM cygx_chart_collect AS h INNER JOIN cygx_chart_all AS a ON h.chart_id = a.chart_id WHERE h.user_id = ?  ) AS chart_num,
 			( SELECT COUNT( 1 ) FROM cygx_industry_fllow AS h WHERE h.user_id = ? AND h.type = 1  ) AS industry_fllow_num,

+ 13 - 12
models/cygx/cygx_user_company.go

@@ -409,7 +409,7 @@ func GetCygxRoadshowByCompanyList(condition string, startSize, pageSize int) (it
 			r.real_name,
 			r.mobile,
 			r.company_name,
-			cp.seller_name,
+			r.company_id,
 			ci.roadshow_num,
 			ui.roadshow_num AS ui_roadshow_num,
 			"逻辑解析" AS file_type 
@@ -425,7 +425,7 @@ func GetCygxRoadshowByCompanyList(condition string, startSize, pageSize int) (it
 			r.real_name,
 			r.mobile,
 			r.company_name,
-			cp.seller_name,
+			r.company_id,
 			ci.roadshow_num,
 			ui.roadshow_num AS ui_roadshow_num,
 			"路演回放" AS file_type 
@@ -441,7 +441,7 @@ func GetCygxRoadshowByCompanyList(condition string, startSize, pageSize int) (it
 			r.real_name,
 			r.mobile,
 			r.company_name,
-			cp.seller_name,
+			r.company_id,
 			ci.roadshow_num,
 			ui.roadshow_num AS ui_roadshow_num,
 			"路演回放" AS file_type 
@@ -513,7 +513,7 @@ func GetCygxArticleHistoryRecordByCompanyList(condition string, startSize, pageS
 			r.mobile,
 			r.user_id,
 			r.company_name,
-			cp.seller_name,
+			r.company_id,
 			r.real_name,
 			r.stop_time,
 			r.source as source_platform,
@@ -553,7 +553,7 @@ func GetActivityMeetByCompanyList(condition string, startSize, pageSize int) (it
 			r.meeting_authentication,
 			r.meeting_status_str,
 			r.company_name,
-			cp.seller_name,
+			r.company_id,
 			r.real_name,
 			r.duration
 		FROM
@@ -594,7 +594,7 @@ func GetCygxArticleCollectByCompanyList(startSize, pageSize int, condition strin
 			r.real_name,
 			re.match_type_name,
 			r.company_name,
-			cp.seller_name,
+			r.company_id,
 			(
 			SELECT
 				GROUP_CONCAT( DISTINCT s.subject_name SEPARATOR '/' ) 
@@ -636,14 +636,15 @@ func GetCygxIndustryFllowByCompanyList(condition string, startSize, pageSize int
 			r.mobile,
 			r.real_name,
 			r.modify_time as create_time,
-			cp.company_name,
-			cp.seller_name,
+			r.company_name,
+			r.company_id,
+
 			( SELECT GROUP_CONCAT( DISTINCT s.subject_name SEPARATOR '/' ) FROM cygx_industrial_subject AS s WHERE s.industrial_management_id = m.industrial_management_id ) AS subject_name_str 
 		FROM
 			cygx_industry_fllow AS r
 			INNER JOIN cygx_industrial_management AS m ON m.industrial_management_id = r.industrial_management_id
 			LEFT JOIN cygx_company_interaction_num AS ci ON ci.company_id = r.company_id
-			LEFT  JOIN cygx_user_interaction_num as ui  ON ui.user_id = u.user_id
+			LEFT  JOIN cygx_user_interaction_num as ui  ON ui.user_id = r.user_id
 			
 		WHERE  type = 1 ` + condition + ` ORDER BY ci.industry_fllow_num DESC,ui.industry_fllow_num DESC, r.create_time DESC  LIMIT ?,? `
 	_, err = o.Raw(sql, startSize, pageSize).QueryRows(&items)
@@ -659,8 +660,8 @@ func GetCygArticleDepartmentFollowByCompanyList(condition string, startSize, pag
 			r.modify_time as  create_time,
 			r.mobile,
 			r.real_name,
-			cp.company_name,
-			cp.seller_name,
+			r.company_name,
+			r.company_id,
 			m.department_id,
 			i.industry_name,
 			a.title,
@@ -688,8 +689,8 @@ func GetCygxSearchKeyWordByCompanyList(condition string, startSize, pageSize int
 	sql := `SELECT
 			r.key_word,r.create_time,
 			r.mobile,
-			r.source,
 			r.company_name,
+			r.company_id,
 			r.real_name
 		FROM
 			cygx_search_key_word as r

+ 83 - 4
models/cygx/cygx_user_record.go

@@ -22,7 +22,8 @@ type CygxUserRecord struct {
 type OpenIdList struct {
 	OpenId    string
 	UserId    int
-	CompanyId int `description:"公司ID"`
+	CompanyId int    `description:"公司ID"`
+	Mobile    string `description:"手机号"`
 }
 
 type OpenIdMobileList struct {
@@ -169,7 +170,7 @@ func GetCygxUserRefusetOpenid() (items []*OpenIdList, err error) {
 
 // 获取选择策略推送的用户的openid openid
 func GetCygxUserFllowCeLueOpenid(categoryId int) (items []*OpenIdList, err error) {
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("hz_cygx")
 	sql := `SELECT
 			cr.open_id,
 			cr.cygx_user_id AS user_id 
@@ -189,7 +190,7 @@ func GetCygxUserFllowCeLueOpenid(categoryId int) (items []*OpenIdList, err error
 
 // 获取关注这个活动对应产业的用户的 openid
 func GetCygxActiviyUserFllowOpenid(activityId int) (items []*OpenIdList, err error) {
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("hz_cygx")
 	sql := `SELECT
 				cr.open_id,
 				cr.cygx_user_id AS user_id  
@@ -200,7 +201,7 @@ func GetCygxActiviyUserFllowOpenid(activityId int) (items []*OpenIdList, err err
 			INNER JOIN cygx_industrial_activity_group_management AS mg ON mg.industrial_management_id = f.industrial_management_id 
 		WHERE
 			1=1 
-			AND mg.activity_id = ?`
+			AND mg.activity_id = ?  AND mg.source = 1 `
 	_, err = o.Raw(sql, activityId).QueryRows(&items)
 	return
 }
@@ -325,6 +326,7 @@ func GetCygxUserRecordCompany() (items []*OpenIdList, err error) {
 func GetCygxUserRecordCompanyUserId() (items []*OpenIdList, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
 	sql := `SELECT
+			u.open_id,
 			u.cygx_user_id AS user_id 
 		FROM
 			cygx_user_record AS u 
@@ -386,3 +388,80 @@ func GetUserRecordListByMobileArr(bindAccount []string) (items []*OpenIdList, er
 	_, err = o.Raw(sql, pars).QueryRows(&items)
 	return
 }
+
+// 获取单个用户openid
+func GetUserRecordOpenidByMobile(bindAccount string) (item *OpenIdList, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	var sql string
+	sql = `SELECT cr.open_id,cr.cygx_user_id as  user_id
+			FROM cygx_user_record AS cr 
+			WHERE cr.cygx_bind_account = ?`
+	err = o.Raw(sql, bindAccount).QueryRow(&item)
+	return
+}
+
+// 获取预约活动的用户的openID
+func GetActivityOpenIdList(activityId int) (items []*OpenIdList, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT DISTINCT cr.open_id,cr.cygx_user_id as  user_id
+			FROM
+			cygx_my_schedule AS m
+			INNER JOIN cygx_user_record AS cr ON cr.cygx_bind_account = m.mobile 
+			WHERE m.activity_id = ?  `
+	_, err = o.Raw(sql, activityId).QueryRows(&items)
+	return
+}
+
+// 获取预约活动的用户的openID
+func GetActivitySpecialOpenIdList() (items []*OpenIdList, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT DISTINCT cr.open_id,cr.cygx_user_id as  user_id
+			FROM
+			cygx_user_follow_special AS m
+			INNER JOIN cygx_user_record AS cr ON cr.cygx_bind_account = m.mobile  `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+// 获取关注作者的用户的openID
+func GetFollowDepartmentOpenIdList(departmentId int) (items []*OpenIdList, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT  DISTINCT cr.open_id,cr.cygx_user_id as  user_id
+			FROM
+				cygx_article_department_follow AS f
+				INNER JOIN cygx_user_record AS cr  ON cr.cygx_bind_account = f.mobile   
+			WHERE
+				f.department_id = ? `
+	_, err = o.Raw(sql, departmentId).QueryRows(&items)
+	return
+}
+
+// 获取关注产业的用户的openID
+func GetFollowindustrialOpenIdList(industrialManagementId int) (items []*OpenIdList, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT DISTINCT cr.open_id,cr.cygx_user_id as  user_id
+			FROM
+			cygx_industry_fllow AS f
+			INNER JOIN cygx_user_record AS cr  ON cr.cygx_bind_account = f.mobile   
+			WHERE
+			f.industrial_management_id = ? `
+	_, err = o.Raw(sql, industrialManagementId).QueryRows(&items)
+	return
+}
+
+// 获取所有关注了该产业用户的openid
+func GetCygxUserIndustryFllowOpneidByActivityIds(activityId int) (items []*OpenIdList, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+			cr.open_id,
+			cr.cygx_bind_account as mobile,
+			cr.cygx_user_id AS user_id 
+		FROM
+			cygx_industrial_activity_group_management AS agm
+			INNER JOIN cygx_industry_fllow AS f ON f.industrial_management_id = agm.industrial_management_id
+			INNER JOIN cygx_user_record AS cr ON cr.cygx_user_id = f.user_id 
+		WHERE
+			agm.activity_id = ? `
+	_, err = o.Raw(sql, activityId).QueryRows(&items)
+	return
+}

+ 151 - 0
models/cygx/cygx_yanxuan_special.go

@@ -0,0 +1,151 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxYanxuanSpecial struct {
+	Id          int       `orm:"column(id);pk"`
+	UserId      int       // 用户ID
+	CreateTime  time.Time // 创建时间
+	ModifyTime  time.Time // 修改时间
+	PublishTime time.Time // 提审过审或驳回时间
+	Content     string    // 内容
+	Tags        string    // 标签
+	Status      int       // 1:未发布,2:审核中 3:已发布 4:驳回
+	ImgUrl      string    // 图片链接
+	DocUrl      string    // 文档链接
+	Reason      string    // 理由
+	Title       string    // 标题
+	Type        string    // 类型1:笔记,2:观点
+}
+
+type CygxYanxuanSpeciaResplItem struct {
+	Id            int    `orm:"column(id);pk"`
+	UserId        int    // 用户ID
+	CreateTime    string // 创建时间
+	ModifyTime    string // 修改时间
+	PublishTime   string // 提审过审或驳回时间
+	Content       string // 内容
+	Tags          string // 标签
+	Status        int    // 1:未发布,2:审核中 3:已发布 4:驳回
+	ImgUrl        string // 图片链接
+	DocUrl        string // 文档链接
+	SpecialName   string // 专栏名称
+	Introduction  string // 介绍
+	Label         string // 标签
+	NickName      string // 昵称
+	RealName      string // 姓名
+	Mobile        string // 手机号
+	HeadImg       string // 头像
+	BgImg         string // 背景图
+	Reason        string // 理由
+	Title         string // 标题
+	CompanyTags   string
+	IndustryTags  string
+	Type          int // 类型1:笔记,2:观点
+	ContentHasImg int //正文是否包含图片 1包含 0不包含
+	Docs          []Doc
+}
+
+type Doc struct {
+	DocName   string
+	DocSuffix string
+	DocUrl    string
+	DocIcon   string
+}
+
+func GetYanxuanSpecialList(condition string, pars []interface{}) (items []*CygxYanxuanSpeciaResplItem, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ``
+	sql = `SELECT a.*,b.bg_img,b.head_img,b.introduction,b.label,b.mobile,b.nick_name,b.real_name,b.special_name
+FROM cygx_yanxuan_special AS a
+JOIN cygx_yanxuan_special_author AS b ON a.user_id = b.user_id 
+ WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += `ORDER BY a.publish_time `
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+type EnableCygxYanxuanSpecialReq struct {
+	Id     int    // 文章id
+	Status int    // 1通过2驳回
+	Reason string //理由
+}
+
+func EnableYanxuanSpecial(id, status int, reason string) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ``
+	sql = `UPDATE cygx_yanxuan_special SET status=?,reason=?,publish_time=NOW() WHERE id = ? `
+	_, err = o.Raw(sql, status, reason, id).Exec()
+	return
+}
+
+type CygxYanxuanSpecialItem struct {
+	Id            int    `orm:"column(id);pk"`
+	UserId        int    // 用户ID
+	CreateTime    string // 创建时间
+	ModifyTime    string // 修改时间
+	PublishTime   string // 提审过审或驳回时间
+	Content       string // 内容
+	Tags          string // 标签
+	Status        int    // 1:未发布,2:审核中 3:已发布 4:驳回
+	ImgUrl        string // 图片链接
+	DocUrl        string // 文档链接
+	SpecialName   string // 专栏名称
+	Introduction  string // 介绍
+	Label         string // 标签
+	NickName      string // 昵称
+	RealName      string // 姓名
+	Mobile        string // 手机号
+	HeadImg       string // 头像
+	BgImg         string // 背景图
+	Reason        string // 理由
+	Title         string // 标题
+	Type          int    // 类型1:笔记,2:观点
+	CollectNum    int
+	MyCollectNum  int
+	IsCollect     int
+	CompanyTags   string
+	IndustryTags  string
+	ContentHasImg int //正文是否包含图片 1包含 0不包含
+	Docs          []Doc
+}
+
+func GetYanxuanSpecialFollowUserById(specialId int) (items []int, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ``
+	sql = `SELECT b.user_id
+FROM cygx_yanxuan_special AS a
+JOIN cygx_yanxuan_special_follow AS b ON a.user_id = b.follow_user_id
+ WHERE a.id=? `
+	_, err = o.Raw(sql, specialId).QueryRows(&items)
+	return
+}
+
+func GetYanxuanSpecialItemById(specialId int) (item *CygxYanxuanSpecialItem, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ``
+	sql = `SELECT a.*,b.bg_img,b.head_img,b.introduction,b.label,b.mobile,
+b.nick_name,b.real_name,b.special_name
+FROM cygx_yanxuan_special AS a
+JOIN cygx_yanxuan_special_author AS b ON a.user_id = b.user_id 
+ WHERE a.id=? `
+	err = o.Raw(sql, specialId).QueryRow(&item)
+	return
+}
+
+// 获取数量
+func GetCygxYanxuanSpecialCount(condition string, pars []interface{}) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_yanxuan_special WHERE 1= 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	o := orm.NewOrmUsingDB("hz_cygx")
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}

+ 78 - 0
models/cygx/cygx_yanxuan_special_user.go

@@ -0,0 +1,78 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxYanxuanSpecialAuthor struct {
+	Id           int       `orm:"column(id);pk"`
+	UserId       int       // 用户ID
+	SpecialName  string    // 专栏名称
+	Introduction string    // 介绍
+	Label        string    // 标签
+	NickName     string    // 昵称
+	RealName     string    // 姓名
+	Mobile       string    // 手机号
+	CreateTime   time.Time // 创建时间
+	ModifyTime   time.Time // 修改时间
+	HeadImg      string    // 头像
+	BgImg        string    // 背景图上部分
+	BgImgDown    string    // 背景图下部分
+	BgImgPc      string    // pc背景图
+	Status       int       // 1启用2禁用
+}
+
+type CygxYanxuanSpecialAuthorItem struct {
+	Id           int    `orm:"column(id);pk"`
+	UserId       int    // 用户ID
+	CompanyName  string // 公司名
+	SpecialName  string // 专栏名称
+	Introduction string // 介绍
+	Label        string // 标签
+	NickName     string // 昵称
+	RealName     string // 姓名
+	Mobile       string // 手机号
+	CreateTime   string // 创建时间
+	ModifyTime   string // 修改时间
+	HeadImg      string // 头像
+	BgImg        string // 背景图
+	Status       int    // 1启用2禁用
+}
+
+func AddCygxYanxuanSpecialAuthor(item *CygxYanxuanSpecialAuthor) (lastId int64, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	lastId, err = o.Insert(item)
+	return
+}
+
+type AddCygxYanxuanSpecialAuthorReq struct {
+	UserId   int    // 用户ID
+	RealName string // 姓名
+	Mobile   string // 手机号
+}
+
+type EnableCygxYanxuanSpecialAuthorReq struct {
+	UserId int // 用户ID
+	Status int // 1启用2禁用
+}
+
+// 启用禁用作者
+func EnableYanxuanSpecialAuthor(userId, status int) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ``
+	sql = `UPDATE cygx_yanxuan_special_author SET status=? WHERE user_id = ? `
+	_, err = o.Raw(sql, status, userId).Exec()
+	return
+}
+
+func GetYanxuanSpecialAuthorList() (items []*CygxYanxuanSpecialAuthorItem, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ``
+	sql = `SELECT
+	a.*
+FROM
+	cygx_yanxuan_special_author as a ORDER BY create_time DESC `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}

+ 28 - 0
models/cygx/industry_fllow.go

@@ -92,3 +92,31 @@ func AddCygxIndustryFllowMulti(items []*CygxIndustryFllow) (err error) {
 	}
 	return
 }
+
+// 获取所有关注了该产业永续客户的openid
+func GetCygxForeverUserIndustryFllowOpneidByActivityIds(activityId int) (items []*OpenIdList, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT
+				f.* 
+			FROM
+				cygx_industrial_activity_group_management AS agm
+				INNER JOIN cygx_industry_fllow AS f ON f.industrial_management_id = agm.industrial_management_id 
+			WHERE
+				agm.activity_id = ?`
+	_, err = o.Raw(sql, activityId).QueryRows(&items)
+	return
+}
+
+// 获取所有关注了该产业用户的companyIds
+func GetCygxIndustryFollowCompanyIdsByActivityId(activityId int) (item *string, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ` SELECT
+	GROUP_CONCAT( DISTINCT f.company_id SEPARATOR ',' ) AS company_ids 
+FROM
+	cygx_industrial_activity_group_management AS agm
+	INNER JOIN cygx_industry_fllow AS f ON f.industrial_management_id = agm.industrial_management_id 
+WHERE
+	agm.activity_id = ? `
+	err = o.Raw(sql, activityId).QueryRow(&item)
+	return
+}

+ 16 - 3
models/cygx/report_article.go

@@ -1016,7 +1016,7 @@ type ArticleRoadshowEssenceDetail struct {
 
 // 文章详情
 func GetArticleRoadshowEssenceDetail(articleId int) (item *ArticleRoadshowEssenceDetail, err error) {
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("hz_cygx")
 	sql := `SELECT
 	art.* ,
 	GROUP_CONCAT( DISTINCT mg.industrial_management_id SEPARATOR ',' ) AS industrial_management_id ,
@@ -1037,7 +1037,7 @@ WHERE
 
 // 列表
 func GetArticleRoadshowEssenceList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxResearchSummaryRep, err error) {
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("hz_cygx")
 	sql := `SELECT *,
 				(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
@@ -1063,7 +1063,20 @@ func GetArticlList(condition string, pars []interface{}, startSize, pageSize int
 	return
 }
 
-// 修改发布状态
+// GetArticleListByIdList 根据报告id列表获取报告列表
+func GetArticleListByIdList(articleLIdList []int) (items []*CygxArticle, err error) {
+	num := len(articleLIdList)
+	if num <= 0 {
+		return
+	}
+
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_article as art WHERE 1= 1 AND article_id in (` + utils.GetOrmInReplace(num) + `)`
+	_, err = o.Raw(sql, articleLIdList).QueryRows(&items)
+	return
+}
+
+// RoadshowEssencePublishAndCancel 修改发布状态
 func RoadshowEssencePublishAndCancel(item *CygxResearchSummaryRep) (err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
 	sql := `UPDATE cygx_article SET  publish_status=? , last_updated_time= ?, periods= ?,admin_id =? ,admin_name =? ,have_publish = 1 WHERE article_id=? `

+ 1 - 1
models/cygx/report_mapping_cygx.go

@@ -66,7 +66,7 @@ func GetCygxReportMappingCygxCount(condition string, pars []interface{}) (count
 	if condition != "" {
 		sqlCount += condition
 	}
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("hz_cygx")
 	err = o.Raw(sqlCount, pars).QueryRow(&count)
 	return
 }

+ 8 - 0
models/cygx/resource_data.go

@@ -82,3 +82,11 @@ func GetCygxResourceDataByIdAndSource(sourceId int, source string) (item *CygxRe
 	err = o.Raw(sql, sourceId, source).QueryRow(&item)
 	return
 }
+
+// 获取数量
+func GetCygxResourceDataBySourceAndIdCount(sourceId int, source string) (count int, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_resource_data  WHERE  source_id = ? AND source =?  `
+	err = o.Raw(sqlCount, sourceId, source).QueryRow(&count)
+	return
+}

+ 3 - 3
models/cygx/summary_manage.go

@@ -68,6 +68,7 @@ type CygxArticle struct {
 	IsReport           int       `description:"是否属于报告 1是、0否"`
 	ReportType         int       `description:"'报告类型,1行业报告,2产业报告'"`
 	Source             int       `description:"来源 0策略平台同步,1小程序后台添加"`
+	MatchTypeName      string    `description:"匹配类型名称"`
 	ArticleIdMd5       string    `description:"ID,md5值"`
 	UpdateFrequency    string    `description:"更新周期"`
 	SellerAndMobile    string    `description:"销售和手机号"`
@@ -296,7 +297,7 @@ type CygxArticleList struct {
 
 // 列表
 func GetSummaryManageList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxArticleList, err error) {
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("hz_cygx")
 	sql := ` SELECT 
 		(SELECT COUNT(1) FROM cygx_article_history_record_newpv AS h   WHERE h.article_id=art.article_id AND h.company_id != ` + strconv.Itoa(utils.HZ_COMPANY_ID) + ` ) AS pv,
 	   	(SELECT COUNT(DISTINCT h.user_id) FROM cygx_article_history_record_newpv AS h  WHERE h.article_id=art.article_id AND h.company_id != ` + strconv.Itoa(utils.HZ_COMPANY_ID) + ` ) AS uv,
@@ -532,8 +533,7 @@ func GetArticleHistoryList(articleId int, condition string) (items []*ArticleHis
 				cygx_article_history_record_all AS h
 			WHERE
 				h.article_id = ?
-				AND h.platfor = 1
-				AND c.product_id = 2`
+				AND h.platfor = 1  AND h.is_del = 0  `
 	if condition != "" {
 		sql = sql + condition + ` GROUP BY h.id`
 	}

+ 7 - 1
models/db.go

@@ -295,7 +295,8 @@ func initReport() {
 		new(ClassifyMenuRelation), // 报告分类-子目录关联表
 		new(ReportSendThsConfig),  //产品推送给同花顺的配置表
 		//new(ChartPermissionChapterMapping), // 权限mapping表
-		new(ReportChapterType), // 报告章节类型表
+		new(ReportChapterType),    // 报告章节类型表
+		new(UserReportViewRecord), // 用户报告阅读记录表(汇总表)
 	)
 }
 
@@ -446,6 +447,11 @@ func initCygx() {
 		new(cygx.CygxReportMappingCategoryGroup),
 		new(cygx.CygxResourceDataIndustrialGroupManagement),
 		new(cygx.CygxResourceDataIndustrialGroupSubject),
+		new(cygx.CygxYanxuanSpecialAuthor),
+		new(cygx.CygxAllocationCompanyContract),
+		new(cygx.CygxAllocationCompanyContractLog),
+		new(cygx.CygxAllocationCompanyContractPermission),
+		new(cygx.CygxAllocationCompanyContractPermissionLog),
 		new(cygx.CygxQuestionnaire),
 		new(cygx.CygxQuestionnaireTheme),
 	)

+ 13 - 1
models/help_doc/classify.go

@@ -233,6 +233,18 @@ func EditHelpDocClassifyVisible(classifyId int, visibleBusinessIds string) (err
 	return
 }
 
+func AddAllHelpDocClassifyVisible(businessId int) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE help_doc_classify set visible_business_ids=CONCAT(visible_business_ids,",", ?)  where visible_business_ids !=""`
+	_, err = o.Raw(sql, businessId).Exec()
+	if err != nil {
+		return
+	}
+	sql = `UPDATE help_doc_classify set visible_business_ids=CONCAT(visible_business_ids, ?)  where visible_business_ids =""`
+	_, err = o.Raw(sql, businessId).Exec()
+	return
+}
+
 func GetAllHelpDocClassify() (items []*HelpDocClassifyItems, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT * FROM help_doc_classify `
@@ -245,4 +257,4 @@ func GetAllHelpDocClassifyByKeyword(keyword string) (items []*HelpDocClassifyIte
 	sql := `SELECT * FROM help_doc_classify WHERE classify_name LIKE '%` + keyword + `%' `
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
-}
+}

+ 15 - 0
models/report.go

@@ -3,6 +3,7 @@ package models
 import (
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/rdlucklib/rdluck_tools/paging"
+	"hongze/hz_crm_api/utils"
 	"strings"
 	"time"
 )
@@ -126,6 +127,20 @@ func GetReportByIds(reportIds string) (list []*ReportDetail, err error) {
 	return
 }
 
+// GetReportByIdList 根据报告id列表获取报告列表
+func GetReportByIdList(reportIdList []int) (list []*ReportDetail, err error) {
+	num := len(reportIdList)
+	if num <= 0 {
+		return
+	}
+
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT * FROM report WHERE id in  (` + utils.GetOrmInReplace(num) + `)`
+	_, err = o.Raw(sql, reportIdList).QueryRows(&list)
+
+	return
+}
+
 // GetSimpleReportByIds 根据报告ID查询报告基本信息
 func GetSimpleReportByIds(reportIds string) (list []*ReportDetail, err error) {
 	o := orm.NewOrmUsingDB("rddp")

+ 56 - 1
models/research_report.go

@@ -1,6 +1,61 @@
 package models
 
-import "time"
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"hongze/hz_crm_api/utils"
+	"time"
+)
+
+// ResearchReport 研究报告表(晨报、周报等)结构体
+type ResearchReport struct {
+	ResearchReportId    int       `orm:"column(research_report_id);pk" description:"研究报告id"`
+	ResearchReportName  string    `description:"研究报告名称"`
+	ResearchReportTitle string    `description:"研究报告标题"`
+	ResearchReportImg   string    `description:"报告缩略图URL"`
+	ResearchReportDate  time.Time `description:"报告日期"`
+	Type                string    `description:"报告类型,枚举值:day 晨报  week 周报 twoweek双周报 month 月报;默认:day"`
+	Author              string    `description:"作者"`
+	ReportVariety       string    `description:"研究报告的品种,双周报和月报有标识"`
+	IsHasMenu           int8      `description:"报告是否含有目录"`
+	IsSendedMsg         int8      `description:"是否发送过模板消息"`
+	Periods             int       `description:"期数"`
+	Status              string    `description:"状态,draft:草稿,"`
+	Enabled             int8      `description:"报告状态"`
+	CreatedTime         string    `description:"创建时间"`
+	LastUpdatedTime     time.Time `description:"最近一次更新时间"`
+	Viewers             int       `description:"H5观看用户数"`
+}
+
+// GetResearchReportListByIds 根据报告id集合获取报告数据列表
+func GetResearchReportListByIds(researchReportIds string) (list []*ResearchReport, err error) {
+	if researchReportIds == "" {
+		return
+	}
+	o := orm.NewOrm()
+	sql := `select * from research_report where research_report_id in (` + researchReportIds + `)`
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+// GetResearchReportListByIdList 根据报告id集合获取报告数据列表
+func GetResearchReportListByIdList(researchReportIdList []int) (list []*ResearchReport, err error) {
+	num := len(researchReportIdList)
+	if num <= 0 {
+		return
+	}
+
+	o := orm.NewOrm()
+	sql := `select * from research_report where research_report_id in (` + utils.GetOrmInReplace(num) + `)`
+	_, err = o.Raw(sql, researchReportIdList).QueryRows(&list)
+	return
+}
+
+// Update 更新数据
+func (researchReport *ResearchReport) Update(updateCols []string) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Update(researchReport, updateCols...)
+	return
+}
 
 type ResearchReportList struct {
 	ResearchReportId    int       `orm:"column(research_report_id);pk" description:"研究报告id"`

+ 148 - 0
models/user_report_view_record.go

@@ -0,0 +1,148 @@
+package models
+
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strings"
+	"sync"
+)
+
+// UserReportViewRecord 用户报告阅读记录表(汇总表)
+type UserReportViewRecord struct {
+	Id              int    `orm:"column(id);pk"`
+	Source          int8   `description:"来源,1:rddp的报告;2:weekly_report的PHP报告;3:weekly_report商品的报告(应该是作废了);4:察研观向的报告"`
+	UserId          int    `description:"用户id"`
+	ReportId        int    `description:"报告id"`
+	ReportChapterId int    `description:"报告章节id"`
+	Mobile          string `description:"手机号"`
+	Email           string `description:"邮箱"`
+	RealName        string `description:"用户实际姓名"`
+	CompanyName     string `description:"公司名称"`
+	StopTime        int    `description:"停留时间"`
+	OutId           string `description:"外部关联id"`
+	CreateTime      string `description:"创建时间"`
+}
+
+// TableName 表名
+func (obj UserReportViewRecord) TableName() string {
+	return `user_report_view_record`
+}
+
+// GetViewReportList 单条记录插入
+func (obj UserReportViewRecord) GetViewReportList(year int, condition string, pars []interface{}, pageSize int) (total int64, items []*UserReportViewRecord, err error) {
+	tableName := obj.GetTableName(year)
+
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`SELECT *  FROM %s WHERE 1 = 1 `, tableName)
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY create_time DESC,id DESC LIMIT ? `
+	total, err = o.Raw(sql, pars, pageSize).QueryRows(&items)
+
+	return
+
+}
+
+// Insert 单条记录插入
+func (obj UserReportViewRecord) Insert(year int, item *UserReportViewRecord) (err error) {
+	tableName := obj.GetTableName(year)
+
+	sql := "INSERT INTO " + tableName + " (`source`, `user_id`, `report_id`, `report_chapter_id`, `mobile`, `email`, `real_name`, `company_name`, `stop_time`, `out_id`, `create_time`) VALUES "
+
+	valStr := fmt.Sprintf(`( %d, %d, %d, %d, "%s", "%s","%s", "%s", %d, "%s", "%s")`, item.Source, item.UserId, item.ReportId, item.ReportChapterId, item.Mobile, item.Email, item.RealName, item.CompanyName, item.StopTime, item.OutId, item.CreateTime)
+
+	sql = sql + valStr + ";"
+
+	o := orm.NewOrm()
+
+	// 先校验表是否存在,不存在的话,需要创建表
+	err = obj.CheckAndCreateTable(o, tableName)
+	if err != nil {
+		return
+	}
+
+	// 插入数据
+	_, err = o.Raw(sql).Exec()
+
+	return
+
+}
+
+// InsertMul 单条记录插入
+func (obj UserReportViewRecord) InsertMul(year int, items []*UserReportViewRecord) (err error) {
+	tableName := obj.GetTableName(year)
+
+	sql := "INSERT INTO " + tableName + " (`source`, `user_id`, `report_id`, `report_chapter_id`, `mobile`, `email`, `real_name`, `company_name`, `stop_time`, `out_id`, `create_time`) VALUES "
+
+	valStrList := make([]string, 0)
+	for _, item := range items {
+		valStrList = append(valStrList, fmt.Sprintf(`( %d, %d, %d, %d, "%s", "%s","%s", "%s", %d, "%s", "%s")`, item.Source, item.UserId, item.ReportId, item.ReportChapterId, item.Mobile, item.Email, item.RealName, item.CompanyName, item.StopTime, item.OutId, item.CreateTime))
+	}
+
+	if len(valStrList) <= 0 {
+		return
+	}
+
+	valStr := strings.Join(valStrList, ",")
+	sql = sql + valStr + ";"
+
+	o := orm.NewOrm()
+
+	// 先校验表是否存在,不存在的话,需要创建表
+	err = obj.CheckAndCreateTable(o, tableName)
+	if err != nil {
+		return
+	}
+
+	// 插入数据
+	_, err = o.Raw(sql).Exec()
+
+	return
+
+}
+
+// GetTableName 获取表名
+func (obj UserReportViewRecord) GetTableName(year int) string {
+	return fmt.Sprintf(`user_report_view_record_%d`, year)
+}
+
+// tableNameMap 已创建表的map
+var tableNameMap = map[string]string{}
+
+// createTableMutex 创建表的时候的锁
+var createTableMutex = &sync.Mutex{}
+
+// CheckAndCreateTable 通过表名校验表是否存在,不存在的话,需要创建表
+func (obj UserReportViewRecord) CheckAndCreateTable(o orm.Ormer, tableName string) (err error) {
+	if _, ok := tableNameMap[tableName]; ok {
+		return
+	}
+
+	// 表判断的时候需要加锁,避免多个协程调用时,表还没有创建成功,又被另一个协程发现表不存在,然后再次创建表
+	createTableMutex.Lock()
+	defer func() {
+		createTableMutex.Unlock()
+	}()
+
+	db := o.Raw(fmt.Sprintf(`SHOW TABLES LIKE "%s"`, tableName))
+	var result []orm.Params
+	_, err = db.Values(&result)
+	if err != nil {
+		fmt.Println("查询表失败:", err)
+		return
+	}
+
+	// 不存在该表,那么就去创建表
+	if len(result) <= 0 {
+		baseSql := fmt.Sprintf("CREATE TABLE `%s` (\n  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增id',\n  `source` tinyint(20) NOT NULL DEFAULT '0' COMMENT '来源,1:rddp的报告;2:weekly_report的PHP报告;3:weekly_report商品的报告(应该是作废了);4:察研观向的报告',\n  `user_id` int(11) DEFAULT '0' COMMENT '用户id',\n  `report_id` int(11) DEFAULT '0' COMMENT '报告id',\n  `report_chapter_id` int(10) DEFAULT NULL COMMENT '报告章节id',\n  `mobile` varchar(20) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '手机号',\n  `email` varchar(100) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '邮箱',\n  `real_name` varchar(30) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '用户时间名称',\n  `company_name` varchar(100) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '公司名称',\n  `stop_time` int(5) NOT NULL DEFAULT '0' COMMENT '停留时间',\n  `out_id` varchar(20) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '外部关联id',\n  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '阅读时间',\n  PRIMARY KEY (`id`),\n  KEY `idx_user_id` (`user_id`),\n  KEY `idx_report_id` (`report_id`),\n  KEY `idx_mobile` (`mobile`),\n  KEY `idx_email` (`email`),\n  KEY `idx_ctime` (`create_time`)\n) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;", tableName)
+		_, err = o.Raw(baseSql).Exec()
+		if err != nil {
+			return
+		}
+	}
+
+	tableNameMap[tableName] = tableName
+
+	return
+}

+ 88 - 60
models/user_view_history.go

@@ -183,41 +183,39 @@ WHERE a.company_id IN ( ` + companyIds + ` ) and b.email !="" and b.mobile=""
 	return
 }
 
-// GetLastReportViewRecordByCompanyIdsMobile 根据手机号获取客户的最新浏览时间
-func GetLastReportViewRecordByCompanyIdsMobile(companyIds string) (items []*CompanyLastViewSlice, err error) {
-	today := time.Now().Format(utils.FormatDate)
-	o := orm.NewOrm()
-	dataName := ""
-	if utils.RunMode == "debug" {
-		dataName = "test_v2_hongze_rddp"
-	} else {
-		dataName = "hongze_rddp"
+// MobileOrEmailLastViewSlice 根据手机号/邮箱获取客户的最新浏览时间
+type MobileOrEmailLastViewSlice struct {
+	Mobile   string    `description:"手机号/邮箱"`
+	ViewTime time.Time `description:"用户浏览时间"`
+}
+
+// GetLastReportViewRecordByMobileList 根据手机号获取客户的最新浏览时间
+func GetLastReportViewRecordByMobileList(mobileList []string) (items []*MobileOrEmailLastViewSlice, err error) {
+	num := len(mobileList)
+	if num <= 0 {
+		return
 	}
-	sql := `SELECT
-	a.company_id ,max(b.create_time) view_time
-FROM
-	wx_user a
-	JOIN ` + dataName + `.report_view_record b ON a.mobile = b.mobile 
-WHERE
-	a.company_id IN ( ` + companyIds + ` )  and b.mobile !="" and b.create_time>=? GROUP BY company_id`
-	_, err = o.Raw(sql, today).QueryRows(&items)
+	today := time.Now().Format(utils.FormatDate)
+	o := orm.NewOrmUsingDB("rddp")
+
+	sql := `SELECT mobile ,max(create_time) view_time FROM report_view_record 
+WHERE mobile IN ( ` + utils.GetOrmInReplace(num) + ` )  and mobile !="" and create_time>=? GROUP BY mobile`
+	_, err = o.Raw(sql, mobileList, today).QueryRows(&items)
 	return
 }
 
-// GetLastReportViewRecordByCompanyIdsEmail 根据邮箱获取客户的最新浏览时间
-func GetLastReportViewRecordByCompanyIdsEmail(companyIds string) (items []*CompanyLastViewSlice, err error) {
-	today := time.Now().Format(utils.FormatDate)
-	o := orm.NewOrm()
-	dataName := ""
-	if utils.RunMode == "debug" {
-		dataName = "test_v2_hongze_rddp"
-	} else {
-		dataName = "hongze_rddp"
+// GetLastReportViewRecordByEmailList 根据邮箱获取客户的最新浏览时间
+func GetLastReportViewRecordByEmailList(emailList []string) (items []*MobileOrEmailLastViewSlice, err error) {
+	num := len(emailList)
+	if num <= 0 {
+		return
 	}
-	sql := `SELECT	a.company_id ,max(b.create_time) view_time FROM wx_user a
-	JOIN ` + dataName + `.report_view_record b ON a.email = b.email 
-WHERE a.company_id IN ( ` + companyIds + ` ) and b.email !="" and b.mobile=""   and b.create_time>=? GROUP BY company_id`
-	_, err = o.Raw(sql, today).QueryRows(&items)
+	today := time.Now().Format(utils.FormatDate)
+	o := orm.NewOrmUsingDB("rddp")
+
+	sql := `SELECT email AS mobile ,max(create_time) view_time FROM report_view_record 
+WHERE email IN ( ` + utils.GetOrmInReplace(num) + ` )  and email !="" and create_time>=? GROUP BY email`
+	_, err = o.Raw(sql, emailList, today).QueryRows(&items)
 	return
 }
 
@@ -348,41 +346,43 @@ WHERE a.company_id IN ( ` + companyIds + ` ) and b.email !="" and b.mobile="" GR
 	return
 }
 
-// GetCountReportViewRecordByCompanyIdsMobile 根据手机号获取客户的浏览次数
-func GetCountReportViewRecordByCompanyIdsMobile(companyIds string) (items []*CompanyViewTotalSlice, err error) {
-	today := time.Now().Format(utils.FormatDate) + " 00:00:00"
-	o := orm.NewOrm()
-	dataName := ""
-	if utils.RunMode == "debug" {
-		dataName = "test_v2_hongze_rddp"
-	} else {
-		dataName = "hongze_rddp"
+// MobileOrEmailViewTotalSlice 获取客户的浏览次数
+type MobileOrEmailViewTotalSlice struct {
+	Mobile    string `description:"客户手机号/邮箱"`
+	ViewTotal int    `description:"用户浏览次数"`
+}
+
+// GetCountReportViewRecordByMobileList 根据手机号获取客户的浏览次数
+func GetCountReportViewRecordByMobileList(mobileList []string) (items []*MobileOrEmailViewTotalSlice, err error) {
+	num := len(mobileList)
+	if num <= 0 {
+		return
 	}
-	sql := `SELECT
-	a.company_id ,count(1) view_total
-FROM
-	wx_user a
-	JOIN ` + dataName + `.report_view_record b ON a.mobile = b.mobile 
-WHERE
-	a.company_id IN ( ` + companyIds + ` )  and b.mobile !="" and create_time>=? GROUP BY company_id`
-	_, err = o.Raw(sql, today).QueryRows(&items)
+
+	today := time.Now().Format(utils.FormatDate) + " 00:00:00"
+	o := orm.NewOrmUsingDB("rddp")
+
+	sql := `SELECT mobile ,count(1) AS view_total FROM report_view_record
+WHERE mobile IN ( ` + utils.GetOrmInReplace(num) + ` )  and mobile !="" and create_time>=? GROUP BY mobile`
+	_, err = o.Raw(sql, mobileList, today).QueryRows(&items)
+
 	return
 }
 
-// GetCountReportViewRecordByCompanyIdsEmail 根据邮箱获取客户的浏览次数
-func GetCountReportViewRecordByCompanyIdsEmail(companyIds string) (items []*CompanyViewTotalSlice, err error) {
-	today := time.Now().Format(utils.FormatDate) + " 00:00:00"
-	o := orm.NewOrm()
-	dataName := ""
-	if utils.RunMode == "debug" {
-		dataName = "test_v2_hongze_rddp"
-	} else {
-		dataName = "hongze_rddp"
+// GetCountReportViewRecordByEmailList 根据邮箱获取客户的浏览次数
+func GetCountReportViewRecordByEmailList(emailList []string) (items []*MobileOrEmailViewTotalSlice, err error) {
+	num := len(emailList)
+	if num <= 0 {
+		return
 	}
-	sql := `SELECT	a.company_id ,count(1) view_total FROM wx_user a
-	JOIN ` + dataName + `.report_view_record b ON a.email = b.email 
-WHERE a.company_id IN ( ` + companyIds + ` ) and b.email !="" and b.mobile="" and create_time>=? GROUP BY company_id`
-	_, err = o.Raw(sql, today).QueryRows(&items)
+
+	today := time.Now().Format(utils.FormatDate) + " 00:00:00"
+	o := orm.NewOrmUsingDB("rddp")
+
+	sql := `SELECT email AS mobile ,count(1) AS view_total FROM report_view_record
+WHERE email IN ( ` + utils.GetOrmInReplace(num) + ` )  and email !="" and create_time>=? GROUP BY email`
+	_, err = o.Raw(sql, emailList, today).QueryRows(&items)
+
 	return
 }
 
@@ -452,3 +452,31 @@ func GetPUVByResearchReportIds(reportIds string) (list []*ResearchReportViewPUV,
 	_, err = o.Raw(sql).QueryRows(&list)
 	return
 }
+
+//`ficc_view_total` int(9) unsigned DEFAULT '0' COMMENT 'ficc报告的阅读次数',
+//`ficc_last_view_time` datetime DEFAULT NULL COMMENT 'ficc报告最近一次阅读时间',
+//`rai_view_total` int(9) unsigned DEFAULT '0' COMMENT '权益报告的阅读次数',
+//`rai_last_view_time` datetime DEFAULT NULL COMMENT '权益报告的最近一次阅读时间',
+
+// CompanyViewRecord 获取客户ficc和权益的浏览次数/最近浏览时间
+type CompanyViewRecord struct {
+	CompanyId        int       `description:"客户id"`
+	FiccViewTotal    int       `description:"ficc报告的阅读次数"`
+	FiccLastViewTime time.Time `description:"ficc报告最近一次阅读时间"`
+	RaiViewTotal     int       `description:"权益报告的阅读次数"`
+	RaiLastViewTime  time.Time `description:"权益报告最近一次阅读时间"`
+}
+
+// GetUserViewHistoryByCompanyIdList 根据company_id列表获取客户的浏览次数
+func GetUserViewHistoryByCompanyIdList(companyIdList []int) (items []*CompanyViewRecord, err error) {
+	num := len(companyIdList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrm()
+	sql := `SELECT
+	a.company_id ,SUM(ficc_view_total) as ficc_view_total,max(ficc_last_view_time) as ficc_last_view_time,SUM(rai_view_total) as rai_view_total,max(rai_last_view_time) as rai_last_view_time
+	FROM wx_user AS a WHERE a.company_id IN ( ` + utils.GetOrmInReplace(num) + ` )  GROUP BY a.company_id`
+	_, err = o.Raw(sql, companyIdList).QueryRows(&items)
+	return
+}

+ 18 - 251
models/wechat_send_msg.go

@@ -2,7 +2,6 @@ package models
 
 import (
 	"github.com/beego/beego/v2/client/orm"
-	"hongze/hz_crm_api/utils"
 	"strings"
 )
 
@@ -42,146 +41,6 @@ func GetOpenIdListByMobile(mobile string) (items []*OpenIdList, err error) {
 	return
 }
 
-// 获取预约活动的用户的openID
-func GetActivityOpenIdList(activityId int) (items []*OpenIdList, err error) {
-	sql := `SELECT DISTINCT cr.open_id,u.user_id
-			FROM
-			cygx_my_schedule AS m
-			INNER JOIN user_record AS u ON u.bind_account = m.mobile 
-			INNER JOIN cygx_user_record AS cr ON cr.union_id = u.union_id 
-			WHERE m.activity_id = ? AND u.create_platform = 4 `
-	_, err = orm.NewOrm().Raw(sql, activityId).QueryRows(&items)
-	return
-}
-
-// 获取预约活动的用户的openID测试环境
-func GetActivityOpenIdListByDeBug(activityId int) (items []*OpenIdList, err error) {
-	sql := `SELECT
-			u.open_id,
-			u.user_id 
-		FROM
-			cygx_my_schedule AS s
-			INNER JOIN wx_user AS wx ON wx.user_id = s.user_id
-			INNER JOIN user_record AS u ON u.bind_account = wx.mobile
-			INNER JOIN company_product AS p ON p.company_id = wx.company_id 
-		WHERE
-			s.activity_id = ? 
-			AND u.create_platform = 1 
-			AND p.STATUS IN ( '正式', '试用', '永续' ) 
-		GROUP BY
-			u.open_id`
-	_, err = orm.NewOrm().Raw(sql, activityId).QueryRows(&items)
-	return
-}
-
-// 获取预约活动的用户的openID
-func GetActivitySpecialOpenIdList() (items []*OpenIdList, err error) {
-	sql := `SELECT DISTINCT cr.open_id,u.user_id
-			FROM
-			cygx_user_follow_special AS m
-			INNER JOIN user_record AS u ON u.bind_account = m.mobile 
-			INNER JOIN cygx_user_record AS cr ON cr.union_id = u.union_id 
-			WHERE  u.create_platform = 4 `
-	_, err = orm.NewOrm().Raw(sql).QueryRows(&items)
-	return
-}
-
-// 获取预约活动的用户的openID测试环境
-func GetActivitySpecialOpenIdListByDeBug() (items []*OpenIdList, err error) {
-	sql := `SELECT
-			u.open_id,
-			u.user_id 
-		FROM
-			cygx_user_follow_special AS s
-			INNER JOIN wx_user AS wx ON wx.user_id = s.user_id
-			INNER JOIN user_record AS u ON u.bind_account = wx.mobile
-			INNER JOIN company_product AS p ON p.company_id = wx.company_id 
-		WHERE
-			u.create_platform = 1 
-			AND p.STATUS IN ( '正式', '试用', '永续' ) 
-		GROUP BY
-			u.open_id`
-	_, err = orm.NewOrm().Raw(sql).QueryRows(&items)
-	return
-}
-
-// 获取关注作者的用户的openID
-func GetFollowDepartmentOpenIdList(departmentId int) (items []*OpenIdList, err error) {
-	sql := `SELECT cr.open_id,u.user_id
-			FROM
-				cygx_article_department_follow AS f
-				INNER JOIN user_record AS u ON u.bind_account = f.mobile
-				INNER JOIN wx_user AS wx ON wx.user_id = f.user_id
-				INNER JOIN company_product AS p ON p.company_id = wx.company_id 
-				INNER JOIN cygx_user_record AS cr ON cr.union_id = u.union_id 
-			WHERE
-				f.department_id = ?
-				AND u.create_platform = 4 
-				AND f.type = 1 
-				AND p.status IN ('正式','试用','永续')
-			GROUP BY
-				cr.open_id `
-	_, err = orm.NewOrm().Raw(sql, departmentId).QueryRows(&items)
-	return
-}
-
-// 获取关注作者的用户的openID测试环境
-func GetFollowDepartmentOpenIdListByDeBug(departmentId int) (items []*OpenIdList, err error) {
-	sql := `SELECT
-			u.open_id,
-			u.user_id 
-		FROM
-			cygx_article_department_follow AS f
-			INNER JOIN wx_user AS wx ON wx.user_id = f.user_id
-			INNER JOIN user_record AS u ON u.bind_account = wx.mobile
-			INNER JOIN company_product AS p ON p.company_id = wx.company_id
-		WHERE
-			f.department_id = ? 
-			AND u.create_platform = 1
-			AND f.type = 1 
-			AND p.STATUS IN ( '正式', '试用', '永续' ) 
-		GROUP BY
-			u.open_id`
-	_, err = orm.NewOrm().Raw(sql, departmentId).QueryRows(&items)
-	return
-}
-
-// 获取关注产业的用户的openID
-func GetFollowindustrialOpenIdList(industrialManagementId int) (items []*OpenIdList, err error) {
-	sql := `SELECT cr.open_id,u.user_id
-			FROM
-			cygx_industry_fllow AS f
-			INNER JOIN wx_user AS wx ON wx.user_id = f.user_id
-			INNER JOIN user_record AS u ON u.bind_account = wx.mobile 
-			INNER JOIN cygx_user_record AS cr ON cr.union_id = u.union_id 
-			WHERE
-			f.industrial_management_id = ? 
-			AND u.create_platform = 4 
-			AND f.type = 1 GROUP BY cr.open_id `
-	_, err = orm.NewOrm().Raw(sql, industrialManagementId).QueryRows(&items)
-	return
-}
-
-// 获取关注产业的用户的openID 测试环境
-func GetFollowindustrialOpenIdListByDeBug(industrialManagementId int) (items []*OpenIdList, err error) {
-	sql := `SELECT
-			u.open_id,
-			u.user_id 
-		FROM
-			cygx_industry_fllow AS f
-			INNER JOIN wx_user AS wx ON wx.user_id = f.user_id
-			INNER JOIN user_record AS u ON u.bind_account = wx.mobile
-		WHERE
-			f.industrial_management_id = ? 
-			AND u.create_platform = 1 
-			AND u.bind_account != ""
-			AND f.type = 1 
-		GROUP BY
-			u.open_id`
-	_, err = orm.NewOrm().Raw(sql, industrialManagementId).QueryRows(&items)
-	return
-}
-
 // GetUserOpenidListByUserIds 根据用户id字符串集合来获取他的openid列表集合
 func GetUserOpenidListByUserIds(userIdStr []string) (list []*OpenIdList, err error) {
 	if len(userIdStr) <= 0 {
@@ -201,44 +60,13 @@ func GetAdminOpenIdByMobile(mobile string) (items []*OpenIdList, err error) {
 	return
 }
 
-// 根据手机号获取用户的openid查研观向小助手专用
-func GetUserRecordListByMobile(platform int, bindAccount string) (items []*OpenIdList, err error) {
-	var sql string
-	if utils.RunMode == "release" {
-		sql = `SELECT cr.open_id FROM user_record  as u 
-			INNER JOIN cygx_user_record AS cr ON cr.union_id = u.union_id 
-			WHERE create_platform=? AND bind_account IN (` + bindAccount + `)`
-	} else {
-		platform = 1
-		sql = `SELECT open_id FROM	user_record  WHERE create_platform =? AND bind_account IN (` + bindAccount + `)`
-	}
-	_, err = orm.NewOrm().Raw(sql, platform).QueryRows(&items)
-	return
-}
-
-// 获取单个用户openid
-func GetCompanyDetailByIdGroup(platform int, bindAccount string) (item *OpenIdList, err error) {
-	o := orm.NewOrm()
-	var sql string
-	sql = `SELECT cr.open_id,wu.user_id FROM user_record  as u 
-			INNER JOIN cygx_user_record AS cr ON cr.union_id = u.union_id 
-			INNER JOIN wx_user AS wu ON wu.mobile = u.bind_account 
-			WHERE create_platform=? AND u.bind_account = ?`
-	err = o.Raw(sql, platform, bindAccount).QueryRow(&item)
-	return
-}
-
 // 获取小助手所有的用户的openid
 func GetCygxUserAllOpneid() (items []*OpenIdList, err error) {
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("hz_cygx")
 	sql := `SELECT
 			cr.open_id,
-			r.user_id 
-		FROM
-			user_record AS r
-			INNER JOIN cygx_user_record AS cr ON cr.union_id = r.union_id 
-		WHERE
-			r.create_platform = 4`
+			cr.cygx_user_id  as  user_id
+		FROM  cygx_user_record AS cr `
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
@@ -254,84 +82,42 @@ func GetOpenIdArr() (items []string, err error) {
 	return
 }
 
+type MobileUserIdList struct {
+	Mobile string
+	UserId int
+}
+
 // 获取预约活动的用户的openID测试环境
-func GetActivitySpecialOpenIdListMobile(condition string, pars []interface{}) (items []*OpenIdList, err error) {
+func GetActivitySpecialOpenIdListMobile(condition string, pars []interface{}) (items []*MobileUserIdList, err error) {
 	sql := `SELECT
-			cr.open_id,
+			u.mobile,
 			u.user_id
 		FROM
 			company_report_permission AS p
 			INNER JOIN wx_user AS u ON u.company_id = p.company_id
-			INNER JOIN user_record AS r ON r.user_id = u.user_id
-			INNER JOIN cygx_user_record AS cr ON cr.union_id = r.union_id 
+			INNER JOIN user_record AS r ON r.user_id = u.user_id 
 		WHERE
-			 r.create_platform = 4  AND p.STATUS IN ('正式','试用','永续')  ` + condition + ` GROUP BY cr.open_id`
+			 r.create_platform = 4  AND p.STATUS IN ('正式','试用','永续')  ` + condition + ` GROUP BY u.mobile`
 	_, err = orm.NewOrm().Raw(sql, pars).QueryRows(&items)
 	return
 }
 
 // 获取所有关注了该产业用户的openid
 func GetCygxUserIndustryFllowOpneid(IndustrialManagementId int) (items []*OpenIdList, err error) {
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("hz_cygx")
 	sql := `SELECT
 			cr.open_id,
-			r.user_id 
+			cr.cygx_user_id  as user_id
 		FROM
-			user_record AS r
-			INNER JOIN cygx_user_record AS cr ON cr.union_id = r.union_id 
-			INNER join cygx_industry_fllow  as cf on cf.user_id = r.user_id 
+			cygx_industry_fllow AS cf
+			INNER JOIN cygx_user_record AS cr ON cr.cygx_user_id = cf.user_id
 		WHERE
-			r.create_platform = 4
+			1=1
 			AND cf.industrial_management_id = ?`
 	_, err = o.Raw(sql, IndustrialManagementId).QueryRows(&items)
 	return
 }
 
-// 获取所有关注了该产业用户的openid
-func GetCygxUserIndustryFllowOpneidByActivityIds(activityId int) (items []*OpenIdList, err error) {
-	o := orm.NewOrm()
-	sql := `			
-SELECT
-	cr.open_id,
-	r.user_id 
-FROM
-	cygx_industrial_activity_group_management AS agm
-	INNER JOIN cygx_industry_fllow AS f ON f.industrial_management_id = agm.industrial_management_id
-	INNER JOIN user_record AS r
-	INNER JOIN cygx_user_record AS cr 
-WHERE
-	agm.activity_id = ? 
-	AND cr.union_id = r.union_id 
-	AND r.create_platform = 4 
-	AND r.user_id = f.user_id;`
-	_, err = o.Raw(sql, activityId).QueryRows(&items)
-	return
-}
-
-// 获取所有关注了该产业永续客户的openid
-func GetCygxForeverUserIndustryFllowOpneidByActivityIds(activityId int) (items []*OpenIdList, err error) {
-	o := orm.NewOrm()
-	sql := `			
-SELECT
-	cr.open_id,
-	r.user_id 
-FROM
-	cygx_industrial_activity_group_management AS agm
-	INNER JOIN cygx_industry_fllow AS f ON f.industrial_management_id = agm.industrial_management_id
-	INNER JOIN user_record AS r
-	INNER JOIN cygx_user_record AS cr 
-	INNER JOIN wx_user AS wx ON wx.user_id = r.user_id 
-	INNER JOIN company_product AS p ON p.company_id = wx.company_id 
-WHERE
-	agm.activity_id = ? 
-	AND cr.union_id = r.union_id 
-	AND r.create_platform = 4 
-	AND r.user_id = f.user_id
-	AND p.status = "永续";`
-	_, err = o.Raw(sql, activityId).QueryRows(&items)
-	return
-}
-
 // 获取所有关注了该产业试用客户的openid
 func GetCygxTryOutUserIndustryFllowOpneidByActivityIds(activityId int) (items []*OpenIdList, err error) {
 	o := orm.NewOrm()
@@ -356,25 +142,6 @@ WHERE
 	return
 }
 
-// 获取所有关注了该产业用户的companyIds
-func GetCygxIndustryFollowCompanyIdsByActivityId(activityId int) (item *string, err error) {
-	o := orm.NewOrm()
-	sql := `			
-SELECT
-	GROUP_CONCAT( DISTINCT f.company_id SEPARATOR ',' ) AS company_ids
-FROM
-	cygx_industrial_activity_group_management AS agm
-	INNER JOIN cygx_industry_fllow AS f ON f.industrial_management_id = agm.industrial_management_id
-	INNER JOIN user_record AS r
-	INNER JOIN cygx_user_record AS cr 
-WHERE
-	agm.activity_id = ? 
-	AND r.create_platform = 4 
-	AND r.user_id = f.user_id;`
-	err = o.Raw(sql, activityId).QueryRow(&item)
-	return
-}
-
 // 获取所有关注了该产业用户的openidBy公司id
 func GetCygxUserIndustryFllowOpneidByActivityIdAndCompanyIds(activityId int, companyIds string) (items []*OpenIdList, err error) {
 	o := orm.NewOrm()
@@ -399,7 +166,7 @@ WHERE
 
 // 获取所有互动过的用户id
 func GetCygxInteractiveUserByActivityId(activityId int) (items []*int, err error) {
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("hz_cygx")
 	sql := `			
 SELECT user_id FROM cygx_activity_signup WHERE activity_id =? AND fail_type = 0
 UNION ALL

+ 30 - 1
models/wx_user.go

@@ -33,6 +33,10 @@ type WxUser struct {
 	Headimgurl          string    `description:"用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空"`
 	UserLabel           string    `description:"查研观向用户标签"`
 	MarkGroup           string    `description:"标记分组"`
+	FiccViewTotal       int       `description:"ficc报告的阅读次数"`
+	FiccLastViewTime    string    `description:"ficc报告最近一次阅读时间"`
+	RaiViewTotal        int       `description:"权益报告的阅读次数"`
+	RaiLastViewTime     string    `description:"权益报告的最近一次阅读时间"`
 }
 
 func AddWxUser(item *WxUser) (lastId int64, err error) {
@@ -530,7 +534,7 @@ type WxUserSller struct {
 	Mobile      string `description:"手机号"`
 	CompanyId   int    `description:"公司id"`
 	CompanyName string `description:"公司名称"`
-	SalesName   string `description:"所属销售"`
+	SellerName  string `description:"所属销售"`
 }
 
 // GetWxUserRaiSllerListByUserIds 根据用户id获取权益相关用户信息
@@ -541,6 +545,7 @@ func GetWxUserRaiSllerListByUserIds(userIds []int) (list []*WxUserSller, err err
 	}
 	o := orm.NewOrm()
 	sql := ` SELECT
+				w.user_id,
 				w.real_name,
 				w.mobile,
 				c.company_name,
@@ -556,3 +561,27 @@ func GetWxUserRaiSllerListByUserIds(userIds []int) (list []*WxUserSller, err err
 	_, err = o.Raw(sql, userIds).QueryRows(&list)
 	return
 }
+
+// GetWxUserByCompanyIds 根据客户ID集合获取用户列表
+func GetWxUserByCompanyIds(companyIds []int) (items []*WxUser, err error) {
+	num := len(companyIds)
+	if num == 0 {
+		return
+	}
+	sql := `SELECT * FROM wx_user  WHERE company_id in (` + utils.GetOrmInReplace(num) + `)  `
+	o := orm.NewOrm()
+	_, err = o.Raw(sql, companyIds).QueryRows(&items)
+	return
+}
+
+// GetWxUserList 用户列表查询
+func GetWxUserList(condition string, pars []interface{}) (items []*WxUser, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT *
+			FROM wx_user WHERE 1 = 1 `
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}

+ 90 - 0
routers/commentsRouter.go

@@ -1339,6 +1339,42 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ContractAllocationController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ContractAllocationController"],
+        beego.ControllerComments{
+            Method: "CompanyContractList",
+            Router: `/allocation/company_contract_list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ContractAllocationController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ContractAllocationController"],
+        beego.ControllerComments{
+            Method: "CompanyContracDetail",
+            Router: `/allocation/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ContractAllocationController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ContractAllocationController"],
+        beego.ControllerComments{
+            Method: "CompanyContractStatistics",
+            Router: `/allocation/statistics`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ContractAllocationController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ContractAllocationController"],
+        beego.ControllerComments{
+            Method: "CompanyContracUpdate",
+            Router: `/allocation/update`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:IndustrialAnalystController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:IndustrialAnalystController"],
         beego.ControllerComments{
             Method: "IndustrialAnalystAdd",
@@ -2869,6 +2905,51 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:YanxuanSpecialController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:YanxuanSpecialController"],
+        beego.ControllerComments{
+            Method: "Add",
+            Router: `/yanxuan_special/author/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:YanxuanSpecialController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:YanxuanSpecialController"],
+        beego.ControllerComments{
+            Method: "AuthorEnable",
+            Router: `/yanxuan_special/author/enable`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:YanxuanSpecialController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:YanxuanSpecialController"],
+        beego.ControllerComments{
+            Method: "AuthorList",
+            Router: `/yanxuan_special/author/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:YanxuanSpecialController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:YanxuanSpecialController"],
+        beego.ControllerComments{
+            Method: "Enable",
+            Router: `/yanxuan_special/enable`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:YanxuanSpecialController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:YanxuanSpecialController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/yanxuan_special/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/data_manage/correlation:CorrelationChartClassifyController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/data_manage/correlation:CorrelationChartClassifyController"],
         beego.ControllerComments{
             Method: "AddChartClassify",
@@ -8350,6 +8431,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanyApplyController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanyApplyController"],
+        beego.ControllerComments{
+            Method: "ApplyContractHistoryDetail",
+            Router: `/apply/contract/history/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanyApplyController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanyApplyController"],
         beego.ControllerComments{
             Method: "ApplyContractHistoryList",

+ 2 - 0
routers/router.go

@@ -151,6 +151,8 @@ func init() {
 				&cygx.ProductInteriorController{},
 				&cygx.BannerCoAntroller{},
 				&cygx.TagManagementController{},
+				&cygx.YanxuanSpecialController{},
+				&cygx.ContractAllocationController{},
 				&cygx.QuestionnaireController{},
 			),
 		),

+ 109 - 62
services/company.go

@@ -1807,7 +1807,7 @@ func GetLastContractPermissionList(companyId, productId int) (permissionMap map[
 }
 
 // GetFiccLastUserViewHistoryByCompanyIds 根据客户id集合map获取ficc最后一次阅读时间
-func GetFiccLastUserViewHistoryByCompanyIds(companyIdStr string) (companyViewTime map[int]time.Time, err error) {
+func GetFiccLastUserViewHistoryByCompanyIds(companyIdStr string, mobileList, emailList []string, mobileCompanyIdMap, emailCompanyIdMap map[string]int) (companyViewTime map[int]time.Time, err error) {
 	//user_view_record mobile
 	companyViewTime = make(map[int]time.Time)
 	userViewList, err := models.GetLastUserViewHistoryByCompanyIdsMobile(companyIdStr)
@@ -1840,18 +1840,18 @@ func GetFiccLastUserViewHistoryByCompanyIds(companyIdStr string) (companyViewTim
 	checkLastTime(companyViewTime, userViewList)
 
 	//ReportViewRecord mobile
-	userViewList, err = models.GetLastReportViewRecordByCompanyIdsMobile(companyIdStr)
+	mobileOrEmailViewList, err := models.GetLastReportViewRecordByMobileList(mobileList)
 	if err != nil {
 		return
 	}
-	checkLastTime(companyViewTime, userViewList)
+	checkMobileOrEmailLastTime(companyViewTime, mobileOrEmailViewList, mobileCompanyIdMap)
 
 	//ReportViewRecord email
-	userViewList, err = models.GetLastReportViewRecordByCompanyIdsEmail(companyIdStr)
+	mobileOrEmailViewList, err = models.GetLastReportViewRecordByEmailList(emailList)
 	if err != nil {
 		return
 	}
-	checkLastTime(companyViewTime, userViewList)
+	checkMobileOrEmailLastTime(companyViewTime, mobileOrEmailViewList, emailCompanyIdMap)
 
 	//UserViewStatistics mobile
 	userViewList, err = models.GetLastUserViewStatisticsByCompanyIdsMobile(companyIdStr)
@@ -1905,8 +1905,30 @@ func checkLastTime(companyViewTime map[int]time.Time, userViewList []*models.Com
 	return
 }
 
+// checkMobileOrEmailLastTime 根据用户信息检测最后的时间并重新赋值
+func checkMobileOrEmailLastTime(companyViewTime map[int]time.Time, userViewList []*models.MobileOrEmailLastViewSlice, companyMap map[string]int) {
+	for _, userView := range userViewList {
+		// 先找到客户id
+		companyId, ok := companyMap[userView.Mobile]
+		if !ok {
+			continue
+		}
+
+		// 相同客户id的数据进行比较
+
+		if viewTime, ok := companyViewTime[companyId]; ok {
+			if userView.ViewTime.After(viewTime) { //如果当前时间晚于 map中的时间,那么重新赋值
+				companyViewTime[companyId] = userView.ViewTime
+			}
+		} else { //如果没有数据,那么直接赋值
+			companyViewTime[companyId] = userView.ViewTime
+		}
+	}
+	return
+}
+
 // GetFiccCountUserViewHistoryByCompanyIds 根据客户id集合map获取ficc的阅读次数
-func GetFiccCountUserViewHistoryByCompanyIds(companyIdStr string) (companyViewTotal map[int]int, err error) {
+func GetFiccCountUserViewHistoryByCompanyIds(companyIdStr string, mobileList, emailList []string, mobileCompanyIdMap, emailCompanyIdMap map[string]int) (companyViewTotal map[int]int, err error) {
 	//user_view_record mobile
 	companyViewTotal = make(map[int]int)
 	userViewList, err := models.GetCountUserViewHistoryByCompanyIdsMobile(companyIdStr)
@@ -1937,18 +1959,18 @@ func GetFiccCountUserViewHistoryByCompanyIds(companyIdStr string) (companyViewTo
 	checkCount(companyViewTotal, userViewList)
 
 	//ReportViewRecord mobile
-	userViewList, err = models.GetCountReportViewRecordByCompanyIdsMobile(companyIdStr)
+	mobileOrEmailViewList, err := models.GetCountReportViewRecordByMobileList(mobileList)
 	if err != nil {
 		return
 	}
-	checkCount(companyViewTotal, userViewList)
+	checkMobileOrEmailCount(companyViewTotal, mobileOrEmailViewList, mobileCompanyIdMap)
 
 	//ReportViewRecord email
-	userViewList, err = models.GetCountReportViewRecordByCompanyIdsEmail(companyIdStr)
+	mobileOrEmailViewList, err = models.GetCountReportViewRecordByEmailList(emailList)
 	if err != nil {
 		return
 	}
-	checkCount(companyViewTotal, userViewList)
+	checkMobileOrEmailCount(companyViewTotal, mobileOrEmailViewList, emailCompanyIdMap)
 
 	//UserViewStatistics mobile
 	userViewList, err = models.GetUserViewStatisticsByCompanyIdsMobile(companyIdStr)
@@ -1988,34 +2010,34 @@ func GetRaiCountUserViewHistoryByCompanyIds(companyIdStr string) (companyViewTot
 }
 
 // GetAllCountUserViewHistoryByCompanyIds 根据客户id集合map获取所有的阅读次数
-func GetAllCountUserViewHistoryByCompanyIds(companyIdStr string) (companyViewTotal map[int]int, err error) {
-	companyViewTotal = make(map[int]int)
-	companyFiccViewTotal, err := GetFiccCountUserViewHistoryByCompanyIds(companyIdStr)
-	if err != nil {
-		return
-	}
-
-	companyRaiViewTotal, err := GetRaiCountUserViewHistoryByCompanyIds(companyIdStr)
-	if err != nil {
-		return
-	}
-
-	companyIdList := strings.Split(companyIdStr, ",")
-
-	for _, companyIdStr := range companyIdList {
-		companyId, _ := strconv.Atoi(companyIdStr)
-		ficcTotal, ok := companyFiccViewTotal[companyId]
-		if !ok {
-			ficcTotal = 0
-		}
-		raiTotal, ok := companyRaiViewTotal[companyId]
-		if !ok {
-			raiTotal = 0
-		}
-		companyViewTotal[companyId] = ficcTotal + raiTotal
-	}
-	return
-}
+//func GetAllCountUserViewHistoryByCompanyIds(companyIdStr string) (companyViewTotal map[int]int, err error) {
+//	companyViewTotal = make(map[int]int)
+//	companyFiccViewTotal, err := GetFiccCountUserViewHistoryByCompanyIds(companyIdStr)
+//	if err != nil {
+//		return
+//	}
+//
+//	companyRaiViewTotal, err := GetRaiCountUserViewHistoryByCompanyIds(companyIdStr)
+//	if err != nil {
+//		return
+//	}
+//
+//	companyIdList := strings.Split(companyIdStr, ",")
+//
+//	for _, companyIdStr := range companyIdList {
+//		companyId, _ := strconv.Atoi(companyIdStr)
+//		ficcTotal, ok := companyFiccViewTotal[companyId]
+//		if !ok {
+//			ficcTotal = 0
+//		}
+//		raiTotal, ok := companyRaiViewTotal[companyId]
+//		if !ok {
+//			raiTotal = 0
+//		}
+//		companyViewTotal[companyId] = ficcTotal + raiTotal
+//	}
+//	return
+//}
 
 func checkCount(companyViewTotal map[int]int, userViewList []*models.CompanyViewTotalSlice) {
 	for _, userView := range userViewList {
@@ -2028,6 +2050,25 @@ func checkCount(companyViewTotal map[int]int, userViewList []*models.CompanyView
 	return
 }
 
+// checkMobileOrEmailCount 根据手机号或者邮箱进行数据比较
+func checkMobileOrEmailCount(companyViewTotal map[int]int, mobileOrEmailViewList []*models.MobileOrEmailViewTotalSlice, companyMap map[string]int) {
+	for _, userView := range mobileOrEmailViewList {
+		// 先找到客户id
+		companyId, ok := companyMap[userView.Mobile]
+		if !ok {
+			continue
+		}
+
+		// 相同客户id的数据进行比较
+		if viewTotal, ok := companyViewTotal[companyId]; ok {
+			companyViewTotal[companyId] = viewTotal + userView.ViewTotal
+		} else { //如果没有数据,那么直接赋值
+			companyViewTotal[companyId] = userView.ViewTotal
+		}
+	}
+	return
+}
+
 // ModifyCompanyProductLastViewData 修改客户产品的总共阅读次数以及最近阅读时间
 func ModifyCompanyProductLastViewData(companyIdList []int) (err error) {
 	defer func() {
@@ -2036,39 +2077,50 @@ func ModifyCompanyProductLastViewData(companyIdList []int) (err error) {
 			//go utils.SendEmail("修改客户产品的总共阅读次数以及最近阅读时间失败", fmt.Sprint("companyIdList:", companyIdList, ";err:", err), utils.EmailSendToUsers)
 		}
 	}()
-	companyIdStr := ``
-	for _, companyId := range companyIdList {
-		companyIdStr += fmt.Sprint(companyId, ",")
-	}
-	companyIdStr = companyIdStr[:len(companyIdStr)-1]
 
-	companyFiccViewTotalMap, err := GetFiccCountUserViewHistoryByCompanyIds(companyIdStr)
+	wxUserList, err := models.GetWxUserByCompanyIds(companyIdList)
 	if err != nil {
 		return
 	}
+	mobileList := make([]string, 0)
+	mobileCompanyIdMap := make(map[string]int, 0)
+	emailList := make([]string, 0)
+	emailCompanyIdMap := make(map[string]int, 0)
 
-	companyFiccLastViewMap, err := GetFiccLastUserViewHistoryByCompanyIds(companyIdStr)
-	if err != nil {
-		return
+	for _, v := range wxUserList {
+		if v.Mobile != `` {
+			mobileList = append(mobileList, v.Mobile)
+			mobileCompanyIdMap[v.Mobile] = v.CompanyId
+		}
+		if v.Email != `` {
+			emailList = append(emailList, v.Email)
+			emailCompanyIdMap[v.Email] = v.CompanyId
+		}
 	}
 
-	companyRaiViewTotalMap, err := GetRaiCountUserViewHistoryByCompanyIds(companyIdStr)
+	// 根据companyId列表获取客户公司的阅读情况
+	companyViewRecordList, err := models.GetUserViewHistoryByCompanyIdList(companyIdList)
 	if err != nil {
 		return
 	}
-
-	companyRaiLastViewMap, err := GetRaiLastUserViewHistoryByCompanyIds(companyIdStr)
-	if err != nil {
-		return
+	companyViewRecordMap := make(map[int]*models.CompanyViewRecord)
+	for _, v := range companyViewRecordList {
+		companyViewRecordMap[v.CompanyId] = v
 	}
 
 	for _, companyId := range companyIdList {
+		companyViewRecord, ok := companyViewRecordMap[companyId]
 		//ficc
-		var companyFiccViewTotal int
-		var companyFiccLastView time.Time
-		var companyFiccLastViewStr string
-		companyFiccViewTotal, _ = companyFiccViewTotalMap[companyId]
-		companyFiccLastView, _ = companyFiccLastViewMap[companyId]
+		var companyFiccViewTotal, companyRaiViewTotal int
+		var companyFiccLastView, companyRaiLastView time.Time
+		var companyFiccLastViewStr, companyRaiLastViewStr string
+
+		if ok && companyViewRecord != nil {
+			companyFiccViewTotal = companyViewRecord.FiccViewTotal
+			companyFiccLastView = companyViewRecord.FiccLastViewTime
+			companyRaiViewTotal = companyViewRecord.RaiViewTotal
+			companyRaiLastView = companyViewRecord.RaiLastViewTime
+		}
 
 		if companyFiccLastView.IsZero() {
 			companyFiccLastViewStr = "0000-00-00 00:00:00"
@@ -2078,11 +2130,6 @@ func ModifyCompanyProductLastViewData(companyIdList []int) (err error) {
 		company.ModifyCompanyProductLastViewData(companyId, 1, companyFiccViewTotal, companyFiccLastViewStr)
 
 		//权益
-		var companyRaiViewTotal int
-		var companyRaiLastView time.Time
-		var companyRaiLastViewStr string
-		companyRaiViewTotal, _ = companyRaiViewTotalMap[companyId]
-		companyRaiLastView, _ = companyRaiLastViewMap[companyId]
 		if companyRaiLastView.IsZero() {
 			companyRaiLastViewStr = "0000-00-00 00:00:00"
 		} else {

+ 3 - 2
services/company_apply/company_approval.go

@@ -391,7 +391,7 @@ func Approved(approvalRecord *contract.ContractApprovalRecord, opUser *system.Ad
 				// 处理权益客户的身份信息()
 				cygxService.UpdateCygxCompanyUserType(recordInfo.CompanyContractId)
 
-				if recordInfo.ApplyMethod == 1{
+				if recordInfo.ApplyMethod == 1 {
 					//获取合同信息
 					contractInfo, tmpErr := company.GetCompanyContractDetail(recordInfo.CompanyId, recordInfo.ProductId, recordInfo.CompanyContractId)
 					if tmpErr != nil {
@@ -420,7 +420,8 @@ func Approved(approvalRecord *contract.ContractApprovalRecord, opUser *system.Ad
 				//客户研选行业转正时(王芳审批通过),模板消息提醒汪洋
 				services.AddCompanyApprovalMessageWangYang(recordInfo.CompanyId, recordInfo.CompanyContractId, recordInfo.ApplyRealName, companyInfo.CompanyName)
 
-				go cygxService.YanXuanCompanyApproval(recordInfo.CompanyId) //研选审批通过的时候研选扣点更新
+				cygxService.YanXuanCompanyApproval(recordInfo.CompanyId)                           //研选审批通过的时候研选扣点更新
+				cygxService.HandleAllocationCompanyContractByYanXuan(recordInfo.CompanyContractId) //如果合同只有研选的时候,自动处理派点
 
 			}
 		}()

+ 7 - 9
services/company_approval_message.go

@@ -3,13 +3,11 @@ package services
 import (
 	"errors"
 	"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"
-	"strings"
 	"time"
 )
 
@@ -203,12 +201,12 @@ func AddCompanyApprovalMessageRai(companyId, companyContractId int, applyRealNam
 	if err != nil {
 		return
 	}
-	var mobiles string
+	var mobiles []string
 	for _, v := range adminList {
-		mobiles += "'" + v.Mobile + "'" + ","
+		mobiles = append(mobiles, v.Mobile)
 	}
-	mobiles = strings.TrimRight(mobiles, ",")
-	openIdList, err := models.GetUserRecordListByMobile(4, mobiles)
+
+	openIdList, err := cygx.GetUserRecordListByMobileArr(mobiles)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		return err
 	}
@@ -238,14 +236,14 @@ func AddCompanyApprovalMessageWangYang(companyId, companyContractId int, applyRe
 	var keyword1, keyword2, keyword3, keyword4 string
 	keyword1 = companyName + "(" + applyRealName + ")"
 	keyword2 = "买方研选转正"
-	var mobiles string
+	var mobiles []string
 	cnf, e := cygx.GetCygxConfigDetailByCode(utils.TPL_MSG_WANG_YANG)
 	if e != nil {
 		err = errors.New("GetConfigByCode, Err: " + e.Error())
 		return
 	}
-	mobiles = cnf.ConfigValue
-	openIdList, err := models.GetUserRecordListByMobile(4, mobiles)
+	mobiles = append(mobiles, cnf.ConfigValue)
+	openIdList, err := cygx.GetUserRecordListByMobileArr(mobiles)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		return err
 	}

+ 28 - 7
services/company_permission.go

@@ -79,7 +79,9 @@ func RaiCompanyPermissionAndCheckList(companyId int, unify bool) (resp *company.
 			v.RaiBothHas = true
 			v.Remark = v.PermissionName
 			v.PermissionName += "(升级)"
-			v.PermissionType = 0
+			if !unify {
+				v.PermissionType = 0
+			}
 			v.PermissionTypeName = ""
 			v.IsMerge = true
 		}
@@ -149,12 +151,16 @@ func RaiCompanyPermissionAndCheckList(companyId int, unify bool) (resp *company.
 	}
 	//有升级权限时只展示一个
 	newpPermissionItems := make([]*company.PermissionLookItem, 0)
-	upgradeMap := make(map[string]int)
-	for _, v := range permissionItems {
-		if _, ok := upgradeMap[v.PermissionName]; !ok {
-			newpPermissionItems = append(newpPermissionItems, v)
-			if strings.Contains(v.PermissionName, "升级") {
-				upgradeMap[v.PermissionName] = v.ChartPermissionId
+	if unify {
+		newpPermissionItems = permissionItems
+	} else {
+		upgradeMap := make(map[string]int)
+		for _, v := range permissionItems {
+			if _, ok := upgradeMap[v.PermissionName]; !ok {
+				newpPermissionItems = append(newpPermissionItems, v)
+				if strings.Contains(v.PermissionName, "升级") {
+					upgradeMap[v.PermissionName] = v.ChartPermissionId
+				}
 			}
 		}
 	}
@@ -333,3 +339,18 @@ func GetRaiSubObjPermissionIdMap() (permissionMap map[int]int, err error) {
 	}
 	return
 }
+
+// GetPermissionNameMap 权限名称与权限ID的map
+func GetPermissionNameMap() (mapItem map[int]string, err error) {
+	list, e := models.GetChartPermissionListRai()
+	if e != nil {
+		err = e
+		return
+	}
+	mapPermissionName := make(map[int]string)
+	for _, v := range list {
+		mapPermissionName[v.ChartPermissionId] = v.PermissionName
+	}
+	mapItem = mapPermissionName
+	return
+}

+ 36 - 0
services/company_product.go

@@ -0,0 +1,36 @@
+package services
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hz_crm_api/models/company"
+	"hongze/hz_crm_api/services/alarm_msg"
+)
+
+// 根据公司ID获取权益销售名称
+func GetSellNameMapByCompanyIds(companyIds []int) (respMap map[int]string) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg("根据公司ID获取权益销售名称,失败:"+err.Error()+fmt.Sprint(companyIds), 2)
+		}
+	}()
+	lenarr := len(companyIds)
+	if lenarr == 0 {
+		return
+	}
+	var pars []interface{}
+	var condition string
+	respMap = make(map[int]string, 0)
+	condition = "  AND product_id = 2 "
+	list, e := company.GetCompanyProductList(condition, pars)
+	if e != nil {
+		err = errors.New("GetCompanyProductList, Err: " + e.Error())
+		return
+	}
+	for _, v := range list {
+		respMap[v.CompanyId] = v.SellerName
+	}
+	return
+}

+ 25 - 85
services/cygx/acitvity.go

@@ -827,7 +827,7 @@ func IsShowAppointmentByadminSet(IsCanAppointmentMinutes int) (isShowAppointment
 }
 
 //func init() {
-//	DoActivityOnenIdWxTemplateMsg(2100)
+//	DoActivityOnenIdWxTemplateMsg(2621)
 //}
 
 // 处理活动是否进行模板消息推送
@@ -1158,88 +1158,13 @@ func DoActivityOnenIdWxTemplateMsg(activityId int) (err error) {
 				havePowerCompanyid += strconv.Itoa(v) + ","
 			}
 		}
-		//for _, v := range openidPowerList {
-		//	//如果仅本组人可见,那么就对companyID做一下限制
-		//	if activityInfo.VisibleRange == 1 {
-		//		if mapCompanyProduct[v.CompanyId] > 0 {
-		//			if _, ok := mapComapnyId[v.CompanyId]; !ok {
-		//				mapComapnyId[v.CompanyId] = v.CompanyId
-		//				companyIds = append(companyIds, v.CompanyId)
-		//			}
-		//		}
-		//	} else {
-		//		if _, ok := mapComapnyId[v.CompanyId]; !ok {
-		//			mapComapnyId[v.CompanyId] = v.CompanyId
-		//			companyIds = append(companyIds, v.CompanyId)
-		//		}
-		//	}
-		//}
-		//fmt.Println("companyIds", companyIds)
-		////获取客户的状态,正式、试用、冻结。
-		//listCompany, err := cygx.GetCompanyDetailByIdGroupList(companyIds)
-		//if err != nil && err.Error() != utils.ErrNoRow() {
-		//	return err
-		//}
-		//for _, v := range listCompany {
-		//	itemCompanyPermissionPower := new(cygx.CompanyPermissionPower)
-		//	itemCompanyPermissionPower.CompanyId = v.CompanyId
-		//	itemCompanyPermissionPower.Status = v.Status
-		//	mapComapnyPower[v.CompanyId] = itemCompanyPermissionPower
-		//}
-		//
-		////获取公司权限非正式,用来区分大套餐客户
-		//listCompanyPermission, err := cygx.GetCompanyPermissionByCompanyIds(companyIds)
-		//if err != nil && err.Error() != utils.ErrNoRow() {
-		//	return err
-		//}
-		//for _, v := range listCompanyPermission {
-		//	mapComapnyPower[v.CompanyId].PermissionName = v.PermissionName
-		//}
-		//
-		////获取公司权限 正式,用来区分大套餐客户
-		//listCompanyPermissionZhenShi, err := cygx.GetCompanyPermissionZhenShiByCompanyIds(companyIds)
-		//if err != nil && err.Error() != utils.ErrNoRow() {
-		//	return err
-		//}
-		//for _, v := range listCompanyPermissionZhenShi {
-		//	mapComapnyPower[v.CompanyId].PermissionNameZhengShi = v.PermissionName
-		//}
-		//
-		////处理用户身份 userType
-		//for k, v := range mapComapnyPower {
-		//	v.HavePower = true
-		//	mapComapnyPower[k] = GetUserTypeByPermission(v)
-		//}
-		//for k, v := range mapComapnyPower {
-		//	noPower, _ := GetShareNoPowe(activityInfo, v.PermissionName, v.UserType)
-		//	if noPower {
-		//		mapComapnyPower[k].HavePower = false
-		//	}
-		//}
-		////如果活动选了企业管理规模可见字段,则作以下处理
-		//if activityInfo.Scale != "" {
-		//	listCompanyByScale, err := cygx.GetCygxUserRecordPowerByScale(chartPermissionIds, activityInfo.Scale)
-		//	if err != nil && err.Error() != utils.ErrNoRow() {
-		//		return err
-		//	}
-		//	for _, v := range listCompanyByScale {
-		//		if mapComapnyPower[v.CompanyId] != nil {
-		//			mapComapnyPower[v.CompanyId].HavePower = true
-		//		}
-		//	}
-		//}
-		//for _, v := range mapComapnyPower {
-		//	if v.HavePower == true {
-		//		havePowerCompanyid += strconv.Itoa(v.CompanyId) + ","
-		//	}
-		//}
 		havePowerCompanyid = strings.TrimRight(havePowerCompanyid, ",")
 		if havePowerCompanyid == "" {
 			return err
 		}
 	}
 	//获取拒绝接收推送的的用户的 openid
-	//return
+
 	mapOpenidRefuset := make(map[int]string)
 	openidRefusetList, err := cygx.GetCygxUserRefusetOpenid()
 	if err != nil && err.Error() != utils.ErrNoRow() {
@@ -1340,19 +1265,34 @@ func DoActivityOnenIdWxTemplateMsg(activityId int) (err error) {
 	if len(OpenIdList) == 0 {
 		return err
 	}
-	//
-	//for _, v := range OpenIdList {
-	//	fmt.Println(v)
-	//}
-	//return err
+
+	openIdArr := make([]string, len(OpenIdList))
+	for i, v := range OpenIdList {
+		openIdArr[i] = v.OpenId
+	}
+
 	activityInfo.ActivityTypeName = strings.Replace(activityInfo.ActivityTypeName, "(C类)", "", -1)
 	first := "您关注的赛道,有【" + activityInfo.ActivityTypeName + "】活动发布,欢迎参与"
 	keyword1 := "新活动:" + activityInfo.ActivityName
 	keyword2 := activityInfo.ActivityTimeText + ",【" + activityInfo.Label + "】"
-	keyword3 := ""
-	keyword4 := ""
 
-	services.SendActivityOnenIdWxTemplateMsg(first, keyword1, keyword2, keyword3, keyword4, OpenIdList, activityInfo.ActivityId)
+	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
+	}
 	return
 }
 

+ 23 - 3
services/cygx/activity_power_check.go

@@ -220,7 +220,8 @@ func GetActivityDetailUserPower(user *models.WxUser, adminInfo *system.Admin, ac
 	var userTypeStr string
 
 	//如果是弘则的用户或者宏观的权限不做校验
-	if user.CompanyId == utils.HZ_COMPANY_ID || activityInfo.ChartPermissionName == "宏观" {
+	//if user.CompanyId == utils.HZ_COMPANY_ID || activityInfo.ChartPermissionName == "宏观" {
+	if user.CompanyId == utils.HZ_COMPANY_ID {
 		havePower = true
 		return
 	}
@@ -236,6 +237,17 @@ func GetActivityDetailUserPower(user *models.WxUser, adminInfo *system.Admin, ac
 		return
 	}
 
+	//如果一个权限都没有就返回无权限
+	if permissionStr == "" {
+		return
+	}
+	permissionStr += "," + utils.HONG_GUAN_NAME // 添加一个宏观权限
+	if permissionStrZhengShi == "" {
+		permissionStrZhengShi = utils.HONG_GUAN_NAME // 添加一个宏观权限
+	} else {
+		permissionStrZhengShi += "," + utils.HONG_GUAN_NAME // 添加一个宏观权限
+	}
+
 	//如果是易董的活动,主、副权限有一个满足即可
 	if activityInfo.YidongActivityId != "" {
 		if strings.Contains(permissionStr, activityInfo.ChartPermissionName) || strings.Contains(permissionStr, activityInfo.ChartPermissionNameDeputy) {
@@ -351,9 +363,17 @@ func GetActivityDetailUserPower(user *models.WxUser, adminInfo *system.Admin, ac
 			companyDetailStatus = companyDetail.Status
 		}
 	}
+	//宏观满足用户可见身份验证权限既满足  2023-9-18
 	if activityInfo.ChartPermissionId == 1 {
-		havePower = true
-		return
+		if activityInfo.IsLimitPeople > 0 {
+			if strings.Contains(activityInfo.CustomerTypeIds, userTypeStr) {
+				havePower = true
+				return
+			}
+		} else {
+			havePower = true
+			return
+		}
 	}
 	if (activityInfo.ActivityTypeId == 1 || activityInfo.ActivityTypeId == 3) && strings.Contains(permissionStr, "专家") && activityInfo.IsLimitPeople == 0 {
 		havePower = true

+ 124 - 11
services/cygx/activity_signup.go

@@ -19,8 +19,8 @@ import (
 )
 
 // 获取所有关注了该产业大套餐客户的openid
-func GetCygxBigTypeUserIndustryFllowOpneidByActivityIds(activityId int) (items []*models.OpenIdList, err error) {
-	companyIds, e := models.GetCygxIndustryFollowCompanyIdsByActivityId(activityId)
+func GetCygxBigTypeUserIndustryFllowOpneidByActivityIds(activityId int) (items []*cygx.OpenIdList, err error) {
+	companyIds, e := cygx.GetCygxIndustryFollowCompanyIdsByActivityId(activityId)
 	if e != nil {
 		err = e
 		return
@@ -49,7 +49,35 @@ func GetCygxBigTypeUserIndustryFllowOpneidByActivityIds(activityId int) (items [
 
 	finalIds := strings.Join(companyIdslice, ",")
 	if finalIds != "" {
-		items, e = models.GetCygxUserIndustryFllowOpneidByActivityIdAndCompanyIds(activityId, finalIds)
+		var conditionuiUser string
+		var parsUser []interface{}
+
+		conditionuiUser = ` AND company_id IN (` + finalIds + `)`
+		listUser, e := models.GetWxUserList(conditionuiUser, parsUser)
+		if e != nil {
+			err = e
+			return
+		}
+
+		mapMobileUser := make(map[string]string)
+		for _, v := range listUser {
+			mapMobileUser[v.Mobile] = v.Mobile
+		}
+
+		var mobiles []string
+		listFllow, e := cygx.GetCygxForeverUserIndustryFllowOpneidByActivityIds(activityId)
+		if e != nil {
+			err = e
+			return
+		}
+		for _, v := range listFllow {
+			if mapMobileUser[v.Mobile] != "" {
+				mobiles = append(mobiles, v.Mobile)
+			}
+		}
+
+		items, e = cygx.GetUserRecordListByMobileArr(mobiles)
+		//items, e = models.GetCygxUserIndustryFllowOpneidByActivityIdAndCompanyIds(activityId, finalIds)
 		if e != nil {
 			err = e
 			return
@@ -59,8 +87,8 @@ func GetCygxBigTypeUserIndustryFllowOpneidByActivityIds(activityId int) (items [
 }
 
 // 获取所有关注了该产业行业套餐客户的openid
-func GetCygxIndustryPackageUserIndustryFllowOpneidByActivityIds(activityId int) (items []*models.OpenIdList, err error) {
-	companyIds, e := models.GetCygxIndustryFollowCompanyIdsByActivityId(activityId)
+func GetCygxIndustryPackageUserIndustryFllowOpneidByActivityIds(activityId int) (items []*cygx.OpenIdList, err error) {
+	companyIds, e := cygx.GetCygxIndustryFollowCompanyIdsByActivityId(activityId)
 	if e != nil {
 		err = e
 		return
@@ -97,7 +125,35 @@ func GetCygxIndustryPackageUserIndustryFllowOpneidByActivityIds(activityId int)
 
 	finalIds := strings.Join(companyIdslice, ",")
 	if finalIds != "" {
-		items, e = models.GetCygxUserIndustryFllowOpneidByActivityIdAndCompanyIds(activityId, finalIds)
+		var conditionuiUser string
+		var parsUser []interface{}
+
+		conditionuiUser = ` AND company_id IN (` + finalIds + `)`
+		listUser, e := models.GetWxUserList(conditionuiUser, parsUser)
+		if e != nil {
+			err = e
+			return
+		}
+
+		mapMobileUser := make(map[string]string)
+		for _, v := range listUser {
+			mapMobileUser[v.Mobile] = v.Mobile
+		}
+
+		var mobiles []string
+		listFllow, e := cygx.GetCygxForeverUserIndustryFllowOpneidByActivityIds(activityId)
+		if e != nil {
+			err = e
+			return
+		}
+		for _, v := range listFllow {
+			if mapMobileUser[v.Mobile] != "" {
+				mobiles = append(mobiles, v.Mobile)
+			}
+		}
+
+		items, e = cygx.GetUserRecordListByMobileArr(mobiles)
+		//items, e = models.GetCygxUserIndustryFllowOpneidByActivityIdAndCompanyIds(activityId, finalIds)
 		if e != nil {
 			err = e
 			return
@@ -107,8 +163,8 @@ func GetCygxIndustryPackageUserIndustryFllowOpneidByActivityIds(activityId int)
 }
 
 // 获取所有关注了该产业其他行业套餐客户的openid
-func GetCygxOtherIndustryPackageUserIndustryFllowOpneidByActivityIds(activityId int) (items []*models.OpenIdList, err error) {
-	companyIds, e := models.GetCygxIndustryFollowCompanyIdsByActivityId(activityId)
+func GetCygxOtherIndustryPackageUserIndustryFllowOpneidByActivityIds(activityId int) (items []*cygx.OpenIdList, err error) {
+	companyIds, e := cygx.GetCygxIndustryFollowCompanyIdsByActivityId(activityId)
 	if e != nil {
 		err = e
 		return
@@ -145,7 +201,36 @@ func GetCygxOtherIndustryPackageUserIndustryFllowOpneidByActivityIds(activityId
 
 	finalIds := strings.Join(companyIdslice, ",")
 	if finalIds != "" {
-		items, e = models.GetCygxUserIndustryFllowOpneidByActivityIdAndCompanyIds(activityId, finalIds)
+		//items, e = models.GetCygxUserIndustryFllowOpneidByActivityIdAndCompanyIds(activityId, finalIds)
+
+		var conditionuiUser string
+		var parsUser []interface{}
+
+		conditionuiUser = ` AND company_id IN (` + finalIds + `)`
+		listUser, e := models.GetWxUserList(conditionuiUser, parsUser)
+		if e != nil {
+			err = e
+			return
+		}
+
+		mapMobileUser := make(map[string]string)
+		for _, v := range listUser {
+			mapMobileUser[v.Mobile] = v.Mobile
+		}
+
+		var mobiles []string
+		listFllow, e := cygx.GetCygxForeverUserIndustryFllowOpneidByActivityIds(activityId)
+		if e != nil {
+			err = e
+			return
+		}
+		for _, v := range listFllow {
+			if mapMobileUser[v.Mobile] != "" {
+				mobiles = append(mobiles, v.Mobile)
+			}
+		}
+
+		items, e = cygx.GetUserRecordListByMobileArr(mobiles)
 		if e != nil {
 			err = e
 			return
@@ -155,7 +240,7 @@ func GetCygxOtherIndustryPackageUserIndustryFllowOpneidByActivityIds(activityId
 }
 
 // 获取所有关注了该产业其他行业套餐客户的openid
-func GetCygxInteractiveUserOpneidByActivityIds(activityId int) (items []*models.OpenIdList, err error) {
+func GetCygxInteractiveUserOpneidByActivityIds(activityId int) (items []*cygx.OpenIdList, err error) {
 	userIds, e := models.GetCygxInteractiveUserByActivityId(activityId)
 	if e != nil {
 		err = e
@@ -170,7 +255,35 @@ func GetCygxInteractiveUserOpneidByActivityIds(activityId int) (items []*models.
 	ids := strings.Join(idSlice, ",")
 
 	if ids != "" {
-		items, e = models.GetCygxUserOpneidByUserIds(ids)
+		var conditionuiUser string
+		var parsUser []interface{}
+
+		conditionuiUser = ` AND user_id IN (` + ids + `)`
+		listUser, e := models.GetWxUserList(conditionuiUser, parsUser)
+		if e != nil {
+			err = e
+			return
+		}
+
+		mapMobileUser := make(map[string]string)
+		for _, v := range listUser {
+			mapMobileUser[v.Mobile] = v.Mobile
+		}
+
+		var mobiles []string
+		listFllow, e := cygx.GetCygxForeverUserIndustryFllowOpneidByActivityIds(activityId)
+		if e != nil {
+			err = e
+			return
+		}
+		for _, v := range listFllow {
+			if mapMobileUser[v.Mobile] != "" {
+				mobiles = append(mobiles, v.Mobile)
+			}
+		}
+
+		items, e = cygx.GetUserRecordListByMobileArr(mobiles)
+		//items, e = models.GetCygxUserOpneidByUserIds(ids)
 		if e != nil {
 			err = e
 			return

+ 38 - 1
services/cygx/admin_power.go

@@ -35,6 +35,44 @@ func GetAdminLookUserMobile(adminInfo *system.Admin) (mapMobile map[string]strin
 
 // 获取这个销售所能查看的手机号权限
 func GetAdminLookUserCompanyIds(sysUser *system.Admin) (companyIds []int, err error) {
+	//如果不是管理员,权益管理员那么就对可见权限范围做处理
+	adminIds := make([]int, 0)
+	if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_RAI_ADMIN {
+		if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP {
+			//如果是权益的组长就获取下面的组员
+			adminList, e := system.GetAdminListByGroupId(sysUser.GroupId)
+			if e != nil {
+				err = errors.New("GetAdminListByGroupId , Err: " + e.Error())
+				return
+			}
+			for _, v := range adminList {
+				adminIds = append(adminIds, v.AdminId)
+			}
+		} else {
+			adminIds = append(adminIds, sysUser.AdminId)
+		}
+		//adminIds = append(adminIds, sysUser.AdminId)
+		var adminIdGroup string
+		for _, v := range adminIds {
+			adminIdGroup += strconv.Itoa(v) + ","
+		}
+		adminIdGroup = strings.TrimRight(adminIdGroup, ",")
+		companyProductList, e := company.GetCompanyProductsBySellerId(adminIdGroup)
+		if e != nil {
+			err = errors.New("GetCompanyProductsBySellerId , Err: " + e.Error())
+			return
+		}
+
+		for _, v := range companyProductList {
+			companyIds = append(companyIds, v.CompanyId)
+		}
+	}
+	companyIds = append(companyIds, 0) //添加潜在客户
+	return
+}
+
+// 获取这个销售所能查看的公司权限
+func GetAdminLookUserCompanyIdsBySelf(sysUser *system.Admin) (companyIds []int, err error) {
 	//如果不是管理员,权益管理员那么就对可见权限范围做处理
 	adminIds := make([]int, 0)
 	if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_RAI_ADMIN {
@@ -68,6 +106,5 @@ func GetAdminLookUserCompanyIds(sysUser *system.Admin) (companyIds []int, err er
 		}
 		companyIds = append(companyIds, 0) //添加潜在客户
 	}
-
 	return
 }

+ 256 - 0
services/cygx/contract_allocation.go

@@ -0,0 +1,256 @@
+package cygx
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/company"
+	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/services/alarm_msg"
+	"hongze/hz_crm_api/utils"
+	"strings"
+	"time"
+)
+
+// GetCompanyContractPermissionNameMapById 获取合并之后的合同所对应的权限种类名称
+func GetCompanyContractPermissionNameMapById(companyContractIds []int) (mapContractResp map[int]string, err error) {
+	//return
+	lenArr := len(companyContractIds)
+	if lenArr == 0 {
+		return
+	}
+	var condition string
+	var pars []interface{}
+
+	condition += " AND  company_contract_id IN (" + utils.GetOrmInReplace(lenArr) + ")"
+	pars = append(pars, companyContractIds)
+
+	companyContractList, e := company.GetCompanyContractList(condition, pars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCompanyContractList, Err: " + e.Error())
+		return
+	}
+
+	permissionList, e := models.GetChartPermissionList()
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetChartPermissionList, Err: " + e.Error())
+		return
+	}
+	mappermissionName := make(map[int]string)
+	for _, v := range permissionList {
+		mappermissionName[v.ChartPermissionId] = v.Remark
+	}
+
+	mapContractIdPerssion := make(map[int]string) //单个合同ID所对应的套餐或者权限名称
+	for _, v := range companyContractList {
+		if v.RaiPackageType == 1 {
+			mapContractIdPerssion[v.CompanyContractId] = "70w套餐"
+		}
+		if v.RaiPackageType == 2 {
+			mapContractIdPerssion[v.CompanyContractId] = "45w套餐"
+		}
+	}
+
+	companyContractPermissionList, e := company.GetCompanyContractPermissionList(condition, pars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCompanyContractPermissionList, Err: " + e.Error())
+		return
+	}
+
+	mapIsUpgrade := make(map[string]bool) //合同ID对应的行业是否有升级
+	for _, v := range companyContractPermissionList {
+		//如果开通的不是整个套餐,那么就做单独的子权限处理
+		if strings.Count(mapContractIdPerssion[(v.CompanyContractId)], "w套餐") == 0 {
+			if v.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+				if v.ExpensiveYx == 1 {
+					mapContractIdPerssion[(v.CompanyContractId)] += utils.CHART_PERMISSION_NAME_MF_YANXUAN + "(5w),"
+				} else {
+					mapContractIdPerssion[(v.CompanyContractId)] += utils.CHART_PERMISSION_NAME_MF_YANXUAN + "(3w),"
+				}
+			} else {
+				mapContractIdPerssion[(v.CompanyContractId)] += mappermissionName[v.ChartPermissionId] + ","
+				if v.IsUpgrade == 1 {
+					//合同ID,权限名称形成唯一的主键索引
+					perssionName := mappermissionName[v.ChartPermissionId]
+					perssionName = strings.Replace(perssionName, "(客观)", "", -1)
+					perssionName = strings.Replace(perssionName, "(主观)", "", -1)
+					mapIsUpgrade[fmt.Sprint(v.CompanyContractId, "perssionName", perssionName)] = true
+				}
+			}
+		} else {
+			if v.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+				if v.ExpensiveYx == 1 {
+					mapContractIdPerssion[(v.CompanyContractId)] += "," + utils.CHART_PERMISSION_NAME_MF_YANXUAN + "(5w)"
+				} else {
+					mapContractIdPerssion[(v.CompanyContractId)] += "," + utils.CHART_PERMISSION_NAME_MF_YANXUAN + "(3w)"
+				}
+			}
+		}
+	}
+	//合并客观权限
+	for k, v := range mapContractIdPerssion {
+		perssionName := v
+		if strings.Count(v, utils.YI_YAO_NAME) == 2 {
+			perssionName = strings.Replace(perssionName, "医药(主观)", "医药", -1)
+			perssionName = strings.Replace(perssionName, "医药(客观)", "", -1)
+		}
+		if strings.Count(v, utils.XIAO_FEI_NAME) == 2 {
+			perssionName = strings.Replace(perssionName, "消费(主观)", "消费", -1)
+			perssionName = strings.Replace(perssionName, "消费(客观)", "", -1)
+		}
+		if strings.Count(v, utils.KE_JI_NAME) == 2 {
+			perssionName = strings.Replace(perssionName, "科技(主观)", "科技", -1)
+			perssionName = strings.Replace(perssionName, "科技(客观)", "", -1)
+		}
+		if strings.Count(v, utils.ZHI_ZAO_NAME) == 2 {
+			perssionName = strings.Replace(perssionName, "智造(主观)", "智造", -1)
+			perssionName = strings.Replace(perssionName, "智造(客观)", "", -1)
+		}
+
+		perssionName = strings.TrimRight(perssionName, ",")
+		mapContractIdPerssion[k] = perssionName
+	}
+	mapContractResp = make(map[int]string, 0)
+
+	//过滤多余的","
+	for k, v := range mapContractIdPerssion {
+		sliceName := strings.Split(v, ",")
+		var nameArr []string
+		for _, vName := range sliceName {
+			if vName == "" {
+				continue
+			}
+			if mapIsUpgrade[fmt.Sprint(k, "perssionName", vName)] {
+				vName += "(升级)"
+			}
+			nameArr = append(nameArr, vName)
+		}
+		mapContractResp[k] = strings.Join(nameArr, ",")
+	}
+	return
+}
+
+// 判断合同审核通过时间是否超过九十天
+func GetMapIsGrayByCompanyContractIds(companyContractIds []int) (mapResp map[int]bool, err error) {
+	lenArr := len(companyContractIds)
+	if lenArr == 0 {
+		return
+	}
+	var condition string
+	var pars []interface{}
+	pars = make([]interface{}, 0)
+	condition = " AND  company_contract_id IN (" + utils.GetOrmInReplace(lenArr) + ")    GROUP BY company_contract_id ORDER BY create_time DESC  "
+	pars = append(pars, companyContractIds)
+	companyContractPermissionList, e := company.GetCompanyContractPermissionList(condition, pars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCompanyContractPermissionList, Err: " + e.Error())
+		return
+	}
+	//超过九十天就置灰
+	timeInit := time.Now().AddDate(0, 0, -180)
+	mapResp = make(map[int]bool, 0)
+	for _, v := range companyContractPermissionList {
+		if v.CreateTime.Before(timeInit) {
+			mapResp[v.CompanyContractId] = true
+		}
+	}
+	return
+}
+
+//func init3() {
+//	var condition string
+//	var pars []interface{}
+//	//默认只查询权益 2023-06-01 之后的合同
+//	condition += ` AND c.product_id = ?  AND a.start_date > ? `
+//	pars = append(pars, 2, "2023-06-01")
+//
+//	//列表页数据
+//	list, err := cygx.GetCompanyContractListJoinCompany(condition, pars, 0, 1000)
+//	if err != nil {
+//		fmt.Println(err)
+//		return
+//	}
+//
+//	for _, v := range list {
+//		fmt.Println(v.CompanyContractId)
+//		HandleAllocationCompanyContractByYanXuan(v.CompanyContractId)
+//	}
+//
+//	fmt.Println(len(list))
+//}
+
+// 如果合同只有研选的时候,自动处理派点
+func HandleAllocationCompanyContractByYanXuan(companyContractId int) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("如果合同只有研选的时候,自动处理派点失败,Err:", err.Error(), "companyContractId", companyContractId), 2)
+		}
+	}()
+	var condition string
+	var pars []interface{}
+	pars = make([]interface{}, 0)
+	condition = " AND  company_contract_id = ?  "
+	pars = append(pars, companyContractId)
+	companyContractPermissionList, e := company.GetCompanyContractPermissionList(condition, pars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		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(companyContractPermissionList) > 1 {
+		return
+	}
+	var expensiveYxmoney float64
+	for _, v := range companyContractPermissionList {
+		if v.ChartPermissionId != utils.CHART_PERMISSION_ID_YANXUAN {
+			err = errors.New("没有发现研选权限: ")
+			return
+		}
+		if v.ExpensiveYx == 1 {
+			expensiveYxmoney = 5
+		} else {
+			expensiveYxmoney = 3
+		}
+	}
+
+	var items []*cygx.CygxAllocationCompanyContract
+	var itemsPermission []*cygx.CygxAllocationCompanyContractPermission
+
+	itemPermission := new(cygx.CygxAllocationCompanyContractPermission)
+	itemPermission.CompanyContractId = companyContractId
+	//itemPermission.AdminId = sysUser.AdminId
+	//itemPermission.AdminName = sysUser.RealName
+	itemPermission.Proportion = 0
+	itemPermission.Money = expensiveYxmoney
+	itemPermission.MoneyAvg = 0
+	itemPermission.ChartPermissionName = utils.CHART_PERMISSION_NAME_MF_YANXUAN
+	itemPermission.CreateTime = time.Now()
+	itemPermission.ModifyTime = time.Now()
+	itemsPermission = append(itemsPermission, itemPermission)
+
+	item := new(cygx.CygxAllocationCompanyContract)
+	item.CompanyContractId = companyContractId
+	//item.AdminId = sysUser.AdminId
+	//item.AdminName = sysUser.RealName
+	item.Proportion = 0
+	item.Money = expensiveYxmoney
+	item.RealName = utils.CHART_PERMISSION_NAME_MF_YANXUAN
+	item.ChartPermissionName = utils.CHART_PERMISSION_NAME_MF_YANXUAN
+	item.CreateTime = time.Now()
+	item.ModifyTime = time.Now()
+	items = append(items, item)
+
+	e = cygx.AddAndUpdateCygxAllocationCompanyContract(items, itemsPermission, companyContractId)
+	if e != nil {
+		err = errors.New("AddAndUpdateCygxAllocationCompanyContract, Err: " + e.Error())
+		return
+	}
+
+	return
+
+}

+ 273 - 0
services/cygx/cygx_yanxuan_special.go

@@ -0,0 +1,273 @@
+package cygx
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/services"
+	"hongze/hz_crm_api/services/alarm_msg"
+	"hongze/hz_crm_api/utils"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// 研选专栏有新内容审核通过时,给关注此专栏的客户发送模板消息
+func SendWxMsgSpecialFollow(specialId int) (err error) {
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("研选专栏有新内容审核通过时,给关注此专栏的客户发送模板消息失败,specialId:", specialId, err.Error()), 2)
+
+		}
+	}()
+	var first string
+	var keyword1 string
+	var keyword2 string
+	var keyword3 string
+	var keyword4 string
+	var remark string
+
+	followers, e := cygx.GetYanxuanSpecialFollowUserById(specialId)
+	if e != nil {
+		err = errors.New("GetYanxuanSpecialFollowUserById, Err: " + e.Error())
+		return
+	}
+	if len(followers) == 0 {
+		return
+	}
+	specialItem, e := cygx.GetYanxuanSpecialItemById(specialId)
+	if e != nil {
+		err = errors.New("GetYanxuanSpecialFollowUserById, Err: " + e.Error())
+		return
+	}
+	var allInUserId string
+	for _, v := range followers {
+		allInUserId += strconv.Itoa(v) + ","
+	}
+
+	allInUserId = strings.TrimRight(allInUserId, ",")
+
+	userList, err := models.GetWxUserListByUserIds(allInUserId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return err
+	}
+
+	mobile := make([]string, 0)
+
+	for _, v := range userList {
+		mobile = append(mobile, v.Mobile)
+	}
+
+	openIdList, e := cygx.GetUserRecordListByMobileArr(mobile)
+	if e != nil {
+		err = errors.New("GetSellerByAdminId, Err: " + e.Error())
+		return
+	}
+
+	if len(openIdList) == 0 {
+		return
+	}
+	keyword1 = "研选专栏:" + specialItem.SpecialName
+	keyword2 = "发布了新内容,点击查看详情"
+
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+	redirectUrl := ""
+
+	if utils.RunMode == "release" {
+		redirectUrl = utils.WX_MSG_PATH_YX_SPECIAL_DETAIL + strconv.Itoa(specialId)
+	}
+	sendInfo := new(services.SendWxTemplate)
+	sendInfo.First = first
+	sendInfo.Keyword1 = keyword1
+	sendInfo.Keyword2 = keyword2
+	sendInfo.Keyword3 = keyword3
+	sendInfo.Keyword4 = keyword4
+	sendInfo.Remark = remark
+	sendInfo.TemplateId = utils.WxMsgTemplateIdActivityChangeApplyXzs
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	sendInfo.Resource = strconv.Itoa(specialId)
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
+	sendInfo.OpenIdArr = openIdArr
+	err = services.SendTemplateMsg(sendInfo)
+	if err != nil {
+		return
+	}
+	return
+}
+
+//func init() {
+//	SendWxMsgSpecialAuthor(190, 1)
+//}
+
+// 研选专栏审核完成时,给提交人发送模板消息
+func SendWxMsgSpecialAuthor(specialId, status int) (err error) {
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("研选专栏审核完成时,给提交人发送模板消息 specialId:", specialId, err.Error()), 2)
+		}
+	}()
+	var first string
+	var keyword1 string
+	var keyword2 string
+	var keyword3 string
+	var keyword4 string
+	var remark string
+	var redirectUrl string
+
+	specialItem, e := cygx.GetYanxuanSpecialItemById(specialId)
+	if e != nil {
+		err = errors.New("GetYanxuanSpecialFollowUserById, Err: " + e.Error())
+		return
+	}
+	user, e := models.GetWxUserByUserId(specialItem.UserId)
+	if e != nil {
+		err = errors.New("GetWxUserByUserId, Err: " + e.Error())
+		return err
+	}
+	var mobiles []string
+	mobiles = append(mobiles, user.Mobile)
+	openIdList, err := cygx.GetUserRecordListByMobileArr(mobiles)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return err
+	}
+
+	if len(openIdList) == 0 {
+		return
+	}
+
+	//first =
+	keyword1 = "研选专栏内容审核"
+	if status == 1 {
+		keyword2 = "已通过审核,点击查看详情"
+		if utils.RunMode == "release" {
+			redirectUrl = utils.WX_MSG_PATH_YX_SPECIAL_DETAIL + strconv.Itoa(specialId)
+		}
+	} else {
+		keyword2 = "未通过审核,点击查看驳回原因"
+		if utils.RunMode == "release" {
+			redirectUrl = utils.WX_MSG_PATH_YX_SPECIAL_CENTER
+		}
+	}
+
+	keyword3 = "-"
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+	sendInfo := new(services.SendWxTemplate)
+	sendInfo.First = first
+	sendInfo.Keyword1 = keyword1
+	sendInfo.Keyword2 = keyword2
+	sendInfo.Keyword3 = keyword3
+	sendInfo.Keyword4 = keyword4
+	sendInfo.Remark = remark
+	sendInfo.TemplateId = utils.WxMsgTemplateIdActivityChangeApplyXzs
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	sendInfo.Resource = strconv.Itoa(specialId)
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
+	sendInfo.OpenIdArr = openIdArr
+	fmt.Println(sendInfo)
+	err = services.SendTemplateMsg(sendInfo)
+	if err != nil {
+		return
+	}
+	return
+}
+
+// SendReviewTemplateMsgAdmin 提交审核时给王芳,汪洋发消息
+//func SendReviewTemplateMsgAdmin(req models.ApplyTryReq, usermobile, applyMethod string, isResearch bool) (err error) {
+//	defer func() {
+//		if err != nil {
+//			go utils.SendAlarmMsg("处理试用申请给王芳,汪洋发消息失败, ErrMsg: "+err.Error(), 3)
+//		}
+//	}()
+//	var configCode string
+//	//如果是研选的就推送给汪洋跟王芳,否则就推送给王芳
+//	if isResearch {
+//		configCode = utils.TPL_MSG_WANG_FANG_WANG_YANG
+//	} else {
+//		configCode = utils.TPL_MSG
+//	}
+//	cnf, e := models.GetConfigByCode(configCode)
+//	if e != nil {
+//		err = errors.New("GetConfigByCode, Err: " + e.Error() + configCode)
+//		return
+//	}
+//	openIdList, e := models.GetUserRecordListByMobile(4, cnf.ConfigValue)
+//	if e != nil && e.Error() != utils.ErrNoRow() {
+//		err = errors.New("GetUserRecordListByMobile, Err: " + e.Error() + cnf.ConfigValue)
+//		return err
+//	}
+//
+//	for _, v := range openIdList {
+//		go SendPermissionApplyTemplateMsg(req.RealName, req.CompanyName, usermobile, applyMethod, v)
+//	}
+//
+//	return
+//}
+
+//func init() {
+//	UpdateYanxuanSpecialResourceData(190)
+//}
+
+// 更新研选专栏  写入首页最新  cygx_resource_data 表
+func UpdateYanxuanSpecialResourceData(sourceId int) {
+	var err error
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("更新研选专栏失败ourceId: ", sourceId, err.Error()), 2)
+		}
+	}()
+	var source = utils.CYGX_OBJ_YANXUANSPECIAL
+	var condition string
+	var pars []interface{}
+	condition = ` AND status = 3  AND  id = ?  `
+	pars = append(pars, sourceId)
+	total, e := cygx.GetCygxYanxuanSpecialCount(condition, pars)
+
+	if e != nil {
+		err = errors.New("GetCygxYanxuanSpecialCount, Err: " + e.Error())
+		return
+	}
+	//如果取消发布了就做删除处理
+	if total == 0 {
+		e = cygx.DeleteResourceData(sourceId, source)
+		if e != nil {
+			err = errors.New("DeleteResourceData, Err: " + e.Error())
+			return
+		}
+	} else {
+		//判断是否存在,如果不存在就新增,存在就更新
+		totalData, e := cygx.GetCygxResourceDataBySourceAndIdCount(sourceId, source)
+		if e != nil {
+			err = errors.New("GetCygxReportSelectionBySourceAndId, Err: " + e.Error())
+			return
+		}
+		publishDate := time.Now().Format(utils.FormatDateTime)
+		item := new(cygx.CygxResourceData)
+		item.SourceId = sourceId
+		item.Source = source
+		item.PublishDate = publishDate
+		item.CreateTime = time.Now()
+		if totalData == 0 {
+			_, e := cygx.AddCygxResourceData(item)
+			if e != nil {
+				err = errors.New("AddCygxResourceData, Err: " + e.Error())
+				return
+			}
+		} else {
+			e = cygx.UpdateResourceDataByItem(item)
+			if e != nil {
+				err = errors.New("UpdateResourceDataByItem, Err: " + e.Error())
+				return
+			}
+		}
+	}
+	return
+}

+ 6 - 6
services/cygx/research_summary.go

@@ -351,7 +351,7 @@ func DoArticleOnenIdWxTemplateMsg(articleId int, source int) (err error) {
 					}
 					if len(mapActivityMobile) > 0 {
 						for k := range mapActivityMobile {
-							openIditem, err := models.GetCompanyDetailByIdGroup(4, k)
+							openIditem, err := cygx.GetUserRecordOpenidByMobile(k)
 							if err != nil && err.Error() != utils.ErrNoRow() {
 								return err
 							}
@@ -392,7 +392,7 @@ func DoArticleOnenIdWxTemplateMsg(articleId int, source int) (err error) {
 			if mapOpenidPower[v.UserId] == "" {
 				continue
 			}
-			openIditem := new(models.OpenIdList)
+			openIditem := new(cygx.OpenIdList)
 			openIditem.UserId = v.UserId
 			openIditem.OpenId = v.OpenId
 			first := "您关注的作者发布了新的报告"
@@ -418,7 +418,7 @@ func DoArticleOnenIdWxTemplateMsg(articleId int, source int) (err error) {
 			if mapOpenidPower[v.UserId] == "" {
 				continue
 			}
-			openIditem := new(models.OpenIdList)
+			openIditem := new(cygx.OpenIdList)
 			openIditem.UserId = v.UserId
 			openIditem.OpenId = v.OpenId
 			//first := "您关注的产业有更新报告"
@@ -442,7 +442,7 @@ func DoArticleOnenIdWxTemplateMsg(articleId int, source int) (err error) {
 			if mapOpenidPushed[k] != "" {
 				continue
 			}
-			openIditem := new(models.OpenIdList)
+			openIditem := new(cygx.OpenIdList)
 			openIditem.UserId = k
 			openIditem.OpenId = v
 			first := "您关注的赛道,有新的报告发布/更新,欢迎查看"
@@ -480,7 +480,7 @@ func DoArticleOnenIdWxTemplateMsg(articleId int, source int) (err error) {
 				if mapOpenidPushed[k] != "" {
 					continue
 				}
-				openIditem := new(models.OpenIdList)
+				openIditem := new(cygx.OpenIdList)
 				openIditem.UserId = k
 				openIditem.OpenId = v
 				first := "您关注的赛道,有新的报告发布/更新,欢迎查看"
@@ -496,7 +496,7 @@ func DoArticleOnenIdWxTemplateMsg(articleId int, source int) (err error) {
 			}
 		} else {
 			for k, v := range mapOpenidPower {
-				openIditem := new(models.OpenIdList)
+				openIditem := new(cygx.OpenIdList)
 				openIditem.UserId = k
 				openIditem.OpenId = v
 				first := "您关注的赛道,有新的报告发布/更新,欢迎查看"

+ 15 - 42
services/cygx/special_wx_msg.go

@@ -3,7 +3,6 @@ package cygx
 import (
 	"errors"
 	"fmt"
-	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/company"
 	"hongze/hz_crm_api/models/cygx"
 	"hongze/hz_crm_api/services"
@@ -50,13 +49,16 @@ func DetermineTripBeInterested(activityId int) (err error) {
 		}
 	}
 	mobileLen := len(mobileArr)
-	var condition string
-	var pars []interface{}
-	if mobileLen > 0 {
-		condition += ` AND u.mobile IN (` + utils.GetOrmInReplace(mobileLen) + `)`
-		pars = append(pars, mobileArr)
+	if mobileLen == 0 {
+		return
 	}
-	openIdList, e := models.GetActivitySpecialOpenIdListMobile(condition, pars)
+	//var condition string
+	//var pars []interface{}
+	//if mobileLen > 0 {
+	//	condition += ` AND u.mobile IN (` + utils.GetOrmInReplace(mobileLen) + `)`
+	//	pars = append(pars, mobileArr)
+	//}
+	openIdList, e := cygx.GetUserRecordListByMobileArr(mobileArr)
 	if e != nil {
 		fmt.Println(e)
 		return
@@ -114,27 +116,6 @@ func DetermineTripCancel(activityId int) (err error) {
 		err = e
 		return
 	}
-	//var accessToken string
-	//if utils.RunMode == "release" {
-	//	accessToken, e = models.GetWxAccessTokenByXzs()
-	//	if e != nil {
-	//		err = e
-	//		return
-	//	}
-	//	if accessToken == "" {
-	//		return
-	//	}
-	//} else {
-	//	accessToken, e = models.GetWxAccessToken()
-	//	if e != nil {
-	//		return
-	//	}
-	//	if accessToken == "" {
-	//		msg = "accessToken is empty"
-	//		return
-	//	}
-	//}
-	//fmt.Println(listSignup)
 	var mobileArr []string
 	for _, v := range listSignup {
 		if v.Mobile != "" {
@@ -142,13 +123,10 @@ func DetermineTripCancel(activityId int) (err error) {
 		}
 	}
 	mobileLen := len(mobileArr)
-	var condition string
-	var pars []interface{}
-	if mobileLen > 0 {
-		condition += ` AND u.mobile IN (` + utils.GetOrmInReplace(mobileLen) + `)`
-		pars = append(pars, mobileArr)
+	if mobileLen == 0 {
+		return
 	}
-	openIdList, e := models.GetActivitySpecialOpenIdListMobile(condition, pars)
+	openIdList, e := cygx.GetUserRecordListByMobileArr(mobileArr)
 	if e != nil {
 		fmt.Println(e)
 		return
@@ -217,13 +195,8 @@ func DetermineTripChange(activityId int, changeType, changeMsg string) (err erro
 	if mobileLen == 0 {
 		return
 	}
-	var condition string
-	var pars []interface{}
-	if mobileLen > 0 {
-		condition += ` AND u.mobile IN (` + utils.GetOrmInReplace(mobileLen) + `)`
-		pars = append(pars, mobileArr)
-	}
-	openIdList, e := models.GetActivitySpecialOpenIdListMobile(condition, pars)
+
+	openIdList, e := cygx.GetUserRecordListByMobileArr(mobileArr)
 	if e != nil {
 		fmt.Println(e)
 		return
@@ -286,7 +259,7 @@ func SendWxMsgWithCygxActivitySpecialSubscribeNoInterested(activityId int) (err
 		msg = "GetReportInfo Err:" + err.Error()
 		return
 	}
-	openIdList, err := cygx.GetActivitySpecialOpenIdList()
+	openIdList, err := cygx.GeFollowSpecialOpenIdList()
 	if err != nil {
 		msg = "get openIdList err:" + err.Error()
 		return

+ 40 - 0
services/cygx/user_remind.go

@@ -0,0 +1,40 @@
+package cygx
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/services/alarm_msg"
+	"hongze/hz_crm_api/utils"
+)
+
+// 根据用户ID获取那些用户设置了互动提醒
+func GetCygxUserRemindListMap(userIds []int) (mapResp map[int]bool) {
+	lenArr := len(userIds)
+	if lenArr == 0 {
+		return
+	}
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg("根据用户ID获取那些用户设置了互动提醒,信息失败,GetCygxUserRemindListMap Err:"+err.Error(), 3)
+		}
+	}()
+	var condition string
+	var pars []interface{}
+
+	condition = ` AND  user_id IN (` + utils.GetOrmInReplace(lenArr) + `)`
+	pars = append(pars, userIds)
+	//获取分类名称
+	userRemindList, e := cygx.GetCygxUserRemindList(condition, pars, 0, 0)
+	if e != nil {
+		err = errors.New("GetCygxUserRemindList, Err: " + e.Error())
+		return
+	}
+	mapResp = make(map[int]bool, 0)
+	for _, v := range userRemindList {
+		mapResp[v.UserId] = true
+	}
+	return
+}

+ 35 - 0
services/elastic/es_comprehensive.go

@@ -536,3 +536,38 @@ func AddComprehensiveIndustrialSource(sourceType string, articleId int) {
 		EsAddOrEditComprehensiveData(item)
 	}
 }
+
+// Es研选专栏
+func EsAddYanxuanSpecial(sourceId int) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println("err:", err)
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("更新研选专栏失败sourceId: ", sourceId), 2)
+		}
+	}()
+	detail, e := cygx.GetYanxuanSpecialItemById(sourceId)
+	if e != nil {
+		err = errors.New("GetArticleInfoOtherByArticleId" + e.Error())
+		return
+	}
+	content := html.UnescapeString(detail.Content)
+	doc, e := goquery.NewDocumentFromReader(strings.NewReader(content))
+	if e != nil {
+		err = errors.New("goquery.NewDocumentFromReader" + e.Error())
+		return
+	}
+	bodyText := doc.Text()
+	item := new(ElasticComprehensiveDetail)
+	item.SourceId = detail.Id
+	item.Source = utils.CYGX_OBJ_YANXUANSPECIAL
+	item.Title = detail.Title
+	item.PublishDate = detail.PublishTime
+	item.BodyText = bodyText
+	if detail.Status == 3 {
+		EsAddOrEditComprehensiveData(item) //如果发布了就新增
+	} else {
+		EsDeleteComprehensiveData(item) // 没有发布就删除
+	}
+	return
+}

+ 30 - 225
services/wechat_send_msg.go

@@ -435,19 +435,11 @@ func SendWxMsgWithCygxActivity(activityId int) (err error) {
 		msg = "GetReportInfo Err:" + err.Error()
 		return
 	}
-	var openIdList []*models.OpenIdList
-	if utils.RunMode == "release" {
-		openIdList, err = models.GetActivityOpenIdList(activityId)
-		if err != nil {
-			msg = "get openIdList err:" + err.Error()
-			return
-		}
-	} else {
-		openIdList, err = models.GetActivityOpenIdListByDeBug(activityId)
-		if err != nil {
-			msg = "get openIdList err:" + err.Error()
-			return
-		}
+	var openIdList []*cygx.OpenIdList
+	openIdList, err = cygx.GetActivityOpenIdList(activityId)
+	if err != nil {
+		msg = "get GetActivityOpenIdList err:" + err.Error()
+		return
 	}
 	mapOpenid := make(map[int]string)
 	for _, v := range openIdList {
@@ -462,7 +454,7 @@ func SendWxMsgWithCygxActivity(activityId int) (err error) {
 	if len(openIdListAppointment) > 0 {
 		for _, v := range openIdListAppointment {
 			if _, ok := mapOpenid[v.UserId]; !ok {
-				item := new(models.OpenIdList)
+				item := new(cygx.OpenIdList)
 				item.UserId = v.UserId
 				item.OpenId = v.OpenId
 				openIdList = append(openIdList, item)
@@ -481,7 +473,7 @@ func SendWxMsgWithCygxActivity(activityId int) (err error) {
 	if len(openIdListActivityHelpAsk) > 0 {
 		for _, v := range openIdListActivityHelpAsk {
 			if _, ok := mapOpenid[v.UserId]; !ok {
-				item := new(models.OpenIdList)
+				item := new(cygx.OpenIdList)
 				item.UserId = v.UserId
 				item.OpenId = v.OpenId
 				openIdList = append(openIdList, item)
@@ -563,20 +555,14 @@ func SendWxMsgWithCygxActivityUpdateTime(activityId int, oldStr, newStr, strType
 	//		return
 	//	}
 	//}
-	var openIdList []*models.OpenIdList
-	if utils.RunMode == "release" {
-		openIdList, err = models.GetActivityOpenIdList(activityId)
-		if err != nil {
-			msg = "get openIdList err:" + err.Error()
-			return
-		}
-	} else {
-		openIdList, err = models.GetActivityOpenIdListByDeBug(activityId)
-		if err != nil {
-			msg = "get openIdList err:" + err.Error()
-			return
-		}
+	var openIdList []*cygx.OpenIdList
+
+	openIdList, err = cygx.GetActivityOpenIdList(activityId)
+	if err != nil {
+		msg = "get openIdList err:" + err.Error()
+		return
 	}
+
 	mapOpenid := make(map[int]string)
 	for _, v := range openIdList {
 		mapOpenid[v.UserId] = v.OpenId
@@ -590,7 +576,7 @@ func SendWxMsgWithCygxActivityUpdateTime(activityId int, oldStr, newStr, strType
 	if len(openIdListAppointment) > 0 {
 		for _, v := range openIdListAppointment {
 			if _, ok := mapOpenid[v.UserId]; !ok {
-				item := new(models.OpenIdList)
+				item := new(cygx.OpenIdList)
 				item.UserId = v.UserId
 				item.OpenId = v.OpenId
 				openIdList = append(openIdList, item)
@@ -609,7 +595,7 @@ func SendWxMsgWithCygxActivityUpdateTime(activityId int, oldStr, newStr, strType
 	if len(openIdListActivityHelpAsk) > 0 {
 		for _, v := range openIdListActivityHelpAsk {
 			if _, ok := mapOpenid[v.UserId]; !ok {
-				item := new(models.OpenIdList)
+				item := new(cygx.OpenIdList)
 				item.UserId = v.UserId
 				item.OpenId = v.OpenId
 				openIdList = append(openIdList, item)
@@ -711,27 +697,19 @@ func SendArticleWxTemplateMsg(nickName, aticleTiele, publishDate, abstract, indu
 	//		return
 	//	}
 	//}
-	var openIdList []*models.OpenIdList
+	var openIdList []*cygx.OpenIdList
 	//utils.FileLog.Info("mobile:%s", otherSellerMobile)
 	//openIdList, err = models.GetOpenIdListByMobile(otherSellerMobile)
 	var resource string
-	if utils.RunMode == "release" {
-		if msgType == "Department" {
-			openIdList, err = models.GetFollowDepartmentOpenIdList(departmentId)
-			resource = strconv.Itoa(departmentId)
-		} else {
-			openIdList, err = models.GetFollowindustrialOpenIdList(industrialManagementId)
-			resource = strconv.Itoa(industrialManagementId)
-		}
+
+	if msgType == "Department" {
+		openIdList, err = cygx.GetFollowDepartmentOpenIdList(departmentId)
+		resource = strconv.Itoa(departmentId)
 	} else {
-		if msgType == "Department" {
-			openIdList, err = models.GetFollowDepartmentOpenIdListByDeBug(departmentId)
-			resource = strconv.Itoa(departmentId)
-		} else {
-			openIdList, err = models.GetFollowindustrialOpenIdListByDeBug(industrialManagementId)
-			resource = strconv.Itoa(industrialManagementId)
-		}
+		openIdList, err = cygx.GetFollowindustrialOpenIdList(industrialManagementId)
+		resource = strconv.Itoa(industrialManagementId)
 	}
+
 	if err != nil {
 		msg = "get openIdList err:" + err.Error()
 		return
@@ -739,17 +717,8 @@ func SendArticleWxTemplateMsg(nickName, aticleTiele, publishDate, abstract, indu
 	if len(openIdList) == 0 {
 		return err
 	}
-	utils.FileLog.Info("openIdListCount:%s", len(openIdList))
-	//redirectUrl := ""
 
 	if len(openIdList) > 0 && utils.TemplateIdByProduct != "" {
-		utils.FileLog.Info("start send")
-		//sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
-		fmt.Println("send start")
-		utils.FileLog.Info("send start")
-		//sendMap := make(map[string]interface{})
-		//sendData := make(map[string]interface{})
-
 		var first string
 		var keyword1 string
 		var keyword2 string
@@ -768,23 +737,10 @@ func SendArticleWxTemplateMsg(nickName, aticleTiele, publishDate, abstract, indu
 		keyword3 := publishDate
 		keyword4 := abstract
 		remark := ""
-		//sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
-		//sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
-		//sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
-		//sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": "#173177"}
-		//sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": "#173177"}
-		//sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
-		//sendMap["template_id"] = utils.TemplateIdByProductXzs
-		//sendMap["url"] = redirectUrl //跳转地址
-		//sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxCygxAppId, "pagepath": "pageMy/reportDetail/reportDetail?id=" + strconv.Itoa(articleId)}
-		//sendMap["data"] = sendData
-		//sendTemplateMsg(sendUrl, sendMap, openIdList, resource, utils.TEMPLATE_MSG_CYGX_ARTICLE)
-
 		openIdArr := make([]string, len(openIdList))
 		for i, v := range openIdList {
 			openIdArr[i] = v.OpenId
 		}
-
 		sendInfo := new(SendWxTemplate)
 		sendInfo.First = first
 		sendInfo.Keyword1 = keyword1
@@ -798,11 +754,9 @@ func SendArticleWxTemplateMsg(nickName, aticleTiele, publishDate, abstract, indu
 		sendInfo.Resource = resource
 		sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE
 		sendInfo.OpenIdArr = openIdArr
-
 		err = SendTemplateMsg(sendInfo)
 
 	}
-	utils.FileLog.Info("send end")
 	return
 }
 
@@ -1322,8 +1276,8 @@ func SendWxMsgWithCygxActivitySpecial(activityId int) (err error) {
 		return
 	}
 
-	var openIdList []*models.OpenIdList
-	openIdList, err = models.GetActivitySpecialOpenIdList()
+	var openIdList []*cygx.OpenIdList
+	openIdList, err = cygx.GetActivitySpecialOpenIdList()
 	if err != nil {
 		msg = "get openIdList err:" + err.Error()
 		return
@@ -1901,7 +1855,7 @@ func SendWxMsgThisWeekLastWeek(first, keyword1, keyword2, keyword3, keyword4 str
 }
 
 // 推送预约研选的纪要活动、策略报告、研选报告
-func SendWxMsgWithCygxActivityAppointmentNew(first, keyword1, keyword2, keyword3, keyword4 string, item *models.OpenIdList, articleId int) (err error) {
+func SendWxMsgWithCygxActivityAppointmentNew(first, keyword1, keyword2, keyword3, keyword4 string, item *cygx.OpenIdList, articleId int) (err error) {
 	var msg string
 	defer func() {
 		if err != nil {
@@ -1923,7 +1877,7 @@ func SendWxMsgWithCygxActivityAppointmentNew(first, keyword1, keyword2, keyword3
 	//	msg = "accessToken is empty"
 	//	return
 	//}
-	var openIdList []*models.OpenIdList
+	var openIdList []*cygx.OpenIdList
 	openIdList = append(openIdList, item)
 	//sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
 	//sendMap := make(map[string]interface{})
@@ -1960,155 +1914,6 @@ func SendWxMsgWithCygxActivityAppointmentNew(first, keyword1, keyword2, keyword3
 	return
 }
 
-// 处理活动是否进行模板消息推送
-func SendActivityOnenIdWxTemplateMsg(first, keyword1, keyword2, keyword3, keyword4 string, openIdList []*models.OpenIdList, activityId int) (err error) {
-	var msg string
-	defer func() {
-		if err != nil {
-			go alarm_msg.SendAlarmMsg("查研观向处理活动是否进行模板消息推送发送模版消息失败,Err:"+err.Error()+";msg:"+msg, 3)
-			utils.FileLogCygx.Info(fmt.Sprintf("发送模版消息失败,Err:%s,%s", err.Error(), msg))
-		}
-	}()
-
-	var accessToken string
-	if utils.RunMode == "release" {
-		accessToken, err = models.GetWxAccessTokenByXzs()
-		if err != nil {
-			msg = "GetWxAccessToken Err:" + err.Error()
-			return
-		}
-		if accessToken == "" {
-			msg = "accessToken is empty"
-			return
-		}
-	} else {
-		accessToken, err = models.GetWxAccessToken()
-		if err != nil {
-			msg = "GetWxAccessToken Err:" + err.Error()
-			return
-		}
-		if accessToken == "" {
-			msg = "accessToken is empty"
-			return
-		}
-	}
-	sendMap := make(map[string]interface{})
-	sendData := make(map[string]interface{})
-	redirectUrl := ""
-	sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
-	sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
-	sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
-	sendData["remark"] = map[string]interface{}{"value": "点击查看活动详情", "color": "#173177"}
-	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
-	if utils.RunMode == "release" {
-		sendMap["template_id"] = utils.WxMsgTemplateIdActivityChangeApplyXzs
-	} else {
-		sendMap["template_id"] = utils.WxMsgTemplateIdActivityChangeApply
-	}
-	sendMap["url"] = redirectUrl
-	sendMap["data"] = sendData
-	sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxCygxAppId, "pagepath": "activityPages/activityDetail/activityDetail?id=" + strconv.Itoa(activityId) + "&IsSendWx=1"}
-	sendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(activityId), utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD)
-
-	//openIdArr := make([]string, len(openIdList))
-	//for i, v := range openIdList {
-	//	openIdArr[i] = v.OpenId
-	//}
-	//
-	//sendInfo := new(SendWxTemplate)
-	//sendInfo.First = first
-	//sendInfo.Keyword1 = keyword1
-	//sendInfo.Keyword2 = keyword2
-	//sendInfo.Remark = "点击查看活动详情"
-	//if utils.RunMode == "release" {
-	//	sendInfo.TemplateId = utils.WxMsgTemplateIdActivityChangeApplyXzs
-	//} else {
-	//	sendInfo.TemplateId = utils.WxMsgTemplateIdActivityChangeApply
-	//}
-	//sendInfo.RedirectUrl = "activityPages/activityDetail/activityDetail?id=" + strconv.Itoa(activityId)
-	//sendInfo.RedirectTarget = 3
-	//sendInfo.Resource = strconv.Itoa(activityId)
-	//sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_UPDATE
-	//sendInfo.OpenIdArr = openIdArr
-	//err = SendTemplateMsg(sendInfo)
-	return
-}
-
-// SendWxMsgWithCygxMicroRoadshowVideo 处理微路演视频关联的视频进行推送
-func SendWxMsgWithCygxMicroRoadshowVideo(first, keyword1, keyword2, keyword3, keyword4 string, item *models.OpenIdList, articleId int) (err error) {
-	var msg string
-	defer func() {
-		if err != nil {
-			fmt.Println("err:", err)
-			go alarm_msg.SendAlarmMsg("查研观向,推送预约研选的纪要活动、策略报告、研选报告,Err:"+err.Error()+";msg:"+msg, 3)
-			utils.FileLog.Info(fmt.Sprintf("发送模版消息失败,Err:%s,%s", err.Error(), msg))
-		}
-		if msg != "" {
-			utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
-		}
-	}()
-	var accessToken string
-	if utils.RunMode == "release" {
-		accessToken, err = models.GetWxAccessTokenByXzs()
-		if err != nil {
-			msg = "GetWxAccessToken Err:" + err.Error()
-			return
-		}
-		if accessToken == "" {
-			msg = "accessToken is empty"
-			return
-		}
-	} else {
-		accessToken, err = models.GetWxAccessToken()
-		if err != nil {
-			msg = "GetWxAccessToken Err:" + err.Error()
-			return
-		}
-		if accessToken == "" {
-			msg = "accessToken is empty"
-			return
-		}
-	}
-	var openIdList []*models.OpenIdList
-	openIdList = append(openIdList, item)
-	utils.FileLog.Info("start send")
-	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
-	fmt.Println("send start")
-	utils.FileLog.Info("send start")
-	sendMap := make(map[string]interface{})
-	sendData := make(map[string]interface{})
-	sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
-	sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
-	sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
-	sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": "#173177"}
-	sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": "#173177"}
-	sendData["remark"] = map[string]interface{}{"value": "点击进入产业资源包详情页", "color": "#173177"}
-	sendMap["template_id"] = utils.TemplateIdByProductXzs
-	sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxCygxAppId, "pagepath": "reportPages/IndustryReport/IndustryReport?id=" + strconv.Itoa(articleId)}
-	sendMap["data"] = sendData
-	sendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(articleId), utils.TEMPLATE_MSG_CYGX_ARTICLE)
-
-	//openIdArr := make([]string, len(openIdList))
-	//for i, v := range openIdList {
-	//	openIdArr[i] = v.OpenId
-	//}
-	//sendInfo := new(SendWxTemplate)
-	//sendInfo.First = first
-	//sendInfo.Keyword1 = keyword1
-	//sendInfo.Keyword2 = keyword2
-	//sendInfo.Keyword3 = keyword3
-	//sendInfo.Keyword4 = keyword4
-	//sendInfo.Remark = "点击查看报告详情"
-	//sendInfo.TemplateId = utils.TemplateIdByProductXzs
-	//sendInfo.RedirectUrl = "pageMy/reportDetail/reportDetail?id=" + strconv.Itoa(articleId)
-	//sendInfo.RedirectTarget = 3
-	//sendInfo.Resource = strconv.Itoa(articleId)
-	//sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE
-	//sendInfo.OpenIdArr = openIdArr
-	//err = SendTemplateMsg(sendInfo)
-	return
-}
-
 type SendWxTemplate struct {
 	WxAppId        string   `description:"公众号appId"`
 	First          string   `description:"模板消息first字段"`
@@ -2343,7 +2148,7 @@ func SendYbCommunityVideoWxMsgV2(videoId, varietyTagId int, varietyTagName, titl
 }
 
 // SendWxMsgWithRaiSell 权益销售客户申请转正后,消息群发给所有销售
-func SendWxMsgWithRaiSell(first, keyword1, keyword2, keyword3, keyword4 string, openIdList []*models.OpenIdList) (err error) {
+func SendWxMsgWithRaiSell(first, keyword1, keyword2, keyword3, keyword4 string, openIdList []*cygx.OpenIdList) (err error) {
 	var msg string
 	defer func() {
 		if err != nil {
@@ -2376,7 +2181,7 @@ func SendWxMsgWithRaiSell(first, keyword1, keyword2, keyword3, keyword4 string,
 }
 
 // SendWxMsgWithRaiWangYang 客户研选行业转正时(王芳审批通过),模板消息提醒汪洋
-func SendWxMsgWithRaiWangYang(keyword1, keyword2, keyword3, keyword4 string, openIdList []*models.OpenIdList) (err error) {
+func SendWxMsgWithRaiWangYang(keyword1, keyword2, keyword3, keyword4 string, openIdList []*cygx.OpenIdList) (err error) {
 	var msg string
 	defer func() {
 		if err != nil {

+ 12 - 0
utils/common.go

@@ -2099,3 +2099,15 @@ func CheckStrHaveLetter(checkString string) (checked bool) {
 	}
 	return
 }
+
+func ArticleHasImgUrl(body string) (hasImg bool, err error) {
+	r := strings.NewReader(string(body))
+	doc, err := goquery.NewDocumentFromReader(r)
+	if err != nil {
+		fmt.Println(err)
+	}
+	doc.Find("img").Each(func(i int, s *goquery.Selection) {
+		hasImg = true
+	})
+	return
+}

+ 26 - 11
utils/constants.go

@@ -13,6 +13,7 @@ const (
 	FormatDateUnSpace          = "20060102"                //日期格式
 	FormatDateTime             = "2006-01-02 15:04:05"     //完整时间格式
 	HlbFormatDateTime          = "2006-01-02_15:04:05.999" //完整时间格式
+	FormatDateTimeMinute       = "2006/01/02 15:04"        //时间格式 年/月/日 时:分
 	FormatDateTimeUnSpace      = "20060102150405"          //完整时间格式
 	FormatShortDateTimeUnSpace = "060102150405"            //省去开头两位年份的时间格式
 	EmptyDateTimeStr           = "0000-00-00 00:00:00"     //DateTime零值字符串
@@ -405,6 +406,7 @@ const (
 	CHART_PERMISSION_ID_70W                        = 2001     // 权益70w大套餐表示的权限ID(自定义)
 	CHART_PERMISSION_NAME_45W                      = "45w大套餐" // 权益45w大套餐名称
 	CHART_PERMISSION_ID_45W                        = 2002     // 权益45w大套餐表示的权限ID(自定义)
+	HONG_GUAN_NAME                          string = "宏观"
 )
 
 const (
@@ -419,6 +421,7 @@ const (
 	CYGX_OBJ_PRODUCTINTERIOR    string = "productinterior"    // 对象类型:产品内测
 	CYGX_OBJ_RESEARCHSUMMARY    string = "researchsummary"    // 对象类型:本周研究汇总
 	CYGX_OBJ_MINUTESSUMMARY     string = "minutessummary"     // 对象类型:本周研究汇总
+	CYGX_OBJ_YANXUANSPECIAL     string = "yanxuanspecial"     // 对象类型:研选专栏
 )
 
 const (
@@ -448,17 +451,20 @@ const (
 
 // 查研观向小程序 模板消息地址路由
 const (
-	WX_MSG_PATH_ARTICLE_DETAIL                 = "pageMy/reportDetail/reportDetail?id="                          //文章详情模板消息地址
-	WX_MSG_PATH_ACTIVITY_SPECIAL_DETAIL        = "activityPages/specialDetail/specialDetail?id="                 //专项调研活动模板消息地址
-	WX_MSG_PATH_ROAD_ESSENCE                   = "reportPages/roadEssence/roadEssence?id="                       //路演精华模板消息地址
-	WX_MSG_PATH_ACTIVITY_DETAIL                = "activityPages/activityDetail/activityDetail?id="               //活动模板消息地址
-	WX_MSG_PATH_PRODUCTINTERIOR_DETAIL         = "reportPages/internalDetials/internalDetials?id="               //产品内测模版消息地址
-	WX_MSG_PATH_ACTIVITY_SIGNIN                = "pages-signIn/isSignIn/isSignIn"                                //扫s码签到地址
-	WX_MSG_PATH_THIS_WEEK_DETAIL               = "/reportPages/reportSecretDetail/reportSecretDetail?type=2&id=" //本周研究汇总详情模板消息地址
-	WX_MSG_PATH_LAST_WEEK_DETAIL               = "/reportPages/reportSecretDetail/reportSecretDetail?type=3&id=" //上周纪要汇总详情模板消息地址
-	WX_MSG_PATH_KEY_COMPANY_DETAIL             = "/reportPages/keyCompany/keyCompany?id="                        //重点公司详情模板消息地址
-	WX_MSG_PATH_INDUSTRY_DETAIL                = "/reportPages/IndustryReport/IndustryReport?id="                //产业详情模板消息地址
-	CYGX_YANXUAN_POINTS_KEY             string = "CYGX_YANXUAN_POINTS_KEY"                                       //查研观向研选活动扣点KEY(冲突,先放这里)
+	WX_MSG_PATH_ARTICLE_DETAIL                  = "pageMy/reportDetail/reportDetail?id="                          //文章详情模板消息地址
+	WX_MSG_PATH_ACTIVITY_SPECIAL_DETAIL         = "activityPages/specialDetail/specialDetail?id="                 //专项调研活动模板消息地址
+	WX_MSG_PATH_ROAD_ESSENCE                    = "reportPages/roadEssence/roadEssence?id="                       //路演精华模板消息地址
+	WX_MSG_PATH_ACTIVITY_DETAIL                 = "activityPages/activityDetail/activityDetail?id="               //活动模板消息地址
+	WX_MSG_PATH_PRODUCTINTERIOR_DETAIL          = "reportPages/internalDetials/internalDetials?id="               //产品内测模版消息地址
+	WX_MSG_PATH_ACTIVITY_SIGNIN                 = "pages-signIn/isSignIn/isSignIn"                                //扫s码签到地址
+	WX_MSG_PATH_THIS_WEEK_DETAIL                = "/reportPages/reportSecretDetail/reportSecretDetail?type=2&id=" //本周研究汇总详情模板消息地址
+	WX_MSG_PATH_LAST_WEEK_DETAIL                = "/reportPages/reportSecretDetail/reportSecretDetail?type=3&id=" //上周纪要汇总详情模板消息地址
+	WX_MSG_PATH_KEY_COMPANY_DETAIL              = "/reportPages/keyCompany/keyCompany?id="                        //重点公司详情模板消息地址
+	WX_MSG_PATH_INDUSTRY_DETAIL                 = "/reportPages/IndustryReport/IndustryReport?id="                //产业详情模板消息地址
+	CYGX_YANXUAN_POINTS_KEY              string = "CYGX_YANXUAN_POINTS_KEY"                                       //查研观向研选活动扣点KEY(冲突,先放这里)
+	WX_MSG_PATH_YX_SPECIAL_DETAIL               = "pages-purchaser/noteAndViewpoint/noteAndViewpoint?id="         //研选专栏详情
+	WX_MSG_PATH_YX_SPECIAL_ENABLE_DETAIL        = "pages-purchaser/toExamine/toExamine?id="                       //研选专栏审核详情页面
+	WX_MSG_PATH_YX_SPECIAL_CENTER               = "pages-purchaser/contentAllPage/contentAllPage?Status=4"        //研选专栏内容中心
 )
 
 // 图表类型
@@ -523,6 +529,13 @@ const (
 	ApproveUserId = 2 //施琪-出差审批人
 )
 
+// 查研观向 研选专栏 作者头像和背景
+const (
+	CYGX_YANXUAN_SPECIAL_HEAD_IMG_URL  = "https://hzstatic.hzinsights.com/cygx/yanxuan_special/head_img/Mask%20group-"
+	CYGX_YANXUAN_SPECIAL_BG_IMG_URL    = "https://hzstatic.hzinsights.com/cygx/yanxuan_special/bg_img/"
+	CYGX_YANXUAN_SPECIAL_BG_IMG_URL_PC = "https://hzstatic.hzinsights.com/cygx/yanxuan_special/bg_img/pc/"
+)
+
 // 验证码
 const (
 	CaptchaCachePrefix     = "captcha:lock:crm_" // 验证码缓存Key
@@ -532,3 +545,5 @@ const (
 )
 
 const CrmEtaAuthorization = "NIi1RbEmH0C2rksXtPGDPBBgRgTZY87Q"
+
+const LoginCacheTime = 60 // 登录缓存时长, 分钟