浏览代码

Merge branch 'master' of http://8.136.199.33:3000/hongze/hz_crm_api into crm/crm_15.4.1

xingzai 8 月之前
父节点
当前提交
1e14147b13
共有 61 个文件被更改,包括 4598 次插入745 次删除
  1. 15 5
      controllers/company.go
  2. 178 1
      controllers/company_seller.go
  3. 16 14
      controllers/company_share.go
  4. 20 14
      controllers/cygx/activity_meet.go
  5. 1 1
      controllers/cygx/activity_signup.go
  6. 2 2
      controllers/cygx/enter_score.go
  7. 966 0
      controllers/cygx/rai_serve.go
  8. 566 244
      controllers/cygx/user.go
  9. 152 0
      controllers/cygx/user_feedback.go
  10. 74 11
      controllers/report.go
  11. 6 7
      controllers/report_chapter_type.go
  12. 75 16
      controllers/roadshow/calendar.go
  13. 132 33
      controllers/roadshow/calendar_meeting_user.go
  14. 8 1
      controllers/roadshow/company.go
  15. 115 53
      controllers/yb/road_video.go
  16. 4 0
      go.sum
  17. 25 0
      models/chart_permission.go
  18. 107 37
      models/classify.go
  19. 47 2
      models/company/company_config.go
  20. 1 1
      models/company/company_contract.go
  21. 14 5
      models/company/company_product.go
  22. 15 0
      models/cygx/activity_ask_email.go
  23. 94 2
      models/cygx/article_and_yanxuan_record.go
  24. 290 35
      models/cygx/cygx_user.go
  25. 0 128
      models/cygx/cygx_user_company.go
  26. 32 0
      models/cygx/industrial_activity_group_management.go
  27. 38 0
      models/cygx/industrial_activity_group_subject.go
  28. 22 0
      models/cygx/industrial_article_group_management.go
  29. 20 0
      models/cygx/industrial_article_group_subject.go
  30. 9 0
      models/cygx/industrial_management.go
  31. 11 2
      models/cygx/industrial_subject.go
  32. 12 10
      models/cygx/industry_fllow.go
  33. 197 0
      models/cygx/rai_serve_bill.go
  34. 72 0
      models/cygx/rai_serve_company.go
  35. 27 0
      models/cygx/rai_serve_week_bill.go
  36. 176 0
      models/cygx/user_feedback.go
  37. 8 6
      models/db.go
  38. 7 0
      models/report.go
  39. 48 27
      models/report_chapter_type.go
  40. 11 3
      models/roadshow/calendar.go
  41. 4 4
      models/roadshow/company.go
  42. 119 0
      models/roadshow/rs_calendar_meeting_label_group.go
  43. 140 1
      models/roadshow/rs_calendar_meeting_user.go
  44. 15 15
      models/user_seller_relation.go
  45. 8 8
      models/yb/apply_record.go
  46. 99 0
      routers/commentsRouter.go
  47. 2 0
      routers/router.go
  48. 101 13
      services/classify.go
  49. 14 0
      services/company.go
  50. 1 1
      services/company_apply/company_approval.go
  51. 37 0
      services/company_product.go
  52. 47 0
      services/cygx/acitvity.go
  53. 53 15
      services/cygx/admin_power.go
  54. 22 0
      services/cygx/article.go
  55. 213 0
      services/cygx/user_label.go
  56. 34 0
      services/report.go
  57. 1 1
      services/report_chapter_type_sync.go
  58. 40 0
      services/roadshow/calendar.go
  59. 2 0
      services/system.go
  60. 10 7
      services/task.go
  61. 23 20
      utils/constants.go

+ 15 - 5
controllers/company.go

@@ -803,8 +803,8 @@ func (this *CompanyController) List() {
 								condition += ` AND (b.seller_id = ? OR (b.share_seller_id = ? AND b.is_share = 1)) `
 								pars = append(pars, sysUser.AdminId, sysUser.AdminId)
 							} else {
-								condition += ` AND (b.seller_id = ? OR (b.share_seller_id = ? AND b.is_share = 1)) `
-								pars = append(pars, sysUser.AdminId, sysUser.AdminId)
+								condition += ` AND b.seller_id = ? `
+								pars = append(pars, sysUser.AdminId)
 							}
 						}
 
@@ -3141,6 +3141,7 @@ func (this *CompanyController) Detail() {
 		return
 	}
 	shareSellerId := 0
+	shareGroupId := 0
 	var productItem *company.CompanyProduct
 	if productId > 0 {
 		var e error
@@ -3152,6 +3153,7 @@ func (this *CompanyController) Detail() {
 		}
 		if productItem != nil {
 			shareSellerId = productItem.ShareSellerId
+			shareGroupId = productItem.ShareGroupId
 		}
 	}
 
@@ -3202,6 +3204,11 @@ func (this *CompanyController) Detail() {
 						isOk = true
 						break
 					}
+					// 分享的客户的组长 也有权限
+					if productItem.IsShare == 1 && productItem.ShareGroupId == sysUser.GroupId {
+						isOk = true
+						break
+					}
 
 					// 如果是组长,且该客户属于本组客户
 					if sysUser.Authority == 4 && productInfo.GroupId > 0 && productInfo.GroupId == sysUser.GroupId && sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_TEAM {
@@ -3281,7 +3288,7 @@ func (this *CompanyController) Detail() {
 				if item.Status == utils.COMPANY_STATUS_FREEZE || item.Status == utils.COMPANY_STATUS_LOSE {
 					btnDetailItem.BtnHistoryList = true
 				} else {
-					if item.SellerId == sysUser.AdminId || shareSellerId == sysUser.AdminId {
+					if item.SellerId == sysUser.AdminId || shareSellerId == sysUser.AdminId || shareGroupId == sysUser.GroupId {
 						btnDetailItem.BtnHistoryList = true
 					}
 					if sysUser.Authority > 0 {
@@ -3364,7 +3371,7 @@ func (this *CompanyController) Detail() {
 				if item.Status == utils.COMPANY_STATUS_FREEZE || item.Status == utils.COMPANY_STATUS_LOSE {
 					btnDetailItem.BtnHistoryList = true
 				} else {
-					if item.SellerId == sysUser.AdminId || item.ShareSellerId == sysUser.AdminId {
+					if item.SellerId == sysUser.AdminId || item.ShareSellerId == sysUser.AdminId || shareGroupId == sysUser.GroupId {
 						btnDetailItem.BtnHistoryList = true
 					}
 					if sysUser.Authority > 0 {
@@ -3946,7 +3953,10 @@ func (this *CompanyController) Edit() {
 
 	productId := services.GetProductId(sysUser.RoleTypeCode) //产品权限id
 	for _, v := range req.Products {
-
+		//X类试用,转为永续
+		if v.Status == utils.COMPANY_STATUS_X_CLASS_TRY_OUT {
+			v.Status = utils.COMPANY_STATUS_FOREVER
+		}
 		if productId == utils.COMPANY_PRODUCT_RAI_ID {
 
 			//查询客户的产品权限

+ 178 - 1
controllers/company_seller.go

@@ -2442,7 +2442,7 @@ func (this *CompanySellerController) ShareSellerList() {
 			tmpDepartmentGroupSeller = sortDepartmentGroupSellers(tmpDepartmentGroupSeller)
 			resp = append(resp, tmpDepartmentGroupSeller...)
 		}
-	} else {
+	} else if productId == utils.COMPANY_PRODUCT_FICC_ID {
 		groupId := 0
 		if utils.RunMode == "release" {
 			groupId = 37
@@ -2466,6 +2466,134 @@ func (this *CompanySellerController) ShareSellerList() {
 			}
 			resp = append(resp, sellerItem)
 		}
+	} else {
+		enabled := 1
+		roleCodeTypeStr := ""
+		departmentList, err := system.GetDepartmentList()
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取部门失败,Err:" + err.Error()
+			return
+		}
+		for _, department := range departmentList {
+			departmentGroupSellerList := make([]company.DepartmentGroupSellers, 0)
+			item := company.DepartmentGroupSellers{
+				AdminId: fmt.Sprint("department_", department.DepartmentId),
+				//AdminName string `description:"系统用户名称"`
+				RealName:     department.DepartmentName,
+				ChildrenList: departmentGroupSellerList,
+			}
+
+			groupList, err := system.GetSysGroupByDepartmentId(department.DepartmentId)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取分组失败,Err:" + err.Error()
+				return
+			}
+			for _, group := range groupList {
+				groupSellerList := make([]company.DepartmentGroupSellers, 0)
+				groupItem := company.DepartmentGroupSellers{
+					AdminId: fmt.Sprint("group_", group.DepartmentId),
+					//AdminName string `description:"系统用户名称"`
+					RealName:     group.GroupName,
+					ChildrenList: groupSellerList,
+				}
+				teamList, err := system.GetSysTeamByDepartmentId(group.GroupId)
+				if err != nil {
+					br.Msg = "获取小组失败"
+					br.ErrMsg = "获取小组失败,Err:" + err.Error()
+					return
+				}
+				for _, team := range teamList {
+					teamSellerList := make([]company.DepartmentGroupSellers, 0)
+					teamItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint("team_", team.GroupId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     team.GroupName,
+						ChildrenList: teamSellerList,
+					}
+					sellerList, err := system.GetTeamSysUserList(team.GroupId, enabled)
+					if err != nil {
+						br.Msg = "获取销售失败"
+						br.ErrMsg = "获取销售失败,Err:" + err.Error()
+						return
+					}
+					for _, seller := range sellerList {
+						sellerItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint(seller.AdminId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     seller.RealName,
+							Authority:    seller.Authority,
+							RoleTypeCode: seller.RoleTypeCode,
+						}
+						//fmt.Println("seller.RealName:", seller.RealName)
+						teamSellerList = append(teamSellerList, sellerItem)
+					}
+					teamSellerList = sortDepartmentGroupSellers(teamSellerList)
+					teamItem.ChildrenList = teamSellerList
+					if len(teamSellerList) > 0 {
+						groupSellerList = append(groupSellerList, teamItem)
+					}
+				}
+				//分组为0的销售(直属分组)
+				groupTeamSellerList, err := system.GetGrooupsysUserList(group.GroupId, roleCodeTypeStr, enabled)
+				if err != nil {
+					br.Msg = "获取销售失败"
+					br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					return
+				}
+				if len(groupTeamSellerList) > 0 {
+					tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+					for _, seller := range groupTeamSellerList {
+						sellerItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint(seller.AdminId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     seller.RealName,
+							Authority:    seller.Authority,
+							RoleTypeCode: seller.RoleTypeCode,
+						}
+						tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+					}
+					//排个序
+					tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+					groupSellerList = append(groupSellerList, tmpDepartmentGroupSellersList...)
+				}
+
+				groupItem.ChildrenList = groupSellerList
+				if len(groupSellerList) > 0 {
+					departmentGroupSellerList = append(departmentGroupSellerList, groupItem)
+				}
+			}
+
+			//分组为0的销售(直属部门)
+			departmentSellerList, err := system.GetDepartmentGroupSysUserList(department.DepartmentId, 0, roleCodeTypeStr)
+			if err != nil {
+				br.Msg = "获取销售失败"
+				br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				return
+			}
+			if len(departmentSellerList) > 0 {
+				tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+				for _, seller := range departmentSellerList {
+					sellerItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint(seller.AdminId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     seller.RealName,
+						Authority:    seller.Authority,
+						RoleTypeCode: seller.RoleTypeCode,
+					}
+					tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+				}
+				//排个序
+				tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+				departmentGroupSellerList = append(departmentGroupSellerList, tmpDepartmentGroupSellersList...)
+			}
+
+			item.ChildrenList = departmentGroupSellerList
+			if len(departmentGroupSellerList) > 0 {
+				resp = append(resp, item)
+			}
+		}
 	}
 
 	br.Ret = 200
@@ -5168,3 +5296,52 @@ func (this *CompanySellerController) ShareCheckList2() {
 		List: list,
 	}
 }
+
+// RaiServeSellerList
+// @Title 获取权益服务组销售列表
+// @Description 获取权益服务组销售列表 接口
+// @Success 200 {object} company.DepartmentGroupSellersResp
+// @router /seller/rai_serve/list [get]
+func (this *CompanySellerController) RaiServeSellerList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	resp := make([]company.DepartmentGroupSellers, 0)
+
+	groupId := 0
+	if utils.RunMode == "release" {
+		groupId = 68
+	} else {
+		groupId = 132
+	}
+	subAdmins, err := system.GetAdminByGroupId(groupId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取销售失败"
+		br.ErrMsg = "获取销售失败,Err:" + err.Error()
+		return
+	}
+
+	for _, seller := range subAdmins {
+		sellerItem := company.DepartmentGroupSellers{
+			AdminId:      fmt.Sprint(seller.AdminId),
+			RealName:     seller.RealName,
+			Authority:    seller.Authority,
+			RoleTypeCode: seller.RoleTypeCode,
+		}
+		resp = append(resp, sellerItem)
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 16 - 14
controllers/company_share.go

@@ -67,7 +67,8 @@ func (this *CompanyController) CompanyShare() {
 	if req.IsShare == 0 {
 		companyProductItem.ShareSeller = ""
 		companyProductItem.ShareSellerId = 0
-		updateCol = append(updateCol, "ShareSeller", "ShareSellerId")
+		companyProductItem.ShareGroupId = 0
+		updateCol = append(updateCol, "ShareSeller", "ShareSellerId", "ShareGroupId")
 	}
 
 	err = companyProductItem.Update(updateCol)
@@ -193,17 +194,18 @@ func (this *CompanyController) CompanyShareList() {
 						condition += ` AND b.group_id IN (` + groupIdStr + `) `
 					}
 				}
-			} else if sysUser.Authority == 4 || roleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP {
-				if sysUser.GroupId == groupId {
-					sellerIdStr, err := services.GetFiccSellerIdsByGroupId(sysUser.GroupId)
-					if err != nil {
-						br.Msg = "获取销售分组信息失败!"
-						br.ErrMsg = "获取销售分组信息失败!Err:" + err.Error()
-						return
-					}
-					if sellerIdStr != "" {
-						condition += ` AND b.share_seller_id IN (` + sellerIdStr + `) `
-					}
+			} else if roleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP {
+				//if sysUser.GroupId == groupId {
+				sellerIdStr, err := services.GetFiccSellerIdsByGroupId(sysUser.GroupId)
+				if err != nil {
+					br.Msg = "获取销售分组信息失败!"
+					br.ErrMsg = "获取销售分组信息失败!Err:" + err.Error()
+					return
+				}
+				//权益销售组长可以查看自己的组员以及共享给组员的客户
+				if sellerIdStr != "" {
+					condition += ` AND ( b.share_seller_id IN (` + sellerIdStr + `)  OR   b.group_id= ? )`
+					pars = append(pars, sysUser.GroupId)
 				} else {
 					condition += ` AND b.group_id=? `
 					pars = append(pars, sysUser.GroupId)
@@ -221,7 +223,6 @@ func (this *CompanyController) CompanyShareList() {
 		}
 	}
 
-
 	if listParam == 0 {
 		if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_SELLER || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_GROUP ||
 			sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_TEAM || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER ||
@@ -753,7 +754,8 @@ func (this *CompanyController) MoveShareSeller() {
 	updateCol := make([]string, 0)
 	companyProductItem.ShareSeller = seller.RealName
 	companyProductItem.ShareSellerId = seller.AdminId
-	updateCol = append(updateCol, "ShareSeller", "ShareSellerId")
+	companyProductItem.ShareGroupId = seller.GroupId
+	updateCol = append(updateCol, "ShareSeller", "ShareSellerId", "ShareGroupId")
 
 	err = companyProductItem.Update(updateCol)
 	if err != nil {

+ 20 - 14
controllers/cygx/activity_meet.go

@@ -1562,24 +1562,30 @@ func (this *ActivityMeetCoAntroller) AttendanceDetail() {
 	err = cygx.AddCygxActivityMeetingHistory(item)
 	resplist := new(cygx.AttendanceDetailList)
 	if resp.IsCanDownload == false {
-		var conditionMobile string
-		if adminInfo.RoleTypeCode == "rai_group" {
-			//组长查看本组所有组员
-			conditionMobile = ` 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 {
-			//组员查看自己
-			conditionMobile = ` SELECT mobile FROM user_seller_relation WHERE seller_id  = ` + strconv.Itoa(sysUser.AdminId)
-		}
-		mobileList, err := cygx.GetSellerUserMobile(conditionMobile)
+		//var conditionMobile string
+		//if adminInfo.RoleTypeCode == "rai_group" {
+		//	//组长查看本组所有组员
+		//	conditionMobile = ` 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 {
+		//	//组员查看自己
+		//	conditionMobile = ` SELECT mobile FROM user_seller_relation WHERE seller_id  = ` + strconv.Itoa(sysUser.AdminId)
+		//}
+		//mobileList, err := cygx.GetSellerUserMobile(conditionMobile)
+		//if err != nil {
+		//	br.Msg = "获取失败"
+		//	br.ErrMsg = "获取失败,GetSellerUserMobile Err:" + err.Error()
+		//	return
+		//}
+		mapUserMobile, err := cygxService.GetAdminLookUserMobile(adminInfo)
 		if err != nil {
 			br.Msg = "获取失败"
-			br.ErrMsg = "获取失败,GetSellerUserMobile Err:" + err.Error()
+			br.ErrMsg = "获取失败,销售对应权限,Err:" + err.Error()
 			return
 		}
-		mapUserMobile := make(map[string]string)
-		for _, v := range mobileList {
-			mapUserMobile[v.Mobile] = v.Mobile
-		}
+		//mapUserMobile := make(map[string]string)
+		//for _, v := range mobileList {
+		//	mapUserMobile[v.Mobile] = v.Mobile
+		//}
 		for _, v := range list1 {
 			if _, ok := mapUserMobile[v.Mobile]; ok {
 				resplist.List1 = append(resplist.List1, v)

+ 1 - 1
controllers/cygx/activity_signup.go

@@ -2482,7 +2482,7 @@ func (this *ActivitySignupCoAntroller) SignupCancel() {
 		return
 	}
 	go cygxService.YanXuanActivityPointsBillSignupCancel(detail.ActivityId, detail.UserId, adminInfo.AdminId)
-	if activityInfo.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN{
+	if activityInfo.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
 		go services.SendWxCategoryMsgWithYxActivityCancelSignUpBySell(detail.UserId, activityInfo.ActivityId)
 	}
 	//添加操作日志记录

+ 2 - 2
controllers/cygx/enter_score.go

@@ -583,8 +583,8 @@ func (this *EnterScoreController) EnterScoreList() {
 	}
 	var condition string
 	var pars []interface{}
-	//如果不是权益管理员和admin,就做可见权限限制
-	if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_RAI_ADMIN && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_RAI_RESEARCHR {
+	//如果不是权益管理员和admin、财务,就做可见权限限制
+	if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_RAI_ADMIN && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_RAI_RESEARCHR && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_FINANCE {
 		var conditionAdmin string
 		var parsAdmin []interface{}
 		conditionAdmin = "  AND product_id = 2  AND   status = '永续'  AND seller_id =  ?  "

+ 966 - 0
controllers/cygx/rai_serve.go

@@ -0,0 +1,966 @@
+package cygx
+
+import (
+	"errors"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"github.com/tealeg/xlsx"
+	"hongze/hz_crm_api/controllers"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/models/roadshow"
+	cygxService "hongze/hz_crm_api/services/cygx"
+	"hongze/hz_crm_api/utils"
+	"os"
+	"path/filepath"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// 权益服务类型
+type RaiServeCoAntroller struct {
+	controllers.BaseAuthController
+}
+
+// @Title 服务类型列表
+// @Description 服务类型列表接口
+// @Success 200 {object} cygx.RaiServeTypeListResp
+// @router /rai_serve/type_list [get]
+func (this *RaiServeCoAntroller) TypeList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	resp := new(cygx.RaiServeTypeListResp)
+	var condition string
+	list, err := cygx.GetRaiServeTypeRespList(condition)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 标签搜索
+// @Description 标签搜索接口
+// @Param   KeyWord   query   string  false       "搜索关键词"
+// @Success 200 {object} cygx.RaiServeTagListResp
+// @router /rai_serve/search_tag [get]
+func (this *RaiServeCoAntroller) SearchTag() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	keyWord := this.GetString("KeyWord")
+	if keyWord == "" {
+		br.Msg = "请输入搜索关键词"
+		return
+	}
+
+	resp := new(cygx.RaiServeTagListResp)
+	list, err := cygx.GetRaiServeSearchTagRespList(keyWord)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	//如果有固收或者策略就去查询行业表
+	if strings.Contains("固收", keyWord) || strings.Contains("策略", keyWord) {
+		var condition string
+		var pars []interface{}
+		keyWord = "%" + keyWord + "%"
+		condition = ` AND  product_id  = 2 AND  permission_name  IN ('策略','固收')   AND permission_name LIKE ?  `
+		pars = append(pars, keyWord)
+
+		listChartPermission, err := models.GetChartPermissionListByCondition(condition, pars)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取数据失败,GetChartPermissionListByCondition Err:" + err.Error()
+			return
+		}
+		for _, v := range listChartPermission {
+			item := new(cygx.RaiServeTagResp)
+			item.TagType = 3
+			item.TagId = v.ChartPermissionId
+			item.TagName = v.PermissionName
+			list = append(list, item)
+		}
+	}
+	if len(list) == 0 {
+		list = make([]*cygx.RaiServeTagResp, 0)
+	} else {
+		for _, v := range list {
+			v.Md5Key = utils.MD5(fmt.Sprintf("K_", v.TagType, "V_", v.TagId))
+		}
+	}
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 标签搜索(研究员日历添加到会信息)
+// @Description 标签搜索接口
+// @Param   KeyWord   query   string  false       "搜索关键词"
+// @Param   ResearcherId   query   int  false       "研究员ID"
+// @Success 200 {object} cygx.RaiServeTagListResp
+// @router /rai_serve/search_tag_by_calendar [get]
+func (this *RaiServeCoAntroller) SearchTagCalendar() {
+	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")
+
+	researcherId := this.GetString("ResearcherId")
+	askEmailList, err := cygx.GetAskEmailListByAdminIds(researcherId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "GetAskEmailCountByCelue,Err:" + err.Error()
+		return
+	}
+
+	var hasCelue bool
+	var permissionName []string
+	for _, v := range askEmailList {
+		permissionName = append(permissionName, v.ChartPermissionName)
+		if v.ChartPermissionName == "策略" || v.ChartPermissionName == "固收" {
+			hasCelue = true
+		}
+	}
+
+	var permissionNameSql []string
+	for _, v := range permissionName {
+		permissionNameSql = append(permissionNameSql, "'"+v+"'")
+	}
+	chartList, err := models.GetChartPermissionByNamesByRai(permissionNameSql)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,GetChartPermissionByNames Err:" + err.Error()
+		return
+	}
+
+	var list []*cygx.RaiServeTagResp
+	resp := new(cygx.RaiServeTagListResp)
+	if hasCelue {
+		for _, v := range chartList {
+			item := new(cygx.RaiServeTagResp)
+			item.TagType = 3
+			item.TagId = v.ChartPermissionId
+			item.TagName = v.PermissionName
+			list = append(list, item)
+		}
+	} else {
+		if keyWord == "" {
+			br.Msg = "请输入搜索关键词"
+			return
+		}
+		keyWordSlice := strings.Split(keyWord, ",")
+		var conditionindustrial string
+		var conditionsubject string
+		for _, v := range keyWordSlice {
+			conditionindustrial += ` OR i.industry_name LIKE '%` + v + `%' `
+			conditionsubject += ` OR s.subject_name LIKE  '%` + v + `%' `
+		}
+		var permissionId []string
+		for _, v := range chartList {
+			permissionId = append(permissionId, strconv.Itoa(v.ChartPermissionId))
+		}
+		list, err = cygx.GetRaiServeSearchTagRespListBycharId(keyWord, strings.Join(permissionId, ","), conditionindustrial, conditionsubject)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取数据失败,GetRaiServeSearchTagRespListBycharId Err:" + err.Error()
+			return
+		}
+	}
+
+	if len(list) == 0 {
+		list = make([]*cygx.RaiServeTagResp, 0)
+	} else {
+		for _, v := range list {
+			v.Md5Key = utils.MD5(fmt.Sprintf("K_", v.TagType, "V_", v.TagId))
+		}
+	}
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 校验是否属于策略固收
+// @Description 校验是否属于策略固收接口
+// @Param   ResearcherId   query   int  false       "研究员ID"
+// @Success 200 {object} cygx.RaiServeTagListResp
+// @router /rai_serve/chcck_PermissionName [get]
+func (this *RaiServeCoAntroller) ChcckPermissionName() {
+	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
+	}
+
+	researcherId := this.GetString("ResearcherId")
+	askEmailList, err := cygx.GetAskEmailListByAdminIds(researcherId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "GetAskEmailCountByCelue,Err:" + err.Error()
+		return
+	}
+
+	var belong bool
+	var permissionNameResp []string
+	var permissionNames []string
+	for _, v := range askEmailList {
+		permissionNames = append(permissionNames, v.ChartPermissionName)
+		if v.ChartPermissionName == "策略" || v.ChartPermissionName == "固收" {
+			belong = true
+			permissionNameResp = append(permissionNameResp, v.ChartPermissionName)
+		}
+	}
+	var list []*cygx.RaiServeTagResp
+	if belong {
+		var permissionNameSql []string
+		for _, v := range permissionNameResp {
+			permissionNameSql = append(permissionNameSql, "'"+v+"'")
+		}
+		chartList, err := models.GetChartPermissionByNamesByRai(permissionNameSql)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取数据失败,GetChartPermissionByNames Err:" + err.Error()
+			return
+		}
+		for _, v := range chartList {
+			item := new(cygx.RaiServeTagResp)
+			item.TagType = 3
+			item.TagId = v.ChartPermissionId
+			item.TagName = v.PermissionName
+			item.Md5Key = utils.MD5(fmt.Sprintf("K_", item.TagType, "V_", item.TagId))
+			list = append(list, item)
+		}
+	}
+	resp := new(cygx.ChekChartPermissionNameResp)
+	if len(list) == 0 {
+		list = make([]*cygx.RaiServeTagResp, 0)
+	}
+	resp.List = list
+	resp.Belong = belong
+	resp.ChartPermissionName = strings.Join(permissionNameResp, ",")
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 权益服务统计列表
+// @Description 权益服务统计列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   SellerId   query   string  false       "销售id"
+// @Param   ShareSellerId   query   string  false       "共享销售ID"
+// @Param   ServeTypeId   int   int	  false       "服务类型ID"
+// @Param   TagType   int   string  false       "标签类型"
+// @Param   TagId   int   string  false       "标签ID"
+// @Param   Status   query   string  false       "客户状态,正式、未续约(除了正式之外的所有)"
+// @Param   SortType   query   string  true       "如何排序,是正序还是倒序,枚举值:`asc 正序`,`desc 倒叙`"
+// @Param   IsExport   query   bool  false       "是否导出excel,默认是false"
+// @Success 200 {object} cygx.RaiServeTagListResp
+// @router /rai_serve/list [get]
+func (this *RaiServeCoAntroller) 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
+	}
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	status := this.GetString("Status")
+	sellerId := this.GetString("SellerId")
+	shareSellerId := this.GetString("ShareSellerId")
+	sortType := this.GetString("SortType")
+	tagType, _ := this.GetInt("TagType")
+	tagId, _ := this.GetInt("TagId")
+	serveTypeId, _ := this.GetInt("ServeTypeId")
+	isExport, _ := this.GetBool("IsExport")
+	resp := new(cygx.CygxRaiServeCompanyListResp)
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+	var condition string
+	var sortStr string
+	var pars []interface{}
+
+	if status != "" {
+		if status == "正式" {
+			condition += " AND status = '正式' "
+		} else {
+			condition += " AND status != '正式' "
+		}
+	}
+
+	if sellerId != "" {
+		condition += " AND seller_id IN (?) "
+		pars = append(pars, sellerId)
+	}
+
+	if shareSellerId != "" {
+		condition += " AND share_seller_id IN (?) "
+		pars = append(pars, shareSellerId)
+	}
+
+	if sortType != "" {
+		if sortType == "asc" {
+			sortStr = " ORDER BY money  ASC "
+		} else if sortType == "desc" {
+			sortStr = " ORDER BY money DESC "
+		}
+	} else {
+		sortStr = " ORDER BY end_date DESC "
+	}
+
+	//如果不是权益管理员和admin、财务,就做可见权限限制
+	if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_RAI_ADMIN && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_RAI_RESEARCHR {
+		if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER {
+			condition += " AND  (seller_id = ? OR  share_seller_id  = ? ) "
+			pars = append(pars, sysUser.AdminId, sysUser.AdminId)
+		}
+		if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP {
+			condition += " AND  ( seller_id = ? OR  share_seller_id  = ?  OR   group_id = ? OR  share_group_id = ? ) "
+			pars = append(pars, sysUser.AdminId, sysUser.AdminId, sysUser.GroupId, sysUser.GroupId)
+		}
+	}
+
+	total, err := cygx.GetCygxRaiServeCompanyCount(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,GetCygxRaiServeCompanyCountErr:" + err.Error()
+		return
+	}
+	listRaiServeCompany, err := cygx.GetCygxRaiServeCompanyList(condition+sortStr, pars, startSize, pageSize)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	var companyIds []int
+	for _, v := range listRaiServeCompany {
+		companyIds = append(companyIds, v.CompanyId)
+	}
+
+	mapWeekAmount := make(map[string]float64) //周度服务量
+	weeks := 4
+	if isExport {
+		weeks = 12 // 下载获取近12周的数据
+	}
+	lencompanyIds := len(companyIds)
+	if lencompanyIds > 0 {
+		var conditionBill string
+		var parsBill []interface{}
+
+		conditionBill, parsBill, err = getServeBillTag(tagType, tagId) // 标签ID搜索语句处理
+		if err != nil {
+			br.Msg = "获取信息失败!"
+			br.ErrMsg = "获取用户信息失败-getServeBillTag!Err:" + err.Error()
+			return
+		}
+
+		//服务类型筛选
+		if serveTypeId > 0 {
+			conditionBill += ` AND serve_type_id = ?  `
+			parsBill = append(parsBill, serveTypeId)
+		}
+
+		conditionBill += "  AND   company_id IN  (" + utils.GetOrmInReplace(lencompanyIds) + ")   "
+		parsBill = append(parsBill, companyIds)
+
+		listBill, err := cygx.GetCygxRaiServeBillListAll(conditionBill, parsBill)
+		if err != nil {
+			br.Msg = "获取信息失败!"
+			br.ErrMsg = "获取用户信息失败-GetCygxRaiServeBillListAll!Err:" + err.Error()
+			return
+		}
+
+		now := time.Now()
+
+		for _, v := range listBill {
+			for i := 0; i < weeks; i++ {
+				// 计算当前周的周一
+				monday := now.AddDate(0, 0, -int(now.Weekday()-time.Monday)-i*7)
+				weekmonday := monday.Format(utils.FormatDate)
+				if v.WeekStartDate == weekmonday {
+					mapWeekAmount[fmt.Sprintf("CID_", v.CompanyId, "WEEK_", i)] += v.ServeCount
+				}
+			}
+		}
+	}
+
+	for _, v := range listRaiServeCompany {
+		item := new(cygx.CygxRaiServeCompanyResp)
+		item.CompanyId = v.CompanyId
+		item.CompanyName = v.CompanyName
+		item.Money = v.Money
+		item.ServeCoverageRate = v.ServeCoverageRate + "%"
+		item.SellerId = v.SellerId
+		item.SellerName = v.SellerName
+		item.StartDate = v.StartDate
+		item.StartDate = v.StartDate
+		item.EndDate = v.EndDate
+		item.ShareSeller = v.ShareSeller
+		item.ShareSellerId = v.ShareSellerId
+		item.Status = v.Status
+		item.PermissionName = v.PermissionName
+		if v.IsUserMaker == 0 {
+			item.IsRed = true
+		}
+		item.ThisWeekAmount = mapWeekAmount[fmt.Sprintf("CID_", v.CompanyId, "WEEK_", 0)]
+		item.LastWeekAmount = mapWeekAmount[fmt.Sprintf("CID_", v.CompanyId, "WEEK_", 1)]
+		item.TwoWeekAmount = mapWeekAmount[fmt.Sprintf("CID_", v.CompanyId, "WEEK_", 2)]
+		item.ThreeWeekAmount = mapWeekAmount[fmt.Sprintf("CID_", v.CompanyId, "WEEK_", 3)]
+		resp.List = append(resp.List, item)
+	}
+
+	//导出excel
+	if isExport {
+		RaiServeListExport(this, resp, mapWeekAmount, br)
+		return
+	}
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp.Paging = page
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// EnterScoreScoreListExport 导出Excel
+func RaiServeListExport(this *RaiServeCoAntroller, resp *cygx.CygxRaiServeCompanyListResp, mapWeekAmount map[string]float64, br *models.BaseResponse) {
+	weeks := 12 // 下载获取近12周的数据
+	mapWeekFormat := make(map[int]string)
+	now := time.Now()
+	for i := 0; i < weeks; i++ {
+		// 计算当前周的周一
+		monday := now.AddDate(0, 0, -int(now.Weekday()-time.Monday)-i*7)
+		sunday := monday.AddDate(0, 0, 6)
+		weekmonday := monday.Format(utils.FormatMonthDayUnSpace2)
+		weeksunday := sunday.Format(utils.FormatMonthDayUnSpace2)
+		mapWeekFormat[i] = weekmonday + "~" + weeksunday
+	}
+
+	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("签约套餐")
+
+	cellWe1 := titleRow.AddCell()
+	cellWe1.SetStyle(style)
+	cellWe1.SetValue("本周服务量(" + mapWeekFormat[0] + ")")
+
+	cellWe2 := titleRow.AddCell()
+	cellWe2.SetStyle(style)
+	cellWe2.SetValue("上周服务量(" + mapWeekFormat[1] + ")")
+
+	cellWe3 := titleRow.AddCell()
+	cellWe3.SetStyle(style)
+	cellWe3.SetValue("上上周服务量(" + mapWeekFormat[2] + ")")
+
+	cellWe4 := titleRow.AddCell()
+	cellWe4.SetStyle(style)
+	cellWe4.SetValue("上三周服务量(" + mapWeekFormat[3] + ")")
+
+	for i := 0; i < weeks; i++ {
+		if i < 4 {
+			continue
+		}
+		// 计算当前周的周一
+		cellWei := titleRow.AddCell()
+		cellWei.SetStyle(style)
+		cellWei.SetValue(mapWeekFormat[i])
+	}
+
+	for _, v := range resp.List {
+		dataRow := sheel.AddRow()
+		dataRow.SetHeight(20)
+
+		cellA := dataRow.AddCell()
+		cellA.SetStyle(style)
+		cellA.SetValue(v.CompanyName)
+
+		cellB := dataRow.AddCell()
+		cellB.SetStyle(style)
+		cellB.SetValue(v.Status)
+
+		cellC := dataRow.AddCell()
+		cellC.SetStyle(style)
+		cellC.SetValue(v.SellerName)
+
+		cellD := dataRow.AddCell()
+		cellD.SetStyle(style)
+		cellD.SetValue(v.ShareSeller)
+
+		cellE := dataRow.AddCell()
+		cellE.SetStyle(style)
+		cellE.SetValue(v.StartDate + "~" + v.EndDate)
+
+		cellF := dataRow.AddCell()
+		cellF.SetStyle(style)
+		cellF.SetValue(v.Money)
+
+		cellG := dataRow.AddCell()
+		cellG.SetStyle(style)
+		cellG.SetValue(v.PermissionName)
+
+		for i := 0; i < weeks; i++ {
+			cellWei := dataRow.AddCell()
+			cellWei.SetStyle(style)
+			cellWei.SetValue(mapWeekAmount[fmt.Sprintf("CID_", v.CompanyId, "WEEK_", i)])
+		}
+
+	}
+	err = xlsxFile.Save(downLoadnFilePath)
+	if err != nil {
+		br.Msg = "保存文件失败"
+		br.ErrMsg = "保存文件失败"
+		return
+	}
+	randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
+	downloadFileName := "权益服务统计导出数据_" + randStr + ".xlsx"
+	this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
+	defer func() {
+		os.Remove(downLoadnFilePath)
+	}()
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "导出成功"
+}
+
+// 标签搜索语句筛选
+func getServeBillTag(tagType, tagId int) (conditionBill string, parsBill []interface{}, err error) {
+	if tagType == 0 {
+		return
+	}
+	var activityIds []int
+	var activitySpecialIds []int
+	var articleIds []int
+	var rsCalendarIds []int
+	switch tagType {
+	case 1:
+		listGroupActivity, e := cygx.GetIndustrialActivityGroupManagementListByIndustriaId(tagId, 1) // 关联的活动
+		if e != nil {
+			err = errors.New("GetIndustrialActivityGroupManagementListByIndustriaId, Err: " + e.Error())
+			return
+		}
+		for _, v := range listGroupActivity {
+			activityIds = append(activityIds, v.ActivityId)
+		}
+
+		listGroupActivitySpecial, e := cygx.GetIndustrialActivityGroupManagementListByIndustriaId(tagId, 2) // 关联的产业
+		if e != nil {
+			err = errors.New("GetIndustrialActivityGroupManagementListByIndustriaId, Err: " + e.Error())
+			return
+		}
+		for _, v := range listGroupActivitySpecial {
+			activitySpecialIds = append(activitySpecialIds, v.ActivityId)
+		}
+
+		listGroupArticle, e := cygx.GetIndustrialArticleGroupManagementListByindustrialId(tagId) // 关联的产业
+		if e != nil {
+			err = errors.New("GetIndustrialArticleGroupManagementListByindustrialId, Err: " + e.Error())
+			return
+		}
+		for _, v := range listGroupArticle {
+			articleIds = append(articleIds, v.ArticleId)
+		}
+
+		listGroupRsCalendar, e := roadshow.GetRsCalendarMeetingLabelGroupDetailByTag(tagType, tagId)
+		if e != nil {
+			err = errors.New("GetRsCalendarMeetingLabelGroupDetailByTag, Err: " + e.Error())
+			return
+		}
+		for _, v := range listGroupRsCalendar {
+			rsCalendarIds = append(rsCalendarIds, v.RsCalendarId)
+		}
+	case 2:
+		listGroupActivity, e := cygx.GetSubjectActivityGroupManagementListBySubjectId(tagId, 1) // 关联的活动
+		if e != nil {
+			err = errors.New("GetSubjectActivityGroupManagementListBySubjectId, Err: " + e.Error())
+			return
+		}
+		for _, v := range listGroupActivity {
+			activityIds = append(activityIds, v.ActivityId)
+		}
+
+		listGroupActivitySpecial, e := cygx.GetSubjectActivityGroupManagementListBySubjectId(tagId, 2) // 关联的产业
+		if e != nil {
+			err = errors.New("GetSubjectActivityGroupManagementListBySubjectId, Err: " + e.Error())
+			return
+		}
+		for _, v := range listGroupActivitySpecial {
+			activitySpecialIds = append(activitySpecialIds, v.ActivityId)
+		}
+
+		listGroupArticle, e := cygx.GetSubjectArticleGroupManagementListBysubjectId(tagId) // 关联的产业
+		if e != nil {
+			err = errors.New("GetSubjectArticleGroupManagementListBysubjectId, Err: " + e.Error())
+			return
+		}
+		for _, v := range listGroupArticle {
+			articleIds = append(articleIds, v.ArticleId)
+		}
+
+		listGroupRsCalendar, e := roadshow.GetRsCalendarMeetingLabelGroupDetailByTag(tagType, tagId)
+		if e != nil {
+			err = errors.New("GetRsCalendarMeetingLabelGroupDetailByTag, Err: " + e.Error())
+			return
+		}
+		for _, v := range listGroupRsCalendar {
+			rsCalendarIds = append(rsCalendarIds, v.RsCalendarId)
+		}
+
+		activityIds = append(activityIds, 0)
+		lenactivityIds := len(activityIds)
+		//if lenactivityIds > 0 {
+		conditionBill += ` AND IF ( source = 'activity', source_id IN  (` + utils.GetOrmInReplace(lenactivityIds) + `) , 1 = 1 ) `
+		parsBill = append(parsBill, activityIds)
+		//}
+
+		activitySpecialIds = append(activitySpecialIds, 0)
+		lenactivitySpecialIds := len(activitySpecialIds)
+		//if lenactivitySpecialIds > 0 {
+		conditionBill += ` AND IF ( source = 'activityspecial', source_id IN  (` + utils.GetOrmInReplace(lenactivitySpecialIds) + `) , 1 = 1 ) `
+		parsBill = append(parsBill, activitySpecialIds)
+		//}
+
+		articleIds = append(articleIds, 0)
+		lenarticleIds := len(articleIds)
+		//if lenarticleIds > 0 {
+		conditionBill += ` AND IF ( source = 'article', source_id IN  (` + utils.GetOrmInReplace(lenarticleIds) + `) , 1 = 1 ) `
+		parsBill = append(parsBill, articleIds)
+		//}
+
+		rsCalendarIds = append(rsCalendarIds, 0)
+		lenrsCalendarIds := len(rsCalendarIds)
+		//if lenrsCalendarIds > 0 {
+		conditionBill += ` AND IF ( source = 'rscalendar', source_id IN  (` + utils.GetOrmInReplace(lenrsCalendarIds) + `) , 1 = 1 ) `
+		parsBill = append(parsBill, rsCalendarIds)
+
+	case 3:
+		conditionBill += "  AND   chart_permission_id  = ?   "
+		parsBill = append(parsBill, tagId)
+	}
+
+	//}
+
+	conditionBill += ` AND source != 'yanxuanspecial'  AND source != 'userfeedback' `
+	return
+}
+
+// @Title 近四周覆盖率
+// @Description 近四周覆盖率接口
+// @Param   CompanyId   query   int	  false       "公司ID"
+// @Success 200 {object} cygx.RaiServeTagListResp
+// @router /rai_serve/coverage_rate [get]
+func (this *RaiServeCoAntroller) CoverageRate() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	companyId, _ := this.GetInt("CompanyId")
+	listWeekBill, err := cygx.GetCygxRaiServeBillListWeek4(companyId)
+	if err != nil {
+		br.Msg = "获取信息失败!"
+		br.ErrMsg = "获取用户信息失败-GetCygxRaiServeBillListWeek4!Err:" + err.Error()
+		return
+	}
+	mapWeek := make(map[int]string)
+	for k, v := range listWeekBill {
+		mapWeek[k] = utils.SubFloatToString(v.CoverageRate, 2)
+	}
+	resp := new(cygx.RaiServeCoverageRateResp)
+	resp.ThisWeekAmount = mapWeek[0] + "%"
+	resp.LastWeekAmount = mapWeek[1] + "%"
+	resp.TwoWeekAmount = mapWeek[2] + "%"
+	resp.ThreeWeekAmount = mapWeek[3] + "%"
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 明细列表
+// @Description 明细列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   CompanyId   query   int	  false       "公司ID"
+// @Param   TagType   query   int  false       "标签类型"
+// @Param   TagId   query   int  false       "标签ID"
+// @Param   ServeTypeId   int   int	  false       "服务类型ID"
+// @Param   WhatWeek   query   int  false       "哪一周 ,1:本周、2:上周、3:上上周、4上三周"
+// @Success 200 {object} cygx.RaiServeTagListResp
+// @router /rai_serve/bill_list [get]
+func (this *RaiServeCoAntroller) BillList() {
+	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")
+	companyId, _ := this.GetInt("CompanyId")
+	tagType, _ := this.GetInt("TagType")
+	tagId, _ := this.GetInt("TagId")
+	serveTypeId, _ := this.GetInt("ServeTypeId")
+	whatWeek, _ := this.GetInt("WhatWeek")
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+	if companyId == 0 {
+		br.Msg = "请选择对应公司ID"
+		return
+	}
+	var condition string
+	var pars []interface{}
+	var err error
+
+	condition, pars, err = getServeBillTag(tagType, tagId) // 标签ID搜索语句处理
+	if err != nil {
+		br.Msg = "获取信息失败!"
+		br.ErrMsg = "获取用户信息失败-getServeBillTag!Err:" + err.Error()
+		return
+	}
+
+	if whatWeek > 0 {
+		now := time.Now()
+		// 计算所选周的周一
+		monday := now.AddDate(0, 0, -int(now.Weekday()-time.Monday)-(whatWeek-1)*7)
+		condition += " AND  week_start_date = ? "
+		pars = append(pars, monday.Format(utils.FormatDate))
+	}
+
+	condition += " AND  company_id = ? "
+	pars = append(pars, companyId)
+	if serveTypeId > 0 {
+		condition += " AND  serve_type_id = ? "
+		pars = append(pars, serveTypeId)
+	}
+
+	total, err := cygx.GetCygxRaiServeBillCount(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,GetCygxRaiServeBillCount:" + err.Error()
+		return
+	}
+	list, err := cygx.GetCygxRaiServeBillRespList(condition, pars, startSize, pageSize)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,GetCygxRaiServeBillRespList:" + err.Error()
+		return
+	}
+
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp := new(cygx.CygxRaiServeBillListResp)
+	resp.Paging = page
+	if len(list) == 0 {
+		resp.List = make([]*cygx.CygxRaiServeBillResp, 0)
+	} else {
+		var activityIds []int
+		var activitySpecialIds []int
+		var articleIds []int
+		var rsCalendarIds []int
+		for _, v := range list {
+			switch v.Source {
+			case utils.CYGX_OBJ_ARTICLE:
+				articleIds = append(articleIds, v.SourceId)
+			case utils.CYGX_OBJ_ACTIVITY:
+				activityIds = append(activityIds, v.SourceId)
+			case utils.CYGX_OBJ_ACTIVITYSPECIAL:
+				activitySpecialIds = append(activitySpecialIds, v.SourceId)
+			case utils.CYGX_OBJ_RS_CALENDAR:
+				rsCalendarIds = append(rsCalendarIds, v.SourceId)
+			}
+		}
+
+		maparticleIndustrialLabel := make(map[int][]string) //文章产业标签
+		maparticleSubjectLabel := make(map[int][]string)    // 文章行业标签
+		if len(articleIds) > 0 {
+			maparticleIndustrialLabel = cygxService.GetArticleIndustrialLabelByArticleId(articleIds) // 关联产业
+			maparticleSubjectLabel = cygxService.GetArticleSubjectLabelByArticleId(articleIds)       // 关联标的
+		}
+
+		mapActivityIndustrialLabel := make(map[int][]string) //活动产业标签
+		mapActivitySubjectLabel := make(map[int][]string)    //活动标的标签
+		mapActivityIndustrialLabel = cygxService.GetActivityIndustrialLabelByActivityIds(activityIds, 1)
+		mapActivitySubjectLabel = cygxService.GetActivitySubjectLabelByActivityIds(activityIds, 1)
+
+		mapActivitySpeicalIndustrialLabel := make(map[int][]string) //活动产业标签
+		mapActivitySpeicalSubjectLabel := make(map[int][]string)    //活动标的标签
+		mapActivitySpeicalIndustrialLabel = cygxService.GetActivityIndustrialLabelByActivityIds(activityIds, 2)
+		mapActivitySpeicalSubjectLabel = cygxService.GetActivitySubjectLabelByActivityIds(activityIds, 2)
+
+		mapRsCalendarLabel := make(map[int][]string) //1v1 路演标签
+		mapRsCalendarLabel = cygxService.GetRsCalendarLabelByRsCalendarIds(rsCalendarIds)
+
+		for _, v := range list {
+			switch v.Source {
+			case utils.CYGX_OBJ_ARTICLE:
+				if v.ChartPermissionName == utils.GU_SHOU_NAME || v.ChartPermissionName == utils.CE_LUE_NAME {
+					v.Tag = v.ChartPermissionName
+				} else {
+					v.Tag = strings.Join(maparticleIndustrialLabel[v.SourceId], ",")
+					if len(maparticleSubjectLabel[v.SourceId]) > 0 {
+						v.Tag += "," + strings.Join(maparticleSubjectLabel[v.SourceId], ",")
+					}
+				}
+			case utils.CYGX_OBJ_ACTIVITY:
+				v.Tag = strings.Join(mapActivityIndustrialLabel[v.SourceId], ",")
+				if len(mapActivitySubjectLabel[v.SourceId]) > 0 {
+					v.Tag += "," + strings.Join(mapActivitySubjectLabel[v.SourceId], ",")
+				}
+			case utils.CYGX_OBJ_ACTIVITYSPECIAL:
+				v.Tag = strings.Join(mapActivitySpeicalIndustrialLabel[v.SourceId], ",")
+				if len(mapActivitySpeicalSubjectLabel[v.SourceId]) > 0 {
+					v.Tag += "," + strings.Join(mapActivitySpeicalSubjectLabel[v.SourceId], ",")
+				}
+			case utils.CYGX_OBJ_RS_CALENDAR:
+				if v.ChartPermissionName == utils.GU_SHOU_NAME || v.ChartPermissionName == utils.CE_LUE_NAME {
+					v.Tag = v.ChartPermissionName
+				} else {
+					v.Tag = strings.Join(mapRsCalendarLabel[v.SourceId], ",")
+				}
+			}
+		}
+		resp.List = list
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

文件差异内容过多而无法显示
+ 566 - 244
controllers/cygx/user.go


+ 152 - 0
controllers/cygx/user_feedback.go

@@ -0,0 +1,152 @@
+package cygx
+
+import (
+	"encoding/json"
+	"hongze/hz_crm_api/controllers"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/cygx"
+	"time"
+)
+
+// 联系人列表,交流反馈
+type UserFeedbackController struct {
+	controllers.BaseAuthController
+}
+
+// @Title 添加交流反馈接口
+// @Description 添加交流反馈接口
+// @Param	request	body cygx.AddCygxUserFeedbackReq true "type json string"
+// @Success 200 操作成功
+// @router /user_feedback/add [post]
+func (this *UserFeedbackController) UserFeedbackAdd() {
+	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.AddCygxUserFeedbackReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	userId := req.UserId
+	content := req.Content
+	if content == "" {
+		br.Msg = "内容不能为空!"
+		return
+	}
+	wxUser, err := models.GetWxUserItemByUserId(userId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败, GetWxUserItemByUserId  Err:" + err.Error()
+		return
+	}
+	item := new(cygx.CygxUserFeedback)
+	item.Content = content
+	item.UserId = wxUser.UserId
+	item.Mobile = wxUser.Mobile
+	item.Email = wxUser.Email
+	item.CompanyId = wxUser.CompanyId
+	item.CompanyName = wxUser.CompanyName
+	item.RealName = wxUser.RealName
+	item.AdminId = sysUser.AdminId
+	item.CreateTime = time.Now()
+	_, err = cygx.AddCygxUserFeedback(item)
+	if err != nil {
+		br.Msg = "新增失败."
+		br.ErrMsg = "新增失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}
+
+// @Title 交流反馈列表接口
+// @Description 交流反馈列表接口
+// @Param   UserId   query   int	  false       "用户ID"
+// @Success 200 {object} cygx.CygxCygxUserFeedbackResp
+// @router /user_feedback/list [get]
+func (this *RaiServeCoAntroller) UserFeedbackList() {
+	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")
+	if userId < 1 {
+		br.Msg = "请输入用户ID"
+		return
+	}
+	resp := new(cygx.CygxCygxUserFeedbackResp)
+	list, err := cygx.GetCygxUserFeedbackListByUserId(userId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 删除交流反馈接口
+// @Description 删除交流反馈接口
+// @Param	request	body cygx.CygxUserFeedbackIdReq true "type json string"
+// @Success 200 操作成功
+// @router /user_feedback/del [post]
+func (this *UserFeedbackController) UserFeedbackDel() {
+	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.CygxUserFeedbackIdReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	userFeedbackId := req.UserFeedbackId
+
+	if userFeedbackId < 0 {
+		br.Msg = "参数错误!"
+		return
+	}
+
+	err = cygx.DeleteCygxUserFeedback(userFeedbackId)
+	if err != nil {
+		br.Msg = "删除失败"
+		br.ErrMsg = "删除失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "删除成功"
+}

+ 74 - 11
controllers/report.go

@@ -5,6 +5,7 @@ import (
 	"fmt"
 	"github.com/beego/beego/v2/server/web"
 	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/company"
 	"hongze/hz_crm_api/services"
 	"hongze/hz_crm_api/services/alarm_msg"
 	"hongze/hz_crm_api/utils"
@@ -60,6 +61,21 @@ func (this *ReportController) GetDayWeekReportChapterTypeList() {
 		return
 	}
 
+	dayClassifyId, err := company.GetReportClassifyIdByConfigKey("report_day_classify_id")
+	if err != nil {
+		br.Msg = "获取晨报ID配置失败"
+		br.ErrMsg = "获取配置失败"
+		br.IsSendEmail = false
+		return
+	}
+	weekClassifyId, err := company.GetReportClassifyIdByConfigKey("report_week_classify_id")
+	if err != nil {
+		br.Msg = "获取周报ID配置失败"
+		br.ErrMsg = "获取配置失败"
+		br.IsSendEmail = false
+		return
+	}
+
 	dayList := make([]*models.ReportChapterType, 0)
 	weekList := make([]*models.ReportChapterType, 0)
 
@@ -68,8 +84,8 @@ func (this *ReportController) GetDayWeekReportChapterTypeList() {
 		tmpCondition := condition
 		tmpPars := pars
 		// 报告类型
-		tmpCondition += ` AND research_type = ? `
-		tmpPars = append(tmpPars, "day")
+		tmpCondition += ` AND report_classify_id = ? `
+		tmpPars = append(tmpPars, dayClassifyId)
 
 		list, err := models.GetAllReportChapterTypeList(tmpCondition, tmpPars)
 		if err != nil {
@@ -87,6 +103,13 @@ func (this *ReportController) GetDayWeekReportChapterTypeList() {
 					v.PauseEndTime = ``
 				}
 			}
+			if v.PauseStartTime == `0001-01-01` {
+				v.PauseStartTime = ``
+			}
+			if v.PauseEndTime == `0001-01-01` {
+				v.PauseEndTime = ``
+			}
+
 			dayList = append(dayList, v)
 		}
 	}
@@ -96,8 +119,8 @@ func (this *ReportController) GetDayWeekReportChapterTypeList() {
 		tmpCondition := condition
 		tmpPars := pars
 		// 报告类型
-		tmpCondition += ` AND research_type = ? `
-		tmpPars = append(tmpPars, "week")
+		tmpCondition += ` AND report_classify_id = ? `
+		tmpPars = append(tmpPars, weekClassifyId)
 
 		list, err := models.GetAllReportChapterTypeList(tmpCondition, tmpPars)
 		if err != nil {
@@ -115,6 +138,13 @@ func (this *ReportController) GetDayWeekReportChapterTypeList() {
 					v.PauseEndTime = ``
 				}
 			}
+			if v.PauseStartTime == `0001-01-01` {
+				v.PauseStartTime = ``
+			}
+			if v.PauseEndTime == `0001-01-01` {
+				v.PauseEndTime = ``
+			}
+			
 			weekList = append(weekList, v)
 		}
 	}
@@ -196,8 +226,26 @@ func (this *ReportController) SetDayWeekReportUpdateRule() {
 		return
 	}
 
+	classifyIdKey := ``
+	switch researchType {
+	case "day":
+		classifyIdKey = `report_day_classify_id`
+	case "week":
+		classifyIdKey = `report_week_classify_id`
+	default:
+		br.Msg = "报告类型异常"
+		return
+	}
+	reportClassifyId, err := company.GetReportClassifyIdByConfigKey(classifyIdKey)
+	if err != nil {
+		br.Msg = "获取分类ID配置失败"
+		br.ErrMsg = "获取配置失败,key:" + classifyIdKey
+		br.IsSendEmail = false
+		return
+	}
+
 	// 设置章节类型的暂停时间
-	if err := models.SetDayWeekReportUpdateRule(researchType, req.List); err != nil {
+	if err := models.SetDayWeekReportUpdateRule(reportClassifyId, req.List); err != nil {
 		br.Msg = "设置暂停时间失败"
 		br.ErrMsg = "设置暂停时间失败, Err: " + err.Error()
 		return
@@ -205,7 +253,7 @@ func (this *ReportController) SetDayWeekReportUpdateRule() {
 	// 同步eta系统的章节更新配置
 	go func() {
 		ruleSyncReq := new(services.EditReportChapterTypeRuleSyncReq)
-		ruleSyncReq.ResearchType = researchType
+		ruleSyncReq.ReportClassifyId = reportClassifyId
 		_, _ = services.EditReportChapterTypeRuleSync(ruleSyncReq)
 	}()
 
@@ -301,24 +349,39 @@ func (this *ReportController) GetStopDayWeekReportChapterTypeList() {
 		return
 	}
 
+	dayClassifyId, err := company.GetReportClassifyIdByConfigKey("report_day_classify_id")
+	if err != nil {
+		br.Msg = "获取晨报ID配置失败"
+		br.ErrMsg = "获取配置失败"
+		br.IsSendEmail = false
+		return
+	}
+	weekClassifyId, err := company.GetReportClassifyIdByConfigKey("report_week_classify_id")
+	if err != nil {
+		br.Msg = "获取周报ID配置失败"
+		br.ErrMsg = "获取配置失败"
+		br.IsSendEmail = false
+		return
+	}
+
 	for _, v := range stopList {
-		if v.ResearchType == "day" {
+		if v.ReportClassifyId == dayClassifyId {
 			stopDay = append(stopDay, v)
-		} else {
+		} else if v.ReportClassifyId == weekClassifyId {
 			stopWeek = append(stopWeek, v)
 		}
 	}
 
-	disableList, err := models.GetDisableUpdateReportChapterTypeListByResearchType()
+	disableList, err := models.GetDisableUpdateReportChapterTypeListByResearchTypeByClassifyIdList([]int{dayClassifyId, weekClassifyId})
 	if err != nil {
 		br.Msg = "获取停止更新报告章节类型列表失败"
 		br.ErrMsg = "获取停止更新报告章节类型列表失败, Err: " + err.Error()
 		return
 	}
 	for _, v := range disableList {
-		if v.ResearchType == "day" {
+		if v.ReportClassifyId == dayClassifyId {
 			disableDay = append(disableDay, v)
-		} else {
+		} else if v.ReportClassifyId == weekClassifyId {
 			disableWeek = append(disableWeek, v)
 		}
 	}

+ 6 - 7
controllers/report_chapter_type.go

@@ -15,7 +15,7 @@ type ReportChapterTypeController struct {
 // List
 // @Title 报告章节列表
 // @Description 报告章节列表
-// @Param   ReportType  query  string  true  "报告类型: day-晨报; week-周报"
+// @Param   ClassifyId  query  int  true  "所属分类id"
 // @Success 200 {object} models.ReportChapterTypePageListResp
 // @router /chapter_type/list [get]
 func (this *ReportChapterTypeController) List() {
@@ -32,16 +32,15 @@ func (this *ReportChapterTypeController) List() {
 		br.Ret = 408
 		return
 	}
-	reportType := this.GetString("ReportType")
-	typeArr := []string{utils.REPORT_TYPE_DAY, utils.REPORT_TYPE_WEEK}
-	if !utils.InArrayByStr(typeArr, reportType) {
-		br.Msg = "请选择报告类型"
+	classifyId, _ := this.GetInt("ClassifyId", 0)
+	if classifyId <= 0 {
+		br.Msg = "请选择分类"
 		return
 	}
 
-	cond := ` AND research_type = ?`
+	cond := ` AND report_classify_id = ?`
 	pars := make([]interface{}, 0)
-	pars = append(pars, reportType)
+	pars = append(pars, classifyId)
 	list, e := models.GetReportChapterTypePageList(cond, pars)
 	if e != nil {
 		br.Msg = "获取失败"

+ 75 - 16
controllers/roadshow/calendar.go

@@ -6,6 +6,7 @@ import (
 	"github.com/rdlucklib/rdluck_tools/paging"
 	"hongze/hz_crm_api/controllers"
 	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/company"
 	"hongze/hz_crm_api/models/cygx"
 	"hongze/hz_crm_api/models/roadshow"
 	"hongze/hz_crm_api/models/system"
@@ -70,6 +71,18 @@ func (this *CalendarController) Add() {
 
 	researcherMap := make(map[int]string)
 	var checkIsAdd []string
+
+	//获取所有自定义的权益研究员
+	sysUserList, err := cygx.GetAskEmailList()
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,GetAskEmailList Err: " + err.Error()
+		return
+	}
+	raiAskadminMap := make(map[int]bool, 0)
+	for _, v := range sysUserList {
+		raiAskadminMap[v.AdminId] = true
+	}
 	//var tipMsg string
 	for _, v := range req.ResearcherList {
 		if v.ResearcherId <= 0 {
@@ -106,6 +119,11 @@ func (this *CalendarController) Add() {
 			return
 		}
 
+		if req.ActivityType == "沙龙" && !raiAskadminMap[v.ResearcherId] {
+			br.Msg = "ficc研究员暂不支持添加沙龙"
+			return
+		}
+
 		startDateTime := v.StartDate + " " + v.StartTime
 		endDateTime := v.EndDate + " " + v.EndTime
 
@@ -174,16 +192,6 @@ func (this *CalendarController) Add() {
 		br.IsSendEmail = false
 		return
 	}
-	sysUserList, err := cygx.GetAskEmailList()
-	if err != nil {
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取失败,GetAskEmailList Err: " + err.Error()
-		return
-	}
-	raiAskadminMap := make(map[int]bool, 0)
-	for _, v := range sysUserList {
-		raiAskadminMap[v.AdminId] = true
-	}
 
 	rsCalendar := new(roadshow.RsCalendar)
 	rsCalendar.SysUserId = sysUser.AdminId
@@ -1180,7 +1188,7 @@ func (this *CalendarController) CalendarList() {
 	}
 	if calendarType == 2 {
 		condition += ` AND b.status>=2`
-		condition += ` AND a.activity_type IN('路演','公开会议') `
+		condition += ` AND a.activity_type IN('路演','公开会议','沙龙') `
 	}
 	if calendarType == 3 {
 		condition += ` AND a.activity_type='内部会议' `
@@ -1276,7 +1284,7 @@ func (this *CalendarController) CalendarList() {
 			}
 		}
 		//如果是已结束的权益销售添加的活动,就行进行按钮展示
-		if mapRaiSllerId[dataList[i].SysUserId] && utils.InArrayByInt([]int{2, 6}, dataList[i].Status) {
+		if mapRaiSllerId[dataList[i].SysUserId] && utils.InArrayByInt([]int{2, 6}, dataList[i].Status) && dataList[i].ActivityType != "沙龙" {
 			if mapMeetingCount[dataList[i].RsCalendarId] == 0 {
 				dataList[i].SubmitButton = true
 			} else {
@@ -2262,7 +2270,8 @@ func (this *CalendarController) ResearcherCalendarDetail() {
 		br.Msg = "研究员异常"
 		return
 	}
-	go roadshowService.SyncCalendarFromShanghai(researcherInfo.Mobile, startDate, endDate)
+	//go roadshowService.SyncCalendarFromShanghai(researcherInfo.Mobile, startDate, endDate)
+	go roadshowService.InsertSyncCalendarFromShanghaiLPush(researcherInfo.Mobile, startDate, endDate)
 
 	condition += ` AND b.start_date>=?`
 	pars = append(pars, startDate)
@@ -2288,8 +2297,57 @@ func (this *CalendarController) ResearcherCalendarDetail() {
 
 	if calendarList == nil {
 		calendarList = make([]*roadshow.CalendarListView, 0)
-	}
+	} else {
+		var sysUserIds []int             //建会人ID
+		var companyIds []int             //公司ID
+		for _, v := range calendarList { //上海同步过来信息展示逻辑替换 需求池 953
+			if v.Source == 1 && v.CompanyName == "" {
+				v.CompanyName = v.Title
+			}
+			if v.SysUserId > 0 {
+				sysUserIds = append(sysUserIds, v.SysUserId)
+			}
+			if v.CompanyId > 1 {
+				companyIds = append(companyIds, v.CompanyId)
+			}
+		}
+
+		//如果是权益销售建的会,客户状态替换成权益那边的
+		mapSellRai := make(map[int]bool)  // 是否是权益销售
+		mapStatus := make(map[int]string) //权益客户对应的状态
+		if len(sysUserIds) > 0 && len(companyIds) > 0 {
+			//判断哪些人是权益销售
+			adminList, err := system.GetAdminListByIdListWithoutEnable(sysUserIds)
+			if err != nil {
+				br.Msg = "获取数据失败"
+				br.ErrMsg = "获取数据失败,GetAdminListByIdListWithoutEnable Err:" + err.Error()
+				return
+			}
+			for _, v := range adminList {
+				if v.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER || v.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP {
+					mapSellRai[v.AdminId] = true
+				}
+			}
 
+			conditionProduct := `  AND company_id  IN (` + utils.GetOrmInReplace(len(companyIds)) + `) AND  product_id = 2 `
+			parsProduct := make([]interface{}, 0)
+			parsProduct = append(parsProduct, companyIds)
+			productList, err := company.GetCompanyProductList(conditionProduct, parsProduct)
+			if err != nil {
+				br.Msg = "获取数据失败"
+				br.ErrMsg = "获取数据失败,GetCompanyProductList Err:" + err.Error()
+				return
+			}
+			for _, v := range productList {
+				mapStatus[v.CompanyId] = v.Status
+			}
+		}
+		for _, v := range calendarList {
+			if mapSellRai[v.SysUserId] && mapStatus[v.CompanyId] != "" {
+				v.CompanyStatus = mapStatus[v.CompanyId]
+			}
+		}
+	}
 	if matterList == nil {
 		matterList = make([]*roadshow.RsMatters, 0)
 	}
@@ -2359,7 +2417,8 @@ func (this *CalendarController) MyCalendarDetail() {
 			br.Msg = "研究员异常"
 			return
 		}
-		go roadshowService.SyncCalendarFromShanghai(researcherInfo.Mobile, startDate, endDate)
+		//go roadshowService.SyncCalendarFromShanghai(researcherInfo.Mobile, startDate, endDate)
+		go roadshowService.InsertSyncCalendarFromShanghaiLPush(researcherInfo.Mobile, startDate, endDate)
 	}
 
 	//中级/普通/admin 管理员
@@ -2488,7 +2547,7 @@ func getTitle(activityType, roadshowType, activityCategory, roadshowPlatform, pr
 	switch activityType {
 	case "内部会议":
 		title = "内部会议"
-	case "公开会议", "路演":
+	case "公开会议", "路演", "沙龙":
 		if roadshowType == "线上" {
 			title = roadshowType + activityType + roadshowPlatform
 		} else {

+ 132 - 33
controllers/roadshow/calendar_meeting_user.go

@@ -2,9 +2,12 @@ package roadshow
 
 import (
 	"encoding/json"
+	"fmt"
 	"hongze/hz_crm_api/controllers"
 	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/cygx"
 	"hongze/hz_crm_api/models/roadshow"
+	"hongze/hz_crm_api/utils"
 	"strconv"
 	"strings"
 	"time"
@@ -45,49 +48,67 @@ func (this *CalendarMeetingUserController) Add() {
 
 	rsCalendarId := req.RsCalendarId
 	userIds := req.UserId
+	tagList := req.TagList
 
 	if rsCalendarId == 0 {
 		br.Msg = "路演信息错误!"
 		return
 	}
-	if len(userIds) == 0 {
-		br.Msg = "参会人不能为空!"
-		return
-	}
-	var userIdsStr []string
-	for _, v := range userIds {
-		userIdsStr = append(userIdsStr, strconv.Itoa(v))
-	}
 
-	listUser, err := models.GetWxUserListByUserIdsHaveCompany(strings.Join(userIdsStr, ","))
+	var itemsGroup []*roadshow.RsCalendarMeetingLabelGroup
+	for _, v := range tagList {
+		itemGroup := new(roadshow.RsCalendarMeetingLabelGroup)
+		itemGroup.RsCalendarId = rsCalendarId
+		itemGroup.TagType = v.TagType
+		itemGroup.TagId = v.TagId
+		itemGroup.AdminId = sysUser.AdminId
+		itemGroup.AdminName = sysUser.RealName
+		itemGroup.CreateTime = time.Now()
+		itemGroup.ModifyTime = time.Now()
+		itemsGroup = append(itemsGroup, itemGroup)
+	}
+	err = roadshow.AddRsCalendarMeetingLabelGroupMulti(itemsGroup, rsCalendarId)
 	if err != nil {
-		br.Msg = "获取用户信息失败!"
-		br.ErrMsg = "获取用户信息失败-GetWxUserListByUserIdsHaveCompany!Err:" + err.Error()
+		br.Msg = "获取信息失败!"
+		br.ErrMsg = "获取信息失败-AddRsCalendarMeetingLabelGroupMulti!Err:" + err.Error()
 		return
 	}
 
-	var items []*roadshow.RsCalendarMeetingUser
-	for _, v := range listUser {
-		item := new(roadshow.RsCalendarMeetingUser)
-		item.RsCalendarId = rsCalendarId
-		item.UserId = v.UserId
-		item.Mobile = v.Mobile
-		item.Email = v.Email
-		item.CompanyId = v.CompanyId
-		item.CompanyName = v.CompanyName
-		item.RealName = v.RealName
-		item.Position = v.Position
-		item.AdminId = sysUser.AdminId
-		item.AdminName = sysUser.RealName
-		item.CreateTime = time.Now()
-		item.ModifyTime = time.Now()
-		items = append(items, item)
-	}
-	err = roadshow.MultiAddRsCalendarMeetingUser(items)
-	if err != nil {
-		br.Msg = "操作失败!"
-		br.ErrMsg = "操作失败-MultiAddRsCalendarMeetingUser!Err:" + err.Error()
-		return
+	if len(userIds) > 0 {
+		var userIdsStr []string
+		for _, v := range userIds {
+			userIdsStr = append(userIdsStr, strconv.Itoa(v))
+		}
+		listUser, err := models.GetWxUserListByUserIdsHaveCompany(strings.Join(userIdsStr, ","))
+		if err != nil {
+			br.Msg = "获取用户信息失败!"
+			br.ErrMsg = "获取用户信息失败-GetWxUserListByUserIdsHaveCompany!Err:" + err.Error()
+			return
+		}
+
+		var items []*roadshow.RsCalendarMeetingUser
+		for _, v := range listUser {
+			item := new(roadshow.RsCalendarMeetingUser)
+			item.RsCalendarId = rsCalendarId
+			item.UserId = v.UserId
+			item.Mobile = v.Mobile
+			item.Email = v.Email
+			item.CompanyId = v.CompanyId
+			item.CompanyName = v.CompanyName
+			item.RealName = v.RealName
+			item.Position = v.Position
+			item.AdminId = sysUser.AdminId
+			item.AdminName = sysUser.RealName
+			item.CreateTime = time.Now()
+			item.ModifyTime = time.Now()
+			items = append(items, item)
+		}
+		err = roadshow.MultiAddRsCalendarMeetingUser(items)
+		if err != nil {
+			br.Msg = "操作失败!"
+			br.ErrMsg = "操作失败-MultiAddRsCalendarMeetingUser!Err:" + err.Error()
+			return
+		}
 	}
 	br.Ret = 200
 	br.Success = true
@@ -123,10 +144,88 @@ func (this *CalendarMeetingUserController) List() {
 		br.ErrMsg = "操作失败-GetRsCalendarMeetingUserListByRsCalendarId!Err:" + err.Error()
 		return
 	}
+	totalGroup, err := roadshow.GetRsCalendarMeetingLabelGroupByRsCalendarId(rsCalendarId)
+	if err != nil {
+		br.Msg = "获取信息失败!"
+		br.ErrMsg = "获取用户信息失败-GetRsCalendarMeetingLabelGroupByRsCalendarId!Err:" + err.Error()
+		return
+	}
+
+	var lebelDetail []*cygx.RaiServeTagResp
+	if totalGroup > 0 {
+		listGroup, err := roadshow.GetRsCalendarMeetingLabelGroupListByRsCalendarId(rsCalendarId)
+		if err != nil {
+			br.Msg = "获取信息失败!"
+			br.ErrMsg = "获取用户信息失败-GetRsCalendarMeetingLabelGroupListByRsCalendarId!Err:" + err.Error()
+			return
+		}
+
+		var industrialManagementIds []int
+		var industrialSubjectIds []int
+
+		mapindustrialManagementName := make(map[int]string)
+		mapindustrialSubjectName := make(map[int]string)
+		mapCelueName := make(map[int]string)
+		for _, v := range listGroup {
+			switch v.TagType {
+			case 1:
+				industrialManagementIds = append(industrialManagementIds, v.TagId)
+			case 2:
+				industrialSubjectIds = append(industrialSubjectIds, v.TagId)
+			case 3:
+				mapCelueName[v.TagId] = "策略"
+			}
+		}
+
+		if len(industrialManagementIds) > 0 {
+			IndustryList, err := cygx.GetIndustryListByConditionByIds(industrialManagementIds)
+			if err != nil {
+				br.Msg = "获取信息失败!"
+				br.ErrMsg = "获取用户信息失败-GetIndustryListByConditionByIds!Err:" + err.Error()
+				return
+			}
+
+			for _, v := range IndustryList {
+				mapindustrialManagementName[v.IndustrialManagementId] = v.IndustryName
+			}
+		}
+
+		if len(industrialSubjectIds) > 0 {
+			SubjectList, err := cygx.GetIndustrialSubjectDetailByIds(industrialSubjectIds)
+			if err != nil {
+				br.Msg = "获取信息失败!"
+				br.ErrMsg = "获取用户信息失败-GetIndustryListByConditionByIds!Err:" + err.Error()
+				return
+			}
+			for _, v := range SubjectList {
+				mapindustrialSubjectName[v.IndustrialSubjectId] = v.SubjectName
+			}
+		}
+
+		for _, v := range listGroup {
+			item := new(cygx.RaiServeTagResp)
+			item.TagType = v.TagType
+			item.TagId = v.TagId
+			item.Md5Key = utils.MD5(fmt.Sprintf("K_", v.TagType, "V_", v.TagId))
+			switch v.TagType {
+			case 1:
+				item.TagName = mapindustrialManagementName[v.TagId]
+			case 2:
+				item.TagName = mapindustrialSubjectName[v.TagId]
+			case 3:
+				item.TagName = mapCelueName[v.TagId]
+			}
+			lebelDetail = append(lebelDetail, item)
+		}
+	}
 	if len(list) == 0 {
 		list = make([]*roadshow.RsCalendarMeetingUserResp, 0)
 	}
+	if len(lebelDetail) == 0 {
+		lebelDetail = make([]*cygx.RaiServeTagResp, 0)
+	}
 	resp.List = list
+	resp.ListLebel = lebelDetail
 	br.Ret = 200
 	br.Success = true
 	br.Data = resp

+ 8 - 1
controllers/roadshow/company.go

@@ -33,7 +33,14 @@ func (this *CalendarController) CompanySearch() {
 		return
 	}
 	KeyWord = "%" + KeyWord + "%"
-	list, err := roadshow.CompanySearchV2(sysUser.AdminId, KeyWord)
+	var groupId int
+	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_GROUP || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP {
+		groupId = sysUser.GroupId
+	} else {
+		groupId = -1
+	}
+
+	list, err := roadshow.CompanySearchV2(sysUser.AdminId, groupId, KeyWord)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "搜索客户失败!"
 		br.ErrMsg = "搜索客户失败!Err:" + err.Error()

+ 115 - 53
controllers/yb/road_video.go

@@ -11,7 +11,6 @@ import (
 	"hongze/hz_crm_api/services"
 	"hongze/hz_crm_api/services/yb"
 	"hongze/hz_crm_api/utils"
-	"sort"
 	"strings"
 	"time"
 )
@@ -421,55 +420,64 @@ func (r *RoadVideoController) TwoWeekClassifyList() {
 	}
 
 	// 2023-04-19 取classify表relate_video=1的二级分类, 但是需要分层级, 所以对应的一级分类也要组合起来
-	list, e := models.GetAllClassify()
+	list, e := models.GetAllClassifyByRelateVideo()
 	if e != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取路演视频可选报告分类失败, Err: " + e.Error()
 		return
 	}
-	resp := make([]*models.SimpleClassifyList, 0)
-	parentMap := make(map[int]*models.SimpleClassifyList)
-	classifyMap := make(map[int]*models.Classify)
-	for _, c := range list {
-		classifyMap[c.Id] = c
-		if c.ParentId > 0 && c.RelateVideo == 1 {
-			if parentMap[c.ParentId] == nil {
-				parentMap[c.ParentId] = new(models.SimpleClassifyList)
+
+	// 获取父级的分类
+	{
+		idMap := make(map[int]bool)
+
+		currParentClassifyIdList := make([]int, 0)
+		for _, v := range list {
+			idMap[v.Id] = true
+			if v.ParentId > 0 {
+				currParentClassifyIdList = append(currParentClassifyIdList, v.ParentId)
 			}
 		}
-	}
-	for k, v := range parentMap {
-		p := classifyMap[k]
-		if p == nil {
-			continue
+
+		findList := list
+		list = make([]*models.Classify, 0)
+
+		tmpList, tmpErr := services.GetParentClassifyListByParentIdList(currParentClassifyIdList)
+		if tmpErr != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取上级分类信息失败,Err:" + tmpErr.Error()
+			return
 		}
-		v.Id = p.Id
-		v.ClassifyName = p.ClassifyName
-		v.Sort = p.Sort
-		v.Child = make([]*models.SimpleClassifyList, 0)
-		for _, c := range list {
-			if c.ParentId == v.Id && c.RelateVideo == 1 {
-				v.Child = append(v.Child, &models.SimpleClassifyList{
-					Id:           c.Id,
-					ClassifyName: c.ClassifyName,
-					ParentId:     c.ParentId,
-					Sort:         c.Sort,
-				})
+		for _, v := range tmpList {
+			if _, ok := idMap[v.Id]; !ok {
+				list = append(list, v)
 			}
 		}
-		sort.Slice(v.Child, func(i, j int) bool {
-			return v.Child[j].Sort > v.Child[i].Sort
+
+		list = append(list, findList...)
+	}
+
+	allList := make([]*models.SimpleClassifyList, 0)
+	for _, v := range list {
+		allList = append(allList, &models.SimpleClassifyList{
+			Id:           v.Id,
+			ClassifyName: v.ClassifyName,
+			ParentId:     v.ParentId,
+			Sort:         v.Sort,
+			CreateTime:   v.CreateTime,
+			Child:        make([]*models.SimpleClassifyList, 0),
 		})
-		resp = append(resp, v)
 	}
-	sort.Slice(resp, func(i, j int) bool {
-		return resp[j].Sort > resp[i].Sort
-	})
+
+	// 先将分类列表排序
+	services.SortClassifyListBySortAndCreateTime(allList)
+	// 接着转换结构
+	allList = services.GetClassifyListTreeRecursive(allList, 0)
 
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"
-	br.Data = resp
+	br.Data = allList
 }
 
 // SimpleReportList
@@ -498,7 +506,8 @@ func (r *RoadVideoController) SimpleReportList() {
 	classifyIdSecond, _ := r.GetInt("ClassifyIdSecond", 0)
 	if classifyIdSecond <= 0 {
 		// 2023-03-03 直接取classify表relate_video=1的二级分类下的报告
-		classifyCond := ` AND parent_id > 0 AND relate_video = 1`
+		//classifyCond := ` AND parent_id > 0 AND relate_video = 1`
+		classifyCond := ` AND relate_video = 1`
 		classifyPars := make([]interface{}, 0)
 		classifyList, e := models.GetClassifyByCondition(classifyCond, "", classifyPars)
 		if e != nil {
@@ -506,28 +515,68 @@ func (r *RoadVideoController) SimpleReportList() {
 			br.ErrMsg = "获取路演视频可选报告分类失败, Err: " + e.Error()
 			return
 		}
-		classifyIds := make([]int, 0)
+		var hasChild bool
+		firstClassifyIds := make([]int, 0)
+		secondClassifyIds := make([]int, 0)
+		thirdClassifyIds := make([]int, 0)
 		for _, c := range classifyList {
-			classifyIds = append(classifyIds, c.Id)
+			switch c.Level {
+			case 1:
+				firstClassifyIds = append(firstClassifyIds, c.Id)
+				hasChild = true
+			case 2:
+				secondClassifyIds = append(secondClassifyIds, c.Id)
+				hasChild = true
+			case 3:
+				thirdClassifyIds = append(thirdClassifyIds, c.Id)
+				hasChild = true
+			}
 		}
-		if len(classifyIds) > 0 {
-			cond += ` AND classify_id_second IN ( ` + utils.GetOrmInReplace(len(classifyIds)) + ` ) `
-			pars = append(pars, classifyIds)
+		if hasChild {
+			classifyCondList := make([]string, 0)
+			if len(firstClassifyIds) > 0 {
+				classifyCondList = append(classifyCondList, ` classify_id_first IN ( `+utils.GetOrmInReplace(len(firstClassifyIds))+` ) `)
+				pars = append(pars, firstClassifyIds)
+			}
+			if len(secondClassifyIds) > 0 {
+				classifyCondList = append(classifyCondList, ` classify_id_second IN ( `+utils.GetOrmInReplace(len(secondClassifyIds))+` ) `)
+				pars = append(pars, secondClassifyIds)
+			}
+			if len(thirdClassifyIds) > 0 {
+				classifyCondList = append(classifyCondList, ` classify_id_third IN ( `+utils.GetOrmInReplace(len(thirdClassifyIds))+` ) `)
+				pars = append(pars, thirdClassifyIds)
+			}
+			cond += fmt.Sprintf(` AND (%s) `, strings.Join(classifyCondList, " OR "))
 		} else {
 			cond += ` AND 1 = 2`
 		}
+	} else {
+		classifyItem, err := models.GetClassifyById(classifyIdSecond)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取分类失败, Err: " + err.Error()
+			return
+		}
+		switch classifyItem.Level {
+		case 1:
+			cond += ` AND classify_id_first = ? `
+			pars = append(pars, classifyIdSecond)
+		case 2:
+			cond += ` AND classify_id_second = ? `
+			pars = append(pars, classifyIdSecond)
+		case 3:
+			cond += ` AND classify_id_third = ? `
+			pars = append(pars, classifyIdSecond)
+		}
 	}
-	if classifyIdSecond > 0 {
-		cond += ` AND classify_id_second = ? `
-		pars = append(pars, classifyIdSecond)
-	}
+
 	keyword := r.GetString("Keyword", "")
 	if keyword != "" {
 		kw := fmt.Sprint("%", keyword, "%")
 		cond += ` AND title LIKE ?`
 		pars = append(pars, kw)
 	}
-	fieldArr := []string{"id", "classify_id_second", "title", "publish_time"}
+	fieldArr := []string{"id", "classify_id_first", "classify_id_second", "classify_id_third", "title", "publish_time"}
 	orderRule := ` ORDER BY publish_time DESC, id DESC`
 	reports, e := models.GetReportByCondition(cond, pars, fieldArr, orderRule, true, 0, 5)
 	if e != nil {
@@ -541,10 +590,16 @@ func (r *RoadVideoController) SimpleReportList() {
 	{
 		classifyIds := make([]int, 0)
 		for _, v := range reports {
-			if utils.InArrayByInt(classifyIds, v.ClassifyIdSecond) {
+			minClassifyId, _, e := services.GetMinClassify(v)
+			if e != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取报告的最小分类失败, Err: " + e.Error()
+				return
+			}
+			if utils.InArrayByInt(classifyIds, minClassifyId) {
 				continue
 			}
-			classifyIds = append(classifyIds, v.ClassifyIdSecond)
+			classifyIds = append(classifyIds, minClassifyId)
 		}
 		if len(classifyIds) > 0 {
 			classifyIdsPermissions, e := models.GetPermissionsByClassifyIds(classifyIds)
@@ -588,13 +643,20 @@ func (r *RoadVideoController) SimpleReportList() {
 		}
 
 		for i := range reports {
+			tmpReport := reports[i]
+			minClassifyId, _, e := services.GetMinClassify(tmpReport)
+			if e != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取报告的最小分类失败, Err: " + e.Error()
+				return
+			}
 			respList = append(respList, &SimpleReportListResp{
-				ReportId:       reports[i].Id,
-				Title:          reports[i].Title,
-				PublishTime:    reports[i].PublishTime.Format(utils.FormatDateTime),
-				BindVideo:      bindMap[reports[i].Id],
-				BindVideoTitle: bindTitleMap[reports[i].Id],
-				PermissionIds:  classifyPermissions[reports[i].ClassifyIdSecond],
+				ReportId:       tmpReport.Id,
+				Title:          tmpReport.Title,
+				PublishTime:    tmpReport.PublishTime.Format(utils.FormatDateTime),
+				BindVideo:      bindMap[tmpReport.Id],
+				BindVideoTitle: bindTitleMap[tmpReport.Id],
+				PermissionIds:  classifyPermissions[minClassifyId],
 			})
 		}
 	}

+ 4 - 0
go.sum

@@ -392,6 +392,8 @@ github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXc
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
@@ -399,7 +401,9 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5
 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
 github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
 github.com/syndtr/goleveldb v0.0.0-20160425020131-cfa635847112/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
 github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
 github.com/tealeg/xlsx v1.0.5 h1:+f8oFmvY8Gw1iUXzPk+kz+4GpbDZPK1FhPiQRd+ypgE=

+ 25 - 0
models/chart_permission.go

@@ -156,6 +156,20 @@ func GetChartPermissionByNames(permissionNames []string) (list []*ChartPermissio
 	return
 }
 
+func GetChartPermissionByNamesByRai(permissionNames []string) (list []*ChartPermission, err error) {
+	qb, _ := orm.NewQueryBuilder("mysql")
+	// 构建查询对象
+	qb.Select("*").From("chart_permission").
+		Where("parent_id > 0 AND  product_id = 2 and chart_permission_name").In(permissionNames...)
+	// 导出 SQL 语句
+	sql := qb.String()
+
+	// 执行 SQL 语句
+	o := orm.NewOrm()
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
 // GetChartPermissionList 获取品种权限列表
 func GetChartPermissionList() (list []*ChartPermission, err error) {
 	o := orm.NewOrm()
@@ -178,3 +192,14 @@ func GetChartPermissionListRaiSubjectivity() (items []*ChartPermission, err erro
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
+
+func GetChartPermissionListByCondition(condition string, pars []interface{}) (items []*ChartPermission, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM chart_permission WHERE  parent_id > 0 `
+	if condition != `` {
+		sql += condition
+	}
+	sql += `  ORDER BY sort ASC `
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}

+ 107 - 37
models/classify.go

@@ -7,38 +7,41 @@ import (
 )
 
 type Classify struct {
-	Id                int       `orm:"column(id);pk"`
-	ClassifyName      string    `description:"分类名称"`
-	Sort              int       `json:"-"`
-	ParentId          int       `description:"父级分类id"`
-	CreateTime        time.Time `description:"创建时间"`
-	ModifyTime        time.Time `description:"修改时间"`
-	Abstract          string    `description:"栏目简介"`
-	Descript          string    `description:"分享描述"`
-	ReportAuthor      string    `description:"栏目作者"`
-	AuthorDescript    string    `description:"作者简介"`
-	ColumnImgUrl      string    `description:"栏目配图"`
-	HeadImgUrl        string    `description:"头部banner"`
-	AvatarImgUrl      string    `description:"头像"`
-	ReportImgUrl      string    `description:"报告配图"`
-	HomeImgUrl        string    `description:"首页配图"`
-	ClassifyLabel     string    `description:"分类标签"`
-	ShowType          int       `description:"展示类型:1-列表 2-专栏"`
-	HasTeleconference int       `description:"是否有电话会:0-否 1-是"`
-	VipTitle          string    `description:"研究员头衔"`
-	IsShow            int       `description:"是否在小程序显示:1-显示 0-隐藏"`
-	YbFiccSort        int       `description:"小程序FICC页排序"`
-	YbFiccIcon        string    `description:"小程序FICC页icon"`
-	YbFiccPcIcon      string    `description:"小程序PC端FICC页背景图"`
-	YbIconUrl         string    `description:"小程序已购页icon"`
-	YbBgUrl           string    `description:"小程序已购详情背景图"`
-	YbListImg         string    `description:"小程序研报列表封面图"`
-	YbShareBgImg      string    `description:"小程序研报详情分享背景图"`
-	YbRightBanner     string    `description:"Pc端详情页,右侧,报告合集背景图"`
-	RelateTel         int       `description:"是否在电话会中可选: 0-否; 1-是"`
-	RelateVideo       int       `description:"是否在路演视频中可选: 0-否; 1-是"`
-	IsMassSend        int       `description:"1:群发,0:非群发"`
-	Enabled           int       `description:"是否可用,1可用,0禁用"`
+	Id                   int       `orm:"column(id);pk"`
+	ClassifyName         string    `description:"分类名称"`
+	Sort                 int       `json:"-"`
+	ParentId             int       `description:"父级分类id"`
+	CreateTime           time.Time `description:"创建时间"`
+	ModifyTime           time.Time `description:"修改时间"`
+	Abstract             string    `description:"栏目简介"`
+	Descript             string    `description:"分享描述"`
+	ReportAuthor         string    `description:"栏目作者"`
+	AuthorDescript       string    `description:"作者简介"`
+	ColumnImgUrl         string    `description:"栏目配图"`
+	HeadImgUrl           string    `description:"头部banner"`
+	AvatarImgUrl         string    `description:"头像"`
+	ReportImgUrl         string    `description:"报告配图"`
+	HomeImgUrl           string    `description:"首页配图"`
+	ClassifyLabel        string    `description:"分类标签"`
+	ShowType             int       `description:"展示类型:1-列表 2-专栏"`
+	HasTeleconference    int       `description:"是否有电话会:0-否 1-是"`
+	VipTitle             string    `description:"研究员头衔"`
+	IsShow               int       `description:"是否在小程序显示:1-显示 0-隐藏"`
+	YbFiccSort           int       `description:"小程序FICC页排序"`
+	YbFiccIcon           string    `description:"小程序FICC页icon"`
+	YbFiccPcIcon         string    `description:"小程序PC端FICC页背景图"`
+	YbIconUrl            string    `description:"小程序已购页icon"`
+	YbBgUrl              string    `description:"小程序已购详情背景图"`
+	YbListImg            string    `description:"小程序研报列表封面图"`
+	YbShareBgImg         string    `description:"小程序研报详情分享背景图"`
+	YbRightBanner        string    `description:"Pc端详情页,右侧,报告合集背景图"`
+	RelateTel            int       `description:"是否在电话会中可选: 0-否; 1-是"`
+	RelateVideo          int       `description:"是否在路演视频中可选: 0-否; 1-是"`
+	IsMassSend           int       `description:"1:群发,0:非群发"`
+	Enabled              int       `description:"是否可用,1可用,0禁用"`
+	Level                int       `description:"层级"`
+	HasChild             int       `description:"是否有子级别,0:下面没有子分类,1:下面有子分类;默认:0"`
+	ReportDetailShowType int       `description:"报告详情的展示类型:1-拼接;2:目录"`
 }
 
 func GetClassifyById(classifyId int) (item *Classify, err error) {
@@ -83,7 +86,39 @@ type ClassifyItem struct {
 }
 
 type ClassifyListResp struct {
-	List []*ClassifyList
+	List []*ClassifyListV2
+}
+type ClassifyListV2 struct {
+	Id                    int               `orm:"column(id);pk"`
+	ClassifyName          string            `description:"分类名称"`
+	Sort                  int               `description:"排序"`
+	ParentId              int               `description:"父级分类id"`
+	CreateTime            time.Time         `description:"创建时间"`
+	ModifyTime            time.Time         `description:"修改时间"`
+	Abstract              string            `description:"简介"`
+	Descript              string            `description:"描述"`
+	ClassifyLabel         string            `description:"分类标签"`
+	ShowType              int               `description:"展示类型:1-列表 2-专栏"`
+	HasTeleconference     int               `description:"是否有电话会:0-否 1-是"`
+	IsShow                int               `description:"是否在小程序显示:1-显示 0-隐藏"`
+	YbFiccSort            int               `description:"小程序FICC页排序"`
+	YbFiccIcon            string            `description:"小程序FICC页icon"`
+	YbFiccPcIcon          string            `description:"小程序PC端FICC页背景图"`
+	YbIconUrl             string            `description:"小程序已购页icon"`
+	YbBgUrl               string            `description:"小程序已购详情背景图"`
+	YbListImg             string            `description:"小程序研报列表封面图"`
+	YbShareBgImg          string            `description:"小程序研报详情分享背景图"`
+	YbRightBanner         string            `description:"Pc端详情页,右侧,报告合集背景图"`
+	RelateTel             int               `description:"是否在电话会中可选: 0-否; 1-是"`
+	RelateVideo           int               `description:"是否在路演视频中可选: 0-否; 1-是"`
+	Enabled               int               `description:"是否可用,1可用,0禁用"`
+	Child                 []*ClassifyListV2 `gorm:"-"`
+	ClassifyMenuId        int               `description:"二级分类-子目录ID"`
+	ClassifyMenuList      []*ClassifyMenu   `gorm:"-"`
+	ChartPermissionIdList []int             `description:"绑定的权限ID" gorm:"-"`
+	Level                 int               `description:"层级"`
+	HasChild              int               `description:"是否有子级别,0:下面没有子分类,1:下面有子分类;默认:0"`
+	ReportDetailShowType  int               `description:"报告详情的展示类型:1-拼接;2:目录"`
 }
 
 // 获取分类列表
@@ -178,10 +213,12 @@ func GetAllClassify() (list []*Classify, err error) {
 
 // SimpleClassifyList 简版分类列表
 type SimpleClassifyList struct {
-	Id           int    `description:"分类ID"`
-	ClassifyName string `description:"分类名称"`
-	ParentId     int    `description:"父级ID"`
-	Sort         int    `description:"排序"`
+	Id           int       `description:"分类ID"`
+	ClassifyName string    `description:"分类名称"`
+	ParentId     int       `description:"父级ID"`
+	Sort         int       `description:"排序"`
+	CreateTime   time.Time `description:"创建时间"`
+	Level        int       `description:"层级"`
 	Child        []*SimpleClassifyList
 }
 
@@ -200,3 +237,36 @@ func GetClassifyByCondition(condition, orderRule string, pars []interface{}) (it
 	_, err = o.Raw(sql, pars).QueryRows(&items)
 	return
 }
+
+// GetAllClassifyByRelateVideo
+// @Description: 获取关联视频的所有分类
+// @author: Roc
+// @datetime 2024-07-12 17:19:06
+// @return list []*Classify
+// @return err error
+func GetAllClassifyByRelateVideo() (list []*Classify, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := ` SELECT * FROM classify where relate_video = 1`
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+// GetClassifyListByParentIdList
+// @Description: 获取分类列表
+// @author: Roc
+// @datetime 2024-06-19 09:49:33
+// @param keyWord string
+// @param enabled int
+// @return items []*ClassifyList
+// @return err error
+func GetClassifyListByParentIdList(parentClassifyIdList []int) (items []*Classify, err error) {
+	num := len(parentClassifyIdList)
+	if num <= 0 {
+		return
+	}
+	sql := `SELECT * FROM classify WHERE id in (` + utils.GetOrmInReplace(num) + `) ORDER BY sort ASC, create_time ASC`
+
+	o := orm.NewOrmUsingDB("rddp")
+	_, err = o.Raw(sql, parentClassifyIdList).QueryRows(&items)
+	return
+}

+ 47 - 2
models/company/company_config.go

@@ -1,7 +1,10 @@
 package company
 
 import (
+	"encoding/json"
+	"errors"
 	"github.com/beego/beego/v2/client/orm"
+	"hongze/hz_crm_api/utils"
 )
 
 const (
@@ -9,11 +12,10 @@ const (
 )
 
 type CrmConfig struct {
-	ConfigCode   string `description:"详情Code"`
+	ConfigCode  string `description:"详情Code"`
 	ConfigValue string `description:"详情"`
 }
 
-
 func GetConfigValueByCode(configCode string) (total int, err error) {
 	o := orm.NewOrm()
 	sql := ` SELECT config_value FROM crm_config WHERE config_code=? `
@@ -29,9 +31,52 @@ func CrmConfigUpdate(newValue, configCode string) (err error) {
 	return
 }
 
+// ConfigClassifyId
+// @Description: 后台配置的报告id
+type ConfigClassifyId struct {
+	Debug   int `json:"debug"`
+	Release int `json:"release"`
+}
+
 func GetConfigDetailByCode(configCode string) (item CrmConfig, err error) {
 	o := orm.NewOrm()
 	sql := ` SELECT * FROM crm_config WHERE config_code=? `
 	err = o.Raw(sql, configCode).QueryRow(&item)
 	return
 }
+
+// GetReportClassifyIdByConfigKey
+// @Description: 获取关联的报告id
+// @author: Roc
+// @datetime 2024-06-18 14:10:27
+// @param configKey string
+// @return classifyId int
+// @return err error
+func GetReportClassifyIdByConfigKey(configKey string) (classifyId int, err error) {
+	// 别问为啥要从配置里拿=_=!
+	conf, e := GetConfigDetailByCode(configKey)
+	if e != nil {
+		err = errors.New("获取配置的id失败, Err: " + e.Error())
+		return
+	}
+	if conf.ConfigValue == "" {
+		err = errors.New("ID配置有误")
+		return
+	}
+	type TwoWeekIdConf struct {
+		Debug   []int
+		Release []int
+	}
+	classifyIdConf := new(ConfigClassifyId)
+	if e = json.Unmarshal([]byte(conf.ConfigValue), &classifyIdConf); e != nil {
+		err = errors.New("解析ID配置失败, Err: " + e.Error())
+		return
+	}
+	if utils.RunMode == "debug" {
+		classifyId = classifyIdConf.Debug
+	} else {
+		classifyId = classifyIdConf.Release
+	}
+
+	return
+}

+ 1 - 1
models/company/company_contract.go

@@ -310,7 +310,7 @@ func UpdateCompanyContractType(contractType string, companyContractId int) (err
 // GetLastContractListByEndDate 通过最近一份合同的日期获取早于该合同的最晚一份合同
 func GetLastContractListByEndDate(companyId, productId int, endDate string) (item *CompanyContract, err error) {
 	o := orm.NewOrm()
-	sql := "SELECT * FROM company_contract where company_id = ? AND product_id= ? end_date < ? AND status = 1 ORDER BY end_date desc"
+	sql := "SELECT * FROM company_contract where company_id = ? AND product_id= ? AND end_date < ? AND status = 1 ORDER BY end_date desc"
 	err = o.Raw(sql, companyId, productId, endDate).QueryRow(&item)
 	return
 }

+ 14 - 5
models/company/company_product.go

@@ -60,6 +60,7 @@ type CompanyProduct struct {
 	IsShare             int       `description:"0:非共享用户,1:共享客户"`
 	ShareSeller         string    `description:"共享销售员"`
 	ShareSellerId       int       `description:"共享销售员id"`
+	ShareGroupId        int       `description:"共享销售员所属分组ID"`
 }
 
 // 新增客户产品
@@ -646,12 +647,12 @@ type CompanyProductItem struct {
 // @param productId int
 // @return items []*CompanyProductItem
 // @return err error
-func GetCompanyProductItemByCompanyId(companyId int, productId int) (items *CompanyProductItem, err error) {
+func GetCompanyProductItemByCompanyId(companyId int, productId int) (item *CompanyProductItem, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT a.*,b.is_share,b.share_seller,b.share_seller_id FROM company_product as a 
          JOIN company b on a.company_id=b.company_id
          WHERE a.company_id = ? AND a.product_id = ? `
-	_, err = o.Raw(sql, companyId, productId).QueryRows(&items)
+	err = o.Raw(sql, companyId, productId).QueryRow(&item)
 
 	return
 }
@@ -677,9 +678,17 @@ func GetCompanyProductRaiForeverCount(companyId int) (count int, err error) {
 }
 
 // 根据共享销售id查被共享的公司销售id
-func GetCompanyProductSellerIdByShareSellerId(shareSellerId int) (sellerId int, err error) {
-	sqlCount := ` SELECT seller_id FROM company_product WHERE share_seller_id = ? AND product_id = 2 `
+func GetCompanyProductSellerIdByShareSellerId(shareSellerId int) (sellerIds string, err error) {
+	sqlCount := ` SELECT 	GROUP_CONCAT( DISTINCT seller_id SEPARATOR ',' ) AS seller_ids FROM company_product WHERE share_seller_id = ? AND product_id = 2 `
+	o := orm.NewOrm()
+	err = o.Raw(sqlCount, shareSellerId).QueryRow(&sellerIds)
+	return
+}
+
+// 更新被分享销售的所属组ID
+func UpdateSharGroupid(sharGroupid, shareSellerId int) (err error) {
 	o := orm.NewOrm()
-	err = o.Raw(sqlCount, shareSellerId).QueryRow(&sellerId)
+	sql := `UPDATE  company_product SET  share_group_id = ? WHERE  share_seller_id = ?`
+	_, err = o.Raw(sql, sharGroupid, shareSellerId).Exec()
 	return
 }

+ 15 - 0
models/cygx/activity_ask_email.go

@@ -20,6 +20,21 @@ func GetAskEmail() (item []*AskEmailRep, err error) {
 	return
 }
 
+// 判断研究员是不是策略行业的
+func GetAskEmailCountByCelue(adminId string) (count int, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_activity_ask_email  WHERE chart_permission_name  = '策略'  AND admin_id IN (` + adminId + `)  `
+	err = o.Raw(sqlCount).QueryRow(&count)
+	return
+}
+
+func GetAskEmailListByAdminIds(adminId string) (item []*AskEmailRep, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_activity_ask_email WHERE    chart_permission_name != ''  AND admin_id IN (` + adminId + `)  `
+	_, 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`

+ 94 - 2
models/cygx/article_and_yanxuan_record.go

@@ -26,7 +26,9 @@ type CygxArticleAndYanxuanRecordResp struct {
 // 获取数量
 func GetCygxArticleAndYanxuanRecordCount(condition string, pars []interface{}) (count int, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
-	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_article_and_yanxuan_record as r WHERE 1= 1  `
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_article_and_yanxuan_record as r
+                  INNER JOIN cygx_article  as art  ON  art.article_id = r.source_id 
+                  WHERE 1= 1  `
 	if condition != "" {
 		sqlCount += condition
 	}
@@ -39,6 +41,7 @@ func GetCygxArticleAndYanxuanRecordCountWeekly(condition string, pars []interfac
 	o := orm.NewOrmUsingDB("hz_cygx")
 	databaseName := utils.GetWeeklyDatabase()
 	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_article_and_yanxuan_record as r 
+                             INNER JOIN cygx_article  as art  ON  art.article_id = r.source_id
 				  INNER JOIN %s.user_seller_relation AS us ON us.user_id = r.user_id   AND us.product_id = 2 
 		WHERE 1= 1  `
 	sqlCount = fmt.Sprintf(sqlCount, databaseName)
@@ -52,7 +55,8 @@ func GetCygxArticleAndYanxuanRecordCountWeekly(condition string, pars []interfac
 // 列表
 func GetCygxArticleAndYanxuanRecordRespList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxArticleAndYanxuanRecordResp, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
-	sql := `SELECT * FROM cygx_article_and_yanxuan_record as r WHERE 1= 1 `
+	sql := `SELECT r.* ,art.title  FROM cygx_article_and_yanxuan_record as r 
+          INNER JOIN cygx_article  as art  ON  art.article_id = r.source_id  WHERE 1= 1 `
 	if condition != "" {
 		sql += condition
 	}
@@ -66,6 +70,7 @@ func GetCygxArticleAndYanxuanRecordRespListWeekly(condition string, pars []inter
 	o := orm.NewOrmUsingDB("hz_cygx")
 	databaseName := utils.GetWeeklyDatabase()
 	sql := `SELECT r.* FROM cygx_article_and_yanxuan_record as r 
+     		INNER JOIN cygx_article  as art  ON  art.article_id = r.source_id 
 			INNER JOIN %s.user_seller_relation AS us ON us.user_id = r.user_id   AND us.product_id = 2 
 		WHERE 1= 1   `
 	sql = fmt.Sprintf(sql, databaseName)
@@ -76,3 +81,90 @@ func GetCygxArticleAndYanxuanRecordRespListWeekly(condition string, pars []inter
 	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
 	return
 }
+
+// 获取研选专栏阅读数量
+func GetCygxYanxuanSpecialRecordCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sqlCount := ` SELECT COUNT(1) AS count  FROM 	cygx_yanxuan_special_record AS r
+			INNER JOIN cygx_yanxuan_special AS art ON art.id = r.yanxuan_special_id
+		WHERE 1 = 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+// 获取研选专栏阅读数量
+func GetCygxYanxuanSpecialRecordCountWeekly(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sqlCount := ` SELECT COUNT(1) AS count  FROM 	cygx_yanxuan_special_record AS r
+			INNER JOIN cygx_yanxuan_special AS art ON art.id = r.yanxuan_special_id
+			INNER JOIN %s.user_seller_relation AS us ON us.user_id = r.user_id   AND us.product_id = 2 
+		WHERE 1 = 1  `
+	databaseName := utils.GetWeeklyDatabase()
+	sqlCount = fmt.Sprintf(sqlCount, databaseName)
+	if condition != "" {
+		sqlCount += condition
+	}
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+// 收藏的专栏文章
+func GetCygxYanxuanSpecialCollectCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sqlCount := ` SELECT COUNT(1) AS count  FROM 	cygx_yanxuan_special_collect AS r
+			INNER JOIN cygx_yanxuan_special AS art ON art.id = r.yanxuan_special_id
+		WHERE 1 = 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+// 收藏的专栏文章
+func GetCygxYanxuanSpecialCollectCountWeekly(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sqlCount := ` SELECT COUNT(1) AS count  FROM 	cygx_yanxuan_special_collect AS r
+			INNER JOIN cygx_yanxuan_special AS art ON art.id = r.yanxuan_special_id
+			INNER JOIN %s.user_seller_relation AS us ON us.user_id = r.user_id   AND us.product_id = 2 
+		WHERE 1 = 1  `
+	databaseName := utils.GetWeeklyDatabase()
+	sqlCount = fmt.Sprintf(sqlCount, databaseName)
+	if condition != "" {
+		sqlCount += condition
+	}
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+// 关注的专栏作者
+func GetCygxYanxuanSpecialFollowCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sqlCount := ` SELECT COUNT(1) AS count  FROM 	cygx_yanxuan_special_follow AS r
+			INNER JOIN cygx_yanxuan_special_author AS art ON art.user_id = r.follow_user_id
+		WHERE 1 = 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+// 关注的专栏作者
+func GetCygxYanxuanSpecialFollowCountWeekly(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sqlCount := ` SELECT COUNT(1) AS count  FROM 	cygx_yanxuan_special_follow AS r
+			INNER JOIN cygx_yanxuan_special_author AS art ON art.user_id = r.follow_user_id
+			INNER JOIN %s.user_seller_relation AS us ON us.user_id = r.user_id   AND us.product_id = 2 
+		WHERE 1 = 1  `
+	databaseName := utils.GetWeeklyDatabase()
+	sqlCount = fmt.Sprintf(sqlCount, databaseName)
+	if condition != "" {
+		sqlCount += condition
+	}
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}

+ 290 - 35
models/cygx/cygx_user.go

@@ -1,6 +1,7 @@
 package cygx
 
 import (
+	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/rdlucklib/rdluck_tools/paging"
 	"hongze/hz_crm_api/models/company"
@@ -313,6 +314,7 @@ type UserInteraction struct {
 	NickName              string `description:"作者昵称"`
 	DepartmentId          int    `description:"作者ID "`
 	KeyWord               string `description:"关键词"`
+	LabelKeyWord          string `description:"标签关键词"`
 	Source                int    `description:"关键词来源;1:纪要、2:图表、3:纪要/图表、4:产业资源包、5:报告、6:活动、7:搜索关键词、8:专项产业调研、9音视频播放"`
 	ActivityName          string `description:"活动名称"`
 	ActivityType          int    `description:"1 线上,0、2线下"`
@@ -352,6 +354,7 @@ type UserInteraction struct {
 	IsEnd                 bool   `description:"是否最后一页,配合前端分页添加的参数"`
 	CurrentIndex          int    `description:"当前页页码,配合前端分页添加的参数"`
 	RegisterPlatform      int    `description:"来源 1小程序,2:网页 ,3:策略平台"`
+	RegisterPlatformText  string `description:"阅读来源(文本描述)"`
 	SourcePlatform        string `description:"来源 'MOBILE:移动端小程序','PC:PC端小程序','CELUE:上海策略平台','WEB:查研观向网页版'"`
 	TagId                 int
 	TagName               string // 标签名
@@ -360,6 +363,9 @@ type UserInteraction struct {
 	Industries            string // 产业
 	SubjectNames          string // 标的
 	SpecialType           int    `description:"专栏类型 1:笔记,2:观点"`
+	ArticleNum            int    // 已发布的文章数量
+	FansNum               int    // 粉丝数量
+	ResearcherName        string `description:"研究员姓名"`
 }
 
 // 查研观向图表
@@ -455,21 +461,58 @@ func GetCygxArticleHistoryRecordByUserNew(condition string, startSize, pageSize
 		1= 1
 			AND is_del = 0  ` + condition
 
-	sql += `  UNION ALL `
+	//sql += `  UNION ALL `
+	//sql += ` 	SELECT
+	//		art.title,
+	//		art.id AS article_id,
+	//		'' AS article_id_md5,
+	//		art.publish_time AS publish_date,
+	//		'' AS category_name,
+	//		r.create_time,
+	//		r.stop_time,
+	//		r.register_platform AS source_platform,
+	//		r.register_platform,
+	//		art.type AS special_type
+	//	FROM
+	//		cygx_yanxuan_special_record AS r
+	//		INNER JOIN cygx_yanxuan_special AS art ON art.id = r.yanxuan_special_id
+	//	WHERE 1 = 1 ` + condition
+
+	totalSql := `SELECT COUNT(1) total FROM (` + sql + `) z `
+	err = o.Raw(totalSql).QueryRow(&total)
+	if err != nil {
+		return
+	}
+
+	sql += ` ORDER BY create_time DESC, article_id DESC   `
+	if startSize > 0 || pageSize > 0 {
+		sql += ` LIMIT ` + strconv.Itoa(startSize) + "," + strconv.Itoa(pageSize)
+	}
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+// 用户阅读记录列表
+func GetCygxYanxuaSspecialHistoryRecordByUser(condition string, startSize, pageSize int) (total int, items []*UserInteraction, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	var sql string
 	sql += ` 	SELECT
 			art.title,
 			art.id AS article_id,
-			'' AS article_id_md5,
 			art.publish_time AS publish_date,
-			'' AS category_name,
 			r.create_time,
 			r.stop_time,
+			r.user_id,
+			r.mobile,
+			r.company_id,
+			r.company_name,
+			r.real_name,
 			r.register_platform AS source_platform,
-			r.register_platform,
-			art.type AS special_type
+			art.type AS special_type,
+			art.industry_tags as  industry_name
 		FROM
 			cygx_yanxuan_special_record AS r
-			INNER JOIN cygx_yanxuan_special AS art ON art.id = r.yanxuan_special_id 
+			INNER JOIN cygx_yanxuan_special AS art ON art.id = r.yanxuan_special_id
 		WHERE 1 = 1 ` + condition
 
 	totalSql := `SELECT COUNT(1) total FROM (` + sql + `) z `
@@ -486,10 +529,199 @@ func GetCygxArticleHistoryRecordByUserNew(condition string, startSize, pageSize
 	return
 }
 
+// 用户阅读记录列表
+func GetCygxYanxuaSspecialHistoryRecordByUserWeekly(condition string, startSize, pageSize int) (total int, items []*UserInteraction, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	var sql string
+	sql += ` 	SELECT
+			art.title,
+			art.id AS article_id,
+			art.publish_time AS publish_date,
+			r.create_time,
+			r.stop_time,
+			r.user_id,
+			r.mobile,
+			r.company_id,
+			r.company_name,
+			r.real_name,
+			r.register_platform AS source_platform,
+			art.type AS special_type,
+			art.industry_tags as  industry_name
+		FROM
+			cygx_yanxuan_special_record AS r
+			INNER JOIN cygx_yanxuan_special AS art ON art.id = r.yanxuan_special_id
+	    	INNER JOIN %s.user_seller_relation AS us ON us.user_id = r.user_id   AND us.product_id = 2
+		WHERE 1 = 1 ` + condition
+	databaseName := utils.GetWeeklyDatabase()
+	sql = fmt.Sprintf(sql, databaseName)
+	totalSql := `SELECT COUNT(1) total FROM (` + sql + `) z `
+	err = o.Raw(totalSql).QueryRow(&total)
+	if err != nil {
+		return
+	}
+
+	sql += ` ORDER BY create_time DESC, article_id DESC   `
+	if startSize > 0 || pageSize > 0 {
+		sql += ` LIMIT ` + strconv.Itoa(startSize) + "," + strconv.Itoa(pageSize)
+	}
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+// 用户阅读记录列表
+func GetCygxYanxuanSpecialCollectByUser(condition string, startSize, pageSize int) (total int, items []*UserInteraction, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	var sql string
+	sql += ` 	SELECT
+			art.title,
+			art.id AS article_id,
+			art.publish_time AS publish_date,
+			r.create_time,
+			r.user_id,
+			r.mobile,
+			r.company_id,
+			r.company_name,
+			r.real_name,
+			r.register_platform AS source_platform,
+			art.type AS special_type,
+			art.industry_tags as  industry_name
+		FROM
+			cygx_yanxuan_special_collect AS r
+			INNER JOIN cygx_yanxuan_special AS art ON art.id = r.yanxuan_special_id
+		WHERE 1 = 1 ` + condition
+
+	totalSql := `SELECT COUNT(1) total FROM (` + sql + `) z `
+	err = o.Raw(totalSql).QueryRow(&total)
+	if err != nil {
+		return
+	}
+
+	sql += ` ORDER BY create_time DESC, article_id DESC   `
+	if startSize > 0 || pageSize > 0 {
+		sql += ` LIMIT ` + strconv.Itoa(startSize) + "," + strconv.Itoa(pageSize)
+	}
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+// 用户阅读记录列表
+func GetCygxYanxuanSpecialCollectByUserWeekly(condition string, startSize, pageSize int) (total int, items []*UserInteraction, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	var sql string
+	sql += ` 	SELECT
+			art.title,
+			art.id AS article_id,
+			art.publish_time AS publish_date,
+			r.create_time,
+			r.user_id,
+			r.mobile,
+			r.company_id,
+			r.company_name,
+			r.real_name,
+			r.register_platform AS source_platform,
+			art.type AS special_type,
+			art.industry_tags as  industry_name
+		FROM
+			cygx_yanxuan_special_collect AS r
+			INNER JOIN cygx_yanxuan_special AS art ON art.id = r.yanxuan_special_id
+		    INNER JOIN %s.user_seller_relation AS us ON us.user_id = r.user_id   AND us.product_id = 2
+		WHERE 1 = 1 ` + condition
+	databaseName := utils.GetWeeklyDatabase()
+	sql = fmt.Sprintf(sql, databaseName)
+	totalSql := `SELECT COUNT(1) total FROM (` + sql + `) z `
+	err = o.Raw(totalSql).QueryRow(&total)
+	if err != nil {
+		return
+	}
+
+	sql += ` ORDER BY create_time DESC, article_id DESC   `
+	if startSize > 0 || pageSize > 0 {
+		sql += ` LIMIT ` + strconv.Itoa(startSize) + "," + strconv.Itoa(pageSize)
+	}
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+// 用户阅读记录列表
+func GetCygxYanxuanSpecialAuthorByUser(condition string, startSize, pageSize int) (total int, items []*UserInteraction, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	var sql string
+	sql += ` 	SELECT
+			art.special_name as  title,
+			art.id AS department_id,
+			art.nick_name,
+			art.article_num,
+			art.fans_num,
+			art.mobile_init,
+			r.create_time,
+			r.user_id,
+			r.mobile,
+			r.company_id,
+			r.company_name,
+			r.real_name,
+			r.register_platform AS source_platform
+		FROM
+			cygx_yanxuan_special_follow AS r
+			INNER JOIN cygx_yanxuan_special_author AS art ON art.user_id = r.follow_user_id
+		WHERE 1 = 1 ` + condition
+
+	totalSql := `SELECT COUNT(1) total FROM (` + sql + `) z `
+	err = o.Raw(totalSql).QueryRow(&total)
+	if err != nil {
+		return
+	}
+
+	sql += ` ORDER BY create_time DESC, department_id DESC   `
+	if startSize > 0 || pageSize > 0 {
+		sql += ` LIMIT ` + strconv.Itoa(startSize) + "," + strconv.Itoa(pageSize)
+	}
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+// 用户阅读记录列表
+func GetCygxYanxuanSpecialAuthorByUserWeekly(condition string, startSize, pageSize int) (total int, items []*UserInteraction, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	var sql string
+	sql += ` 	SELECT
+			art.special_name as  title,
+			art.id AS department_id,
+			art.nick_name,
+			art.article_num,
+			art.fans_num,
+			art.mobile_init,
+			r.create_time,
+			r.user_id,
+			r.mobile,
+			r.company_id,
+			r.company_name,
+			r.real_name,
+			r.register_platform AS source_platform
+		FROM
+			cygx_yanxuan_special_follow AS r
+			INNER JOIN cygx_yanxuan_special_author AS art ON art.user_id = r.follow_user_id
+		   INNER JOIN %s.user_seller_relation AS us ON us.user_id = r.user_id   AND us.product_id = 2
+		WHERE 1 = 1 ` + condition
+	databaseName := utils.GetWeeklyDatabase()
+	sql = fmt.Sprintf(sql, databaseName)
+	totalSql := `SELECT COUNT(1) total FROM (` + sql + `) z `
+	err = o.Raw(totalSql).QueryRow(&total)
+	if err != nil {
+		return
+	}
+
+	sql += ` ORDER BY create_time DESC, department_id DESC   `
+	if startSize > 0 || pageSize > 0 {
+		sql += ` LIMIT ` + strconv.Itoa(startSize) + "," + strconv.Itoa(pageSize)
+	}
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
 // 收藏列表数量
-func GetCygxArticleCollectCount(uid int) (count int, err error) {
+func GetCygxArticleCollectCount(uid int, condition string) (count int, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
-	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_article_collect as r INNER JOIN cygx_article AS art ON art.article_id = r.article_id  WHERE   user_id = ?  `
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_article_collect as r INNER JOIN cygx_article AS art ON art.article_id = r.article_id  WHERE   user_id = ?  ` + condition
 	err = o.Raw(sqlCount, uid).QueryRow(&count)
 	return
 }
@@ -571,21 +803,21 @@ func GetCygArticleDepartmentFollowByUser(uid, startSize, pageSize int) (items []
 }
 
 // 用户搜索关键词统计
-func GetCygxSearchKeyWordCount(uid int) (count int, err error) {
+func GetCygxSearchKeyWordCount(uid int, condition string) (count int, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
-	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_search_key_word  WHERE   user_id = ?  `
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_search_key_word  WHERE   user_id = ?  ` + condition
 	err = o.Raw(sqlCount, uid).QueryRow(&count)
 	return
 }
 
 // 用户搜索关键词列表
-func GetCygxSearchKeyWordByUser(uid, startSize, pageSize int) (items []*UserInteraction, err error) {
+func GetCygxSearchKeyWordByUser(condition string, uid, startSize, pageSize int) (items []*UserInteraction, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
 	sql := `SELECT
 			key_word,create_time
 		FROM
 			cygx_search_key_word as k
-			WHERE user_id = ?
+			WHERE user_id = ? ` + condition + `
 			ORDER BY  k.create_time DESC LIMIT ?,? `
 	_, err = o.Raw(sql, uid, startSize, pageSize).QueryRows(&items)
 	return
@@ -903,45 +1135,68 @@ ORDER BY
 }
 
 type GetUserInteractionTableCountResp struct {
-	HistoryNum          int `description:"报告阅读"`
-	CountNum            int `description:"报告收藏"`
-	IndustryFllowNum    int `description:"产业关注"`
-	DepartmentFollowNum int `description:"作者关注"`
-	KeyWordNum          int `description:"搜索关键词"`
-	OnLineNum           int `description:"线上互动活动"`
-	OfficeNum           int `description:"线下互动活动"`
-	ActivityNum         int `description:"活动数量"`
-	ChartNum            int `description:"图表数量"`
-	TripNum             int `description:"图表数量"`
-	RoadshowVideoNum    int `description:"产业视频播放量"`
-	ActivityVideoNum    int `description:"活动视频播放量"`
-	ActivityVoiceNum    int `description:"活动音频播放量"`
-	TagNum              int `description:"首页标签点击量"`
-	YanxuanSpecialNum   int `description:"研选专栏阅读数量"`
+	HistoryNum               int `description:"报告阅读"`
+	CountNum                 int `description:"报告收藏"`
+	IndustryFllowNum         int `description:"产业关注"`
+	DepartmentFollowNum      int `description:"作者关注"`
+	KeyWordNum               int `description:"搜索关键词"`
+	OnLineNum                int `description:"线上互动活动"`
+	OfficeNum                int `description:"线下互动活动"`
+	ActivityNum              int `description:"活动数量"`
+	ChartNum                 int `description:"图表数量"`
+	TripNum                  int `description:"图表数量"`
+	RoadshowVideoNum         int `description:"产业视频播放量"`
+	ActivityVideoNum         int `description:"活动视频播放量"`
+	ActivityVoiceNum         int `description:"活动音频播放量"`
+	TagNum                   int `description:"首页标签点击量"`
+	YanxuanSpecialNum        int `description:"研选专栏阅读数量"`
+	YanxuanSpecialCollectNum int `description:"研选专栏收藏数量"`
+	YanxuanSpecialFollowNum  int `description:"研选专栏作者关注数量"`
+	FeedbackNum              int `description:"交流反馈数量"`
 }
 
 // 用户互动总数统计
 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 = ?  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_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    AND art.article_type_id = 0   ) AS history_num,
+			( SELECT COUNT( 1 ) FROM cygx_article_collect AS h  INNER JOIN cygx_article  as art  ON  art.article_id = h.article_id  WHERE h.user_id = ?  AND art.article_type_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  AND  h.source   IN (0,1,2)  ) AS industry_fllow_num,
-			( SELECT COUNT( 1 ) FROM cygx_article_department_follow AS h WHERE h.user_id = ?  AND h.type = 1  ) AS department_follow_num,
-			( SELECT COUNT( 1 ) FROM cygx_search_key_word AS h WHERE h.user_id = ?  ) AS key_word_num,
+			( SELECT COUNT( 1 ) FROM cygx_industry_fllow AS h INNER JOIN   cygx_industrial_management  as   a  ON a.industrial_management_id  = h.industrial_management_id   WHERE h.user_id = ? AND h.type = 1  AND  h.source   IN (0,1,2)  AND a.chart_permission_id  != 31   ) AS industry_fllow_num,
+			( SELECT COUNT( 1 ) FROM cygx_search_key_word AS h WHERE h.user_id = ?   AND  h.register_platform IN(1,2) ) AS key_word_num,
 			( SELECT 	COUNT( DISTINCT a.activity_id )  as count  FROM cygx_activity_signup_detail AS h INNER JOIN cygx_activity as a ON a.activity_id = h.activity_id  INNER JOIN cygx_activity_type as t ON t.activity_type_id = a.activity_type_id   WHERE h.user_id = ? 
-					  AND t.activity_type=1 AND h.do_fail_type = 0   ) AS on_line_num,
+					  AND t.activity_type=1 AND h.do_fail_type = 0  AND  a.chart_permission_id  != 31  ) AS on_line_num,
 			( SELECT  	COUNT( DISTINCT a.activity_id )  as count  FROM cygx_activity_signup_detail AS h INNER JOIN cygx_activity as a ON a.activity_id = h.activity_id  INNER JOIN cygx_activity_type as t ON t.activity_type_id = a.activity_type_id   WHERE h.user_id = ?
-				  AND t.activity_type = 0 AND h.do_fail_type = 0  ) AS office_num,
+				  AND t.activity_type = 0 AND h.do_fail_type = 0  AND a.chart_permission_id  != 31 ) AS office_num,
 			( SELECT COUNT( 1 ) FROM cygx_activity_special_meeting_detail AS h INNER JOIN cygx_activity_special AS a ON a.activity_id = h.activity_id WHERE h.user_id = ?  AND a.publish_status = 1 AND a.activity_time_end < NOW()) AS trip_num,
 			( SELECT COUNT( 1 ) FROM cygx_micro_roadshow_video_history AS h  INNER JOIN cygx_micro_roadshow_video as v ON v.video_id = h.video_id WHERE  h.user_id = ?  ) AS roadshow_video_num,
 			( SELECT COUNT( 1 ) FROM cygx_activity_video_history AS h  INNER JOIN cygx_activity_video as v ON v.video_id = h.video_id WHERE  h.user_id = ?  ) AS activity_video_num,
 			( SELECT COUNT( 1 ) FROM cygx_activity_voice_history AS h  INNER JOIN cygx_activity_voice as v ON v.activity_id = h.activity_id WHERE  h.user_id = ?  ) AS activity_voice_num,
 			( SELECT COUNT(1) FROM cygx_tag_history as h INNER JOIN cygx_tag AS b ON h.tag_id = b.tag_id WHERE h.user_id = ?  ) AS tag_num,
+			( SELECT COUNT(1) FROM cygx_user_feedback as h WHERE h.user_id = ?  ) AS feedback_num
+			FROM  dual `
+	err = o.Raw(sql, uid, uid, uid, uid, uid, uid, uid, uid, uid, uid, uid, uid, uid).QueryRow(&item)
+	return
+}
+
+// 用户互动总数统计
+func GetUserInteractionTableCountByYanXuan(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 = ?  AND h.is_del = 0    AND art.article_type_id > 0   ) AS history_num,
+			( SELECT COUNT( 1 ) FROM cygx_article_collect AS h  INNER JOIN cygx_article  as art  ON  art.article_id = h.article_id  WHERE h.user_id = ?  AND art.article_type_id > 0   ) AS count_num,
+			( SELECT COUNT( 1 ) FROM cygx_industry_fllow AS h INNER JOIN   cygx_industrial_management  as   a  ON a.industrial_management_id  = h.industrial_management_id   WHERE h.user_id = ? AND h.type = 1  AND  h.source   IN (0,1,2)  AND a.chart_permission_id  = 31   ) AS industry_fllow_num,
+			( SELECT COUNT( 1 ) FROM cygx_article_department_follow AS h WHERE h.user_id = ?  AND h.type = 1  ) AS department_follow_num,
+			( SELECT COUNT( 1 ) FROM cygx_search_key_word AS h WHERE h.user_id = ?   AND  h.register_platform IN(5,6) ) AS key_word_num,
+			( SELECT 	COUNT( DISTINCT a.activity_id )  as count  FROM cygx_activity_signup_detail AS h INNER JOIN cygx_activity as a ON a.activity_id = h.activity_id  INNER JOIN cygx_activity_type as t ON t.activity_type_id = a.activity_type_id   WHERE h.user_id = ? 
+					  AND t.activity_type=1 AND h.do_fail_type = 0  AND  a.chart_permission_id  = 31    ) AS on_line_num,
+			( SELECT  	COUNT( DISTINCT a.activity_id )  as count  FROM cygx_activity_signup_detail AS h INNER JOIN cygx_activity as a ON a.activity_id = h.activity_id  INNER JOIN cygx_activity_type as t ON t.activity_type_id = a.activity_type_id   WHERE h.user_id = ?
+				  AND t.activity_type = 0 AND h.do_fail_type = 0  AND  a.chart_permission_id  = 31    ) AS office_num,
+			( SELECT COUNT(1) FROM cygx_yanxuan_special_collect as h INNER JOIN cygx_yanxuan_special AS b ON h.yanxuan_special_id = b.id WHERE h.user_id = ?  ) AS yanxuan_special_collect_num,
+			( SELECT COUNT(1) FROM cygx_yanxuan_special_follow as h WHERE h.user_id = ?  ) AS yanxuan_special_follow_num,
 			( SELECT COUNT(1) FROM cygx_yanxuan_special_record as h INNER JOIN cygx_yanxuan_special AS b ON h.yanxuan_special_id = b.id WHERE h.user_id = ?  ) AS yanxuan_special_num
 			FROM  dual `
-	err = o.Raw(sql, uid, uid, uid, uid, uid, uid, uid, uid, uid, uid, uid, uid, uid, uid).QueryRow(&item)
+	err = o.Raw(sql, uid, uid, uid, uid, uid, uid, uid, uid, uid, uid).QueryRow(&item)
 	return
 }
 

+ 0 - 128
models/cygx/cygx_user_company.go

@@ -1105,134 +1105,6 @@ func GetCygxActivitySpecialTripByCompanyList(condition string, startSize, pageSi
 	return
 }
 
-// 通过纪要ID获取活动详情
-func GetTableCompanyList() (item *GetUserInteractionTableCountResp, err error) {
-	o := orm.NewOrmUsingDB("hz_cygx")
-	sql := `SELECT
-	SUM( article_history_num ) AS history_num,
-	SUM( article_count_num ) AS count_num,
-	SUM( industry_fllow_num ) AS industry_fllow_num,
-	SUM( department_follow_num ) AS department_follow_num,
-	SUM( key_word_num ) AS key_word_num,
-	SUM( activity_num ) AS activity_num,
-	SUM( chart_count_num ) AS chart_num 
-FROM
-	cygx_company_interaction_num 
-	LIMIT 1`
-	err = o.Raw(sql).QueryRow(&item)
-	return
-}
-
-// 获取用户参会记录根据销售分组
-func GetActivityMeetBySeller(condition string) (list []*company.CompanyReportRecordGroup, err error) {
-	return
-	o := orm.NewOrm()
-	sqlCount := `				SELECT
-				p.seller_id as admin_id,count(DISTINCT(r.company_id)) num,GROUP_CONCAT(DISTINCT r.company_id SEPARATOR ',') AS company_ids
-			FROM
-				cygx_activity_signup AS r
-				INNER JOIN cygx_activity AS a ON a.activity_id = r.activity_id
-				INNER JOIN cygx_activity_type as t ON t.activity_type_id = a.activity_type_id
-				INNER JOIN wx_user AS u ON u.user_id = r.user_id 
-				INNER JOIN company_product AS p ON p.company_id=r.company_id
-			WHERE
-				1 = 1 
-				AND r.do_fail_type = 0
-				AND p.product_id = 2
-				`
-	if condition != "" {
-		sqlCount += condition
-	}
-	sqlCount += ` GROUP BY p.seller_id `
-	_, err = o.Raw(sqlCount).QueryRows(&list)
-	return
-}
-
-// 收藏列表数量根据销售分组
-func GetCygxArticleCollectCountBySeller(condition string) (list []*company.CompanyReportRecordGroup, err error) {
-	return // 没有使用了
-	o := orm.NewOrm()
-	sqlCount := ` SELECT
-	p.seller_id as admin_id,count(DISTINCT(r.company_id)) num,GROUP_CONCAT(DISTINCT r.company_id SEPARATOR ',') AS company_ids
-FROM
-	cygx_article_collect AS r
-	INNER JOIN cygx_article AS art ON art.article_id = r.article_id
-	INNER JOIN wx_user AS u ON u.user_id = r.user_id 
-	INNER JOIN company_product AS p ON p.company_id=r.company_id
-WHERE
-	1 = 1
-	AND p.product_id=2  ` + condition
-
-	sqlCount += ` GROUP BY p.seller_id `
-	_, err = o.Raw(sqlCount).QueryRows(&list)
-	return
-}
-
-// 关注产业数量根据销售分组
-func GetCygxIndustryFllowCountBySeller(condition string) (list []*company.CompanyReportRecordGroup, err error) {
-	o := orm.NewOrm()
-	sqlCount := ` SELECT
-	p.seller_id AS admin_id,
-	count(
-	DISTINCT ( r.company_id )) num,
-	GROUP_CONCAT( DISTINCT r.company_id SEPARATOR ',' ) AS company_ids 
-FROM
-	cygx_industry_fllow AS r
-	INNER JOIN cygx_industrial_management AS m ON m.industrial_management_id = r.industrial_management_id
-	INNER JOIN wx_user AS u ON u.user_id = r.user_id
-	INNER JOIN company_product AS p ON p.company_id = r.company_id 
-WHERE
-	type = 1 
-	AND p.product_id = 2 
-  ` + condition
-
-	sqlCount += ` GROUP BY p.seller_id `
-	_, err = o.Raw(sqlCount).QueryRows(&list)
-	return
-}
-
-// 关注作者数量根据销售分组
-func GetCygArticleDepartmentFollowCountBySeller(condition string) (list []*company.CompanyReportRecordGroup, err error) {
-	return // 没有使用了
-	o := orm.NewOrm()
-	sqlCount := ` SELECT
-	p.seller_id AS admin_id,
-	count(
-	DISTINCT ( r.company_id )) num,
-	GROUP_CONCAT( DISTINCT r.company_id SEPARATOR ',' ) AS company_ids 
-FROM
-	cygx_article_department_follow AS r
-	INNER JOIN cygx_article_department AS m ON m.department_id = r.department_id
-	INNER JOIN wx_user AS u ON u.user_id = r.user_id
-	INNER JOIN company_product AS p ON p.company_id = r.company_id 
-WHERE
-	type = 1 
-	AND p.product_id = 2  ` + condition
-
-	sqlCount += ` GROUP BY p.seller_id `
-	_, err = o.Raw(sqlCount).QueryRows(&list)
-	return
-}
-
-// 用户搜索关键词统计根据销售分组
-func GetCygxSearchKeyWordCountBySeller(condition string) (list []*company.CompanyReportRecordGroup, err error) {
-	o := orm.NewOrm()
-	sqlCount := ` SELECT
-	p.seller_id AS admin_id,
-	count(
-	DISTINCT ( r.company_id )) num,
-	GROUP_CONCAT( DISTINCT r.company_id SEPARATOR ',' ) AS company_ids 
-FROM
-	cygx_search_key_word AS r 
-	INNER JOIN company_product AS p ON p.company_id = r.company_id 
-WHERE
-	1 = 1
-	AND p.product_id = 2  ` + condition
-	sqlCount += ` GROUP BY p.seller_id `
-	_, err = o.Raw(sqlCount).QueryRows(&list)
-	return
-}
-
 type CompanyAndCount struct {
 	CompanyId int
 	Count     int

+ 32 - 0
models/cygx/industrial_activity_group_management.go

@@ -2,6 +2,7 @@ package cygx
 
 import (
 	"github.com/beego/beego/v2/client/orm"
+	"hongze/hz_crm_api/utils"
 	"time"
 )
 
@@ -18,6 +19,7 @@ type IndustrialActivityGroupManagementRep struct {
 	IndustryName           string `description:"产业名称"`
 	ChartPermissionId      int    `description:"权限id"`
 	PermissionName         string `description:"行业名称"`
+	ActivityId             int    `description:"活动ID"`
 }
 
 type IndustryAndSubjectName struct {
@@ -42,6 +44,20 @@ func GetIndustrialActivityGroupManagementList(activityId, source int) (items []*
 	return
 }
 
+// 根据产业ID获取关联的对应活动
+func GetIndustrialActivityGroupManagementListByIndustriaId(industrialId, source int) (items []*IndustrialActivityGroupManagementRep, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT
+			am.activity_id
+			FROM
+			cygx_industrial_activity_group_management AS am
+			INNER JOIN cygx_industrial_management AS m ON m.industrial_management_id = am.industrial_management_id
+			WHERE
+			am.industrial_management_id = ? AND am.source = ?`
+	_, err = o.Raw(sql, industrialId, source).QueryRows(&items)
+	return
+}
+
 // 获取产业关联的活动数量
 func GetIndustrialManagementGroupActCount(industrialManagementId int) (count int, err error) {
 	sqlCount := `SELECT
@@ -86,6 +102,22 @@ func GetIndustrialActivityGroupListByactivityIds(activityIds string) (items []*I
 	return
 }
 
+// 列表
+func GetIndustrialActivityGroupListByactivityIdsArr(activityIds []int, source int) (items []*IndustrialActivityGroupResp, err error) {
+	lenArr := len(activityIds)
+	if lenArr == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT  mg.*,m.industry_name  FROM
+	        cygx_industrial_activity_group_management AS mg
+	      	 INNER JOIN cygx_industrial_management AS m ON m.industrial_management_id = mg.industrial_management_id 
+			WHERE 1 = 1 
+			AND mg.activity_id IN (` + utils.GetOrmInReplace(lenArr) + `) AND mg.source = ? GROUP BY  mg.activity_id,mg.industrial_management_id`
+	_, err = o.Raw(sql, activityIds, source).QueryRows(&items)
+	return
+}
+
 type IndustryActCountGroupByType struct {
 	ActivityType  string `json:"activity_type" description:"活动类型名称"`
 	ActivityCount int    `json:"activity_count" description:"关联的活动数"`

+ 38 - 0
models/cygx/industrial_activity_group_subject.go

@@ -2,6 +2,7 @@ package cygx
 
 import (
 	"github.com/beego/beego/v2/client/orm"
+	"hongze/hz_crm_api/utils"
 	"time"
 )
 
@@ -16,6 +17,7 @@ type CygxIndustrialActivityGroupSubject struct {
 type SubjectActivityGroupManagementRep struct {
 	IndustrialSubjectId int    `description:"产业id"`
 	SubjectName         string `description:"标的名称"`
+	ActivityId          int    `description:"活动ID"`
 }
 
 // 列表
@@ -33,6 +35,42 @@ func GetSubjectActivityGroupManagementList(activityId, source int) (items []*Sub
 	return
 }
 
+// 列表
+func GetSubjectActivityGroupManagementListByActivityIdsArr(activityIds []int, source int) (items []*SubjectActivityGroupManagementRep, err error) {
+	lenArr := len(activityIds)
+	if lenArr == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT
+    	    ag.activity_id,
+			s.subject_name,
+			s.industrial_subject_id 
+			FROM
+			cygx_industrial_activity_group_subject AS ag
+			INNER JOIN cygx_industrial_subject AS s ON s.industrial_subject_id = ag.industrial_subject_id 
+			WHERE
+				 ag.activity_id IN (` + utils.GetOrmInReplace(lenArr) + `) AND ag.source = ?`
+	_, err = o.Raw(sql, activityIds, source).QueryRows(&items)
+	return
+}
+
+// 列表
+func GetSubjectActivityGroupManagementListBySubjectId(subjectId, source int) (items []*SubjectActivityGroupManagementRep, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT
+    	    ag.activity_id,
+			s.subject_name,
+			s.industrial_subject_id 
+			FROM
+			cygx_industrial_activity_group_subject AS ag
+			INNER JOIN cygx_industrial_subject AS s ON s.industrial_subject_id = ag.industrial_subject_id 
+			WHERE
+			ag.industrial_subject_id = ? AND ag.source = ?`
+	_, err = o.Raw(sql, subjectId, source).QueryRows(&items)
+	return
+}
+
 func GetActivityIdsByIndustrialSubjectId(industrialSubjectId string) (activityId string, err error) {
 	sql := ` SELECT
 			GROUP_CONCAT( DISTINCT activity_id ORDER BY id ASC SEPARATOR ',' ) AS activity_id 

+ 22 - 0
models/cygx/industrial_article_group_management.go

@@ -41,6 +41,28 @@ func GetIndustrialArticleGroupManagementList(articleId int) (items []*Industrial
 	return
 }
 
+type IndustrialArticleGroupManagementRep struct {
+	IndustrialManagementId int    `description:"cygx_industrial_management表的主键ID"`
+	IndustryName           string `description:"产业名称"`
+	ChartPermissionId      int    `description:"权限id"`
+	PermissionName         string `description:"行业名称"`
+	ArticleId              int    `description:"cygx_article表的文章ID"`
+}
+
+// 列表
+func GetIndustrialArticleGroupManagementListByindustrialId(articleId int) (items []*IndustrialArticleGroupManagementRep, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT
+			am.article_id
+			FROM
+			cygx_industrial_article_group_management AS am
+			INNER JOIN cygx_industrial_management AS m ON m.industrial_management_id = am.industrial_management_id
+			WHERE
+			am.industrial_management_id = ?`
+	_, err = o.Raw(sql, articleId).QueryRows(&items)
+	return
+}
+
 // 通过名称获取详情
 func GetIndustrialManagemenDetailByAaticle(articleId int) (item *CygxIndustrialArticleGroupManagement, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")

+ 20 - 0
models/cygx/industrial_article_group_subject.go

@@ -59,6 +59,26 @@ func GetSubjectArticleGroupManagementList(articleId int) (items []*SubjectActivi
 	return
 }
 
+type SubjectArticleGroupManagementRep struct {
+	IndustrialSubjectId int    `description:"产业id"`
+	SubjectName         string `description:"标的名称"`
+	ArticleId           int    `description:"cygx_article表的文章ID"`
+}
+
+// 列表
+func GetSubjectArticleGroupManagementListBysubjectId(subjectId int) (items []*SubjectArticleGroupManagementRep, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT
+  			ag.article_id
+			FROM
+			cygx_industrial_article_group_subject AS ag
+			INNER JOIN cygx_industrial_subject AS s ON s.industrial_subject_id = ag.industrial_subject_id 
+			WHERE
+			ag.industrial_subject_id = ?`
+	_, err = o.Raw(sql, subjectId).QueryRows(&items)
+	return
+}
+
 type SubjectlArticleGroupResp struct {
 	ArticleId              int    `description:"文章ID"`
 	IndustrialManagementId int    `description:"cygx_industrial_management表的主键ID"`

+ 9 - 0
models/cygx/industrial_management.go

@@ -649,6 +649,15 @@ func GetIndustryListByCondition(condition string, pars []interface{}) (list []*C
 	return
 }
 
+// GetIndustryListByCondition 获取产业列表
+func GetIndustryListByConditionByIds(industrialManagementIds []int) (list []*CygxIndustrialManagement, err error) {
+	lenArr := len(industrialManagementIds)
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_industrial_management WHERE  industrial_management_id IN (` + utils.GetOrmInReplace(lenArr) + `) `
+	_, err = o.Raw(sql, industrialManagementIds).QueryRows(&list)
+	return
+}
+
 // IndustriesEarliestLayoutTime 产业布局时间
 type IndustriesEarliestLayoutTime struct {
 	IndustrialManagementId int       `json:"industrial_management_id" description:"产业ID"`

+ 11 - 2
models/cygx/industrial_subject.go

@@ -2,6 +2,7 @@ package cygx
 
 import (
 	"github.com/beego/beego/v2/client/orm"
+	"hongze/hz_crm_api/utils"
 	"strconv"
 	"strings"
 	"time"
@@ -179,10 +180,18 @@ func GetIndustrialSubjectAllByIds(condition string) (items []*CygxIndustrialSubj
 	return
 }
 
-func GetIndustrialSubjectDetailById(IndustrialSubjectId int) (item *CygxIndustrialSubject, err error) {
+func GetIndustrialSubjectDetailById(industrialSubjectId int) (item *CygxIndustrialSubject, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
 	sql := `SELECT * FROM cygx_industrial_subject WHERE industrial_subject_id = ? `
-	err = o.Raw(sql, IndustrialSubjectId).QueryRow(&item)
+	err = o.Raw(sql, industrialSubjectId).QueryRow(&item)
+	return
+}
+
+func GetIndustrialSubjectDetailByIds(industrialSubjectIds []int) (list []*CygxIndustrialSubject, err error) {
+	lenArr := len(industrialSubjectIds)
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_industrial_subject WHERE  industrial_subject_id IN (` + utils.GetOrmInReplace(lenArr) + `) `
+	_, err = o.Raw(sql, industrialSubjectIds).QueryRows(&list)
 	return
 }
 

+ 12 - 10
models/cygx/industry_fllow.go

@@ -38,29 +38,31 @@ func GetCygxIndustryFllowList(condition string, pars []interface{}, startSize, p
 }
 
 // 关注产业列表
-func GetCygxIndustryFllowByUser(uid, startSize, pageSize int) (items []*UserInteraction, err error) {
+func GetCygxIndustryFllowByUser(uid, startSize, pageSize int, condition string) (items []*UserInteraction, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
 	sql := `SELECT
-			m.industry_name,
+			a.industry_name,
 			f.modify_time as create_time,
-			( 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 
+			( SELECT GROUP_CONCAT( DISTINCT s.subject_name SEPARATOR '/' ) FROM cygx_industrial_subject AS s WHERE s.industrial_management_id = f.industrial_management_id ) AS subject_name_str 
 		FROM
 			cygx_industry_fllow AS f
-			INNER JOIN cygx_industrial_management AS m ON m.industrial_management_id = f.industrial_management_id 
+			INNER JOIN cygx_industrial_management AS a ON a.industrial_management_id = f.industrial_management_id 
 		WHERE
-			user_id = ? 
-			AND type = 1 
-			AND f.source  IN (0,1,2)
-		ORDER BY
+			f.user_id = ? 
+			AND f.type = 1 
+			AND f.source  IN (0,1,2) ` + condition +
+		`ORDER BY
 			f.create_time DESC  LIMIT ?,? `
 	_, err = o.Raw(sql, uid, startSize, pageSize).QueryRows(&items)
 	return
 }
 
 // 关注产业数量
-func GetCygxIndustryFllowCount(uid int) (count int, err error) {
+func GetCygxIndustryFllowCount(uid int, condition string) (count int, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
-	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_industry_fllow  WHERE   user_id = ?  AND type = 1 AND  source   IN (0,1,2)  `
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_industry_fllow  as  f
+                           INNER JOIN   cygx_industrial_management  as   a  ON a.industrial_management_id  = f.industrial_management_id 
+                           WHERE   f.user_id = ?  AND f.type = 1 AND  f.source   IN (0,1,2)  ` + condition
 	err = o.Raw(sqlCount, uid).QueryRow(&count)
 	return
 }

+ 197 - 0
models/cygx/rai_serve_bill.go

@@ -0,0 +1,197 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
+)
+
+type RaiServeTypeResp struct {
+	ServeTypeId   int    `description:"服务类型id"`
+	ServeTypeName string `description:"服务类型名称"`
+}
+
+type RaiServeTypeListResp struct {
+	List []*RaiServeTypeResp
+}
+
+// 服务类型列表
+func GetRaiServeTypeRespList(condition string) (items []*RaiServeTypeResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_rai_serve_type WHERE  1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += `  ORDER BY sort DESC  LIMIT  100 `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+type RaiServeTagResp struct {
+	TagType int    `description:"标签类型"`
+	TagId   int    `description:"标签ID"`
+	TagName string `description:"标签名称"`
+	Md5Key  string `description:"加密key,前端找参数当唯一索引值使用"`
+}
+
+type ChekChartPermissionNameResp struct {
+	ChartPermissionName string `description:"权限名称"`
+	Belong              bool   `description:"权限名称"`
+	List                []*RaiServeTagResp
+}
+
+type RaiServeTagListResp struct {
+	List []*RaiServeTagResp
+}
+
+type RaiServeCoverageRateResp struct {
+	//List []string
+	ThisWeekAmount  string `comment:"本周互动量"`
+	LastWeekAmount  string `comment:"上周互动量"`
+	TwoWeekAmount   string `comment:"上上周互动量"`
+	ThreeWeekAmount string `comment:"上三周互动量"`
+}
+
+// 服务类型列表
+func GetRaiServeSearchTagRespList(keywords string) (items []*RaiServeTagResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT
+			1 AS tag_type,
+			i.industrial_management_id AS tag_id,
+			i.industry_name AS tag_name,
+			i.create_time 
+		FROM
+			cygx_industrial_management AS i 
+		WHERE
+			1 = 1 
+			AND i.chart_permission_id IN ( 19, 20, 21, 22 ) 
+			AND  (i.industry_name LIKE '%` + keywords + `%' ) UNION ALL
+		SELECT
+			2 AS tag_type,
+			s.industrial_subject_id AS tag_id,
+			s.subject_name AS tag_name,
+			s.create_time 
+		FROM
+			cygx_industrial_subject AS s
+			INNER JOIN cygx_industrial_management AS i ON i.industrial_management_id = s.industrial_management_id 
+		WHERE
+			1 = 1 
+			AND i.chart_permission_id IN ( 19, 20, 21, 22 ) 
+			AND ( s.subject_name LIKE  '%` + keywords + `%') 
+		ORDER BY
+			create_time ASC `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+func GetRaiServeSearchTagRespListBycharId(keywords, charIds, conditionindustrial, conditionsubject string) (items []*RaiServeTagResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT
+			1 AS tag_type,
+			i.industrial_management_id AS tag_id,
+			i.industry_name AS tag_name,
+			i.create_time 
+		FROM
+			cygx_industrial_management AS i 
+		WHERE
+			1 = 1 
+			AND i.chart_permission_id IN (` + charIds + ` ) 
+		AND  (i.industry_name LIKE '%` + keywords + `%' ` + conditionindustrial + ` )  UNION ALL
+		SELECT
+			2 AS tag_type,
+			s.industrial_subject_id AS tag_id,
+			s.subject_name AS tag_name,
+			s.create_time 
+		FROM
+			cygx_industrial_subject AS s
+			INNER JOIN cygx_industrial_management AS i ON i.industrial_management_id = s.industrial_management_id 
+		WHERE
+			1 = 1 
+			AND i.chart_permission_id IN (` + charIds + ` ) 
+			AND ( s.subject_name LIKE  '%` + keywords + `%' ` + conditionsubject + ` ) 
+		ORDER BY
+			create_time ASC `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+// 权益服务明细表
+type CygxRaiServeBillResp struct {
+	Content             string  `comment:"服务内容说明"`
+	ServeTypeName       string  `comment:"服务类型"`
+	Mobile              string  `comment:"手机号"`
+	Email               string  `comment:"邮箱"`
+	RealName            string  `comment:"用户实际名称"`
+	ServeCount          float64 `comment:"服务量小计"`
+	Tag                 string  `comment:"标签,多个用 , 隔开"`
+	IsKp                int     `comment:"是否是KP,1:是、0:否"`
+	SourceId            int     `comment:"来源ID"`
+	Source              string  `comment:"来源 "`
+	ViewTime            string  `comment:"浏览时间"`
+	ChartPermissionId   int     `description:"行业id"`
+	ChartPermissionName string  `description:"行业名称"`
+}
+
+type CygxRaiServeBillListResp struct {
+	Paging *paging.PagingItem `description:"分页数据"`
+	List   []*CygxRaiServeBillResp
+}
+
+func GetCygxRaiServeBillCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_rai_serve_bill as art WHERE 1= 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+// 列表
+func GetCygxRaiServeBillRespList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxRaiServeBillResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_rai_serve_bill as art WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY bill_id DESC   LIMIT ?,? `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+// 权益服务明细表
+type CygxRaiServeBill struct {
+	BillId           int       `orm:"column(bill_id);pk" description:"服务明细主键ID"`
+	Content          string    `comment:"服务内容说明"`
+	ServeTypeId      int       `comment:"服务类型ID"`
+	ServeTypeName    string    `comment:"服务类型"`
+	UserId           int       `comment:"用户ID"`
+	Mobile           string    `comment:"手机号"`
+	Email            string    `comment:"邮箱"`
+	CompanyId        int       `comment:"公司ID"`
+	CompanyName      string    `comment:"公司名称"`
+	RealName         string    `comment:"用户实际名称"`
+	RegisterPlatform int       `comment:"来源 1小程序,2:网页"`
+	ServeCount       float64   `comment:"服务量小计"`
+	IsKp             int       `comment:"是否是KP,1:是、0:否"`
+	SourceId         int       `comment:"来源ID"`
+	Source           string    `comment:"来源 "`
+	WeekStartDate    string    `comment:"周一开始日期"`
+	WeekEndDate      string    `comment:"周日结束日期"`
+	CreateTime       time.Time `comment:"创建时间"`
+	ViewTime         string    `comment:"浏览时间"`
+}
+
+// 列表
+func GetCygxRaiServeBillListAll(condition string, pars []interface{}) (items []*CygxRaiServeBill, err error) {
+	if condition == "" {
+		return
+	}
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_rai_serve_bill   WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}

+ 72 - 0
models/cygx/rai_serve_company.go

@@ -0,0 +1,72 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
+)
+
+type CygxRaiServeCompany struct {
+	ServeCompanyId    int       `comment:"ServeCompanyId 主键ID"`
+	CompanyId         int       `comment:"公司ID"`
+	CompanyName       string    `comment:"公司名称"`
+	CreateTime        time.Time `comment:"创建时间"`
+	Money             float64   `comment:"合同金额"`
+	ServeCoverageRate string    `comment:"近四周服务覆盖率"`
+	SellerId          int       `comment:"所属销售id"`
+	SellerName        string    `comment:"所属销售名称"`
+	StartDate         string    `comment:"开始日期"`
+	EndDate           string    `comment:"结束日期"`
+	ShareSeller       string    `comment:"共享销售"`
+	ShareSellerId     int       `comment:"共享销售员id"`
+	Status            string    `comment:"客户状态"`
+	PermissionName    string    `comment:"权限名"`
+	IsUserMaker       int       `comment:"近四周之内是否包含决策人"`
+}
+
+type CygxRaiServeCompanyResp struct {
+	CompanyId         int     `comment:"公司ID"`
+	CompanyName       string  `comment:"公司名称"`
+	IsRed             bool    `comment:"是否标红"`
+	Money             float64 `comment:"合同金额"`
+	ServeCoverageRate string  `comment:"近四周服务覆盖率"`
+	SellerId          int     `comment:"所属销售id"`
+	SellerName        string  `comment:"所属销售名称"`
+	StartDate         string  `comment:"开始日期"`
+	EndDate           string  `comment:"结束日期"`
+	ShareSeller       string  `comment:"共享销售"`
+	ShareSellerId     int     `comment:"共享销售员id"`
+	Status            string  `comment:"客户状态"`
+	PermissionName    string  `comment:"权限名"`
+	ThisWeekAmount    float64 `comment:"本周互动量"`
+	LastWeekAmount    float64 `comment:"上周互动量"`
+	TwoWeekAmount     float64 `comment:"上上周互动量"`
+	ThreeWeekAmount   float64 `comment:"上三周互动量"`
+}
+
+type CygxRaiServeCompanyListResp struct {
+	Paging *paging.PagingItem `description:"分页数据"`
+	List   []*CygxRaiServeCompanyResp
+}
+
+func GetCygxRaiServeCompanyCount(condition string, pars []interface{}) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_rai_serve_company as art WHERE 1= 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	o := orm.NewOrmUsingDB("hz_cygx")
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+// 列表
+func GetCygxRaiServeCompanyList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxRaiServeCompany, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_rai_serve_company as art WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` LIMIT ?,?`
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}

+ 27 - 0
models/cygx/rai_serve_week_bill.go

@@ -0,0 +1,27 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxRaiServeWeekBill struct {
+	ServeWeekBillId int       `orm:"column(serve_week_bill_id);pk" description:"服务周账单ID"`
+	CompanyId       int       `comment:"公司ID"`
+	CompanyName     string    `comment:"公司名称"`
+	UserTotal       int       `comment:"用户数量"`
+	WeekServeCount  float64   `comment:"周度服务量总计"`
+	CoverageRate    float64   `comment:"覆盖率"`
+	WeekStartDate   string    `comment:"周一开始日期"`
+	WeekEndDate     string    `comment:"周日结束日期"`
+	CreateTime      time.Time `comment:"创建时间"`
+	ModifyTime      time.Time `comment:"修改时间"`
+}
+
+// 最近四周覆盖率列表
+func GetCygxRaiServeBillListWeek4(companyId int) (items []*CygxRaiServeWeekBill, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT  * FROM cygx_rai_serve_week_bill WHERE company_id = ? ORDER BY week_start_date DESC  LIMIT  4  `
+	_, err = o.Raw(sql, companyId).QueryRows(&items)
+	return
+}

+ 176 - 0
models/cygx/user_feedback.go

@@ -0,0 +1,176 @@
+package cygx
+
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"hongze/hz_crm_api/utils"
+	"strconv"
+	"time"
+)
+
+//用户交流反馈表
+
+// 权益服务明细表
+type CygxUserFeedback struct {
+	UserFeedbackId int       `orm:"column(user_feedback_id);pk";comment:"主键id"`
+	Content        string    `comment:"服务内容说明"`
+	UserId         int       `comment:"用户ID"`
+	Mobile         string    `comment:"手机号"`
+	Email          string    `comment:"邮箱"`
+	CompanyId      int       `comment:"公司ID"`
+	CompanyName    string    `comment:"公司名称"`
+	RealName       string    `comment:"用户实际名称"`
+	AdminId        int       `comment:"操作人ID"`
+	CreateTime     time.Time `comment:"创建时间"`
+}
+
+// 权益服务明细表
+type CygxUserFeedbackResp struct {
+	UserFeedbackId int    `comment:"主键id"`
+	Content        string `comment:"服务内容说明"`
+	CreateTime     string `comment:"创建时间"`
+}
+
+type AddCygxUserFeedbackReq struct {
+	Content string `comment:"服务内容说明"`
+	UserId  int    `comment:"用户ID"`
+}
+
+type CygxUserFeedbackIdReq struct {
+	UserFeedbackId int `comment:"UserFeedbackId 主键ID"`
+}
+
+// 添加
+func AddCygxUserFeedback(item *CygxUserFeedback) (newId int64, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	newId, err = o.Insert(item)
+	return
+}
+
+// 删除数据
+func DeleteCygxUserFeedback(userFeedbackId int) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ` DELETE FROM cygx_user_feedback WHERE user_feedback_id = ?  `
+	_, err = o.Raw(sql, userFeedbackId).Exec()
+	return
+}
+
+// 列表
+func GetCygxUserFeedbackListByUserId(userId int) (items []*CygxUserFeedbackResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_user_feedback WHERE  user_id = ? `
+	sql += `  ORDER BY user_feedback_id DESC  LIMIT  1000 `
+	_, err = o.Raw(sql, userId).QueryRows(&items)
+	return
+}
+
+type CygxCygxUserFeedbackResp struct {
+	List []*CygxUserFeedbackResp
+}
+
+func GetCygxUserFeedbackList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxOrderResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT *
+			FROM
+			cygx_user_feedback
+			WHERE 1 = 1 ` + condition
+	sql += ` LIMIT ?,?  `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+// 获取数量
+func GetCygxUserFeedbackCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_user_feedback WHERE   1= 1  ` + condition
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+// 用户交流反馈
+func GetCygxUserFeedback(condition string, startSize, pageSize int) (total int, items []*UserInteraction, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	var sql string
+	sql += `SELECT
+			r.content as key_word,
+			r.user_id,
+		    r.mobile,
+			r.real_name,
+			r.company_id,
+			r.company_name,
+			r.create_time
+		FROM
+			cygx_user_feedback AS r
+		WHERE 1 = 1 ` + condition
+
+	totalSql := `SELECT COUNT(1) total FROM (` + sql + `) z `
+	err = o.Raw(totalSql).QueryRow(&total)
+	if err != nil {
+		return
+	}
+
+	sql += ` ORDER BY create_time DESC `
+	if startSize > 0 || pageSize > 0 {
+		sql += ` LIMIT ` + strconv.Itoa(startSize) + "," + strconv.Itoa(pageSize)
+	}
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+// 用户交流反馈
+func GetCygxUserFeedbackWeekly(condition string, startSize, pageSize int) (total int, items []*UserInteraction, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	var sql string
+	sql += `SELECT
+			r.content as key_word,
+			r.user_id,
+		    r.mobile,
+			r.real_name,
+			r.company_id,
+			r.company_name,
+			r.create_time
+		FROM
+			cygx_user_feedback AS r
+		   INNER JOIN %s.user_seller_relation AS us ON us.user_id = r.user_id   AND us.product_id = 2
+		WHERE 1 = 1 ` + condition
+	databaseName := utils.GetWeeklyDatabase()
+	sql = fmt.Sprintf(sql, databaseName)
+	totalSql := `SELECT COUNT(1) total FROM (` + sql + `) z `
+	err = o.Raw(totalSql).QueryRow(&total)
+	if err != nil {
+		return
+	}
+	sql += ` ORDER BY create_time DESC `
+	if startSize > 0 || pageSize > 0 {
+		sql += ` LIMIT ` + strconv.Itoa(startSize) + "," + strconv.Itoa(pageSize)
+	}
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+// 获取数量
+func GetCygxUserFeedbackCountByUserModel(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_user_feedback as r
+                  WHERE 1= 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+// 获取数量
+func GetCygxUserFeedbackCountByUserModelWeekly(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sqlCount := ` SELECT COUNT(1) AS count  FROM 	cygx_user_feedback AS r
+			INNER JOIN %s.user_seller_relation AS us ON us.user_id = r.user_id   AND us.product_id = 2 
+		WHERE 1 = 1  `
+	databaseName := utils.GetWeeklyDatabase()
+	sqlCount = fmt.Sprintf(sqlCount, databaseName)
+	if condition != "" {
+		sqlCount += condition
+	}
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}

+ 8 - 6
models/db.go

@@ -378,12 +378,13 @@ func initYb() {
 func initRoadShow() {
 	//注册对象
 	orm.RegisterModel(
-		new(roadshow.RsCalendar),            //路演主表
-		new(roadshow.RsCalendarResearcher),  //路演研究员信息表
-		new(roadshow.RsMatters),             //公开会议表
-		new(roadshow.RsCalendarRelation),    //路演关系表(与上海的路演日历关系)
-		new(roadshow.RsReportRecord),        //路演统计表
-		new(roadshow.RsCalendarMeetingUser), //路演参会名单表
+		new(roadshow.RsCalendar),                  //路演主表
+		new(roadshow.RsCalendarResearcher),        //路演研究员信息表
+		new(roadshow.RsMatters),                   //公开会议表
+		new(roadshow.RsCalendarRelation),          //路演关系表(与上海的路演日历关系)
+		new(roadshow.RsReportRecord),              //路演统计表
+		new(roadshow.RsCalendarMeetingUser),       //路演参会名单表
+		new(roadshow.RsCalendarMeetingLabelGroup), //路演参会名单关联的标签表
 	)
 }
 
@@ -480,6 +481,7 @@ func initCygx() {
 		new(cygx.CygxOrderRefund),
 		new(cygx.CygxOrder),
 		new(cygx.CygxOrderAction),
+		new(cygx.CygxUserFeedback),
 	)
 }
 

+ 7 - 0
models/report.go

@@ -40,6 +40,13 @@ type Report struct {
 	MsgSendTime        time.Time `description:"模版消息发送时间"`
 	AdminId            int       `description:"创建者账号"`
 	AdminRealName      string    `description:"创建者姓名"`
+	ClassifyIdThird    int       `description:"三级分类id"`
+	ClassifyNameThird  string    `description:"三级分类名称"`
+	CollaborateType    int8      `description:"协作方式,1:个人,2:多人协作。默认:1"`
+	ReportLayout       int8      `description:"报告布局,1:常规布局,2:智能布局。默认:1"`
+	IsPublicPublish    int8      `description:"是否公开发布,1:是,2:否"`
+	ReportCreateTime   time.Time `description:"报告时间创建时间"`
+	InheritReportId    int       `description:"待继承的报告ID"`
 }
 
 type ReportList struct {

+ 48 - 27
models/report_chapter_type.go

@@ -7,28 +7,30 @@ import (
 )
 
 type ReportChapterType struct {
-	ReportChapterTypeId    int       `orm:"column(report_chapter_type_id);pk" description:"报告章节类型id"`
-	ReportChapterTypeKey   string    `description:"章节key"`
-	ReportChapterTypeThumb string    `description:"H5展示的图片"`
-	BannerUrl              string    `description:"banner显示图片"`
-	ReportChapterTypeName  string    `description:"报告章节类型名称"`
-	Sort                   int       `description:"排序字段"`
-	Enabled                int       `description:"启禁用状态"`
-	CreatedTime            time.Time `description:"创建时间"`
-	LastUpdatedTime        time.Time `description:"更新时间"`
-	ResearchType           string    `description:"研报类型"`
-	SelectedImage          string    `description:"选中时的图片"`
-	UnselectedImage        string    `description:"没选中时的图片"`
-	PcSelectedImage        string    `description:"PC-选中的图片"`
-	PcUnselectedImage      string    `description:"PC-未选中的图片"`
-	EditImgUrl             string    `description:"管理后台编辑时选用的图"`
-	TickerTitle            string    `description:"指标列的标题"`
-	IsShow                 int       `description:"是否显示(研报小程序端根据此字段判断)"`
-	PauseStartTime         string    `description:"暂停开始日期"`
-	PauseEndTime           string    `description:"暂停结束日期"`
-	IsSet                  int       `description:"是否设置:0为设置,1已设置"`
-	YbIconUrl              string    `description:"研报小程序icon"`
-	YbBottomIcon           string    `description:"研报小程序详情底部icon"`
+	ReportChapterTypeId        int       `orm:"column(report_chapter_type_id);pk" description:"报告章节类型id"`
+	ReportChapterTypeKey       string    `description:"章节key"`
+	ReportChapterTypeThumb     string    `description:"H5展示的图片"`
+	BannerUrl                  string    `description:"banner显示图片"`
+	ReportChapterTypeName      string    `description:"报告章节类型名称"`
+	Sort                       int       `description:"排序字段"`
+	Enabled                    int       `description:"启禁用状态"`
+	CreatedTime                time.Time `description:"创建时间"`
+	LastUpdatedTime            time.Time `description:"更新时间"`
+	ResearchType               string    `description:"研报类型"`
+	SelectedImage              string    `description:"选中时的图片"`
+	UnselectedImage            string    `description:"没选中时的图片"`
+	PcSelectedImage            string    `description:"PC-选中的图片"`
+	PcUnselectedImage          string    `description:"PC-未选中的图片"`
+	EditImgUrl                 string    `description:"管理后台编辑时选用的图"`
+	TickerTitle                string    `description:"指标列的标题"`
+	IsShow                     int       `description:"是否显示(研报小程序端根据此字段判断)"`
+	PauseStartTime             string    `description:"暂停开始日期"`
+	PauseEndTime               string    `description:"暂停结束日期"`
+	IsSet                      int       `description:"是否设置:0为设置,1已设置"`
+	YbIconUrl                  string    `description:"研报小程序icon"`
+	YbBottomIcon               string    `description:"研报小程序详情底部icon"`
+	ReportClassifyId           int       `description:"所属分类id"`
+	InheritReportChapterTypeId int       `description:"继承的报告章节类型id"`
 }
 
 func (item *ReportChapterType) Create() (err error) {
@@ -183,7 +185,7 @@ func ResetDayWeekReportUpdateRule(researchType string) (err error) {
 }
 
 // SetDayWeekReportUpdateRule 设置章节类型的暂停时间
-func SetDayWeekReportUpdateRule(researchType string, list []DayWeekReportUpdateRule) (err error) {
+func SetDayWeekReportUpdateRule(classifyId int, list []DayWeekReportUpdateRule) (err error) {
 	o := orm.NewOrm()
 	to, err := o.Begin()
 	if err != nil {
@@ -198,8 +200,8 @@ func SetDayWeekReportUpdateRule(researchType string, list []DayWeekReportUpdateR
 	}()
 
 	// 先将所有品种的状态变更为启用
-	sql := ` UPDATE report_chapter_type SET pause_start_time = null, pause_end_time = null, is_set = 0 WHERE research_type = ?`
-	_, err = to.Raw(sql, researchType).Exec()
+	sql := ` UPDATE report_chapter_type SET pause_start_time = null, pause_end_time = null, is_set = 0 WHERE report_classify_id = ?`
+	_, err = to.Raw(sql, classifyId).Exec()
 	if err != nil {
 		return
 	}
@@ -208,8 +210,8 @@ func SetDayWeekReportUpdateRule(researchType string, list []DayWeekReportUpdateR
 		if v.PauseStartTime == `` || v.PauseEndTime == `` {
 			continue
 		}
-		tmpSql := ` UPDATE report_chapter_type SET pause_start_time = ?, pause_end_time = ?, is_set = 1 WHERE research_type = ? AND report_chapter_type_id = ? `
-		_, err = to.Raw(tmpSql, v.PauseStartTime, v.PauseEndTime, researchType, v.ReportChapterTypeId).Exec()
+		tmpSql := ` UPDATE report_chapter_type SET pause_start_time = ?, pause_end_time = ?, is_set = 1 WHERE report_classify_id = ? AND report_chapter_type_id = ? `
+		_, err = to.Raw(tmpSql, v.PauseStartTime, v.PauseEndTime, classifyId, v.ReportChapterTypeId).Exec()
 		if err != nil {
 			return
 		}
@@ -292,6 +294,25 @@ func GetDisableUpdateReportChapterTypeListByResearchType() (list []*ReportChapte
 	return
 }
 
+// GetDisableUpdateReportChapterTypeListByResearchTypeByClassifyIdList
+// @Description: 根据分类id列表获取停止更新的章节类型列表
+// @author: Roc
+// @datetime 2024-06-18 14:13:50
+// @param classifyIdList []int
+// @return list []*ReportChapterType
+// @return err error
+func GetDisableUpdateReportChapterTypeListByResearchTypeByClassifyIdList(classifyIdList []int) (list []*ReportChapterType, err error) {
+	num := len(classifyIdList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrm()
+	sql := ` SELECT * FROM report_chapter_type WHERE enabled = 0 AND report_classify_id in (` + utils.GetOrmInReplace(num) + `) `
+	_, err = o.Raw(sql, classifyIdList).QueryRows(&list)
+
+	return
+}
+
 // UpdateReportChapterTypeResp 停止更新的报告分类列表
 type UpdateReportChapterTypeResp struct {
 	Day  []*ReportChapterType `description:"所有晨报品种"`

+ 11 - 3
models/roadshow/calendar.go

@@ -118,6 +118,17 @@ func GetRsCalendarResearcherListById(rsCalendarId int) (item []*RsCalendarResear
 	return
 }
 
+// 根据多个路演ID获取研究员信息
+func GetRsCalendarResearcherListByIds(rsCalendarIds []int) (item []*RsCalendarResearcher, err error) {
+	if len(rsCalendarIds) == 0 {
+		return
+	}
+	o := orm.NewOrm()
+	sql := `SELECT * FROM rs_calendar_researcher WHERE rs_calendar_id IN (` + utils.GetOrmInReplace(len(rsCalendarIds)) + `) `
+	_, err = o.Raw(sql, rsCalendarIds).QueryRows(&item)
+	return
+}
+
 func GetRsCalendarResearcherListByCalendarResearcherId(rsCalendarResearcherId int) (item []*RsCalendarResearcher, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT * FROM rs_calendar_researcher WHERE rs_calendar_researcher_id=? `
@@ -167,7 +178,6 @@ type ResearcherGroup struct {
 	ResearcherList []*ResearcherGroup
 }
 
-
 func GetResearcherGroup() (list []*ResearcherGroup, err error) {
 	o := orm.NewOrm()
 	sql := ` SELECT group_id,group_name FROM admin AS a
@@ -962,7 +972,6 @@ func GetOverseaCustomCalendarList2(sellerId, researcherId, startDate, endDate, c
     INNER JOIN %s.english_company AS cc ON aa.company_id=cc.company_id
 		where aa.english_company= 1 AND aa.source = 0 AND cc.is_deleted=0  AND bb.rs_calendar_researcher_status=2 AND bb.researcher_id != 0 `, databaseName)
 
-
 	if startDate != "" {
 		sql2 += ` AND bb.start_date >= ?  `
 		pars = append(pars, startDate)
@@ -985,7 +994,6 @@ func GetOverseaCustomCalendarList2(sellerId, researcherId, startDate, endDate, c
 	sql := `SELECT m.*  FROM (` + sql1 + ` UNION ALL ` + sql2
 	sql += ` ) AS m  WHERE 1=1 `
 
-
 	sql += ` Group by rs_calendar_id  `
 	_, err = o.Raw(sql, pars).QueryRows(&list)
 

+ 4 - 4
models/roadshow/company.go

@@ -25,7 +25,7 @@ func CompanySearch(sellerId int, keyWord string) (list []*CompanySearchView, err
 	return
 }
 
-func CompanySearchV2(sellerId int, keyWord string) (list []*CompanySearchView, err error) {
+func CompanySearchV2(sellerId, groupId int, keyWord string) (list []*CompanySearchView, err error) {
 	list = make([]*CompanySearchView, 0)
 
 	// 中文客户
@@ -39,10 +39,10 @@ func CompanySearchV2(sellerId int, keyWord string) (list []*CompanySearchView, e
 				company AS a
 			INNER JOIN company_product AS b ON a.company_id = b.company_id 
 			WHERE
-				b.status IN ('正式', '试用') AND (b.seller_id = ? OR b.share_seller_id = ?) AND a.company_name LIKE ?
+				b.status IN ('正式', '试用', '永续') AND (b.seller_id = ? OR b.share_seller_id = ?  OR b.group_id = ? OR b.share_group_id = ?  ) AND a.company_name LIKE ?
 			GROUP BY
-				b.company_id`
-	_, err = o.Raw(sql, sellerId, sellerId, keyWord).QueryRows(&companies)
+				b.company_id `
+	_, err = o.Raw(sql, sellerId, sellerId, groupId, groupId, keyWord).QueryRows(&companies)
 	if err != nil {
 		return
 	}

+ 119 - 0
models/roadshow/rs_calendar_meeting_label_group.go

@@ -0,0 +1,119 @@
+package roadshow
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"hongze/hz_crm_api/utils"
+	"time"
+)
+
+type RsCalendarMeetingLabelGroup struct {
+	LabelId      int       `orm:"column(label_id);pk" description:"主键ID"`
+	RsCalendarId int       `description:"路演ID"`
+	CreateTime   time.Time `description:"创建时间"`
+	ModifyTime   time.Time `description:"修改时间"`
+	AdminId      int       `description:"管理员ID"`
+	AdminName    string    `description:"管理员姓名"`
+	TagType      int       `description:"标签类型,1产业,2标的,3行业权限"`
+	TagId        int       `description:"标签ID"`
+}
+
+// 新增
+func AddRsCalendarMeetingLabelGroup(item *RsCalendarMeetingLabelGroup) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Insert(item)
+	return
+}
+
+// AddRsCalendarMeetingLabelGroupMulti 批量添加
+func AddRsCalendarMeetingLabelGroupMulti(items []*RsCalendarMeetingLabelGroup, rsCalendarId int) (err error) {
+	if len(items) == 0 {
+		return
+	}
+	o, err := orm.NewOrm().Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err == nil {
+			o.Commit()
+		} else {
+			o.Rollback()
+		}
+	}()
+
+	//删除历史记录
+	sql := " DELETE FROM rs_calendar_meeting_label_group  WHERE rs_calendar_id = ? "
+	_, err = o.Raw(sql, rsCalendarId).Exec()
+	if err != nil {
+		return
+	}
+
+	//批量插入
+	_, err = o.InsertMulti(len(items), items)
+	if err != nil {
+		return
+	}
+	return
+}
+
+// 获取数量
+func GetRsCalendarMeetingLabelGroupByRsCalendarId(rsCalendarId int) (count int, err error) {
+	o := orm.NewOrm()
+	sqlCount := ` SELECT COUNT(1) AS count  FROM rs_calendar_meeting_label_group WHERE   rs_calendar_id   = ?`
+	err = o.Raw(sqlCount, rsCalendarId).QueryRow(&count)
+	return
+}
+
+// 获取详情
+func GetRsCalendarMeetingLabelGroupDetailByRsCalendarId(rsCalendarId int) (item *RsCalendarMeetingLabelGroup, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT *  FROM rs_calendar_meeting_label_group WHERE   rs_calendar_id   = ? `
+	err = o.Raw(sql, rsCalendarId).QueryRow(&item)
+	return
+}
+
+// 根据多个路演ID获取研信息
+func GetRsCalendarMeetingLabelGroupListByRsCalendarId(rsCalendarId int) (item []*RsCalendarMeetingLabelGroup, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM rs_calendar_meeting_label_group WHERE rs_calendar_id  = ? `
+	_, err = o.Raw(sql, rsCalendarId).QueryRows(&item)
+	return
+}
+
+// 根据多个路演ID获取研信息
+func GetRsCalendarMeetingLabelGroupDetailByRsCalendarIds(rsCalendarIds []int) (item []*RsCalendarMeetingLabelGroup, err error) {
+	if len(rsCalendarIds) == 0 {
+		return
+	}
+	o := orm.NewOrm()
+	sql := `SELECT * FROM rs_calendar_meeting_label_group WHERE rs_calendar_id IN (` + utils.GetOrmInReplace(len(rsCalendarIds)) + `) `
+	_, err = o.Raw(sql, rsCalendarIds).QueryRows(&item)
+	return
+}
+
+// 修改
+func UpdateProductInterior(item *RsCalendarMeetingLabelGroup) (err error) {
+	o := orm.NewOrm()
+	updateParams := make(map[string]interface{})
+	updateParams["AdminId"] = item.AdminId
+	updateParams["AdminName"] = item.AdminName
+	updateParams["TagType"] = item.TagType
+	updateParams["TagId"] = item.TagId
+	updateParams["ModifyTime"] = item.ModifyTime
+	ptrStructOrTableName := "rs_calendar_meeting_label_group"
+	whereParam := map[string]interface{}{"rs_calendar_id": item.RsCalendarId}
+	qs := o.QueryTable(ptrStructOrTableName)
+	for expr, exprV := range whereParam {
+		qs = qs.Filter(expr, exprV)
+	}
+	_, err = qs.Update(updateParams)
+	return
+}
+
+// 根据类型、id 获取对应的分组信息
+func GetRsCalendarMeetingLabelGroupDetailByTag(tagType, tagId int) (item []*RsCalendarMeetingLabelGroup, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM rs_calendar_meeting_label_group WHERE tag_type = ? AND tag_id  = ?  `
+	_, err = o.Raw(sql, tagType, tagId).QueryRows(&item)
+	return
+}

+ 140 - 1
models/roadshow/rs_calendar_meeting_user.go

@@ -2,13 +2,21 @@ package roadshow
 
 import (
 	"github.com/beego/beego/v2/client/orm"
+	"hongze/hz_crm_api/models/cygx"
 	"hongze/hz_crm_api/utils"
+	"strconv"
 	"time"
 )
 
 type AddRsCalendarMeetingUserReq struct {
 	RsCalendarId int   `description:"日程ID"`
 	UserId       []int // 用户ID
+	TagList      []*AddRsCalendarMeetingUserTagReq
+}
+
+type AddRsCalendarMeetingUserTagReq struct {
+	TagType int `description:"标签类型"`
+	TagId   int `description:"标签ID"`
 }
 
 type RsCalendarMeetingUser struct {
@@ -38,7 +46,8 @@ type DeleteRsCalendarMeetingUserReq struct {
 }
 
 type RsCalendarMeetingUserListResp struct {
-	List []*RsCalendarMeetingUserResp
+	List      []*RsCalendarMeetingUserResp
+	ListLebel []*cygx.RaiServeTagResp
 }
 
 // MultiAddRsCalendarMeetingUser 批量添加RsCalendarMeetingUser
@@ -59,6 +68,39 @@ func DeleteRsCalendarMeetingUser(rsCalendarMeetingUserID int) (err error) {
 	return err
 }
 
+// 获取数量
+func GetRsCalendarMeetingUserCountByUserId(userId int) (count int, err error) {
+	o := orm.NewOrm()
+	sqlCount := ` SELECT COUNT(1) AS count  FROM rs_calendar_meeting_user WHERE   user_id   = ?`
+	err = o.Raw(sqlCount, userId).QueryRow(&count)
+	return
+}
+
+// 获取数量
+func GetRsCalendarMeetingUserCountByUserModel(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrm()
+	sqlCount := ` SELECT COUNT(1) AS count  FROM rs_calendar_meeting_user as r
+                  WHERE 1= 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+// 获取数量
+func GetRsCalendarMeetingUserCountByUserModelWeekly(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrm()
+	sqlCount := ` SELECT COUNT(1) AS count  FROM 	rs_calendar_meeting_user AS r
+			INNER JOIN user_seller_relation AS us ON us.user_id = r.user_id   AND us.product_id = 2 
+		WHERE 1 = 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
 // 列表
 func GetRsCalendarMeetingUserList(condition string, pars []interface{}) (items *RsCalendarMeetingUserResp, err error) {
 	o := orm.NewOrm()
@@ -94,3 +136,100 @@ func GetRsCalendarMeetingUserListCount(rsCalendarIds []int) (items []*RsCalendar
 	_, err = o.Raw(sql, rsCalendarIds).QueryRows(&items)
 	return
 }
+
+type RsCalendarMeetingUserByRai struct {
+	RsCalendarMeetingUserId int    `orm:"column(rs_calendar_meeting_user_id);pk" description:"主键ID"`
+	RsCalendarId            int    `description:"日程ID"`
+	UserId                  int    `description:"用户ID"`
+	Mobile                  string `description:"手机号"`
+	Email                   string `description:"邮箱"`
+	CompanyId               int    `description:"公司ID"`
+	CompanyName             string `description:"公司名称"`
+	RealName                string `description:"用户实际名称"`
+	StartDate               string `description:"开始时间"`
+	EndDate                 string `description:"结束时间"`
+	EndTime                 string `description:"开始时间"`
+	StartTime               string `description:"结束时间"`
+	StartWeek               string `description:"起始周"`
+	RoadshowType            string `description:"路演形式"`
+	ResearcherName          string `description:"研究员姓名"`
+	TagType                 int    `description:"标签类型,1产业,2标的,3行业权限"`
+}
+
+// 权益联系人列表获取相关信息
+func GetRsCalendarMeetingUserByRai(condition string, startSize, pageSize int) (total int, items []*RsCalendarMeetingUserByRai, err error) {
+	o := orm.NewOrm()
+	var sql string
+	sql += `SELECT
+			r.company_id,
+			r.company_name,
+			r.real_name,
+			r.mobile,
+			b.start_date,
+			b.end_date,
+			b.start_time,
+			b.end_time,
+			b.start_week,
+			b.researcher_name,
+			a.roadshow_type,
+			a.rs_calendar_id,
+			g.tag_type
+		FROM
+			rs_calendar_meeting_user AS r
+			INNER JOIN rs_calendar AS a ON a.rs_calendar_id = r.rs_calendar_id
+			INNER JOIN rs_calendar_researcher AS b ON a.rs_calendar_id = b.rs_calendar_id 
+			LEFT JOIN rs_calendar_meeting_label_group AS g ON g.rs_calendar_id = b.rs_calendar_id 
+		WHERE
+			1 = 1 ` + condition + ` GROUP  BY a.rs_calendar_id  `
+
+	totalSql := `SELECT COUNT(1) total FROM (` + sql + `) z `
+	err = o.Raw(totalSql).QueryRow(&total)
+	if err != nil {
+		return
+	}
+
+	sql += ` ORDER BY  start_date  DESC `
+	if startSize > 0 || pageSize > 0 {
+		sql += ` LIMIT ` + strconv.Itoa(startSize) + "," + strconv.Itoa(pageSize)
+	}
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+func GetRsCalendarMeetingUserByRaiWeekly(condition string, startSize, pageSize int) (total int, items []*RsCalendarMeetingUserByRai, err error) {
+	o := orm.NewOrm()
+	var sql string
+	sql += `SELECT
+			r.company_id,
+			r.company_name,
+			r.real_name,
+			r.mobile,
+			b.start_date,
+			b.end_date,
+			b.start_time,
+			b.end_time,
+			b.start_week,
+			b.researcher_name,
+			a.roadshow_type,
+			a.rs_calendar_id
+		FROM
+			rs_calendar_meeting_user AS r
+			INNER JOIN rs_calendar AS a ON a.rs_calendar_id = r.rs_calendar_id
+			INNER JOIN rs_calendar_researcher AS b ON a.rs_calendar_id = b.rs_calendar_id 
+			INNER JOIN user_seller_relation AS us ON us.user_id = r.user_id   AND us.product_id = 2 
+		WHERE
+			1 = 1 ` + condition
+
+	totalSql := `SELECT COUNT(1) total FROM (` + sql + `) z `
+	err = o.Raw(totalSql).QueryRow(&total)
+	if err != nil {
+		return
+	}
+
+	sql += ` ORDER BY  start_date  DESC `
+	if startSize > 0 || pageSize > 0 {
+		sql += ` LIMIT ` + strconv.Itoa(startSize) + "," + strconv.Itoa(pageSize)
+	}
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}

+ 15 - 15
models/user_seller_relation.go

@@ -18,7 +18,7 @@ type UserSellerRelation struct {
 	CreateTime time.Time `description:"创建时间"`
 }
 
-//添加销售员与员工的关系
+// 添加销售员与员工的关系
 func AddUserSellerRelation(userId int64, companyId, sellerId, productId int, seller, mobile, email string) (lastId int64, err error) {
 	o := orm.NewOrm()
 	relation := UserSellerRelation{
@@ -36,7 +36,7 @@ func AddUserSellerRelation(userId int64, companyId, sellerId, productId int, sel
 	return
 }
 
-//根据企业用户id修改所属销售
+// 根据企业用户id修改所属销售
 func UpdateUserSellerRelationByCompanyId(companyId, productId, sellerId int, seller string) (err error) {
 	o := orm.NewOrm()
 	sql := `UPDATE user_seller_relation SET seller_id=?,seller = ? ,modify_time=NOW() WHERE company_id = ? AND product_id=?`
@@ -44,7 +44,7 @@ func UpdateUserSellerRelationByCompanyId(companyId, productId, sellerId int, sel
 	return
 }
 
-//删除销售员与员工的关系
+// 删除销售员与员工的关系
 func DeleteUserSellerRelation(userId, sellerId int) (err error) {
 	o := orm.NewOrm()
 	sql := ` DELETE FROM user_seller_relation WHERE user_id=? and seller_id = ?`
@@ -52,7 +52,7 @@ func DeleteUserSellerRelation(userId, sellerId int) (err error) {
 	return
 }
 
-//根据产品id删除销售员与员工的关系
+// 根据产品id删除销售员与员工的关系
 func DeleteUserSellerRelationByProductId(userId, productId int) (err error) {
 	o := orm.NewOrm()
 	sql := ` DELETE FROM user_seller_relation WHERE user_id=? and product_id = ?`
@@ -60,7 +60,7 @@ func DeleteUserSellerRelationByProductId(userId, productId int) (err error) {
 	return
 }
 
-//根据联系人id删除所有销售员与该联系人的关系
+// 根据联系人id删除所有销售员与该联系人的关系
 func DeleteUserSellerRelationByUserId(userId int) (err error) {
 	o := orm.NewOrm()
 	sql := ` DELETE FROM user_seller_relation WHERE user_id=? `
@@ -68,7 +68,7 @@ func DeleteUserSellerRelationByUserId(userId int) (err error) {
 	return
 }
 
-//根据用户id和销售员id获取关系
+// 根据用户id和销售员id获取关系
 func GetUserSellerRelation(userId int64, sellerId int) (item *UserSellerRelation, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT * FROM user_seller_relation WHERE user_id = ? and seller_id= ?`
@@ -76,7 +76,7 @@ func GetUserSellerRelation(userId int64, sellerId int) (item *UserSellerRelation
 	return
 }
 
-//获取用户的销售员(产品)的关系数量
+// 获取用户的销售员(产品)的关系数量
 func GetUserSellerRelationCount(userId int) (count int, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT COUNT(*) AS count
@@ -85,7 +85,7 @@ func GetUserSellerRelationCount(userId int) (count int, err error) {
 	return
 }
 
-//通过用户id获取用户的销售员(产品)的关系
+// 通过用户id获取用户的销售员(产品)的关系
 func GetUserSellerRelationList(userId int) (list []*UserSellerRelation, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT *
@@ -94,14 +94,14 @@ func GetUserSellerRelationList(userId int) (list []*UserSellerRelation, err erro
 	return
 }
 
-//用户与销售员的关系数量切片
+// 用户与销售员的关系数量切片
 type UserSellerRelationSlice struct {
 	Total      int    `description:"总阅读数"`
 	UserId     int    `description:"用户id"`
 	ProductIds string `description:"所属权限id"`
 }
 
-//根据用户id字符串,获取用户与销售员的关系数量
+// 根据用户id字符串,获取用户与销售员的关系数量
 func GetUserSellerRelationCountByUserIds(userIds string) (items []*UserSellerRelationSlice, err error) {
 	o := orm.NewOrm()
 	sql := `select *,COUNT(1) AS total,GROUP_CONCAT( DISTINCT product_id SEPARATOR ',' ) AS product_ids from (SELECT user_id, product_id
@@ -110,7 +110,7 @@ func GetUserSellerRelationCountByUserIds(userIds string) (items []*UserSellerRel
 	return
 }
 
-//根据用户产品权限来获取名片数
+// 根据用户产品权限来获取名片数
 func GetCompanyUserBusinessCardCountByProductId(companyId, productId int) (count int, err error) {
 	o := orm.NewOrm()
 	sql := ` SELECT COUNT(1) AS count FROM user_seller_relation a 
@@ -127,7 +127,7 @@ func GetCompanyUserSellerRelationByProductId(companyId, productId int) (items []
 	return
 }
 
-//根据企业id和产品id获取所有不是该产品id的所有用户
+// 根据企业id和产品id获取所有不是该产品id的所有用户
 func GetNotCompanyUserSellerRelationByProductId(companyId, productId int) (items []*UserSellerRelation, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT user_id FROM user_seller_relation WHERE company_id = ? AND product_id != ?`
@@ -135,7 +135,7 @@ func GetNotCompanyUserSellerRelationByProductId(companyId, productId int) (items
 	return
 }
 
-//根据产品id删除某个客户下 销售员与员工的关系
+// 根据产品id删除某个客户下 销售员与员工的关系
 func DelCompanyUserSellerRelationByProductId(companyId, productId int) (err error) {
 	o := orm.NewOrm()
 	sql := ` DELETE FROM user_seller_relation WHERE company_id = ? AND product_id = ? `
@@ -143,7 +143,7 @@ func DelCompanyUserSellerRelationByProductId(companyId, productId int) (err erro
 	return
 }
 
-//获取联系人分组信息
+// 获取联系人分组信息
 type UserSellerRelationGroup struct {
 	RelationId     int64     `orm:"column(relation_id);pk"`
 	UserId         int       `description:"用户id"`
@@ -170,7 +170,7 @@ func GetUserGroupSellerByUserId(userId int) (item *UserSellerRelationGroup, err
 	return
 }
 
-//根据联系人id获所有的分组信息
+// 根据联系人id获所有的分组信息
 func GetUserGroupSellersByUserId(userId int) (list []*UserSellerRelationGroup, err error) {
 	o := orm.NewOrm()
 	sql := ` SELECT a.*,b.real_name AS seller_real_name,c.status  

+ 8 - 8
models/yb/apply_record.go

@@ -173,7 +173,7 @@ WHERE
 	AND ( y.apply_record_id > 0 or a.company_id=1 or bp.company_product_id is null)
 	AND ( a.mobile IS NOT NULL || a.email IS NOT NULL ) 
 	AND ( a.mobile <> '' OR a.email <> '' ) 
-	AND ( c.create_platform <> 4 OR c.create_platform IS NULL )
+	AND ( c.create_platform in (1,3,6,9) OR c.create_platform IS NULL )
     AND ((y.apply_record_id > 0 and y.create_time > ?) OR (y.apply_record_id is null AND a.created_time > ?) )
 	AND ( y.source > 0 OR y.source IS NULL)
 `
@@ -181,10 +181,10 @@ WHERE
 	sql += ` GROUP BY a.user_id ORDER BY last_time desc`
 
 	sql += ` LIMIT ?,?`
-	pars = append(pars, startTime)
-	pars = append(pars, startTime)
+	//pars = append(pars, startTime)
+	//pars = append(pars, startTime)
 
-	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&list)
+	_, err = o.Raw(sql, startTime, startTime, pars, startSize, pageSize).QueryRows(&list)
 	return
 }
 
@@ -259,17 +259,17 @@ WHERE
 	AND ( y.apply_record_id > 0 or a.company_id=1 or bp.company_product_id is null)
 	AND ( a.mobile IS NOT NULL || a.email IS NOT NULL ) 
 	AND ( a.mobile <> '' OR a.email <> '' ) 
-	AND ( c.create_platform <> 4 OR c.create_platform IS NULL )
+	AND ( c.create_platform in (1,3,6,9) OR c.create_platform IS NULL )
     AND ((y.apply_record_id > 0 and y.create_time > ?) OR (y.apply_record_id is null AND a.created_time > ?) )
 	AND ( y.source > 0 OR y.source IS NULL)
 `
 	sql += condition
 	sql += ` GROUP BY a.user_id ORDER BY last_time desc`
 
-	pars = append(pars, startTime)
-	pars = append(pars, startTime)
+	//pars = append(pars, startTime)
+	//pars = append(pars, startTime)
 
-	_, err = o.Raw(sql, pars).QueryRows(&list)
+	_, err = o.Raw(sql, startTime, startTime, pars).QueryRows(&list)
 	return
 }
 

+ 99 - 0
routers/commentsRouter.go

@@ -2293,6 +2293,78 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"],
+        beego.ControllerComments{
+            Method: "BillList",
+            Router: `/rai_serve/bill_list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"],
+        beego.ControllerComments{
+            Method: "ChcckPermissionName",
+            Router: `/rai_serve/chcck_PermissionName`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"],
+        beego.ControllerComments{
+            Method: "CoverageRate",
+            Router: `/rai_serve/coverage_rate`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/rai_serve/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"],
+        beego.ControllerComments{
+            Method: "SearchTag",
+            Router: `/rai_serve/search_tag`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"],
+        beego.ControllerComments{
+            Method: "SearchTagCalendar",
+            Router: `/rai_serve/search_tag_by_calendar`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"],
+        beego.ControllerComments{
+            Method: "TypeList",
+            Router: `/rai_serve/type_list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"],
+        beego.ControllerComments{
+            Method: "UserFeedbackList",
+            Router: `/user_feedback/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ReportArticleController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ReportArticleController"],
         beego.ControllerComments{
             Method: "ExportList",
@@ -3139,6 +3211,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserFeedbackController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserFeedbackController"],
+        beego.ControllerComments{
+            Method: "UserFeedbackAdd",
+            Router: `/user_feedback/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserFeedbackController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserFeedbackController"],
+        beego.ControllerComments{
+            Method: "UserFeedbackDel",
+            Router: `/user_feedback/del`,
+            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: "ApprovalLogList",
@@ -9925,6 +10015,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanySellerController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanySellerController"],
+        beego.ControllerComments{
+            Method: "RaiServeSellerList",
+            Router: `/seller/rai_serve/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanySellerController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanySellerController"],
         beego.ControllerComments{
             Method: "RoadshowFiccList",

+ 2 - 0
routers/router.go

@@ -162,6 +162,8 @@ func init() {
 				&cygx.UserAdminShareHistoryController{},
 				&cygx.EnterScoreController{},
 				&cygx.OrderController{},
+				&cygx.RaiServeCoAntroller{},
+				&cygx.UserFeedbackController{},
 			),
 		),
 		web.NSNamespace("/advisory",

+ 101 - 13
services/classify.go

@@ -7,6 +7,7 @@ import (
 	"hongze/hz_crm_api/utils"
 	"io/ioutil"
 	"net/http"
+	"sort"
 	"strings"
 )
 
@@ -37,19 +38,20 @@ type EditClassifyReq struct {
 	/*HasTeleconference int                    `description:"是否有电话会:0-否 1-是"`
 	VipTitle          string                 `description:"研究员头衔"`*/
 	//Sort              int                    `description:"后台排序"`
-	IsShow         int                    `description:"是否在小程序显示:1-显示 0-隐藏"`
-	YbFiccSort     int                    `description:"小程序FICC页排序"`
-	YbFiccIcon     string                 `description:"小程序FICC页icon"`
-	YbFiccPcIcon   string                 `description:"小程序PC端FICC页背景图"`
-	YbIconUrl      string                 `description:"小程序已购页icon"`
-	YbBgUrl        string                 `description:"小程序已购详情背景图"`
-	YbListImg      string                 `description:"小程序研报列表封面图"`
-	YbShareBgImg   string                 `description:"小程序研报详情分享背景图"`
-	YbRightBanner  string                 `description:"Pc端详情页,右侧,报告合集背景图"`
-	MenuList       []*ClassifyMenuSaveReq `description:"子目录列表"`
-	ClassifyMenuId int                    `description:"二级分类-子目录ID"`
-	RelateTel      int                    `description:"是否在电话会中可选: 0-否; 1-是"`
-	RelateVideo    int                    `description:"是否在路演视频中可选: 0-否; 1-是"`
+	IsShow               int                    `description:"是否在小程序显示:1-显示 0-隐藏"`
+	YbFiccSort           int                    `description:"小程序FICC页排序"`
+	YbFiccIcon           string                 `description:"小程序FICC页icon"`
+	YbFiccPcIcon         string                 `description:"小程序PC端FICC页背景图"`
+	YbIconUrl            string                 `description:"小程序已购页icon"`
+	YbBgUrl              string                 `description:"小程序已购详情背景图"`
+	YbListImg            string                 `description:"小程序研报列表封面图"`
+	YbShareBgImg         string                 `description:"小程序研报详情分享背景图"`
+	YbRightBanner        string                 `description:"Pc端详情页,右侧,报告合集背景图"`
+	MenuList             []*ClassifyMenuSaveReq `description:"子目录列表"`
+	ClassifyMenuId       int                    `description:"二级分类-子目录ID"`
+	RelateTel            int                    `description:"是否在电话会中可选: 0-否; 1-是"`
+	RelateVideo          int                    `description:"是否在路演视频中可选: 0-否; 1-是"`
+	ReportDetailShowType int                    `description:"报告详情的展示类型:1-拼接;2:目录"`
 }
 
 // ClassifyMenuSaveReq 保存分类子目录请求体
@@ -182,3 +184,89 @@ type GetClassifyListResp struct {
 	Data   models.ClassifyListResp `json:"data" description:"返回数据"`
 	ErrMsg string                  `json:"-" description:"错误信息,不用返回给前端,只是做日志记录"`
 }
+
+// GetParentClassifyListByParentIdList
+// @Description: 递归获取父级分类信息,正常来讲只有三次
+// @author: Roc
+// @datetime 2024-06-19 13:23:33
+// @param parentClassifyIdList []int
+// @return list []*models.ClassifyList
+// @return err error
+func GetParentClassifyListByParentIdList(parentClassifyIdList []int) (list []*models.Classify, err error) {
+	num := len(parentClassifyIdList)
+	if num <= 0 {
+		return
+	}
+	list, err = models.GetClassifyListByParentIdList(parentClassifyIdList)
+	if err != nil {
+		return
+	}
+
+	// 是否还有上级
+	{
+		currParentClassifyIdList := make([]int, 0)
+		for _, v := range list {
+			if v.ParentId > 0 {
+				currParentClassifyIdList = append(currParentClassifyIdList, v.ParentId)
+			}
+		}
+
+		if len(currParentClassifyIdList) > 0 {
+			tmpList, tmpErr := GetParentClassifyListByParentIdList(currParentClassifyIdList)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			list = append(tmpList, list...)
+		}
+	}
+
+	return
+}
+
+// GetClassifyListTreeRecursive
+// @Description: 递归获取分类树形结构
+// @author: Roc
+// @datetime 2024-06-19 13:23:28
+// @param list []*models.ClassifyList
+// @param parentId int
+// @return []*models.ClassifyList
+func GetClassifyListTreeRecursive(list []*models.SimpleClassifyList, parentId int) []*models.SimpleClassifyList {
+	res := make([]*models.SimpleClassifyList, 0)
+	for _, v := range list {
+		if v.ParentId == parentId {
+			v.Child = GetClassifyListTreeRecursive(list, v.Id)
+			res = append(res, v)
+		}
+	}
+
+	// 前端的JP需要我这么返回
+	if len(res) <= 0 {
+		res = nil
+	}
+
+	return res
+}
+
+// BySortAndCreateTime 用来排序,先按Sort字段升序排序,若Sort相同,则按照CreateTime字段升序排序。
+type BySortAndCreateTime []*models.SimpleClassifyList
+
+func (a BySortAndCreateTime) Len() int {
+	return len(a)
+}
+
+func (a BySortAndCreateTime) Swap(i, j int) {
+	a[i], a[j] = a[j], a[i]
+}
+
+func (a BySortAndCreateTime) Less(i, j int) bool {
+	if a[i].Sort == a[j].Sort {
+		return a[i].CreateTime.Before(a[j].CreateTime)
+	}
+	return a[i].Sort < a[j].Sort
+}
+
+// SortClassifyListBySortAndCreateTime sorts the ClassifyList slice by Sort and then CreateTime in ascending order.
+func SortClassifyListBySortAndCreateTime(classifyList []*models.SimpleClassifyList) {
+	sort.Sort(BySortAndCreateTime(classifyList))
+}

+ 14 - 0
services/company.go

@@ -998,6 +998,9 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 						button.BtnShare = true
 						button.BtnRemarkEdit = true
 						button.BtnRemarkView = true
+						if sellerId != sysUserId {
+							button.BtnModifySeller = false
+						}
 					} else if productStatus == utils.COMPANY_STATUS_TRY_OUT { //试用
 						button.BtnEdit = true
 						button.BtnDelete = true
@@ -1008,11 +1011,17 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 						button.BtnModifySeller = true
 						button.BtnRemarkEdit = true
 						button.BtnRemarkView = true
+						if sellerId != sysUserId {
+							button.BtnModifySeller = false
+						}
 					} else if productStatus == utils.COMPANY_STATUS_FREEZE { //冻结
 						button.BtnThaw = true
 						button.BtnModifySeller = true
 						button.BtnRemarkEdit = true
 						button.BtnRemarkView = true
+						if sellerId != sysUserId {
+							button.BtnModifySeller = false
+						}
 					} else if productStatus == utils.COMPANY_STATUS_LOSE { //流失
 						button.BtnApplyReceive = true
 					} else { //永续
@@ -2418,6 +2427,11 @@ func GetShareCompanyPermissionButton(roleTypeCode, statuses string, productId in
 		button.BtnRemarkView = true
 		button.BtnServiceRecord = true
 	}
+
+	//梁春悦的单独展示
+	if sysUser.RoleName == "权益服务组长" {
+		button.BtnModifySeller = true
+	}
 	if roleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
 		button.BtnModifySeller = false
 	}

+ 1 - 1
services/company_apply/company_approval.go

@@ -856,7 +856,7 @@ func afterApproved(companyApprovalId int, opUserId int, opUserName string) (err
 		remark := "审批"
 		operation := "approve"
 		approveContent := "审批通过"
-		if companyProduct.InitStatus == utils.COMPANY_STATUS_FOREVER && companyProduct.ProductId == 2 { //权益永续客户申请内容做变更
+		if companyProduct.Status == utils.COMPANY_STATUS_FOREVER && companyProduct.InitStatus == utils.COMPANY_STATUS_FOREVER && companyProduct.ProductId == 2 { //权益永续客户申请内容做变更
 			//123月份申请转正通过时,将试用期限延长(更新)至4.30。456月份申请转正通过时,将试用期限延长至7.31。789月份申请转正通过时,将试用期限延长至10.31。101112月份申请转正通过时,将试用期限延长至次年1.31。
 			endDateContent := utils.GetLastDayOfQuarter(time.Now()).Format(utils.FormatDate)
 			approveContent += ",试用延期至" + endDateContent

+ 37 - 0
services/company_product.go

@@ -4,6 +4,7 @@ import (
 	"errors"
 	"fmt"
 	"hongze/hz_crm_api/models/company"
+	"hongze/hz_crm_api/models/system"
 	"hongze/hz_crm_api/services/alarm_msg"
 )
 
@@ -34,3 +35,39 @@ func GetSellNameMapByCompanyIds(companyIds []int) (respMap map[int]string) {
 	}
 	return
 }
+
+//	func init() {
+//		Need960init()
+//	}
+func Need960init() (respMap map[int]string) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+		}
+	}()
+
+	var pars []interface{}
+	var condition string
+	respMap = make(map[int]string, 0)
+	condition = "  AND  share_seller_id > 0   GROUP BY share_seller_id   "
+	list, e := company.GetCompanyProductList(condition, pars)
+	if e != nil {
+		err = errors.New("GetCompanyProductList, Err: " + e.Error())
+		return
+	}
+	for _, v := range list {
+		fmt.Println(v.ShareSellerId)
+		seller, err := system.GetSysAdminById(v.ShareSellerId)
+		if err != nil {
+			fmt.Println(err)
+			return
+		}
+		err = company.UpdateSharGroupid(seller.GroupId, v.ShareSellerId)
+		if err != nil {
+			fmt.Println(err)
+			return
+		}
+	}
+	return
+}

+ 47 - 0
services/cygx/acitvity.go

@@ -1496,3 +1496,50 @@ func GetMicroRoadShowDefaultImgConfig() (audioMap, videoMap, audioShareMap, vide
 	}
 	return
 }
+
+// 根据活动ID获取活动关联的产业名称
+func GetActivityIndustrialLabelByActivityIds(activityids []int, source int) (respMap map[int][]string) {
+	if len(activityids) == 0 {
+		return
+	}
+	var err error
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("根据活动ID获取活动关联的产业名称 失败 GetActivityIndustrialLabelByActivityIds activityids: ", activityids, err.Error()), 2)
+		}
+	}()
+	list, e := cygx.GetIndustrialActivityGroupListByactivityIdsArr(activityids, source)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetIndustrialActivityGroupListByactivityIdsArr, Err: " + e.Error())
+		return
+	}
+	respMap = make(map[int][]string, 0)
+	for _, v := range list {
+		respMap[v.ActivityId] = append(respMap[v.ActivityId], v.IndustryName)
+	}
+	return
+}
+
+// 根据活动ID获取活动关联的标的名称
+func GetActivitySubjectLabelByActivityIds(activityids []int, source int) (respMap map[int][]string) {
+	if len(activityids) == 0 {
+		return
+	}
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("根据活动ID获取活动关联的标的名称 失败 GetActivitySubjectLabelByActivityIds activityids: ", activityids, err.Error()), 2)
+		}
+	}()
+	list, e := cygx.GetSubjectActivityGroupManagementListByActivityIdsArr(activityids, source)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetSubjectActivityGroupManagementListByActivityIdsArr, Err: " + e.Error())
+		return
+	}
+	respMap = make(map[int][]string, 0)
+	for _, v := range list {
+		respMap[v.ActivityId] = append(respMap[v.ActivityId], v.SubjectName)
+	}
+	return
+}

+ 53 - 15
services/cygx/admin_power.go

@@ -13,23 +13,55 @@ import (
 // 获取这个销售所能查看的手机号权限
 func GetAdminLookUserMobile(adminInfo *system.Admin) (mapMobile map[string]string, err error) {
 
-	sellerId, e := company.GetCompanyProductSellerIdByShareSellerId(adminInfo.AdminId)
-	if e != nil && e.Error() != utils.ErrNoRow() {
-		err = errors.New("GetCompanyProductSellerIdByShareSellerId 根据共享销售id查被共享的公司销售id, Err: " + e.Error())
-		return
-	}
-	var conditionMobile string
+	//sellerIds, e := company.GetCompanyProductSellerIdByShareSellerId(adminInfo.AdminId)
+	//if e != nil && e.Error() != utils.ErrNoRow() {
+	//	err = errors.New("GetCompanyProductSellerIdByShareSellerId 根据共享销售id查被共享的公司销售id, Err: " + e.Error())
+	//	return
+	//}
+	var companyIds []string
+	var adminIds []string
+
+	//如果是组长获取所属组员的ID
 	if adminInfo.RoleTypeCode == "rai_group" {
-		//组长查看本组所有组员
-		conditionMobile = ` 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(adminInfo.AdminId) + ` )) `
-	} else {
-		//组员查看自己
-		if sellerId != 0 {
-			conditionMobile = ` SELECT mobile FROM user_seller_relation WHERE seller_id  IN ( ` + strconv.Itoa(adminInfo.AdminId) + `,` + strconv.Itoa(sellerId) + ` ) `
-		} else {
-			conditionMobile = ` SELECT mobile FROM user_seller_relation WHERE seller_id  IN ( ` + strconv.Itoa(adminInfo.AdminId) + ` ) `
+		adminList, e := system.GetAdminListByGroupId(adminInfo.GroupId)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			err = errors.New("GetAdminListByGroupId, Err: " + e.Error())
+			return
+		}
+		for _, v := range adminList {
+			adminIds = append(adminIds, strconv.Itoa(v.AdminId))
 		}
+	} else {
+		adminIds = append(adminIds, strconv.Itoa(adminInfo.AdminId))
+	}
+	//再获取组员下被共享的公司
+	var pars []interface{}
+	var condition string
+	condition = "  AND  share_seller_id  IN (" + strings.Join(adminIds, ",") + ")  "
+	listCompanyProduct, e := company.GetCompanyProductList(condition, pars)
+	if e != nil {
+		err = errors.New("GetCompanyProductList, Err: " + e.Error())
+		return
+	}
+	for _, v := range listCompanyProduct {
+		companyIds = append(companyIds, strconv.Itoa(v.CompanyId))
 	}
+	companyIds = append(companyIds, "0")
+	var conditionMobile string
+	//if adminInfo.RoleTypeCode == "rai_group" {
+	//
+	//	//组长查看本组所有组员
+	//	conditionMobile = ` 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(adminInfo.AdminId) + ` )) `
+	//} else {
+	//	//组员查看自己
+	//	if sellerIds != "" {
+	//		conditionMobile = ` SELECT mobile FROM user_seller_relation WHERE seller_id  IN ( ` + strconv.Itoa(adminInfo.AdminId) + `,` + sellerIds + ` ) `
+	//	} else {
+	//		conditionMobile = ` SELECT mobile FROM user_seller_relation WHERE seller_id  IN ( ` + strconv.Itoa(adminInfo.AdminId) + ` ) `
+	//	}
+	//}
+	conditionMobile = ` SELECT mobile FROM user_seller_relation WHERE  1=1  AND product_id = 2   AND (seller_id  IN ( ` + strings.Join(adminIds, ",") + ` )  OR  company_id IN (` + strings.Join(companyIds, ",") + `))   `
+
 	mobileList, e := cygx.GetSellerUserMobile(conditionMobile)
 	if e != nil {
 		err = errors.New("GetSellerUserMobile 获取这个销售所能查看的手机号权限失败, Err: " + e.Error())
@@ -66,6 +98,12 @@ func GetAdminLookUserUserId(adminInfo *system.Admin) (userIds []int, err error)
 	return
 }
 
+//func init() {
+//	sellerId, e := company.GetCompanyProductSellerIdByShareSellerId(163)
+//	fmt.Println(e)
+//	fmt.Println(sellerId)
+//}
+
 // 获取这个销售所能查看的手机号权限
 func GetAdminLookUserCompanyIds(sysUser *system.Admin) (companyIds []int, err error) {
 	//如果不是管理员,权益管理员那么就对可见权限范围做处理
@@ -108,7 +146,7 @@ func GetAdminLookUserCompanyIds(sysUser *system.Admin) (companyIds []int, err er
 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 {
+	if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_RAI_ADMIN && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_FINANCE {
 		//if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP {
 		//	//如果是权益的组长就获取下面的组员
 		//	adminList, e := system.GetAdminListByGroupId(sysUser.GroupId)

+ 22 - 0
services/cygx/article.go

@@ -88,6 +88,27 @@ func GetArticleSourcePlatform(SourcePlatform string) (sourcePlatformResp int) {
 		sourcePlatformResp = 1
 	} else if SourcePlatform == "2" {
 		sourcePlatformResp = 2
+	} else {
+		sourcePlatformResp, _ = strconv.Atoi(SourcePlatform)
+	}
+	return
+}
+
+// 处理文章来源类型
+func GetArticleSourcePlatformText(sourcePlatformResp int) (sourcePlatformText string) {
+	switch sourcePlatformResp {
+	case 1:
+		sourcePlatformText = "查研小程序"
+	case 2:
+		sourcePlatformText = "查研网页版"
+	case 3:
+		sourcePlatformText = "策略平台"
+	case 5:
+		sourcePlatformText = "研选小程序"
+	case 6:
+		sourcePlatformText = "研选网页版"
+	default:
+		sourcePlatformText = "查研小程序"
 	}
 	return
 }
@@ -291,6 +312,7 @@ func HandleArticleAndYanxuanRecordList(items []*cygx.CygxArticleAndYanxuanRecord
 			item.CompanyName = v.CompanyName
 			item.SellerName = sellNameMap[v.CompanyId]
 			item.RegisterPlatform = v.RegisterPlatform
+			item.RegisterPlatformText = GetArticleSourcePlatformText(v.RegisterPlatform)
 			item.StopTime = strconv.Itoa(v.StopTime)
 			itemsResp = append(itemsResp, item)
 		}

+ 213 - 0
services/cygx/user_label.go

@@ -5,6 +5,7 @@ import (
 	"fmt"
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/models/roadshow"
 	"hongze/hz_crm_api/services/alarm_msg"
 	"hongze/hz_crm_api/utils"
 	"strconv"
@@ -270,3 +271,215 @@ func GetUserInteractionNumMap(userIds []int) (mapResp map[int]int) {
 	}
 	return
 }
+
+// 预处理1v1路演的参会人员信息
+func HandleListRsCalendar(list []*roadshow.RsCalendarMeetingUserByRai) (items []*cygx.UserInteraction, err error) {
+	if len(list) == 0 {
+		return
+	}
+	var rsCalendarIds []int
+	for _, v := range list {
+		rsCalendarIds = append(rsCalendarIds, v.RsCalendarId)
+	}
+
+	mapRsCalendarLabel := make(map[int][]string) //1v1 路演标签
+	mapRsCalendarLabel = GetRsCalendarLabelByRsCalendarIds(rsCalendarIds)
+
+	//获取研究员信息
+	researchers, err := roadshow.GetRsCalendarResearcherListByIds(rsCalendarIds)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	mapResearcherName := make(map[int][]string)
+	for _, v := range researchers {
+		mapResearcherName[v.RsCalendarId] = append(mapResearcherName[v.RsCalendarId], v.ResearcherName)
+	}
+
+	//listGroup, err := roadshow.GetRsCalendarMeetingLabelGroupDetailByRsCalendarIds(rsCalendarIds)
+	//if err != nil && err.Error() != utils.ErrNoRow() {
+	//	return
+	//}
+	//
+	//var industrialManagementIds []int
+	//var industrialSubjectIds []int
+	//
+	//mapindustrialManagementName := make(map[int]string)
+	//mapindustrialSubjectName := make(map[int]string)
+	//mapCelueName := make(map[int]string)
+	//for _, v := range listGroup {
+	//	fmt.Println(v)
+	//	switch v.TagType {
+	//	case 1:
+	//		industrialManagementIds = append(industrialManagementIds, v.TagId)
+	//	case 2:
+	//		industrialSubjectIds = append(industrialSubjectIds, v.TagId)
+	//	case 3:
+	//		mapCelueName[v.RsCalendarId] = "策略"
+	//	}
+	//}
+
+	//if len(industrialManagementIds) > 0 {
+	//	IndustryList, e := cygx.GetIndustryListByConditionByIds(industrialManagementIds)
+	//	if e != nil {
+	//		err = errors.New("GetIndustryListByConditionByIds" + e.Error())
+	//		return
+	//	}
+	//
+	//	for _, v := range IndustryList {
+	//		mapindustrialManagementName[v.IndustrialManagementId] = v.IndustryName
+	//	}
+	//}
+
+	//if len(industrialSubjectIds) > 0 {
+	//	SubjectList, e := cygx.GetIndustrialSubjectDetailByIds(industrialSubjectIds)
+	//	if e != nil {
+	//		err = errors.New("GetIndustryListByConditionByIds" + e.Error())
+	//		return
+	//	}
+	//	for _, v := range SubjectList {
+	//		mapindustrialSubjectName[v.IndustrialSubjectId] = v.SubjectName
+	//	}
+	//}
+
+	//mapGroupindustrialManagementName := make(map[int][]string)
+	//mapGroupindustrialSubjectName := make(map[int][]string)
+	//for _, v := range listGroup {
+	//	switch v.TagType {
+	//	case 1:
+	//		mapGroupindustrialManagementName[v.RsCalendarId] = append(mapGroupindustrialManagementName[v.RsCalendarId], mapindustrialManagementName[v.TagId])
+	//	case 2:
+	//		mapGroupindustrialSubjectName[v.RsCalendarId] = append(mapGroupindustrialSubjectName[v.RsCalendarId], mapindustrialSubjectName[v.TagId])
+	//	}
+	//}
+
+	for _, v := range list {
+		item := new(cygx.UserInteraction)
+		item.UserId = v.UserId
+		item.RealName = v.RealName
+		item.Mobile = v.Mobile
+		item.CompanyId = v.CompanyId
+		item.CompanyName = v.CompanyName
+		//switch v.TagType {
+		//case 1:
+		//	item.LabelKeyWord = strings.Join(mapGroupindustrialManagementName[v.RsCalendarId], ",")
+		//case 2:
+		//	item.LabelKeyWord = strings.Join(mapGroupindustrialSubjectName[v.RsCalendarId], ",")
+		//case 3:
+		//	item.LabelKeyWord = mapCelueName[v.RsCalendarId]
+		//}
+
+		item.LabelKeyWord = strings.Join(mapRsCalendarLabel[v.RsCalendarId], ",")
+		item.ActivityTimeText = v.StartDate + "(" + v.StartWeek + ")" + v.StartTime + "-" + v.EndTime
+		item.ResearcherName = strings.Join(mapResearcherName[v.RsCalendarId], ",")
+		items = append(items, item)
+	}
+
+	return
+}
+
+// 获取1V1路演标签信息
+func GetRsCalendarLabelByRsCalendarIds(rsCalendarIds []int) (respMap map[int][]string) {
+	if len(rsCalendarIds) == 0 {
+		return
+	}
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("获取1V1路演标签信息 失败 GetRsCalendarLabelByRsCalendarIds rsCalendarIds: ", rsCalendarIds, err.Error()), 2)
+		}
+	}()
+
+	listEmail, err := cygx.GetAskEmail()
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	var ceLueResearcherName []string
+	var guShouResearcherName []string
+	for _, v := range listEmail {
+		if v.ChartPermissionName == utils.CE_LUE_NAME {
+			ceLueResearcherName = append(ceLueResearcherName, v.Name)
+		}
+		if v.ChartPermissionName == utils.GU_SHOU_NAME {
+			guShouResearcherName = append(guShouResearcherName, v.Name)
+		}
+	}
+
+	//获取研究员信息
+	researchers, err := roadshow.GetRsCalendarResearcherListByIds(rsCalendarIds)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	mapResearcherName := make(map[int][]string)
+	for _, v := range researchers {
+		if utils.InArrayByStr(ceLueResearcherName, v.ResearcherName) {
+			mapResearcherName[v.RsCalendarId] = append(mapResearcherName[v.RsCalendarId], "策略")
+		}
+		if utils.InArrayByStr(guShouResearcherName, v.ResearcherName) {
+			mapResearcherName[v.RsCalendarId] = append(mapResearcherName[v.RsCalendarId], "固收")
+		}
+	}
+
+	listGroup, err := roadshow.GetRsCalendarMeetingLabelGroupDetailByRsCalendarIds(rsCalendarIds)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+
+	var industrialManagementIds []int
+	var industrialSubjectIds []int
+
+	mapindustrialManagementName := make(map[int]string)
+	mapindustrialSubjectName := make(map[int]string)
+	mapCelueName := make(map[int]string)
+	for _, v := range listGroup {
+		switch v.TagType {
+		case 1:
+			industrialManagementIds = append(industrialManagementIds, v.TagId)
+		case 2:
+			industrialSubjectIds = append(industrialSubjectIds, v.TagId)
+		case 3:
+			mapCelueName[v.RsCalendarId] = strings.Join(mapResearcherName[v.RsCalendarId], ",")
+		}
+	}
+
+	if len(industrialManagementIds) > 0 {
+		IndustryList, e := cygx.GetIndustryListByConditionByIds(industrialManagementIds)
+		if e != nil {
+			err = errors.New("GetIndustryListByConditionByIds" + e.Error())
+			return
+		}
+
+		for _, v := range IndustryList {
+			mapindustrialManagementName[v.IndustrialManagementId] = v.IndustryName
+		}
+	}
+
+	if len(industrialSubjectIds) > 0 {
+		SubjectList, e := cygx.GetIndustrialSubjectDetailByIds(industrialSubjectIds)
+		if e != nil {
+			err = errors.New("GetIndustryListByConditionByIds" + e.Error())
+			return
+		}
+		for _, v := range SubjectList {
+			mapindustrialSubjectName[v.IndustrialSubjectId] = v.SubjectName
+		}
+	}
+	respMap = make(map[int][]string, 0)
+	for _, v := range listGroup {
+		switch v.TagType {
+		case 1:
+			respMap[v.RsCalendarId] = append(respMap[v.RsCalendarId], mapindustrialManagementName[v.TagId])
+		case 2:
+			respMap[v.RsCalendarId] = append(respMap[v.RsCalendarId], mapindustrialSubjectName[v.TagId])
+		case 3:
+			respMap[v.RsCalendarId] = append(respMap[v.RsCalendarId], mapCelueName[v.RsCalendarId])
+		}
+	}
+
+	for _, v := range rsCalendarIds {
+		if len(respMap[v]) == 0 && len(mapResearcherName[v]) > 0 {
+			respMap[v] = mapResearcherName[v]
+		}
+	}
+	return
+}

+ 34 - 0
services/report.go

@@ -1,8 +1,11 @@
 package services
 
 import (
+	"errors"
 	"fmt"
 	"github.com/PuerkitoBio/goquery"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/utils"
 	"html"
 	"strings"
 )
@@ -31,3 +34,34 @@ func GetReportContentSub(content string) (contentSub string, err error) {
 	})
 	return
 }
+
+// GetMinClassify
+// @Description: 获取最小分类ID
+// @author: Roc
+// @datetime 2024-06-20 09:23:19
+// @param reportInfo *models.Report
+// @return minClassifyId int
+// @return minClassifyName string
+// @return err error
+func GetMinClassify(reportInfo *models.Report) (minClassifyId int, minClassifyName string, err error) {
+	defer func() {
+		if err != nil {
+			utils.FileLog.Error("获取最小分类ID失败,报告ID:%d,Err:%s", reportInfo.Id, err.Error())
+		}
+	}()
+	minClassifyId = reportInfo.ClassifyIdThird
+	minClassifyName = reportInfo.ClassifyNameThird
+	if minClassifyId <= 0 {
+		minClassifyId = reportInfo.ClassifyIdSecond
+		minClassifyName = reportInfo.ClassifyNameSecond
+	}
+	if minClassifyId <= 0 {
+		minClassifyId = reportInfo.ClassifyIdFirst
+		minClassifyName = reportInfo.ClassifyNameFirst
+	}
+	if minClassifyId <= 0 {
+		err = errors.New("分类异常")
+	}
+
+	return
+}

+ 1 - 1
services/report_chapter_type_sync.go

@@ -44,7 +44,7 @@ func EditReportChapterTypeSync(pars *EditReportChapterTypeSyncReq) (err error, e
 }
 
 type EditReportChapterTypeRuleSyncReq struct {
-	ResearchType string `description:"研报类型"`
+	ReportClassifyId int `description:"研报分类id"`
 }
 
 // EditReportChapterTypeRuleSync 同步章节更新设置

+ 40 - 0
services/roadshow/calendar.go

@@ -17,6 +17,46 @@ import (
 	"time"
 )
 
+type SyncCalendarFromShanghaiRecord struct {
+	UserPhone string `description:"手机号"`
+	StartDate string `description:"开始时间"`
+	EndDate   string `description:"结束时间"`
+}
+
+// 上海路演数据同步到自系统 从Redis获取
+func InsertSyncCalendarFromShanghai() {
+	var err error
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg("上海路演数据同步到自系统 失败;InsertSyncCalendarFromShanghai ERR:"+err.Error(), 3)
+		}
+	}()
+	for {
+		utils.Rc.Brpop(utils.CACHE_KEY_SHANG_HAI_RS_CALENDAR_API, func(b []byte) {
+			record := new(SyncCalendarFromShanghaiRecord)
+			if err := json.Unmarshal(b, &record); err != nil {
+				fmt.Println("json unmarshal wrong!")
+			}
+			//fmt.Println(record.UserPhone)
+			_ = SyncCalendarFromShanghai(record.UserPhone, record.StartDate, record.EndDate)
+		})
+	}
+}
+
+// 上海路演数据同步到自系统请求放到Redis
+func InsertSyncCalendarFromShanghaiLPush(userPhone, startDate, endDate string) bool {
+	log := &SyncCalendarFromShanghaiRecord{UserPhone: userPhone, StartDate: startDate, EndDate: endDate}
+	if utils.Re == nil {
+		err := utils.Rc.LPush(utils.CACHE_KEY_SHANG_HAI_RS_CALENDAR_API, log)
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg("上海路演数据同步到自系统 失败;InsertSyncCalendarFromShanghaiLPush ERR:"+err.Error(), 3)
+		}
+		return true
+	}
+	return false
+}
+
 // getAccessToken token内部请求接口
 func getAccessToken() (tokenData roadshow.TokenData, err error) {
 	defer func() {

+ 2 - 0
services/system.go

@@ -34,6 +34,8 @@ func GetRoleTypeCode(roleType string) string {
 		roleTypeCode = utils.ROLE_TYPE_CODE_FICC_RESEARCHR
 	case utils.ROLE_TYPE_RAI_RESEARCHR:
 		roleTypeCode = utils.ROLE_TYPE_CODE_RAI_RESEARCHR
+	case utils.ROLE_TYPE_RAI_SELLER:
+		roleTypeCode = utils.ROLE_TYPE_CODE_RAI_SELLER
 	default:
 		roleTypeCode = utils.ROLE_TYPE_ADMIN
 	}

+ 10 - 7
services/task.go

@@ -4,6 +4,7 @@ import (
 	"fmt"
 	"hongze/hz_crm_api/models/company"
 	"hongze/hz_crm_api/models/eta_business"
+	roadshowService "hongze/hz_crm_api/services/roadshow"
 	"hongze/hz_crm_api/utils"
 	"time"
 )
@@ -15,6 +16,8 @@ func Task() {
 
 	go AutoInsertAdminOperateRecordToDB()
 
+	go roadshowService.InsertSyncCalendarFromShanghai() // 上海路演数据同步到自系统 从Redis获取
+
 	//go FixEtaBusinessCodeEncrypt()
 	//InitContractUnusual()
 	fmt.Println("task end")
@@ -91,13 +94,13 @@ func InitContractUnusual() (err error) {
 				//查询这个合同是否存在续约合同,起始日大于今日,或者截止日
 				if _, ok := ficcNormalMap[v.CompanyId]; !ok {
 					tmp := &company.CompanyRenewalRecord{
-						CompanyId:       v.CompanyId,
-						ProductId:       v.ProductId,
-						Source:          1,
-						SellerId:        sellers.SellerId,
-						SellerName:      sellers.SellerName,
-						CreateTime:      startDate,
-						ModifyTime:      startDate,
+						CompanyId:  v.CompanyId,
+						ProductId:  v.ProductId,
+						Source:     1,
+						SellerId:   sellers.SellerId,
+						SellerName: sellers.SellerName,
+						CreateTime: startDate,
+						ModifyTime: startDate,
 					}
 					addList = append(addList, tmp)
 				}

+ 23 - 20
utils/constants.go

@@ -21,6 +21,7 @@ const (
 	EmptyDateTimeStr           = "0000-00-00 00:00:00"     //DateTime零值字符串
 	EmptyDateStr               = "0000-00-00"              //Date零值字符串
 	FormatMonthDayUnSpace      = "0102"                    //日期格式
+	FormatMonthDayUnSpace2     = "01.02"                   //日期格式
 	FormatYearMonthDate        = "2006-01"                 //日期格式
 	FormatYearDate             = "2006"                    //日期格式
 	PageSize15                 = 15                        //列表页每页数据量
@@ -122,7 +123,7 @@ const (
 
 	ROLE_TYPE_FICC_GROUP      = "ficc销售组长"
 	ROLE_TYPE_FICC_MANAGER    = "ficc销售主管"
-	ROLE_TYPE_RAI_GROUP       = "权益组长"
+	ROLE_TYPE_RAI_GROUP       = "权益销售组长"
 	ROLE_TYPE_FICC_DEPARTMENT = "ficc部门经理"
 	ROLE_TYPE_RAI_DEPARTMENT  = "权益部门经理"
 	ROLE_TYPE_FICC_RESEARCHR  = "ficc研究员"
@@ -280,25 +281,26 @@ const (
 
 // 缓存key
 const (
-	CACHE_KEY_LOGS                    = "HZ_ADMIN_CACHE_KEY_LOGS"             //api用户操作日志队列
-	CACHE_KEY_ADMIN                   = "calendar:admin:list"                 //系统用户列表缓存key
-	CACHE_KEY_ADMIN_ID                = "calendar:admin:id:list"              //系统用户列表缓存key
-	CACHE_KEY_OLD_REPORT_PUBLISH      = "HZ_CACHE_KEY_OLD_REPORT_PUBLISH"     //老后台报告发布队列
-	CACHE_ADMIN_YB_CONFIG             = "admin:yb_config:"                    //研报配置相关缓存前缀
-	CACHE_WIND_URL                    = "CACHE_WIND_URL"                      //指标与wind服务器的绑定关系
-	CACHE_CHART_INFO_DATA             = "chart:info:data:"                    //图表数据
-	CACHE_CHART_CLASSIFY              = "chart:classify"                      //图表分类数据
-	CACHE_IMPORT_MANUAL_DATA          = "import:manual:data"                  //手工数据导入后刷新
-	CACHE_ACCESS_TOKEN_LOGIN          = "pc_admin:login:"                     //管理后台登录
-	CACHE_ACCESS_TOKEN_LOGIN_NO_TRUST = "pc_admin:login:no_trust:"            //管理后台登录(不可信登录态)
-	CACHE_ABNORMAL_LOGIN              = "pc_admin:login:abnormal:"            //管理后台登录-异常登录
-	CACHE_LOGIN_ERR_PASS              = "pc_admin:login:errPass:"             //管理后台登录-输入错误密码次数
-	CACHE_FIND_PASS_VERIFY            = "pc_admin:findPass:verify:"           //找回密码校验成功标记
-	CACHE_KEY_COMPANY_MATCH_PRE       = "admin:company:match:"                //客户名单匹配
-	CACHE_KEY_MYSTEEL_REFRESH         = "mysteel_chemical:refresh"            //钢联化工刷新
-	CACHE_KEY_DAYNEW_REFRESH          = "admin:day_new:refresh"               //每日资讯拉取企业微信聊天记录
-	CACHE_KEY_DAYNEW_TRANSLATE        = "admin:day_new:translate"             //每日资讯中翻英
-	CACHE_KEY_ADMIN_OPERATE_RECORD    = "HZ_ADMIN_CACHE_ADMIN_OPERATE_RECORD" //系统用户操作日志队列
+	CACHE_KEY_LOGS                      = "HZ_ADMIN_CACHE_KEY_LOGS"             //api用户操作日志队列
+	CACHE_KEY_ADMIN                     = "calendar:admin:list"                 //系统用户列表缓存key
+	CACHE_KEY_ADMIN_ID                  = "calendar:admin:id:list"              //系统用户列表缓存key
+	CACHE_KEY_OLD_REPORT_PUBLISH        = "HZ_CACHE_KEY_OLD_REPORT_PUBLISH"     //老后台报告发布队列
+	CACHE_ADMIN_YB_CONFIG               = "admin:yb_config:"                    //研报配置相关缓存前缀
+	CACHE_WIND_URL                      = "CACHE_WIND_URL"                      //指标与wind服务器的绑定关系
+	CACHE_CHART_INFO_DATA               = "chart:info:data:"                    //图表数据
+	CACHE_CHART_CLASSIFY                = "chart:classify"                      //图表分类数据
+	CACHE_IMPORT_MANUAL_DATA            = "import:manual:data"                  //手工数据导入后刷新
+	CACHE_ACCESS_TOKEN_LOGIN            = "pc_admin:login:"                     //管理后台登录
+	CACHE_ACCESS_TOKEN_LOGIN_NO_TRUST   = "pc_admin:login:no_trust:"            //管理后台登录(不可信登录态)
+	CACHE_ABNORMAL_LOGIN                = "pc_admin:login:abnormal:"            //管理后台登录-异常登录
+	CACHE_LOGIN_ERR_PASS                = "pc_admin:login:errPass:"             //管理后台登录-输入错误密码次数
+	CACHE_FIND_PASS_VERIFY              = "pc_admin:findPass:verify:"           //找回密码校验成功标记
+	CACHE_KEY_COMPANY_MATCH_PRE         = "admin:company:match:"                //客户名单匹配
+	CACHE_KEY_MYSTEEL_REFRESH           = "mysteel_chemical:refresh"            //钢联化工刷新
+	CACHE_KEY_DAYNEW_REFRESH            = "admin:day_new:refresh"               //每日资讯拉取企业微信聊天记录
+	CACHE_KEY_DAYNEW_TRANSLATE          = "admin:day_new:translate"             //每日资讯中翻英
+	CACHE_KEY_ADMIN_OPERATE_RECORD      = "HZ_ADMIN_CACHE_ADMIN_OPERATE_RECORD" //系统用户操作日志队列
+	CACHE_KEY_SHANG_HAI_RS_CALENDAR_API = "hz_crm_shang_hai_rs_calendar_api"    //上海研究员日历同步队列
 
 	CACHE_SYNC_ADMIN      = "hz_crm_eta:sync_admin"      // 同步用户的缓存队列key
 	CACHE_SYNC_ROLE       = "hz_crm_eta:sync_role"       // 同步角色的缓存队列key
@@ -450,6 +452,7 @@ const (
 	CYGX_OBJ_MINUTESSUMMARY     string = "minutessummary"     // 对象类型:本周研究汇总
 	CYGX_OBJ_YANXUANSPECIAL     string = "yanxuanspecial"     // 对象类型:研选专栏
 	CYGX_OBJ_ASKSERIEVIDEO      string = "askserievideo"      // 对象类型:问答系列视频
+	CYGX_OBJ_RS_CALENDAR        string = "rscalendar"         // 对象类型:研究员日历安排
 )
 
 const (

部分文件因为文件数量过多而无法显示