浏览代码

Merge branch 'master' of http://8.136.199.33:3000/hongze/hz_crm_api into CRM_15.5

xingzai 10 月之前
父节点
当前提交
9cade520c4
共有 100 个文件被更改,包括 10492 次插入1627 次删除
  1. 58 110
      controllers/classify.go
  2. 299 128
      controllers/company.go
  3. 147 135
      controllers/company_apply.go
  4. 72 49
      controllers/company_apply_v2.go
  5. 33 21
      controllers/company_approval.go
  6. 203 166
      controllers/company_permission.go
  7. 1849 25
      controllers/company_seller.go
  8. 116 52
      controllers/company_share.go
  9. 36 27
      controllers/company_user.go
  10. 61 16
      controllers/contract/contract.go
  11. 34 4
      controllers/contract/contract_approval.go
  12. 53 4
      controllers/cygx/activity.go
  13. 5 0
      controllers/cygx/activity_signup.go
  14. 5 3
      controllers/cygx/activity_special_trip.go
  15. 67 42
      controllers/cygx/contract_allocation.go
  16. 1541 0
      controllers/cygx/enter_score.go
  17. 3 3
      controllers/cygx/industrial_management.go
  18. 592 0
      controllers/cygx/order.go
  19. 1 0
      controllers/cygx/summary_manage.go
  20. 11 0
      controllers/cygx/user.go
  21. 152 0
      controllers/cygx/user_admin_share_history.go
  22. 146 10
      controllers/cygx/yanxuan_special.go
  23. 18 13
      controllers/day_new.go
  24. 2 2
      controllers/english_report/en_permission.go
  25. 16 379
      controllers/english_report/english_classify.go
  26. 325 17
      controllers/eta_business/eta_business.go
  27. 2 1
      controllers/eta_trial.go
  28. 77 54
      controllers/full_company.go
  29. 12 0
      controllers/report.go
  30. 150 0
      controllers/report_chapter_type.go
  31. 431 0
      controllers/roadshow/report.go
  32. 36 0
      controllers/sys_user.go
  33. 17 27
      controllers/user_login.go
  34. 26 1
      controllers/yb/road_video.go
  35. 170 0
      controllers/yb_research_signup_statistics.go
  36. 1 0
      go.mod
  37. 3 0
      go.sum
  38. 8 33
      models/advisory/chart_permission.go
  39. 33 15
      models/chart_permission.go
  40. 3 3
      models/classify.go
  41. 131 82
      models/company/company.go
  42. 1 0
      models/company/company_apply.go
  43. 219 0
      models/company/company_approval.go
  44. 60 15
      models/company/company_permission.go
  45. 25 2
      models/company/company_product.go
  46. 11 2
      models/contract/contract_service_detail.go
  47. 8 0
      models/cygx/activity.go
  48. 18 0
      models/cygx/activity_appointment.go
  49. 17 0
      models/cygx/activity_help_ask.go
  50. 77 1
      models/cygx/allocation_company_contract.go
  51. 10 10
      models/cygx/chart_permission.go
  52. 47 1
      models/cygx/cygx_user_record.go
  53. 2 1
      models/cygx/cygx_yanxuan_special.go
  54. 25 3
      models/cygx/cygx_yanxuan_special_user.go
  55. 476 0
      models/cygx/enter_score.go
  56. 138 0
      models/cygx/orde.go
  57. 90 0
      models/cygx/order_action.go
  58. 58 0
      models/cygx/order_refund.go
  59. 10 1
      models/cygx/summary_manage.go
  60. 76 0
      models/cygx/user_admin_share_history.go
  61. 29 0
      models/cygx/user_business_card.go
  62. 5 1
      models/day_new/day_new_default.go
  63. 9 8
      models/day_new/wework_msg.go
  64. 7 0
      models/db.go
  65. 27 17
      models/english_report.go
  66. 16 0
      models/eta_business/eta_business.go
  67. 40 0
      models/eta_business/eta_business_contract.go
  68. 3 1
      models/eta_business/eta_business_operation_record.go
  69. 4 4
      models/eta_trial/eta_trial_manual.go
  70. 39 0
      models/overseas_custom/custom.go
  71. 19 3
      models/permission.go
  72. 11 16
      models/report_chapter_type.go
  73. 80 2
      models/roadshow/calendar.go
  74. 1 1
      models/roadshow/company.go
  75. 181 0
      models/roadshow/report_record.go
  76. 4 1
      models/statistic_report/report.go
  77. 8 0
      models/system/sys_admin.go
  78. 24 0
      models/user_record.go
  79. 10 0
      models/wx_user.go
  80. 140 0
      models/yb_research_signup_statistics.go
  81. 252 0
      routers/commentsRouter.go
  82. 4 0
      routers/router.go
  83. 184 0
      services/classify.go
  84. 31 19
      services/company.go
  85. 57 27
      services/company_apply/company_approval.go
  86. 18 0
      services/company_approval_message.go
  87. 41 0
      services/company_permission.go
  88. 51 51
      services/contract/contract.go
  89. 77 0
      services/crm_eta.go
  90. 35 1
      services/cygx/acitvity.go
  91. 237 0
      services/cygx/activity_poster.go
  92. 2 0
      services/cygx/activity_power_check.go
  93. 11 1
      services/cygx/admin_power.go
  94. 161 0
      services/cygx/contract_allocation.go
  95. 18 4
      services/cygx/industry_fllow.go
  96. 39 0
      services/cygx/order.go
  97. 98 1
      services/cygx/research_summary.go
  98. 125 0
      services/cygx/wx_pay.go
  99. 27 11
      services/eta_business/eta_business.go
  100. 54 0
      services/eta_forum/eta_forum_hub.go

+ 58 - 110
controllers/classify.go

@@ -1,8 +1,9 @@
 package controllers
 
 import (
-	"github.com/rdlucklib/rdluck_tools/paging"
+	"encoding/json"
 	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/services"
 	"hongze/hz_crm_api/utils"
 )
 
@@ -11,10 +12,9 @@ type ClassifyController struct {
 	BaseAuthController
 }
 
+// ListClassify
 // @Title 获取分类列表
 // @Description 获取分类列表
-// @Param   PageSize   query   int  true       "每页数据条数"
-// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
 // @Param   KeyWord   query   string  true       "检索关键词"
 // @Param   CompanyType   query   string  false       "产品类型,枚举值:'ficc','权益';不传默认返回全部"
 // @Param   HideDayWeek   query   int  false       "是否隐藏晨周报"
@@ -26,123 +26,21 @@ func (this *ClassifyController) ListClassify() {
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
-	pageSize, _ := this.GetInt("PageSize")
-	currentIndex, _ := this.GetInt("CurrentIndex")
 	keyWord := this.GetString("KeyWord")
 	companyType := this.GetString("CompanyType")
 	hideDayWeek, _ := this.GetInt("HideDayWeek")
 
-	var startSize int
-	if pageSize <= 0 {
-		pageSize = utils.PageSize20
-	}
-	if currentIndex <= 0 {
-		currentIndex = 1
-	}
-
-	startSize = utils.StartIndex(currentIndex, pageSize)
-	list, err := models.GetClassifyList(startSize, pageSize, keyWord, companyType, hideDayWeek)
-	if err != nil {
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取失败,Err:" + err.Error()
-		return
-	}
-	total, err := models.GetClassifyListCount(keyWord, companyType, hideDayWeek)
+	req := new(services.GetClassifyListReq)
+	req.Keyword = keyWord
+	req.CompanyType = companyType
+	req.HideDayWeek = hideDayWeek
+	resp, err := services.GetClassifyList(req)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
 
-	parentIds := make([]int, 0)
-	for i := range list {
-		parentIds = append(parentIds, list[i].Id)
-	}
-	parentIdLen := len(parentIds)
-	if parentIdLen == 0 {
-		resp := &models.ClassifyListResp{
-			List:   list,
-			Paging: paging.GetPaging(currentIndex, pageSize, 0),
-		}
-		br.Data = resp
-		br.Ret = 200
-		br.Success = true
-		br.Msg = "获取成功"
-		return
-	}
-
-	// 获取一级分类-子目录列表
-	menuListMap := make(map[int][]*models.ClassifyMenu, 0)
-	var menuCond string
-	var menuPars []interface{}
-	menuCond += ` AND classify_id IN (` + utils.GetOrmInReplace(parentIdLen) + `)`
-	menuPars = append(menuPars, parentIds)
-	parentMenus, e := models.GetClassifyMenuList(menuCond, menuPars)
-	if e != nil {
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取一级分类子目录列表失败"
-		return
-	}
-	for i := range parentMenus {
-		if menuListMap[parentMenus[i].ClassifyId] == nil {
-			menuListMap[parentMenus[i].ClassifyId] = make([]*models.ClassifyMenu, 0)
-		}
-		menuListMap[parentMenus[i].ClassifyId] = append(menuListMap[parentMenus[i].ClassifyId], parentMenus[i])
-	}
-
-	// 获取子分类
-	children, e := models.GetClassifyChildByParentIds(parentIds, keyWord)
-	if e != nil {
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取子分类失败"
-		return
-	}
-	childrenIds := make([]int, 0)
-	for i := range children {
-		childrenIds = append(childrenIds, children[i].Id)
-	}
-	childrenIdsLen := len(childrenIds)
-
-	// 获取二级分类-子目录关联
-	relateMap := make(map[int]int, 0)
-	if childrenIdsLen > 0 {
-		var relateCond string
-		var relatePars []interface{}
-		relateCond += ` AND classify_id IN (` + utils.GetOrmInReplace(childrenIdsLen) + `)`
-		relatePars = append(relatePars, childrenIds)
-		relates, e := models.GetClassifyMenuRelationList(relateCond, relatePars)
-		if e != nil {
-			br.Msg = "获取失败"
-			br.ErrMsg = "获取二级分类子目录关联失败, Err: " + e.Error()
-			return
-		}
-		for i := range relates {
-			relateMap[relates[i].ClassifyId] = relates[i].MenuId
-		}
-	}
-
-	// 二级分类
-	childrenMap := make(map[int][]*models.ClassifyItem, 0)
-	for i := range children {
-		if childrenMap[children[i].ParentId] == nil {
-			childrenMap[children[i].ParentId] = make([]*models.ClassifyItem, 0)
-		}
-		childrenMap[children[i].ParentId] = append(childrenMap[children[i].ParentId], &models.ClassifyItem{
-			Classify:       *children[i],
-			ClassifyMenuId: relateMap[children[i].Id],
-		})
-	}
-
-	// 一级分类
-	for i := range list {
-		list[i].ClassifyMenuList = menuListMap[list[i].Id]
-		list[i].Child = childrenMap[list[i].Id]
-	}
-
-	page := paging.GetPaging(currentIndex, pageSize, total)
-	resp := new(models.ClassifyListResp)
-	resp.List = list
-	resp.Paging = page
 	br.Data = resp
 	br.Ret = 200
 	br.Success = true
@@ -154,6 +52,7 @@ func (this *ClassifyController) ListClassify() {
 // @Success 200 {object} models.Classify
 // @router /tel_list [get]
 func (this *ClassifyController) TelListClassify() {
+	// todo 获取电话会 是否需要改成从中间服务项目中获取
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		this.Data["json"] = br
@@ -189,3 +88,52 @@ func (this *ClassifyController) TelListClassify() {
 	br.Success = true
 	br.Msg = "获取成功"
 }
+
+// Edit
+// @Title 编辑报告分类
+// @Description 编辑报告分类
+// @Param	request  body  services.EditClassifyReq  true  "type json string"
+// @Success 200 string "操作成功"
+// @router /edit [post]
+func (this *ClassifyController) Edit() {
+	br := new(models.BaseResponse).Init()
+	br.IsSendEmail = false
+	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 services.EditClassifyReq
+	if err := json.Unmarshal(this.Ctx.Input.RequestBody, &req); err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.ClassifyId <= 0 {
+		br.Msg = "分类ID有误"
+		return
+	}
+
+	err, errMsg := services.EditReportClassify(&req)
+	if err != nil {
+		br.Msg = errMsg
+		br.ErrMsg = "编辑报告分类失败, Err:" + err.Error()
+		return
+	}
+
+	// 清除小程序端的章节缓存
+	{
+		key := "hongze_yb:report_chapter_type:GetEffectTypeID"
+		_ = utils.Rc.Delete(key)
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 299 - 128
controllers/company.go

@@ -369,10 +369,16 @@ func (this *CompanyController) SearchList() {
 
 		btnItem := new(company.ButtonPermission)
 		if item.CompanyId != 1 {
-			*btnItem = services.GetCompanyPermissionButton(roleTypeCode, itemStatus, item.SellerIds, item.GroupIds, item.GroupId, sysUser.GroupId, item.SellerId, sysUser.AdminId, sysUser.Authority, item.ProductId, item.ShareSellerId)
+			*btnItem = services.GetCompanyPermissionButton(roleTypeCode, itemStatus, item.SellerIds, item.GroupIds, item.GroupId, sysUser.GroupId, item.SellerId, sysUser.AdminId, sysUser.Authority, item.ProductId, -1, item.ShareSellerIds)
 			//根据销售"领取客户"的权限对部分按钮做限制
 			btnItem = services.GetCompanyPermissionButtonByReceiveEnabled(btnItem, receiveEnabled)
 		}
+		if list[i].IsShare == 1 && btnItem.BtnModifySeller == true && roleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN {
+			//如果已经是共享客户了,取消共享按钮全都显示,和修改销售权限一样
+			btnItem.BtnShare = true
+		}
+		// 客户搜索页不要共享客户按钮
+		btnItem.BtnShare = false
 		//如果是权益客户,操作者又是权益管理员,那么就对他进行展示研选详情按钮
 		if strings.Contains(item.CompanyType, utils.COMPANY_CLASSIFY_RAI) && sysUser.RoleName == utils.ROLE_TYPE_RAI_PRODUCT {
 			btnItem.IsResearchShow = true
@@ -679,11 +685,11 @@ func (this *CompanyController) List() {
 				if status == "全部" {
 					////如果是筛选了流失客户状态
 					if sysUser.Authority <= 0 {
-						condition += ` AND (b.seller_id=? OR status='流失')  `
-						pars = append(pars, sysUser.AdminId)
+						condition += ` AND (b.seller_id=? OR status='流失' OR (b.share_seller_id = ? AND b.is_share = 1))  `
+						pars = append(pars, sysUser.AdminId, sysUser.AdminId)
 
-						permissionCondition += ` AND b.seller_id=? `
-						permissionPars = append(permissionPars, sysUser.AdminId)
+						permissionCondition += `  AND (b.seller_id=? OR status='流失' OR (b.share_seller_id = ? AND b.is_share = 1))  `
+						permissionPars = append(permissionPars, sysUser.AdminId, sysUser.AdminId)
 					} else {
 						if sysUser.Authority == 1 {
 							condition += ` AND (b.department_id=?  OR status='流失')`
@@ -794,16 +800,16 @@ func (this *CompanyController) List() {
 
 							// 是否包含共享客户(新增合同时, 关键词搜索客户为true)
 							if includeShare {
-								condition += ` AND (b.seller_id = ? OR (a.share_seller_id = ? AND a.is_share = 1)) `
+								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=?  `
-								pars = append(pars, sysUser.AdminId)
+								condition += ` AND (b.seller_id = ? OR (b.share_seller_id = ? AND b.is_share = 1)) `
+								pars = append(pars, sysUser.AdminId, sysUser.AdminId)
 							}
 						}
 
-						permissionCondition += ` AND b.seller_id=? `
-						permissionPars = append(permissionPars, sysUser.AdminId)
+						permissionCondition += `  AND (b.seller_id=? OR (b.share_seller_id = ? AND b.is_share = 1))  `
+						permissionPars = append(permissionPars, sysUser.AdminId, sysUser.AdminId)
 					} else {
 						if sysUser.Authority == 1 {
 							if status != utils.COMPANY_STATUS_LOSE {
@@ -1323,11 +1329,11 @@ func (this *CompanyController) List() {
 		//按钮显示控制
 		btnItem := new(company.ButtonPermission)
 		if item.CompanyId != 1 {
-			*btnItem = services.GetCompanyPermissionButton(roleTypeCode, itemStatus, item.GroupIds, item.GroupIds, item.GroupId, sysUser.GroupId, item.SellerId, sysUser.AdminId, sysUser.Authority, item.ProductId, item.ShareSellerId)
+			*btnItem = services.GetCompanyPermissionButton(roleTypeCode, itemStatus, item.SellerIds, item.GroupIds, item.GroupId, sysUser.GroupId, item.SellerId, sysUser.AdminId, sysUser.Authority, item.ProductId, -1, item.ShareSellerIds)
 			//根据销售"领取客户"的权限对部分按钮做限制
 			btnItem = services.GetCompanyPermissionButtonByReceiveEnabled(btnItem, receiveEnabled)
 		}
-		if list[i].IsShare == 1 && btnItem.BtnModifySeller == true {
+		if list[i].IsShare == 1 && btnItem.BtnModifySeller == true && roleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN {
 			//如果已经是共享客户了,取消共享按钮全都显示,和修改销售权限一样
 			btnItem.BtnShare = true
 		}
@@ -1597,10 +1603,11 @@ func (this *CompanyController) List() {
 			//viewTotal:=GetviewTotal(v.CompanyId)
 
 			//活跃(客户状态)
-			tmpStatus := v.Status
-			if v.IsShare == 1 {
-				tmpStatus = v.Status + "(共享)"
-			}
+			//if v.IsShare != 1 {
+			//	if v.BtnItem.BtnModifySeller == true {
+			//		v.BtnItem.BtnModifySeller = false
+			//	}
+			//}
 			//productIdSlice := strings.Split(v.ProductIds, "/")
 			//statusSlice := strings.Split(v.Status, "/")
 			//for productIndex, tmpProductId := range productIdSlice {
@@ -1687,7 +1694,9 @@ func (this *CompanyController) List() {
 			} else if strings.Contains(v.TodoStatuss, "无任务") {
 				todoButtonColor = "gray"
 			}
-			//if str
+			//永续客户X类试用客户出参转换
+			v.StatusStr = strings.Replace(v.StatusStr, utils.COMPANY_STATUS_FOREVER, utils.COMPANY_STATUS_X_CLASS_TRY_OUT, -1)
+
 			companyList := &company.CompanyListItem{
 				CompanyId:        v.CompanyId,
 				CompanyName:      v.CompanyName,
@@ -1699,7 +1708,7 @@ func (this *CompanyController) List() {
 				RenewalReason:    v.RenewalReason,
 				FreezeReason:     v.FreezeReason,
 				LossTime:         v.LossTime,
-				Status:           tmpStatus,
+				Status:           v.StatusStr,
 				CompanyType:      v.CompanyType,
 				ApproveStatus:    v.ApproveStatus,
 				SellerName:       v.SellerName,
@@ -1750,14 +1759,23 @@ func (this *CompanyController) List() {
 				IsShare:         v.IsShare,
 				CloseTime:       v.CloseTime,
 				CloseReason:     v.CloseReason,
-				ShareSeller:     v.ShareSeller,
 				ShareSellerId:   v.ShareSellerId,
-			}
-			if v.ShareSellerId != 0 {
-				shareSeller := adminMap[v.ShareSellerId]
-				if shareSeller != nil {
-					companyList.ShareSeller = shareSeller.RealName + "(" + shareSeller.GroupName + ")"
+				ShareSellerIds:  v.ShareSellerIds,
+			}
+			if v.ShareSellerIds != "" {
+				shareSellerIds := strings.Split(v.ShareSellerIds, ",")
+				for _, idStr := range shareSellerIds {
+					shareSellerId, e := strconv.Atoi(idStr)
+					if e != nil {
+						err = e
+						return
+					}
+					shareSeller := adminMap[shareSellerId]
+					if shareSeller != nil {
+						companyList.ShareSeller += shareSeller.RealName + "(" + shareSeller.GroupName + ")" + "/"
+					}
 				}
+				companyList.ShareSeller = strings.TrimRight(companyList.ShareSeller, "/")
 			}
 			companyLists = append(companyLists, companyList)
 		}
@@ -2818,10 +2836,35 @@ func (this *CompanyController) Add() {
 		}
 	}
 
-	// 每个权益销售手中的试用客户最多30个
-	if productId == utils.COMPANY_PRODUCT_RAI_ID && tryOutCount >= utils.COMPANY_STATUS_TRY_OUT_COUNT_RAI {
-		br.Msg = "您的试用客户总数,已超过上限,不可继续新增"
-		return
+	//// 每个权益销售手中的试用客户最多30个
+	//if productId == utils.COMPANY_PRODUCT_RAI_ID && tryOutCount >= utils.COMPANY_STATUS_TRY_OUT_COUNT_RAI {
+	//	br.Msg = "您的试用客户总数,已超过上限,不可继续新增"
+	//	return
+	//}
+
+	//如果是权益客户,在选择非研选行业试用时,需要判断当前有多少非研选的试用客户(试用状态,且行业是非研选)
+	if productId == utils.COMPANY_PRODUCT_RAI_ID {
+		permissionArr := strings.Split(req.PermissionIds, ",")
+		//如果所选行业不属于研选订阅跟研选扣点包,那就是非研选试用客户
+		var isNoResearch bool
+		for _, v := range permissionArr {
+			if v != strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN) && v != strconv.Itoa(utils.YAN_XUAN_KOU_DIAN_BAO_ID) {
+				isNoResearch = true
+				continue
+			}
+		}
+		if isNoResearch {
+			tryOutCountRai, err := company.GetRaiCompanyTryOutCountNoResearch(seller.AdminId)
+			if err != nil {
+				br.Msg = "判断试用客户量失败"
+				br.ErrMsg = "判断试用客户量失败,Err:" + err.Error()
+				return
+			}
+			if tryOutCountRai >= utils.COMPANY_STATUS_TRY_OUT_COUNT_RAI {
+				br.Msg = "非研选试用客户最多30家"
+				return
+			}
+		}
 	}
 
 	if seller == nil {
@@ -2923,6 +2966,9 @@ func (this *CompanyController) Add() {
 			companyProduct.IsOverseas = 1
 		}
 	}
+	if productId == utils.COMPANY_PRODUCT_RAI_ID && req.Status == utils.COMPANY_STATUS_FOREVER { // 权益的永续客户给一个状态初始化的记录
+		companyProduct.InitStatus = req.Status
+	}
 	companyProductId, err := company.AddCompanyProduct(companyProduct)
 	if err != nil {
 		br.Msg = "新增失败"
@@ -3086,15 +3132,30 @@ func (this *CompanyController) Detail() {
 	}
 	// CRM8.8-是否为编辑页的客户详情
 	isEdit, _ := this.GetBool("IsEdit")
+
+	productId := services.GetProductId(sysUser.RoleTypeCode)
 	item, err := company.GetCompanyDetailById(companyId)
 	if err != nil {
 		br.Msg = "获取信息失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
 		return
 	}
-	shareSellerId := item.ShareSellerId
+	shareSellerId := 0
+	var productItem *company.CompanyProduct
+	if productId > 0 {
+		var e error
+		productItem, e = company.GetCompanyProductByCompanyIdAndProductId(companyId, productId)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			br.Msg = "客户信息有误"
+			br.ErrMsg = "获取客户信息失败, Err: " + e.Error()
+			return
+		}
+		if productItem != nil {
+			shareSellerId = productItem.ShareSellerId
+		}
+	}
+
 	var productName string
-	productId := services.GetProductId(sysUser.RoleTypeCode)
 	if productId == 1 {
 		productName = utils.COMPANY_PRODUCT_FICC_NAME
 	} else if productId == 2 {
@@ -3137,7 +3198,7 @@ func (this *CompanyController) Detail() {
 						break
 					}
 					// 分享的客户 也有权限
-					if item.IsShare == 1 && item.ShareSellerId == sysUser.AdminId {
+					if productItem.IsShare == 1 && productItem.ShareSellerId == sysUser.AdminId {
 						isOk = true
 						break
 					}
@@ -3233,51 +3294,61 @@ func (this *CompanyController) Detail() {
 					}
 				}
 			}
-			for _, v := range utils.PermissionFiccClassifyArr {
-				checkList := make([]int, 0)
-				plist := new(company.PermissionLookList)
-				items, err := company.GetPermissionLookItems(item.ProductId, v)
-				if err != nil {
-					br.Msg = "获取失败"
-					br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
-					return
-				}
-				for itemK, n := range items {
-					permission, err := company.GetCompanyPermissionCheckItem(companyId, n.ChartPermissionId)
-					if err != nil && err.Error() != utils.ErrNoRow() {
-						br.Msg = "获取失败"
-						br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
-						return
+			// 编辑回显
+			allPermissions, e := company.GetPermissionLookItemsByProductId(utils.COMPANY_PRODUCT_FICC_ID)
+			if e != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取权限信息失败,Err:" + e.Error()
+				return
+			}
+			permissionMap := make(map[int][]*company.PermissionLookItem, 0)
+			permissionCheckMap := make(map[int][]int, 0)
+			for _, v := range allPermissions {
+				if v.ParentId > 0 {
+					permissionMap[v.ParentId] = append(permissionMap[v.ParentId], v)
+					if v.IsPublic == 1 {
+						permissionCheckMap[v.ParentId] = append(permissionCheckMap[v.ParentId], v.ChartPermissionId)
 					}
-					if permission != nil && permission.ChartPermissionId > 0 {
-						checkList = append(checkList, n.ChartPermissionId)
-						items[itemK].StartDate = permission.StartDate
-						items[itemK].EndDate = permission.EndDate
-						items[itemK].Status = permission.Status
-
-						endDateTime, _ := time.Parse(utils.FormatDate, permission.EndDate)
-						endDateTime = endDateTime.AddDate(0, 0, 1)
-						sub := endDateTime.Sub(time.Now())
-						if sub < 0 {
-							sub = 0
+				}
+			}
+			for _, v := range allPermissions {
+				if v.ParentId == 0 {
+					checkList := make([]int, 0)
+					plist := new(company.PermissionLookList)
+					plist.Items = make([]*company.PermissionLookItem, 0)
+					plist.ItemsType = make([]*company.PermissionSetItemType, 0)
+					items, ok := permissionMap[v.ChartPermissionId]
+					if ok {
+						for itemK, n := range items {
+							permission, err := company.GetCompanyPermissionCheckItem(companyId, n.ChartPermissionId)
+							if err != nil && err.Error() != utils.ErrNoRow() {
+								br.Msg = "获取失败"
+								br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
+								return
+							}
+							if permission != nil && permission.ChartPermissionId > 0 {
+								checkList = append(checkList, n.ChartPermissionId)
+								items[itemK].StartDate = permission.StartDate
+								items[itemK].EndDate = permission.EndDate
+								items[itemK].Status = permission.Status
+
+								endDateTime, _ := time.Parse(utils.FormatDate, permission.EndDate)
+								endDateTime = endDateTime.AddDate(0, 0, 1)
+								sub := endDateTime.Sub(time.Now())
+								if sub < 0 {
+									sub = 0
+								}
+								expireDay := fmt.Sprintf("%v", int(sub.Hours()/24))
+								items[itemK].ExpireDay = expireDay
+							}
 						}
-						expireDay := fmt.Sprintf("%v", int(sub.Hours()/24))
-						items[itemK].ExpireDay = expireDay
+						plist.Items = items
 					}
-					//count, err := company.GetCompanyPermissionCheck(companyId, n.ChartPermissionId)
-					//if err != nil {
-					//	br.Msg = "获取失败"
-					//	br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
-					//	return
-					//}
-					//if count > 0 {
-					//	checkList = append(checkList, n.ChartPermissionId)
-					//}
+					plist.ClassifyName = v.PermissionName
+					plist.CheckList = checkList
+					item.PermissionList = append(item.PermissionList, plist)
 				}
-				plist.Items = items
-				plist.ClassifyName = v
-				plist.CheckList = checkList
-				item.PermissionList = append(item.PermissionList, plist)
+
 			}
 			resp.FiccItem = item
 			if resp.FiccItem.Status == utils.COMPANY_STATUS_FOREVER {
@@ -3293,7 +3364,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 {
+					if item.SellerId == sysUser.AdminId || item.ShareSellerId == sysUser.AdminId {
 						btnDetailItem.BtnHistoryList = true
 					}
 					if sysUser.Authority > 0 {
@@ -3336,7 +3407,7 @@ func (this *CompanyController) Detail() {
 				resp.IsButtonShow = 1
 			}
 		}
-		btnItem := services.GetCompanyPermissionButton(roleTypeCode, item.Status, strconv.Itoa(item.SellerId), strconv.Itoa(item.GroupId), item.GroupId, sysUser.GroupId, item.SellerId, sysUser.AdminId, sysUser.Authority, item.ProductId, shareSellerId)
+		btnItem := services.GetCompanyPermissionButton(roleTypeCode, item.Status, strconv.Itoa(item.SellerId), strconv.Itoa(item.GroupId), item.GroupId, sysUser.GroupId, item.SellerId, sysUser.AdminId, sysUser.Authority, item.ProductId, shareSellerId, "")
 		//if itemLen > 1 {
 		//	btnDetailItem.BtnEdit = false
 		//	btnDetailItem.BtnDelete = false
@@ -3519,7 +3590,7 @@ func (this *CompanyController) DetailByCreditCode() {
 		br.Data = resp
 		return
 	}
-	shareSellerId := item.ShareSellerId
+
 	companyId := item.CompanyId
 	var productName string
 	productId := services.GetProductId(sysUser.RoleTypeCode)
@@ -3574,51 +3645,51 @@ func (this *CompanyController) DetailByCreditCode() {
 					}
 				}
 			}
-			for _, v := range utils.PermissionFiccClassifyArr {
-				checkList := make([]int, 0)
-				plist := new(company.PermissionLookList)
-				items, err := company.GetPermissionLookItems(item.ProductId, v)
-				if err != nil {
-					br.Msg = "获取失败"
-					br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
-					return
-				}
-				for itemK, n := range items {
-					permission, err := company.GetCompanyPermissionCheckItem(companyId, n.ChartPermissionId)
-					if err != nil && err.Error() != utils.ErrNoRow() {
-						br.Msg = "获取失败"
-						br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
-						return
-					}
-					if permission != nil && permission.ChartPermissionId > 0 {
-						checkList = append(checkList, n.ChartPermissionId)
-						items[itemK].StartDate = permission.StartDate
-						items[itemK].EndDate = permission.EndDate
-						items[itemK].Status = permission.Status
-
-						endDateTime, _ := time.Parse(utils.FormatDate, permission.EndDate)
-						endDateTime = endDateTime.AddDate(0, 0, 1)
-						sub := endDateTime.Sub(time.Now())
-						if sub < 0 {
-							sub = 0
+			//子权限切片集合
+			allFiccPermissions, permissionMap, e := services.GetBasePermissionLookItem(utils.COMPANY_PRODUCT_FICC_ID)
+			if e != nil {
+				br.Msg = "查询基础权限失败"
+				br.ErrMsg = "查询基础权限失败,Err:" + e.Error()
+				return
+			}
+			//遍历获取
+			for _, v := range allFiccPermissions {
+				if v.ParentId == 0 {
+					checkList := make([]int, 0)
+					plist := new(company.PermissionLookList)
+					plist.Items = make([]*company.PermissionLookItem, 0)
+					items, ok1 := permissionMap[v.ChartPermissionId]
+					if ok1 {
+
+						for itemK, n := range items {
+							permission, e := company.GetCompanyPermissionCheckItem(companyId, n.ChartPermissionId)
+							if e != nil && e.Error() != utils.ErrNoRow() {
+								br.Msg = "获取失败"
+								br.ErrMsg = "获取权限信息失败,Err:" + e.Error()
+								return
+							}
+							if permission != nil && permission.ChartPermissionId > 0 {
+								checkList = append(checkList, n.ChartPermissionId)
+								items[itemK].StartDate = permission.StartDate
+								items[itemK].EndDate = permission.EndDate
+								items[itemK].Status = permission.Status
+
+								endDateTime, _ := time.Parse(utils.FormatDate, permission.EndDate)
+								endDateTime = endDateTime.AddDate(0, 0, 1)
+								sub := endDateTime.Sub(time.Now())
+								if sub < 0 {
+									sub = 0
+								}
+								expireDay := fmt.Sprintf("%v", int(sub.Hours()/24))
+								items[itemK].ExpireDay = expireDay
+							}
 						}
-						expireDay := fmt.Sprintf("%v", int(sub.Hours()/24))
-						items[itemK].ExpireDay = expireDay
+						plist.Items = items
 					}
-					//count, err := company.GetCompanyPermissionCheck(companyId, n.ChartPermissionId)
-					//if err != nil {
-					//	br.Msg = "获取失败"
-					//	br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
-					//	return
-					//}
-					//if count > 0 {
-					//	checkList = append(checkList, n.ChartPermissionId)
-					//}
+					plist.ClassifyName = v.PermissionName
+					plist.CheckList = checkList
+					item.PermissionList = append(item.PermissionList, plist)
 				}
-				plist.Items = items
-				plist.ClassifyName = v
-				plist.CheckList = checkList
-				item.PermissionList = append(item.PermissionList, plist)
 			}
 			resp.FiccItem = item
 			if (roleTypeCode == utils.ROLE_TYPE_CODE_FICC_SELLER ||
@@ -3705,7 +3776,8 @@ func (this *CompanyController) DetailByCreditCode() {
 				resp.IsButtonShow = 1
 			}
 		}
-		btnItem := services.GetCompanyPermissionButton(roleTypeCode, item.Status, strconv.Itoa(item.SellerId), strconv.Itoa(item.GroupId), item.GroupId, sysUser.GroupId, item.SellerId, sysUser.AdminId, sysUser.Authority, item.ProductId, shareSellerId)
+		btnItem := services.GetCompanyPermissionButton(roleTypeCode, item.Status, strconv.Itoa(item.SellerId), strconv.Itoa(item.GroupId),
+			item.GroupId, sysUser.GroupId, item.SellerId, sysUser.AdminId, sysUser.Authority, item.ProductId, item.ShareSellerId, "")
 		//if itemLen > 1 {
 		//	btnDetailItem.BtnEdit = false
 		//	btnDetailItem.BtnDelete = false
@@ -3731,7 +3803,7 @@ func (this *CompanyController) DetailByCreditCode() {
 
 		//联系人操作权限
 		if resp.IsContractButtonShow == false {
-			resp.IsContractButtonShow = services.CheckCompanyUserButton(sysUser.RoleTypeCode, item.SellerId, sysUser.AdminId, item.ProductId, shareSellerId, item.Status)
+			resp.IsContractButtonShow = services.CheckCompanyUserButton(sysUser.RoleTypeCode, item.SellerId, sysUser.AdminId, item.ProductId, item.ShareSellerId, item.Status)
 		}
 	}
 
@@ -3874,6 +3946,38 @@ func (this *CompanyController) Edit() {
 
 	productId := services.GetProductId(sysUser.RoleTypeCode) //产品权限id
 	for _, v := range req.Products {
+
+		if productId == utils.COMPANY_PRODUCT_RAI_ID {
+
+			//查询客户的产品权限
+			companyReportPermissionListOld, err := company.GetCompanyReportPermission(req.CompanyId, productId)
+			if err != nil {
+				br.Msg = "查询客户的产品权限异常"
+				br.ErrMsg = "查询客户的产品权限异常:" + err.Error()
+				return
+			}
+			permissionArr := strings.Split(v.PermissionIds, ",")
+			//如果所选行业不属于研选订阅跟研选扣点包,那就是非研选试用客户
+			var isNoResearch bool
+			for _, v := range permissionArr {
+				if v != strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN) && v != strconv.Itoa(utils.YAN_XUAN_KOU_DIAN_BAO_ID) {
+					isNoResearch = true
+					continue
+				}
+			}
+			if isNoResearch && len(companyReportPermissionListOld) != len(permissionArr) {
+				tryOutCountRai, err := company.GetRaiCompanyTryOutCountNoResearch(sysUser.AdminId)
+				if err != nil {
+					br.Msg = "判断试用客户量失败"
+					br.ErrMsg = "判断试用客户量失败,Err:" + err.Error()
+					return
+				}
+				if tryOutCountRai >= utils.COMPANY_STATUS_TRY_OUT_COUNT_RAI {
+					br.Msg = "非研选试用客户最多30家"
+					return
+				}
+			}
+		}
 		if v.IndustryId <= 0 {
 			br.Msg = "请选择行业"
 			br.IsSendEmail = false
@@ -4846,6 +4950,36 @@ func (this *CompanyController) Receive() {
 		productName = utils.COMPANY_PRODUCT_RAI_NAME
 	}
 
+	if productId == utils.COMPANY_PRODUCT_RAI_ID {
+		//查询客户的产品权限
+		companyReportPermissionListOld, err := company.GetCompanyReportPermission(req.CompanyId, productId)
+		if err != nil {
+			br.Msg = "查询客户的产品权限异常"
+			br.ErrMsg = "查询客户的产品权限异常:" + err.Error()
+			return
+		}
+		var isNoResearch bool
+		for _, v := range companyReportPermissionListOld {
+			if v.ChartPermissionId != utils.CHART_PERMISSION_ID_YANXUAN && v.ChartPermissionId != utils.YAN_XUAN_KOU_DIAN_BAO_ID {
+				isNoResearch = true
+				continue
+			}
+		}
+		//如果所选行业不属于研选订阅跟研选扣点包,那就是非研选试用客户
+		if isNoResearch {
+			tryOutCountRai, err := company.GetRaiCompanyTryOutCountNoResearch(req.SellsId)
+			if err != nil {
+				br.Msg = "判断试用客户量失败"
+				br.ErrMsg = "判断试用客户量失败,Err:" + err.Error()
+				return
+			}
+			if tryOutCountRai >= utils.COMPANY_STATUS_TRY_OUT_COUNT_RAI {
+				br.Msg = "非研选试用客户最多30家"
+				return
+			}
+		}
+	}
+
 	if cp != nil {
 		if cp.Status != utils.COMPANY_STATUS_LOSE {
 			br.Msg = "客户状态为:" + cp.Status + ";不可领取"
@@ -5097,6 +5231,37 @@ func (this *CompanyController) MoveSeller() {
 		br.ErrMsg = "无效的客户类型"
 		return
 	}
+
+	if productId == utils.COMPANY_PRODUCT_RAI_ID {
+		//查询客户的产品权限
+		companyReportPermissionListOld, err := company.GetCompanyReportPermission(req.CompanyId, productId)
+		if err != nil {
+			br.Msg = "查询客户的产品权限异常"
+			br.ErrMsg = "查询客户的产品权限异常:" + err.Error()
+			return
+		}
+		var isNoResearch bool
+		for _, v := range companyReportPermissionListOld {
+			if v.ChartPermissionId != utils.CHART_PERMISSION_ID_YANXUAN && v.ChartPermissionId != utils.YAN_XUAN_KOU_DIAN_BAO_ID {
+				isNoResearch = true
+				continue
+			}
+		}
+		//如果所选行业不属于研选订阅跟研选扣点包,那就是非研选试用客户
+		if isNoResearch {
+			tryOutCountRai, err := company.GetRaiCompanyTryOutCountNoResearch(req.SellsId)
+			if err != nil {
+				br.Msg = "判断试用客户量失败"
+				br.ErrMsg = "判断试用客户量失败,Err:" + err.Error()
+				return
+			}
+			if tryOutCountRai >= utils.COMPANY_STATUS_TRY_OUT_COUNT_RAI {
+				br.Msg = seller.RealName + "的非研选试用客户已超过30家"
+				return
+			}
+		}
+	}
+
 	cp, err := company.GetCompanyProductByCompanyIdAndProductId(req.CompanyId, productId)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		if err.Error() == utils.ErrNoRow() {
@@ -5108,7 +5273,6 @@ func (this *CompanyController) MoveSeller() {
 		br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
 		return
 	}
-	fmt.Println(cp)
 	if cp == nil {
 		br.Msg = "客户信息不存在,请刷新页面"
 		br.ErrMsg = "客户信息不存在"
@@ -7594,20 +7758,27 @@ func (this *CompanyController) PermissionList() {
 
 	for _, companyType := range companySlice {
 		//子权限切片集合
-		var permissionClassifyArr []string
+		//var permissionClassifyArr []string
+		var permissionProductId int
 		if companyType == "ficc" {
-			for _, v := range utils.PermissionFiccClassifyArr {
-				permissionClassifyArr = append(permissionClassifyArr, v)
-			}
+			permissionProductId = utils.COMPANY_PRODUCT_FICC_ID
 		} else {
-			permissionClassifyArr = append(permissionClassifyArr, "权益")
+			permissionProductId = utils.COMPANY_PRODUCT_RAI_ID
+		}
+		//子权限切片集合
+		permissionClassifyArr, err := models.GetPermissionFirstByProductId(permissionProductId)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
+			return
 		}
 
 		//遍历获取
 		for _, v := range permissionClassifyArr {
 			checkList := make([]int, 0)
 			plist := new(company.PermissionLookList)
-			items, err := company.GetPermissionLookItems(classifyMap[companyType], v)
+			plist.Items = make([]*company.PermissionLookItem, 0)
+			items, err := company.GetPermissionLookItemsByParentId(classifyMap[companyType], v.ChartPermissionId)
 			if err != nil {
 				br.Msg = "获取失败"
 				br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
@@ -7654,7 +7825,7 @@ func (this *CompanyController) PermissionList() {
 				}
 				expireDay := fmt.Sprintf("%v", int(sub.Hours()/24))
 				items[i].ExpireDay = expireDay
-				items[i].ClassifyName = v
+				items[i].ClassifyName = v.PermissionName
 				//if n.PermissionType == 1 {
 				//	items[i].PermissionTypeName = "主观"
 				//} else if n.PermissionType == 2 {
@@ -7675,7 +7846,7 @@ func (this *CompanyController) PermissionList() {
 					}
 				}
 			}
-			plist.ClassifyName = v
+			plist.ClassifyName = v.PermissionName
 			plist.CheckList = checkList
 			if companyType == "ficc" {
 				resp.FiccPermissionList = append(resp.FiccPermissionList, plist)

+ 147 - 135
controllers/company_apply.go

@@ -81,28 +81,38 @@ func (this *CompanyApplyController) ApplyContractHistoryList() {
 
 		productId = list[i].ProductId
 		if productId == 1 {
-			for _, v := range utils.PermissionFiccClassifyArr {
+			permissionClassifyArr, e := services.GetPermissionFirstArr(utils.COMPANY_PRODUCT_FICC_ID)
+			if e != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取权限分类失败,Err:" + e.Error()
+				return
+			}
+			for _, v := range permissionClassifyArr {
 				checkList := make([]int, 0)
 				plist := new(company.ContractPermissionList)
-				items, err := company.GetPermissionLookItemsExt(productIdStr, v)
+				plist.Items = make([]*company.PermissionLookItem, 0)
+				items, err := company.GetPermissionLookItemsExtByParentId(productIdStr, v.ChartPermissionId)
 				if err != nil {
 					br.Msg = "获取失败"
 					br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
 					return
 				}
-				for _, n := range items {
-					count, err := company.GetCompanyContractPermissionCheckByContractId(companyId, companyContract.CompanyContractId, n.ChartPermissionId)
-					if err != nil {
-						br.Msg = "获取失败"
-						br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
-						return
-					}
-					if count > 0 {
-						checkList = append(checkList, n.ChartPermissionId)
+				if len(items) > 0 {
+					for _, n := range items {
+						count, err := company.GetCompanyContractPermissionCheckByContractId(companyId, companyContract.CompanyContractId, n.ChartPermissionId)
+						if err != nil {
+							br.Msg = "获取失败"
+							br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
+							return
+						}
+						if count > 0 {
+							checkList = append(checkList, n.ChartPermissionId)
+						}
 					}
+					plist.Items = items
 				}
-				plist.Items = items
-				plist.ClassifyName = v
+
+				plist.ClassifyName = v.PermissionName
 				plist.CheckList = checkList
 				list[i].PermissionList = append(list[i].PermissionList, plist)
 			}
@@ -174,7 +184,7 @@ func (this *CompanyApplyController) ApplyContractHistoryList() {
 							}
 						}
 
-						if n.ChartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID && pints > 0 {
+						if n.ChartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID {
 							n.PermissionName += "(" + fmt.Sprint(pints) + "点)"
 						}
 						checkList = append(checkList, n.ChartPermissionId)
@@ -207,7 +217,7 @@ func (this *CompanyApplyController) ApplyContractHistoryList() {
 							//n.PermissionName += "(3w)"
 						}
 
-						if n.ChartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID && pints > 0 {
+						if n.ChartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID {
 							n.PermissionName += "(" + fmt.Sprint(pints) + "点)"
 						}
 						//n.PermissionName += expMap[match.ExpensiveYx]
@@ -398,30 +408,39 @@ func (this *CompanyApplyController) ApplyContractDetail() {
 	}
 
 	if detail.ProductId == 1 {
-		for _, v := range utils.PermissionFiccClassifyArr {
-			checkList := make([]int, 0)
-			plist := new(company.PermissionLookList)
-			items, err := company.GetPermissionLookItems(detail.ProductId, v)
-			if err != nil {
-				br.Msg = "获取失败"
-				br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
-				return
-			}
-			for _, n := range items {
-				count, err := company.GetCompanyContractPermissionCheckByContractId(companyId, detail.CompanyContractId, n.ChartPermissionId)
-				if err != nil {
-					br.Msg = "获取失败"
-					br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
+		//子权限切片集合
+		allFiccPermissions, permissionMap, e := services.GetBasePermissionLookItem(utils.COMPANY_PRODUCT_FICC_ID)
+		if e != nil {
+			br.Msg = "查询基础权限失败"
+			br.ErrMsg = "查询基础权限失败,Err:" + e.Error()
+			return
+		}
+		//遍历获取
+		for _, v := range allFiccPermissions {
+			if v.ParentId == 0 {
+				checkList := make([]int, 0)
+				plist := new(company.PermissionLookList)
+				items, ok := permissionMap[v.ChartPermissionId]
+				if !ok {
+					br.Msg = "获取权限信息失败"
 					return
 				}
-				if count > 0 {
-					checkList = append(checkList, n.ChartPermissionId)
+				for _, n := range items {
+					count, err := company.GetCompanyContractPermissionCheckByContractId(companyId, detail.CompanyContractId, n.ChartPermissionId)
+					if err != nil {
+						br.Msg = "获取失败"
+						br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
+						return
+					}
+					if count > 0 {
+						checkList = append(checkList, n.ChartPermissionId)
+					}
 				}
+				plist.Items = items
+				plist.ClassifyName = v.PermissionName
+				plist.CheckList = checkList
+				detail.PermissionList = append(detail.PermissionList, plist)
 			}
-			plist.Items = items
-			plist.ClassifyName = v
-			plist.CheckList = checkList
-			detail.PermissionList = append(detail.PermissionList, plist)
 		}
 	}
 
@@ -451,6 +470,22 @@ func (this *CompanyApplyController) ApplyContractDetail() {
 		// 未选大套餐, 走老逻辑
 		var points float64
 		if detail.RaiPackageType == 0 {
+
+			totalForever, err := company.GetCompanyProductRaiForeverCount(companyId) //判断是否是权益的永续客户
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
+				return
+			}
+
+			if totalForever > 0 {
+				detail.Quarter, err = utils.GetQuarterStrStartDatesInRange(detail.StartDate, detail.EndDate) //通过开始时间,结束时间,获取对应季度的拼接字符串
+				if err != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取季度息失败,Err:" + err.Error()
+					return
+				}
+			}
 			mapUpgrade := make(map[int]bool) // 通过合同获取所勾选的升级行业权限
 
 			for _, v := range permissionList {
@@ -462,13 +497,13 @@ func (this *CompanyApplyController) ApplyContractDetail() {
 					//expensiveYx = v.ExpensiveYx
 				}
 
-				if v.Points > 0 && v.ChartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID {
+				if v.ChartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID {
 					points = v.Points
 				}
 				permissions = append(permissions, v.ChartPermissionId)
 			}
 			for _, n := range items {
-				if points > 0 && n.ChartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID {
+				if n.ChartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID {
 					n.PermissionName += fmt.Sprint("(", points, "点)")
 				}
 				if utils.InArrayByInt(permissions, n.ChartPermissionId) {
@@ -536,7 +571,7 @@ func (this *CompanyApplyController) ApplyContractDetail() {
 				if v.ExpensiveYx == 1 {
 					mapExpensive[v.ChartPermissionId] = true
 				}
-				if v.Points > 0 && v.ChartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID {
+				if v.ChartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID {
 					points = v.Points
 				}
 				permissions = append(permissions, v.ChartPermissionId)
@@ -1920,30 +1955,46 @@ func (this *CompanyApplyController) ApplyContract() {
 	companyId := approvalRecord.CompanyId
 
 	if productId == 1 {
-		for _, v := range utils.PermissionFiccClassifyArr {
-			checkList := make([]int, 0)
-			plist := new(company.PermissionLookList)
-			items, err := company.GetPermissionLookItems(productId, v)
-			if err != nil {
-				br.Msg = "获取失败"
-				br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
-				return
-			}
-			for _, n := range items {
-				count, err := company.GetCompanyContractPermissionCheckByContractId(companyId, contractItem.CompanyContractId, n.ChartPermissionId)
-				if err != nil {
-					br.Msg = "获取失败"
-					br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
-					return
+		allFiccPermissions, e := company.GetPermissionLookItemsByProductId(utils.COMPANY_PRODUCT_FICC_ID)
+		if e != nil {
+			br.Msg = "获取权限信息失败"
+			br.ErrMsg = "获取权限信息失败,Err:" + e.Error()
+			return
+		}
+		permissionMap := make(map[int][]*company.PermissionLookItem, 0)
+		permissionCheckMap := make(map[int][]int, 0)
+		for _, v := range allFiccPermissions {
+			if v.ParentId > 0 {
+				permissionMap[v.ParentId] = append(permissionMap[v.ParentId], v)
+				if v.IsPublic == 1 {
+					permissionCheckMap[v.ParentId] = append(permissionCheckMap[v.ParentId], v.ChartPermissionId)
 				}
-				if count > 0 {
-					checkList = append(checkList, n.ChartPermissionId)
+			}
+		}
+		for _, v := range allFiccPermissions {
+			if v.ParentId == 0 {
+				checkList := make([]int, 0)
+				plist := new(company.PermissionLookList)
+				plist.Items = make([]*company.PermissionLookItem, 0)
+				items, ok := permissionMap[v.ChartPermissionId]
+				if ok {
+					for _, n := range items {
+						count, err := company.GetCompanyContractPermissionCheckByContractId(companyId, contractItem.CompanyContractId, n.ChartPermissionId)
+						if err != nil {
+							br.Msg = "获取失败"
+							br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
+							return
+						}
+						if count > 0 {
+							checkList = append(checkList, n.ChartPermissionId)
+						}
+					}
+					plist.Items = items
 				}
+				plist.ClassifyName = v.PermissionName
+				plist.CheckList = checkList
+				contractItem.PermissionList = append(contractItem.PermissionList, plist)
 			}
-			plist.Items = items
-			plist.ClassifyName = v
-			plist.CheckList = checkList
-			contractItem.PermissionList = append(contractItem.PermissionList, plist)
 		}
 	}
 
@@ -1962,11 +2013,28 @@ func (this *CompanyApplyController) ApplyContract() {
 			return
 		}
 
+		totalForever, err := company.GetCompanyProductRaiForeverCount(companyId) //判断是否是权益的永续客户
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
+			return
+		}
 		// 大套餐
 		bigPackage70, bigPackage45 := new(company.PermissionLookItem), new(company.PermissionLookItem)
-		bigPackage70.PermissionName = utils.CHART_PERMISSION_NAME_70W
-		bigPackage45.PermissionName = utils.CHART_PERMISSION_NAME_45W
-		plist.Items = append(plist.Items, bigPackage45, bigPackage70)
+		if totalForever > 0 {
+			//filterPermissionName := []string{"专家", "路演服务", "调研", "研选订阅", "研选扣点包"} //权益的永续客户这些不展示
+			//for _, v := range items {
+			//	if utils.InArrayByStr(filterPermissionName, v.PermissionName) {
+			//		continue
+			//	}
+			//	p.Items = append(p.Items, v)
+			//}
+
+		} else {
+			bigPackage70.PermissionName = utils.CHART_PERMISSION_NAME_70W
+			bigPackage45.PermissionName = utils.CHART_PERMISSION_NAME_45W
+			plist.Items = append(plist.Items, bigPackage45, bigPackage70)
+		}
 
 		// 是否为内部人员, 内部人员需要拆分行业主客观
 		isRai, e := services.CheckRaiAdmin(sysUser.AdminId)
@@ -2020,21 +2088,21 @@ func (this *CompanyApplyController) ApplyContract() {
 		}
 		//mapChartPermissionId := make(map[int]int)
 		mapChartPermissionName := make(map[string]string) // 行业主客观防止重复写入Items用的
+		filterPermissionName := []string{}
+		mapPermissionNameUpgrade := make(map[string]bool) //升级权限重复
+		if totalForever == 0 {
+			filterPermissionName = []string{"专家", "路演服务"} // 需要过滤不展示的行业
+		} else {
+			filterPermissionName = []string{"专家", "路演服务", "调研", "研选订阅", "研选扣点包"} //权益的永续客户这些不展示
+		}
 		for _, n := range items {
-			//count, err := company.GetCompanyContractPermissionCheckByContractId(companyId, contractItem.CompanyContractId, n.ChartPermissionId)
-			//if err != nil {
-			//	br.Msg = "获取失败"
-			//	br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
-			//	return
-			//}
-
-			filterPermissionName := []string{"专家", "路演服务"} // 需要过滤不展示的行业
 			if utils.InArrayByStr(filterPermissionName, n.PermissionName) {
 				continue
 			}
-
+			if n.PermissionType == 2 && totalForever > 0 {
+				continue
+			}
 			if utils.InArrayByInt(permissionIds, n.ChartPermissionId) {
-				fmt.Println(1)
 				n.Checked = true
 				if _, ok := mapUpgrade[n.ChartPermissionId]; ok {
 					checkList = append(checkList, n.ChartPermissionId+utils.PERMISSION_ID_UPGRADE)
@@ -2057,7 +2125,6 @@ func (this *CompanyApplyController) ApplyContract() {
 						}
 					}
 				}
-				//mapChartPermissionId[n.ChartPermissionId] = n.ChartPermissionId
 			}
 
 			// 买方研选3w/5w/10w
@@ -2069,20 +2136,7 @@ func (this *CompanyApplyController) ApplyContract() {
 
 				continue
 			}
-
-			//if mapChartPermissionName[n.PermissionName] == "" {
-			//	plist.Items = append(plist.Items, n)
-			//	mapChartPermissionName[n.PermissionName] = n.PermissionName
-			//	if strings.Contains("医药消费科技智造", n.PermissionName) {
-			//		vS := new(company.PermissionLookItem)
-			//		vS.ChartPermissionId = n.ChartPermissionId + utils.PERMISSION_ID_UPGRADE
-			//		vS.PermissionName = n.PermissionName + "(升级)"
-			//		vS.PermissionType = n.PermissionType
-			//		vS.Checked = n.Checked
-			//		plist.Items = append(plist.Items, vS)
-			//	}
-			//}
-
+			//if totalForever == 0 {
 			// 四行业主客观/升级
 			if mapChartPermissionName[n.PermissionName] == "" {
 				mapChartPermissionName[n.PermissionName] = n.PermissionName
@@ -2091,7 +2145,7 @@ func (this *CompanyApplyController) ApplyContract() {
 					continue
 				}
 				// 内部人员需要拆分主客观权限
-				if isRai {
+				if isRai && totalForever == 0 {
 					n.Child = make([]*company.PermissionLookItem, 0)
 					n.Child = append(n.Child, &company.PermissionLookItem{
 						ChartPermissionId: childSubMap[n.PermissionName],
@@ -2103,63 +2157,20 @@ func (this *CompanyApplyController) ApplyContract() {
 						PermissionType:    2,
 					})
 				}
+			}
 
-				plist.Items = append(plist.Items, n)
+			plist.Items = append(plist.Items, n)
 
+			if totalForever == 0 && !mapPermissionNameUpgrade[n.PermissionName] {
 				t := new(company.PermissionLookItem)
 				t.ChartPermissionId = n.ChartPermissionId + utils.PERMISSION_ID_UPGRADE
 				t.PermissionName = n.PermissionName + "(升级)"
 				t.PermissionType = n.PermissionType
 				t.Checked = n.Checked
 				plist.Items = append(plist.Items, t)
+				mapPermissionNameUpgrade[n.PermissionName] = true
 			}
 		}
-		//itemsType, err := company.GetPermissionSetItemsType(2, v)
-		//if err != nil {
-		//	br.Msg = "获取失败"
-		//	br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
-		//	return
-		//}
-		//含有主客观的权限处理
-		//mapChartPermission := make(map[string]int)
-		//pType := new(company.PermissionSetItemType)
-		//for _, v := range itemsType {
-		//	if mapChartPermission[v.PermissionName] == 0 {
-		//		mapChartPermission[v.PermissionName] = v.ChartPermissionId
-		//		pType = new(company.PermissionSetItemType)
-		//		pType.PermissionName = v.PermissionName
-		//	}
-		//	if mapChartPermissionId[v.ChartPermissionId] > 0 {
-		//		v.Checked = true
-		//	}
-		//	pType.Items = append(pType.Items, v)
-		//	if len(pType.Items) == 2 {
-		//		var checkedMinateBool bool
-		//		pType.Checked = true
-		//		for _, pv := range pType.Items {
-		//			if pv.Checked == false {
-		//				pType.Checked = false
-		//			} else {
-		//				checkedMinateBool = true
-		//				pType.NoClicking = true
-		//			}
-		//		}
-		//		if checkedMinateBool == true && pType.Checked == false {
-		//			pType.CheckedMinate = true
-		//		}
-		//		pListType.Items = append(pListType.Items, pType)
-		//	}
-		//}
-
-		////没有主客观的权限处理
-		//for _, v := range items {
-		//	fmt.Println(v)
-		//	if strings.Index(v.Remark, "主观") == -1 && strings.Index(v.Remark, "客观") == -1 {
-		//		if mapChartPermissionId[v.ChartPermissionId] > 0 {
-		//			v.Checked = true
-		//		}
-		//		plist.Items = append(plist.Items, v)
-		//	}
 		//}
 
 		// 如果checklist 里的值 没有在items里,则不返回给前端
@@ -2196,6 +2207,7 @@ func (this *CompanyApplyController) ApplyContract() {
 		//plist.CheckList = finalCheckList
 		plist.CheckList = checkList
 		contractItem.PermissionList = append(contractItem.PermissionList, plist)
+		contractItem.Quarter, _ = utils.GetQuarterStrStartDatesInRangeHaveYear(contractItem.StartDate, contractItem.EndDate) //季度信息
 	}
 
 	resp := new(company.ApplyContractResp)

+ 72 - 49
controllers/company_apply_v2.go

@@ -159,15 +159,8 @@ func (this *CompanyApplyController) ApplyServiceUpdate() {
 		return
 	}
 
-	companyItem, e := company.GetCompanyById(req.CompanyId)
-	if e != nil {
-		br.Msg = "客户信息有误"
-		br.ErrMsg = "获取客户信息失败, Err: " + e.Error()
-		return
-	}
-
 	//客户归属判断-当前销售/咨询组共享销售
-	if companyProduct.SellerId != sysUser.AdminId && companyItem.ShareSellerId != sysUser.AdminId {
+	if companyProduct.SellerId != sysUser.AdminId && companyProduct.ShareSellerId != sysUser.AdminId {
 		br.Msg = "客户信息异常"
 		br.ErrMsg = "客户信息异常,不是当前所属销售,客户所属销售:" + companyProduct.SellerName + ";当前销售:" + sysUser.AdminName
 		return
@@ -447,6 +440,22 @@ func (this *CompanyApplyController) ApplyTurnPositive() {
 			return
 		}
 	}
+	companyProduct, err := company.GetCompanyProductByCompanyIdAndProductId(req.CompanyId, productId)
+	if err != nil {
+		br.Msg = "获取客户信息失败"
+		br.ErrMsg = "获取客户信息失败"
+		return
+	}
+	if companyProduct == nil {
+		br.Msg = "获取客户信息失败"
+		br.ErrMsg = "客户不存在,不可提交审批:companyId:" + strconv.Itoa(req.CompanyId) + ";productId:" + strconv.Itoa(productId)
+		return
+	}
+	if companyProduct.Status != utils.COMPANY_STATUS_TRY_OUT && companyProduct.InitStatus != utils.COMPANY_STATUS_FOREVER {
+		br.Msg = "客户状态为:" + companyProduct.Status + ";不可进行转正申请"
+		br.ErrMsg = "客户状态为:" + companyProduct.Status + ";不可进行转正申请"
+		return
+	}
 
 	mapPermissionIdUpgrade := make(map[int]int) // 权益主客观、行业升级、买方研选的处理
 	permissionNameMap := make(map[int]string)   // 权益行业名称处理
@@ -467,11 +476,9 @@ func (this *CompanyApplyController) ApplyTurnPositive() {
 			br.ErrMsg = "获取行业主观对应的客观ID失败, Err: " + e.Error()
 			return
 		}
-
 		strPermissionIdArr := make([]string, 0) // 最终过滤后的权限IDs
 		for _, v := range permissionSlice {
 			permissionId, _ := strconv.Atoi(v)
-
 			// 研选5w的处理
 			if permissionId == expId {
 				//permissionIdsNew += strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN) + ","
@@ -502,6 +509,10 @@ func (this *CompanyApplyController) ApplyTurnPositive() {
 				strPermissionIdArr = append(strPermissionIdArr, v)
 				permissionIdOnly = permissionId
 			}
+			//权益的永续客户主客观权限都开
+			if companyProduct.InitStatus == utils.COMPANY_STATUS_FOREVER && subObjMap[permissionId] > 0 {
+				strPermissionIdArr = append(strPermissionIdArr, strconv.Itoa(subObjMap[permissionId]))
+			}
 			if _, ok := mapPermissionId[permissionIdOnly]; ok {
 				br.Msg = "权限设置有误,请重新选择"
 				br.ErrMsg = "升级权限与普通权限重复选择!" + req.PermissionIds
@@ -547,31 +558,8 @@ func (this *CompanyApplyController) ApplyTurnPositive() {
 		}
 	}
 
-	companyProduct, err := company.GetCompanyProductByCompanyIdAndProductId(req.CompanyId, productId)
-	if err != nil {
-		br.Msg = "获取客户信息失败"
-		br.ErrMsg = "获取客户信息失败"
-		return
-	}
-	if companyProduct == nil {
-		br.Msg = "获取客户信息失败"
-		br.ErrMsg = "客户不存在,不可提交审批:companyId:" + strconv.Itoa(req.CompanyId) + ";productId:" + strconv.Itoa(productId)
-		return
-	}
-	if companyProduct.Status != utils.COMPANY_STATUS_TRY_OUT {
-		br.Msg = "客户状态为:" + companyProduct.Status + ";不可进行转正申请"
-		br.ErrMsg = "客户状态为:" + companyProduct.Status + ";不可进行转正申请"
-		return
-	}
-
-	companyItem, e := company.GetCompanyById(req.CompanyId)
-	if e != nil {
-		br.Msg = "客户信息有误"
-		br.ErrMsg = "获取客户信息失败, Err: " + e.Error()
-		return
-	}
 	//客户归属判断
-	if companyProduct.SellerId != sysUser.AdminId && companyItem.ShareSellerId != sysUser.AdminId {
+	if companyProduct.SellerId != sysUser.AdminId && companyProduct.ShareSellerId != sysUser.AdminId {
 		br.Msg = "客户信息异常"
 		br.ErrMsg = "客户信息异常,不是当前所属销售,客户所属销售:" + companyProduct.SellerName + ";当前销售:" + sysUser.AdminName
 		return
@@ -921,7 +909,7 @@ func (this *CompanyApplyController) ApplyBySystemContract() {
 		br.ErrMsg = "客户不存在,不可提交审批:companyId:" + strconv.Itoa(req.CompanyId) + ";productId:" + strconv.Itoa(productId)
 		return
 	}
-	if companyProduct.SellerId != sysUser.AdminId && companyInfo.ShareSellerId != sysUser.AdminId {
+	if companyProduct.SellerId != sysUser.AdminId && companyProduct.ShareSellerId != sysUser.AdminId {
 		br.Msg = "客户信息异常"
 		br.ErrMsg = "客户信息异常,不是当前所属销售,客户所属销售:" + companyProduct.SellerName + ";当前销售:" + sysUser.AdminName
 		return
@@ -1476,6 +1464,28 @@ func (this *CompanyApplyController) ApplyThaw() {
 			br.ErrMsg = "获取客户申请的次数失败,Err:" + err.Error()
 			return
 		}
+
+		permissionArr := strings.Split(req.PermissionIds, ",")
+		//如果所选行业不属于研选订阅跟研选扣点包,那就是非研选试用客户
+		var isNoResearch bool
+		for _, v := range permissionArr {
+			if v != strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN) && v != strconv.Itoa(utils.YAN_XUAN_KOU_DIAN_BAO_ID) {
+				isNoResearch = true
+				continue
+			}
+		}
+		if isNoResearch {
+			tryOutCountRai, err := company.GetRaiCompanyTryOutCountNoResearch(sysUser.AdminId)
+			if err != nil {
+				br.Msg = "判断试用客户量失败"
+				br.ErrMsg = "判断试用客户量失败,Err:" + err.Error()
+				return
+			}
+			if tryOutCountRai >= utils.COMPANY_STATUS_TRY_OUT_COUNT_RAI {
+				br.Msg = "非研选试用客户最多30家"
+				return
+			}
+		}
 	}
 	companyProduct, err := company.GetCompanyProductByCompanyIdAndProductId(req.CompanyId, productId)
 	if err != nil {
@@ -1499,14 +1509,8 @@ func (this *CompanyApplyController) ApplyThaw() {
 		return
 	}
 
-	companyItem, e := company.GetCompanyById(req.CompanyId)
-	if e != nil {
-		br.Msg = "客户信息有误"
-		br.ErrMsg = "获取客户信息失败, Err: " + e.Error()
-		return
-	}
 	//客户归属判断
-	if companyProduct.SellerId != sysUser.AdminId && companyItem.ShareSellerId != sysUser.AdminId {
+	if companyProduct.SellerId != sysUser.AdminId && companyProduct.ShareSellerId != sysUser.AdminId {
 		br.Msg = "客户信息异常"
 		br.ErrMsg = "客户信息异常,不是当前所属销售,客户所属销售:" + companyProduct.SellerName + ";当前销售:" + sysUser.AdminName
 		return
@@ -1753,14 +1757,8 @@ func (this *CompanyApplyController) ApplyDelay() {
 		return
 	}
 
-	companyItem, e := company.GetCompanyById(req.CompanyId)
-	if e != nil {
-		br.Msg = "客户信息有误"
-		br.ErrMsg = "获取客户信息失败, Err: " + e.Error()
-		return
-	}
 	//客户归属判断
-	if companyProduct.SellerId != sysUser.AdminId && companyItem.ShareSellerId != sysUser.AdminId {
+	if companyProduct.SellerId != sysUser.AdminId && companyProduct.ShareSellerId != sysUser.AdminId {
 		br.Msg = "客户信息异常"
 		br.ErrMsg = "客户信息异常,不是当前所属销售,客户所属销售:" + companyProduct.SellerName + ";当前销售:" + sysUser.AdminName
 		return
@@ -1967,6 +1965,31 @@ func (this *CompanyApplyController) ApplyReceive() {
 		return
 	}
 
+	//如果是权益客户,在选择非研选行业试用时,需要判断当前有多少非研选的试用客户(试用状态,且行业是非研选)
+	if productId == utils.COMPANY_PRODUCT_RAI_ID {
+		permissionArr := strings.Split(req.PermissionIds, ",")
+		//如果所选行业不属于研选订阅跟研选扣点包,那就是非研选试用客户
+		var isNoResearch bool
+		for _, v := range permissionArr {
+			if v != strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN) && v != strconv.Itoa(utils.YAN_XUAN_KOU_DIAN_BAO_ID) {
+				isNoResearch = true
+				continue
+			}
+		}
+		if isNoResearch {
+			tryOutCountRai, err := company.GetRaiCompanyTryOutCountNoResearch(sysUser.AdminId)
+			if err != nil {
+				br.Msg = "判断试用客户量失败"
+				br.ErrMsg = "判断试用客户量失败,Err:" + err.Error()
+				return
+			}
+			if tryOutCountRai >= utils.COMPANY_STATUS_TRY_OUT_COUNT_RAI {
+				br.Msg = "非研选试用客户最多30家"
+				return
+			}
+		}
+	}
+
 	//添加缓存,避免多次点击提交
 	{
 		deleteCache := true

+ 33 - 21
controllers/company_approval.go

@@ -509,6 +509,10 @@ func (this *CompanyApprovalController) List() {
 				opButton.Cancel = true
 			}
 
+			if item.CompanyProductStatus == utils.COMPANY_STATUS_FOREVER {
+				item.CompanyProductStatus = utils.COMPANY_STATUS_X_CLASS_TRY_OUT
+			}
+
 			respTmp := &company.CompanyApprovalList{
 				CompanyId:         item.CompanyId,
 				ProductId:         item.ProductId,
@@ -655,15 +659,19 @@ func (this *CompanyApprovalController) GetApprovalPermissionList() {
 	}
 
 	//子权限切片集合
-	var permissionClassifyArr []string
+	var permissionProductId int
+
 	if approvalInfo.ProductId == 1 {
-		for _, v := range utils.PermissionFiccClassifyArr {
-			permissionClassifyArr = append(permissionClassifyArr, v)
-		}
+		permissionProductId = 1
 	} else {
-		permissionClassifyArr = append(permissionClassifyArr, "权益")
+		permissionProductId = 2
+	}
+	permissionClassifyArr, err := services.GetPermissionFirstArr(permissionProductId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取权限分类失败,Err:" + err.Error()
+		return
 	}
-
 	//获取需要审批的权限
 	delayPermissionList, err := company.GetDelayPermissionItems(approvalInfo.CompanyId, approvalInfo.CompanyApprovalId)
 	if err != nil && err.Error() != utils.ErrNoRow() {
@@ -682,26 +690,31 @@ func (this *CompanyApprovalController) GetApprovalPermissionList() {
 	for _, v := range permissionClassifyArr {
 		checkList := make([]int, 0)
 		plist := new(company.PermissionLookList)
-		items, err := company.GetPermissionLookItems(approvalInfo.ProductId, v)
+		plist.Items = make([]*company.PermissionLookItem, 0)
+		items, err := company.GetPermissionLookItemsByParentId(approvalInfo.ProductId, v.ChartPermissionId)
 		if err != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
 			return
 		}
-		//权益客户下,主观客观同时选择,进行合并
-		for _, n := range items {
-			if _, ok := delayPermissionIdMap[n.ChartPermissionId]; ok {
-				//if approvalInfo.ProductId == 2 {
-				//	if sandoPermissionIdMap[n.PermissionName] == 0 {
-				//		checkList = append(checkList, n.ChartPermissionId)
-				//	}
-				//	sandoPermissionIdMap[n.PermissionName] += 1
-				//} else {
-				//	checkList = append(checkList, n.ChartPermissionId)
-				//}
-				checkList = append(checkList, n.ChartPermissionId)
+		if len(items) > 0 {
+			//权益客户下,主观客观同时选择,进行合并
+			for _, n := range items {
+				if _, ok := delayPermissionIdMap[n.ChartPermissionId]; ok {
+					//if approvalInfo.ProductId == 2 {
+					//	if sandoPermissionIdMap[n.PermissionName] == 0 {
+					//		checkList = append(checkList, n.ChartPermissionId)
+					//	}
+					//	sandoPermissionIdMap[n.PermissionName] += 1
+					//} else {
+					//	checkList = append(checkList, n.ChartPermissionId)
+					//}
+					checkList = append(checkList, n.ChartPermissionId)
+				}
 			}
+			plist.Items = items
 		}
+
 		//if approvalInfo.ProductId == 2 {
 		//	for i, n := range items {
 		//		if sandoPermissionIdMap[n.PermissionName] == 1 {
@@ -709,8 +722,7 @@ func (this *CompanyApprovalController) GetApprovalPermissionList() {
 		//		}
 		//	}
 		//}
-		plist.Items = items
-		plist.ClassifyName = v
+		plist.ClassifyName = v.PermissionName
 		plist.CheckList = checkList
 		if approvalInfo.ProductId == 1 {
 			resp.FiccPermissionList = append(resp.FiccPermissionList, plist)

+ 203 - 166
controllers/company_permission.go

@@ -17,9 +17,11 @@ type CompanyPermissionController struct {
 	BaseAuthController
 }
 
+// List
 // @Title 获取权限设置基础信息
 // @Description 获取权限设置基础信息接口
 // @Param   CompanyType   query   string  true       "客户类型:传空字符串或者不传为全部,'ficc','权益'"
+// @Param   CompanyStatus   query   string  true       "客户状态"
 // @Param   NoUpgrade   query   bool  false       "是否不展示升级权限,默认为 false"
 // @Param   IsShowYanXuanKouDian   query   bool  false       "是否展示研选扣点包,默认为 false"
 // @Success 200 {object} company.PermissionSetResp
@@ -41,7 +43,11 @@ func (this *CompanyPermissionController) List() {
 
 	companyType := this.GetString("CompanyType")
 	noUpgrade, _ := this.GetBool("NoUpgrade", false)                       // 添加客户、领取客户=true; 申请转正、续约申请=false
-	isShowYanXuanKouDian, _ := this.GetBool("IsShowYanXuanKouDian", false) // 添加客户、领取客户=true; 申请转正、续约申请=false
+	isShowYanXuanKouDian, _ := this.GetBool("IsShowYanXuanKouDian", false) // 是否展示研选扣点
+	companyStatus := this.GetString("CompanyStatus")                       // 客户状态
+	if companyStatus == utils.COMPANY_STATUS_X_CLASS_TRY_OUT || strings.Contains(companyStatus, utils.COMPANY_STATUS_FOREVER) {
+		companyStatus = utils.COMPANY_STATUS_FOREVER
+	}
 	var productId int
 	resp := new(company.PermissionSetResp)
 
@@ -50,23 +56,40 @@ func (this *CompanyPermissionController) List() {
 
 	// FICC
 	if productId == utils.COMPANY_PRODUCT_FICC_ID || companyType == utils.COMPANY_PRODUCT_FICC_NAME {
-		for _, v := range utils.PermissionFiccClassifyArr {
-			checkList := make([]int, 0)
-			p := new(company.PermissionSetList)
-			p.ClassifyName = v
-			items, err := company.GetPermissionSetItems(utils.COMPANY_PRODUCT_FICC_ID, v)
-			if err != nil {
-				br.Msg = "获取失败"
-				br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
-				return
+		items, err := company.GetPermissionByProductId(utils.COMPANY_PRODUCT_FICC_ID)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
+			return
+		}
+		permissionMap := make(map[int][]*company.PermissionSetItem, 0)
+		permissionCheckMap := make(map[int][]int, 0)
+		for _, v := range items {
+			if v.ParentId > 0 {
+				permissionMap[v.ParentId] = append(permissionMap[v.ParentId], v)
+				if v.IsPublic == 1 {
+					permissionCheckMap[v.ParentId] = append(permissionCheckMap[v.ParentId], v.ChartPermissionId)
+				}
 			}
-			p.Items = items
-			if v == "宏观经济" {
-				checkList = append(checkList, 1)
+		}
+		for _, v := range items {
+			if v.ParentId == 0 {
+				p := new(company.PermissionSetList)
+				p.Items = make([]*company.PermissionSetItem, 0)
+				p.CheckList = make([]int, 0)
+				p.ClassifyName = v.PermissionName
+
+				if subList, ok := permissionMap[v.ChartPermissionId]; ok {
+					p.Items = subList
+				}
+
+				if checkList, ok := permissionCheckMap[v.ChartPermissionId]; ok {
+					p.CheckList = checkList
+				}
+				resp.List = append(resp.List, p)
 			}
-			p.CheckList = checkList
-			resp.List = append(resp.List, p)
 		}
+
 		br.Ret = 200
 		br.Success = true
 		br.Msg = "获取成功"
@@ -87,6 +110,7 @@ func (this *CompanyPermissionController) List() {
 		if isShowYanXuanKouDian {
 			filterPermissionName = []string{"专家"} //申请转正,或者申请续约的时候 调研 行业需要进行展示
 		}
+
 		// 原始版的权限
 		if noUpgrade {
 			for _, v := range items {
@@ -102,92 +126,102 @@ func (this *CompanyPermissionController) List() {
 
 		// 展示升级权限, 需要有套餐的展示, 行业可能需要拆分主客观, 买方研选需要分为3w和5w两种
 		if !noUpgrade {
-			p.Items = append(p.Items, &company.PermissionSetItem{
-				PermissionName: utils.CHART_PERMISSION_NAME_45W,
-			}, &company.PermissionSetItem{
-				PermissionName: utils.CHART_PERMISSION_NAME_70W,
-			})
-
-			// 是否为内部人员
-			isRai, e := services.CheckRaiAdmin(sysUser.AdminId)
-			if e != nil {
-				br.Msg = "获取失败"
-				br.ErrMsg = "判断是否为权益内部人员失败, GetRaiAdmin Err: " + e.Error()
-				return
-			}
-
-			// 获取行业主客观权限ID
-			childSubMap, childObjMap := make(map[string]int), make(map[string]int)
-			{
-				permissions, e := models.GetChartPermissionList()
+			//判断是不是永续类型的客户
+			if companyStatus == utils.COMPANY_STATUS_FOREVER {
+				filterPermissionName = []string{"专家", "路演服务", "调研", "研选订阅", "研选扣点包"} //权益的永续客户这些不展示
+				for _, v := range items {
+					if utils.InArrayByStr(filterPermissionName, v.PermissionName) {
+						continue
+					}
+					p.Items = append(p.Items, v)
+				}
+			} else {
+				p.Items = append(p.Items, &company.PermissionSetItem{
+					PermissionName: utils.CHART_PERMISSION_NAME_45W,
+				}, &company.PermissionSetItem{
+					PermissionName: utils.CHART_PERMISSION_NAME_70W,
+				})
+
+				// 是否为内部人员
+				isRai, e := services.CheckRaiAdmin(sysUser.AdminId)
 				if e != nil {
 					br.Msg = "获取失败"
-					br.ErrMsg = "获取权限列表失败, GetChartPermissionList Err: " + e.Error()
+					br.ErrMsg = "判断是否为权益内部人员失败, GetRaiAdmin Err: " + e.Error()
 					return
 				}
-				for _, v := range permissions {
-					if !strings.Contains("医药消费科技智造", v.PermissionName) {
+
+				// 获取行业主客观权限ID
+				childSubMap, childObjMap := make(map[string]int), make(map[string]int)
+				{
+					permissions, e := models.GetChartPermissionList()
+					if e != nil {
+						br.Msg = "获取失败"
+						br.ErrMsg = "获取权限列表失败, GetChartPermissionList Err: " + e.Error()
+						return
+					}
+					for _, v := range permissions {
+						if !strings.Contains("医药消费科技智造", v.PermissionName) {
+							continue
+						}
+						if strings.Contains(v.Remark, "主观") {
+							childSubMap[v.PermissionName] = v.ChartPermissionId
+							continue
+						}
+						childObjMap[v.PermissionName] = v.ChartPermissionId
+					}
+				}
+				for _, v := range items {
+					if !isShowYanXuanKouDian && v.ChartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID {
 						continue
 					}
-					if strings.Contains(v.Remark, "主观") {
-						childSubMap[v.PermissionName] = v.ChartPermissionId
+					if utils.InArrayByStr(filterPermissionName, v.PermissionName) {
 						continue
 					}
-					childObjMap[v.PermissionName] = v.ChartPermissionId
-				}
-			}
-
-			for _, v := range items {
-				if !isShowYanXuanKouDian && v.ChartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID {
-					continue
-				}
-				if utils.InArrayByStr(filterPermissionName, v.PermissionName) {
-					continue
-				}
-				// 处理四大行业的升级展示
-				if strings.Contains("医药消费科技智造", v.PermissionName) {
-					// 内部人员需要拆分主客观权限
-					if isRai {
-						v.Child = make([]*company.PermissionSetItem, 0)
-						v.Child = append(v.Child, &company.PermissionSetItem{
-							ChartPermissionId: childSubMap[v.PermissionName],
-							PermissionName:    "主观",
-							PermissionType:    1,
-						}, &company.PermissionSetItem{
-							ChartPermissionId: childObjMap[v.PermissionName],
-							PermissionName:    "客观",
-							PermissionType:    2,
-						})
+					// 处理四大行业的升级展示
+					if strings.Contains("医药消费科技智造", v.PermissionName) {
+						// 内部人员需要拆分主客观权限
+						if isRai {
+							v.Child = make([]*company.PermissionSetItem, 0)
+							v.Child = append(v.Child, &company.PermissionSetItem{
+								ChartPermissionId: childSubMap[v.PermissionName],
+								PermissionName:    "主观",
+								PermissionType:    1,
+							}, &company.PermissionSetItem{
+								ChartPermissionId: childObjMap[v.PermissionName],
+								PermissionName:    "客观",
+								PermissionType:    2,
+							})
+						}
+						p.Items = append(p.Items, v)
+
+						t := new(company.PermissionSetItem)
+						t.ChartPermissionId = v.ChartPermissionId + utils.PERMISSION_ID_UPGRADE
+						t.PermissionName = v.PermissionName + "(升级)"
+						t.PermissionType = v.PermissionType
+						t.Checked = v.Checked
+						p.Items = append(p.Items, t)
+						continue
 					}
-					p.Items = append(p.Items, v)
 
-					t := new(company.PermissionSetItem)
-					t.ChartPermissionId = v.ChartPermissionId + utils.PERMISSION_ID_UPGRADE
-					t.PermissionName = v.PermissionName + "(升级)"
-					t.PermissionType = v.PermissionType
-					t.Checked = v.Checked
-					p.Items = append(p.Items, t)
-					continue
-				}
-
-				// 买方研选划分为3w和5w,10W三种
-				//if v.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN {
-				//	m3, m5, m10 := new(company.PermissionSetItem), new(company.PermissionSetItem), new(company.PermissionSetItem)
-				//	m3.ChartPermissionId = v.ChartPermissionId
-				//	m3.PermissionName = fmt.Sprint(v.PermissionName, "(3w)")
-				//	p.Items = append(p.Items, m3)
-				//
-				//	m5.ChartPermissionId = v.ChartPermissionId + utils.PERMISSION_ID_YANXUAN_DIFF
-				//	m5.PermissionName = fmt.Sprint(v.PermissionName, "(5w)")
-				//	p.Items = append(p.Items, m5)
-				//
-				//	m10.ChartPermissionId = utils.PERMISSION_ID_YANXUAN_10W_DIFF
-				//	m10.PermissionName = fmt.Sprint(v.PermissionName, "(10w)")
-				//	p.Items = append(p.Items, m10)
-				//	continue
-				//}
+					// 买方研选划分为3w和5w,10W三种
+					//if v.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN {
+					//	m3, m5, m10 := new(company.PermissionSetItem), new(company.PermissionSetItem), new(company.PermissionSetItem)
+					//	m3.ChartPermissionId = v.ChartPermissionId
+					//	m3.PermissionName = fmt.Sprint(v.PermissionName, "(3w)")
+					//	p.Items = append(p.Items, m3)
+					//
+					//	m5.ChartPermissionId = v.ChartPermissionId + utils.PERMISSION_ID_YANXUAN_DIFF
+					//	m5.PermissionName = fmt.Sprint(v.PermissionName, "(5w)")
+					//	p.Items = append(p.Items, m5)
+					//
+					//	m10.ChartPermissionId = utils.PERMISSION_ID_YANXUAN_10W_DIFF
+					//	m10.PermissionName = fmt.Sprint(v.PermissionName, "(10w)")
+					//	p.Items = append(p.Items, m10)
+					//	continue
+					//}
 
-				p.Items = append(p.Items, v)
+					p.Items = append(p.Items, v)
+				}
 			}
 		}
 
@@ -228,27 +262,41 @@ func (this *CompanyPermissionController) ListByContract() {
 
 	roleTypeCode := sysUser.RoleTypeCode
 	productId = services.GetProductId(roleTypeCode)
-	if productId == 1 {
-		for _, v := range utils.PermissionFiccClassifyArr {
-			//合同这边市场策略不需要体现出来,所以调整返回
-			if v == "市场策略" {
-				continue
-			}
-			checkList := make([]int, 0)
-			p := new(company.PermissionSetList)
-			p.ClassifyName = v
-			items, err := company.GetPermissionSetItems(productId, v)
-			if err != nil {
-				br.Msg = "获取失败"
-				br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
-				return
+	if productId == 1 || companyType == utils.COMPANY_PRODUCT_FICC_NAME {
+		allFiccPermissions, err := company.GetPermissionByProductId(utils.COMPANY_PRODUCT_FICC_ID)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
+			return
+		}
+		permissionMap := make(map[int][]*company.PermissionSetItem, 0)
+		permissionCheckMap := make(map[int][]int, 0)
+		for _, v := range allFiccPermissions {
+			if v.ParentId > 0 {
+				permissionMap[v.ParentId] = append(permissionMap[v.ParentId], v)
+				if v.IsPublic == 1 {
+					permissionCheckMap[v.ParentId] = append(permissionCheckMap[v.ParentId], v.ChartPermissionId)
+				}
 			}
-			p.Items = items
-			if v == "宏观经济" {
-				checkList = append(checkList, 1)
+		}
+		for _, v := range allFiccPermissions {
+			if v.ParentId == 0 {
+				//合同这边市场策略不需要体现出来,所以调整返回
+				if v.PermissionName == "市场策略" {
+					continue
+				}
+				p := new(company.PermissionSetList)
+				p.Items = make([]*company.PermissionSetItem, 0)
+				p.CheckList = make([]int, 0)
+				p.ClassifyName = v.PermissionName
+				if subList, ok := permissionMap[v.ChartPermissionId]; ok {
+					p.Items = subList
+				}
+				if checkList, ok := permissionCheckMap[v.ChartPermissionId]; ok {
+					p.CheckList = checkList
+				}
+				resp.List = append(resp.List, p)
 			}
-			p.CheckList = checkList
-			resp.List = append(resp.List, p)
 		}
 	} else if productId == 2 {
 		checkList := make([]int, 0)
@@ -265,25 +313,7 @@ func (this *CompanyPermissionController) ListByContract() {
 		p.CheckList = checkList
 		resp.List = append(resp.List, p)
 	} else {
-		if companyType == utils.COMPANY_PRODUCT_FICC_NAME {
-			for _, v := range utils.PermissionFiccClassifyArr {
-				checkList := make([]int, 0)
-				p := new(company.PermissionSetList)
-				p.ClassifyName = v
-				items, err := company.GetPermissionSetItems(1, v)
-				if err != nil {
-					br.Msg = "获取失败"
-					br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
-					return
-				}
-				p.Items = items
-				if v == "宏观经济" {
-					checkList = append(checkList, 1)
-				}
-				p.CheckList = checkList
-				resp.List = append(resp.List, p)
-			}
-		} else {
+		if companyType != utils.COMPANY_PRODUCT_FICC_NAME {
 			v := "权益"
 			checkList := make([]int, 0)
 			p := new(company.PermissionSetList)
@@ -336,38 +366,33 @@ func (this *CompanyPermissionController) PermissionLook() {
 	productId := services.GetProductId(roleTypeCode)
 
 	resp := new(company.PermissionLookResp)
-	permissionArr := []string{}
+	permissionArr := make([]*models.ChartPermission, 0)
+	var err error
 	if lookType == 1 {
-		if productId == 1 {
-			for _, permission := range utils.PermissionFiccClassifyArr {
-				permissionArr = append(permissionArr, permission)
-			}
-		} else if productId == 2 {
-			permissionArr = []string{"权益"}
-		} else {
-			for _, permission := range utils.PermissionAllClassifyArr {
-				permissionArr = append(permissionArr, permission)
-			}
-		}
+		permissionArr, err = services.GetPermissionFirstArr(productId)
 	} else {
-		for _, permission := range utils.PermissionAllClassifyArr {
-			permissionArr = append(permissionArr, permission)
-		}
+		permissionArr, err = services.GetPermissionFirstArr(0)
+	}
+	if err != nil {
+		br.Msg = "获取权限失败"
+		br.ErrMsg = "获取权限失败 err:" + err.Error()
+		return
 	}
 	//ficc权限类目
 	for _, v := range permissionArr {
 		checkList := make([]int, 0)
 		p := new(company.PermissionLookList)
+		p.Items = make([]*company.PermissionLookItem, 0)
 		var productId int
 		//if v == "权益" {
 		//	productId = 2
 		//} else {
 		//	productId = 1
 		//}
-		if v != "权益" {
+		if v.PermissionName != "权益" {
 			productId = 1
 			//mapPermissionName := make(map[string]int)
-			items, err := company.GetPermissionLookItems(productId, v)
+			items, err := company.GetPermissionLookItemsByParentId(productId, v.ChartPermissionId)
 			if err != nil {
 				br.Msg = "获取失败"
 				br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
@@ -413,7 +438,7 @@ func (this *CompanyPermissionController) PermissionLook() {
 				}
 				expireDay := fmt.Sprintf("%v", int(sub.Hours()/24))
 				items[i].ExpireDay = expireDay
-				items[i].ClassifyName = v
+				items[i].ClassifyName = v.PermissionName
 				if lookType == 1 {
 					permissionList = append(permissionList, items[i])
 				} else {
@@ -430,7 +455,7 @@ func (this *CompanyPermissionController) PermissionLook() {
 					mapPermissionNameList[v.PermissionName] = v.ChartPermissionId
 				}
 			}
-			p.ClassifyName = v
+			p.ClassifyName = v.PermissionName
 			//p.Items = permissionList
 			p.CheckList = checkList
 			if lookType == 1 {
@@ -452,7 +477,7 @@ func (this *CompanyPermissionController) PermissionLook() {
 	//权益权限类目
 	for _, v := range permissionArr {
 
-		if v == "权益" {
+		if v.PermissionName == "权益" {
 			// CRM8.8-权益权限列表调用较多、统一进行调整
 			unify := false
 			if lookType == 1 {
@@ -760,8 +785,34 @@ func (this *CompanyPermissionController) PermissionVariety() {
 		productId = 0
 	}
 
-	if productId == 1 {
-		for k, v := range utils.PermissionFiccClassifyArr {
+	if productId == 1 || companyType == utils.COMPANY_PRODUCT_FICC_NAME {
+		permissionFirst, e := services.GetPermissionFirstArr(utils.COMPANY_PRODUCT_FICC_ID)
+		if e != nil {
+			br.Msg = "获取权限信息失败"
+			br.ErrMsg = "获取权限信息失败,Err:" + e.Error()
+			return
+		}
+		allFiccPermissions, e := company.GetPermissionVarietyItemsByProductId(utils.COMPANY_PRODUCT_FICC_ID)
+		if e != nil {
+			br.Msg = "获取权限信息失败"
+			br.ErrMsg = "获取权限信息失败,Err:" + e.Error()
+			return
+		}
+		permissionMap := make(map[int][]*company.PermissionVarietyItem, 0)
+		for _, v := range allFiccPermissions {
+			permissionMap[v.ParentId] = append(permissionMap[v.ParentId], v)
+		}
+		for _, v := range permissionFirst {
+			p := new(company.PermissionVarietyList)
+			p.ClassifyName = v.ClassifyName
+			p.ChartPermissionId = v.ChartPermissionId + 100
+			items, ok := permissionMap[v.ChartPermissionId]
+			if ok {
+				p.Items = items
+			}
+			resp.List = append(resp.List, p)
+		}
+		/*for k, v := range utils.PermissionFiccClassifyArr {
 			p := new(company.PermissionVarietyList)
 			p.ClassifyName = v
 			p.ChartPermissionId = k + 100
@@ -773,7 +824,7 @@ func (this *CompanyPermissionController) PermissionVariety() {
 			}
 			p.Items = items
 			resp.List = append(resp.List, p)
-		}
+		}*/
 	} else if productId == 2 {
 		v := "权益"
 		p := new(company.PermissionVarietyList)
@@ -788,21 +839,7 @@ func (this *CompanyPermissionController) PermissionVariety() {
 		p.Items = items
 		resp.List = append(resp.List, p)
 	} else {
-		if companyType == utils.COMPANY_PRODUCT_FICC_NAME {
-			for k, v := range utils.PermissionFiccClassifyArr {
-				p := new(company.PermissionVarietyList)
-				p.ClassifyName = v
-				p.ChartPermissionId = k + 100
-				items, err := company.GetPermissionVarietyItems(1, v)
-				if err != nil {
-					br.Msg = "获取失败"
-					br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
-					return
-				}
-				p.Items = items
-				resp.List = append(resp.List, p)
-			}
-		} else if companyType == utils.COMPANY_PRODUCT_RAI_NAME {
+		if companyType == utils.COMPANY_PRODUCT_RAI_NAME {
 			v := "权益"
 			p := new(company.PermissionVarietyList)
 			p.ClassifyName = v

+ 1849 - 25
controllers/company_seller.go

@@ -2331,30 +2331,141 @@ func (this *CompanySellerController) ShareSellerList() {
 		br.Ret = 408
 		return
 	}
+	resp := make([]company.DepartmentGroupSellers, 0)
+
+	productId := services.GetProductId(sysUser.RoleTypeCode)
+	if productId == utils.COMPANY_PRODUCT_RAI_ID {
+		// 权益管理员,查看所有权益的账号
+		roleCodeTypeStr := `"` + utils.ROLE_TYPE_CODE_RAI_SELLER + `","` + utils.ROLE_TYPE_CODE_RAI_GROUP + `","` + utils.ROLE_TYPE_CODE_RAI_RESEARCHR + `","` + utils.ROLE_TYPE_CODE_RAI_ADMIN + `"`
+		departmentId := 5
+		enabled := 1
+		groupList, err := system.GetSysGroupByDepartmentId(departmentId)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取分组失败,Err:" + err.Error()
+			return
+		}
+		for _, group := range groupList {
+			groupSellerList := make([]company.DepartmentGroupSellers, 0)
+			groupItem := company.DepartmentGroupSellers{
+				AdminId: fmt.Sprint("group_", group.DepartmentId),
+				//AdminName string `description:"系统用户名称"`
+				RealName:     group.GroupName,
+				ChildrenList: groupSellerList,
+			}
+			teamList, err := system.GetSysTeamByDepartmentId(group.GroupId)
+			if err != nil {
+				br.Msg = "获取小组失败"
+				br.ErrMsg = "获取小组失败,Err:" + err.Error()
+				return
+			}
+			for _, team := range teamList {
+				teamSellerList := make([]company.DepartmentGroupSellers, 0)
+				teamItem := company.DepartmentGroupSellers{
+					AdminId: fmt.Sprint("team_", team.GroupId),
+					//AdminName string `description:"系统用户名称"`
+					RealName:     team.GroupName,
+					ChildrenList: teamSellerList,
+				}
+				sellerList, err := system.GetTeamSysUserList(team.GroupId, enabled)
+				if err != nil {
+					br.Msg = "获取销售失败"
+					br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					return
+				}
+				for _, seller := range sellerList {
+					sellerItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint(seller.AdminId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     seller.RealName,
+						Authority:    seller.Authority,
+						RoleTypeCode: seller.RoleTypeCode,
+					}
+					//fmt.Println("seller.RealName:", seller.RealName)
+					teamSellerList = append(teamSellerList, sellerItem)
+				}
+				teamSellerList = sortDepartmentGroupSellers(teamSellerList)
+				teamItem.ChildrenList = teamSellerList
+				if len(teamSellerList) > 0 {
+					groupSellerList = append(groupSellerList, teamItem)
+				}
+			}
+			//分组为0的销售(直属分组)
+			groupTeamSellerList, err := system.GetGrooupsysUserList(group.GroupId, roleCodeTypeStr, enabled)
+			if err != nil {
+				br.Msg = "获取销售失败"
+				br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				return
+			}
+			if len(groupTeamSellerList) > 0 {
+				tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+				for _, seller := range groupTeamSellerList {
+					sellerItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint(seller.AdminId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     seller.RealName,
+						Authority:    seller.Authority,
+						RoleTypeCode: seller.RoleTypeCode,
+					}
+					tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+				}
+				//排个序
+				tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+				groupSellerList = append(groupSellerList, tmpDepartmentGroupSellersList...)
+			}
 
-	groupId := 0
-	if utils.RunMode == "release" {
-		groupId = 37
+			groupItem.ChildrenList = groupSellerList
+			if len(groupSellerList) > 0 {
+				resp = append(resp, groupItem)
+			}
+		}
+
+		//分组为0的销售(直属部门)
+		departmentSellerList, err := system.GetDepartmentGroupSysUserList(departmentId, 0, roleCodeTypeStr)
+		if err != nil {
+			br.Msg = "获取销售失败"
+			br.ErrMsg = "获取销售失败,Err:" + err.Error()
+			return
+		}
+		if len(departmentSellerList) > 0 {
+			tmpDepartmentGroupSeller := make([]company.DepartmentGroupSellers, 0)
+			for _, seller := range departmentSellerList {
+				sellerItem := company.DepartmentGroupSellers{
+					AdminId: fmt.Sprint(seller.AdminId),
+					//AdminName string `description:"系统用户名称"`
+					RealName:     seller.RealName,
+					Authority:    seller.Authority,
+					RoleTypeCode: seller.RoleTypeCode,
+				}
+				tmpDepartmentGroupSeller = append(tmpDepartmentGroupSeller, sellerItem)
+			}
+			tmpDepartmentGroupSeller = sortDepartmentGroupSellers(tmpDepartmentGroupSeller)
+			resp = append(resp, tmpDepartmentGroupSeller...)
+		}
 	} else {
-		groupId = 61
-	}
-	subAdmins, err := system.GetAdminByGroupId(groupId)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		br.Msg = "获取销售失败"
-		br.ErrMsg = "获取销售失败,Err:" + err.Error()
-		return
-	}
+		groupId := 0
+		if utils.RunMode == "release" {
+			groupId = 37
+		} else {
+			groupId = 61
+		}
+		subAdmins, err := system.GetAdminByGroupId(groupId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取销售失败"
+			br.ErrMsg = "获取销售失败,Err:" + err.Error()
+			return
+		}
 
-	resp := make([]company.DepartmentGroupSellers, 0)
-	for _, seller := range subAdmins {
-		sellerItem := company.DepartmentGroupSellers{
-			AdminId: fmt.Sprint(seller.AdminId),
-			//AdminName string `description:"系统用户名称"`
-			RealName:     seller.RealName,
-			Authority:    seller.Authority,
-			RoleTypeCode: seller.RoleTypeCode,
+		for _, seller := range subAdmins {
+			sellerItem := company.DepartmentGroupSellers{
+				AdminId: fmt.Sprint(seller.AdminId),
+				//AdminName string `description:"系统用户名称"`
+				RealName:     seller.RealName,
+				Authority:    seller.Authority,
+				RoleTypeCode: seller.RoleTypeCode,
+			}
+			resp = append(resp, sellerItem)
 		}
-		resp = append(resp, sellerItem)
 	}
 
 	br.Ret = 200
@@ -2523,12 +2634,12 @@ func (this *CompanySellerController) CheckListRai() {
 	}
 	roleCodeTypeStr := ``
 	productId := utils.COMPANY_PRODUCT_RAI_ID
-	roleCodeTypeStr = `"` + utils.ROLE_TYPE_CODE_RAI_SELLER + `","` + utils.ROLE_TYPE_CODE_RAI_GROUP + `"`
+	//roleCodeTypeStr = `"` + utils.ROLE_TYPE_CODE_RAI_SELLER + `","` + utils.ROLE_TYPE_CODE_RAI_GROUP + `"`
 
-	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN {
-		// 权益管理员,查看所有权益的账号
-		roleCodeTypeStr = `"` + utils.ROLE_TYPE_CODE_RAI_SELLER + `","` + utils.ROLE_TYPE_CODE_RAI_GROUP + `","` + utils.ROLE_TYPE_CODE_RAI_RESEARCHR + `","` + utils.ROLE_TYPE_CODE_RAI_ADMIN + `"`
-	}
+	//if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN {
+	// 权益管理员,查看所有权益的账号
+	roleCodeTypeStr = `"` + utils.ROLE_TYPE_CODE_RAI_SELLER + `","` + utils.ROLE_TYPE_CODE_RAI_GROUP + `","` + utils.ROLE_TYPE_CODE_RAI_RESEARCHR + `","` + utils.ROLE_TYPE_CODE_RAI_ADMIN + `"`
+	//}
 
 	getAllSeller, _ := this.GetBool("AllSeller", false)
 	status, _ := this.GetInt("Status", 0)
@@ -3344,3 +3455,1716 @@ func (this *CompanySellerController) CheckListRai() {
 		List: list,
 	}
 }
+
+// ShareCheckList2
+// @Title 获取组长/组员下销售(根据部门、分组)
+// @Description 获取组长/组员下销售(根据部门、分组)接口
+// @Param   AllSeller   query   bool  true       "是否获取部门所有的销售信息"
+// @Param   Status   query   int  true       "客户状态 1:流失 0:非流失"
+// @Param   AllEnabled   query   bool  true       "是否获取包含禁用的用户"
+// @Success 200 {object} company.DepartmentGroupSellersResp
+// @router /seller/check/Sharelist2 [get]
+func (this *CompanySellerController) ShareCheckList2() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	roleCodeTypeStr := ``
+	productId := services.GetProductId(sysUser.RoleTypeCode)
+	switch productId {
+	case 1:
+		roleCodeTypeStr = `"` + utils.ROLE_TYPE_CODE_FICC_SELLER + `","` + utils.ROLE_TYPE_CODE_FICC_GROUP + `","` + utils.ROLE_TYPE_CODE_FICC_TEAM + `"`
+	case 2:
+		roleCodeTypeStr = `"` + utils.ROLE_TYPE_CODE_RAI_SELLER + `","` + utils.ROLE_TYPE_CODE_RAI_GROUP + `"`
+	}
+
+	// ficc管理员,不要只查销售
+	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN {
+		roleCodeTypeStr = ``
+	} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN {
+		// 权益管理员,查看所有权益的账号
+		roleCodeTypeStr = `"` + utils.ROLE_TYPE_CODE_RAI_SELLER + `","` + utils.ROLE_TYPE_CODE_RAI_GROUP + `","` + utils.ROLE_TYPE_CODE_RAI_RESEARCHR + `","` + utils.ROLE_TYPE_CODE_RAI_ADMIN + `"`
+	}
+
+	status, _ := this.GetInt("Status", 0)
+	getAllEnabled, _ := this.GetBool("AllEnabled", false)
+	enabled := 1       //默认只获取正常状态的用户
+	if getAllEnabled { //获取所有状态的用户
+		enabled = -1
+	}
+	resp := make([]company.DepartmentGroupSellers, 0)
+
+	list := make([]company.DepartmentGroupSellers, 0)
+	if productId != 2 {
+		//超管看部门、小组、销售
+		if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
+			departmentList, err := system.GetDepartmentList()
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取部门失败,Err:" + err.Error()
+				return
+			}
+			for _, department := range departmentList {
+				departmentGroupSellerList := make([]company.DepartmentGroupSellers, 0)
+				item := company.DepartmentGroupSellers{
+					AdminId: fmt.Sprint("department_", department.DepartmentId),
+					//AdminName string `description:"系统用户名称"`
+					RealName:     department.DepartmentName,
+					ChildrenList: departmentGroupSellerList,
+				}
+
+				groupList, err := system.GetSysGroupByDepartmentId(department.DepartmentId)
+				if err != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取分组失败,Err:" + err.Error()
+					return
+				}
+				for _, group := range groupList {
+					groupSellerList := make([]company.DepartmentGroupSellers, 0)
+					groupItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint("group_", group.DepartmentId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     group.GroupName,
+						ChildrenList: groupSellerList,
+					}
+					teamList, err := system.GetSysTeamByDepartmentId(group.GroupId)
+					if err != nil {
+						br.Msg = "获取小组失败"
+						br.ErrMsg = "获取小组失败,Err:" + err.Error()
+						return
+					}
+					for _, team := range teamList {
+						teamSellerList := make([]company.DepartmentGroupSellers, 0)
+						teamItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint("team_", team.GroupId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     team.GroupName,
+							ChildrenList: teamSellerList,
+						}
+						sellerList, err := system.GetTeamSysUserList(team.GroupId, enabled)
+						if err != nil {
+							br.Msg = "获取销售失败"
+							br.ErrMsg = "获取销售失败,Err:" + err.Error()
+							return
+						}
+						for _, seller := range sellerList {
+							sellerItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint(seller.AdminId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     seller.RealName,
+								Authority:    seller.Authority,
+								RoleTypeCode: seller.RoleTypeCode,
+							}
+							//fmt.Println("seller.RealName:", seller.RealName)
+							teamSellerList = append(teamSellerList, sellerItem)
+						}
+						teamSellerList = sortDepartmentGroupSellers(teamSellerList)
+						teamItem.ChildrenList = teamSellerList
+						if len(teamSellerList) > 0 {
+							groupSellerList = append(groupSellerList, teamItem)
+						}
+					}
+					//分组为0的销售(直属分组)
+					groupTeamSellerList, err := system.GetGrooupsysUserList(group.GroupId, roleCodeTypeStr, enabled)
+					if err != nil {
+						br.Msg = "获取销售失败"
+						br.ErrMsg = "获取销售失败,Err:" + err.Error()
+						return
+					}
+					if len(groupTeamSellerList) > 0 {
+						tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+						for _, seller := range groupTeamSellerList {
+							sellerItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint(seller.AdminId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     seller.RealName,
+								Authority:    seller.Authority,
+								RoleTypeCode: seller.RoleTypeCode,
+							}
+							tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+						}
+						//排个序
+						tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+						groupSellerList = append(groupSellerList, tmpDepartmentGroupSellersList...)
+					}
+
+					//groupItem.ChildrenList = groupSellerList
+					//if len(groupSellerList) > 0 {
+					//	list = append(list, item)
+					//}
+
+					//sellerList, err := system.GetGroupSysUserList(group.DepartmentId)
+					//if err != nil {
+					//	br.Msg = "获取销售失败"
+					//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					//	return
+					//}
+					//for _, seller := range sellerList {
+					//	sellerItem := company.DepartmentGroupSellers{
+					//		AdminId: fmt.Sprint(seller.AdminId),
+					//		//AdminName string `description:"系统用户名称"`
+					//		RealName:     seller.RealName,
+					//		Authority:    seller.Authority,
+					//		RoleTypeCode: seller.RoleTypeCode,
+					//	}
+					//	groupSellerList = append(groupSellerList, sellerItem)
+					//}
+					//groupSellerList = sortDepartmentGroupSellers(groupSellerList)
+					groupItem.ChildrenList = groupSellerList
+					if len(groupSellerList) > 0 {
+						departmentGroupSellerList = append(departmentGroupSellerList, groupItem)
+					}
+				}
+
+				//分组为0的销售(直属部门)
+				departmentSellerList, err := system.GetDepartmentGroupSysUserList(department.DepartmentId, 0, roleCodeTypeStr)
+				if err != nil {
+					br.Msg = "获取销售失败"
+					br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					return
+				}
+				if len(departmentSellerList) > 0 {
+					tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+					for _, seller := range departmentSellerList {
+						sellerItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint(seller.AdminId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     seller.RealName,
+							Authority:    seller.Authority,
+							RoleTypeCode: seller.RoleTypeCode,
+						}
+						tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+					}
+					//排个序
+					tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+					departmentGroupSellerList = append(departmentGroupSellerList, tmpDepartmentGroupSellersList...)
+				}
+
+				item.ChildrenList = departmentGroupSellerList
+				if len(departmentGroupSellerList) > 0 {
+					list = append(list, item)
+				}
+			}
+		} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_TEAM || sysUser.Authority == 4 {
+			//销售组长看销售
+			if status == 0 {
+				directorId := sysUser.GroupId
+				fmt.Println("directorId:", directorId)
+				groupList, err := system.GetSysGroupByDirectorId(directorId)
+				if err != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取分组失败,Err:" + err.Error()
+					return
+				}
+				for _, group := range groupList {
+					groupSellerList := make([]company.DepartmentGroupSellers, 0)
+					groupItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint("group_", group.DepartmentId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     group.GroupName,
+						ChildrenList: groupSellerList,
+					}
+					teamList, err := system.GetSysTeamByDepartmentId(group.GroupId)
+					if err != nil {
+						br.Msg = "获取小组失败"
+						br.ErrMsg = "获取小组失败,Err:" + err.Error()
+						return
+					}
+					for _, team := range teamList {
+						teamSellerList := make([]company.DepartmentGroupSellers, 0)
+						teamItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint("team_", team.GroupId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     team.GroupName,
+							ChildrenList: teamSellerList,
+						}
+						sellerList, err := system.GetTeamSysUserList(team.GroupId, enabled)
+						if err != nil {
+							br.Msg = "获取销售失败"
+							br.ErrMsg = "获取销售失败,Err:" + err.Error()
+							return
+						}
+						for _, seller := range sellerList {
+							sellerItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint(seller.AdminId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     seller.RealName,
+								Authority:    seller.Authority,
+								RoleTypeCode: seller.RoleTypeCode,
+							}
+							//fmt.Println("seller.RealName:", seller.RealName)
+							teamSellerList = append(teamSellerList, sellerItem)
+						}
+						teamSellerList = sortDepartmentGroupSellers(teamSellerList)
+						teamItem.ChildrenList = teamSellerList
+						if len(teamSellerList) > 0 {
+							groupSellerList = append(groupSellerList, teamItem)
+						}
+					}
+					//分组为0的销售(直属分组)
+					groupTeamSellerList, err := system.GetGrooupsysUserList(group.GroupId, roleCodeTypeStr, enabled)
+					if err != nil {
+						br.Msg = "获取销售失败"
+						br.ErrMsg = "获取销售失败,Err:" + err.Error()
+						return
+					}
+					if len(groupTeamSellerList) > 0 {
+						tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+						for _, seller := range groupTeamSellerList {
+							sellerItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint(seller.AdminId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     seller.RealName,
+								Authority:    seller.Authority,
+								RoleTypeCode: seller.RoleTypeCode,
+							}
+							tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+						}
+						//排个序
+						tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+						groupSellerList = append(groupSellerList, tmpDepartmentGroupSellersList...)
+					}
+
+					groupItem.ChildrenList = groupSellerList
+					if len(groupSellerList) > 0 {
+						list = append(list, groupItem)
+					}
+				}
+			} else {
+				departmentStr := `1,2`
+				departmentList, err := system.GetDepartmentListByIds(departmentStr)
+				if err != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取部门失败,Err:" + err.Error()
+					return
+				}
+				for _, department := range departmentList {
+					departmentGroupSellerList := make([]company.DepartmentGroupSellers, 0)
+					item := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint("department_", department.DepartmentId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     department.DepartmentName,
+						ChildrenList: departmentGroupSellerList,
+					}
+
+					groupList, err := system.GetSysGroupByDepartmentId(department.DepartmentId)
+					if err != nil {
+						br.Msg = "获取失败"
+						br.ErrMsg = "获取分组失败,Err:" + err.Error()
+						return
+					}
+					for _, group := range groupList {
+						groupSellerList := make([]company.DepartmentGroupSellers, 0)
+						groupItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint("group_", group.DepartmentId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     group.GroupName,
+							ChildrenList: groupSellerList,
+						}
+						teamList, err := system.GetSysTeamByDepartmentId(group.GroupId)
+						if err != nil {
+							br.Msg = "获取小组失败"
+							br.ErrMsg = "获取小组失败,Err:" + err.Error()
+							return
+						}
+						for _, team := range teamList {
+							teamSellerList := make([]company.DepartmentGroupSellers, 0)
+							teamItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint("team_", team.GroupId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     team.GroupName,
+								ChildrenList: teamSellerList,
+							}
+							sellerList, err := system.GetTeamSysUserList(team.GroupId, enabled)
+							if err != nil {
+								br.Msg = "获取销售失败"
+								br.ErrMsg = "获取销售失败,Err:" + err.Error()
+								return
+							}
+							for _, seller := range sellerList {
+								sellerItem := company.DepartmentGroupSellers{
+									AdminId: fmt.Sprint(seller.AdminId),
+									//AdminName string `description:"系统用户名称"`
+									RealName:     seller.RealName,
+									Authority:    seller.Authority,
+									RoleTypeCode: seller.RoleTypeCode,
+								}
+								//fmt.Println("seller.RealName:", seller.RealName)
+								teamSellerList = append(teamSellerList, sellerItem)
+							}
+							teamSellerList = sortDepartmentGroupSellers(teamSellerList)
+							teamItem.ChildrenList = teamSellerList
+							if len(teamSellerList) > 0 {
+								groupSellerList = append(groupSellerList, teamItem)
+							}
+						}
+						//分组为0的人,不光是销售(直属分组)
+						groupTeamSellerList, err := system.GetGroupSysUserList(group.GroupId)
+						if err != nil {
+							br.Msg = "获取销售失败"
+							br.ErrMsg = "获取销售失败,Err:" + err.Error()
+							return
+						}
+						if len(groupTeamSellerList) > 0 {
+							tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+							for _, seller := range groupTeamSellerList {
+								sellerItem := company.DepartmentGroupSellers{
+									AdminId: fmt.Sprint(seller.AdminId),
+									//AdminName string `description:"系统用户名称"`
+									RealName:     seller.RealName,
+									Authority:    seller.Authority,
+									RoleTypeCode: seller.RoleTypeCode,
+								}
+								tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+							}
+							//排个序
+							tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+							groupSellerList = append(groupSellerList, tmpDepartmentGroupSellersList...)
+						}
+
+						//groupItem.ChildrenList = groupSellerList
+						//if len(groupSellerList) > 0 {
+						//	list = append(list, item)
+						//}
+
+						//sellerList, err := system.GetGroupSysUserList(group.DepartmentId)
+						//if err != nil {
+						//	br.Msg = "获取销售失败"
+						//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+						//	return
+						//}
+						//for _, seller := range sellerList {
+						//	sellerItem := company.DepartmentGroupSellers{
+						//		AdminId: fmt.Sprint(seller.AdminId),
+						//		//AdminName string `description:"系统用户名称"`
+						//		RealName:     seller.RealName,
+						//		Authority:    seller.Authority,
+						//		RoleTypeCode: seller.RoleTypeCode,
+						//	}
+						//	groupSellerList = append(groupSellerList, sellerItem)
+						//}
+						//groupSellerList = sortDepartmentGroupSellers(groupSellerList)
+						groupItem.ChildrenList = groupSellerList
+						if len(groupSellerList) > 0 {
+							departmentGroupSellerList = append(departmentGroupSellerList, groupItem)
+						}
+					}
+
+					//分组为0的人,不光是销售(直属部门)
+					departmentSellerList, err := system.GetDepartmentGroupSysUserList(department.DepartmentId, 0, "")
+					if err != nil {
+						br.Msg = "获取销售失败"
+						br.ErrMsg = "获取销售失败,Err:" + err.Error()
+						return
+					}
+					if len(departmentSellerList) > 0 {
+						tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+						for _, seller := range departmentSellerList {
+							sellerItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint(seller.AdminId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     seller.RealName,
+								Authority:    seller.Authority,
+								RoleTypeCode: seller.RoleTypeCode,
+							}
+							tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+						}
+						//排个序
+						tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+						departmentGroupSellerList = append(departmentGroupSellerList, tmpDepartmentGroupSellersList...)
+					}
+
+					item.ChildrenList = departmentGroupSellerList
+					if len(departmentGroupSellerList) > 0 {
+						list = append(list, item)
+					}
+				}
+			}
+		} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_COMPLIANCE || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FINANCE || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN { //合规或财务或ficc管理员
+			departmentStr := `2,5,7` //合规
+			switch sysUser.RoleTypeCode {
+			case utils.ROLE_TYPE_CODE_FINANCE: //财务
+				departmentStr = `2,5,8`
+			case utils.ROLE_TYPE_CODE_FICC_ADMIN: //ficc管理员
+				departmentStr = utils.GetFiccAdminDepartmentIds()
+			}
+			departmentList, err := system.GetDepartmentListByIds(departmentStr)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取部门失败,Err:" + err.Error()
+				return
+			}
+			for _, department := range departmentList {
+				fmt.Println(department)
+				departmentGroupSellerList := make([]company.DepartmentGroupSellers, 0)
+				item := company.DepartmentGroupSellers{
+					AdminId: fmt.Sprint("department_", department.DepartmentId),
+					//AdminName string `description:"系统用户名称"`
+					RealName:     department.DepartmentName,
+					ChildrenList: departmentGroupSellerList,
+				}
+
+				groupList, err := system.GetSysGroupByDepartmentId(department.DepartmentId)
+				if err != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取分组失败,Err:" + err.Error()
+					return
+				}
+				for _, group := range groupList {
+					groupSellerList := make([]company.DepartmentGroupSellers, 0)
+					groupItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint("group_", group.DepartmentId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     group.GroupName,
+						ChildrenList: groupSellerList,
+					}
+					teamList, err := system.GetSysTeamByDepartmentId(group.GroupId)
+					if err != nil {
+						br.Msg = "获取小组失败"
+						br.ErrMsg = "获取小组失败,Err:" + err.Error()
+						return
+					}
+					for _, team := range teamList {
+						teamSellerList := make([]company.DepartmentGroupSellers, 0)
+						teamItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint("team_", team.GroupId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     team.GroupName,
+							ChildrenList: teamSellerList,
+						}
+						sellerList, err := system.GetTeamSysUserList(team.GroupId, enabled)
+						if err != nil {
+							br.Msg = "获取销售失败"
+							br.ErrMsg = "获取销售失败,Err:" + err.Error()
+							return
+						}
+						for _, seller := range sellerList {
+							sellerItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint(seller.AdminId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     seller.RealName,
+								Authority:    seller.Authority,
+								RoleTypeCode: seller.RoleTypeCode,
+							}
+							//fmt.Println("seller.RealName:", seller.RealName)
+							teamSellerList = append(teamSellerList, sellerItem)
+						}
+						teamSellerList = sortDepartmentGroupSellers(teamSellerList)
+						teamItem.ChildrenList = teamSellerList
+						if len(teamSellerList) > 0 {
+							groupSellerList = append(groupSellerList, teamItem)
+						}
+					}
+					//分组为0的销售(直属分组)
+					groupTeamSellerList, err := system.GetGrooupsysUserList(group.GroupId, roleCodeTypeStr, enabled)
+					if err != nil {
+						br.Msg = "获取销售失败"
+						br.ErrMsg = "获取销售失败,Err:" + err.Error()
+						return
+					}
+					if len(groupTeamSellerList) > 0 {
+						tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+						for _, seller := range groupTeamSellerList {
+							sellerItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint(seller.AdminId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     seller.RealName,
+								Authority:    seller.Authority,
+								RoleTypeCode: seller.RoleTypeCode,
+							}
+							tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+						}
+						//排个序
+						tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+						groupSellerList = append(groupSellerList, tmpDepartmentGroupSellersList...)
+					}
+
+					//groupItem.ChildrenList = groupSellerList
+					//if len(groupSellerList) > 0 {
+					//	list = append(list, item)
+					//}
+
+					//sellerList, err := system.GetGroupSysUserList(group.DepartmentId)
+					//if err != nil {
+					//	br.Msg = "获取销售失败"
+					//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					//	return
+					//}
+					//for _, seller := range sellerList {
+					//	sellerItem := company.DepartmentGroupSellers{
+					//		AdminId: fmt.Sprint(seller.AdminId),
+					//		//AdminName string `description:"系统用户名称"`
+					//		RealName:     seller.RealName,
+					//		Authority:    seller.Authority,
+					//		RoleTypeCode: seller.RoleTypeCode,
+					//	}
+					//	groupSellerList = append(groupSellerList, sellerItem)
+					//}
+					//groupSellerList = sortDepartmentGroupSellers(groupSellerList)
+					groupItem.ChildrenList = groupSellerList
+					if len(groupSellerList) > 0 {
+						departmentGroupSellerList = append(departmentGroupSellerList, groupItem)
+					}
+				}
+
+				//分组为0的销售(直属部门)
+				departmentSellerList, err := system.GetDepartmentGroupSysUserList(department.DepartmentId, 0, roleCodeTypeStr)
+				if err != nil {
+					br.Msg = "获取销售失败"
+					br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					return
+				}
+				if len(departmentSellerList) > 0 {
+					tmpDepartmentGroupSellerList := make([]company.DepartmentGroupSellers, 0)
+					for _, seller := range departmentSellerList {
+						sellerItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint(seller.AdminId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     seller.RealName,
+							Authority:    seller.Authority,
+							RoleTypeCode: seller.RoleTypeCode,
+						}
+						tmpDepartmentGroupSellerList = append(tmpDepartmentGroupSellerList, sellerItem)
+					}
+					//排个序
+					tmpDepartmentGroupSellerList = sortDepartmentGroupSellers(tmpDepartmentGroupSellerList)
+					departmentGroupSellerList = append(departmentGroupSellerList, tmpDepartmentGroupSellerList...)
+				}
+
+				item.ChildrenList = departmentGroupSellerList
+				if len(departmentGroupSellerList) > 0 {
+					list = append(list, item)
+				}
+			}
+		} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN || sysUser.Authority == 1 {
+			//部门管理员看小组、销售
+			departmentId := sysUser.DepartmentId
+			switch sysUser.RoleTypeCode {
+			case utils.ROLE_TYPE_CODE_RAI_ADMIN: //权益管理员
+				departmentId = 5
+			case utils.ROLE_TYPE_CODE_FICC_ADMIN: //ficc管理员
+				departmentId = 2
+			}
+			groupList, err := system.GetSysGroupByDepartmentId(departmentId)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取分组失败,Err:" + err.Error()
+				return
+			}
+			for _, group := range groupList {
+				groupSellerList := make([]company.DepartmentGroupSellers, 0)
+				groupItem := company.DepartmentGroupSellers{
+					AdminId: fmt.Sprint("group_", group.DepartmentId),
+					//AdminName string `description:"系统用户名称"`
+					RealName:     group.GroupName,
+					ChildrenList: groupSellerList,
+				}
+				teamList, err := system.GetSysTeamByDepartmentId(group.GroupId)
+				if err != nil {
+					br.Msg = "获取小组失败"
+					br.ErrMsg = "获取小组失败,Err:" + err.Error()
+					return
+				}
+				for _, team := range teamList {
+					teamSellerList := make([]company.DepartmentGroupSellers, 0)
+					teamItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint("team_", team.GroupId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     team.GroupName,
+						ChildrenList: teamSellerList,
+					}
+					sellerList, err := system.GetTeamSysUserList(team.GroupId, enabled)
+					if err != nil {
+						br.Msg = "获取销售失败"
+						br.ErrMsg = "获取销售失败,Err:" + err.Error()
+						return
+					}
+					for _, seller := range sellerList {
+						sellerItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint(seller.AdminId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     seller.RealName,
+							Authority:    seller.Authority,
+							RoleTypeCode: seller.RoleTypeCode,
+						}
+						//fmt.Println("seller.RealName:", seller.RealName)
+						teamSellerList = append(teamSellerList, sellerItem)
+					}
+					teamSellerList = sortDepartmentGroupSellers(teamSellerList)
+					teamItem.ChildrenList = teamSellerList
+					if len(teamSellerList) > 0 {
+						groupSellerList = append(groupSellerList, teamItem)
+					}
+				}
+				//分组为0的销售(直属分组)
+				groupTeamSellerList, err := system.GetGrooupsysUserList(group.GroupId, roleCodeTypeStr, enabled)
+				if err != nil {
+					br.Msg = "获取销售失败"
+					br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					return
+				}
+				if len(groupTeamSellerList) > 0 {
+					tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+					for _, seller := range groupTeamSellerList {
+						sellerItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint(seller.AdminId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     seller.RealName,
+							Authority:    seller.Authority,
+							RoleTypeCode: seller.RoleTypeCode,
+						}
+						tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+					}
+					//排个序
+					tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+					groupSellerList = append(groupSellerList, tmpDepartmentGroupSellersList...)
+				}
+
+				//groupItem.ChildrenList = groupSellerList
+				//if len(groupSellerList) > 0 {
+				//	list = append(list, item)
+				//}
+
+				//sellerList, err := system.GetGroupSysUserList(group.DepartmentId)
+				//if err != nil {
+				//	br.Msg = "获取销售失败"
+				//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				//	return
+				//}
+				//for _, seller := range sellerList {
+				//	sellerItem := company.DepartmentGroupSellers{
+				//		AdminId: fmt.Sprint(seller.AdminId),
+				//		//AdminName string `description:"系统用户名称"`
+				//		RealName:     seller.RealName,
+				//		Authority:    seller.Authority,
+				//		RoleTypeCode: seller.RoleTypeCode,
+				//	}
+				//	groupSellerList = append(groupSellerList, sellerItem)
+				//}
+				//groupSellerList = sortDepartmentGroupSellers(groupSellerList)
+				groupItem.ChildrenList = groupSellerList
+				if len(groupSellerList) > 0 {
+					list = append(list, groupItem)
+				}
+			}
+
+			//分组为0的销售(直属部门)
+			departmentSellerList, err := system.GetDepartmentGroupSysUserList(departmentId, 0, roleCodeTypeStr)
+			if err != nil {
+				br.Msg = "获取销售失败"
+				br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				return
+			}
+			if len(departmentSellerList) > 0 {
+				tmpDepartmentGroupSeller := make([]company.DepartmentGroupSellers, 0)
+				for _, seller := range departmentSellerList {
+					sellerItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint(seller.AdminId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     seller.RealName,
+						Authority:    seller.Authority,
+						RoleTypeCode: seller.RoleTypeCode,
+					}
+					tmpDepartmentGroupSeller = append(tmpDepartmentGroupSeller, sellerItem)
+				}
+				tmpDepartmentGroupSeller = sortDepartmentGroupSellers(tmpDepartmentGroupSeller)
+				list = append(list, tmpDepartmentGroupSeller...)
+			}
+		} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP || (sysUser.Authority == 2 && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_FICC_GROUP) {
+			// 权益组长看小组
+			if status == 0 {
+				sellerList, err := system.GetTeamSysUserList(sysUser.GroupId, enabled)
+				if err != nil {
+					br.Msg = "获取销售失败"
+					br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					return
+				}
+				for _, seller := range sellerList {
+					sellerItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint(seller.AdminId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     seller.RealName,
+						Authority:    seller.Authority,
+						RoleTypeCode: seller.RoleTypeCode,
+					}
+					//fmt.Println("seller.RealName:", seller.RealName)
+					list = append(list, sellerItem)
+				}
+				list = sortDepartmentGroupSellers(list)
+
+				//正常来说没有所有人都应该在某个小组下,要不就是小组名为 无 的小组
+				//分组为0的销售(直属分组)
+				//groupTeamSellerList, err := system.GetGrooupsysUserList(sysUser.GroupId, 0, roleCodeTypeStr)
+				//if err != nil {
+				//	br.Msg = "获取销售失败"
+				//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				//	return
+				//}
+				//if len(groupTeamSellerList) > 0 {
+				//	tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+				//	for _, seller := range groupTeamSellerList {
+				//		sellerItem := company.DepartmentGroupSellers{
+				//			AdminId: fmt.Sprint(seller.AdminId),
+				//			//AdminName string `description:"系统用户名称"`
+				//			RealName:     seller.RealName,
+				//			Authority:    seller.Authority,
+				//			RoleTypeCode: seller.RoleTypeCode,
+				//		}
+				//		tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+				//	}
+				//	//排个序
+				//	tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+				//	list = append(list, tmpDepartmentGroupSellersList...)
+				//}
+				//sellerList, err := system.GetDepartmentGroupSysUserList(sysUser.DepartmentId, sysUser.GroupId, roleCodeTypeStr)
+				//if err != nil {
+				//	br.Msg = "获取销售失败"
+				//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				//	return
+				//}
+				//for _, seller := range sellerList {
+				//	sellerItem := company.DepartmentGroupSellers{
+				//		AdminId: fmt.Sprint(seller.AdminId),
+				//		//AdminName string `description:"系统用户名称"`
+				//		RealName:     seller.RealName,
+				//		Authority:    seller.Authority,
+				//		RoleTypeCode: seller.RoleTypeCode,
+				//	}
+				//	list = append(list, sellerItem)
+				//	list = sortDepartmentGroupSellers(list)
+				//}
+			} else {
+				departmentId := 5
+				groupList, err := system.GetSysGroupByDepartmentId(departmentId)
+				if err != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取分组失败,Err:" + err.Error()
+					return
+				}
+				for _, group := range groupList {
+					groupSellerList := make([]company.DepartmentGroupSellers, 0)
+					groupItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint("group_", group.DepartmentId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     group.GroupName,
+						ChildrenList: groupSellerList,
+					}
+					teamList, err := system.GetSysTeamByDepartmentId(group.GroupId)
+					if err != nil {
+						br.Msg = "获取小组失败"
+						br.ErrMsg = "获取小组失败,Err:" + err.Error()
+						return
+					}
+					for _, team := range teamList {
+						teamSellerList := make([]company.DepartmentGroupSellers, 0)
+						teamItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint("team_", team.GroupId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     team.GroupName,
+							ChildrenList: teamSellerList,
+						}
+						sellerList, err := system.GetTeamSysUserList(team.GroupId, enabled)
+						if err != nil {
+							br.Msg = "获取销售失败"
+							br.ErrMsg = "获取销售失败,Err:" + err.Error()
+							return
+						}
+						for _, seller := range sellerList {
+							sellerItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint(seller.AdminId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     seller.RealName,
+								Authority:    seller.Authority,
+								RoleTypeCode: seller.RoleTypeCode,
+							}
+							//fmt.Println("seller.RealName:", seller.RealName)
+							teamSellerList = append(teamSellerList, sellerItem)
+						}
+						teamSellerList = sortDepartmentGroupSellers(teamSellerList)
+						teamItem.ChildrenList = teamSellerList
+						if len(teamSellerList) > 0 {
+							groupSellerList = append(groupSellerList, teamItem)
+						}
+					}
+					//分组为0的销售(直属分组)
+					groupTeamSellerList, err := system.GetGrooupsysUserList(group.GroupId, roleCodeTypeStr, enabled)
+					if err != nil {
+						br.Msg = "获取销售失败"
+						br.ErrMsg = "获取销售失败,Err:" + err.Error()
+						return
+					}
+					if len(groupTeamSellerList) > 0 {
+						tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+						for _, seller := range groupTeamSellerList {
+							sellerItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint(seller.AdminId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     seller.RealName,
+								Authority:    seller.Authority,
+								RoleTypeCode: seller.RoleTypeCode,
+							}
+							tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+						}
+						//排个序
+						tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+						groupSellerList = append(groupSellerList, tmpDepartmentGroupSellersList...)
+					}
+
+					//groupItem.ChildrenList = groupSellerList
+					//if len(groupSellerList) > 0 {
+					//	list = append(list, item)
+					//}
+
+					//sellerList, err := system.GetGroupSysUserList(group.DepartmentId)
+					//if err != nil {
+					//	br.Msg = "获取销售失败"
+					//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					//	return
+					//}
+					//for _, seller := range sellerList {
+					//	sellerItem := company.DepartmentGroupSellers{
+					//		AdminId: fmt.Sprint(seller.AdminId),
+					//		//AdminName string `description:"系统用户名称"`
+					//		RealName:     seller.RealName,
+					//		Authority:    seller.Authority,
+					//		RoleTypeCode: seller.RoleTypeCode,
+					//	}
+					//	groupSellerList = append(groupSellerList, sellerItem)
+					//}
+					//groupSellerList = sortDepartmentGroupSellers(groupSellerList)
+					groupItem.ChildrenList = groupSellerList
+					if len(groupSellerList) > 0 {
+						list = append(list, groupItem)
+					}
+				}
+
+				//分组为0的销售(直属部门)
+				departmentSellerList, err := system.GetDepartmentGroupSysUserList(departmentId, 0, roleCodeTypeStr)
+				if err != nil {
+					br.Msg = "获取销售失败"
+					br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					return
+				}
+				if len(departmentSellerList) > 0 {
+					tmpDepartmentGroupSeller := make([]company.DepartmentGroupSellers, 0)
+					for _, seller := range departmentSellerList {
+						sellerItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint(seller.AdminId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     seller.RealName,
+							Authority:    seller.Authority,
+							RoleTypeCode: seller.RoleTypeCode,
+						}
+						tmpDepartmentGroupSeller = append(tmpDepartmentGroupSeller, sellerItem)
+					}
+					tmpDepartmentGroupSeller = sortDepartmentGroupSellers(tmpDepartmentGroupSeller)
+					list = append(list, tmpDepartmentGroupSeller...)
+				}
+			}
+
+		} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_GROUP || sysUser.Authority == 2 {
+			// 销售主管看小组
+			if status == 0 {
+				pid, err := company.GetParentIdFromGroup(sysUser.GroupId)
+				if err != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "查询父级id异常" + err.Error()
+					return
+				}
+				var realGroupId int
+				if pid != nil && *pid > 0 {
+					//主管角色放在了三级分组下
+					realGroupId = *pid
+				} else {
+					//主管角色放在了二级分组下
+					realGroupId = sysUser.GroupId
+				}
+				groupList, err := system.GetSysGroupByGroupId(realGroupId)
+				if err != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取分组失败,Err:" + err.Error()
+					return
+				}
+				for _, group := range groupList {
+					groupSellerList := make([]company.DepartmentGroupSellers, 0)
+					//groupItem := company.DepartmentGroupSellers{
+					//	AdminId: fmt.Sprint("group_", group.DepartmentId),
+					//	//AdminName string `description:"系统用户名称"`
+					//	RealName:     group.GroupName,
+					//	ChildrenList: groupSellerList,
+					//}
+					teamList, err := system.GetSysTeamByDepartmentId(group.GroupId)
+					if err != nil {
+						br.Msg = "获取小组失败"
+						br.ErrMsg = "获取小组失败,Err:" + err.Error()
+						return
+					}
+					for _, team := range teamList {
+						teamSellerList := make([]company.DepartmentGroupSellers, 0)
+						teamItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint("team_", team.GroupId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     team.GroupName,
+							ChildrenList: teamSellerList,
+						}
+						sellerList, err := system.GetTeamSysUserList(team.GroupId, enabled)
+						if err != nil {
+							br.Msg = "获取销售失败"
+							br.ErrMsg = "获取销售失败,Err:" + err.Error()
+							return
+						}
+						for _, seller := range sellerList {
+							sellerItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint(seller.AdminId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     seller.RealName,
+								Authority:    seller.Authority,
+								RoleTypeCode: seller.RoleTypeCode,
+							}
+							//fmt.Println("seller.RealName:", seller.RealName)
+							teamSellerList = append(teamSellerList, sellerItem)
+						}
+						teamSellerList = sortDepartmentGroupSellers(teamSellerList)
+						teamItem.ChildrenList = teamSellerList
+						if len(teamSellerList) > 0 {
+							groupSellerList = append(groupSellerList, teamItem)
+						}
+					}
+					//分组为0的销售(直属分组)
+					groupTeamSellerList, err := system.GetGrooupsysUserList(realGroupId, roleCodeTypeStr, enabled)
+					if err != nil {
+						br.Msg = "获取销售失败"
+						br.ErrMsg = "获取销售失败,Err:" + err.Error()
+						return
+					}
+					if len(groupTeamSellerList) > 0 {
+						tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+						for _, seller := range groupTeamSellerList {
+							sellerItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint(seller.AdminId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     seller.RealName,
+								Authority:    seller.Authority,
+								RoleTypeCode: seller.RoleTypeCode,
+							}
+							tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+						}
+						//排个序
+						tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+						groupSellerList = append(groupSellerList, tmpDepartmentGroupSellersList...)
+					}
+					list = groupSellerList
+					//groupItem.ChildrenList = groupSellerList
+					//if len(groupSellerList) > 0 {
+					//	list = append(list, item)
+					//}
+
+					//sellerList, err := system.GetGroupSysUserList(group.DepartmentId)
+					//if err != nil {
+					//	br.Msg = "获取销售失败"
+					//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					//	return
+					//}
+					//for _, seller := range sellerList {
+					//	sellerItem := company.DepartmentGroupSellers{
+					//		AdminId: fmt.Sprint(seller.AdminId),
+					//		//AdminName string `description:"系统用户名称"`
+					//		RealName:     seller.RealName,
+					//		Authority:    seller.Authority,
+					//		RoleTypeCode: seller.RoleTypeCode,
+					//	}
+					//	groupSellerList = append(groupSellerList, sellerItem)
+					//}
+					//groupSellerList = sortDepartmentGroupSellers(groupSellerList)
+
+					//groupItem.ChildrenList = groupSellerList
+					//if len(groupSellerList) > 0 {
+					//	list = append(list, groupItem)
+					//}
+
+				}
+
+				//分组为0的销售(直属二级分组)
+				//departmentSellerList, err := system.GetDepartmentGroupSysUserList(2, realGroupId, roleCodeTypeStr)
+				//if err != nil {
+				//	br.Msg = "获取销售失败"
+				//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				//	return
+				//}
+				//if len(departmentSellerList) > 0 {
+				//	tmpDepartmentGroupSeller := make([]company.DepartmentGroupSellers, 0)
+				//	for _, seller := range departmentSellerList {
+				//		sellerItem := company.DepartmentGroupSellers{
+				//			AdminId: fmt.Sprint(seller.AdminId),
+				//			//AdminName string `description:"系统用户名称"`
+				//			RealName:     seller.RealName,
+				//			Authority:    seller.Authority,
+				//			RoleTypeCode: seller.RoleTypeCode,
+				//		}
+				//		tmpDepartmentGroupSeller = append(tmpDepartmentGroupSeller, sellerItem)
+				//	}
+				//	tmpDepartmentGroupSeller = sortDepartmentGroupSellers(tmpDepartmentGroupSeller)
+				//	list = append(list, tmpDepartmentGroupSeller...)
+				//}
+				//pid, err := company.GetParentIdFromGroup(sysUser.GroupId)
+				//if err != nil {
+				//	br.Msg = "获取失败"
+				//	br.ErrMsg = "查询父级id异常" + err.Error()
+				//	return
+				//}
+				//if pid != nil && *pid > 0 {
+				//	//主管角色放在了三级分组下
+				//	//
+				//
+				//
+				//} else {
+				//	//主管角色放在了二级分组下
+				//
+				//}
+				//ids, err := company.GetGroupIdsByParentId(*pid)
+				//if err != nil {
+				//	br.Msg = "获取失败"
+				//	br.ErrMsg = "查询父级id异常" + err.Error()
+				//	return
+				//}
+				//var idSlice []string
+				//var sid string
+				//for _, id := range ids {
+				//	idSlice = append(idSlice, *id)
+				//}
+				//sid = strings.Join(idSlice, ",")
+				//sellerList, err := system.GetTeamSysUserListByIds(sid)
+				//if err != nil {
+				//	br.Msg = "获取销售失败"
+				//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				//	return
+				//}
+				//for _, seller := range sellerList {
+				//	sellerItem := company.DepartmentGroupSellers{
+				//		AdminId: fmt.Sprint(seller.AdminId),
+				//		//AdminName string `description:"系统用户名称"`
+				//		RealName:     seller.RealName,
+				//		Authority:    seller.Authority,
+				//		RoleTypeCode: seller.RoleTypeCode,
+				//	}
+				//	fmt.Println("seller.RealName:", seller.RealName)
+				//	list = append(list, sellerItem)
+				//}
+				//list = sortDepartmentGroupSellers(list)
+				//
+				////分组为0的销售(直属分组)
+				//groupTeamSellerList, err := system.GetGrooupsysUserList(sysUser.GroupId, roleCodeTypeStr)
+				//if err != nil {
+				//	br.Msg = "获取销售失败"
+				//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				//	return
+				//}
+				//if len(groupTeamSellerList) > 0 {
+				//	tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+				//	for _, seller := range groupTeamSellerList {
+				//		sellerItem := company.DepartmentGroupSellers{
+				//			AdminId: fmt.Sprint(seller.AdminId),
+				//			//AdminName string `description:"系统用户名称"`
+				//			RealName:     seller.RealName,
+				//			Authority:    seller.Authority,
+				//			RoleTypeCode: seller.RoleTypeCode,
+				//		}
+				//		tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+				//	}
+				//	//排个序
+				//	tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+				//	list = append(list, tmpDepartmentGroupSellersList...)
+				//}
+				//sellerList, err := system.GetDepartmentGroupSysUserList(sysUser.DepartmentId, sysUser.GroupId, roleCodeTypeStr)
+				//if err != nil {
+				//	br.Msg = "获取销售失败"
+				//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				//	return
+				//}
+				//for _, seller := range sellerList {
+				//	sellerItem := company.DepartmentGroupSellers{
+				//		AdminId: fmt.Sprint(seller.AdminId),
+				//		//AdminName string `description:"系统用户名称"`
+				//		RealName:     seller.RealName,
+				//		Authority:    seller.Authority,
+				//		RoleTypeCode: seller.RoleTypeCode,
+				//	}
+				//	list = append(list, sellerItem)
+				//	list = sortDepartmentGroupSellers(list)
+				//}
+
+				//正常来说没有所有人都应该在某个小组下,要不就是小组名为 无 的小组
+			} else {
+				//var departmentStr string
+				//if utils.RunMode == "release" {
+				//	departmentStr = `1,2`
+				//} else {
+				//	departmentStr = `1,2`
+				//}
+				departmentStr := `1,2`
+				departmentList, err := system.GetDepartmentListByIds(departmentStr)
+				if err != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取部门失败,Err:" + err.Error()
+					return
+				}
+				for _, department := range departmentList {
+					departmentGroupSellerList := make([]company.DepartmentGroupSellers, 0)
+					item := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint("department_", department.DepartmentId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     department.DepartmentName,
+						ChildrenList: departmentGroupSellerList,
+					}
+
+					groupList, err := system.GetSysGroupByDepartmentId(department.DepartmentId)
+					if err != nil {
+						br.Msg = "获取失败"
+						br.ErrMsg = "获取分组失败,Err:" + err.Error()
+						return
+					}
+					for _, group := range groupList {
+						groupSellerList := make([]company.DepartmentGroupSellers, 0)
+						groupItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint("group_", group.DepartmentId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     group.GroupName,
+							ChildrenList: groupSellerList,
+						}
+						teamList, err := system.GetSysTeamByDepartmentId(group.GroupId)
+						if err != nil {
+							br.Msg = "获取小组失败"
+							br.ErrMsg = "获取小组失败,Err:" + err.Error()
+							return
+						}
+						for _, team := range teamList {
+							teamSellerList := make([]company.DepartmentGroupSellers, 0)
+							teamItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint("team_", team.GroupId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     team.GroupName,
+								ChildrenList: teamSellerList,
+							}
+							sellerList, err := system.GetTeamSysUserList(team.GroupId, enabled)
+							if err != nil {
+								br.Msg = "获取销售失败"
+								br.ErrMsg = "获取销售失败,Err:" + err.Error()
+								return
+							}
+							for _, seller := range sellerList {
+								sellerItem := company.DepartmentGroupSellers{
+									AdminId: fmt.Sprint(seller.AdminId),
+									//AdminName string `description:"系统用户名称"`
+									RealName:     seller.RealName,
+									Authority:    seller.Authority,
+									RoleTypeCode: seller.RoleTypeCode,
+								}
+								//fmt.Println("seller.RealName:", seller.RealName)
+								teamSellerList = append(teamSellerList, sellerItem)
+							}
+							teamSellerList = sortDepartmentGroupSellers(teamSellerList)
+							teamItem.ChildrenList = teamSellerList
+							if len(teamSellerList) > 0 {
+								groupSellerList = append(groupSellerList, teamItem)
+							}
+						}
+						//分组为0的人,不光是销售(直属分组)
+						groupTeamSellerList, err := system.GetGroupSysUserList(group.GroupId)
+						if err != nil {
+							br.Msg = "获取销售失败"
+							br.ErrMsg = "获取销售失败,Err:" + err.Error()
+							return
+						}
+						if len(groupTeamSellerList) > 0 {
+							tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+							for _, seller := range groupTeamSellerList {
+								sellerItem := company.DepartmentGroupSellers{
+									AdminId: fmt.Sprint(seller.AdminId),
+									//AdminName string `description:"系统用户名称"`
+									RealName:     seller.RealName,
+									Authority:    seller.Authority,
+									RoleTypeCode: seller.RoleTypeCode,
+								}
+								tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+							}
+							//排个序
+							tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+							groupSellerList = append(groupSellerList, tmpDepartmentGroupSellersList...)
+						}
+
+						//groupItem.ChildrenList = groupSellerList
+						//if len(groupSellerList) > 0 {
+						//	list = append(list, item)
+						//}
+
+						//sellerList, err := system.GetGroupSysUserList(group.DepartmentId)
+						//if err != nil {
+						//	br.Msg = "获取销售失败"
+						//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+						//	return
+						//}
+						//for _, seller := range sellerList {
+						//	sellerItem := company.DepartmentGroupSellers{
+						//		AdminId: fmt.Sprint(seller.AdminId),
+						//		//AdminName string `description:"系统用户名称"`
+						//		RealName:     seller.RealName,
+						//		Authority:    seller.Authority,
+						//		RoleTypeCode: seller.RoleTypeCode,
+						//	}
+						//	groupSellerList = append(groupSellerList, sellerItem)
+						//}
+						//groupSellerList = sortDepartmentGroupSellers(groupSellerList)
+						groupItem.ChildrenList = groupSellerList
+						if len(groupSellerList) > 0 {
+							departmentGroupSellerList = append(departmentGroupSellerList, groupItem)
+						}
+					}
+
+					//分组为0的人,不光是销售(直属部门)
+					departmentSellerList, err := system.GetDepartmentGroupSysUserList(department.DepartmentId, 0, "")
+					if err != nil {
+						br.Msg = "获取销售失败"
+						br.ErrMsg = "获取销售失败,Err:" + err.Error()
+						return
+					}
+					if len(departmentSellerList) > 0 {
+						tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+						for _, seller := range departmentSellerList {
+							sellerItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint(seller.AdminId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     seller.RealName,
+								Authority:    seller.Authority,
+								RoleTypeCode: seller.RoleTypeCode,
+							}
+							tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+						}
+						//排个序
+						tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+						departmentGroupSellerList = append(departmentGroupSellerList, tmpDepartmentGroupSellersList...)
+					}
+
+					item.ChildrenList = departmentGroupSellerList
+					if len(departmentGroupSellerList) > 0 {
+						list = append(list, item)
+					}
+				}
+			}
+		} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_SELLER && status == 1 {
+			//var departmentStr string
+			//if utils.RunMode == "release" {
+			//	departmentStr = `1,2`
+			//} else {
+			//	departmentStr = `1,2`
+			//}
+			departmentStr := `1,2`
+			departmentList, err := system.GetDepartmentListByIds(departmentStr)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取部门失败,Err:" + err.Error()
+				return
+			}
+			for _, department := range departmentList {
+				departmentGroupSellerList := make([]company.DepartmentGroupSellers, 0)
+				item := company.DepartmentGroupSellers{
+					AdminId: fmt.Sprint("department_", department.DepartmentId),
+					//AdminName string `description:"系统用户名称"`
+					RealName:     department.DepartmentName,
+					ChildrenList: departmentGroupSellerList,
+				}
+
+				groupList, err := system.GetSysGroupByDepartmentId(department.DepartmentId)
+				if err != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取分组失败,Err:" + err.Error()
+					return
+				}
+				for _, group := range groupList {
+					groupSellerList := make([]company.DepartmentGroupSellers, 0)
+					groupItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint("group_", group.DepartmentId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     group.GroupName,
+						ChildrenList: groupSellerList,
+					}
+					teamList, err := system.GetSysTeamByDepartmentId(group.GroupId)
+					if err != nil {
+						br.Msg = "获取小组失败"
+						br.ErrMsg = "获取小组失败,Err:" + err.Error()
+						return
+					}
+					for _, team := range teamList {
+						teamSellerList := make([]company.DepartmentGroupSellers, 0)
+						teamItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint("team_", team.GroupId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     team.GroupName,
+							ChildrenList: teamSellerList,
+						}
+						sellerList, err := system.GetTeamSysUserList(team.GroupId, enabled)
+						if err != nil {
+							br.Msg = "获取销售失败"
+							br.ErrMsg = "获取销售失败,Err:" + err.Error()
+							return
+						}
+						for _, seller := range sellerList {
+							sellerItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint(seller.AdminId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     seller.RealName,
+								Authority:    seller.Authority,
+								RoleTypeCode: seller.RoleTypeCode,
+							}
+							//fmt.Println("seller.RealName:", seller.RealName)
+							teamSellerList = append(teamSellerList, sellerItem)
+						}
+						teamSellerList = sortDepartmentGroupSellers(teamSellerList)
+						teamItem.ChildrenList = teamSellerList
+						if len(teamSellerList) > 0 {
+							groupSellerList = append(groupSellerList, teamItem)
+						}
+					}
+					//分组为0的人,不光是销售(直属分组)
+					groupTeamSellerList, err := system.GetGroupSysUserList(group.GroupId)
+					if err != nil {
+						br.Msg = "获取销售失败"
+						br.ErrMsg = "获取销售失败,Err:" + err.Error()
+						return
+					}
+					if len(groupTeamSellerList) > 0 {
+						tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+						for _, seller := range groupTeamSellerList {
+							sellerItem := company.DepartmentGroupSellers{
+								AdminId: fmt.Sprint(seller.AdminId),
+								//AdminName string `description:"系统用户名称"`
+								RealName:     seller.RealName,
+								Authority:    seller.Authority,
+								RoleTypeCode: seller.RoleTypeCode,
+							}
+							tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+						}
+						//排个序
+						tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+						groupSellerList = append(groupSellerList, tmpDepartmentGroupSellersList...)
+					}
+
+					//groupItem.ChildrenList = groupSellerList
+					//if len(groupSellerList) > 0 {
+					//	list = append(list, item)
+					//}
+
+					//sellerList, err := system.GetGroupSysUserList(group.DepartmentId)
+					//if err != nil {
+					//	br.Msg = "获取销售失败"
+					//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					//	return
+					//}
+					//for _, seller := range sellerList {
+					//	sellerItem := company.DepartmentGroupSellers{
+					//		AdminId: fmt.Sprint(seller.AdminId),
+					//		//AdminName string `description:"系统用户名称"`
+					//		RealName:     seller.RealName,
+					//		Authority:    seller.Authority,
+					//		RoleTypeCode: seller.RoleTypeCode,
+					//	}
+					//	groupSellerList = append(groupSellerList, sellerItem)
+					//}
+					//groupSellerList = sortDepartmentGroupSellers(groupSellerList)
+					groupItem.ChildrenList = groupSellerList
+					if len(groupSellerList) > 0 {
+						departmentGroupSellerList = append(departmentGroupSellerList, groupItem)
+					}
+				}
+
+				//分组为0的人,不光是销售(直属部门)
+				departmentSellerList, err := system.GetDepartmentGroupSysUserList(department.DepartmentId, 0, "")
+				if err != nil {
+					br.Msg = "获取销售失败"
+					br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					return
+				}
+				if len(departmentSellerList) > 0 {
+					tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+					for _, seller := range departmentSellerList {
+						sellerItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint(seller.AdminId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     seller.RealName,
+							Authority:    seller.Authority,
+							RoleTypeCode: seller.RoleTypeCode,
+						}
+						tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+					}
+					//排个序
+					tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+					departmentGroupSellerList = append(departmentGroupSellerList, tmpDepartmentGroupSellersList...)
+				}
+
+				item.ChildrenList = departmentGroupSellerList
+				if len(departmentGroupSellerList) > 0 {
+					list = append(list, item)
+				}
+			}
+		} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER && status == 1 {
+			// 权益销售可以看到权益销售部的所有人
+			departmentId := 5
+			groupList, err := system.GetSysGroupByDepartmentId(departmentId)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取分组失败,Err:" + err.Error()
+				return
+			}
+			for _, group := range groupList {
+				groupSellerList := make([]company.DepartmentGroupSellers, 0)
+				groupItem := company.DepartmentGroupSellers{
+					AdminId: fmt.Sprint("group_", group.DepartmentId),
+					//AdminName string `description:"系统用户名称"`
+					RealName:     group.GroupName,
+					ChildrenList: groupSellerList,
+				}
+				teamList, err := system.GetSysTeamByDepartmentId(group.GroupId)
+				if err != nil {
+					br.Msg = "获取小组失败"
+					br.ErrMsg = "获取小组失败,Err:" + err.Error()
+					return
+				}
+				for _, team := range teamList {
+					teamSellerList := make([]company.DepartmentGroupSellers, 0)
+					teamItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint("team_", team.GroupId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     team.GroupName,
+						ChildrenList: teamSellerList,
+					}
+					sellerList, err := system.GetTeamSysUserList(team.GroupId, enabled)
+					if err != nil {
+						br.Msg = "获取销售失败"
+						br.ErrMsg = "获取销售失败,Err:" + err.Error()
+						return
+					}
+					for _, seller := range sellerList {
+						sellerItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint(seller.AdminId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     seller.RealName,
+							Authority:    seller.Authority,
+							RoleTypeCode: seller.RoleTypeCode,
+						}
+						//fmt.Println("seller.RealName:", seller.RealName)
+						teamSellerList = append(teamSellerList, sellerItem)
+					}
+					teamSellerList = sortDepartmentGroupSellers(teamSellerList)
+					teamItem.ChildrenList = teamSellerList
+					if len(teamSellerList) > 0 {
+						groupSellerList = append(groupSellerList, teamItem)
+					}
+				}
+				//分组为0的销售(直属分组)
+				groupTeamSellerList, err := system.GetGrooupsysUserList(group.GroupId, roleCodeTypeStr, enabled)
+				if err != nil {
+					br.Msg = "获取销售失败"
+					br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					return
+				}
+				if len(groupTeamSellerList) > 0 {
+					tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+					for _, seller := range groupTeamSellerList {
+						sellerItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint(seller.AdminId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     seller.RealName,
+							Authority:    seller.Authority,
+							RoleTypeCode: seller.RoleTypeCode,
+						}
+						tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+					}
+					//排个序
+					tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+					groupSellerList = append(groupSellerList, tmpDepartmentGroupSellersList...)
+				}
+
+				//groupItem.ChildrenList = groupSellerList
+				//if len(groupSellerList) > 0 {
+				//	list = append(list, item)
+				//}
+
+				//sellerList, err := system.GetGroupSysUserList(group.DepartmentId)
+				//if err != nil {
+				//	br.Msg = "获取销售失败"
+				//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				//	return
+				//}
+				//for _, seller := range sellerList {
+				//	sellerItem := company.DepartmentGroupSellers{
+				//		AdminId: fmt.Sprint(seller.AdminId),
+				//		//AdminName string `description:"系统用户名称"`
+				//		RealName:     seller.RealName,
+				//		Authority:    seller.Authority,
+				//		RoleTypeCode: seller.RoleTypeCode,
+				//	}
+				//	groupSellerList = append(groupSellerList, sellerItem)
+				//}
+				//groupSellerList = sortDepartmentGroupSellers(groupSellerList)
+				groupItem.ChildrenList = groupSellerList
+				if len(groupSellerList) > 0 {
+					list = append(list, groupItem)
+				}
+			}
+
+			//分组为0的销售(直属部门)
+			departmentSellerList, err := system.GetDepartmentGroupSysUserList(departmentId, 0, roleCodeTypeStr)
+			if err != nil {
+				br.Msg = "获取销售失败"
+				br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				return
+			}
+			if len(departmentSellerList) > 0 {
+				tmpDepartmentGroupSeller := make([]company.DepartmentGroupSellers, 0)
+				for _, seller := range departmentSellerList {
+					sellerItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint(seller.AdminId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     seller.RealName,
+						Authority:    seller.Authority,
+						RoleTypeCode: seller.RoleTypeCode,
+					}
+					tmpDepartmentGroupSeller = append(tmpDepartmentGroupSeller, sellerItem)
+				}
+				tmpDepartmentGroupSeller = sortDepartmentGroupSellers(tmpDepartmentGroupSeller)
+				list = append(list, tmpDepartmentGroupSeller...)
+			}
+		} else {
+			//看自己
+			sellerItem := company.DepartmentGroupSellers{
+				AdminId: fmt.Sprint(sysUser.AdminId),
+				//AdminName string `description:"系统用户名称"`
+				RealName: sysUser.RealName,
+			}
+			list = append(list, sellerItem)
+		}
+	} else {
+		// 权益管理员,查看所有权益的账号
+		roleCodeTypeStr := `"` + utils.ROLE_TYPE_CODE_RAI_SELLER + `","` + utils.ROLE_TYPE_CODE_RAI_GROUP + `","` + utils.ROLE_TYPE_CODE_RAI_RESEARCHR + `","` + utils.ROLE_TYPE_CODE_RAI_ADMIN + `"`
+		departmentId := 5
+		enabled := 1
+		groupList, err := system.GetSysGroupByDepartmentId(departmentId)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取分组失败,Err:" + err.Error()
+			return
+		}
+		for _, group := range groupList {
+			groupSellerList := make([]company.DepartmentGroupSellers, 0)
+			groupItem := company.DepartmentGroupSellers{
+				AdminId: fmt.Sprint("group_", group.DepartmentId),
+				//AdminName string `description:"系统用户名称"`
+				RealName:     group.GroupName,
+				ChildrenList: groupSellerList,
+			}
+			teamList, err := system.GetSysTeamByDepartmentId(group.GroupId)
+			if err != nil {
+				br.Msg = "获取小组失败"
+				br.ErrMsg = "获取小组失败,Err:" + err.Error()
+				return
+			}
+			for _, team := range teamList {
+				teamSellerList := make([]company.DepartmentGroupSellers, 0)
+				teamItem := company.DepartmentGroupSellers{
+					AdminId: fmt.Sprint("team_", team.GroupId),
+					//AdminName string `description:"系统用户名称"`
+					RealName:     team.GroupName,
+					ChildrenList: teamSellerList,
+				}
+				sellerList, err := system.GetTeamSysUserList(team.GroupId, enabled)
+				if err != nil {
+					br.Msg = "获取销售失败"
+					br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					return
+				}
+				for _, seller := range sellerList {
+					sellerItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint(seller.AdminId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     seller.RealName,
+						Authority:    seller.Authority,
+						RoleTypeCode: seller.RoleTypeCode,
+					}
+					//fmt.Println("seller.RealName:", seller.RealName)
+					teamSellerList = append(teamSellerList, sellerItem)
+				}
+				teamSellerList = sortDepartmentGroupSellers(teamSellerList)
+				teamItem.ChildrenList = teamSellerList
+				if len(teamSellerList) > 0 {
+					groupSellerList = append(groupSellerList, teamItem)
+				}
+			}
+			//分组为0的销售(直属分组)
+			groupTeamSellerList, err := system.GetGrooupsysUserList(group.GroupId, roleCodeTypeStr, enabled)
+			if err != nil {
+				br.Msg = "获取销售失败"
+				br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				return
+			}
+			if len(groupTeamSellerList) > 0 {
+				tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+				for _, seller := range groupTeamSellerList {
+					sellerItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint(seller.AdminId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     seller.RealName,
+						Authority:    seller.Authority,
+						RoleTypeCode: seller.RoleTypeCode,
+					}
+					tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+				}
+				//排个序
+				tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+				groupSellerList = append(groupSellerList, tmpDepartmentGroupSellersList...)
+			}
+
+			groupItem.ChildrenList = groupSellerList
+			if len(groupSellerList) > 0 {
+				resp = append(resp, groupItem)
+			}
+		}
+
+		//分组为0的销售(直属部门)
+		departmentSellerList, err := system.GetDepartmentGroupSysUserList(departmentId, 0, roleCodeTypeStr)
+		if err != nil {
+			br.Msg = "获取销售失败"
+			br.ErrMsg = "获取销售失败,Err:" + err.Error()
+			return
+		}
+		if len(departmentSellerList) > 0 {
+			tmpDepartmentGroupSeller := make([]company.DepartmentGroupSellers, 0)
+			for _, seller := range departmentSellerList {
+				sellerItem := company.DepartmentGroupSellers{
+					AdminId: fmt.Sprint(seller.AdminId),
+					//AdminName string `description:"系统用户名称"`
+					RealName:     seller.RealName,
+					Authority:    seller.Authority,
+					RoleTypeCode: seller.RoleTypeCode,
+				}
+				tmpDepartmentGroupSeller = append(tmpDepartmentGroupSeller, sellerItem)
+			}
+			tmpDepartmentGroupSeller = sortDepartmentGroupSellers(tmpDepartmentGroupSeller)
+			resp = append(resp, tmpDepartmentGroupSeller...)
+		}
+		list = resp
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = company.DepartmentGroupSellersResp{
+		List: list,
+	}
+}

+ 116 - 52
controllers/company_share.go

@@ -50,9 +50,10 @@ func (this *CompanyController) CompanyShare() {
 		br.ErrMsg = "IsShare:" + strconv.Itoa(req.IsShare)
 		return
 	}
+	productId := services.GetProductId(sysUser.RoleTypeCode)
 
 	//查询该客户
-	companyItem, err := company.GetCompanyById(req.CompanyId)
+	companyProductItem, err := company.GetCompanyProductByCompanyIdAndProductId(req.CompanyId, productId)
 	if err != nil {
 		br.Msg = "查找客户失败"
 		br.ErrMsg = "查找客户失败,Err:" + err.Error()
@@ -61,15 +62,15 @@ func (this *CompanyController) CompanyShare() {
 
 	//待更新字段
 	updateCol := make([]string, 0)
-	companyItem.IsShare = req.IsShare
+	companyProductItem.IsShare = req.IsShare
 	updateCol = append(updateCol, "IsShare")
 	if req.IsShare == 0 {
-		companyItem.ShareSeller = ""
-		companyItem.ShareSellerId = 0
+		companyProductItem.ShareSeller = ""
+		companyProductItem.ShareSellerId = 0
 		updateCol = append(updateCol, "ShareSeller", "ShareSellerId")
 	}
 
-	err = companyItem.Update(updateCol)
+	err = companyProductItem.Update(updateCol)
 	if err != nil {
 		br.Msg = "修改客户信息失败"
 		br.ErrMsg = "修改客户信息失败,Err:" + err.Error()
@@ -185,7 +186,7 @@ func (this *CompanyController) CompanyShareList() {
 				}
 				if sysUser.GroupId == groupId {
 					if sellerIdStr != "" {
-						condition += ` AND a.share_seller_id IN (` + sellerIdStr + `) `
+						condition += ` AND b.share_seller_id IN (` + sellerIdStr + `) `
 					}
 				} else {
 					if groupIdStr != "" {
@@ -201,7 +202,7 @@ func (this *CompanyController) CompanyShareList() {
 						return
 					}
 					if sellerIdStr != "" {
-						condition += ` AND a.share_seller_id IN (` + sellerIdStr + `) `
+						condition += ` AND b.share_seller_id IN (` + sellerIdStr + `) `
 					}
 				} else {
 					condition += ` AND b.group_id=? `
@@ -209,44 +210,54 @@ func (this *CompanyController) CompanyShareList() {
 				}
 			} else if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN && sysUser.AdminId != 66 && sysUser.AdminId != 15 && roleTypeCode != utils.ROLE_TYPE_CODE_FICC_ADMIN && roleTypeCode != utils.ROLE_TYPE_CODE_RAI_ADMIN {
 				if sysUser.GroupId == groupId {
-					condition += ` AND a.share_seller_id=? `
+					condition += ` AND b.share_seller_id=? `
 					pars = append(pars, sysUser.AdminId)
 				} else {
-					condition += ` AND b.seller_id=? `
-					pars = append(pars, sysUser.AdminId)
+					// 在此页面销售只能看分配给自己的客户
+					condition += ` AND (b.seller_id =? OR b.share_seller_id =? )`
+					pars = append(pars, sysUser.AdminId, sysUser.AdminId)
 				}
 			}
 		}
 	}
 
+
 	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 {
+		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 ||
+			sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP {
 			//非咨询组销售,那么默认查看“未共享”的客户
 			if sysUser.GroupId != groupId {
 				listParam = 3
-				if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_SELLER {
+				if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_SELLER || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER {
 					condition += ` AND b.seller_id = ? `
 					pars = append(pars, sysUser.AdminId)
 				}
 			} else {
-				condition += ` AND a.is_share=1 `
+				condition += ` AND b.is_share=1 `
 			}
-		} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN {
+		} else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN {
 			// 管理员,默认查看“待分配”客户
 			listParam = 2
 		}
 	}
 
 	if listParam == 1 {
-		condition += ` AND a.share_seller_id > 0 AND a.is_share=1 `
+		condition += ` AND b.share_seller_id > 0 AND b.is_share=1 `
 	} else if listParam == 2 {
-		condition += ` AND a.share_seller_id = 0 AND a.is_share=1 `
+		condition += ` AND b.share_seller_id = 0 AND b.is_share=1 `
 	} else if listParam == 3 { // 未共享
-		condition += ` AND a.is_share=0 and b.status="正式"`
+		if productId == 1 {
+			condition += ` AND b.is_share=0 and (b.status="正式" AND b.product_id = 1) `
+		} else if productId == 2 {
+			condition += ` AND b.is_share=0 and (b.status IN ("正式","试用","永续") AND b.product_id = 2) `
+		} else {
+			condition += ` AND b.is_share=0 and ((b.status="正式" AND b.product_id = 1) OR (b.status IN ("正式","试用") AND b.product_id = 2))`
+		}
 	}
 
 	if sellerIds != "" {
-		condition += ` AND a.share_seller_id IN (` + sellerIds + `) `
+		condition += ` AND b.share_seller_id IN (` + sellerIds + `) `
 	}
 	if originalSellerIds != "" {
 		condition += ` AND b.seller_id IN (` + originalSellerIds + `) `
@@ -321,13 +332,26 @@ func (this *CompanyController) CompanyShareList() {
 		sortStr += fmt.Sprintf(` %s`, sortType)
 	} else {
 		if roleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
-			sortStr = " ORDER BY sort_status asc, all_view_total desc, a.created_time "
+			//sortStr = " ORDER BY sort_status asc, all_view_total desc, a.created_time "
+			sortStr = " ORDER BY start_date DESC, all_view_total desc, a.created_time "
 		} else {
-			sortStr = " ORDER BY sort_status asc, b.view_total desc, a.created_time  "
+			//sortStr = " ORDER BY sort_status asc, b.view_total desc, a.created_time  "
+			sortStr = " ORDER BY start_date DESC, b.view_total desc, a.created_time "
 		}
 		sortStr += " DESC "
 	}
 
+	sysUserList, err := system.GetAdminList()
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取admin列表失败, Err:" + err.Error()
+		return
+	}
+	adminMap := make(map[int]*system.Admin, 0)
+	for _, v := range sysUserList {
+		adminMap[v.AdminId] = v
+	}
+
 	list, err := company.GetShareCompanyList(condition, sortStr, pars, startSize, pageSize)
 	if err != nil {
 		br.Msg = "获取失败"
@@ -383,9 +407,9 @@ func (this *CompanyController) CompanyShareList() {
 		itemStatus := item.Status
 		if itemStatus != "" {
 			if !strings.Contains(item.Status, "/") {
-				if itemStatus == utils.COMPANY_STATUS_FOREVER { //永续
+				if strings.Contains(itemStatus, utils.COMPANY_STATUS_FOREVER) { //永续
 					expireDay = "-"
-				} else if itemStatus == utils.COMPANY_STATUS_TRY_OUT || itemStatus == utils.COMPANY_STATUS_FORMAL { //试用/正式
+				} else if strings.Contains(itemStatus, utils.COMPANY_STATUS_TRY_OUT) || strings.Contains(itemStatus, utils.COMPANY_STATUS_FORMAL) { //试用/正式
 					if item.StartDate != "" && item.EndDate != "" {
 						endDateTime, _ := time.Parse(utils.FormatDate, item.EndDate)
 						endDateTime = endDateTime.AddDate(0, 0, 1)
@@ -397,9 +421,9 @@ func (this *CompanyController) CompanyShareList() {
 					} else {
 						expireDay = "-"
 					}
-				} else if itemStatus == utils.COMPANY_STATUS_LOSE {
+				} else if strings.Contains(itemStatus, utils.COMPANY_STATUS_LOSE) {
 					expireDay = "-"
-				} else if itemStatus == utils.COMPANY_STATUS_FREEZE {
+				} else if strings.Contains(itemStatus, utils.COMPANY_STATUS_FREEZE) {
 					if item.StartDate != "" && item.EndDate != "" {
 						endDateTime, _ := time.Parse(utils.FormatDate, item.EndDate)
 						endDateTime = endDateTime.AddDate(0, 0, 0)
@@ -428,9 +452,9 @@ func (this *CompanyController) CompanyShareList() {
 						ficcEndDate = endDateArr[0]
 						tryEndDate = endDateArr[1]
 					}
-					if ficcStatus == utils.COMPANY_STATUS_FOREVER { //永续
+					if strings.Contains(ficcStatus, utils.COMPANY_STATUS_FOREVER) { //永续
 						ficcExpireDay = "-"
-					} else if ficcStatus == utils.COMPANY_STATUS_TRY_OUT || ficcStatus == utils.COMPANY_STATUS_FORMAL { //试用/正式
+					} else if strings.Contains(ficcStatus, utils.COMPANY_STATUS_X_CLASS_TRY_OUT) || strings.Contains(ficcStatus, utils.COMPANY_STATUS_FORMAL) { //试用/正式
 						if ficcEndDate != "" {
 							endDateTime, _ := time.Parse(utils.FormatDate, ficcEndDate)
 							endDateTime = endDateTime.AddDate(0, 0, 1)
@@ -442,9 +466,9 @@ func (this *CompanyController) CompanyShareList() {
 						} else {
 							ficcExpireDay = "-"
 						}
-					} else if ficcStatus == utils.COMPANY_STATUS_LOSE { //流失
+					} else if strings.Contains(ficcStatus, utils.COMPANY_STATUS_LOSE) { //流失
 						ficcExpireDay = "-"
-					} else if ficcStatus == utils.COMPANY_STATUS_FREEZE { //冻结
+					} else if strings.Contains(ficcStatus, utils.COMPANY_STATUS_FREEZE) { //冻结
 						if item.StartDate != "" && item.EndDate != "" {
 							endDateTime, _ := time.Parse(utils.FormatDate, ficcEndDate)
 							endDateTime = endDateTime.AddDate(0, 0, 0)
@@ -460,9 +484,9 @@ func (this *CompanyController) CompanyShareList() {
 						ficcExpireDay = "-"
 					}
 
-					if raiStatus == utils.COMPANY_STATUS_FOREVER { //永续
+					if strings.Contains(raiStatus, utils.COMPANY_STATUS_FOREVER) { //永续
 						tryExpireDay = "-"
-					} else if raiStatus == utils.COMPANY_STATUS_TRY_OUT || raiStatus == utils.COMPANY_STATUS_FORMAL { //试用/正式
+					} else if strings.Contains(raiStatus, utils.COMPANY_STATUS_X_CLASS_TRY_OUT) || strings.Contains(raiStatus, utils.COMPANY_STATUS_FORMAL) { //试用/正式
 						if tryEndDate != "" {
 							endDateTime, _ := time.Parse(utils.FormatDate, tryEndDate)
 							endDateTime = endDateTime.AddDate(0, 0, 1)
@@ -474,9 +498,9 @@ func (this *CompanyController) CompanyShareList() {
 						} else {
 							tryExpireDay = "-"
 						}
-					} else if raiStatus == utils.COMPANY_STATUS_LOSE { //流失
+					} else if strings.Contains(raiStatus, utils.COMPANY_STATUS_LOSE) { //流失
 						tryExpireDay = "-"
-					} else if raiStatus == utils.COMPANY_STATUS_FREEZE { //冻结
+					} else if strings.Contains(raiStatus, utils.COMPANY_STATUS_FREEZE) { //冻结
 						if item.StartDate != "" && item.EndDate != "" {
 							endDateTime, _ := time.Parse(utils.FormatDate, tryEndDate)
 							endDateTime = endDateTime.AddDate(0, 0, 0)
@@ -509,7 +533,7 @@ func (this *CompanyController) CompanyShareList() {
 		}
 		list[i].BtnItem = btnItem
 
-		if item.FreezeStartDate != "" && item.FreezeEndDate != "" && item.Status == utils.COMPANY_STATUS_FREEZE {
+		if item.FreezeStartDate != "" && item.FreezeEndDate != "" && strings.Contains(item.Status, utils.COMPANY_STATUS_FREEZE) {
 			freezeEndDate, _ := time.Parse(utils.FormatDate, item.FreezeEndDate)
 			if time.Now().Before(freezeEndDate) {
 				expireDays := freezeEndDate.Sub(time.Now()).Hours() / 24
@@ -559,16 +583,13 @@ func (this *CompanyController) CompanyShareList() {
 			//viewTotal:=GetviewTotal(v.CompanyId)
 
 			//活跃(客户状态)
-			tmpStatus := v.Status
-			if v.IsShare == 1 {
-				tmpStatus = v.Status + "(共享)"
-			} else {
+			if v.IsShare != 1 {
 				if v.BtnItem.BtnModifySeller == true {
 					v.BtnItem.BtnModifySeller = false
 				}
 			}
 
-			if v.IsShare == 1 && v.BtnItem.BtnModifySeller == true {
+			if v.IsShare == 1 && v.BtnItem.BtnModifySeller == true && sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
 				//如果已经是共享客户了,取消共享按钮全都显示,和修改销售权限一样
 				v.BtnItem.BtnShare = true
 			}
@@ -584,7 +605,7 @@ func (this *CompanyController) CompanyShareList() {
 				RenewalReason:    v.RenewalReason,
 				FreezeReason:     v.FreezeReason,
 				LossTime:         v.LossTime,
-				Status:           tmpStatus,
+				Status:           v.Status,
 				CompanyType:      v.CompanyType,
 				ApproveStatus:    v.ApproveStatus,
 				SellerName:       v.SellerName,
@@ -628,11 +649,25 @@ func (this *CompanyController) CompanyShareList() {
 				Deadline:        v.Deadline,
 				WeekViewActive:  v.WeekViewActive,
 				IsShare:         v.IsShare,
-				ShareSeller:     v.ShareSeller,
 				ShareSellerId:   v.ShareSellerId,
 				LastServiceTime: v.LastServiceTime,
 				ServiceTimes:    v.ServiceTimes,
 			}
+			if v.ShareSellerIds != "" {
+				shareSellerIds := strings.Split(v.ShareSellerIds, ",")
+				for _, idStr := range shareSellerIds {
+					shareSellerId, e := strconv.Atoi(idStr)
+					if e != nil {
+						err = e
+						return
+					}
+					shareSeller := adminMap[shareSellerId]
+					if shareSeller != nil {
+						companyList.ShareSeller += shareSeller.RealName + "(" + shareSeller.GroupName + ")" + "/"
+					}
+				}
+				companyList.ShareSeller = strings.TrimRight(companyList.ShareSeller, "/")
+			}
 			companyLists = append(companyLists, companyList)
 		}
 	}
@@ -700,9 +735,14 @@ func (this *CompanyController) MoveShareSeller() {
 		br.ErrMsg = "获取销售信息失败,Err:" + err.Error()
 		return
 	}
-
+	productId := services.GetProductId(sysUser.RoleTypeCode)
+	if productId == 0 {
+		br.Msg = "该角色非ficc或权益角色"
+		br.ErrMsg = "该角色非ficc或权益角色"
+		return
+	}
 	//查询该客户
-	companyItem, err := company.GetCompanyById(req.CompanyId)
+	companyProductItem, err := company.GetCompanyProductByCompanyIdAndProductId(req.CompanyId, productId)
 	if err != nil {
 		br.Msg = "查找客户失败"
 		br.ErrMsg = "查找客户失败,Err:" + err.Error()
@@ -711,11 +751,11 @@ func (this *CompanyController) MoveShareSeller() {
 
 	//待更新字段
 	updateCol := make([]string, 0)
-	companyItem.ShareSeller = seller.RealName
-	companyItem.ShareSellerId = seller.AdminId
+	companyProductItem.ShareSeller = seller.RealName
+	companyProductItem.ShareSellerId = seller.AdminId
 	updateCol = append(updateCol, "ShareSeller", "ShareSellerId")
 
-	err = companyItem.Update(updateCol)
+	err = companyProductItem.Update(updateCol)
 	if err != nil {
 		br.Msg = "修改客户信息失败"
 		br.ErrMsg = "修改客户信息失败,Err:" + err.Error()
@@ -932,7 +972,7 @@ func (this *CompanyController) CompanyShareListByCity() {
 		}
 	}
 
-	condition += ` AND a.is_share=1 `
+	condition += ` AND b.is_share=1 `
 	if province != "" {
 		var provinceSql string
 		slice := strings.Split(province, ",")
@@ -959,7 +999,16 @@ func (this *CompanyController) CompanyShareListByCity() {
 		br.ErrMsg = "获取数据总数失败,Err:" + err.Error()
 		return
 	}
-
+	sysUserList, err := system.GetAdminList()
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取admin列表失败, Err:" + err.Error()
+		return
+	}
+	adminMap := make(map[int]*system.Admin, 0)
+	for _, v := range sysUserList {
+		adminMap[v.AdminId] = v
+	}
 	sortStr := ` `
 	//if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
 	//	sortStr = " ORDER BY sort_status asc, all_view_total desc, a.created_time "
@@ -1014,9 +1063,10 @@ func (this *CompanyController) CompanyShareListByCity() {
 			//viewTotal:=GetviewTotal(v.CompanyId)
 
 			//活跃(客户状态)
-			tmpStatus := v.Status
-			if v.IsShare == 1 {
-				tmpStatus = v.Status + "(共享)"
+			if v.IsShare != 1 {
+				if v.BtnItem.BtnModifySeller == true {
+					v.BtnItem.BtnModifySeller = false
+				}
 			}
 
 			companyList := &company.CompanyListItem{
@@ -1030,7 +1080,7 @@ func (this *CompanyController) CompanyShareListByCity() {
 				RenewalReason:    v.RenewalReason,
 				FreezeReason:     v.FreezeReason,
 				LossTime:         v.LossTime,
-				Status:           tmpStatus,
+				Status:           v.Status,
 				CompanyType:      v.CompanyType,
 				ApproveStatus:    v.ApproveStatus,
 				SellerName:       v.SellerName,
@@ -1074,11 +1124,25 @@ func (this *CompanyController) CompanyShareListByCity() {
 				Deadline:        v.Deadline,
 				WeekViewActive:  v.WeekViewActive,
 				IsShare:         v.IsShare,
-				ShareSeller:     v.ShareSeller,
 				ShareSellerId:   v.ShareSellerId,
 				LastServiceTime: v.LastServiceTime,
 				ServiceTimes:    v.ServiceTimes,
 			}
+			if v.ShareSellerIds != "" {
+				shareSellerIds := strings.Split(v.ShareSellerIds, ",")
+				for _, idStr := range shareSellerIds {
+					shareSellerId, e := strconv.Atoi(idStr)
+					if e != nil {
+						err = e
+						return
+					}
+					shareSeller := adminMap[shareSellerId]
+					if shareSeller != nil {
+						companyList.ShareSeller += shareSeller.RealName + "(" + shareSeller.GroupName + ")" + "/"
+					}
+				}
+				companyList.ShareSeller = strings.TrimRight(companyList.ShareSeller, "/")
+			}
 			companyLists = append(companyLists, companyList)
 		}
 	}

+ 36 - 27
controllers/company_user.go

@@ -93,25 +93,23 @@ func (this *CompanyUserController) AddUser() {
 		return
 	}
 	regionType := req.RegionType //区域来源
+	productId := services.GetProductId(sysUser.RoleTypeCode)
 
 	//操作员的产品权限
 	companyProductList := make([]*company.CompanyProduct, 0)
 
-	shareSellerId := 0
-	companyInfo := new(company.Company)
+	var companyInfo *company.Company
+	var e error
 	if req.CompanyId > 0 {
-		item, e := company.GetCompanyById(req.CompanyId)
+		companyInfo, e = company.GetCompanyById(req.CompanyId)
 		if e != nil {
 			br.Msg = "客户信息有误"
 			br.ErrMsg = "获取客户信息失败, Err: " + e.Error()
 			return
 		}
-		companyInfo = item
-		shareSellerId = item.ShareSellerId
 	}
 
 	//权益类客户,邮箱必填(2021-03-22 13:32:59修改)
-	productId := services.GetProductId(sysUser.RoleTypeCode)
 	if productId == 1 || regionType == "国内" { //ficc类客户
 		if req.MobileOne == "" && req.Email == "" {
 			br.Msg = "请输入手机号或邮箱"
@@ -206,6 +204,16 @@ func (this *CompanyUserController) AddUser() {
 			}
 			companyProductList = append(companyProductList, tmpCompanyProduct)
 		} else if req.Source == "add_user" {
+			shareSellerId := 0
+			if req.CompanyId > 0 {
+				item, e := company.GetCompanyProductByCompanyIdAndProductId(req.CompanyId, productId)
+				if e != nil {
+					br.Msg = "客户信息有误"
+					br.ErrMsg = "获取客户信息失败, Err: " + e.Error()
+					return
+				}
+				shareSellerId = item.ShareSellerId
+			}
 			//获取当前操作员产品权限
 			tmpCompanyProductList, productErr := getSysCompanyProductList(productId, req.CompanyId)
 			if productErr != nil {
@@ -1638,16 +1646,11 @@ func (this *CompanyUserController) EditUser() {
 		br.ErrMsg = "获取当前操作员找不到产品权限"
 		return
 	}
-	item, err := company.GetCompanyDetailById(wxUser.CompanyId)
-	if err != nil {
-		br.Msg = "获取信息失败"
-		br.ErrMsg = "获取数据失败,Err:" + err.Error()
-		return
-	}
+
 	//操作权限校验
 	for _, v := range companyProductList {
-		companyUserStatus := services.CheckCompanyUserButton(sysUser.RoleTypeCode, v.SellerId, sysUser.AdminId, v.ProductId, item.ShareSellerId, v.Status)
-		if item.ShareSellerId == sysUser.AdminId {
+		companyUserStatus := services.CheckCompanyUserButton(sysUser.RoleTypeCode, v.SellerId, sysUser.AdminId, v.ProductId, v.ShareSellerId, v.Status)
+		if v.ShareSellerId == sysUser.AdminId {
 			companyUserStatus = true
 		}
 		if companyUserStatus == false {
@@ -3190,7 +3193,8 @@ func (this *CompanyUserController) ViewReportList() {
 			} else {
 				lastViewTimeT = time.Now()
 			}
-			lastViewTime = lastViewTimeT.Format(utils.FormatDateTime)
+			// 默认要把最新的记录列出来,所以往后加1s
+			lastViewTime = lastViewTimeT.Add(1 * time.Second).Format(utils.FormatDateTime)
 		}
 	// 权益
 	case 2: // ficc
@@ -3204,7 +3208,8 @@ func (this *CompanyUserController) ViewReportList() {
 			} else {
 				lastViewTimeT = time.Now()
 			}
-			lastViewTime = lastViewTimeT.Format(utils.FormatDateTime)
+			// 默认要把最新的记录列出来,所以往后加1s
+			lastViewTime = lastViewTimeT.Add(1 * time.Second).Format(utils.FormatDateTime)
 		}
 	default:
 		if lastViewTimeT.IsZero() {
@@ -3374,7 +3379,18 @@ func (this *CompanyUserController) ViewReportList() {
 	for _, v := range recordList {
 		tmpKey := fmt.Sprint(v.Source, "_", v.ReportId)
 		if tmpInfo, ok := viewReportMap[tmpKey]; ok {
-			list = append(list, &tmpInfo)
+			stopTime := `--`
+			if v.StopTime > 0 {
+				stopTime = fmt.Sprint(v.StopTime)
+			}
+			list = append(list, &company.ViewReportList{
+				ResearchReportName: tmpInfo.ResearchReportName,
+				ReportType:         tmpInfo.ReportType,
+				CreatedTime:        v.CreateTime,
+				TxtType:            tmpInfo.TxtType,
+				MatchTypeName:      tmpInfo.MatchTypeName,
+				StopTime:           stopTime,
+			})
 		}
 	}
 
@@ -5035,13 +5051,10 @@ func checkOpCompanyUserByUserId(userId, productId, opId int, roleTypeCode string
 		err = errors.New("删除失败,获取当前操作员找不到产品权限")
 		return
 	}
-	item, err := company.GetCompanyDetailById(userInfo.CompanyId)
-	if err != nil {
-		return
-	}
+
 	//操作权限校验
 	for _, v := range companyProductList {
-		companyUserStatus := services.CheckCompanyUserButton(roleTypeCode, v.SellerId, opId, v.ProductId, item.ShareSellerId, v.Status)
+		companyUserStatus := services.CheckCompanyUserButton(roleTypeCode, v.SellerId, opId, v.ProductId, v.ShareSellerId, v.Status)
 		if companyUserStatus == false {
 			errMsg = "没有操作权限"
 			err = errors.New("没有操作权限")
@@ -5065,13 +5078,9 @@ func checkOpCompanyUserByCompanyId(companyId, productId, opId int, roleTypeCode
 		err = errors.New("删除失败,获取当前操作员找不到产品权限")
 		return
 	}
-	item, err := company.GetCompanyDetailById(companyId)
-	if err != nil {
-		return
-	}
 	//操作权限校验
 	for _, v := range companyProductList {
-		companyUserStatus := services.CheckCompanyUserButton(roleTypeCode, v.SellerId, opId, v.ProductId, item.ShareSellerId, v.Status)
+		companyUserStatus := services.CheckCompanyUserButton(roleTypeCode, v.SellerId, opId, v.ProductId, v.ShareSellerId, v.Status)
 		if companyUserStatus == false {
 			errMsg = "没有操作权限"
 			err = errors.New("没有操作权限")

+ 61 - 16
controllers/contract/contract.go

@@ -78,6 +78,7 @@ func (this *ContractController) GetServiceTemplateList() {
 				br.ErrMsg = "获取详情模板失败,Err:" + err.Error()
 				return
 			}
+
 			tmpList[j].Detail = detail
 			// 权益存在第三级主客观套餐-CRM8.8
 			thirdList, e := contract.GetContractServiceTemplateMapByParentId(tmpList[j].ServiceTemplateId)
@@ -123,6 +124,44 @@ func (this *ContractController) GetServiceTemplateList() {
 			br.ErrMsg = "获取详情模板失败,Err:" + err.Error()
 			return
 		}
+		if productId == 1 && list[i].ServiceTemplateId == 2 {
+			// 特殊处理Ficc周报、商品双周报、数据点评的套餐显示
+			// 把detail转成go struct
+			// 查询默认的公有权限
+			publicPermissionList, tmpE := models.GetFiccPermissionSecondPublic()
+			if tmpE != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取默认的公有权限失败,Err:" + tmpE.Error()
+				return
+			}
+			publicPermissionIds := make([]int, 0)
+			publicPermissionNames := make([]string, 0)
+			for _, v := range publicPermissionList {
+				publicPermissionIds = append(publicPermissionIds, v.ChartPermissionId)
+				publicPermissionNames = append(publicPermissionNames, v.PermissionName)
+			}
+			for k, v := range detail {
+				if v.Id == 4 || v.Id == 5 || v.Id == 6 {
+					detailStruct := new(contract.ServiceTemplateDetailCol2)
+					e := json.Unmarshal([]byte(v.Col2), detailStruct)
+					if e != nil {
+						br.Msg = "获取失败"
+						br.ErrMsg = "获取套餐信息失败, json.Unmarshal Err: " + e.Error()
+						return
+					}
+					//替换默认品种
+					detailStruct.ValueId = publicPermissionIds
+					detailStruct.Value = strings.Join(publicPermissionNames, ",")
+					newCol2, e := json.Marshal(detailStruct)
+					if e != nil {
+						br.Msg = "获取失败"
+						br.ErrMsg = "获取套餐信息失败, json.Marshal Err: " + e.Error()
+						return
+					}
+					detail[k].Col2 = string(newCol2)
+				}
+			}
+		}
 		if productId == 1 && contractType == "补充协议" {
 			for _, v := range detail {
 				//ficc 的合同模板的 补充协议需要将默认的宏观经济给移除掉
@@ -862,14 +901,20 @@ func contractListExport(this *ContractController, list []*contract.ContractList,
 					}
 
 					permissionList := make([]*company.PermissionSetItem, 0)
-					for _, v := range utils.PermissionFiccClassifyArr {
-						items, err := company.GetPermissionSetItems(1, v)
-						if err != nil {
-							br.Msg = "获取失败"
-							br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
-							return
+					allPermissions, permissionMap, e := services.GetBaseFiccPermissionSetItem()
+					if e != nil {
+						br.Msg = "查询基础权限失败"
+						br.ErrMsg = "查询基础权限失败,Err:" + e.Error()
+						return
+					}
+					//遍历获取
+					for _, v := range allPermissions {
+						if v.ParentId == 0 {
+							items, ok := permissionMap[v.ChartPermissionId]
+							if ok {
+								permissionList = append(permissionList, items...)
+							}
 						}
-						permissionList = append(permissionList, items...)
 					}
 
 					//权限列表
@@ -1611,7 +1656,7 @@ func (this *ContractController) Detail() {
 	if isNeedPermission {
 		checkPermissionMap, tErr := contractService.GetServicePermissionMap(contractInfo.Service)
 		if tErr == nil {
-			permissionLookListMap := make(map[string][]*contract.PermissionLookItem)
+			permissionLookListMap := make(map[int][]*contract.PermissionLookItem)
 			var permissionIds []string
 			for _, v := range checkPermissionMap {
 				permissionIds = append(permissionIds, strconv.Itoa(v))
@@ -1624,12 +1669,12 @@ func (this *ContractController) Detail() {
 					tmp.ClassifyName = v.ClassifyName
 					tmp.PermissionName = v.PermissionName
 					tmp.ChartPermissionId = v.ChartPermissionId
-					permissionLookListMap[v.ClassifyName] = append(permissionLookListMap[v.ClassifyName], tmp)
+					permissionLookListMap[v.ParentId] = append(permissionLookListMap[v.ParentId], tmp)
 				}
 				classifyNameList, tErr2 := company.GetChartPermissionFirst()
 				if tErr2 == nil {
 					for _, v := range classifyNameList {
-						if perList, ok := permissionLookListMap[v.ClassifyName]; ok {
+						if perList, ok := permissionLookListMap[v.ChartPermissionId]; ok {
 							permissionLookListRespItem := &contract.PermissionLookList{
 								ClassifyName: v.ClassifyName,
 								Items:        perList,
@@ -2544,7 +2589,7 @@ func (this *ContractController) BusinessContractCompanyList() {
 		cond := ` AND share_seller_id = ? AND is_share = 1 AND company_name LIKE ?`
 		pars := make([]interface{}, 0)
 		pars = append(pars, sysUser.AdminId, kw)
-		shares, e := company.GetCompanyListByCondition(cond, pars, []string{"company_id", "company_name"}, "")
+		shares, e := company.GetCompanyProductList(cond, pars)
 		if e != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取共享客户信息失败, Err: " + e.Error()
@@ -2602,7 +2647,7 @@ func (this *ContractController) BusinessContractListByCompanyName() {
 	//pars = append(pars, sysUser.AdminId)
 
 	// 13.6正式共享客户-可以选择分配给自己的共享客户下的非自己创建的合同
-	joinStr := ` LEFT JOIN company AS b ON a.company_name = b.company_name `
+	joinStr := ` LEFT JOIN company_product AS b ON a.company_name = b.company_name `
 	condition += ` AND (a.seller_id = ? OR (b.is_share = 1 AND b.share_seller_id = ?))`
 	pars = append(pars, sysUser.AdminId, sysUser.AdminId)
 
@@ -2869,7 +2914,7 @@ func (this *ContractController) GetListBySeal() {
 	}
 
 	// 13.6正式共享客户
-	joinStr := ` LEFT JOIN company AS b ON a.company_name = b.company_name `
+	joinStr := ` LEFT JOIN company_product AS b ON a.company_name = b.company_name `
 	// 非合规角色可查看自己的合同或是自己的共享客户下的非自己创建的合同
 	if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_COMPLIANCE {
 		condition += ` AND (a.seller_id = ? OR (b.is_share = 1 AND b.share_seller_id = ?))`
@@ -2998,7 +3043,7 @@ func (this *ContractController) DetailMerge() {
 	if isNeedPermission {
 		checkPermissionMap, tErr := contractService.GetServicePermissionMap(contractInfo.Service)
 		if tErr == nil {
-			permissionLookListMap := make(map[string][]*contract.PermissionLookItem)
+			permissionLookListMap := make(map[int][]*contract.PermissionLookItem)
 			var permissionIds []string
 			for _, v := range checkPermissionMap {
 				permissionIds = append(permissionIds, strconv.Itoa(v))
@@ -3011,12 +3056,12 @@ func (this *ContractController) DetailMerge() {
 					tmp.ClassifyName = v.ClassifyName
 					tmp.PermissionName = v.PermissionName
 					tmp.ChartPermissionId = v.ChartPermissionId
-					permissionLookListMap[v.ClassifyName] = append(permissionLookListMap[v.ClassifyName], tmp)
+					permissionLookListMap[v.ParentId] = append(permissionLookListMap[v.ParentId], tmp)
 				}
 				classifyNameList, tErr2 := company.GetChartPermissionFirst()
 				if tErr2 == nil {
 					for _, v := range classifyNameList {
-						if perList, ok := permissionLookListMap[v.ClassifyName]; ok {
+						if perList, ok := permissionLookListMap[v.ChartPermissionId]; ok {
 							permissionLookListRespItem := &contract.PermissionLookList{
 								ClassifyName: v.ClassifyName,
 								Items:        perList,

+ 34 - 4
controllers/contract/contract_approval.go

@@ -624,7 +624,22 @@ func contractApprovalListExport(this *ContractApprovalController, list []*contra
 					}
 
 					permissionList := make([]*company.PermissionSetItem, 0)
-					for _, v := range utils.PermissionFiccClassifyArr {
+					allPermissions, permissionMap, e := services.GetBaseFiccPermissionSetItem()
+					if e != nil {
+						br.Msg = "查询基础权限失败"
+						br.ErrMsg = "查询基础权限失败,Err:" + e.Error()
+						return
+					}
+					//遍历获取
+					for _, v := range allPermissions {
+						if v.ParentId == 0 {
+							items, ok := permissionMap[v.ChartPermissionId]
+							if ok {
+								permissionList = append(permissionList, items...)
+							}
+						}
+					}
+					/*for _, v := range utils.PermissionFiccClassifyArr {
 						items, err := company.GetPermissionSetItems(1, v)
 						if err != nil {
 							br.Msg = "获取失败"
@@ -632,7 +647,7 @@ func contractApprovalListExport(this *ContractApprovalController, list []*contra
 							return
 						}
 						permissionList = append(permissionList, items...)
-					}
+					}*/
 
 					//权限列表
 					for j := 0; j < len(permissionList); j++ {
@@ -1259,7 +1274,22 @@ func (this *ContractApprovalController) Export() {
 					}
 
 					permissionList := make([]*company.PermissionSetItem, 0)
-					for _, v := range utils.PermissionFiccClassifyArr {
+					allPermissions, permissionMap, e := services.GetBaseFiccPermissionSetItem()
+					if e != nil {
+						br.Msg = "查询基础权限失败"
+						br.ErrMsg = "查询基础权限失败,Err:" + e.Error()
+						return
+					}
+					//遍历获取
+					for _, v := range allPermissions {
+						if v.ParentId == 0 {
+							items, ok := permissionMap[v.ChartPermissionId]
+							if ok {
+								permissionList = append(permissionList, items...)
+							}
+						}
+					}
+					/*for _, v := range utils.PermissionFiccClassifyArr {
 						items, err := company.GetPermissionSetItems(1, v)
 						if err != nil {
 							br.Msg = "获取失败"
@@ -1268,7 +1298,7 @@ func (this *ContractApprovalController) Export() {
 						}
 						permissionList = append(permissionList, items...)
 					}
-
+					*/
 					//权限列表
 					for j := 0; j < len(permissionList); j++ {
 						key := fmt.Sprint(item.ServiceTemplateId, "_permission_", permissionList[j].ChartPermissionId)

+ 53 - 4
controllers/cygx/activity.go

@@ -728,21 +728,43 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 				errAct = err
 				if activityInfo.PublishStatus == 1 && activityInfo.ActivityTimeText != item.ActivityTimeText {
 					go services.SendWxMsgWithCygxActivityUpdateTime(req.ActivityId, activityInfo.ActivityTimeText, item.ActivityTimeText, "timeType")
+					if activityInfo.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+						activityTime, err := time.Parse(utils.FormatDateTime, item.ActivityTime)
+						if err != nil {
+							br.Msg = "转换失败"
+							br.ErrMsg = "转换失败,Err:" + err.Error()
+							return
+						}
+						activityTimeStr := activityTime.Format(utils.FormatDateTimeMinute2)
+						go services.SendWxCategoryMsgWithCygxActivityUpdateTime(req.ActivityId, activityInfo.ActivityTimeText, activityTimeStr, "timeType")
+					}
 				}
 				oldExpert, _ := cygx.GetReportContentTextSub(activityInfo.Expert)
 				newExpert, _ := cygx.GetReportContentTextSub(item.Expert)
 				if activityInfo.PublishStatus == 1 && oldExpert != newExpert {
 					go services.SendWxMsgWithCygxActivityUpdateTime(req.ActivityId, oldExpert, newExpert, "expertType")
+					if activityInfo.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+						go services.SendWxCategoryMsgWithCygxActivityUpdateTime(req.ActivityId, activityInfo.ActivityTimeText, newExpert, "expertType")
+					}
 				}
 				if activityInfo.PublishStatus == 1 && activityInfo.Address != item.Address {
 					go services.SendWxMsgWithCygxActivityUpdateTime(req.ActivityId, activityInfo.Address, item.Address, "addressType")
+					if activityInfo.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+						go services.SendWxCategoryMsgWithCygxActivityUpdateTime(req.ActivityId, activityInfo.ActivityTimeText, item.Address, "addressType")
+					}
 				}
 				if activityInfo.PublishStatus == 1 && activityInfo.ParticipationCode != item.ParticipationCode {
 					go services.SendWxMsgWithCygxActivityUpdateTime(req.ActivityId, activityInfo.ParticipationCode, item.ParticipationCode, "participationCode")
+					if activityInfo.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+						go services.SendWxCategoryMsgWithCygxActivityUpdateTime(req.ActivityId, activityInfo.ActivityTimeText, item.ParticipationCode, "participationCode")
+					}
 				}
 
 				if activityInfo.PublishStatus == 1 && activityInfo.Theme != item.Theme {
 					go services.SendWxMsgWithCygxActivityUpdateTime(req.ActivityId, activityInfo.Theme, item.Theme, "Theme")
+					if activityInfo.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+						go services.SendWxCategoryMsgWithCygxActivityUpdateTime(req.ActivityId, activityInfo.ActivityTimeText, item.Theme, "Theme")
+					}
 				}
 
 				//对于限制人数的活动,如果修改改了可见范围,对于新增的那一部分做新的推送
@@ -766,6 +788,9 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 				//修改活动人数限制之后,对于因为人数已满而失败的用户,推送模板消息
 				if activityInfo.PublishStatus == 1 && activityInfo.IsLimitPeople != 0 && activityInfo.LimitPeopleNum != strconv.Itoa(req.LimitPeopleNum) {
 					go cygxService.SendWxMsgWithCygxActivityUpdateLimitPeople(req.ActivityId)
+					if activityInfo.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+						go services.SendWxCategoryMsgWithCygxActivityUpdateLimitPeople(activityId)
+					}
 				}
 				go cygxService.YiDongSaveRoadshowDetail(activityId)
 
@@ -810,6 +835,7 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 				go cygxService.YiDongSaveRoadshowDetail(v)
 				go cygxService.YanXuanActivityPointsBillActivityPublishAndCancel(v, AdminUser.AdminId, 1) //活动发布以及取消发布处理研选扣
 				go elastic.AddComprehensiveActivity(v)
+				go cygxService.MakeActivityMomentsImg(v) //生成活动分享到朋友圈的图片
 				//}()
 			}
 			go cygxService.MakeActivitySigninImg(v)
@@ -821,6 +847,7 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 			go cygxService.YanXuanActivityPointsBillActivityPublishAndCancel(activityId, AdminUser.AdminId, 1) //活动发布以及取消发布处理研选扣点
 		}
 		cygxService.UpdateActivityResourceData(req.ActivityId) //写入首页最新  cygx_resource_data 表
+		go cygxService.MakeActivityMomentsImg(req.ActivityId)  //生成活动分享到朋友圈的图片
 		//如果二次编辑的时候,取消了易董办会选项,那么就对易董发送取消发布到广场的通知
 		if req.IsYidongConduct == 0 {
 			go cygxService.YiDongUpdateActivityStatus(activityId)
@@ -1288,6 +1315,9 @@ func (this *ActivityCoAntroller) PublishAndCancel() {
 		go services.SendWxMsgWithCygxActivity(req.ActivityId)
 		//同步活动到最新数据表
 		//go cygxService.UpdateResourceData(req.ActivityId, "activity", "delete", "")
+		if activityInfo.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+			go services.SendWxCategoryMsgWithCygxActivity(req.ActivityId)
+		}
 	}
 	item.ActivityId = req.ActivityId
 	if item.PublishStatus == 1 {
@@ -1413,10 +1443,29 @@ func (this *ActivityCoAntroller) ChartPermissionListAct() {
 		br.Ret = 408
 		return
 	}
-	//数据库新加行业分类,与之前的项目权限部分冲突太多,故采用自定义而不去数据库查找
-	resp := new(cygx.ChartPermissionRepMoreList)
-	// 查研观向7.4-策略后面新增一个宏观
-	resp.List = cygxService.GetActChartPermissionList()
+
+	resp := new(cygx.ChartPermissionResp)
+	list, err := cygx.GetChartPermissionAll()
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取品种信息失败,Err:" + err.Error()
+		return
+	}
+
+	for _, v := range list {
+		if v.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN || v.PermissionName == utils.YAN_XUAN_KOU_DIAN_BAO_NAME {
+			continue
+		}
+		resp.List = append(resp.List, v)
+	}
+
+	// 查研观向7.4-新增一个宏观
+	macro := &cygx.ChartPermission{
+		ChartPermissionId: 1,
+		PermissionName:    "宏观",
+	}
+	resp.List = append(resp.List, macro)
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"

+ 5 - 0
controllers/cygx/activity_signup.go

@@ -939,6 +939,7 @@ func (this *ActivitySignupCoAntroller) SalonSignupEdit() {
 	//销售或后台管理员给用户添加报名之后,进行模版消息推送
 	if doFailType == 0 {
 		go cygxService.SendWxMsgWithCygxActivitySignUpBySell(itemsSendWxMsg)
+		go services.SendWxCategoryMsgWithCygxActivitySignUpBySell(itemsSendWxMsg)
 	}
 	//添加操作日志记录
 	br.Ret = 200
@@ -2055,6 +2056,7 @@ func (this *ActivitySignupCoAntroller) AddSignuUser() {
 	//销售或后台管理员给用户添加报名之后,进行模版消息推送
 	if len(itemsSendWxMsg) > 0 {
 		go cygxService.SendWxMsgWithCygxActivitySignUpBySell(itemsSendWxMsg)
+		go services.SendWxCategoryMsgWithCygxActivitySignUpBySell(itemsSendWxMsg)
 	}
 	if len(items) > 0 {
 		//1用户报名添加到处理研选扣点
@@ -2480,6 +2482,9 @@ func (this *ActivitySignupCoAntroller) SignupCancel() {
 		return
 	}
 	go cygxService.YanXuanActivityPointsBillSignupCancel(detail.ActivityId, detail.UserId, adminInfo.AdminId)
+	if activityInfo.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN{
+		go services.SendWxCategoryMsgWithYxActivityCancelSignUpBySell(detail.UserId, activityInfo.ActivityId)
+	}
 	//添加操作日志记录
 	br.IsAddLog = true
 	br.Ret = 200

+ 5 - 3
controllers/cygx/activity_special_trip.go

@@ -153,8 +153,9 @@ func (this *ActivitySpecialTripCoAntroller) AddUser() {
 			itemBill.ChartPermissionName = activityInfo.ChartPermissionName
 			itemBill.AdminId = AdminUser.AdminId
 
-			if activityInfo.ChartPermissionName == utils.CE_LUE_NAME || activityInfo.ChartPermissionName == utils.GU_SHOU_NAME {
-				//如果是策略、固收行业,把代扣行业信息放入流水表,取消报名的时候,返点使用
+			//if activityInfo.ChartPermissionName == utils.CE_LUE_NAME || activityInfo.ChartPermissionName == utils.GU_SHOU_NAME {
+			if utils.InArrayByStr(utils.ACTIVITY_SPECIAL_TRIP_PERMISSION_NAME_OTHER, activityInfo.ChartPermissionName) {
+				//如果是策略、固收、周期行业,把代扣行业信息放入流水表,取消报名的时候,返点使用
 				maxChartPermissionId, maxChartPermissionName, err := cygxService.GetSpecialBillMaxChartPermissionId(infoUser)
 				if err != nil {
 					br.Msg = "操作失败"
@@ -568,7 +569,8 @@ func (this *ActivitySpecialTripCoAntroller) TripCancel() {
 	itemBill.ChartPermissionName = activityInfo.ChartPermissionName
 	itemBill.AdminId = sysUser.AdminId
 
-	if activityInfo.ChartPermissionName == utils.CE_LUE_NAME || activityInfo.ChartPermissionName == utils.GU_SHOU_NAME {
+	//if activityInfo.ChartPermissionName == utils.CE_LUE_NAME || activityInfo.ChartPermissionName == utils.GU_SHOU_NAME {
+	if utils.InArrayByStr(utils.ACTIVITY_SPECIAL_TRIP_PERMISSION_NAME_OTHER, activityInfo.ChartPermissionName) {
 		//如果是策略、固收行业,把代扣行业信息放入流水表,取消报名的时候,返点使用
 		lastTripBill, err := cygx.GetCygxActivitySpecialTripBillLastDetialByActivityId(activityInfo.ActivityId, userId)
 		if err != nil {

+ 67 - 42
controllers/cygx/contract_allocation.go

@@ -507,6 +507,18 @@ func (this *ContractAllocationController) CompanyContracDetail() {
 		return
 	}
 
+	companyProduct, err := company.GetCompanyProductByCompanyIdAndProductId(contractItem.CompanyId, utils.COMPANY_PRODUCT_RAI_ID)
+	if err != nil {
+		br.Msg = "查询客户产品信息失败"
+		br.ErrMsg = "查询客户产品信息失败,Err:" + err.Error()
+		return
+	}
+
+	//判断客户是否是永续(X类试用客户)
+	if companyProduct.Status == utils.COMPANY_STATUS_FOREVER {
+		resp.IsXClass = true
+	}
+
 	//var contractPermissionList []*company.ContractPermissionList
 	//expMap := map[int]string{0: "(3w)", 1: "(5w)", 2: "(10w)"} // 买方研选价格
 	hasPermissions, e := company.GetCompanyContractPermissionByCompanyContractId(companyContractId)
@@ -538,7 +550,10 @@ func (this *ContractAllocationController) CompanyContracDetail() {
 		if match == nil {
 			continue
 		}
-
+		//研选订阅、研选扣点包 映射成买方研选
+		if n.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN || n.PermissionName == utils.YAN_XUAN_KOU_DIAN_BAO_NAME {
+			n.PermissionName = utils.CHART_PERMISSION_NAME_MAI_FANG_YANXUAN
+		}
 		mapPermissionNameHave[n.PermissionName] = true
 		// 买方研选(3w/5w/10w)
 		if n.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN {
@@ -547,7 +562,7 @@ func (this *ContractAllocationController) CompanyContracDetail() {
 			continue
 		}
 	}
-
+	fmt.Println(mapPermissionNameHave)
 	resp.Money = contractItem.Money / 10000
 	//有研选时,对研选套餐类型做文案处理
 	respItemYx := new(cygx.AllocationPermissionListResp)        // 研选订阅
@@ -633,14 +648,14 @@ func (this *ContractAllocationController) CompanyContracDetail() {
 			respItem.List = v
 			respList = append(respList, respItem)
 		}
-		//研选订阅
-		if respItemYx.ChartPermissionName != "" {
-			respList = append(respList, respItemYx)
-		}
-		//研选扣点
-		if respItemYxKouDian.ChartPermissionName != "" {
-			respList = append(respList, respItemYxKouDian)
-		}
+		////研选订阅
+		//if respItemYx.ChartPermissionName != "" {
+		//	respList = append(respList, respItemYx)
+		//}
+		////研选扣点
+		//if respItemYxKouDian.ChartPermissionName != "" {
+		//	respList = append(respList, respItemYxKouDian)
+		//}
 
 	} else {
 		listUser, err := cygx.GetCygxAllocationCompanyContractListById(companyContractId)
@@ -660,13 +675,13 @@ func (this *ContractAllocationController) CompanyContracDetail() {
 			item.ChartPermissionId = mapPermissionId[v.ChartPermissionName]
 			mapPermissionUser[v.ChartPermissionName] = append(mapPermissionUser[v.ChartPermissionName], item)
 		}
-		listPermission, err := cygx.GetCygxAllocationCompanyContractPermissionListById(companyContractId)
+		listPermissionContract, err := cygx.GetCygxAllocationCompanyContractPermissionListById(companyContractId)
 		if err != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取失败,GetCygxAllocationCompanyContractPermissionListById Err: " + err.Error()
 			return
 		}
-		for _, v := range listPermission {
+		for _, v := range listPermissionContract {
 			if showDetail && v.Money == 0 {
 				continue
 			}
@@ -687,7 +702,7 @@ func (this *ContractAllocationController) CompanyContracDetail() {
 		return
 	}
 
-	permissionNameArr := []string{"医药", "消费", "科技", "智造", "策略", utils.CHART_PERMISSION_NAME_MF_YANXUAN, utils.YAN_XUAN_KOU_DIAN_BAO_NAME}
+	permissionNameArr := []string{"医药", "消费", "科技", "智造", "策略", "固收", utils.CHART_PERMISSION_NAME_MAI_FANG_YANXUAN}
 	for _, v := range permissionNameArr {
 		for _, v2 := range respList {
 			if v2.ChartPermissionName == v {
@@ -753,6 +768,14 @@ func (this *ContractAllocationController) CompanyContracUpdate() {
 		br.ErrMsg = "获取合同信息失败,Err:" + err.Error()
 		return
 	}
+
+	companyProduct, err := company.GetCompanyProductByCompanyIdAndProductId(contractItem.CompanyId, utils.COMPANY_PRODUCT_RAI_ID)
+	if err != nil {
+		br.Msg = "查询客户产品信息失败"
+		br.ErrMsg = "查询客户产品信息失败,Err:" + err.Error()
+		return
+	}
+
 	money := contractItem.Money / 10000 // 合同金额,万为单位
 	var moneyAvg float64                // 行业所占合同的平均金额
 	hasPermissions, e := company.GetCompanyContractPermissionByCompanyContractId(companyContractId)
@@ -775,8 +798,8 @@ func (this *ContractAllocationController) CompanyContracUpdate() {
 	}
 	mapPermissionNameHave := make(map[string]bool) // 判断合同是否存在某一行业权限种类
 	for _, n := range raiPermissions {
-		//只计算,医药、消费、科技、智造、策略、买方研选的
-		if n.PermissionName != utils.YI_YAO_NAME && n.PermissionName != utils.XIAO_FEI_NAME && n.PermissionName != utils.KE_JI_NAME && n.PermissionName != utils.ZHI_ZAO_NAME && n.PermissionName != utils.CE_LUE_NAME && n.PermissionName != utils.CHART_PERMISSION_NAME_MF_YANXUAN {
+		//只计算,医药、消费、科技、智造、策略、固收、买方研选的
+		if n.PermissionName != utils.YI_YAO_NAME && n.PermissionName != utils.XIAO_FEI_NAME && n.PermissionName != utils.KE_JI_NAME && n.PermissionName != utils.ZHI_ZAO_NAME && n.PermissionName != utils.CE_LUE_NAME && n.PermissionName != utils.GU_SHOU_NAME && n.PermissionName != utils.CHART_PERMISSION_NAME_MAI_FANG_YANXUAN {
 			continue
 		}
 		match := hasMap[n.ChartPermissionId]
@@ -785,17 +808,18 @@ func (this *ContractAllocationController) CompanyContracUpdate() {
 		}
 
 		// 买方研选(3w/5w/10W)
-		if n.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN {
-			if match.ExpensiveYx == 1 {
-				money = money - 5
-			} else if match.ExpensiveYx == 2 {
-				money = money - 10
-			} else {
-				money = money - 3
-			}
-		} else {
-			mapPermissionNameHave[n.PermissionName] = true
-		}
+		//if n.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN {
+		//	if match.ExpensiveYx == 1 {
+		//		money = money - 5
+		//	} else if match.ExpensiveYx == 2 {
+		//		money = money - 10
+		//	} else {
+		//		money = money - 3
+		//	}
+		//} else {
+		//	mapPermissionNameHave[n.PermissionName] = true
+		//}
+		mapPermissionNameHave[n.PermissionName] = true
 	}
 
 	if len(mapPermissionNameHave) > 0 {
@@ -814,9 +838,9 @@ func (this *ContractAllocationController) CompanyContracUpdate() {
 		itemPermission.AdminName = sysUser.RealName
 		itemPermission.Proportion = v.Proportion
 		itemPermission.Money = v.Money
-		if v.ChartPermissionName != utils.CHART_PERMISSION_NAME_MF_YANXUAN {
+		if v.ChartPermissionName != utils.YAN_XUAN_KOU_DIAN_BAO_NAME {
 			itemPermission.MoneyAvg = moneyAvg
-			if v.Money < moneyAvg/2 {
+			if v.Money < moneyAvg/2 && companyProduct.Status == utils.COMPANY_STATUS_FOREVER { //永续客户不做这种限制
 				br.Msg = "单行业占比值不得低于平均值的一半"
 				br.ErrMsg = "单行业占比值不得低于平均值的一半,Err:" + fmt.Sprint(proportionSum)
 				return
@@ -829,7 +853,7 @@ func (this *ContractAllocationController) CompanyContracUpdate() {
 		var userProportionSum float64 // 校验前端传过来的占比使用
 
 		for _, v2 := range v.List {
-			if v2.Proportion < -20 {
+			if v2.Proportion < -20 && companyProduct.Status == utils.COMPANY_STATUS_FOREVER { //永续客户不做这种限制
 				br.Msg = "研究员占比值不得小于总额的-20%"
 				br.ErrMsg = "研究员占比值不得小于总额的20%,Err:" + fmt.Sprint(proportionSum)
 				return
@@ -986,19 +1010,20 @@ func (this *ContractAllocationController) CompanyContractStatistics() {
 		}
 		for _, v := range allocationCompanyContractList {
 
-			if v.Proportion != 0 && v.ChartPermissionName != utils.CHART_PERMISSION_NAME_MF_YANXUAN {
-				mapUserAllocation[v.RealName] += 1
-				mapUserMoney[v.RealName] += v.Money
-				mapPermissionAllocation[v.ChartPermissionName] += 1
-				mapPermissionMoney[v.ChartPermissionName] += v.Money
-				totalMoney += v.Money
-				companyContractIdBool[v.CompanyContractId] = true
-				//统计单个行业所关的合同数量
-				if !mapPermissionContractKey[fmt.Sprint("ChartPermissionName_", v.ChartPermissionName, "CompanyContractId_", v.CompanyContractId)] {
-					mapPermissionContract[v.ChartPermissionName] += 1
-					mapPermissionContractKey[fmt.Sprint("ChartPermissionName_", v.ChartPermissionName, "CompanyContractId_", v.CompanyContractId)] = true
-				}
+			//if v.Proportion != 0 && v.ChartPermissionName != utils.CHART_PERMISSION_NAME_MF_YANXUAN {
+			mapUserAllocation[v.RealName] += 1
+			mapUserMoney[v.RealName] += v.Money
+			mapPermissionAllocation[v.ChartPermissionName] += 1
+			mapPermissionMoney[v.ChartPermissionName] += v.Money
+			totalMoney += v.Money
+			companyContractIdBool[v.CompanyContractId] = true
+			//统计单个行业所关的合同数量
+			if !mapPermissionContractKey[fmt.Sprint("ChartPermissionName_", v.ChartPermissionName, "CompanyContractId_", v.CompanyContractId)] {
+				mapPermissionContract[v.ChartPermissionName] += 1
+				mapPermissionContractKey[fmt.Sprint("ChartPermissionName_", v.ChartPermissionName, "CompanyContractId_", v.CompanyContractId)] = true
 			}
+			//dd = decimal.NewFromFloat(v.Money).Add(dd)
+			//}
 		}
 		for _, v := range allocationCompanyContractPermissionList {
 			mapPermissionMoneyAvg[v.ChartPermissionName] += v.MoneyAvg
@@ -1097,7 +1122,7 @@ func (this *ContractAllocationController) CompanyContractStatistics() {
 	}
 
 	var list []*cygx.AllocationPermissionStatisticsListResp
-	permissionNameArr := []string{"医药", "消费", "科技", "智造", "策略"}
+	permissionNameArr := []string{"医药", "消费", "科技", "智造", "策略", "固收", "买方研选"}
 	for _, v := range permissionNameArr {
 		item := new(cygx.AllocationPermissionStatisticsListResp)
 		item.ChartPermissionName = v

+ 1541 - 0
controllers/cygx/enter_score.go

@@ -0,0 +1,1541 @@
+package cygx
+
+import (
+	"encoding/json"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"github.com/tealeg/xlsx"
+	"hongze/hz_crm_api/controllers"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/company"
+	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/models/system"
+	cygxService "hongze/hz_crm_api/services/cygx"
+	"hongze/hz_crm_api/utils"
+	"os"
+	"path/filepath"
+	"strings"
+	"time"
+)
+
+// X类客户录分模块
+type EnterScoreController struct {
+	controllers.BaseAuthController
+}
+
+// @Title X试用类客户检索
+// @Description X试用类客户检索接口
+// @Param   KeyWord   query   string  true       "搜索关键词"
+// @Success 200 {object} company.CompanyNameAndIdListResp
+// @router /enterScore/company/searchlist [get]
+func (this *EnterScoreController) CompanySearchList() {
+	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")
+	keyWord = strings.Trim(keyWord, " ")
+	keyWord = strings.Replace(keyWord, "'", "", -1)
+
+	resp := new(company.CompanyNameAndIdListResp)
+	var companyCondition string
+	var companypars []interface{}
+	var listResp []*company.CompanyNameAndId
+	companyCondition += ` AND b.product_name = ? `
+	companypars = append(companypars, "权益")
+	companyCondition += ` AND b.status = ? `
+	companypars = append(companypars, "永续")
+
+	if keyWord != "" {
+		companyCondition += ` AND a.company_name LIKE '%` + keyWord + `%' `
+	}
+
+	//权益申请销售只能看到自己名下的客户的申请
+	companyIds, err := cygxService.GetAdminLookUserCompanyIdsBySelf(sysUser)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,GetAdminLookUserCompanyIds Err:" + err.Error()
+		return
+	}
+	lencompanyIds := len(companyIds)
+	if lencompanyIds > 0 {
+		companyCondition += ` AND a.company_id IN (` + utils.GetOrmInReplace(lencompanyIds) + `)`
+		companypars = append(companypars, companyIds)
+	}
+
+	companyList, err := company.GetCompanyIdListByproductName(companyCondition, companypars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	if len(companyList) == 0 {
+		listResp = make([]*company.CompanyNameAndId, 0)
+	} else {
+		listResp = companyList
+	}
+	resp.List = listResp
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title  详情
+// @Description 获取详情接口
+// @Param   EnterScoreId   query   int  true       "录分ID"
+// @Success Ret=200 {object} cygx.CygxEnterScoreDetailResp
+// @router /enterScore/detail [get]
+func (this *EnterScoreController) EnterScoreDetail() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	AdminUser := this.SysUser
+	if AdminUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+
+	enterScoreId, _ := this.GetInt("EnterScoreId")
+	resp := new(cygx.CygxEnterScoreDetailResp)
+	var itemslistPermission []*cygx.EnterScorePermissionListResp       // 权益行业
+	var itemsFicclistPermission []*cygx.EnterScorePermissionListResp   // FICC行业
+	mapRaiUser := make(map[string][]*cygx.EnterScoreRealNameListResp)  //权益研究员
+	mapFiccUser := make(map[string][]*cygx.EnterScoreRealNameListResp) // FICC研究员
+	var itemsGroup []*cygx.EnterScoreGroupListResp                     //自定义分组
+	if enterScoreId == 0 {
+		//权益研究员
+		sysUserList, err := cygx.GetAskEmailList()
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetAskEmailList Err: " + err.Error()
+			return
+		}
+
+		for _, v := range sysUserList {
+			item := new(cygx.EnterScoreRealNameListResp)
+			item.RealName = v.Name
+			item.ChartPermissionName = v.ChartPermissionName
+			mapRaiUser[v.ChartPermissionName] = append(mapRaiUser[v.ChartPermissionName], item)
+		}
+
+		listPermission, err := cygx.GetChartPermissionAll()
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取品种信息失败,Err:" + err.Error()
+			return
+		}
+
+		permissionNameArr := []string{"医药", "消费", "科技", "智造", "策略", "固收"}
+		for _, v := range listPermission {
+			if !utils.InArrayByStr(permissionNameArr, v.PermissionName) {
+				continue
+			}
+			item := new(cygx.EnterScorePermissionListResp)
+			item.ChartPermissionName = v.PermissionName
+			if len(mapRaiUser[v.PermissionName]) == 0 {
+				item.List = make([]*cygx.EnterScoreRealNameListResp, 0)
+			} else {
+				item.List = mapRaiUser[v.PermissionName]
+			}
+			itemslistPermission = append(itemslistPermission, item)
+		}
+		resp.EnterScoreObj.ListRai = itemslistPermission
+
+		//ficc 研究员
+		ficcUserList, err := system.GetFiccEnterScoreAdmin()
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetFiccEnterScoreAdmin Err: " + err.Error()
+			return
+		}
+
+		for _, v := range ficcUserList {
+			item := new(cygx.EnterScoreRealNameListResp)
+			item.RealName = v.RealName
+			item.ChartPermissionName = v.GroupName
+			mapFiccUser[v.GroupName] = append(mapFiccUser[v.GroupName], item)
+		}
+
+		permissionFiccNameArr := []string{"宏观组", "建材组", "有色组", "能化组"}
+		for _, v := range permissionFiccNameArr {
+			item := new(cygx.EnterScorePermissionListResp)
+			item.ChartPermissionName = v
+			if len(mapFiccUser[v]) == 0 {
+				item.List = make([]*cygx.EnterScoreRealNameListResp, 0)
+			} else {
+				item.List = mapFiccUser[v]
+			}
+			itemsFicclistPermission = append(itemsFicclistPermission, item)
+		}
+		resp.EnterScoreObj.ListFicc = itemsFicclistPermission
+
+		groupNameArr := []string{"销售分", "专题分", "专家分", "云图大拓", "艾摩宏观"}
+		for _, v := range groupNameArr {
+			item := new(cygx.EnterScoreGroupListResp)
+			item.GroupName = v
+			itemsGroup = append(itemsGroup, item)
+		}
+		resp.EnterScoreObj.ListGroup = itemsGroup
+		resp.PercentageObj = resp.EnterScoreObj
+		resp.EnterScoreType = 1
+		resp.Quarter = make([]string, 0)
+	} else {
+		//初始化数据,方便前端渲染
+		var itemslistPermissionInit []*cygx.EnterScorePermissionListResp       // 权益行业
+		var itemsFicclistPermissionInit []*cygx.EnterScorePermissionListResp   // FICC行业
+		var itemsGroupInit []*cygx.EnterScoreGroupListResp                     //自定义分组
+		mapRaiUserInit := make(map[string][]*cygx.EnterScoreRealNameListResp)  //权益研究员
+		mapFiccUserInit := make(map[string][]*cygx.EnterScoreRealNameListResp) // FICC研究员
+
+		enterScoreDetail, err := cygx.GetCygxEnterScoreInfoById(enterScoreId)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetCygxEnterScoreInfoById Err: " + err.Error()
+			return
+		}
+
+		resp.EnterScoreId = enterScoreDetail.EnterScoreId
+		resp.CompanyId = enterScoreDetail.CompanyId
+		resp.CompanyName = enterScoreDetail.CompanyName
+		resp.StartDate = enterScoreDetail.StartDate
+		resp.EndDate = enterScoreDetail.EndDate
+		resp.Quarter = strings.Split(enterScoreDetail.Quarter, ",")
+		resp.EnterScoreType = enterScoreDetail.EnterScoreType
+		resp.Ranking = enterScoreDetail.Ranking
+		resp.IsMergeScoring = enterScoreDetail.IsMergeScoring
+		resp.SecuritiesFirmsName = enterScoreDetail.SecuritiesFirmsName
+		resp.MergeProportion = enterScoreDetail.MergeProportion
+		resp.ProportionTotal = enterScoreDetail.ProportionTotal
+		resp.RaiProportionTotal = enterScoreDetail.RaiProportionTotal
+		resp.FiccProportionTotal = enterScoreDetail.FiccProportionTotal
+
+		listResearcher, err := cygx.GeCygxEnterScoreResearcherListById(enterScoreId)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GeCygxEnterScoreResearcherListById Err: " + err.Error()
+			return
+		}
+		for _, v := range listResearcher {
+			item := new(cygx.EnterScoreRealNameListResp)
+			item.RealName = v.RealName
+			item.ChartPermissionName = v.ChartPermissionName
+			item.Proportion = v.Proportion
+			if v.ProductId == utils.COMPANY_PRODUCT_RAI_ID {
+				mapRaiUser[v.ChartPermissionName] = append(mapRaiUser[v.ChartPermissionName], item)
+			} else {
+				mapFiccUser[v.ChartPermissionName] = append(mapFiccUser[v.ChartPermissionName], item)
+			}
+		}
+
+		for _, v := range listResearcher {
+			item := new(cygx.EnterScoreRealNameListResp)
+			item.RealName = v.RealName
+			item.ChartPermissionName = v.ChartPermissionName
+			if v.ProductId == utils.COMPANY_PRODUCT_RAI_ID {
+				mapRaiUserInit[v.ChartPermissionName] = append(mapRaiUserInit[v.ChartPermissionName], item)
+			} else {
+				mapFiccUserInit[v.ChartPermissionName] = append(mapFiccUserInit[v.ChartPermissionName], item)
+			}
+		}
+
+		listPermission, err := cygx.GetCygxEnterScorePermissionListById(enterScoreId)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetCygxEnterScorePermissionListById Err: " + err.Error()
+			return
+		}
+		for _, v := range listPermission {
+			item := new(cygx.EnterScorePermissionListResp)
+			item.ChartPermissionName = v.ChartPermissionName
+			item.Proportion = v.Proportion
+			if v.ProductId == utils.COMPANY_PRODUCT_RAI_ID {
+				item.List = mapRaiUser[v.ChartPermissionName]
+				itemslistPermission = append(itemslistPermission, item)
+			} else {
+				item.List = mapFiccUser[v.ChartPermissionName]
+				itemsFicclistPermission = append(itemsFicclistPermission, item)
+			}
+		}
+
+		for _, v := range listPermission {
+			item := new(cygx.EnterScorePermissionListResp)
+			item.ChartPermissionName = v.ChartPermissionName
+			if v.ProductId == utils.COMPANY_PRODUCT_RAI_ID {
+				item.List = mapRaiUserInit[v.ChartPermissionName]
+				itemslistPermissionInit = append(itemslistPermissionInit, item)
+			} else {
+				item.List = mapFiccUserInit[v.ChartPermissionName]
+				itemsFicclistPermissionInit = append(itemsFicclistPermissionInit, item)
+			}
+		}
+
+		listGroup, err := cygx.GeCygxEnterScoreGroupListById(enterScoreId)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GeCygxEnterScoreGroupListById Err: " + err.Error()
+			return
+		}
+		for _, v := range listGroup {
+			item := new(cygx.EnterScoreGroupListResp)
+			item.GroupName = v.GroupName
+			item.Proportion = v.Proportion
+			itemsGroup = append(itemsGroup, item)
+		}
+
+		for _, v := range listGroup {
+			item := new(cygx.EnterScoreGroupListResp)
+			item.GroupName = v.GroupName
+			itemsGroupInit = append(itemsGroupInit, item)
+		}
+
+		if enterScoreDetail.EnterScoreType == 1 {
+			resp.EnterScoreObj.ListGroup = itemsGroup
+			resp.EnterScoreObj.ListRai = itemslistPermission
+			resp.EnterScoreObj.ListFicc = itemsFicclistPermission
+
+			resp.PercentageObj.ListGroup = itemsGroupInit
+			resp.PercentageObj.ListRai = itemslistPermissionInit
+			resp.PercentageObj.ListFicc = itemsFicclistPermissionInit
+		} else {
+			resp.PercentageObj.ListGroup = itemsGroup
+			resp.PercentageObj.ListRai = itemslistPermission
+			resp.PercentageObj.ListFicc = itemsFicclistPermission
+
+			resp.EnterScoreObj.ListGroup = itemsGroupInit
+			resp.EnterScoreObj.ListRai = itemslistPermissionInit
+			resp.EnterScoreObj.ListFicc = itemsFicclistPermissionInit
+		}
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 更新录分
+// @Description 更新录分接口
+// @Param	request	body cygx.UpdateEnterScoreReq true "type json string"
+// @Success 200 {object} "保存成功"
+// @router /enterScore/update [post]
+func (this *EnterScoreController) EnterScoreUpdate() {
+	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.UpdateEnterScoreReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	enterScoreId := req.EnterScoreId
+	companyId := req.CompanyId
+	if companyId == 0 {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误,companyId不可为空"
+		return
+	}
+
+	startDate := req.StartDate
+	endDate := req.EndDate
+	if startDate == "" || endDate == "" {
+		br.Msg = "请选择季度信息"
+		return
+	}
+
+	companyProduct, err := company.GetCompanyProductByCompanyIdAndProductId(companyId, utils.COMPANY_PRODUCT_RAI_ID)
+	if err != nil {
+		br.Msg = "查询客户产品信息失败"
+		br.ErrMsg = "查询客户产品信息失败,Err:" + err.Error()
+		return
+	}
+
+	item := new(cygx.CygxEnterScore)
+	item.EnterScoreId = enterScoreId
+	item.CompanyId = companyId
+	item.CompanyName = req.CompanyName
+	item.StartDate = req.StartDate
+	item.EndDate = req.EndDate
+	item.Quarter = strings.Join(req.Quarter, ",")
+
+	quarterDate, err := utils.GetQuarterStartDatesInRange(req.StartDate, req.EndDate)
+	if err != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取对应季度信息失败,Err:" + err.Error()
+		return
+	}
+
+	item.QuarterDate = strings.Join(quarterDate, ",")
+
+	item.EnterScoreType = req.EnterScoreType
+	item.Ranking = req.Ranking
+	item.IsMergeScoring = req.IsMergeScoring
+	item.SecuritiesFirmsName = req.SecuritiesFirmsName
+	item.MergeProportion = req.MergeProportion
+	item.RaiProportionTotal = req.RaiProportionTotal
+	item.FiccProportionTotal = req.FiccProportionTotal
+	item.ProportionTotal = req.ProportionTotal
+	item.SellerId = companyProduct.SellerId
+	item.SellerName = companyProduct.SellerName
+	item.AdminId = sysUser.AdminId
+	item.AdminName = sysUser.RealName
+	item.CreateTime = time.Now()
+	item.ModifyTime = time.Now()
+
+	var itemsPermission []*cygx.CygxEnterScorePermission //行业数组
+	var itemsResearcher []*cygx.CygxEnterScoreResearcher //研究员数组
+	var itemsGroup []*cygx.CygxEnterScoreGroup           //自定义分组
+	listRai := req.ListRai
+	listFicc := req.ListFicc
+	listGroup := req.ListGroup
+
+	for _, v := range listRai { // 权益数据
+		itemPermission := new(cygx.CygxEnterScorePermission)
+		itemPermission.ChartPermissionName = v.ChartPermissionName
+		itemPermission.Proportion = v.Proportion
+		itemPermission.EnterScoreId = v.EnterScoreId
+		itemPermission.CompanyId = companyId
+		itemPermission.AdminId = sysUser.AdminId
+		itemPermission.AdminName = sysUser.RealName
+		itemPermission.ProductId = utils.COMPANY_PRODUCT_RAI_ID
+		itemPermission.CreateTime = time.Now()
+		itemPermission.ModifyTime = time.Now()
+		itemsPermission = append(itemsPermission, itemPermission)
+		for _, vResearcher := range v.List {
+			itemResearcher := new(cygx.CygxEnterScoreResearcher)
+			itemResearcher.ChartPermissionName = v.ChartPermissionName
+			itemResearcher.EnterScoreId = v.EnterScoreId
+			itemResearcher.CompanyId = companyId
+			itemResearcher.RealName = vResearcher.RealName
+			itemResearcher.Proportion = vResearcher.Proportion
+			itemResearcher.AdminId = sysUser.AdminId
+			itemResearcher.AdminName = sysUser.RealName
+			itemResearcher.ProductId = utils.COMPANY_PRODUCT_RAI_ID
+			itemResearcher.CreateTime = time.Now()
+			itemResearcher.ModifyTime = time.Now()
+			itemsResearcher = append(itemsResearcher, itemResearcher)
+		}
+	}
+
+	for _, v := range listFicc { // FICC数据
+		itemPermission := new(cygx.CygxEnterScorePermission)
+		itemPermission.ChartPermissionName = v.ChartPermissionName
+		itemPermission.Proportion = v.Proportion
+		itemPermission.EnterScoreId = v.EnterScoreId
+		itemPermission.CompanyId = companyId
+		itemPermission.AdminId = sysUser.AdminId
+		itemPermission.AdminName = sysUser.RealName
+		itemPermission.ProductId = utils.COMPANY_PRODUCT_FICC_ID
+		itemPermission.CreateTime = time.Now()
+		itemPermission.ModifyTime = time.Now()
+		itemsPermission = append(itemsPermission, itemPermission)
+		for _, vResearcher := range v.List {
+			itemResearcher := new(cygx.CygxEnterScoreResearcher)
+			itemResearcher.ChartPermissionName = v.ChartPermissionName
+			itemResearcher.EnterScoreId = v.EnterScoreId
+			itemResearcher.CompanyId = companyId
+			itemResearcher.RealName = vResearcher.RealName
+			itemResearcher.Proportion = vResearcher.Proportion
+			itemResearcher.AdminId = sysUser.AdminId
+			itemResearcher.AdminName = sysUser.RealName
+			itemResearcher.ProductId = utils.COMPANY_PRODUCT_FICC_ID
+			itemResearcher.CreateTime = time.Now()
+			itemResearcher.ModifyTime = time.Now()
+			itemsResearcher = append(itemsResearcher, itemResearcher)
+		}
+	}
+
+	for _, v := range listGroup {
+		itemGroup := new(cygx.CygxEnterScoreGroup)
+		itemGroup.GroupName = v.GroupName
+		itemGroup.Proportion = v.Proportion
+		itemGroup.CompanyId = companyId
+		itemGroup.AdminId = sysUser.AdminId
+		itemGroup.AdminName = sysUser.RealName
+		itemGroup.CreateTime = time.Now()
+		itemGroup.ModifyTime = time.Now()
+		itemsGroup = append(itemsGroup, itemGroup)
+	}
+
+	if enterScoreId == 0 { // 新增
+		err = cygx.AddCygxEnterScore(item, itemsPermission, itemsResearcher, itemsGroup)
+	} else { // 修改
+		item.EnterScoreId = enterScoreId
+		err = cygx.UpdateCygxEnterScore(item, itemsPermission, itemsResearcher, itemsGroup)
+	}
+	if err != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "操作失败Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.IsAddLog = true
+	br.Msg = "操作成功"
+}
+
+// @Title 列表
+// @Description 列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   KeyWord   query   string  true       "搜索关键词"
+// @Param   CompanyName   query   string  true       "客户名称"
+// @Param   AdminId   query   string  true       "销售id,多个用英文逗号隔开,空字符串为全部"
+// @Param   IsExport   query   bool  false       "是否导出excel,默认是false"
+// @Success 200 {object} cygx.GetCygxEnterScoreListRep
+// @router /enterScore/list [get]
+func (this *EnterScoreController) EnterScoreList() {
+	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")
+	keyWord := this.GetString("KeyWord")
+	adminId := this.GetString("AdminId")
+	//是否导出报表
+	isExport, _ := this.GetBool("IsExport")
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	fmt.Println(isExport)
+	startSize = utils.StartIndex(currentIndex, pageSize)
+	if isExport {
+		startSize = 0
+		pageSize = 9999
+	}
+	var condition string
+	var pars []interface{}
+	//如果不是权益管理员和admin,就做可见权限限制
+	if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_RAI_ADMIN && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN {
+		var conditionAdmin string
+		var parsAdmin []interface{}
+		conditionAdmin = "  AND product_id = 2  AND   status = '永续'  AND seller_id =  ?  "
+		parsAdmin = append(parsAdmin, sysUser.AdminId)
+		listProduct, err := company.GetCompanyProductList(conditionAdmin, parsAdmin)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		var companyIds []int
+		for _, v := range listProduct {
+			companyIds = append(companyIds, v.CompanyId)
+		}
+		companyIds = append(companyIds, 0)
+		condition += ` AND company_id  IN (` + utils.GetOrmInReplace(len(companyIds)) + `) `
+		pars = append(pars, companyIds)
+	}
+
+	if keyWord != "" {
+		condition += ` AND company_name LIKE '%` + keyWord + `%' `
+	}
+	if adminId != "" {
+		condition += ` AND seller_id IN (` + adminId + `) `
+	}
+	total, err := cygx.GetCygxEnterScoreCount(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	list, err := cygx.GetCygxEnterScoreList(condition, pars, startSize, pageSize)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	resp := new(cygx.GetCygxEnterScoreListRep)
+	if len(list) == 0 {
+		resp.List = make([]*cygx.EnterScoreListResp, 0)
+	} else {
+		for _, v := range list {
+			item := new(cygx.EnterScoreListResp)
+			item.EnterScoreId = v.EnterScoreId
+			item.CompanyId = v.CompanyId
+			item.CompanyName = v.CompanyName
+			item.Quarter = strings.Split(v.Quarter, ",")
+			item.EnterScoreType = v.EnterScoreType
+			item.Ranking = v.Ranking
+			item.IsMergeScoring = v.IsMergeScoring
+			item.SecuritiesFirmsName = v.SecuritiesFirmsName
+			item.ProportionTotal = v.ProportionTotal
+			item.EnterScoreId = v.EnterScoreId
+			item.SellerId = v.SellerId
+			item.SellerName = v.SellerName
+			item.CreateTime = v.CreateTime.Format(utils.FormatDateTime)
+			item.ModifyTime = v.ModifyTime.Format(utils.FormatDateTime)
+			resp.List = append(resp.List, item)
+		}
+	}
+	//导出excel
+	if isExport {
+		EnterScoreScoreListExport(this, resp, 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 EnterScoreScoreListExport(this *EnterScoreController, resp *cygx.GetCygxEnterScoreListRep, br *models.BaseResponse) {
+	dir, err := os.Executable()
+	exPath := filepath.Dir(dir)
+	downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
+	xlsxFile := xlsx.NewFile()
+	if err != nil {
+		br.Msg = "生成文件失败"
+		br.ErrMsg = "生成文件失败"
+		return
+	}
+	style := xlsx.NewStyle()
+	alignment := xlsx.Alignment{
+		Horizontal: "center",
+		Vertical:   "center",
+		WrapText:   true,
+	}
+
+	style.Alignment = alignment
+	style.ApplyAlignment = true
+
+	sheel, err := xlsxFile.AddSheet("录分记录")
+	if err != nil {
+		br.Msg = "新增Sheet失败"
+		br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
+		return
+	}
+	sheel.SetColWidth(0, 0, 30)
+	sheel.SetColWidth(1, 1, 15)
+	sheel.SetColWidth(2, 2, 15)
+	sheel.SetColWidth(3, 3, 18)
+
+	titleRow := sheel.AddRow()
+
+	cellA := titleRow.AddCell()
+	cellA.SetStyle(style)
+	cellA.SetValue("客户名称")
+
+	cellB := titleRow.AddCell()
+	cellB.SetStyle(style)
+	cellB.SetValue("销售")
+
+	cellC := titleRow.AddCell()
+	cellC.SetStyle(style)
+	cellC.SetValue("季度")
+
+	cellD := titleRow.AddCell()
+	cellD.SetStyle(style)
+	cellD.SetValue("总分")
+
+	cellE := titleRow.AddCell()
+	cellE.SetStyle(style)
+	cellE.SetValue("排名")
+
+	cellF := titleRow.AddCell()
+	cellF.SetStyle(style)
+	cellF.SetValue("合并打分")
+
+	cellG := titleRow.AddCell()
+	cellG.SetStyle(style)
+	cellG.SetValue("券商名称")
+
+	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.SellerName)
+
+		cellC := dataRow.AddCell()
+		cellC.SetStyle(style)
+		cellC.SetValue(strings.Join(v.Quarter, ","))
+
+		cellD := dataRow.AddCell()
+		cellD.SetStyle(style)
+		cellD.SetValue(v.ProportionTotal)
+
+		cellE := dataRow.AddCell()
+		cellE.SetStyle(style)
+		cellE.SetValue(v.Ranking)
+
+		cellF := dataRow.AddCell()
+		cellF.SetStyle(style)
+		if v.IsMergeScoring == 1 {
+			cellF.SetValue("是")
+		} else {
+			cellF.SetValue("否")
+		}
+
+		cellG := dataRow.AddCell()
+		cellG.SetStyle(style)
+		cellG.SetValue(v.SecuritiesFirmsName)
+
+	}
+	err = xlsxFile.Save(downLoadnFilePath)
+	if err != nil {
+		br.Msg = "保存文件失败"
+		br.ErrMsg = "保存文件失败"
+		return
+	}
+	randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
+	downloadFileName := "录分记录导出数据_" + randStr + ".xlsx"
+	this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
+	defer func() {
+		os.Remove(downLoadnFilePath)
+	}()
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "导出成功"
+}
+
+// @Title 删除录分
+// @Description 删除录分接口
+// @Param	request	body cygx.UpdateEnterScoreReq true "type json string"
+// @Success 200 {object} "保存成功"
+// @router /enterScore/delete [post]
+func (this *EnterScoreController) EnterScoreDelete() {
+	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.EnterScoreIdReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	enterScoreId := req.EnterScoreId
+	if enterScoreId == 0 {
+		br.Msg = "参数错误!"
+		br.ErrMsg = "参数错误,EnterScoreId 不能为0"
+		return
+	}
+	err = cygx.DeleteEnterScore(enterScoreId)
+	if err != nil {
+		br.Msg = "删除失败"
+		br.ErrMsg = "操作失败Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.IsAddLog = true
+	br.Msg = "删除成功"
+}
+
+// @Title  评分总览
+// @Description 评分总览接口
+// @Param   KeyWord   query   string  true       "搜索关键词"
+// @Param   City   query   string  true       "城市"
+// @Param   StartDate   query   string  false       "开始日期"
+// @Param   EndDate   query   string  false       "结束日期"
+// @Param   EnterScoreType   query   string  false       "展示法方式 1:按评分录入、2:按比例录入,默认1"
+// @Param   IsExport   query   bool  false       "是否导出excel,默认是false"
+// @Success Ret=200 {object} cygx.ScoreOverviewListResp
+// @router /enterScore/scoreOverview [get]
+func (this *EnterScoreController) EnterScoreScoreOverview() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	AdminUser := this.SysUser
+	if AdminUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	resp := new(cygx.ScoreOverviewListResp)
+	keyWord := this.GetString("KeyWord")
+	city := this.GetString("City")
+	enterScoreType, _ := this.GetInt("EnterScoreType", 1)
+	startDate := this.GetString("StartDate")
+	endDate := this.GetString("EndDate")
+	//是否导出报表
+	isExport, _ := this.GetBool("IsExport")
+	if startDate == "" {
+		br.Msg = "请选择对应年份与季度"
+		return
+	}
+
+	var companyCondition string
+	var companypars []interface{}
+	companyCondition += ` AND b.product_name = ? `
+	companypars = append(companypars, "权益")
+	companyCondition += ` AND b.status = ? `
+	companypars = append(companypars, "永续")
+
+	if city != "" {
+		//传过来多个城市的时候的筛选
+		citySlice := strings.Split(city, ",")
+		city = strings.Join(citySlice, "','")
+		city = "'" + city + "'"
+		companyCondition += ` AND a.city  IN  (` + city + `) `
+	}
+
+	//权益申请销售只能看到自己名下的客户的申请
+	companyIds, err := cygxService.GetAdminLookUserCompanyIdsBySelf(AdminUser)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,GetAdminLookUserCompanyIds Err:" + err.Error()
+		return
+	}
+
+	var newcompanyIds []int
+	var searchcompanyIds []int
+	//如果机构搜索做了限制 ,那么公司列表的纵向展示也做限制
+	if keyWord != "" {
+		listSearchCompany, err := cygx.GetCygxEnterScoreListBySecuritiesFirmsName(keyWord)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		if len(listSearchCompany) > 0 {
+			for _, v := range listSearchCompany {
+				searchcompanyIds = append(searchcompanyIds, v.CompanyId)
+			}
+		} else {
+			searchcompanyIds = append(searchcompanyIds, 0)
+		}
+
+		if len(companyIds) > 0 {
+			newcompanyIds = utils.IntersectInt(searchcompanyIds, companyIds) //获取销售可见权限,与搜索权限的交集
+		} else {
+			newcompanyIds = searchcompanyIds
+		}
+	} else {
+		newcompanyIds = companyIds
+	}
+
+	newlencompanyIds := len(newcompanyIds)
+	if newlencompanyIds > 0 {
+		companyCondition += ` AND a.company_id IN (` + utils.GetOrmInReplace(newlencompanyIds) + `)`
+		companypars = append(companypars, newcompanyIds)
+	}
+	companyList, err := company.GetCompanyIdListByproductName(companyCondition, companypars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	var condition string
+	var pars []interface{}
+	if endDate != "" {
+		condition += ` AND start_date <= ? AND end_date >= ? `
+		pars = append(pars, startDate, endDate)
+	}
+
+	//if enterScoreType == 2 {
+	//condition += ` AND enter_score_type = 2 `
+	//}
+
+	if keyWord != "" {
+		condition += ` AND securities_firms_name LIKE '%` + keyWord + `%' `
+	}
+
+	if newlencompanyIds > 0 {
+		condition += ` AND company_id IN (` + utils.GetOrmInReplace(newlencompanyIds) + `)`
+		pars = append(pars, newcompanyIds)
+	}
+
+	total, err := cygx.GetCygxEnterScoreCount(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	if total > 0 {
+		list, err := cygx.GetCygxEnterScoreList(condition, pars, 0, 100)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetCygxEnterScoreListErr:" + err.Error()
+			return
+		}
+		mapenterScoreTypeCompanyIds := make(map[int]bool)
+		mapenterScoreProportionTotal := make(map[int]float64)
+		var enterScoreIds []int
+		mapenterScore := make(map[int]*cygx.CygxEnterScore) //录分详情放在map中
+		for _, v := range list {
+			mapenterScore[v.CompanyId] = v
+			mapenterScoreProportionTotal[v.CompanyId] = v.ProportionTotal
+			enterScoreIds = append(enterScoreIds, v.EnterScoreId)
+			if v.EnterScoreType == 2 {
+				mapenterScoreTypeCompanyIds[v.CompanyId] = true //记录按照百分比录入的公司
+			}
+		}
+		//fmt.Println(enterScoreIds)
+		listResearcher, err := cygx.GeCygxEnterScoreResearcherListByIds(enterScoreIds, newcompanyIds) //获取所有的研究员
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetCygxEnterScorePermissionListByIds Err:" + err.Error()
+			return
+		}
+		mapResearcher := make(map[string][]*cygx.EnterScoreRealNameListResp)
+		mapResearcherProportion := make(map[string]string)
+		//mapResearcherPermission := make(map[string][]map[string]string)
+		var researcherArr []string // 会出现的研究员姓名
+		mapResearcherbool := make(map[string]bool)
+		for _, v := range listResearcher {
+			if v.Proportion == 0 {
+				continue
+			}
+
+			if !mapResearcherbool[v.RealName] {
+				researcherArr = append(researcherArr, v.RealName)
+				mapResearcherbool[v.RealName] = true
+			}
+
+			if enterScoreType == 2 && !mapenterScoreTypeCompanyIds[v.CompanyId] {
+				mapResearcherProportion[fmt.Sprint(v.RealName, "_", v.CompanyId)] = utils.SubFloatToString(v.Proportion/mapenterScoreProportionTotal[v.CompanyId]*100, 2) //研究员姓名、公司ID,占比值对应关系绑定
+			} else {
+				mapResearcherProportion[fmt.Sprint(v.RealName, "_", v.CompanyId)] = fmt.Sprint(v.Proportion) //研究员姓名、公司ID,占比值对应关系绑定
+			}
+
+		}
+
+		mapResearcherProportionText := make(map[string][]string)
+		for _, vC := range companyList {
+			for _, vR := range researcherArr {
+				var proportionText string
+				if mapResearcherProportion[fmt.Sprint(vR, "_", vC.CompanyId)] != "" {
+					proportionText = mapResearcherProportion[fmt.Sprint(vR, "_", vC.CompanyId)]
+				} else {
+					if mapenterScoreProportionTotal[vC.CompanyId] > 0 {
+						proportionText = "0"
+					} else {
+						proportionText = ""
+					}
+				}
+				//0与空的展示逻辑处理
+				if mapenterScoreTypeCompanyIds[vC.CompanyId] || enterScoreType == 2 { //按照百分比展示的拼接 %
+					if proportionText != "" {
+						proportionText += "%"
+					}
+				}
+				mapResearcherProportionText[vR] = append(mapResearcherProportionText[vR], proportionText)
+			}
+		}
+
+		researcherArr = make([]string, 0)
+		for _, v := range listResearcher {
+			if v.Proportion == 0 {
+				continue
+			}
+			if utils.InArrayByStr(researcherArr, v.RealName) { //避免重复合并到数组
+				continue
+			}
+			item := new(cygx.EnterScoreRealNameListResp) // 研究员结构体数据
+			item.RealName = v.RealName
+			item.ChartPermissionName = v.ChartPermissionName
+			item.ProportionListText = mapResearcherProportionText[v.RealName]
+			mapResearcher[v.ChartPermissionName] = append(mapResearcher[v.ChartPermissionName], item)
+			researcherArr = append(researcherArr, v.RealName)
+		}
+
+		listPermission, err := cygx.GetCygxEnterScorePermissionListByIds(enterScoreIds) // 获取所有的行业名称
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetCygxEnterScorePermissionListByIds Err:" + err.Error()
+			return
+		}
+		mapPermissionProportion := make(map[string]string)
+		for _, v := range listPermission {
+			if v.Proportion == 0 {
+				continue
+			}
+			//mapPermissionProportion[fmt.Sprint(v.ChartPermissionName, "_", v.CompanyId)] = fmt.Sprint(v.Proportion) //行业名称、公司ID,占比值对应关系绑定
+
+			if enterScoreType == 2 && !mapenterScoreTypeCompanyIds[v.CompanyId] {
+				mapPermissionProportion[fmt.Sprint(v.ChartPermissionName, "_", v.CompanyId)] = utils.SubFloatToString(v.Proportion/mapenterScoreProportionTotal[v.CompanyId]*100, 2) //研究员姓名、公司ID,占比值对应关系绑定
+			} else {
+				mapPermissionProportion[fmt.Sprint(v.ChartPermissionName, "_", v.CompanyId)] = fmt.Sprint(v.Proportion) //行业名称、公司ID,占比值对应关系绑定
+			}
+		}
+
+		var permissionArr []string // 会出现的行业名称
+		mapPermissionbool := make(map[string]bool)
+		for _, v := range listPermission {
+			if mapPermissionbool[v.ChartPermissionName] {
+				continue
+			}
+			permissionArr = append(permissionArr, v.ChartPermissionName)
+			mapPermissionbool[v.ChartPermissionName] = true
+		}
+
+		mapPermissionProportionText := make(map[string][]string)
+		for _, vC := range companyList {
+			for _, vP := range permissionArr {
+				var proportionText string
+				if mapPermissionProportion[fmt.Sprint(vP, "_", vC.CompanyId)] != "" {
+					proportionText = mapPermissionProportion[fmt.Sprint(vP, "_", vC.CompanyId)]
+				} else {
+					if mapenterScoreProportionTotal[vC.CompanyId] > 0 {
+						proportionText = "0"
+					} else {
+						proportionText = ""
+					}
+				}
+
+				if mapenterScoreTypeCompanyIds[vC.CompanyId] || enterScoreType == 2 { //按照百分比展示的拼接 %
+					if proportionText != "" {
+						proportionText += "%"
+					}
+				}
+
+				mapPermissionProportionText[vP] = append(mapPermissionProportionText[vP], proportionText)
+			}
+		}
+
+		var itemsP []*cygx.EnterScorePermissionListResp
+		for _, v := range permissionArr {
+			itemP := new(cygx.EnterScorePermissionListResp) //行业结构体
+			itemP.ChartPermissionName = v
+			itemP.ProportionListText = mapPermissionProportionText[v]
+			itemP.List = mapResearcher[v]
+			itemsP = append(itemsP, itemP)
+		}
+
+		listGroup, err := cygx.GeCygxEnterScoreGroupListByIds(enterScoreIds) // 获取所有自定义分组名称
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GeCygxEnterScoreGroupListByIds Err:" + err.Error()
+			return
+		}
+		mapGroupProportion := make(map[string]string)
+		var groupArr []string // 会出现的自定义分组名称
+		mapGroupbool := make(map[string]bool)
+		for _, v := range listGroup {
+
+			if enterScoreType == 2 && !mapenterScoreTypeCompanyIds[v.CompanyId] {
+				mapGroupProportion[fmt.Sprint(v.GroupName, "_", v.CompanyId)] = utils.SubFloatToString(v.Proportion/mapenterScoreProportionTotal[v.CompanyId]*100, 2) //自定义分组名称、公司ID,占比值对应关系绑定
+			} else {
+				mapGroupProportion[fmt.Sprint(v.GroupName, "_", v.CompanyId)] = fmt.Sprint(v.Proportion) //自定义分组名称、公司ID,占比值对应关系绑定
+			}
+
+			//mapGroupProportion[fmt.Sprint(v.GroupName, "_", v.CompanyId)] = fmt.Sprint(v.Proportion) //自定义分组名称、公司ID,占比值对应关系绑定
+			if mapGroupbool[v.GroupName] {
+				continue
+			}
+			groupArr = append(groupArr, v.GroupName)
+			mapGroupbool[v.GroupName] = true
+		}
+		mapGroupProportionText := make(map[string][]string)
+		for _, vC := range companyList {
+			for _, vP := range groupArr {
+				var proportionText string
+				if mapGroupProportion[fmt.Sprint(vP, "_", vC.CompanyId)] != "" {
+					proportionText = mapGroupProportion[fmt.Sprint(vP, "_", vC.CompanyId)]
+				} else {
+					if mapenterScoreProportionTotal[vC.CompanyId] > 0 {
+						proportionText = "0"
+					} else {
+						proportionText = ""
+					}
+				}
+				if mapenterScoreTypeCompanyIds[vC.CompanyId] || enterScoreType == 2 { //按照百分比展示的拼接 %
+					if proportionText != "" {
+						proportionText += "%"
+					}
+				}
+				mapGroupProportionText[vP] = append(mapGroupProportionText[vP], proportionText)
+			}
+		}
+
+		var itemsG []*cygx.EnterScoreGroupListResp
+		for _, v := range groupArr {
+			itemG := new(cygx.EnterScoreGroupListResp) //行业结构体
+			itemG.GroupName = v
+			itemG.ProportionListText = mapGroupProportionText[v]
+			itemsG = append(itemsG, itemG)
+		}
+
+		var proportionTotalText []string      //总计
+		var rankingText []string              //排名
+		var securitiesFirmsNameText []string  //券商名称
+		var mergeProportionTotalText []string //占比
+
+		for _, vC := range companyList {
+			var ranking, securitiesFirmsName, proportionTotal, mergeProportionTotal string
+			item := mapenterScore[vC.CompanyId]
+			if item != nil {
+				ranking = item.Ranking
+				securitiesFirmsName = item.SecuritiesFirmsName
+				proportionTotal = fmt.Sprint(item.ProportionTotal)
+				mergeProportionTotal = fmt.Sprint(item.MergeProportion)
+			}
+			//if mapenterScoreTypeCompanyIds[vC.CompanyId] { //按照百分比展示的拼接 %
+			if mapenterScoreProportionTotal[vC.CompanyId] > 0 {
+				mergeProportionTotal += "%"
+			}
+			rankingText = append(rankingText, ranking)
+			securitiesFirmsNameText = append(securitiesFirmsNameText, securitiesFirmsName)
+			proportionTotalText = append(proportionTotalText, proportionTotal)
+			mergeProportionTotalText = append(mergeProportionTotalText, mergeProportionTotal)
+		}
+
+		itemproportionTotal := new(cygx.EnterScoreGroupListResp) //券商名称结构体
+		itemproportionTotal.GroupName = "合计"
+		itemproportionTotal.ProportionListText = proportionTotalText
+		itemsG = append(itemsG, itemproportionTotal)
+
+		itemranking := new(cygx.EnterScoreGroupListResp) //排名结构体
+		itemranking.GroupName = "排名"
+		itemranking.ProportionListText = rankingText
+		itemsG = append(itemsG, itemranking)
+
+		itemsecuritiesFirmsName := new(cygx.EnterScoreGroupListResp) //券商名称结构体
+		itemsecuritiesFirmsName.GroupName = "券商名称"
+		itemsecuritiesFirmsName.ProportionListText = securitiesFirmsNameText
+		itemsG = append(itemsG, itemsecuritiesFirmsName)
+
+		itemmergeProportionTotal := new(cygx.EnterScoreGroupListResp) //券商名称结构体
+		itemmergeProportionTotal.GroupName = "占比"
+		itemmergeProportionTotal.ProportionListText = mergeProportionTotalText
+		itemsG = append(itemsG, itemmergeProportionTotal)
+
+		resp.ListPermission = itemsP
+		resp.ListGroup = itemsG
+
+	} else {
+
+		listPermission, err := cygx.GetChartPermissionAll()
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取品种信息失败,Err:" + err.Error()
+			return
+		}
+
+		permissionNameArr := []string{"医药", "消费", "科技", "智造", "策略", "固收", "宏观组", "建材组", "有色组", "能化组"}
+		for _, v := range listPermission {
+			if !utils.InArrayByStr(permissionNameArr, v.PermissionName) {
+				continue
+			}
+			item := new(cygx.EnterScorePermissionListResp)
+			item.ChartPermissionName = v.PermissionName
+			item.ProportionListText = make([]string, len(companyList))
+			item.List = make([]*cygx.EnterScoreRealNameListResp, 0)
+			resp.ListPermission = append(resp.ListPermission, item)
+		}
+
+		groupNameArr := []string{"销售分", "专题分", "专家分", "云图大拓", "艾摩宏观", "合计", "排名", "券商名称", "占比"}
+		for _, v := range groupNameArr {
+			item := new(cygx.EnterScoreGroupListResp)
+			item.GroupName = v
+			item.ProportionListText = make([]string, len(companyList))
+			resp.ListGroup = append(resp.ListGroup, item)
+		}
+		//resp.ListPermission = make([]*cygx.EnterScorePermissionListResp, 0)
+		//resp.ListGroup = make([]*cygx.EnterScoreGroupListResp, 0)
+	}
+
+	if len(companyList) == 0 {
+		resp.ListCompany = make([]*company.CompanyNameAndId, 0)
+	} else {
+		resp.ListCompany = companyList
+	}
+	//导出excel
+	if isExport {
+		EnterScoreScoreOverviewExport(this, resp, br)
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// EnterScoreScoreOverviewExport 导出Excel
+func EnterScoreScoreOverviewExport(this *EnterScoreController, resp *cygx.ScoreOverviewListResp, br *models.BaseResponse) {
+	dir, err := os.Executable()
+	exPath := filepath.Dir(dir)
+	downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
+	xlsxFile := xlsx.NewFile()
+	if err != nil {
+		br.Msg = "生成文件失败"
+		br.ErrMsg = "生成文件失败"
+		return
+	}
+	style := xlsx.NewStyle()
+	alignment := xlsx.Alignment{
+		Horizontal: "center",
+		Vertical:   "center",
+		WrapText:   true,
+	}
+
+	style.Alignment = alignment
+	style.ApplyAlignment = true
+
+	sheel, err := xlsxFile.AddSheet("评分总览")
+	if err != nil {
+		br.Msg = "新增Sheet失败"
+		br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
+		return
+	}
+	sheel.SetColWidth(0, 0, 30)
+	sheel.SetColWidth(1, 1, 15)
+	sheel.SetColWidth(2, 2, 15)
+	sheel.SetColWidth(3, 3, 18)
+
+	companyList := resp.ListCompany
+	listPermission := resp.ListPermission
+	listGroup := resp.ListGroup
+	titleRow := sheel.AddRow()
+
+	cellNull := titleRow.AddCell()
+	cellNull.SetStyle(style)
+	cellNull.SetValue("")
+	for _, v := range companyList { //第一行公司
+		cellA := titleRow.AddCell()
+		cellA.SetStyle(style)
+		cellA.SetValue(v.CompanyName)
+	}
+	for _, v := range listPermission { // 行业排序名称
+		dataRow := sheel.AddRow()
+		dataRow.SetHeight(20)
+		cellA := dataRow.AddCell()
+		cellA.SetStyle(style)
+		cellA.SetValue(v.ChartPermissionName)
+
+		for _, vCp := range v.ProportionListText { // 行业对应的占比值
+			cellP := dataRow.AddCell()
+			cellP.SetStyle(style)
+			cellP.SetValue(vCp)
+		}
+
+		for _, vUser := range v.List { // 研究员姓名
+			dataRowName := sheel.AddRow()
+			dataRowName.SetHeight(20)
+			cellName := dataRowName.AddCell()
+			cellName.SetStyle(style)
+			cellName.SetValue(vUser.RealName)
+
+			for _, vUp := range vUser.ProportionListText { //研究员占比值
+				cellP := dataRowName.AddCell()
+				cellP.SetStyle(style)
+				cellP.SetValue(vUp)
+			}
+		}
+	}
+
+	for _, v := range listGroup { // 自定义名称
+		dataRow := sheel.AddRow()
+		dataRow.SetHeight(20)
+		cellA := dataRow.AddCell()
+		cellA.SetStyle(style)
+		cellA.SetValue(v.GroupName)
+
+		for _, vG := range v.ProportionListText { // 自定义名称所对应的值
+			cellP := dataRow.AddCell()
+			cellP.SetStyle(style)
+			cellP.SetValue(vG)
+		}
+	}
+
+	err = xlsxFile.Save(downLoadnFilePath)
+	if err != nil {
+		br.Msg = "保存文件失败"
+		br.ErrMsg = "保存文件失败"
+		return
+	}
+	randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
+	downloadFileName := "评分总览" + randStr + ".xlsx"
+	this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
+	defer func() {
+		os.Remove(downLoadnFilePath)
+	}()
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "导出成功"
+}
+
+// @Title  排名总览
+// @Description 排名总览接口
+// @Param   AdminId   query   string  true       "销售id,多个用英文逗号隔开,空字符串为全部"
+// @Param   City   query   string  true       "城市"
+// @Param   IsExport   query   bool  false       "是否导出excel,默认是false"
+// @Success Ret=200 {object} cygx.CompanyNameAndIdListResp
+// @router /enterScore/rankingOverview [get]
+func (this *EnterScoreController) EnterScoreRankingOverview() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	AdminUser := this.SysUser
+	if AdminUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	resp := new(cygx.RankingOverviewListResp)
+	city := this.GetString("City")
+	adminId := this.GetString("AdminId")
+	//是否导出报表
+	isExport, _ := this.GetBool("IsExport")
+
+	var companyCondition string
+	var companypars []interface{}
+	companyCondition += ` AND b.product_name = ? `
+	companypars = append(companypars, "权益")
+	companyCondition += ` AND b.status = ? `
+	companypars = append(companypars, "永续")
+
+	if adminId != "" {
+		companyCondition += ` AND b.seller_id IN (` + adminId + `) `
+	}
+	if city != "" {
+		//传过来多个城市的时候的筛选
+		citySlice := strings.Split(city, ",")
+		city = strings.Join(citySlice, "','")
+		city = "'" + city + "'"
+		companyCondition += ` AND a.city  IN  (` + city + `) `
+	}
+
+	//权益申请销售只能看到自己名下的客户的申请
+	companyIds, err := cygxService.GetAdminLookUserCompanyIdsBySelf(AdminUser)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,GetAdminLookUserCompanyIdsBySelf Err:" + err.Error()
+		return
+	}
+	lencompanyIds := len(companyIds)
+	if lencompanyIds > 0 {
+		companyCondition += ` AND a.company_id IN (` + utils.GetOrmInReplace(lencompanyIds) + `)`
+		companypars = append(companypars, companyIds)
+	}
+
+	companyList, err := company.GetCompanyIdListByproductName(companyCondition, companypars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	var condition string
+	var pars []interface{}
+
+	total, err := cygx.GetCygxEnterScoreCount(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	dataMd := []string{"10-01", "07-01", "04-01", "01-01"}
+	thisYear := time.Now().Year()
+	startYear := 2018 // 自定义开始时间
+	var quarterDate []string
+	for _, v := range dataMd {
+		dateTimeStr := fmt.Sprint(thisYear, "-", v)
+		dateTime, err := time.Parse("2006-01-02", dateTimeStr)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		if dateTime.After(time.Now()) {
+			continue
+		}
+		quarterDate = append(quarterDate, dateTimeStr)
+	}
+
+	for i := thisYear - 1; i >= startYear; i-- {
+		for _, v := range dataMd {
+			dateTimeStr := fmt.Sprint(i, "-", v)
+			quarterDate = append(quarterDate, dateTimeStr)
+		}
+	}
+
+	var itemsQuarter []*cygx.QuarterDateListResp
+
+	if total > 0 {
+		list, err := cygx.GetCygxEnterScoreList(condition, pars, 0, 9999)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetCygxEnterScoreList Err:" + err.Error()
+			return
+		}
+		mapQuarter := make(map[string]string)
+		for _, v := range list {
+			silicequarter := strings.Split(v.QuarterDate, ",")
+			for _, vQ := range silicequarter {
+				mapQuarter[fmt.Sprint(vQ, "_", v.CompanyId)] = v.Ranking //季度时间、公司ID,排名对应关系绑定
+			}
+		}
+		mapRankingText := make(map[string][]string)
+		for _, vC := range companyList {
+			for _, vQ := range quarterDate {
+				var ranking string
+				ranking = mapQuarter[fmt.Sprint(vQ, "_", vC.CompanyId)]
+				mapRankingText[vQ] = append(mapRankingText[vQ], ranking)
+			}
+		}
+		for _, v := range quarterDate {
+			itemQuarter := new(cygx.QuarterDateListResp)
+			quarter := v
+			//时间后面的月日替换成季度 Q几
+			quarter = strings.Replace(quarter, "-10-01", "Q4", -1)
+			quarter = strings.Replace(quarter, "-07-01", "Q3", -1)
+			quarter = strings.Replace(quarter, "-04-01", "Q2", -1)
+			quarter = strings.Replace(quarter, "-01-01", "Q1", -1)
+			itemQuarter.Quarter = quarter
+			itemQuarter.ProportionListText = mapRankingText[v]
+			itemsQuarter = append(itemsQuarter, itemQuarter)
+		}
+	} else {
+		for _, v := range quarterDate {
+			itemQuarter := new(cygx.QuarterDateListResp)
+			quarter := v
+			//时间后面的月日替换成季度 Q几
+			quarter = strings.Replace(quarter, "-10-01", "Q4", -1)
+			quarter = strings.Replace(quarter, "-07-01", "Q3", -1)
+			quarter = strings.Replace(quarter, "-04-01", "Q2", -1)
+			quarter = strings.Replace(quarter, "-01-01", "Q1", -1)
+			itemQuarter.Quarter = quarter
+			itemQuarter.ProportionListText = make([]string, len(companyList))
+			itemsQuarter = append(itemsQuarter, itemQuarter)
+		}
+	}
+
+	resp.ListCompany = companyList
+	resp.ListQuarterDate = itemsQuarter
+	//导出excel
+	if isExport {
+		RankingOverviewExport(this, resp, br)
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// RankingOverviewExport 导出Excel
+func RankingOverviewExport(this *EnterScoreController, resp *cygx.RankingOverviewListResp, br *models.BaseResponse) {
+	dir, err := os.Executable()
+	exPath := filepath.Dir(dir)
+	downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
+	xlsxFile := xlsx.NewFile()
+	if err != nil {
+		br.Msg = "生成文件失败"
+		br.ErrMsg = "生成文件失败"
+		return
+	}
+	style := xlsx.NewStyle()
+	alignment := xlsx.Alignment{
+		Horizontal: "center",
+		Vertical:   "center",
+		WrapText:   true,
+	}
+
+	style.Alignment = alignment
+	style.ApplyAlignment = true
+
+	sheel, err := xlsxFile.AddSheet("排名总览")
+	if err != nil {
+		br.Msg = "新增Sheet失败"
+		br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
+		return
+	}
+	sheel.SetColWidth(0, 0, 30)
+	sheel.SetColWidth(1, 1, 15)
+	sheel.SetColWidth(2, 2, 15)
+	sheel.SetColWidth(3, 3, 18)
+
+	companyList := resp.ListCompany
+	listQuarterDate := resp.ListQuarterDate
+
+	titleRow := sheel.AddRow()
+
+	cellNull := titleRow.AddCell()
+	cellNull.SetStyle(style)
+	cellNull.SetValue("")
+	for _, v := range companyList { //第一行公司
+		cellA := titleRow.AddCell()
+		cellA.SetStyle(style)
+		cellA.SetValue(v.CompanyName)
+	}
+	for _, v := range listQuarterDate { // 季度排序
+		dataRow := sheel.AddRow()
+		dataRow.SetHeight(20)
+		cellA := dataRow.AddCell()
+		cellA.SetStyle(style)
+		cellA.SetValue(v.Quarter)
+
+		for _, vCp := range v.ProportionListText { // 行业对应的占比值
+			cellP := dataRow.AddCell()
+			cellP.SetStyle(style)
+			cellP.SetValue(vCp)
+		}
+	}
+
+	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 = "导出成功"
+}

+ 3 - 3
controllers/cygx/industrial_management.go

@@ -188,7 +188,7 @@ func (this *IndustrialManagementController) ChartPermissionFirstProduct() {
 	}
 	//医药消费科技制造策略
 	for _, v := range list {
-		if v.PermissionName == utils.YI_YAO_NAME || v.PermissionName == utils.XIAO_FEI_NAME || v.PermissionName == utils.KE_JI_NAME || v.PermissionName == utils.ZHI_ZAO_NAME || v.PermissionName == utils.CE_LUE_NAME || v.PermissionName == utils.GU_SHOU_NAME {
+		if v.PermissionName == utils.YI_YAO_NAME || v.PermissionName == utils.XIAO_FEI_NAME || v.PermissionName == utils.KE_JI_NAME || v.PermissionName == utils.ZHI_ZAO_NAME || v.PermissionName == utils.CE_LUE_NAME || v.PermissionName == utils.GU_SHOU_NAME || v.PermissionName == utils.ZHOU_QI_NAME {
 			resp.List = append(resp.List, v)
 		}
 	}
@@ -215,9 +215,9 @@ func (this *IndustrialManagementController) ChartPermissionListActivitySpecial()
 		br.ErrMsg = "获取品种信息失败,Err:" + err.Error()
 		return
 	}
-	//医药、消费、科技、制造、策略,固收
+	//医药、消费、科技、制造、策略,固收,周期
 	for _, v := range list {
-		if v.PermissionName == utils.YI_YAO_NAME || v.PermissionName == utils.XIAO_FEI_NAME || v.PermissionName == utils.KE_JI_NAME || v.PermissionName == utils.ZHI_ZAO_NAME || v.PermissionName == utils.CE_LUE_NAME || v.PermissionName == utils.GU_SHOU_NAME {
+		if v.PermissionName == utils.YI_YAO_NAME || v.PermissionName == utils.XIAO_FEI_NAME || v.PermissionName == utils.KE_JI_NAME || v.PermissionName == utils.ZHI_ZAO_NAME || v.PermissionName == utils.CE_LUE_NAME || v.PermissionName == utils.GU_SHOU_NAME || v.PermissionName == utils.ZHOU_QI_NAME {
 			resp.List = append(resp.List, v)
 		}
 	}

+ 592 - 0
controllers/cygx/order.go

@@ -0,0 +1,592 @@
+package cygx
+
+import (
+	"encoding/json"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"hongze/hz_crm_api/controllers"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/cygx"
+	cygxService "hongze/hz_crm_api/services/cygx"
+	"hongze/hz_crm_api/utils"
+	"strconv"
+	"time"
+)
+
+// 产品内测
+type OrderController struct {
+	controllers.BaseAuthController
+}
+
+// @Title 列表
+// @Description 列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   StartDate   query   string  false       "开始时间 ,列如2021-03-06 "
+// @Param   EndDate   query   string  false       "结束时间,列如2021-03-06 "
+// @Param   AdminId   query   string  false       "销售ID "
+// @Param   ShareId   query   string  false       "推荐人ID "
+// @Param   PaymentType   query   string  false       "支付渠道  取值范围:1微信小程序,2微信扫码支付,3微信H5支付。 "
+// @Param   OrderType   query   int  false       "订单类型 1:畅读卡订单,2:单场付费订单"
+// @Param   OrderStatus   query   int  false       "订单状态,0:已取消、1:待支付、2:已支付、3:退款成功、4:退款处理中、5:退款异常、6:退款关闭"
+// @Param   PaymentProject   query   string  false       "付款项目"
+// @Param   UserCardType   query   string  false       "会员卡类型 ,日卡、月卡"
+// @Param   OrderCode   query   string  false       "订单编号"
+// @Param   KeyWord   query   string  false       "搜索关键词"
+// @Success Ret=200 {object} cygx.GetCygxTacticsTimeLineResp
+// @router /order/list [get]
+func (this *OrderController) OrderList() {
+	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.UserOrderListResp)
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	orderType, _ := this.GetInt("OrderType", 1)
+	orderStatus, _ := this.GetInt("OrderStatus", -1)
+	startDate := this.GetString("StartDate")
+	endDate := this.GetString("EndDate")
+	adminId := this.GetString("AdminId")
+	shareId := this.GetString("ShareId")
+	paymentType, _ := this.GetInt("PaymentType")
+	orderCode := this.GetString("OrderCode")
+	keyWord := this.GetString("KeyWord")
+	paymentProject := this.GetString("PaymentProject")
+	userCardType := this.GetString("UserCardType")
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+	var condition string
+	var pars []interface{}
+	if orderType > 0 { //订单类型 1:畅读卡订单,2:单场付费订单
+		condition += `  AND order_type =   ? `
+		pars = append(pars, orderType)
+	}
+
+	if startDate != "" && endDate != "" { //时间范围
+		condition += ` 	AND create_time  BETWEEN ?   AND  ? `
+		pars = append(pars, startDate+" 00:00:01", endDate+" 23:59:59")
+	}
+
+	if adminId != "" { //所属销售筛选
+		condition += ` 	AND seller_id IN (` + adminId + `) `
+	}
+
+	if shareId != "" { //推荐人ID
+		condition += ` 	AND share_id IN (` + shareId + `) `
+	}
+
+	if paymentType > 0 { // 支付渠道
+		var tradeType string
+		switch paymentType {
+		case 1:
+			tradeType = "JSAPI"
+		case 2:
+			tradeType = "NATIVE"
+		case 3:
+			tradeType = "MWEB"
+		}
+		condition += ` 	AND trade_type  = ?  `
+		pars = append(pars, tradeType)
+	}
+
+	if orderStatus > -1 { //订单状态
+		condition += ` 	AND order_status  = ?  `
+		pars = append(pars, orderStatus)
+	}
+
+	if orderCode != "" { //订单编号
+		orderCode = "%" + orderCode + "%"
+		condition += ` 	AND order_code LIKE ? `
+		pars = append(pars, orderCode)
+	}
+
+	if paymentProject != "" { //付款项目
+		condition += ` 	AND goods_name =  ? `
+		pars = append(pars, paymentProject)
+	}
+
+	if userCardType != "" { //日卡月卡, 前端不好区分这里用了两个字段
+		condition += ` 	AND goods_name =  ? `
+		pars = append(pars, userCardType)
+	}
+
+	if keyWord != "" { //用户姓名,手机号
+		keyWord = "%" + keyWord + "%"
+		condition += ` 	AND (mobile LIKE ?  OR  real_name LIKE ? ) `
+		pars = append(pars, keyWord, keyWord)
+	}
+
+	total, err := cygx.GetCygxOrderCount(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	condition += "	ORDER BY order_id  DESC "
+	list, err := cygx.GetCygxOrderList(condition, pars, startSize, pageSize)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	var mobiles []string
+	for _, v := range list {
+		mobiles = append(mobiles, v.Mobile)
+	}
+	inviteNameMap := cygxService.GetCygxUserBusinessCardMap(mobiles) // 根据手机号获取邀请人
+
+	for _, v := range list {
+		item := new(cygx.OrderListResp)
+		item.OrderCode = v.OrderCode
+		item.OrderMoney = v.OrderMoney
+		item.SourceId = v.SourceId
+		item.Source = v.Source
+		item.SourceTitle = v.SourceTitle
+		switch v.Source {
+		case utils.CYGX_OBJ_ARTICLE: //文章详情
+			item.HttpUrl = utils.CYGX_MFYX_URL + "/material/info/" + strconv.Itoa(v.SourceId)
+		case utils.CYGX_OBJ_ACTIVITY: //活动详情
+			item.HttpUrl = utils.CYGX_MFYX_URL + "/activity/detail/" + strconv.Itoa(v.SourceId)
+		case utils.CYGX_OBJ_YANXUANSPECIAL: //专栏详情
+			item.HttpUrl = utils.CYGX_MFYX_URL + "/column/detail/" + strconv.Itoa(v.SourceId)
+		}
+		item.OrderStatus = v.OrderStatus
+
+		switch item.OrderStatus {
+		case 0:
+			item.OrderStatusText = "已取消"
+		case 1:
+			item.OrderStatusText = "待支付"
+		case 2:
+			item.OrderStatusText = "已支付"
+		case 3:
+			item.OrderStatusText = "退款成功"
+		case 4:
+			item.OrderStatusText = "退款处理中"
+		case 5:
+			item.OrderStatusText = "退款异常"
+		case 6:
+			item.OrderStatusText = "退款关闭"
+		}
+
+		//TradeType        string    `comment:"交易类型,枚举值:JSAPI:公众号支付 、 NATIVE:扫码支付 、 App:App支付 、 MICROPAY:付款码支付 、 MWEB:H5支付 、 FACEPAY:刷脸支付"`
+		switch v.TradeType {
+		case "JSAPI":
+			item.PaymentTypeText = "小程序"
+		case "NATIVE":
+			item.PaymentTypeText = "PC"
+		case "MWEB":
+			item.PaymentTypeText = "H5"
+		}
+
+		item.UserId = v.UserId
+		item.RealName = v.RealName
+		item.Mobile = v.Mobile
+		item.Email = v.Email
+		item.CompanyId = v.CompanyId
+		item.CompanyName = v.CompanyName
+		item.SellerName = v.SellerName
+		if v.ShareName != "" {
+			item.InviteName = v.ShareName
+		} else {
+			item.InviteName = inviteNameMap[v.Mobile]
+		}
+		item.PaymentProject = v.GoodsName
+		if v.OrderStatus != 0 && v.OrderStatus != 1 {
+			item.PayTime = v.PayTime.Format(utils.FormatDateTime)
+		}
+		if orderType == 1 && v.OrderStatus != 0 && v.OrderStatus != 1 {
+			if v.GoodsId == 1 {
+				item.StartDate = v.StartDate.Format(utils.FormatDateTime)
+				item.EndDate = v.EndDate.Format(utils.FormatDateTime)
+			} else {
+				item.StartDate = v.StartDate.Format(utils.FormatDate)
+				item.EndDate = v.EndDate.Format(utils.FormatDate)
+			}
+		}
+		item.CreateTime = v.CreateTime.Format(utils.FormatDateTime)
+		resp.List = append(resp.List, item)
+	}
+	if len(resp.List) == 0 {
+		resp.List = make([]*cygx.OrderListResp, 0)
+	}
+
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp.Paging = page
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 退款
+// @Description 退款接口
+// @Param	request	body cygx.UserRemarAddReq true "type json string"
+// @Success 200 操作成功
+// @router /order/refund [post]
+func (this *UserController) OrderRefund() {
+	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.CygxOrderRefundReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	orderCode := req.OrderCode
+	remark := req.Remark
+
+	if remark == "" {
+		br.Msg = "请填写退款原因"
+		return
+	}
+	orderDetail, err := cygx.GetCygxOrderDetailByOrderCode(orderCode)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败, Err:" + err.Error()
+		return
+	}
+	if orderDetail.OrderStatus != 2 {
+		br.Msg = "订单状态异常!"
+		br.ErrMsg = "订单状态异常,orderCode:" + orderCode
+		return
+	}
+	//订单状态,0:已取消、1:待支付、2:已支付、3:退款成功、4:退款处理中、5:退款异常、6:退款关闭
+	statusCode, err := cygxService.RefundsApiService(orderDetail)
+	var orderStatus int
+	if statusCode == 200 && err == nil {
+		orderStatus = 4
+	} else {
+		orderStatus = 5
+	}
+	item := new(cygx.CygxOrderRefund)
+	item.OrderCode = orderCode
+	item.RefundMoney = orderDetail.OrderMoney
+	item.RefundWay = 1
+	item.Remark = remark
+	item.CreateTime = time.Now()
+	item.RefundTime = time.Now()
+	item.AdminId = sysUser.AdminId
+	item.AdminName = sysUser.RealName
+	err = cygx.AddCygxOrderRefund(item, orderStatus)
+	if err != nil {
+		br.Msg = "新增失败."
+		br.ErrMsg = "新增失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "已提交退款,请到退款记录页面查看"
+}
+
+// @Title 退款记录列表
+// @Description 退款记录列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   StartDate   query   string  false       "开始时间 ,列如2021-03-06 "
+// @Param   EndDate   query   string  false       "结束时间,列如2021-03-06 "
+// @Param   AdminId   query   string  false       "销售ID "
+// @Param   ShareId   query   string  false       "推荐人ID "
+// @Param   PaymentType   query   string  false       "支付渠道  取值范围:1微信小程序,2微信扫码支付,3微信H5支付。 "
+// @Param   OrderType   query   int  false       "订单类型 1:畅读卡订单,2:单场付费订单"
+// @Param   OrderStatus   query   int  false       "订单状态,0:已取消、1:待支付、2:已支付、3:退款成功、4:退款处理中、5:退款异常、6:退款关闭"
+// @Param   PaymentProject   query   string  false       "付款项目"
+// @Param   UserCardType   query   string  false       "会员卡类型 ,日卡、月卡"
+// @Param   OrderCode   query   string  false       "订单编号"
+// @Param   KeyWord   query   string  false       "搜索关键词"
+// @Success Ret=200 {object} cygx.GetCygxTacticsTimeLineResp
+// @router /order/refund/list [get]
+func (this *OrderController) OrderRefundList() {
+	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.UserOrderListResp)
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	orderType, _ := this.GetInt("OrderType", 1)
+	orderStatus, _ := this.GetInt("OrderStatus", -1)
+	startDate := this.GetString("StartDate")
+	endDate := this.GetString("EndDate")
+	adminId := this.GetString("AdminId")
+	shareId := this.GetString("ShareId")
+	paymentType, _ := this.GetInt("PaymentType")
+	orderCode := this.GetString("OrderCode")
+	keyWord := this.GetString("KeyWord")
+	paymentProject := this.GetString("PaymentProject")
+	userCardType := this.GetString("UserCardType")
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+	var condition string
+	var pars []interface{}
+	condition += `  AND order_status  IN  (3,4,5,6) `
+	if orderType > 0 { //订单类型 1:畅读卡订单,2:单场付费订单
+		condition += `  AND order_type =   ? `
+		pars = append(pars, orderType)
+	}
+
+	if startDate != "" && endDate != "" { //时间范围
+		condition += ` 	AND create_time  BETWEEN ?   AND  ? `
+		pars = append(pars, startDate+" 00:00:01", endDate+" 23:59:59")
+	}
+
+	if adminId != "" { //所属销售筛选
+		condition += ` 	AND seller_id IN (` + adminId + `) `
+	}
+
+	if shareId != "" { //推荐人ID
+		condition += ` 	AND share_id IN (` + shareId + `) `
+	}
+
+	if paymentType > 0 { // 支付渠道
+		var tradeType string
+		switch paymentType {
+		case 1:
+			tradeType = "JSAPI"
+		case 2:
+			tradeType = "NATIVE"
+		case 3:
+			tradeType = "MWEB"
+		}
+		condition += ` 	AND trade_type  = ?  `
+		pars = append(pars, tradeType)
+	}
+
+	if orderStatus > -1 { //订单状态
+		condition += ` 	AND order_status  = ?  `
+		pars = append(pars, orderStatus)
+	}
+
+	if orderCode != "" { //订单编号
+		orderCode = "%" + orderCode + "%"
+		condition += ` 	AND order_code LIKE ? `
+		pars = append(pars, orderCode)
+	}
+
+	if paymentProject != "" { //付款项目
+		condition += ` 	AND goods_name =  ? `
+		pars = append(pars, paymentProject)
+	}
+
+	if userCardType != "" { //日卡月卡, 前端不好区分这里用了两个字段
+		condition += ` 	AND goods_name =  ? `
+		pars = append(pars, userCardType)
+	}
+
+	if keyWord != "" { //用户姓名,手机号
+		keyWord = "%" + keyWord + "%"
+		condition += ` 	AND (mobile LIKE ?  OR  real_name LIKE ? ) `
+		pars = append(pars, keyWord, keyWord)
+	}
+
+	total, err := cygx.GetCygxOrderCount(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	condition += "	ORDER BY order_id  DESC "
+	list, err := cygx.GetCygxOrderList(condition, pars, startSize, pageSize)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	var mobiles []string
+	for _, v := range list {
+		mobiles = append(mobiles, v.Mobile)
+	}
+	inviteNameMap := cygxService.GetCygxUserBusinessCardMap(mobiles) // 根据手机号获取邀请人
+	for _, v := range list {
+		item := new(cygx.OrderListResp)
+		item.OrderCode = v.OrderCode
+		item.OrderMoney = v.OrderMoney
+		item.SourceId = v.SourceId
+		item.Source = v.Source
+		item.SourceTitle = v.SourceTitle
+		switch v.Source {
+		case utils.CYGX_OBJ_ARTICLE: //文章详情
+			item.HttpUrl = utils.CYGX_MFYX_URL + "/material/info/" + strconv.Itoa(v.SourceId)
+		case utils.CYGX_OBJ_ACTIVITY: //活动详情
+			item.HttpUrl = utils.CYGX_MFYX_URL + "/activity/detail/" + strconv.Itoa(v.SourceId)
+		case utils.CYGX_OBJ_YANXUANSPECIAL: //专栏详情
+			item.HttpUrl = utils.CYGX_MFYX_URL + "/column/detail/" + strconv.Itoa(v.SourceId)
+		}
+		//OrderStatus      int       `comment:"订单状态,0:已取消、1:待支付、2:已支付、3:退款成功、4:退款处理中、5:退款异常、6:退款关闭"`
+		item.OrderStatus = v.OrderStatus
+		switch item.OrderStatus {
+		case 3:
+			item.OrderStatusText = "退款成功"
+		case 4:
+			item.OrderStatusText = "退款处理中"
+		case 5:
+			item.OrderStatusText = "退款异常"
+		case 6:
+			item.OrderStatusText = "退款关闭"
+		}
+
+		//TradeType        string    `comment:"交易类型,枚举值:JSAPI:公众号支付 、 NATIVE:扫码支付 、 App:App支付 、 MICROPAY:付款码支付 、 MWEB:H5支付 、 FACEPAY:刷脸支付"`
+		switch v.TradeType {
+		case "JSAPI":
+			item.PaymentTypeText = "小程序"
+		case "NATIVE":
+			item.PaymentTypeText = "PC"
+		case "MWEB":
+			item.PaymentTypeText = "H5"
+		}
+
+		item.UserId = v.UserId
+		item.RealName = v.RealName
+		item.Mobile = v.Mobile
+		item.Email = v.Email
+		item.CompanyId = v.CompanyId
+		item.CompanyName = v.CompanyName
+		item.SellerName = v.SellerName
+		if v.ShareName != "" {
+			item.InviteName = v.ShareName
+		} else {
+			item.InviteName = inviteNameMap[v.Mobile]
+		}
+
+		item.PaymentProject = v.GoodsName
+		switch v.GoodsId {
+		case 1:
+			item.PaymentProject = "日卡"
+		case 2:
+			item.PaymentProject = "月卡"
+		}
+
+		item.RefundTime = v.RefundTime.Format(utils.FormatDateTime)
+		item.RefundRemark = v.RefundRemark
+
+		//if v.OrderStatus == 2 {
+		item.PayTime = v.PayTime.Format(utils.FormatDateTime)
+		//}
+		if orderType == 1 {
+			if v.GoodsId == 1 {
+				item.StartDate = v.StartDate.Format(utils.FormatDateTime)
+				item.EndDate = v.EndDate.Format(utils.FormatDateTime)
+			} else {
+				item.StartDate = v.StartDate.Format(utils.FormatDate)
+				item.EndDate = v.EndDate.Format(utils.FormatDate)
+			}
+		}
+		item.CreateTime = v.CreateTime.Format(utils.FormatDateTime)
+		resp.List = append(resp.List, item)
+	}
+	if len(resp.List) == 0 {
+		resp.List = make([]*cygx.OrderListResp, 0)
+	}
+
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp.Paging = page
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 退款撤销
+// @Description 退款撤销接口
+// @Param	request	body cygx.UserRemarAddReq true "type json string"
+// @Success 200 操作成功
+// @router /order/refund_revoke [post]
+func (this *UserController) OrderRefundRevoke() {
+	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.CygxOrderRefundReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	orderCode := req.OrderCode
+	orderDetail, err := cygx.GetCygxOrderDetailByOrderCode(orderCode)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败, Err:" + err.Error()
+		return
+	}
+	if orderDetail.OrderStatus != 4 {
+		br.Msg = "订单状态异常!"
+		br.ErrMsg = "订单状态异常,orderCode:" + orderCode
+		return
+	}
+
+	item := new(cygx.CygxOrderAction)
+	item.Action = "关闭退款"
+	item.OrderStatus = 6
+	item.OrderStatusText = "关闭退款"
+	item.OrderCode = orderDetail.OrderCode
+	item.UserId = orderDetail.UserId
+	item.RealName = orderDetail.RealName
+	item.Mobile = orderDetail.Mobile
+	item.Email = orderDetail.Email
+	item.CompanyId = orderDetail.CompanyId
+	item.CompanyName = orderDetail.CompanyName
+	item.SellerName = orderDetail.SellerName
+	item.CreateTime = time.Now()
+	item.ModifyTime = time.Now()
+	item.AdminId = sysUser.AdminId
+	item.AdminName = sysUser.RealName
+
+	err = cygx.AddCygxOrderRefundRevoke(item)
+	if err != nil {
+		br.Msg = "新增失败."
+		br.ErrMsg = "新增失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 1 - 0
controllers/cygx/summary_manage.go

@@ -318,6 +318,7 @@ func (this *SummaryManage) PreserveAndPublish() {
 	}
 	go elastic.AddComprehensiveArticle(item.ArticleId)       // ES添加文章:报告、纪要
 	go cygxService.UpdateArticleResourceData(item.ArticleId) //写入首页最新  cygx_resource_data 表
+	go cygxService.MakeArticleMomentsImg(item.ArticleId)     //生成文章分享到朋友圈的图片
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"

+ 11 - 0
controllers/cygx/user.go

@@ -1701,6 +1701,7 @@ func (this *UserController) ExportInteraction() {
 			br.ErrMsg = "获取用户阅读记录,Err:" + err.Error()
 			return
 		}
+		var articleIds []int
 		if len(list) > 0 {
 			for k, v := range list {
 				if v.ArticleId >= utils.SummaryArticleId {
@@ -1711,8 +1712,18 @@ func (this *UserController) ExportInteraction() {
 				if list[k].PermissionName == "" {
 					list[k].PermissionName = v.CategoryName
 				}
+				if v.SpecialType == 0 {
+					articleIds = append(articleIds, v.ArticleId)
+				}
+			}
+			mapIndustrialLabel := cygxService.GetArticleIndustrialLabelByArticleId(articleIds) // 关联产业
+			mapSubjectLabel := cygxService.GetArticleSubjectLabelByArticleId(articleIds)       // 关联标的
+			for _, v := range list {
+				v.IndustryName = strings.Join(mapIndustrialLabel[v.ArticleId], "/")
+				v.SubjectNameStr = strings.Join(mapSubjectLabel[v.ArticleId], "/")
 			}
 		}
+
 	} else if source == 2 {
 		sheetName = "到会管理名单"
 		if mobile != "" {

+ 152 - 0
controllers/cygx/user_admin_share_history.go

@@ -0,0 +1,152 @@
+package cygx
+
+import (
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"hongze/hz_crm_api/controllers"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/utils"
+	"strconv"
+)
+
+// 分享记录
+type UserAdminShareHistoryController struct {
+	controllers.BaseAuthController
+}
+
+// @Title 分享记录列表
+// @Description 分享记录列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   StartDate   query   string  false       "开始时间 ,列如2021-03-06 "
+// @Param   EndDate   query   string  false       "结束时间,列如2021-03-06 "
+// @Param   AdminId   query   string  false       "销售ID "
+// @Param   KeyWord   query   string  false       "搜索关键词"
+// @Param   Action   query   string	  false       "用户行为"
+// @Success Ret=200 {object} cygx.GetCygxUserAdminShareHistoryListResp
+// @router /mfyx/admin/share/list [get]
+func (this *UserAdminShareHistoryController) OrderList() {
+	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.GetCygxUserAdminShareHistoryListResp)
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	startDate := this.GetString("StartDate")
+	endDate := this.GetString("EndDate")
+	adminId := this.GetString("AdminId")
+	keyWord := this.GetString("KeyWord")
+	action := this.GetString("Action")
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+	var condition string
+	var pars []interface{}
+	condition += ` AND  company_id !=  16 ` // 过滤弘则
+	if startDate != "" && endDate != "" {   //时间范围
+		startDate += " 00:00:00"
+		endDate += " 23:59:59"
+		condition += ` 	AND create_time  BETWEEN ?   AND  ? `
+		pars = append(pars, startDate, endDate)
+	}
+
+	if adminId != "" { //所属销售筛选
+		condition += ` 	AND share_id IN (` + adminId + `) `
+	}
+
+	//用户行为搜索
+	if action == "查看专栏" || action == "查看报告" || action == "查看活动" || action == "注册" {
+		condition += " 	AND action = ? "
+		pars = append(pars, action)
+	}
+
+	//如果不是权益管理员和admin,就做可见权限限制
+	if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_RAI_ADMIN && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN {
+		condition += ` 	AND share_id IN (` + strconv.Itoa(sysUser.AdminId) + `) `
+	}
+
+	if keyWord != "" { //用户姓名,手机号
+		keyWord = "%" + keyWord + "%"
+		condition += ` 	AND (mobile LIKE ?  OR  real_name LIKE ? ) `
+		pars = append(pars, keyWord, keyWord)
+	}
+
+	total, err := cygx.GetCygxUserAdminShareHistoryCount(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	condition += "	ORDER BY user_admin_share_history_id  DESC "
+	list, err := cygx.GetCygxUserAdminShareHistoryList(condition, pars, startSize, pageSize)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	var mobiles []string
+	for _, v := range list {
+		mobiles = append(mobiles, v.Mobile)
+	}
+	listUser, err := models.GetWxUserRaiSllerListByUserMobile(mobiles)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	//获取用户当前最新的公司信息
+	mapWxUserSller := make(map[string]*models.WxUserSller)
+	for _, v := range listUser {
+		mapWxUserSller[v.Mobile] = v
+	}
+
+	for _, v := range list {
+		switch v.Source {
+		case utils.CYGX_OBJ_ARTICLE: //文章详情
+			v.HttpUrl = utils.CYGX_MFYX_URL + "/material/info/" + strconv.Itoa(v.SourceId)
+		case utils.CYGX_OBJ_ACTIVITY: //活动详情
+			v.HttpUrl = utils.CYGX_MFYX_URL + "/activity/detail/" + strconv.Itoa(v.SourceId)
+		case utils.CYGX_OBJ_YANXUANSPECIAL: //研选专栏
+			v.HttpUrl = utils.CYGX_MFYX_URL + "/column/detail/" + strconv.Itoa(v.SourceId)
+		}
+
+		switch v.RegisterPlatform {
+		case 5:
+			v.RegisterPlatformText = "研选小程序"
+		case 6:
+			v.RegisterPlatformText = "研选网页版"
+		}
+		mapItem := mapWxUserSller[v.Mobile]
+		if mapItem != nil {
+			v.CompanyName = mapItem.CompanyName
+			v.CompanyId = mapItem.CompanyId
+			v.RealName = mapItem.RealName
+		} else {
+			v.RealName = "--"
+			v.CompanyName = "--"
+			v.CompanyId = 1
+		}
+	}
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp.Paging = page
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 146 - 10
controllers/cygx/yanxuan_special.go

@@ -9,6 +9,7 @@ import (
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/company"
 	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/services"
 	cygxService "hongze/hz_crm_api/services/cygx"
 	"hongze/hz_crm_api/services/elastic"
 	"hongze/hz_crm_api/utils"
@@ -79,6 +80,8 @@ func (this *YanxuanSpecialController) Add() {
 		MobileInit:  infoUser.Mobile,
 		CompanyName: infoUser.CompanyName,
 		CompanyId:   infoUser.CompanyId,
+		InviteName:  req.InviteName,
+		Remark:      req.Remark,
 		CreateTime:  time.Now(),
 		ModifyTime:  time.Now(),
 		HeadImg:     utils.CYGX_YANXUAN_SPECIAL_HEAD_IMG_URL + strconv.Itoa(rnd) + ".png",
@@ -157,6 +160,7 @@ func (this *YanxuanSpecialController) AuthorEnable() {
 // @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
 // @Param   Status   query   string  true       "状态: 1:启用 、 2:禁用 。传其他默认所有"
 // @Param   KeyWord   query   string  false       "搜索关键词"
+// @Param   NickName   query   string  false       "昵称"
 // @Param   SortParam   query   string  false       "排序字段参数,用来排序的字段, 枚举值:'CreatTime':开通时间 、 'articleNum':已发布文章 、 'pv':总Pv/Uv "
 // @Param   SortType   query   string  true       "如何排序,是正序还是倒序,枚举值:`asc 正序`,`desc 倒叙`"
 // @Success 200 {object} models.AddEnglishReportResp
@@ -182,6 +186,7 @@ func (this *YanxuanSpecialController) AuthorList() {
 	//排序参数
 	sortParam := this.GetString("SortParam")
 	sortType := this.GetString("SortType")
+	nickName := this.GetString("NickName")
 
 	var startSize int
 	if pageSize <= 0 {
@@ -206,6 +211,13 @@ func (this *YanxuanSpecialController) AuthorList() {
 		pars = append(pars, keyWord)
 	}
 
+	//关键词搜索
+	if nickName != "" {
+		nickName = "%" + nickName + "%"
+		condition += ` AND art.nick_name like  ? `
+		pars = append(pars, nickName)
+	}
+
 	//排序字段以及排序方式处理
 	var sortStr string
 	if sortParam != "" && sortType != "" {
@@ -312,6 +324,7 @@ func (this *YanxuanSpecialController) AuthorList() {
 // @Param   Status   query   string  true       "状态: 1:待审核 、 2:已发布 。默认待审核"
 // @Param   Type   query   int  true       "文章类型,1:笔记、2:观点"
 // @Param   KeyWord   query   string  false       "搜索关键词"
+// @Param   NickName   query   string  false       "昵称"
 // @Param   SortParam   query   string  false       "排序字段参数,用来排序的字段, 枚举值:'CreatTime':开通时间 、 'articleNum':已发布文章 、 'pv':总Pv/Uv "
 // @Param   SortType   query   string  true       "如何排序,是正序还是倒序,枚举值:`asc 正序`,`desc 倒叙`"
 // @Param   StartDate   query   string  false       "开始时间 ,列如2021-03-06 "
@@ -343,6 +356,7 @@ func (this *YanxuanSpecialController) List() {
 	sortType := this.GetString("SortType")
 	startDate := this.GetString("StartDate")
 	endDate := this.GetString("EndDate")
+	nickName := this.GetString("NickName")
 
 	var startSize int
 	if pageSize <= 0 {
@@ -386,6 +400,13 @@ func (this *YanxuanSpecialController) List() {
 		pars = append(pars, keyWord)
 	}
 
+	//昵称搜索
+	if nickName != "" {
+		nickName = "%" + nickName + "%"
+		condition += ` AND b.nick_name like  ? `
+		pars = append(pars, nickName)
+	}
+
 	//排序字段以及排序方式处理
 	var sortStr string
 	if sortParam != "" && sortType != "" {
@@ -516,10 +537,12 @@ func (this *YanxuanSpecialController) Enable() {
 	}
 	if req.Status == 1 {
 		go cygxService.SendWxMsgSpecialFollow(req.Id)
+		go services.SendWxCategoryMsgSpecialFollow(req.Id)
 	}
-	go cygxService.SendWxMsgSpecialAuthor(req.Id, req.Status) // 研选专栏审核完成时,给提交人发送模板消息
-	go cygxService.UpdateYanxuanSpecialResourceData(req.Id)   //  写入首页最新  cygx_resource_data 表
-	go elastic.EsAddYanxuanSpecial(req.Id)                    //  写入es 综合搜索
+	go cygxService.SendWxMsgSpecialAuthor(req.Id, req.Status)      // 研选专栏审核完成时,给提交人发送模板消息
+	go services.SendWxCategoryMsgSpecialAuthor(req.Id, req.Status) // 研选专栏审核完成时,给提交人发送模板消息
+	go cygxService.UpdateYanxuanSpecialResourceData(req.Id)        //  写入首页最新  cygx_resource_data 表
+	go elastic.EsAddYanxuanSpecial(req.Id)                         //  写入es 综合搜索
 	br.Msg = "审批成功"
 	br.Ret = 200
 	br.Success = true
@@ -778,25 +801,46 @@ func (this *YanxuanSpecialController) ShowButton() {
 	}
 
 	resp := new(cygx.CygxYanxuanSpecialShowButton)
-	configCode := utils.TPL_MSG_NEI_RONG_ZU
-	cnfNeiRong, err := cygx.GetConfigByCode(configCode)
+	//configCode := utils.TPL_MSG_NEI_RONG_ZU
+	//cnfNeiRong, err := cygx.GetConfigByCode(configCode)
+	//if err != nil {
+	//	br.Msg = "获取失败"
+	//	br.ErrMsg = "获取失败,Err:" + err.Error()
+	//	return
+	//}
+	////汪洋王芳手机号
+	//configCode = utils.TPL_MSG_WANG_FANG_WANG_YANG
+	//cnfWang, err := cygx.GetConfigByCode(configCode)
+	//if err != nil {
+	//	br.Msg = "获取失败"
+	//	br.ErrMsg = "获取失败,Err:" + err.Error()
+	//	return
+	//}
+
+	//文章管理专栏是否可见
+	cnfArticle, err := cygx.GetConfigByCode(utils.YANXUAN_SPECIAL_ARTICLE_BUTTON_MOBILE)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
-	//汪洋王芳手机号
-	configCode = utils.TPL_MSG_WANG_FANG_WANG_YANG
-	cnfWang, err := cygx.GetConfigByCode(configCode)
+	articleMobileSlice := strings.Split(cnfArticle.ConfigValue, ",")
+	if utils.InArrayByStr(articleMobileSlice, sysUser.Mobile) || sysUser.Role == utils.ROLE_TYPE_CODE_ADMIN {
+		resp.IsShowYanXuanSpecial = true
+	}
+
+	//作者管理专栏是否可见
+	cnfAuthor, err := cygx.GetConfigByCode(utils.YANXUAN_SPECIAL_AUTHOR_BUTTON_MOBILE)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
-	//作者管理栏,只有内容组、汪洋、王芳、超管可见
-	if strings.Contains(cnfNeiRong.ConfigValue, sysUser.Mobile) || strings.Contains(cnfWang.ConfigValue, sysUser.Mobile) || sysUser.Role == utils.ROLE_TYPE_CODE_ADMIN {
+	authorMobileSlice := strings.Split(cnfAuthor.ConfigValue, ",")
+	if utils.InArrayByStr(authorMobileSlice, sysUser.Mobile) || sysUser.Role == utils.ROLE_TYPE_CODE_ADMIN {
 		resp.IsShowSpecialAuthor = true
 	}
+
 	br.Data = resp
 	br.Ret = 200
 	br.Success = true
@@ -874,3 +918,95 @@ func init_928() {
 	}
 	return
 }
+
+// @Title 修改作者信息
+// @Description 修改作者信息接口
+// @Param	request	body help_doc.AddHelpDocReq true "type json string"
+// @router /yanxuan_special/author/update [post]
+func (this *YanxuanSpecialController) AuthorUpdate() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req cygx.AddCygxYanxuanSpecialAuthorReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.UserId <= 0 {
+		br.Msg = "请输入用户信息"
+		return
+	}
+	err = cygx.UpdateYanxuanSpecialAuthorInviteName(req.InviteName, req.Remark, req.UserId)
+	if err != nil {
+		br.Msg = "新增失败"
+		br.ErrMsg = "新增失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "修改成功"
+}
+
+// @Title 作者列表
+// @Description 作者列表
+// @Param   KeyWord   query   string  false       "搜索关键词"
+// @Success 200 {object} models.AddEnglishReportResp
+// @router /yanxuan_special/author/search [get]
+func (this *YanxuanSpecialController) AuthorSearch() {
+	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")
+	var condition string
+	var pars []interface{}
+	resp := new(cygx.CygxYanxuanSpecialKeyWordListReesp)
+	//关键词搜索
+	if keyWord != "" {
+		keyWord = "%" + keyWord + "%"
+		condition += ` AND art.nick_name like  ? `
+		pars = append(pars, keyWord)
+		list, tmpErr := cygx.GetYanxuanSpecialAuthorList(condition, pars, 0, 99)
+		if tmpErr != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败, Err:" + tmpErr.Error()
+			return
+		}
+		if len(list) > 0 {
+			for _, v := range list {
+				item := new(cygx.CygxYanxuanSpecialKeyWordReesp)
+				item.KeyWord = v.NickName
+				resp.List = append(resp.List, item)
+			}
+		} else {
+			resp.List = make([]*cygx.CygxYanxuanSpecialKeyWordReesp, 0)
+		}
+	} else {
+		resp.List = make([]*cygx.CygxYanxuanSpecialKeyWordReesp, 0)
+	}
+
+	br.Data = resp
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}

+ 18 - 13
controllers/day_new.go

@@ -378,7 +378,7 @@ func (this *DayNewController) AddReport() {
 		}
 	}
 
-	maxStage, err := models.GetEnglishReportStage(dayNewDefault.ClassifyIdFirst, dayNewDefault.ClassifyIdSecond)
+	maxStage, err := models.GetEnglishReportStage(dayNewDefault.ClassifyIdSecond, dayNewDefault.ClassifyIdThird)
 	if err != nil {
 		br.Msg = "期数获取失败!"
 		br.ErrMsg = "期数获取失败,Err:" + err.Error()
@@ -386,11 +386,11 @@ func (this *DayNewController) AddReport() {
 	}
 
 	item := new(models.EnglishReport)
-	item.AddType = 1 //新增方式:1:新增报告,2:继承报告
-	item.ClassifyIdFirst = dayNewDefault.ClassifyIdFirst
-	item.ClassifyNameFirst = dayNewDefault.ClassifyNameFirst
-	item.ClassifyIdSecond = dayNewDefault.ClassifyIdSecond
-	item.ClassifyNameSecond = dayNewDefault.ClassifyNameSecond
+	item.AddType = 1                                      // 新增方式:1:新增报告,2:继承报告
+	item.ClassifyIdFirst = dayNewDefault.ClassifyIdSecond // 报告表中的id_first实际为二级ID
+	item.ClassifyNameFirst = dayNewDefault.ClassifyNameSecond
+	item.ClassifyIdSecond = dayNewDefault.ClassifyIdThird // 报告表中的id_second实际为三级ID
+	item.ClassifyNameSecond = dayNewDefault.ClassifyNameThird
 	item.Title = dayNewDefault.Title
 	item.Abstract = dayNewDefault.Abstract
 	item.Author = dayNewDefault.Author
@@ -433,9 +433,9 @@ func (this *DayNewController) AddReport() {
 	br.Msg = "生成成功"
 }
 
-// List
-// @Title 每日资讯列表
-// @Description 每日资讯列表
+// ReportDefault
+// @Title 转报告默认设置
+// @Description 转报告默认设置
 // @Success 200 {object} models.WeworkMsgListResp
 // @router /day_new/report_default [get]
 func (this *DayNewController) ReportDefault() {
@@ -464,6 +464,8 @@ func (this *DayNewController) ReportDefault() {
 		ClassifyNameFirst:  dayNewDefault.ClassifyNameFirst,
 		ClassifyIdSecond:   dayNewDefault.ClassifyIdSecond,
 		ClassifyNameSecond: dayNewDefault.ClassifyNameSecond,
+		ClassifyIdThird:    dayNewDefault.ClassifyIdThird,
+		ClassifyNameThird:  dayNewDefault.ClassifyNameThird,
 		Title:              dayNewDefault.Title,
 		Abstract:           dayNewDefault.Abstract,
 		Author:             dayNewDefault.Author,
@@ -477,9 +479,10 @@ func (this *DayNewController) ReportDefault() {
 	br.Data = defaultReport
 }
 
-// @Title 新增英文报告接口
-// @Description 新增英文报告接口
-// @Param	request	body day_new.AddEnglishReportReq true "type json string"
+// ReportDefaultSave
+// @Title 保存-转报告默认设置
+// @Description 保存-转报告默认设置
+// @Param	request	body day_new.EnglishReportDefaultSaveReq true "type json string"
 // @Success 200 {object}
 // @router /day_new/report_default/save [post]
 func (this *DayNewController) ReportDefaultSave() {
@@ -533,6 +536,8 @@ func (this *DayNewController) ReportDefaultSave() {
 	item.ClassifyNameFirst = req.ClassifyNameFirst
 	item.ClassifyIdSecond = req.ClassifyIdSecond
 	item.ClassifyNameSecond = req.ClassifyNameSecond
+	item.ClassifyIdThird = req.ClassifyIdThird
+	item.ClassifyNameThird = req.ClassifyNameThird
 	item.Title = req.Title
 	item.Abstract = req.Abstract
 	item.Author = req.Author
@@ -557,7 +562,7 @@ func (this *DayNewController) ReportDefaultSave() {
 		}
 	} else {
 		item.Id = exist.Id
-		ups := []string{"ClassifyIdFirst", "ClassifyNameFirst", "ClassifyIdSecond", "ClassifyNameSecond", "Title", "Abstract", "Author", "Frequency", "Overview", "ModifyTime"}
+		ups := []string{"ClassifyIdFirst", "ClassifyNameFirst", "ClassifyIdSecond", "ClassifyNameSecond", "Title", "Abstract", "Author", "Frequency", "Overview", "ModifyTime", "ClassifyIdThird", "ClassifyNameThird"}
 		err = item.Update(ups)
 		if err != nil {
 			br.Msg = "保存失败"

+ 2 - 2
controllers/english_report/en_permission.go

@@ -198,7 +198,7 @@ func (this *EnPermissionController) ParentList() {
 		return
 	}
 
-	cond := fmt.Sprintf(` AND %s = ?`, models.EnPermissionColumns.ParentId)
+	cond := fmt.Sprintf(` enabled = 1 AND %s = ?`, models.EnPermissionColumns.ParentId)
 	pars := make([]interface{}, 0)
 	pars = append(pars, 0)
 	ob := new(models.EnPermission)
@@ -278,7 +278,7 @@ func (this *EnPermissionController) List() {
 		limitIds = ps
 	}
 
-	cond := ``
+	cond := ` AND enabled=1 `
 	pars := make([]interface{}, 0)
 	if keyword != "" {
 		k := fmt.Sprint("%", keyword, "%")

+ 16 - 379
controllers/english_report/english_classify.go

@@ -2,17 +2,11 @@ package english_report
 
 import (
 	"fmt"
-	"github.com/rdlucklib/rdluck_tools/paging"
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/utils"
 	"sort"
 )
 
-// EnglishClassifyController 英文分类
-//type EnglishClassifyController struct {
-//	controllers.BaseAuthController
-//}
-
 // ListClassify
 // @Title 获取分类列表
 // @Description 获取分类列表
@@ -28,46 +22,24 @@ func (this *EnglishReportController) ListClassify() {
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
-	pageSize, _ := this.GetInt("PageSize")
-	currentIndex, _ := this.GetInt("CurrentIndex")
-	keyWord := this.GetString("KeyWord")
 
-	var startSize int
-	if pageSize <= 0 {
-		pageSize = utils.PageSize20
-	}
-	if currentIndex <= 0 {
-		currentIndex = 1
+	keyWord := this.GetString("KeyWord")
+	reqEnabled, _ := this.GetInt("Enabled", -1)
+	enabled := -1
+	if reqEnabled == 1 {
+		enabled = reqEnabled
 	}
-
-	startSize = utils.StartIndex(currentIndex, pageSize)
-
-	page := paging.GetPaging(currentIndex, pageSize, 0)
 	resp := new(models.EnglishClassifyListResp)
 
 	// 处理一级分类分页的情况
-	rootList, err := models.GetEnglishClassifyRootId(startSize, pageSize, keyWord)
+	rootList, err := models.GetEnglishClassifyRootId(keyWord, enabled)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
-	var ids []int
-	var rootIds []int
-	rootMap := make(map[int]struct{}, 0)
-	for _, v := range rootList {
-		rootIds = append(rootIds, v.Id)
-		rootMap[v.Id] = struct{}{}
-	}
-	total, err := models.GetEnglishClassifyListCount(keyWord)
-	if err != nil {
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取失败,Err:" + err.Error()
-		return
-	}
-	if total == 0 {
+	if len(rootList) == 0 {
 		resp.List = make([]*models.EnglishClassifyList, 0)
-		resp.Paging = page
 
 		br.Data = resp
 		br.Ret = 200
@@ -75,10 +47,16 @@ func (this *EnglishReportController) ListClassify() {
 		br.Msg = "获取成功"
 		return
 	}
-	page = paging.GetPaging(currentIndex, pageSize, total)
+	var ids []int
+	var rootIds []int
+	rootMap := make(map[int]struct{}, 0)
+	for _, v := range rootList {
+		rootIds = append(rootIds, v.Id)
+		rootMap[v.Id] = struct{}{}
+	}
 
 	//获取相关的分类ID
-	idList, err := models.GetEnglishClassifyListByRootId(rootIds, keyWord)
+	idList, err := models.GetEnglishClassifyListByRootId(rootIds, keyWord, enabled)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
@@ -100,7 +78,7 @@ func (this *EnglishReportController) ListClassify() {
 			}
 			if _, ok := childIdMap[v.Id]; !ok {
 				ids = append(ids, v.Id)
-				childIdMap[v.ParentId] = struct{}{}
+				childIdMap[v.Id] = struct{}{}
 			}
 		}
 		tmpList, err := models.GetEnglishClassifyChildByIds(ids)
@@ -172,350 +150,9 @@ func (this *EnglishReportController) ListClassify() {
 	sort.Sort(sortList)
 
 	resp.List = sortList
-	resp.Paging = page
 
 	br.Data = resp
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
 }
-
-//// @Title 新增分类
-//// @Description 新增分类接口
-//// @Param   ClassifyName   int  true       "分类名称"
-//// @Param   ParentId   query   int  true       "父级Id 添加父级时为0"
-//// @Param   Sort   query   string  false       "排序"
-//// @Success 200 新增成功
-//// @router /classify/add [get]
-//func (this *EnglishReportController) AddClassify() {
-//	br := new(models.BaseResponse).Init()
-//	defer func() {
-//		this.Data["json"] = br
-//		this.ServeJSON()
-//	}()
-//	classifyName := this.GetString("ClassifyName")
-//	parentId, _ := this.GetInt("ParentId")
-//	classifyType, _ := this.GetInt("ClassifyType", 0)
-//	sort, _ := this.GetInt("Sort")
-//
-//	item := &models.EnglishClassify{
-//		ClassifyName: classifyName,
-//		Sort:         sort,
-//		ParentId:     parentId,
-//		CreateTime:   time.Now(),
-//		ModifyTime:   time.Now(),
-//		ClassifyType: classifyType,
-//		IsShow:       1,
-//	}
-//	counts, err := models.GetEnglishClassifyCountsByName(classifyName, parentId, classifyType)
-//	if err != nil {
-//		br.Msg = "查询失败"
-//		br.ErrMsg = "查询失败,Err:" + err.Error()
-//		return
-//	}
-//	if counts > 0 {
-//		br.Msg = "该名称已存在"
-//		br.ErrMsg = "该名称已存在!"
-//		return
-//	}
-//	_, err = models.AddEnglishClassify(item)
-//	if err != nil {
-//		br.Msg = "保存失败"
-//		br.ErrMsg = "保存失败,Err:" + err.Error()
-//		return
-//	}
-//
-//	br.Ret = 200
-//	br.Success = true
-//	br.Msg = "新增成功"
-//}
-//
-//// @Title 编辑分类
-//// @Description 编辑分类接口
-//// @Param   ClassifyId   int  true       "分类Id"
-//// @Param   ClassifyName   string  true       "分类名称"
-//// @Param   ParentId   query   int  true       "父级Id 添加父级时为0"
-//// @Param   Sort   query   string  false       "排序"
-//// @Success 200 保存成功
-//// @router /classify/edit [get]
-//func (this *EnglishReportController) EditClassify() {
-//	br := new(models.BaseResponse).Init()
-//	defer func() {
-//		this.Data["json"] = br
-//		this.ServeJSON()
-//	}()
-//	classifyId, _ := this.GetInt("ClassifyId")
-//	classifyName := this.GetString("ClassifyName")
-//	parentId, _ := this.GetInt("ParentId")
-//	sort, _ := this.GetInt("Sort")
-//
-//	if parentId == classifyId {
-//		br.Msg = "上级分类不能选择自己"
-//		return
-//	}
-//	if classifyId <= 0 {
-//		br.Msg = "参数错误"
-//		return
-//	}
-//	if classifyName == "" {
-//		br.Msg = "分类名称不可为空"
-//		return
-//	}
-//
-//	oldItem, err := models.GetEnglishReportClassifyById(classifyId)
-//	if err != nil && err.Error() != utils.ErrNoRow() {
-//		br.Msg = "获取信息失败"
-//		br.ErrMsg = "获取信息失败,Err:" + err.Error()
-//		return
-//	}
-//	parent, err := models.GetEnglishReportClassifyById(parentId)
-//	if err != nil && err.Error() != utils.ErrNoRow() {
-//		br.Msg = "获取信息失败"
-//		br.ErrMsg = "获取信息失败,Err:" + err.Error()
-//		return
-//	}
-//
-//	if oldItem.ParentId == 0 && parentId > 0 {
-//		// 一级分类变更为二级分类,禁止
-//		br.Msg = "一级分类不允许更改为二级分类"
-//		return
-//	}
-//
-//	//判断是否已存在同个名称的分类
-//	existItem, e := models.GetEnglishClassifyByClassifyNameParentId(classifyName, parentId, oldItem.ClassifyType)
-//	if e != nil {
-//		if e.Error() != utils.ErrNoRow() {
-//			br.Msg = "查询已存在的分类出错"
-//			br.ErrMsg = "查询已存在的分类出错, Err:" + e.Error()
-//			return
-//		}
-//	}
-//	if e == nil && existItem.Id != oldItem.Id {
-//		br.Msg = "分类名称:" + classifyName + "已存在"
-//		return
-//	}
-//	if err != nil && err.Error() != utils.ErrNoRow() {
-//		br.Msg = "获取信息失败"
-//		br.ErrMsg = "获取信息失败,Err:" + err.Error()
-//		return
-//	}
-//
-//	//oldParentId := item.ParentId
-//	item := &models.EnglishClassify{
-//		Id:           oldItem.Id,
-//		ClassifyName: classifyName,
-//		Sort:         sort,
-//		ParentId:     parentId,
-//		ModifyTime:   time.Now(),
-//		ClassifyType: oldItem.ClassifyType,
-//		IsShow:       1,
-//	}
-//	if oldItem.ClassifyType == 1 {
-//		err = services.UpdateEnglishVideoClassifyId(oldItem, item, parent, classifyId)
-//		if err != nil {
-//			br.Msg = err.Error()
-//			return
-//		}
-//	} else {
-//		// 更新研报里的分类名称
-//		err = services.UpdateEnglishReportClassifyId(oldItem, item, parent, classifyId)
-//		if err != nil {
-//			br.Msg = err.Error()
-//			return
-//		}
-//	}
-//
-//	err = models.ModifyEnglishClassify(item)
-//	if err != nil {
-//		br.Msg = "保存失败"
-//		br.ErrMsg = "保存失败,Err:" + err.Error()
-//		return
-//	}
-//
-//	br.Ret = 200
-//	br.Success = true
-//	br.Msg = "保存成功"
-//}
-//
-//// @Title 删除分类列表
-//// @Description 删除分类列表
-//// @Param   ClassifyId   int  true       "分类名称"
-//// @Param   ParentId   query   int  true   "父级Id"
-//// @Success 200 保存成功
-//// @router /classify/delete [get]
-//func (this *EnglishReportController) DelClassify() {
-//	br := new(models.BaseResponse).Init()
-//	defer func() {
-//		this.Data["json"] = br
-//		this.ServeJSON()
-//	}()
-//	classifyId, _ := this.GetInt("ClassifyId")
-//	//parentId, _ := this.GetInt("ParentId")
-//
-//	classifyInfo, err := models.GetEnglishReportClassifyById(classifyId)
-//	if err != nil {
-//		if err.Error() == utils.ErrNoRow() {
-//			br.Msg = "当前分类不存在"
-//			br.ErrMsg = "当前分类不存在"
-//			return
-//		}
-//		br.Msg = "获取分类信息失败"
-//		br.ErrMsg = "获取分类信息失败,Err:" + err.Error()
-//		return
-//	}
-//
-//	count, err := models.GetEnglishClassifyChildCounts(classifyId)
-//	if err != nil && err.Error() != utils.ErrNoRow() {
-//		br.Msg = "获取信息失败"
-//		br.ErrMsg = "获取失败,Err:" + err.Error()
-//		return
-//	}
-//
-//	if count > 0 {
-//		br.Msg = "请先删除该分类下关联分类"
-//		br.Ret = 403
-//		return
-//	}
-//
-//	if classifyInfo.ClassifyType == 0 {
-//		reportCount, e := models.GetEnglishReportCounts(classifyId, classifyInfo.ParentId)
-//		if e != nil && e.Error() != utils.ErrNoRow() {
-//			br.Msg = "获取信息失败"
-//			br.ErrMsg = "获取失败,Err:" + e.Error()
-//			return
-//		}
-//
-//		if reportCount > 0 {
-//			br.Msg = "该分类有关联报告,不允许删除"
-//			br.Ret = 403
-//			return
-//		}
-//	} else {
-//		videoCount, e := models.GetEnglishVideoCounts(classifyId, classifyInfo.ParentId)
-//		if e != nil && e.Error() != utils.ErrNoRow() {
-//			br.Msg = "获取信息失败"
-//			br.ErrMsg = "获取失败,Err:" + e.Error()
-//			return
-//		}
-//
-//		if videoCount > 0 {
-//			br.Msg = "该分类有关联的路演视频,不允许删除"
-//			br.Ret = 403
-//			return
-//		}
-//	}
-//
-//	if err = models.DeleteEnglishClassify(classifyId); err != nil {
-//		br.Msg = "删除失败"
-//		br.ErrMsg = "删除报告失败, Err: " + err.Error()
-//		return
-//	}
-//
-//	br.Ret = 200
-//	br.Success = true
-//	br.Msg = "删除成功"
-//}
-//
-//// @Title 获取一级分类列表
-//// @Description 获取一级分类列表
-//// @Param   PageSize   query   int  true       "每页数据条数"
-//// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
-//// @Param   CompanyType   query   string  false       "产品类型,枚举值:'ficc','权益';不传默认返回全部"
-//// @Success 200 {object} models.EnglishClassifyListResp
-//// @router /classify/first/list [get]
-//func (this *EnglishReportController) FistListClassify() {
-//	br := new(models.BaseResponse).Init()
-//	defer func() {
-//		this.Data["json"] = br
-//		this.ServeJSON()
-//	}()
-//	pageSize, _ := this.GetInt("PageSize")
-//	currentIndex, _ := this.GetInt("CurrentIndex")
-//	classifyType, _ := this.GetInt("ClassifyType", 0)
-//
-//	var startSize int
-//	if pageSize <= 0 {
-//		pageSize = utils.PageSize20
-//	}
-//	if currentIndex <= 0 {
-//		currentIndex = 1
-//	}
-//
-//	startSize = utils.StartIndex(currentIndex, pageSize)
-//	list, err := models.GetEnglishFirstClassifyList(classifyType, startSize, pageSize)
-//	if err != nil {
-//		br.Msg = "获取失败"
-//		br.ErrMsg = "获取失败,Err:" + err.Error()
-//		return
-//	}
-//	total, err := models.GetEnglishFirstClassifyListCount(classifyType)
-//	if err != nil {
-//		br.Msg = "获取失败"
-//		br.ErrMsg = "获取失败,Err:" + err.Error()
-//		return
-//	}
-//
-//	page := paging.GetPaging(currentIndex, pageSize, total)
-//	resp := new(models.EnglishClassifyListResp)
-//	resp.List = list
-//	resp.Paging = page
-//
-//	br.Data = resp
-//	br.Ret = 200
-//	br.Success = true
-//	br.Msg = "获取成功"
-//}
-//
-//// PermissionEdit
-//// @Title 编辑品种权限
-//// @Description 编辑品种权限
-//// @Param	request	body models.EnPermissionAddReq true "type json string"
-//// @Success 200 Ret=200 操作成功
-//// @router /permission/edit [post]
-//func (this *EnglishClassifyController) PermissionEdit() {
-//	br := new(models.BaseResponse).Init()
-//	defer func() {
-//		if br.ErrMsg == "" {
-//			br.IsSendEmail = false
-//		}
-//		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 models.EnClassifyPermissionEditReq
-//	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
-//		br.Msg = "参数解析异常!"
-//		br.ErrMsg = "参数解析失败,Err:" + e.Error()
-//		return
-//	}
-//	if req.ClassifyId <= 0 {
-//		br.Msg = "参数有误"
-//		return
-//	}
-//
-//	// 更新品种权限
-//	nowTime := time.Now().Local()
-//	permissions := make([]*models.EnClassifyPermission, 0)
-//	for _, p := range req.EnPermissions {
-//		v := new(models.EnClassifyPermission)
-//		v.EnPermissionId = p
-//		v.EnClassifyId = req.ClassifyId
-//		v.CreateTime = nowTime
-//		permissions = append(permissions, v)
-//	}
-//	if e := models.ClearAndCreateEnClassifyPermissions(req.ClassifyId, permissions); e != nil {
-//		br.Msg = "保存失败"
-//		br.ErrMsg = "更新分类品种权限失败, Err: " + e.Error()
-//		return
-//	}
-//
-//	br.Ret = 200
-//	br.Success = true
-//	br.Msg = "操作成功"
-//}

+ 325 - 17
controllers/eta_business/eta_business.go

@@ -162,6 +162,14 @@ func (this *EtaBusinessController) PageList() {
 			cond += fmt.Sprintf(` AND %s = ?`, eta_business.EtaBusinessColumns.IndustryId)
 			pars = append(pars, industryId)
 		}
+
+		// 国家
+		nation := this.GetString("Nation", "")
+		nation = strings.TrimSpace(nation)
+		if nation != "" {
+			cond += ` AND nation = ? `
+			pars = append(pars, nation)
+		}
 	}
 
 	order := ``
@@ -228,6 +236,7 @@ func (this *EtaBusinessController) PageList() {
 		b.ExpiredTime = utils.TimeTransferString(utils.FormatDate, v.ExpiredTime)
 		b.CreateTime = v.CreateTime.Format(utils.FormatDateTime)
 		b.ModifyTime = v.ModifyTime.Format(utils.FormatDateTime)
+		b.Nation = v.Nation
 		items = append(items, b)
 	}
 
@@ -291,15 +300,18 @@ func (this *EtaBusinessController) Add() {
 		return
 	}
 	req.Province = strings.TrimSpace(req.Province)
-	if req.Province == "" {
-		br.Msg = "省份不可为空"
-		return
-	}
-	req.City = strings.TrimSpace(req.City)
-	if req.City == "" {
-		br.Msg = "城市不可为空"
-		return
+	if req.Nation == "" {
+		if req.Province == "" {
+			br.Msg = "省份不可为空"
+			return
+		}
+		req.City = strings.TrimSpace(req.City)
+		if req.City == "" {
+			br.Msg = "城市不可为空"
+			return
+		}
 	}
+
 	req.Leader = strings.TrimSpace(req.Leader)
 	if req.Leader == "" {
 		br.Msg = "决策人不可为空"
@@ -431,6 +443,7 @@ func (this *EtaBusinessController) Add() {
 	businessItem.ExpiredTime = expiredTime
 	businessItem.CreateTime = now
 	businessItem.ModifyTime = now
+	businessItem.Nation = req.Nation
 	contractItem := new(eta_business.EtaBusinessContract)
 	if !signTime.IsZero() && !expiredTime.IsZero() {
 		contractItem.SigningTime = signTime
@@ -505,16 +518,19 @@ func (this *EtaBusinessController) Edit() {
 		br.ErrMsg = "参数有误, 商家ID为空"
 		return
 	}
-	req.Province = strings.TrimSpace(req.Province)
-	if req.Province == "" {
-		br.Msg = "省份不可为空"
-		return
-	}
-	req.City = strings.TrimSpace(req.City)
-	if req.City == "" {
-		br.Msg = "城市不可为空"
-		return
+	if req.Nation == "" {
+		req.Province = strings.TrimSpace(req.Province)
+		if req.Province == "" {
+			br.Msg = "省份不可为空"
+			return
+		}
+		req.City = strings.TrimSpace(req.City)
+		if req.City == "" {
+			br.Msg = "城市不可为空"
+			return
+		}
 	}
+
 	req.Leader = strings.TrimSpace(req.Leader)
 	if req.Leader == "" {
 		br.Msg = "决策人不可为空"
@@ -566,6 +582,7 @@ func (this *EtaBusinessController) Edit() {
 	item.CapitalScale = req.CapitalScale
 	item.ResearchTeamSize = req.ResearchTeamSize
 	item.UserMax = req.UserMax
+	item.Nation = req.Nation
 	item.ModifyTime = time.Now().Local()
 	cols := []string{
 		"Province", "City", "Address", "Leader", "IndustryId", "IndustryName", "CapitalScale", "ResearchTeamSize", "UserMax", "ModifyTime",
@@ -1039,6 +1056,7 @@ func (this *EtaBusinessController) Detail() {
 	resp.ExpiredTime = utils.TimeTransferString(utils.FormatDate, item.ExpiredTime)
 	resp.CreateTime = item.CreateTime.Format(utils.FormatDateTime)
 	resp.ModifyTime = item.ModifyTime.Format(utils.FormatDateTime)
+	resp.Nation = item.Nation
 
 	br.Data = resp
 	br.Ret = 200
@@ -1204,3 +1222,293 @@ func (this *EtaBusinessController) OperateRecordList() {
 	br.Success = true
 	br.Msg = "获取成功"
 }
+
+// EditSign
+// @Title 编辑签约
+// @Description 编辑签约
+// @Param	request	body eta_business.EtaBusinessEditSignReq true "type json string"
+// @Success 200 Ret=200 操作成功
+// @router /edit_sign [post]
+func (this *EtaBusinessController) EditSign() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		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 eta_business.EtaBusinessEditSignReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+	if req.EtaBusinessContractId <= 0 {
+		br.Msg = "参数有误"
+		br.ErrMsg = "参数有误, 商家签约ID为空"
+		return
+	}
+	if req.SigningTime == "" {
+		br.Msg = "签约时间不可为空"
+		return
+	}
+	if req.ExpiredTime == "" {
+		br.Msg = "到期时间不可为空"
+		return
+	}
+	signTime, e := time.ParseInLocation(utils.FormatDate, req.SigningTime, time.Local)
+	if e != nil {
+		br.Msg = "签约时间格式有误"
+		br.ErrMsg = "签约时间格式有误, Err: " + e.Error()
+		return
+	}
+	expiredTime, e := time.ParseInLocation(utils.FormatDate, req.ExpiredTime, time.Local)
+	if e != nil {
+		br.Msg = "到期时间格式有误"
+		br.ErrMsg = "到期时间格式有误, Err: " + e.Error()
+		return
+	}
+	if !expiredTime.After(signTime) {
+		br.Msg = "到期时间不得早于签约时间"
+		return
+	}
+
+	// 权限校验
+	ok, e := etaBusinessService.CheckEtaBusinessOperateAuth(sysUser.RoleTypeCode)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "操作权限校验失败, ErrMsg: " + e.Error()
+		return
+	}
+	if !ok {
+		br.Msg = "无权操作"
+		return
+	}
+
+	contractOb := new(eta_business.EtaBusinessContract)
+	contract, e := contractOb.GetItemById(req.EtaBusinessContractId)
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Msg = "签约信息不存在, 请刷新页面"
+			return
+		}
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取商家签约信息失败, Err: " + e.Error()
+		return
+	}
+	businessOb := new(eta_business.EtaBusiness)
+	business, e := businessOb.GetItemById(contract.EtaBusinessId)
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Msg = "商家不存在, 请刷新页面"
+			return
+		}
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取商家信息失败, Err: " + e.Error()
+		return
+	}
+
+	// 续约不可早于当前生效合约的到期时间
+	if business.ContractId > 0 && business.ContractId != req.EtaBusinessContractId {
+		{
+			ob := new(eta_business.EtaBusinessContract)
+			item, e := ob.GetItemById(business.ContractId)
+			if e != nil {
+				br.Msg = "操作失败"
+				br.ErrMsg = "获取商家当前合同失败, Err: " + e.Error()
+				return
+			}
+			if !signTime.After(item.ExpiredTime) {
+				br.Msg = "签约时间不可早于当前合同的到期时间"
+				return
+			}
+		}
+	}
+
+	// 获取历史签约, 签约日期不可交叠
+	cond := fmt.Sprintf(` AND %s = ?`, eta_business.EtaBusinessContractColumns.EtaBusinessId)
+	pars := make([]interface{}, 0)
+	pars = append(pars, contract.EtaBusinessId)
+	contracts, e := contractOb.GetItemsByCondition(cond, pars, []string{}, "signing_time ASC")
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取商家签约列表失败, Err: " + e.Error()
+		return
+	}
+
+	// 校验签约时间是否重叠
+	isFirst := true      // 是否为首次签约
+	changeFirst := false // 是否需要更新首次签约合同
+	if len(contracts) > 0 {
+		isFirst = false
+		for k, c := range contracts {
+			if c.EtaBusinessContractId == req.EtaBusinessContractId {
+				continue
+			}
+			pass := false
+			if expiredTime.Before(c.SigningTime) {
+				pass = true
+			}
+			if signTime.After(c.ExpiredTime) {
+				pass = true
+			}
+			if !pass {
+				br.Msg = "签约时间在存续期内, 请检查"
+				return
+			}
+			// 若该合同签约时间早于第一份合同(业务上未限制所以可能会出现这种情况, contracts已排序), 则更新为首次签约合同
+			if k == 0 && signTime.Before(c.SigningTime) {
+				changeFirst = true
+				isFirst = true
+			}
+		}
+	}
+
+	// 新增签约
+	contract.SigningTime = signTime
+	contract.ExpiredTime = expiredTime
+	contract.ModifyTime = time.Now().Local()
+	if isFirst {
+		contract.IsFirst = 1
+	}
+	updateCols := []string{"SigningTime", "ExpiredTime", "ModifyTime"}
+	if e = contract.UpdateMaybeUpdateFirst(contract, changeFirst, updateCols); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "编辑签约失败, Err: " + e.Error()
+		return
+	}
+
+	// 签约后续操作
+	go func() {
+		_ = etaBusinessService.UpdateEtaBusinessAfterSigning(business.EtaBusinessId)
+	}()
+
+	// 续约操作日志
+	if !isFirst {
+		go func() {
+			recordOb := new(eta_business.EtaBusinessOperationRecord)
+			recordOb.EtaBusinessId = business.EtaBusinessId
+			recordOb.SellerId = business.SellerId
+			recordOb.SysUserId = sysUser.AdminId
+			recordOb.SysRealName = sysUser.RealName
+			recordOb.OperationType = eta_business.EtaBusinessOperationTypeEditContract
+			recordOb.OperationRemark = fmt.Sprintf("%s编辑续约", sysUser.RealName)
+			recordOb.CreateTime = time.Now().Local()
+			_ = recordOb.Create()
+		}()
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}
+
+// RemoveSign
+// @Title 删除签约
+// @Description 删除签约
+// @Param	request	body eta_business.EtaBusinessRemoveSignReq true "type json string"
+// @Success 200 Ret=200 操作成功
+// @router /remove_sign [post]
+func (this *EtaBusinessController) RemoveSign() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		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 eta_business.EtaBusinessRemoveSignReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+	if req.EtaBusinessContractId <= 0 {
+		br.Msg = "参数有误"
+		br.ErrMsg = "参数有误, 商家签约ID为空"
+		return
+	}
+
+	// 权限校验
+	ok, e := etaBusinessService.CheckEtaBusinessOperateAuth(sysUser.RoleTypeCode)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "操作权限校验失败, ErrMsg: " + e.Error()
+		return
+	}
+	if !ok {
+		br.Msg = "无权操作"
+		return
+	}
+
+	// 获取商家信息
+	contractOb := new(eta_business.EtaBusinessContract)
+	contract, e := contractOb.GetItemById(req.EtaBusinessContractId)
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Msg = "签约信息不存在, 请刷新页面"
+			return
+		}
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取商家签约信息失败, Err: " + e.Error()
+		return
+	}
+
+	// 获取商家信息
+	businessOb := new(eta_business.EtaBusiness)
+	business, e := businessOb.GetItemById(contract.EtaBusinessId)
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Msg = "商家不存在, 请检查"
+			return
+		}
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取商家信息失败, Err: " + e.Error()
+		return
+	}
+
+	// 删除签约
+	if e = contract.Del(); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "删除签约失败, Err: " + e.Error()
+		return
+	}
+
+	// 签约后续操作
+	go func() {
+		_ = etaBusinessService.UpdateEtaBusinessAfterSigning(business.EtaBusinessId)
+	}()
+
+	// 操作日志
+	go func() {
+		recordOb := new(eta_business.EtaBusinessOperationRecord)
+		recordOb.EtaBusinessId = business.EtaBusinessId
+		recordOb.SellerId = business.SellerId
+		recordOb.SysUserId = sysUser.AdminId
+		recordOb.SysRealName = sysUser.RealName
+		recordOb.OperationType = eta_business.EtaBusinessOperationTypeRemoveContract
+		recordOb.OperationRemark = fmt.Sprintf("%s删除签约", sysUser.RealName)
+		recordOb.CreateTime = time.Now().Local()
+		_ = recordOb.Create()
+	}()
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 2 - 1
controllers/eta_trial.go

@@ -887,7 +887,8 @@ func (this *ETATrialController) Approval() {
 
 		// 新增试用客户手工权限
 		go func() {
-			_ = services.CreateTrialUserManualAuth(newId, admin.RealName)
+			//_ = services.CreateTrialUserManualAuth(newId, admin.RealName)
+			_ = services.EtaTrialManualUserAddAuth(newId, admin.RealName)
 		}()
 	}
 

+ 77 - 54
controllers/full_company.go

@@ -1128,9 +1128,10 @@ func (this *FullCompanyController) List() {
 			//viewTotal:=GetviewTotal(v.CompanyId)
 
 			//活跃(客户状态)
-			tmpStatus := v.Status
-			if v.IsShare == 1 {
-				tmpStatus = v.Status + "(共享)"
+			if v.IsShare != 1 {
+				if v.BtnItem.BtnModifySeller == true {
+					v.BtnItem.BtnModifySeller = false
+				}
 			}
 			//productIdSlice := strings.Split(v.ProductIds, "/")
 			//statusSlice := strings.Split(v.Status, "/")
@@ -1230,7 +1231,7 @@ func (this *FullCompanyController) List() {
 				RenewalReason:    v.RenewalReason,
 				FreezeReason:     v.FreezeReason,
 				LossTime:         v.LossTime,
-				Status:           tmpStatus,
+				Status:           v.StatusStr,
 				CompanyType:      v.CompanyType,
 				ApproveStatus:    v.ApproveStatus,
 				SellerName:       v.SellerName,
@@ -1281,6 +1282,7 @@ func (this *FullCompanyController) List() {
 				IsShare:         v.IsShare,
 				CloseTime:       v.CloseTime,
 				CloseReason:     v.CloseReason,
+				ShareSellerId:   v.ShareSellerId,
 			}
 			companyLists = append(companyLists, companyList)
 		}
@@ -2312,7 +2314,6 @@ func (this *FullCompanyController) Detail() {
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
 		return
 	}
-	shareSellerId := item.ShareSellerId
 	var productName string
 	productId := services.GetProductId(sysUser.RoleTypeCode)
 	// 销售经理赋予admin查看权限
@@ -2361,7 +2362,7 @@ func (this *FullCompanyController) 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 || item.ShareSellerId == sysUser.AdminId {
 						btnDetailItem.BtnHistoryList = true
 					}
 					if sysUser.Authority > 0 {
@@ -2374,51 +2375,60 @@ func (this *FullCompanyController) Detail() {
 					}
 				}
 			}
-			for _, v := range utils.PermissionFiccClassifyArr {
-				checkList := make([]int, 0)
-				plist := new(company.PermissionLookList)
-				items, err := company.GetPermissionLookItems(item.ProductId, v)
-				if err != nil {
-					br.Msg = "获取失败"
-					br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
-					return
-				}
-				for itemK, n := range items {
-					permission, err := company.GetCompanyPermissionCheckItem(companyId, n.ChartPermissionId)
-					if err != nil && err.Error() != utils.ErrNoRow() {
-						br.Msg = "获取失败"
-						br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
+			//子权限切片集合
+			allFiccPermissions, permissionMap, e := services.GetBasePermissionLookItem(utils.COMPANY_PRODUCT_FICC_ID)
+			if e != nil {
+				br.Msg = "查询基础权限失败"
+				br.ErrMsg = "查询基础权限失败,Err:" + e.Error()
+				return
+			}
+			//遍历获取
+			for _, v := range allFiccPermissions {
+				if v.ParentId == 0 {
+					checkList := make([]int, 0)
+					plist := new(company.PermissionLookList)
+					items, ok := permissionMap[v.ChartPermissionId]
+					if !ok {
+						br.Msg = "获取权限信息失败"
 						return
 					}
-					if permission != nil && permission.ChartPermissionId > 0 {
-						checkList = append(checkList, n.ChartPermissionId)
-						items[itemK].StartDate = permission.StartDate
-						items[itemK].EndDate = permission.EndDate
-						items[itemK].Status = permission.Status
+					for itemK, n := range items {
+						permission, err := company.GetCompanyPermissionCheckItem(companyId, n.ChartPermissionId)
+						if err != nil && err.Error() != utils.ErrNoRow() {
+							br.Msg = "获取失败"
+							br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
+							return
+						}
+						if permission != nil && permission.ChartPermissionId > 0 {
+							checkList = append(checkList, n.ChartPermissionId)
+							items[itemK].StartDate = permission.StartDate
+							items[itemK].EndDate = permission.EndDate
+							items[itemK].Status = permission.Status
 
-						endDateTime, _ := time.Parse(utils.FormatDate, permission.EndDate)
-						endDateTime = endDateTime.AddDate(0, 0, 1)
-						sub := endDateTime.Sub(time.Now())
-						if sub < 0 {
-							sub = 0
+							endDateTime, _ := time.Parse(utils.FormatDate, permission.EndDate)
+							endDateTime = endDateTime.AddDate(0, 0, 1)
+							sub := endDateTime.Sub(time.Now())
+							if sub < 0 {
+								sub = 0
+							}
+							expireDay := fmt.Sprintf("%v", int(sub.Hours()/24))
+							items[itemK].ExpireDay = expireDay
 						}
-						expireDay := fmt.Sprintf("%v", int(sub.Hours()/24))
-						items[itemK].ExpireDay = expireDay
+						//count, err := company.GetCompanyPermissionCheck(companyId, n.ChartPermissionId)
+						//if err != nil {
+						//	br.Msg = "获取失败"
+						//	br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
+						//	return
+						//}
+						//if count > 0 {
+						//	checkList = append(checkList, n.ChartPermissionId)
+						//}
 					}
-					//count, err := company.GetCompanyPermissionCheck(companyId, n.ChartPermissionId)
-					//if err != nil {
-					//	br.Msg = "获取失败"
-					//	br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
-					//	return
-					//}
-					//if count > 0 {
-					//	checkList = append(checkList, n.ChartPermissionId)
-					//}
+					plist.Items = items
+					plist.ClassifyName = v.PermissionName
+					plist.CheckList = checkList
+					item.PermissionList = append(item.PermissionList, plist)
 				}
-				plist.Items = items
-				plist.ClassifyName = v
-				plist.CheckList = checkList
-				item.PermissionList = append(item.PermissionList, plist)
 			}
 			resp.FiccItem = item
 			if (roleTypeCode == utils.ROLE_TYPE_CODE_FICC_SELLER ||
@@ -2469,7 +2479,8 @@ func (this *FullCompanyController) Detail() {
 				resp.IsButtonShow = 1
 			}
 		}
-		btnItem := services.GetCompanyPermissionButton(roleTypeCode, item.Status, strconv.Itoa(item.SellerId), strconv.Itoa(item.GroupId), item.GroupId, sysUser.GroupId, item.SellerId, sysUser.AdminId, sysUser.Authority, item.ProductId, shareSellerId)
+		btnItem := services.GetCompanyPermissionButton(roleTypeCode, item.Status, strconv.Itoa(item.SellerId), strconv.Itoa(item.GroupId),
+			item.GroupId, sysUser.GroupId, item.SellerId, sysUser.AdminId, sysUser.Authority, item.ProductId, item.ShareSellerId, "")
 		//if itemLen > 1 {
 		//	btnDetailItem.BtnEdit = false
 		//	btnDetailItem.BtnDelete = false
@@ -2495,7 +2506,7 @@ func (this *FullCompanyController) Detail() {
 
 		//联系人操作权限
 		if resp.IsContractButtonShow == false {
-			resp.IsContractButtonShow = services.CheckCompanyUserButton(sysUser.RoleTypeCode, item.SellerId, sysUser.AdminId, item.ProductId, shareSellerId, item.Status)
+			resp.IsContractButtonShow = services.CheckCompanyUserButton(sysUser.RoleTypeCode, item.SellerId, sysUser.AdminId, item.ProductId, item.ShareSellerId, item.Status)
 		}
 	}
 
@@ -2635,8 +2646,19 @@ func (this *FullCompanyController) PermissionLook() {
 	}
 
 	resp := new(company.PermissionLookResp)
-	permissionArr := []string{}
+	permissionArr := make([]*models.ChartPermission, 0)
+	var err error
 	if lookType == 1 {
+		permissionArr, err = services.GetPermissionFirstArr(productId)
+	} else {
+		permissionArr, err = services.GetPermissionFirstArr(0)
+	}
+	if err != nil {
+		br.Msg = "获取权限失败"
+		br.ErrMsg = "获取权限失败 err:" + err.Error()
+		return
+	}
+	/*if lookType == 1 {
 		if productId == 1 {
 			for _, permission := range utils.PermissionFiccClassifyArr {
 				permissionArr = append(permissionArr, permission)
@@ -2652,21 +2674,22 @@ func (this *FullCompanyController) PermissionLook() {
 		for _, permission := range utils.PermissionAllClassifyArr {
 			permissionArr = append(permissionArr, permission)
 		}
-	}
+	}*/
 	//ficc权限类目
 	for _, v := range permissionArr {
 		checkList := make([]int, 0)
 		p := new(company.PermissionLookList)
+		p.Items = make([]*company.PermissionLookItem, 0)
 		var productId int
 		//if v == "权益" {
 		//	productId = 2
 		//} else {
 		//	productId = 1
 		//}
-		if v != "权益" {
+		if v.PermissionName != "权益" {
 			productId = 1
 			//mapPermissionName := make(map[string]int)
-			items, err := company.GetPermissionLookItems(productId, v)
+			items, err := company.GetPermissionLookItemsByParentId(productId, v.ChartPermissionId)
 			if err != nil {
 				br.Msg = "获取失败"
 				br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
@@ -2712,7 +2735,7 @@ func (this *FullCompanyController) PermissionLook() {
 				}
 				expireDay := fmt.Sprintf("%v", int(sub.Hours()/24))
 				items[i].ExpireDay = expireDay
-				items[i].ClassifyName = v
+				items[i].ClassifyName = v.PermissionName
 				if lookType == 1 {
 					permissionList = append(permissionList, items[i])
 				} else {
@@ -2729,7 +2752,7 @@ func (this *FullCompanyController) PermissionLook() {
 					mapPermissionNameList[v.PermissionName] = v.ChartPermissionId
 				}
 			}
-			p.ClassifyName = v
+			p.ClassifyName = v.PermissionName
 			//p.Items = permissionList
 			p.CheckList = checkList
 			if lookType == 1 {
@@ -2745,7 +2768,7 @@ func (this *FullCompanyController) PermissionLook() {
 	//权益权限类目
 	for _, v := range permissionArr {
 
-		if v == "权益" {
+		if v.PermissionName == "权益" {
 			// CRM8.8-权益权限列表调用较多、统一进行调整
 			unify := false
 			if lookType == 1 {

+ 12 - 0
controllers/report.go

@@ -202,6 +202,12 @@ func (this *ReportController) SetDayWeekReportUpdateRule() {
 		br.ErrMsg = "设置暂停时间失败, Err: " + err.Error()
 		return
 	}
+	// 同步eta系统的章节更新配置
+	go func() {
+		ruleSyncReq := new(services.EditReportChapterTypeRuleSyncReq)
+		ruleSyncReq.ResearchType = researchType
+		_, _ = services.EditReportChapterTypeRuleSync(ruleSyncReq)
+	}()
 
 	br.Ret = 200
 	br.Success = true
@@ -252,6 +258,12 @@ func (this *ReportController) SetDayWeekReportEnableRule() {
 		return
 	}
 
+	// 同步eta系统的章节更新配置
+	go func() {
+		ruleSyncReq := new(services.EditReportChapterTypeRuleSyncReq)
+		_, _ = services.EditReportChapterTypeRuleSync(ruleSyncReq)
+	}()
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"

+ 150 - 0
controllers/report_chapter_type.go

@@ -0,0 +1,150 @@
+package controllers
+
+import (
+	"encoding/json"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/services"
+	"hongze/hz_crm_api/utils"
+)
+
+// ReportChapterTypeController 报告章节配置
+type ReportChapterTypeController struct {
+	BaseAuthController
+}
+
+// List
+// @Title 报告章节列表
+// @Description 报告章节列表
+// @Param   ReportType  query  string  true  "报告类型: day-晨报; week-周报"
+// @Success 200 {object} models.ReportChapterTypePageListResp
+// @router /chapter_type/list [get]
+func (this *ReportChapterTypeController) List() {
+	br := new(models.BaseResponse).Init()
+	br.IsSendEmail = false
+	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
+	}
+	reportType := this.GetString("ReportType")
+	typeArr := []string{utils.REPORT_TYPE_DAY, utils.REPORT_TYPE_WEEK}
+	if !utils.InArrayByStr(typeArr, reportType) {
+		br.Msg = "请选择报告类型"
+		return
+	}
+
+	cond := ` AND research_type = ?`
+	pars := make([]interface{}, 0)
+	pars = append(pars, reportType)
+	list, e := models.GetReportChapterTypePageList(cond, pars)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取报告章节列表失败, Err: " + e.Error()
+		return
+	}
+	respList := make([]*models.ReportChapterTypeListItem, 0)
+	for i := range list {
+		respList = append(respList, &models.ReportChapterTypeListItem{
+			ReportChapterTypeId:   list[i].ReportChapterTypeId,
+			ReportChapterTypeName: list[i].ReportChapterTypeName,
+			Sort:                  list[i].Sort,
+			CreatedTime:           list[i].CreatedTime.Format(utils.FormatDateTime),
+			ResearchType:          list[i].ResearchType,
+			SelectedImage:         list[i].SelectedImage,
+			UnselectedImage:       list[i].UnselectedImage,
+			WordsImage:            list[i].YbBottomIcon, // 此处的不一样
+			EditImgUrl:            list[i].EditImgUrl,
+			IsShow:                list[i].IsShow,
+			Enabled:               list[i].Enabled,
+		})
+	}
+
+	resp := new(models.ReportChapterTypeListResp)
+	resp.List = respList
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// Edit
+// @Title 编辑报告章节
+// @Description 编辑报告章节
+// @Param	request  body  models.ReportChapterTypeEditReq  true  "type json string"
+// @Success 200 string "操作成功"
+// @router /chapter_type/edit [post]
+func (this *ReportChapterTypeController) Edit() {
+	br := new(models.BaseResponse).Init()
+	br.IsSendEmail = false
+	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 models.ReportChapterTypeEditReq
+	if err := json.Unmarshal(this.Ctx.Input.RequestBody, &req); err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.ReportChapterTypeId <= 0 {
+		br.Msg = "章节ID有误"
+		return
+	}
+
+	item, e := models.GetReportChapterTypeById(req.ReportChapterTypeId)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取报告章节失败, Err:" + e.Error()
+		return
+	}
+
+	item.SelectedImage = req.SelectedImage
+	item.UnselectedImage = req.UnselectedImage
+	item.PcSelectedImage = req.SelectedImage
+	item.PcUnselectedImage = req.UnselectedImage
+	item.EditImgUrl = req.EditImgUrl
+	item.YbIconUrl = req.UnselectedImage
+	item.YbBottomIcon = req.WordsImage
+	item.IsShow = req.IsShow
+	item.ReportChapterTypeThumb = req.EditImgUrl
+	item.BannerUrl = req.UnselectedImage
+
+	updateCols := []string{"SelectedImage", "UnselectedImage",
+		"PcSelectedImage", "PcUnselectedImage", "EditImgUrl", "YbIconUrl", "YbBottomIcon", "IsShow",
+		"ReportChapterTypeThumb", "BannerUrl",
+	}
+	if e = item.Update(updateCols); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "更新报告章节失败, Err:" + e.Error()
+		return
+	}
+
+	// 清除小程序端的章节缓存
+	{
+		key := "hongze_yb:report_chapter_type:GetEffectTypeID"
+		_ = utils.Rc.Delete(key)
+	}
+	// 同步eta系统的章节小程序配置
+	go func() {
+		var reqEta services.EditReportChapterTypeSyncReq
+		reqEta.ReportChapterTypeId = req.ReportChapterTypeId
+		_, _ = services.EditReportChapterTypeSync(&reqEta)
+	}()
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 431 - 0
controllers/roadshow/report.go

@@ -1285,3 +1285,434 @@ func (this *CalendarController) OverseasCustomCalendarAdminList() {
 	br.Data = list
 	return
 }
+
+// OverseasSellerReportList
+// @Title 海外客户销售路演统计
+// @Description 海外客户销售路演统计接口
+// @Param   DataType   query   string  true       "枚举值:week、month、time_interval、online、offline"
+// @Param   DimensionType   query   string  true       "维度枚举值:company_status、roadshow_type"
+// @Param   StartDate   query   string  true       "开始日期,格式:2022-04-06"
+// @Param   EndDate   query   string  true       "结束日期,格式:2022-04-06"
+// @Success 200 {object} roadshow.RsReportRecordResp
+// @router /overseas_custom/seller/list [get]
+func (this *CalendarController) OverseasSellerReportList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	dataType := this.GetString("DataType")
+	dimensionType := this.GetString("DimensionType")
+	startDate := this.GetString("StartDate")
+	endDate := this.GetString("EndDate")
+
+	if dimensionType == "" {
+		dimensionType = "company_status"
+	}
+
+	var adminDataList []roadshowService.OverseasAdminDataMap
+	var err error
+
+	//获取列表
+	switch dataType {
+	case "week":
+		adminDataList, _, err = roadshowService.GetOverseasWeekDataV2("seller", dimensionType, 6)
+		if err != nil {
+			br.Msg = "数据异常"
+			br.ErrMsg = "数据异常,Err:" + err.Error()
+			return
+		}
+	case "month":
+		adminDataList, _, err = roadshowService.GetOverseasMonthDataV2("seller", dimensionType, 6)
+		if err != nil {
+			br.Msg = "数据异常"
+			br.ErrMsg = "数据异常,Err:" + err.Error()
+			return
+		}
+	case "time_interval":
+		if startDate == `` || endDate == `` {
+			br.Msg = "开始日期或结束日期不能为空"
+			br.ErrMsg = "开始日期或结束日期不能为空,Err:" + err.Error()
+			return
+		}
+		adminDataList, _, err = roadshowService.GetOverseasTimeIntervalData(startDate, endDate, "seller", dimensionType)
+		if err != nil {
+			br.Msg = "数据异常"
+			br.ErrMsg = "数据异常,Err:" + err.Error()
+			return
+		}
+
+	}
+
+	sellerList, err := roadshow.GetOverseaCustomCalendarSellerList()
+
+	adminReportRecordList := make([]roadshow.OverseasAdminReportRecord, 0)
+	rsAllReportRecordNumList := make([]roadshow.RsOverseasReportRecordNum, 0)
+	RsReportRecordResp := roadshow.RsOverseasReportRecordResp{
+		List:                  adminReportRecordList,
+		RsReportRecordNumList: rsAllReportRecordNumList,
+	}
+
+	startDateIndexList := make(map[int]string) //开始时间间隔map
+	endDateIndexList := make(map[int]string)   //结束时间间隔map
+
+	tmpAllTryOutNumMap := make(map[int]int)
+	tmpAllFormalNumMap := make(map[int]int)
+	tmpAllCloseNumMap := make(map[int]int)
+	tmpAllOnlineNumMap := make(map[int]int)
+	tmpAllOfflineNumMap := make(map[int]int)
+
+	for _, researcher := range sellerList {
+		//每个区间的数据
+		tmpAdminRsReportRecordNumList := make([]roadshow.RsOverseasReportRecordNum, 0)
+		for index, adminData := range adminDataList {
+			startDateIndexList[index] = adminData.StartDate
+			endDateIndexList[index] = adminData.EndDate
+
+			var tmpTryOutNum, tmpFormalNum, tmpCloseNum, tmpOnlineNum, tmpOfflineNum int
+			if num, ok := adminData.TryOutMap[researcher.AdminId]; ok {
+				tmpTryOutNum = num
+			}
+			if num, ok := adminData.FormalMap[researcher.AdminId]; ok {
+				tmpFormalNum = num
+			}
+			if num, ok := adminData.CloseMap[researcher.AdminId]; ok {
+				tmpCloseNum = num
+			}
+			if num, ok := adminData.OnlineMap[researcher.AdminId]; ok {
+				tmpOnlineNum = num
+			}
+			if num, ok := adminData.OfflineMap[researcher.AdminId]; ok {
+				tmpOfflineNum = num
+			}
+			tmpAdminRsReportRecordNum := roadshow.RsOverseasReportRecordNum{
+				TryOutNum:  tmpTryOutNum,
+				FormalNum:  tmpFormalNum,
+				CloseNum:   tmpCloseNum,
+				OnlineNum:  tmpOnlineNum,
+				OfflineNum: tmpOfflineNum,
+				StartDate:  adminData.StartDate,
+				EndDate:    adminData.EndDate,
+			}
+			tmpAdminRsReportRecordNumList = append(tmpAdminRsReportRecordNumList, tmpAdminRsReportRecordNum)
+
+			//总数据汇总
+			if _, ok := tmpAllTryOutNumMap[index]; !ok {
+				tmpAllTryOutNumMap[index] = 0
+			}
+			if _, ok := tmpAllFormalNumMap[index]; !ok {
+				tmpAllFormalNumMap[index] = 0
+			}
+			if _, ok := tmpAllCloseNumMap[index]; !ok {
+				tmpAllCloseNumMap[index] = 0
+			}
+			if _, ok := tmpAllOnlineNumMap[index]; !ok {
+				tmpAllOnlineNumMap[index] = 0
+			}
+			if _, ok := tmpAllOfflineNumMap[index]; !ok {
+				tmpAllOfflineNumMap[index] = 0
+			}
+			tmpAllTryOutNumMap[index] += tmpTryOutNum
+			tmpAllFormalNumMap[index] += tmpFormalNum
+			tmpAllCloseNumMap[index] += tmpCloseNum
+			tmpAllOnlineNumMap[index] += tmpOnlineNum
+			tmpAllOfflineNumMap[index] += tmpOfflineNum
+		}
+
+		// 数据都为0的时候不显示
+		adminTotalNum := 0
+		for _, v := range tmpAdminRsReportRecordNumList {
+			adminTotalNum += v.TryOutNum + v.CloseNum + v.FormalNum
+		}
+		if adminTotalNum > 0 {
+			tmpAdminReportRecord := roadshow.OverseasAdminReportRecord{
+				Name:                  researcher.RealName,
+				AdminId:               researcher.AdminId,
+				RsReportRecordNumList: tmpAdminRsReportRecordNumList,
+			}
+			RsReportRecordResp.List = append(RsReportRecordResp.List, tmpAdminReportRecord)
+		}
+	}
+
+	//总体汇总数据
+	for i := 0; i < len(tmpAllFormalNumMap); i++ {
+		tmpGroupRsReportRecordNum := roadshow.RsOverseasReportRecordNum{
+			TryOutNum:  tmpAllTryOutNumMap[i],
+			FormalNum:  tmpAllFormalNumMap[i],
+			CloseNum:   tmpAllCloseNumMap[i],
+			OnlineNum:  tmpAllOnlineNumMap[i],
+			OfflineNum: tmpAllOfflineNumMap[i],
+			StartDate:  startDateIndexList[i],
+			EndDate:    endDateIndexList[i],
+		}
+		rsAllReportRecordNumList = append(rsAllReportRecordNumList, tmpGroupRsReportRecordNum)
+	}
+	RsReportRecordResp.RsReportRecordNumList = rsAllReportRecordNumList
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = RsReportRecordResp
+	return
+}
+
+// OverseasResearcherReportList
+// @Title 研究员路演统计
+// @Description 研究员路演统计接口
+// @Param   DataType   query   string  true       "枚举值:week、month、time_interval"
+// @Param   StartDate   query   string  true       "开始日期,格式:2022-04-06"
+// @Param   EndDate   query   string  true       "结束日期,格式:2022-04-06"
+// @Success 200 {object} roadshow.RsReportRecordResp
+// @router /overseas_custom/researcher/list [get]
+func (this *CalendarController) OverseasResearcherReportList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	dataType := this.GetString("DataType")
+	startDate := this.GetString("StartDate")
+	endDate := this.GetString("EndDate")
+
+	var adminDataList []roadshowService.OverseasAdminDataMap
+	var err error
+	//var firstDate time.Time
+	//获取列表
+	switch dataType {
+	case "week":
+		adminDataList, _, err = roadshowService.GetOverseasWeekData("researcher", "company_status")
+		if err != nil {
+			br.Msg = "数据异常"
+			br.ErrMsg = "数据异常,Err:" + err.Error()
+			return
+		}
+	case "month":
+		adminDataList, _, err = roadshowService.GetOverseasMonthData("researcher", "company_status")
+		if err != nil {
+			br.Msg = "数据异常"
+			br.ErrMsg = "数据异常,Err:" + err.Error()
+			return
+		}
+	case "time_interval":
+		if startDate == `` || endDate == `` {
+			br.Msg = "开始日期或结束日期不能为空"
+			br.ErrMsg = "开始日期或结束日期不能为空,Err:" + err.Error()
+			return
+		}
+		adminDataList, _, err = roadshowService.GetOverseasTimeIntervalData(startDate, endDate, "researcher", "company_status")
+		if err != nil {
+			br.Msg = "数据异常"
+			br.ErrMsg = "数据异常,Err:" + err.Error()
+			return
+		}
+
+	}
+
+	researcherList, err := roadshow.GetOverseaCustomCalendarResearcherList()
+	if err != nil {
+		br.Msg = "获取信息失败!"
+		br.ErrMsg = "获取分组信息失败!,GetResearcherV2 Err:" + err.Error()
+		return
+	}
+
+	adminReportRecordList := make([]roadshow.OverseasAdminReportRecord, 0)
+	rsAllReportRecordNumList := make([]roadshow.RsOverseasReportRecordNum, 0)
+	RsReportRecordResp := roadshow.RsOverseasReportRecordResp{
+		List:                  adminReportRecordList,
+		RsReportRecordNumList: rsAllReportRecordNumList,
+	}
+
+	startDateIndexList := make(map[int]string) //开始时间间隔map
+	endDateIndexList := make(map[int]string)   //结束时间间隔map
+
+	tmpAllTryOutNumMap := make(map[int]int)
+	tmpAllFormalNumMap := make(map[int]int)
+	tmpAllMeetingNumMap := make(map[int]int)
+
+	for _, researcher := range researcherList {
+		//组内研究员数据
+
+		//每个区间的数据
+		tmpAdminRsReportRecordNumList := make([]roadshow.RsOverseasReportRecordNum, 0)
+		for index, adminData := range adminDataList {
+			startDateIndexList[index] = adminData.StartDate
+			endDateIndexList[index] = adminData.EndDate
+
+			var tmpTryOutNum, tmpFormalNum, tmpCloseNum int
+			if num, ok := adminData.TryOutMap[researcher.AdminId]; ok {
+				tmpTryOutNum = num
+			}
+			if num, ok := adminData.FormalMap[researcher.AdminId]; ok {
+				tmpFormalNum = num
+			}
+			if num, ok := adminData.CloseMap[researcher.AdminId]; ok {
+				tmpCloseNum = num
+			}
+			tmpAdminRsReportRecordNum := roadshow.RsOverseasReportRecordNum{
+				TryOutNum: tmpTryOutNum,
+				FormalNum: tmpFormalNum,
+				CloseNum:  tmpCloseNum,
+				StartDate: adminData.StartDate,
+				EndDate:   adminData.EndDate,
+			}
+			tmpAdminRsReportRecordNumList = append(tmpAdminRsReportRecordNumList, tmpAdminRsReportRecordNum)
+
+			//总数据汇总
+			if _, ok := tmpAllTryOutNumMap[index]; !ok {
+				tmpAllTryOutNumMap[index] = 0
+			}
+			if _, ok := tmpAllFormalNumMap[index]; !ok {
+				tmpAllFormalNumMap[index] = 0
+			}
+			if _, ok := tmpAllMeetingNumMap[index]; !ok {
+				tmpAllMeetingNumMap[index] = 0
+			}
+			tmpAllTryOutNumMap[index] += tmpTryOutNum
+			tmpAllFormalNumMap[index] += tmpFormalNum
+			tmpAllMeetingNumMap[index] += tmpCloseNum
+		}
+		// 数据都为0的时候不显示
+		adminTotalNum := 0
+		for _, v := range tmpAdminRsReportRecordNumList {
+			adminTotalNum += v.TryOutNum + v.CloseNum + v.FormalNum
+		}
+		if adminTotalNum > 0 {
+			tmpAdminReportRecord := roadshow.OverseasAdminReportRecord{
+				Name:                  researcher.RealName,
+				AdminId:               researcher.AdminId,
+				RsReportRecordNumList: tmpAdminRsReportRecordNumList,
+			}
+			RsReportRecordResp.List = append(RsReportRecordResp.List, tmpAdminReportRecord)
+		}
+	}
+
+	//总体汇总数据
+	for i := 0; i < len(tmpAllFormalNumMap); i++ {
+		tmpGroupRsReportRecordNum := roadshow.RsOverseasReportRecordNum{
+			TryOutNum: tmpAllTryOutNumMap[i],
+			FormalNum: tmpAllFormalNumMap[i],
+			CloseNum:  tmpAllMeetingNumMap[i],
+			StartDate: startDateIndexList[i],
+			EndDate:   endDateIndexList[i],
+		}
+		rsAllReportRecordNumList = append(rsAllReportRecordNumList, tmpGroupRsReportRecordNum)
+	}
+	RsReportRecordResp.RsReportRecordNumList = rsAllReportRecordNumList
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = RsReportRecordResp
+	return
+}
+
+// OverseasCalendarList
+// @Title 海外客户路演详情列表
+// @Description 海外客户路演详情列表接口
+// @Param   AdminType   query   string  true       "枚举值:researcher、seller、 special:专项路演"
+// @Param   DataType   query   string  true       "枚举值:try_out、formal、close、online、offline"
+// @Param   AdminIds   query   string  true       "用户ids"
+// @Param   StartDate   query   string  true       "开始日期,格式:2022-04-06"
+// @Param   EndDate   query   string  true       "结束日期,格式:2022-04-06"
+// @Success 200 {object} []roadshow.RsReportRecordList
+// @router /overseas/calendar/list [get]
+func (this *CalendarController) OverseasCalendarList() {
+	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
+	}
+	adminType := this.GetString("AdminType")
+	dataType := this.GetString("DataType")
+	startDate := this.GetString("StartDate")
+	endDate := this.GetString("EndDate")
+	adminIds := this.GetString("AdminIds")
+	if adminIds == "" {
+		br.Msg = "请传入对应的人员"
+		return
+	}
+
+	//adminIdsArr := make([]int, 0)
+	//adminIdSlice := strings.Split(adminIds, ",")
+	//for _, v := range adminIdSlice {
+	//	id,_ := strconv.Atoi(v)
+	//	adminIdsArr = append(adminIdsArr, id)
+	//}
+
+	//正式客户
+	//var condition string
+	//var pars []interface{}
+	//condition = ` and a.start_date >= ? and a.end_date <= ? `
+	//pars = append(pars, startDate, endDate)
+
+	var sellerIds, researcherIds string
+	//选择的人员类型(发起人还是被发起人)
+	if adminType == "seller" {
+		//condition += ` and a.seller_id IN (` + utils.GetOrmInReplace(len(adminIdsArr)) + `)`
+		sellerIds = adminIds
+	} else {
+		//condition += ` and a.researcher_id IN (` + utils.GetOrmInReplace(len(adminIdsArr)) + `)`
+		researcherIds = adminIds
+	}
+	//pars = append(pars, adminIdsArr)
+
+	var status string
+	//获取列表
+	switch dataType {
+	case "try_out":
+		//condition += ` and a.company_status = ? )`
+		//pars = append(pars, "试用")
+		status = "试用"
+	case "formal":
+		//condition += ` and a.company_status = ? )`
+		//pars = append(pars, "正式")
+		status = "正式"
+	case "close":
+		//condition += ` and a.company_status = ? )`
+		//pars = append(pars, "关闭")
+		status = "关闭"
+	//case "online":
+	//	condition += ` and a.roadshow_type = ? `
+	//	pars = append(pars, "线上")
+	//case "offline":
+	//	condition += ` and a.roadshow_type = ? `
+	//	pars = append(pars, "线下")
+	default:
+		br.Msg = "请传入类型"
+		br.ErrMsg = "请传入类型DataType"
+		return
+	}
+
+	list, err := roadshow.GetOverseaCustomCalendarList2(sellerIds, researcherIds, startDate, endDate, status)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,ERR:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = list
+	return
+}

+ 36 - 0
controllers/sys_user.go

@@ -6,6 +6,7 @@ import (
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/system"
 	"hongze/hz_crm_api/services"
+	"hongze/hz_crm_api/services/eta_forum"
 	"hongze/hz_crm_api/utils"
 	"time"
 )
@@ -356,3 +357,38 @@ func (this *SysUserController) AuthCodeLogin() {
 	br.Success = true
 	br.Msg = "获取成功"
 }
+
+// GetEtaForumAdminAuthCode
+// @Title 免密登录-获取登录ETA社区管理后台系统的编码
+// @Description 免密登录-获取登录ETA社区管理后台系统的编码
+// @Success 200 Ret=200 获取成功
+// @router /forum_admin/auth_code [get]
+func (this *SysUserAuthController) GetEtaForumAdminAuthCode() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	code, e := eta_forum.GetForumAdminAuthCode(sysUser.AdminName)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取登录编码失败, Err: " + e.Error()
+		return
+	}
+
+	br.Data = code
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}

+ 17 - 27
controllers/user_login.go

@@ -143,7 +143,7 @@ func (this *UserLoginController) GetVerifyCode() {
 			br.Msg = "请输入手机号"
 			return
 		}
-		if req.TelAreaCode == "86" && !utils.ValidateMobileFormatat(req.Mobile) {
+		if req.TelAreaCode == utils.TelAreaCodeHome && !utils.ValidateMobileFormatat(req.Mobile) {
 			br.Msg = "您的手机号输入有误, 请检查"
 			return
 		}
@@ -250,12 +250,13 @@ func (this *UserLoginController) Login() {
 
 	// 入参
 	type UserLoginReq struct {
-		LoginType  int    `description:"登录方式: 1-账号; 2-手机号; 3-邮箱"`
-		Username   string `description:"账号"`
-		Password   string `description:"密码"`
-		Mobile     string `description:"手机号"`
-		Email      string `description:"邮箱"`
-		VerifyCode string `description:"验证码"`
+		LoginType   int    `description:"登录方式: 1-账号; 2-手机号; 3-邮箱"`
+		Username    string `description:"账号"`
+		Password    string `description:"密码"`
+		Mobile      string `description:"手机号"`
+		Email       string `description:"邮箱"`
+		VerifyCode  string `description:"验证码"`
+		TelAreaCode string `description:"区号"`
 	}
 	var req UserLoginReq
 	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
@@ -266,19 +267,7 @@ func (this *UserLoginController) Login() {
 	}
 	req.Username = strings.TrimSpace(req.Username)
 	req.Mobile = strings.TrimSpace(req.Mobile)
-	if req.Mobile != "" {
-		if !utils.ValidateMobileFormatat(req.Mobile) {
-			br.Msg = "您的手机号输入有误, 请检查"
-			return
-		}
-	}
 	req.Email = strings.TrimSpace(req.Email)
-	if req.Email != "" {
-		if !utils.ValidateEmailFormatat(req.Email) {
-			br.Msg = "您的邮箱输入有误, 请检查"
-			return
-		}
-	}
 	req.VerifyCode = strings.TrimSpace(req.VerifyCode)
 	if req.LoginType != 1 && req.LoginType != 2 && req.LoginType != 3 {
 		br.Msg = "登录方式有误"
@@ -367,7 +356,7 @@ func (this *UserLoginController) Login() {
 			br.Msg = "请输入手机号"
 			return
 		}
-		if !utils.ValidateMobileFormatat(req.Mobile) {
+		if req.TelAreaCode == utils.TelAreaCodeHome && !utils.ValidateMobileFormatat(req.Mobile) {
 			br.Msg = "您的手机号输入有误, 请检查"
 			return
 		}
@@ -466,7 +455,7 @@ func (this *UserLoginController) Login() {
 	account := utils.MD5(sysUser.AdminName)
 	token := utils.GenToken(account)
 	sysSession := new(system.SysSession)
-	sysSession.UserName = req.Username
+	sysSession.UserName = sysUser.AdminName
 	sysSession.SysUserId = sysUser.AdminId
 	sysSession.ExpiredTime = time.Now().AddDate(0, 0, 90)
 	sysSession.IsRemember = 0 // 均需要做过期校验
@@ -647,11 +636,12 @@ func (this *UserLoginController) ForgetCodeVerify() {
 	}()
 
 	type ForgetCodeVerifyReq struct {
-		FindType   int    `description:"密码找回方式: 1-手机号; 2-邮箱"`
-		VerifyCode string `description:"验证码"`
-		UserName   string `description:"用户名"`
-		Mobile     string `description:"手机号"`
-		Email      string `description:"邮箱"`
+		FindType    int    `description:"密码找回方式: 1-手机号; 2-邮箱"`
+		VerifyCode  string `description:"验证码"`
+		UserName    string `description:"用户名"`
+		Mobile      string `description:"手机号"`
+		Email       string `description:"邮箱"`
+		TelAreaCode string `description:"区号"`
 	}
 	var req ForgetCodeVerifyReq
 	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
@@ -678,7 +668,7 @@ func (this *UserLoginController) ForgetCodeVerify() {
 			br.Msg = "请输入手机号"
 			return
 		}
-		if !utils.ValidateMobileFormatat(req.Mobile) {
+		if req.TelAreaCode == utils.TelAreaCodeHome && !utils.ValidateMobileFormatat(req.Mobile) {
 			br.Msg = "您的手机号输入有误, 请检查"
 			return
 		}

+ 26 - 1
controllers/yb/road_video.go

@@ -527,7 +527,7 @@ func (r *RoadVideoController) SimpleReportList() {
 		cond += ` AND title LIKE ?`
 		pars = append(pars, kw)
 	}
-	fieldArr := []string{"id", "title", "publish_time"}
+	fieldArr := []string{"id", "classify_id_second", "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 {
@@ -536,12 +536,36 @@ func (r *RoadVideoController) SimpleReportList() {
 		return
 	}
 
+	// 查询报告权限
+	classifyPermissions := make(map[int][]int, 0)
+	{
+		classifyIds := make([]int, 0)
+		for _, v := range reports {
+			if utils.InArrayByInt(classifyIds, v.ClassifyIdSecond) {
+				continue
+			}
+			classifyIds = append(classifyIds, v.ClassifyIdSecond)
+		}
+		if len(classifyIds) > 0 {
+			classifyIdsPermissions, e := models.GetPermissionsByClassifyIds(classifyIds)
+			if e != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取分类权限失败, Err: " + e.Error()
+				return
+			}
+			for _, v := range classifyIdsPermissions {
+				classifyPermissions[v.ClassifyId] = append(classifyPermissions[v.ClassifyId], v.ChartPermissionId)
+			}
+		}
+	}
+
 	type SimpleReportListResp struct {
 		ReportId       int
 		Title          string
 		PublishTime    string
 		BindVideo      int
 		BindVideoTitle string
+		PermissionIds  []int
 	}
 	respList := make([]*SimpleReportListResp, 0)
 	if len(reports) > 0 {
@@ -570,6 +594,7 @@ func (r *RoadVideoController) SimpleReportList() {
 				PublishTime:    reports[i].PublishTime.Format(utils.FormatDateTime),
 				BindVideo:      bindMap[reports[i].Id],
 				BindVideoTitle: bindTitleMap[reports[i].Id],
+				PermissionIds:  classifyPermissions[reports[i].ClassifyIdSecond],
 			})
 		}
 	}

+ 170 - 0
controllers/yb_research_signup_statistics.go

@@ -0,0 +1,170 @@
+package controllers
+
+import (
+	"hongze/hz_crm_api/models"
+)
+
+// @Title 调研报名统计列表
+// @Description 获取分类
+// @Success 200 {object} models.BannerListResp
+// @router /research_statistics/list [get]
+func (this *BannerController) StatisticsList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	list, err := models.GetYbResearchSignupStatisticsItems()
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	resp := new(models.YbResearchSignupStatisticsResp)
+
+	for _, v := range list {
+		if v.Enable == 1 {
+			resp.OngoingList = append(resp.OngoingList, v)
+		} else {
+			resp.OverList = append(resp.OverList, v)
+		}
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 调研报名统计列表
+// @Description 获取分类
+// @Param   BannerId   query   int  true       "图片id"
+// @Success 200 {object} models.BannerListResp
+// @router /research_statistics/item [get]
+func (this *BannerController) StatisticsItem() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	bannerId, _ := this.GetInt("BannerId")
+
+	if bannerId <= 0 {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误"
+		return
+	}
+	var resp models.YbResearchSignupStatisticsItemsResp
+
+
+	list, err := models.GetYbResearchSignupStatisticsItemsById(bannerId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "GetYbResearchSignupStatisticsItemsById,Err:" + err.Error()
+		return
+	}
+	if len(list) == 0 {
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		return
+	}
+	resp.List = list
+	for _, v := range list {
+		resp.Total += v.Count
+	}
+
+	amountList, err := models.GetYbResearchSignupStatisticsAmount(bannerId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "GetYbResearchSignupStatisticsAmount,Err:" + err.Error()
+		return
+	}
+	for _, v := range amountList {
+		if v.Amount > 0 {
+			resp.HasPayed.Amount += v.Amount
+			resp.HasPayed.Count += 1
+		} else {
+			resp.NoPay.Count += 1
+		}
+	}
+	resp.HasPayed.Name = "已付款"
+	resp.NoPay.Name = "未付款"
+	resp.NoPay.Percentage = resp.NoPay.Count * 100 / resp.Total
+	resp.HasPayed.Percentage = resp.HasPayed.Count * 100 / resp.Total
+
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 调研报名统计列表
+// @Description 获取分类
+// @Param   Mobile   query   int  true       "分享人手机号"
+// @Success 200 {object} models.BannerListResp
+// @router /research_statistics/detail [get]
+func (this *BannerController) StatisticsDetail() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	mobile := this.GetString("Mobile")
+	bannerId, _ := this.GetInt("BannerId")
+
+	if mobile == "" {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误"
+		return
+	}
+	list, err := models.GetYbResearchSignupStatisticsItemsByMobile(mobile, bannerId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = list
+}
+
+// @Title 调研报名统计列表
+// @Description 获取分类
+// @Param   Amount   query   float64  true       "付款金额"
+// @Param   YbResearchSignupStatisticsId   query   int  true       "报名id"
+// @Success 200 {object} models.BannerListResp
+// @router /research_statistics/amount [get]
+func (this *BannerController) Amount() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	ybResearchSignupStatisticsId, _ := this.GetInt("YbResearchSignupStatisticsId")
+	amount, _ := this.GetFloat("Amount")
+
+	if ybResearchSignupStatisticsId <= 0 {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误"
+		return
+	}
+
+	err := models.UpdateYbResearchSignupStatisticsAmountById(amount, ybResearchSignupStatisticsId)
+	if err != nil {
+		br.Msg = "更新付款金额失败"
+		br.ErrMsg = "UpdateYbResearchSignupStatisticsAmountById,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "修改成功"
+}

+ 1 - 0
go.mod

@@ -97,6 +97,7 @@ require (
 	github.com/tidwall/match v1.1.1 // indirect
 	github.com/tidwall/pretty v1.2.0 // indirect
 	github.com/tjfoc/gmsm v1.3.2 // indirect
+	github.com/wechatpay-apiv3/wechatpay-go v0.2.18 // indirect
 	github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 // indirect
 	github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 // indirect
 	golang.org/x/crypto v0.5.0 // indirect

+ 3 - 0
go.sum

@@ -13,6 +13,7 @@ github.com/SebastiaanKlippert/go-wkhtmltopdf v1.7.2 h1:LORAatv6KuKheYq8HXehiwx3f
 github.com/SebastiaanKlippert/go-wkhtmltopdf v1.7.2/go.mod h1:TY8r0gmwEL1c5Lbd66NgQCkL4ZjGDJCMVqvbbFvUx20=
 github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
 github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
+github.com/agiledragon/gomonkey v2.0.2+incompatible/go.mod h1:2NGfXu1a80LLr2cmWXGBDaHEjb1idR6+FVlX5T3D9hw=
 github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
@@ -416,6 +417,8 @@ github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhso
 github.com/tjfoc/gmsm v1.3.2 h1:7JVkAn5bvUJ7HtU08iW6UiD+UTmJTIToHCfeFzkcCxM=
 github.com/tjfoc/gmsm v1.3.2/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w=
 github.com/ugorji/go v0.0.0-20171122102828-84cb69a8af83/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ=
+github.com/wechatpay-apiv3/wechatpay-go v0.2.18 h1:vj5tvSmnEIz3ZsnFNNUzg+3Z46xgNMJbrO4aD4wP15w=
+github.com/wechatpay-apiv3/wechatpay-go v0.2.18/go.mod h1:A254AUBVB6R+EqQFo3yTgeh7HtyqRRtN2w9hQSOrd4Q=
 github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc=
 github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 h1:6932x8ltq1w4utjmfMPVj09jdMlkY0aiA6+Skbtl3/c=
 github.com/xuri/efp v0.0.0-20220603152613-6918739fd470/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI=

+ 8 - 33
models/advisory/chart_permission.go

@@ -1,7 +1,6 @@
 package advisory
 
 import (
-	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 )
 
@@ -18,7 +17,7 @@ type ChartPermissionResp struct {
 	List []*ChartPermission
 }
 
-//用户关注的分类
+// 用户关注的分类
 type ChartPermissionListResp struct {
 	ChartPermissionId   int    `description:"权限id"`
 	ChartPermissionName string `description:"名称"`
@@ -32,7 +31,7 @@ type GetChartPermissionAllByChartIdResp struct {
 	ChartPermissionId int `description:"权限id"`
 }
 
-//用户关注的分类
+// 用户关注的分类
 type MyChartPermission struct {
 	ChartPermissionId   int    `description:"权限id"`
 	ClassifyName        string `description:"分类名称"`
@@ -59,30 +58,6 @@ type NoAdminInfoResp struct {
 	List []*MyChartPermission
 }
 
-//获取一级分类名称
-func AdvisoryGetFirstChartPermissionAll() (items []*ChartPermission, err error) {
-	o := orm.NewOrm()
-	sql := `SELECT  * FROM chart_permission as ch  WHERE product_id = 1  AND product_name = 'ficc'  GROUP BY ch.classify_name ORDER BY sort ASC; `
-	_, err = o.Raw(sql).QueryRows(&items)
-	return
-}
-
-//获取关注分类名称
-func GetChartPermissionByIds(Ids string) (items []*MyChartPermission, err error) {
-	o := orm.NewOrm()
-	sql := `SELECT * FROM chart_permission WHERE chart_permission_id IN (` + Ids + `)`
-	fmt.Println(sql)
-	_, err = o.Raw(sql).QueryRows(&items)
-	return
-}
-
-func AdvisoryGetChartToClassifyName(ClassifyName string) (items []*ChartPermission, err error) {
-	o := orm.NewOrm()
-	sql := `SELECT * FROM chart_permission  WHERE product_id = 1  AND product_name = 'ficc' AND classify_name = ?  ORDER BY sort ASC `
-	_, err = o.Raw(sql, ClassifyName).QueryRows(&items)
-	return
-}
-
 func GetCategoryInfoById(chartPermissionId int) (item *ChartPermission, err error) {
 	o := orm.NewOrm()
 	//o.Using("rddp")
@@ -91,10 +66,10 @@ func GetCategoryInfoById(chartPermissionId int) (item *ChartPermission, err erro
 	return
 }
 
-//获取分类列表
+// 获取分类列表
 func GetChartPermissionList() (items []*MyChartPermission, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT  * FROM chart_permission as ch  WHERE product_id = 1  AND product_name = 'ficc'   ORDER BY sort ASC; `
+	sql := `SELECT  * FROM chart_permission as ch  WHERE product_id = 1  AND product_name = 'ficc' and parent_id > 0  ORDER BY sort ASC; `
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
@@ -109,7 +84,7 @@ type GetBuChartPermissionRespLIst struct {
 	List []*GetBuChartPermissionResp
 }
 
-//获取用户购买的分类信息
+// 获取用户购买的分类信息
 func GetBuChartPermission(CompanyId int, pars []interface{}) (items []*GetBuChartPermissionResp, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT ch.chart_permission_id , ch.permission_name ,ch.image_url  FROM chart_permission  as ch INNER JOIN company_report_permission as co ON co.chart_permission_id = ch.chart_permission_id WHERE co.company_id = ? `
@@ -117,7 +92,7 @@ func GetBuChartPermission(CompanyId int, pars []interface{}) (items []*GetBuChar
 	return
 }
 
-//获取分类列表
+// 获取分类列表
 func GetPermissionList(condition string, pars []interface{}, startSize, pageSize int) (items []*ChartPermission, err error) {
 	sql := ` SELECT * FROM chart_permission WHERE 1=1 `
 	if condition != "" {
@@ -129,7 +104,7 @@ func GetPermissionList(condition string, pars []interface{}, startSize, pageSize
 	return
 }
 
-//获取用户权限的一级分类名称
+// 获取用户权限的一级分类名称
 func GetFirstChartPermissionAllByUser(Ids string) (items []*ChartPermission, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT  * FROM chart_permission as ch  WHERE product_id = 1  AND product_name = 'ficc' AND chart_permission_id IN (` + Ids + `)` + ` GROUP BY ch.classify_name ORDER BY sort ASC; `
@@ -137,7 +112,7 @@ func GetFirstChartPermissionAllByUser(Ids string) (items []*ChartPermission, err
 	return
 }
 
-//获取用户权限的二级分类名称
+// 获取用户权限的二级分类名称
 func GetChartToClassifyNameByUser(ClassifyName, Ids string) (items []*ChartPermission, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT * FROM chart_permission  WHERE product_id = 1  AND product_name = 'ficc' AND classify_name = ?   AND chart_permission_id IN (` + Ids + `)`

+ 33 - 15
models/chart_permission.go

@@ -27,6 +27,8 @@ type ChartPermission struct {
 	CygxAuth            int       `description:"是否是权限,用于查研观向小程序前台权限校验"`
 	YbImgUrl            string    `description:"研报小程序报告列表icon"`
 	PriceDrivenState    int       `description:"品种价格驱动开启状态 0-关闭 1-开启"`
+	ParentId            int       `description:"父级权限id"`
+	IsPublic            int       `description:"是否是公有权限1:公有权限,0私有权限"`
 }
 
 // GetChartPermissionById 主键获取权限
@@ -70,26 +72,42 @@ func GetFiccPermissionExceptTactic() (items []*ChartPermission, err error) {
 	return
 }
 
-// GetPermissionByProductIdAndClassifyName 获取子分类
-func GetPermissionByProductIdAndClassifyName(productId int, classifyName string) (items []*ChartPermission, err error) {
+// GetFiccPermissionSecondPublic 获取ficc公有的二级品种
+func GetFiccPermissionSecondPublic() (items []*ChartPermission, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT * FROM chart_permission WHERE enabled = 1 AND product_id = ? AND classify_name = ? AND permission_type = 0 ORDER BY sort ASC`
-	_, err = o.Raw(sql, productId, classifyName).QueryRows(&items)
+	sql := `SELECT * FROM chart_permission WHERE enabled = 1 AND permission_type = 0 AND product_id = 1 and parent_id>0 and is_public=1 ORDER BY sort ASC`
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+// GetPermissionFirstByProductId 获取一级品种
+func GetPermissionFirstByProductId(productId int) (items []*ChartPermission, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM chart_permission WHERE enabled = 1 AND product_id = ? and parent_id=0  ORDER BY sort ASC`
+	_, err = o.Raw(sql, productId).QueryRows(&items)
 	return
 }
 
-// GetYbChartPermissionFirstByName 根据分类名称获取一级分类
-func GetYbChartPermissionFirstByName(classifyName string) (item *YbChartPermissionFirst, err error) {
+// GetPermissionFirst 获取一级品种
+func GetPermissionFirst() (items []*ChartPermission, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT * FROM chart_permission_first WHERE classify_name = ? LIMIT 1`
-	err = o.Raw(sql, classifyName).QueryRow(&item)
+	sql := `SELECT * FROM chart_permission WHERE enabled = 1 and parent_id=0  ORDER BY sort ASC`
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+// GetPermissionByProductIdAndClassifyName 获取子分类
+func GetPermissionByProductIdAndClassifyName(productId int, classifyName string) (items []*ChartPermission, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM chart_permission WHERE parent_id > 0 and enabled = 1 AND product_id = ? AND classify_name = ? AND permission_type = 0 ORDER BY sort ASC`
+	_, err = o.Raw(sql, productId, classifyName).QueryRows(&items)
 	return
 }
 
 // GetChartPermissionById 主键获取权限
 func GetChartPermissionByRemark(remark string) (item *ChartPermission, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT * FROM chart_permission WHERE remark = ? LIMIT 1`
+	sql := `SELECT * FROM chart_permission WHERE parent_id > 0 and remark = ?  LIMIT 1`
 	err = o.Raw(sql, remark).QueryRow(&item)
 	return
 }
@@ -99,7 +117,7 @@ func GetChartPermissionByIds(permissionIds []string) (list []*ChartPermission, e
 	qb, _ := orm.NewQueryBuilder("mysql")
 	// 构建查询对象
 	qb.Select("*").From("chart_permission").
-		Where("chart_permission_id").In(permissionIds...)
+		Where("parent_id > 0 and chart_permission_id").In(permissionIds...)
 	// 导出 SQL 语句
 	sql := qb.String()
 
@@ -117,7 +135,7 @@ func GetChartPermissionByIdList(chartPermissionIdList []int) (list []*ChartPermi
 	}
 
 	o := orm.NewOrm()
-	sql := `select * from chart_permission where chart_permission_id in (` + utils.GetOrmInReplace(num) + `)`
+	sql := `select * from chart_permission where parent_id > 0 and chart_permission_id in (` + utils.GetOrmInReplace(num) + `)`
 	_, err = o.Raw(sql, chartPermissionIdList).QueryRows(&list)
 
 	return
@@ -128,7 +146,7 @@ func GetChartPermissionByNames(permissionNames []string) (list []*ChartPermissio
 	qb, _ := orm.NewQueryBuilder("mysql")
 	// 构建查询对象
 	qb.Select("*").From("chart_permission").
-		Where("chart_permission_name").In(permissionNames...)
+		Where("parent_id > 0 and chart_permission_name").In(permissionNames...)
 	// 导出 SQL 语句
 	sql := qb.String()
 
@@ -141,14 +159,14 @@ func GetChartPermissionByNames(permissionNames []string) (list []*ChartPermissio
 // GetChartPermissionList 获取品种权限列表
 func GetChartPermissionList() (list []*ChartPermission, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT * FROM chart_permission ORDER BY product_id ASC, sort ASC`
+	sql := `SELECT * FROM chart_permission WHERE parent_id > 0 ORDER BY product_id ASC, sort ASC`
 	_, err = o.Raw(sql).QueryRows(&list)
 	return
 }
 
 func GetChartPermissionListRai() (items []*ChartPermission, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT * FROM chart_permission WHERE product_id=2  ORDER BY sort ASC `
+	sql := `SELECT * FROM chart_permission WHERE product_id=2 and parent_id > 0  ORDER BY sort ASC `
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
@@ -156,7 +174,7 @@ func GetChartPermissionListRai() (items []*ChartPermission, err error) {
 // 获取权益主观权限
 func GetChartPermissionListRaiSubjectivity() (items []*ChartPermission, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT * FROM chart_permission WHERE product_id=2  AND permission_type = 1  ORDER BY sort ASC `
+	sql := `SELECT * FROM chart_permission WHERE product_id=2  AND permission_type = 1 and parent_id > 0  ORDER BY sort ASC `
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }

+ 3 - 3
models/classify.go

@@ -2,7 +2,6 @@ package models
 
 import (
 	"github.com/beego/beego/v2/client/orm"
-	"github.com/rdlucklib/rdluck_tools/paging"
 	"hongze/hz_crm_api/utils"
 	"time"
 )
@@ -39,6 +38,7 @@ type Classify struct {
 	RelateTel         int       `description:"是否在电话会中可选: 0-否; 1-是"`
 	RelateVideo       int       `description:"是否在路演视频中可选: 0-否; 1-是"`
 	IsMassSend        int       `description:"1:群发,0:非群发"`
+	Enabled           int       `description:"是否可用,1可用,0禁用"`
 }
 
 func GetClassifyById(classifyId int) (item *Classify, err error) {
@@ -71,6 +71,7 @@ type ClassifyList struct {
 	YbRightBanner     string    `description:"Pc端详情页,右侧,报告合集背景图"`
 	RelateTel         int       `description:"是否在电话会中可选: 0-否; 1-是"`
 	RelateVideo       int       `description:"是否在路演视频中可选: 0-否; 1-是"`
+	Enabled           int       `description:"是否可用,1可用,0禁用"`
 	Child             []*ClassifyItem
 	ClassifyMenuList  []*ClassifyMenu
 }
@@ -82,8 +83,7 @@ type ClassifyItem struct {
 }
 
 type ClassifyListResp struct {
-	List   []*ClassifyList
-	Paging *paging.PagingItem `description:"分页数据"`
+	List []*ClassifyList
 }
 
 // 获取分类列表

+ 131 - 82
models/company/company.go

@@ -27,14 +27,11 @@ type Company struct {
 	LastUpdatedTime time.Time `description:"最后一次阅读时间"`
 	Seller          string    `description:"销售员"`
 	SellsId         int       `description:"销售员id"`
-	ShareSeller     string    `description:"共享销售员"`
-	ShareSellerId   int       `description:"共享销售员id"`
 	CompanyBelong   string    `description:"客户所属,ficc:ficc客户,public_offering:公募客户,partner:合作伙伴"`
 	StartDate       string    `description:"合同开始日期"`
 	EndDate         string    `description:"合同结束日期"`
 	LastType        int       `description:"原客户标签"`
 	IsVip           int       `description:"0:普通用户,1:大客户"`
-	IsShare         int       `description:"0:非共享用户,1:共享客户"`
 	FirstStartDate  string    `description:"首次设置为试用客户开始时间"`
 	FirstEndDate    string    `description:"首次设置为试用客户结束时间"`
 	DateType        int       `description:"设置流失类型,1:1个月,2:2个月,3:3个月"`
@@ -93,6 +90,7 @@ type CompanySearchItem struct {
 	RegionType      string `description:"地区类型,国内,国外"`
 	ShareSeller     string `description:"共享销售员"`
 	ShareSellerId   int    `description:"共享销售员id"`
+	ShareSellerIds  string `description:"共享销售员id"`
 	IsShare         int    `description:"0:非共享用户,1:共享客户"`
 	IsScrounge      int    `description:"是否白嫖 0不是 1是"`
 	Nation          string `description:"所属国家"`
@@ -105,7 +103,7 @@ type CompanySearchListResp struct {
 
 func GetCompanySearchList(condition string, pars []interface{}, limitParam ...int) (items []*CompanySearchItem, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT DISTINCT a.company_id,a.company_name,a.credit_code,a.company_code,a.region_type,a.share_seller_id,a.share_seller,a.is_share,
+	sql := `SELECT DISTINCT a.company_id,a.company_name,a.credit_code,a.company_code,a.region_type,b.share_seller_id,b.share_seller,b.is_share,
             GROUP_CONCAT(b.status ORDER BY b.product_id ASC SEPARATOR '/') AS status,
 			GROUP_CONCAT(DISTINCT b.seller_name ORDER BY b.product_id ASC SEPARATOR '/' ) AS seller_name,
 			GROUP_CONCAT(DISTINCT b.seller_id ORDER BY b.product_id ASC SEPARATOR '/') AS seller_ids,
@@ -117,7 +115,8 @@ func GetCompanySearchList(condition string, pars []interface{}, limitParam ...in
 			GROUP_CONCAT(DISTINCT b.product_name ORDER BY b.product_id ASC SEPARATOR '/') AS company_type,
             GROUP_CONCAT(DISTINCT b.approve_status ORDER BY b.product_id ASC SEPARATOR '/') AS approve_status,
             GROUP_CONCAT(DISTINCT b.freeze_start_date ORDER BY b.product_id ASC SEPARATOR '/') AS freeze_start_date,
-            GROUP_CONCAT(DISTINCT b.freeze_end_date ORDER BY b.product_id ASC SEPARATOR '/') AS freeze_end_date
+            GROUP_CONCAT(DISTINCT b.freeze_end_date ORDER BY b.product_id ASC SEPARATOR '/') AS freeze_end_date,
+			GROUP_CONCAT(DISTINCT b.share_seller_id ORDER BY b.product_id ASC SEPARATOR ',') AS share_seller_ids
 			FROM company AS a
 			INNER JOIN company_product AS b ON a.company_id=b.company_id
 			WHERE a.enabled=1 `
@@ -146,72 +145,76 @@ func GetCompanySearchCount(condition string, pars []interface{}) (count int, err
 }
 
 type CompanyItem struct {
-	CompanyId        int    `orm:"column(company_id);pk"`
-	CompanyName      string `description:"客户名称"`
-	CreditCode       string `description:"社会统一信用码"`
-	CompanyCode      string `description:"客户编码"`
-	StartDate        string `description:"合同开始日期"`
-	EndDate          string `description:"合同结束日期"`
-	LoseReason       string `description:"流失原因"`
-	RenewalReason    string `description:"续约说明"`
-	FreezeReason     string `description:"冻结理由"`
-	LossTime         string `description:"流失时间"`
-	Status           string `description:"客户状态:'试用','永续','冻结','流失','正式' "`
-	CompanyType      string `description:"客户类型:ficc/权益"`
-	ApproveStatus    string `description:"审批状态:'待审批','已审批','驳回' 审批状态为空时,表示没有审批申请"`
-	SellerName       string `description:"销售:吉根龙/颖丹"`
-	SellerId         int    `description:"销售ID"`
-	SellerIds        string `description:"销售ID集合,包含ficc和权益的销售id"`
-	ShareSeller      string `description:"共享销售员"`
-	ShareSellerId    int    `description:"共享销售员id"`
-	PackageTypes     string `description:"套餐类型集合,包含ficc和权益的套餐类型" json:"-"`
-	FiccPackageType  int    `description:"ficc的套餐类型"`
-	ExpireDay        string `description:"到期天数"`
-	FreezeTime       string `description:"冻结时间"`
-	GroupId          int    `description:"分组id"`
-	GroupIds         string `description:"分组id集合,包含ficc和权益的小组id" json:"-"`
-	DepartmentId     int    `description:"部门id"`
-	IndustryName     string `description:"所属行业"`
-	IsSuspend        int    `description:"是否暂停:1:暂停,0:启用 "`
-	CreatedTime      string `description:"创建时间"`
-	Source           string `description:"客户来源"`
-	Province         string `description:"省"`
-	City             string `description:"市"`
-	Address          string `description:"详细地址"`
-	Reasons          string `description:"新增理由"`
-	FreezeStartDate  string `description:"冻结开始日期"`
-	FreezeEndDate    string `description:"冻结结束日期"`
-	FreezeExpireDays int    `description:"冻结到期天数"`
-	BtnItem          *ButtonPermission
-	ProductId        int                  `json:"-"`
-	ProductIds       string               `description:"产品id集合,包含ficc和权益的产品id" json:"-"`
-	FormalTime       string               `description:"转正时间"`
-	IsShared         bool                 `description:"是否共享客户"`
-	RegionType       string               `description:"区域:国内,海外"`
-	FiccLastViewTime string               `description:"ficc最近一次阅读时间"`
-	RaiLastViewTime  string               `description:"权益最近一次阅读时间"`
-	ViewTotals       string               `description:"阅读次数集合,包含ficc和权益的阅读次数" json:"-"`
-	LastViewTimes    string               `description:"最近一次阅读时间集合,包含ficc和权益的最近一次阅读时间" json:"-"`
-	FiccView         int                  `description:"Ficc报告阅读次数" json:"-"`
-	RaiView          int                  `description:"权益报告阅读次数" json:"-"`
-	RoadShowTotal    int                  `description:"累计路演次数"`
-	TodoStatuss      string               `description:"任务状态"`
-	TryStageStr      string               `description:"试用客户子标签"`
-	TryStageSlice    []*TryStageSliceItem `description:"试用状态相关"`
-	AllViewTotal     int                  `description:"总阅读数"`
-	Deadline         string               `description:"未完成的todo任务的截止日期,截止目前还剩余的天数"`
-	TodoEndTimeStr   string               `description:"未完成的todo任务的截止日期拼接格式"`
-	TodoEndTime      time.Time            `description:"未完成的todo任务的截止日期"`
-	TryOutDayTotals  string               `description:"试用天数集合,包含ficc和权益的试用天数" json:"-"`
-	FiccTryOutDay    int                  `description:"Ficc试用天数" json:"-"`
-	RaiTryOutDay     int                  `description:"权益试用天数" json:"-"`
-	WeekViewActive   int                  `description:"周阅读活跃: 0-七日内无阅读; 1-活跃"`
-	IsShare          int                  `description:"0:非共享用户,1:共享客户"`
-	LastServiceTime  string               `description:"最后服务时间"`
-	ServiceTimes     int                  `description:"服务次数"`
-	CloseReason      string               `description:"关闭原因"`
-	CloseTime        string               `description:"关闭时间"`
-	Nation           string               `description:"所属国家"`
+	CompanyId           int    `orm:"column(company_id);pk"`
+	CompanyName         string `description:"客户名称"`
+	CreditCode          string `description:"社会统一信用码"`
+	CompanyCode         string `description:"客户编码"`
+	StartDate           string `description:"合同开始日期"`
+	EndDate             string `description:"合同结束日期"`
+	LoseReason          string `description:"流失原因"`
+	RenewalReason       string `description:"续约说明"`
+	FreezeReason        string `description:"冻结理由"`
+	LossTime            string `description:"流失时间"`
+	Status              string `description:"客户状态:'试用','永续','冻结','流失','正式' "`
+	StatusStr           string `description:"客户状态:'试用','永续','冻结','流失','正式' 如果是共享客户会加上 '(共享)'" `
+	CompanyType         string `description:"客户类型:ficc/权益"`
+	ApproveStatus       string `description:"审批状态:'待审批','已审批','驳回' 审批状态为空时,表示没有审批申请"`
+	SellerName          string `description:"销售:吉根龙/颖丹"`
+	SellerId            int    `description:"销售ID"`
+	SellerIds           string `description:"销售ID集合,包含ficc和权益的销售id"`
+	ShareSeller         string `description:"共享销售员"`
+	ShareSellerId       int    `description:"共享销售员id"`
+	ShareSellerIds      string `description:"共享销售员ids"`
+	PackageTypes        string `description:"套餐类型集合,包含ficc和权益的套餐类型" json:"-"`
+	FiccPackageType     int    `description:"ficc的套餐类型"`
+	ExpireDay           string `description:"到期天数"`
+	FreezeTime          string `description:"冻结时间"`
+	GroupId             int    `description:"分组id"`
+	GroupIds            string `description:"分组id集合,包含ficc和权益的小组id" json:"-"`
+	DepartmentId        int    `description:"部门id"`
+	IndustryName        string `description:"所属行业"`
+	IsSuspend           int    `description:"是否暂停:1:暂停,0:启用 "`
+	CreatedTime         string `description:"创建时间"`
+	Source              string `description:"客户来源"`
+	Province            string `description:"省"`
+	City                string `description:"市"`
+	Address             string `description:"详细地址"`
+	Reasons             string `description:"新增理由"`
+	FreezeStartDate     string `description:"冻结开始日期"`
+	FreezeEndDate       string `description:"冻结结束日期"`
+	FreezeExpireDays    int    `description:"冻结到期天数"`
+	BtnItem             *ButtonPermission
+	ProductId           int                  `json:"-"`
+	ProductIds          string               `description:"产品id集合,包含ficc和权益的产品id" json:"-"`
+	FormalTime          string               `description:"转正时间"`
+	IsShared            bool                 `description:"是否共享客户"`
+	RegionType          string               `description:"区域:国内,海外"`
+	FiccLastViewTime    string               `description:"ficc最近一次阅读时间"`
+	RaiLastViewTime     string               `description:"权益最近一次阅读时间"`
+	ViewTotals          string               `description:"阅读次数集合,包含ficc和权益的阅读次数" json:"-"`
+	LastViewTimes       string               `description:"最近一次阅读时间集合,包含ficc和权益的最近一次阅读时间" json:"-"`
+	FiccView            int                  `description:"Ficc报告阅读次数" json:"-"`
+	RaiView             int                  `description:"权益报告阅读次数" json:"-"`
+	RoadShowTotal       int                  `description:"累计路演次数"`
+	TodoStatuss         string               `description:"任务状态"`
+	TryStageStr         string               `description:"试用客户子标签"`
+	TryStageSlice       []*TryStageSliceItem `description:"试用状态相关"`
+	AllViewTotal        int                  `description:"总阅读数"`
+	Deadline            string               `description:"未完成的todo任务的截止日期,截止目前还剩余的天数"`
+	TodoEndTimeStr      string               `description:"未完成的todo任务的截止日期拼接格式"`
+	TodoEndTime         time.Time            `description:"未完成的todo任务的截止日期"`
+	TryOutDayTotals     string               `description:"试用天数集合,包含ficc和权益的试用天数" json:"-"`
+	FiccTryOutDay       int                  `description:"Ficc试用天数" json:"-"`
+	RaiTryOutDay        int                  `description:"权益试用天数" json:"-"`
+	WeekViewActive      int                  `description:"周阅读活跃: 0-七日内无阅读; 1-活跃"`
+	IsShare             int                  `description:"0:非共享用户,1:共享客户"`
+	LastServiceTime     string               `description:"最后服务时间"`
+	ServiceTimes        int                  `description:"服务次数"`
+	CloseReason         string               `description:"关闭原因"`
+	CloseTime           string               `description:"关闭时间"`
+	Nation              string               `description:"所属国家"`
+	LatestServiceRecord time.Time            `description:"最近沟通时间"`
+	FirstDate           time.Time            `description:"首次服务时间"`
 }
 
 type CompanyListItem struct {
@@ -272,6 +275,7 @@ type CompanyListItem struct {
 	IsShare          int                  `description:"0:非共享用户,1:共享客户"`
 	ShareSeller      string               `description:"共享销售员"`
 	ShareSellerId    int                  `description:"共享销售员id"`
+	ShareSellerIds   string               `description:"共享销售员ids"`
 	LastServiceTime  string               `description:"最后服务时间"`
 	ServiceTimes     int                  `description:"服务次数"`
 	CloseReason      string               `description:"关闭客户原因"`
@@ -316,7 +320,7 @@ func GetCompanyList(condition, status, sortStr string, pars []interface{}, start
 	// 权益客户: 以权益最后一次阅读时间作为参考
 	t := time.Now().Local().AddDate(0, 0, -7).Format(utils.FormatDate)
 
-	sql := `SELECT a.company_id,a.company_name,a.credit_code,a.company_code,a.created_time,a.province,a.city,a.address,a.region_type,b.group_id,b.road_show_total,a.is_share,
+	sql := `SELECT a.company_id,a.company_name,a.credit_code,a.company_code,a.created_time,a.province,a.city,a.address,a.region_type,b.group_id,b.road_show_total,b.is_share,
 			CASE 
      WHEN GROUP_CONCAT(b.status) LIKE "%永续%" THEN 1
 	 WHEN GROUP_CONCAT(b.status) LIKE "%正式%" THEN 2
@@ -336,6 +340,10 @@ CASE
      WHEN GROUP_CONCAT(b.todo_status) LIKE "%未完成%" AND GROUP_CONCAT(b.todo_end_time) is not null THEN GROUP_CONCAT(b.todo_end_time)
 		 ELSE "9999-01-01" END
 as sort_todo_end_time,
+			GROUP_CONCAT(CASE 
+            WHEN b.is_share = 1 THEN CONCAT(b.status, '(共享)')
+            ELSE b.status 
+        END ORDER BY b.product_id ASC SEPARATOR '/') AS status_str,
 			GROUP_CONCAT(b.status ORDER BY b.product_id ASC SEPARATOR '/') AS status,
 			GROUP_CONCAT(DISTINCT b.seller_name ORDER BY b.product_id ASC SEPARATOR '/') AS seller_name,
 			GROUP_CONCAT(DISTINCT b.seller_id ORDER BY b.product_id ASC SEPARATOR '/') AS seller_ids,
@@ -368,8 +376,9 @@ as sort_todo_end_time,
             b.freeze_time,b.freeze_reason,b.renewal_reason,
 			b.view_total,
 			b.last_view_time,
-			a.share_seller,
-			a.share_seller_id,
+			GROUP_CONCAT(DISTINCT b.share_seller ORDER BY b.product_id ASC SEPARATOR '/') AS share_seller,
+			GROUP_CONCAT(DISTINCT b.share_seller_id ORDER BY b.product_id ASC SEPARATOR ',') AS share_seller_ids,
+			b.share_seller_id ,
 			MAX(b.last_view_time) as max_last_view_time,
 			MIN(b.last_view_time) as min_last_view_time,
 			MAX(b.end_date) as max_end_date,
@@ -377,9 +386,21 @@ as sort_todo_end_time,
 			SUM(b.view_total) as all_view_total,
 			SUM(b.try_out_day_total) as all_try_out_day_total,
 			IF(LEFT(GROUP_CONCAT(DISTINCT b.last_view_time ORDER BY b.product_id), 19) >= "` + t + `", 1, 0) AS week_view_active,
-			a.nation
+			a.nation,
+			c.latest_service_record,
+			d.first_date 
 			FROM company AS a
 			INNER JOIN company_product AS b ON a.company_id=b.company_id
+			LEFT JOIN (
+    SELECT company_id, MAX(create_time) AS latest_service_record
+    FROM company_service_record
+    GROUP BY company_id
+) AS c ON a.company_id = c.company_id
+			LEFT JOIN (
+    SELECT company_id,MIN(start_date) AS first_date
+    FROM company_contract WHERE status=1 
+    GROUP BY company_id
+) AS d ON a.company_id = d.company_id 
 			WHERE a.enabled=1  `
 	if condition != "" {
 		sql += condition
@@ -586,9 +607,6 @@ type CompanyDetail struct {
 	Address         string `description:"详细地址"`
 	RegionType      string `description:"地区类型,1:国内,2:国外"`
 	OpenCompanyCode string `description:"开放给第三方的客户编码,不让第三方定位我们的客户信息"`
-	IsShare         int    `description:"0:非共享用户,1:共享客户"`
-	ShareSeller     string `description:"共享销售员"`
-	ShareSellerId   int    `description:"共享销售员id"`
 	IsScrounge      int    `description:"是否白嫖 0不是 1是"`
 	Nation          string `description:"所属国家"`
 }
@@ -672,6 +690,24 @@ func GetCompanyTryOutCount(status string, sellerId int) (count int, err error) {
 	return
 }
 
+// 获取权益销售开通的非研选试用客户数量
+func GetRaiCompanyTryOutCountNoResearch(sellerId int) (count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+			COUNT( DISTINCT a.company_id ) AS count
+		FROM
+			company AS a
+			INNER JOIN company_product AS b ON a.company_id = b.company_id
+			INNER JOIN company_report_permission AS p ON p.company_id = a.company_id 
+		WHERE
+			b.status = '试用' 
+			AND p.status = '试用' 
+			AND b.seller_id = ? 
+			AND p.chart_permission_id  NOT IN(31,52) `
+	err = o.Raw(sql, sellerId).QueryRow(&count)
+	return
+}
+
 type CompanySearchResp struct {
 	List []*CompanyItem
 }
@@ -1307,9 +1343,9 @@ func CompanyFreeze(companyId, productId int, freezeReason string) (err error) {
 	freezeStartDate := time.Now().Format(utils.FormatDate)
 	freezeEndDate := time.Now().AddDate(0, 3, 0).Format(utils.FormatDate)
 
-	// ficc是个月的冻结期
+	// ficc是个月的冻结期
 	if productId == 1 {
-		freezeEndDate = time.Now().AddDate(0, 2, 0).Format(utils.FormatDate)
+		freezeEndDate = time.Now().AddDate(0, 6, 0).Format(utils.FormatDate)
 	}
 
 	// 权益也调整为 两个月的冻结期
@@ -1726,7 +1762,7 @@ func GetShareCompanyList(condition, sortStr string, pars []interface{}, startSiz
 	t := time.Now().Local().AddDate(0, 0, -7).Format(utils.FormatDate)
 
 	sql := `SELECT a.company_id,a.company_name,a.credit_code,a.company_code,a.created_time,a.province,a.city,
-a.address,a.region_type,b.group_id,b.road_show_total,a.is_share,a.share_seller_id,a.share_seller,
+a.address,a.region_type,b.group_id,b.road_show_total,b.is_share,b.share_seller_id,b.share_seller,
 			CASE 
      WHEN GROUP_CONCAT(b.status) LIKE "%永续%" THEN 1
 	 WHEN GROUP_CONCAT(b.status) LIKE "%正式%" THEN 2
@@ -1746,7 +1782,10 @@ CASE
      WHEN GROUP_CONCAT(b.todo_status) LIKE "%未完成%" AND GROUP_CONCAT(b.todo_end_time) is not null THEN GROUP_CONCAT(b.todo_end_time)
 		 ELSE "9999-01-01" END
 as sort_todo_end_time,
-			GROUP_CONCAT(b.status ORDER BY b.product_id ASC SEPARATOR '/') AS status,
+			GROUP_CONCAT(CASE 
+            WHEN b.is_share = 1 THEN CONCAT(b.status, '(共享)')
+            ELSE b.status 
+        END ORDER BY b.product_id ASC SEPARATOR '/') AS status,
 			GROUP_CONCAT(DISTINCT b.seller_name ORDER BY b.product_id ASC SEPARATOR '/') AS seller_name,
 			GROUP_CONCAT(DISTINCT b.seller_id ORDER BY b.product_id ASC SEPARATOR '/') AS seller_ids,
 			GROUP_CONCAT(DISTINCT b.package_type ORDER BY b.product_id ASC SEPARATOR '/') AS package_types,
@@ -1776,6 +1815,9 @@ as sort_todo_end_time,
             b.freeze_time,b.freeze_reason,b.renewal_reason,
 			b.view_total,
 			b.last_view_time,
+			GROUP_CONCAT(DISTINCT b.share_seller ORDER BY b.product_id ASC SEPARATOR '/') AS share_seller,
+			GROUP_CONCAT(DISTINCT b.share_seller_id ORDER BY b.product_id ASC SEPARATOR ',') AS share_seller_ids,
+			b.share_seller_id ,
 			MAX(b.last_view_time) as max_last_view_time,
 			MIN(b.last_view_time) as min_last_view_time,
 			MAX(b.end_date) as max_end_date,
@@ -1929,3 +1971,10 @@ func GetCompanyListByCondition(condition string, pars []interface{}, fieldArr []
 	_, err = o.Raw(sql, pars).QueryRows(&items)
 	return
 }
+
+func GetOverseasCompanys() (items []*Company, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * FROM company where region_type= '海外' `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}

+ 1 - 0
models/company/company_apply.go

@@ -105,6 +105,7 @@ type CompanyContractDetail struct {
 	ContractType      string    `description:"合同类型:枚举值:'新签合同','续约合同','补充协议'"`
 	StartDate         string    `description:"合同开始时间"`
 	EndDate           string    `description:"合同结束时间"`
+	Quarter           string    `description:"季度(X类试用客户使用)"`
 	Money             float64   `description:"合同金额"`
 	PayMethod         string    `description:"支付方式"`
 	PayChannel        string    `description:"支付渠道"`

+ 219 - 0
models/company/company_approval.go

@@ -280,6 +280,110 @@ func TryOutToFormal(companyId, productId, sellerId, companyApprovalId, companyCo
 	return
 }
 
+// TryOutToFormalXClassRai 权益客户试用转正式
+func TryOutToFormalXClassRai(companyId, productId, sellerId, companyApprovalId, companyContractId int, startDate, endDate, sellerName, productName string, raiPackageType int) (newCompanyReportPermissionList []*CompanyReportPermission, err error) {
+	o := orm.NewOrm()
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			tmpErr := to.Rollback()
+			if tmpErr != nil {
+				go alarm_msg.SendAlarmMsg("TryOutToFormalXClassRai 事务回滚失败,Err:"+tmpErr.Error(), 3)
+			}
+		} else {
+			err = to.Commit()
+		}
+	}()
+	//123月份申请转正通过时,将试用期限延长(更新)至4.30。456月份申请转正通过时,将试用期限延长至7.31。789月份申请转正通过时,将试用期限延长至10.31。101112月份申请转正通过时,将试用期限延长至次年1.31。
+	endDate = utils.GetLastDayOfQuarter(time.Now()).Format(utils.FormatDate)
+	// 套餐类型为0时, 不更新套餐类型,权益与FICC开始与结束时间一起修改
+	sql := `UPDATE company_product SET status='永续',try_out_time=NULL,last_description_time=NULL,freeze_time=NULL,renewal_intention=0,is_suspend=0,is_formal=1,approve_status='已审批',end_date=?,rai_package_type=?,modify_time=NOW(),formal_time=NOW(),try_stage=1  WHERE company_id=?  `
+	_, err = to.Raw(sql, endDate, raiPackageType, companyId).Exec()
+	if err != nil {
+		return
+	}
+	sql = `UPDATE company SET type=1,last_updated_time=NOW() WHERE company_id=? `
+	_, err = to.Raw(sql, companyId).Exec()
+	if err != nil {
+		return
+	}
+	sql = `UPDATE company_approval SET approve_status='已审批',approve_time=NOW(),modify_time=NOW() WHERE company_approval_id=? AND company_id=? AND product_id=? `
+	_, err = to.Raw(sql, companyApprovalId, companyId, productId).Exec()
+	if err != nil {
+		return
+	}
+	items := make([]*CompanyReportPermission, 0)
+	sql = `SELECT * FROM company_report_permission WHERE company_id=? AND product_id=? `
+	_, err = to.Raw(sql, companyId, productId).QueryRows(&items)
+	for _, pv := range items {
+		cpLog := new(CompanyPermissionLog)
+		cpLog.CompanyId = companyId
+		cpLog.ChartPermissionId = pv.ChartPermissionId
+		cpLog.CreateTime = time.Now()
+		cpLog.SysUserId = sellerId
+		cpLog.SysUserName = sellerName
+		cpLog.StartDate = pv.StartDate
+		cpLog.EndDate = pv.EndDate
+		cpLog.ProductId = productId
+		cpLog.ProductName = pv.ProductName
+		go AddCompanyPermissionLog(cpLog)
+	}
+
+	sql = `DELETE FROM company_report_permission WHERE company_id=? AND product_id=?`
+	_, err = to.Raw(sql, companyId, productId).Exec()
+	if err != nil {
+		return
+	}
+
+	contractPermission := make([]*CompanyReportPermission, 0)
+	sql = `SELECT * FROM company_contract_permission WHERE company_contract_id=? AND company_id=? `
+	_, err = to.Raw(sql, companyContractId, companyId).QueryRows(&contractPermission)
+	if err != nil {
+		return
+	}
+	for _, pv := range contractPermission {
+		tmpCompanyReportPermission := &CompanyReportPermission{
+			//CompanyReportPermissionId: 0,
+			CompanyId:          companyId,
+			ReportPermissionId: pv.ChartPermissionId,
+			CreatedTime:        time.Now(),
+			LastUpdatedTime:    time.Now(),
+			ChartPermissionId:  pv.ChartPermissionId,
+			StartDate:          pv.StartDate,
+			EndDate:            endDate,
+			ProductId:          productId,
+			ProductName:        productName,
+			CompanyContractId:  companyContractId,
+			Status:             "永续",
+			ModifyTime:         time.Now(),
+			IsUpgrade:          pv.IsUpgrade,
+			ExpensiveYx:        pv.ExpensiveYx,
+		}
+		newId, tmpErr := to.Insert(tmpCompanyReportPermission)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		tmpCompanyReportPermission.CompanyReportPermissionId = newId
+		newCompanyReportPermissionList = append(newCompanyReportPermissionList, tmpCompanyReportPermission)
+	}
+	sql = `UPDATE company_report_permission SET  status='永续', end_date=? WHERE  company_id=?  ` // 更改权限的开始时间结束时间
+	_, err = to.Raw(sql, endDate, companyId).Exec()
+	if err != nil {
+		return
+	}
+
+	sql = `UPDATE company_contract SET status=1 WHERE company_contract_id=? AND company_id=? AND product_id=? `
+	_, err = to.Raw(sql, companyContractId, companyId, productId).Exec()
+	if err != nil {
+		return
+	}
+	return
+}
+
 // FreezeToTryOut 冻结转试用
 func FreezeToTryOut(companyId, productId, sellerId, companyApprovalId, applyUserId int, sellerName, productName string) (newCompanyReportPermissionList []*CompanyReportPermission, startDate, endDate string, err error) {
 	o := orm.NewOrm()
@@ -402,6 +506,121 @@ func FreezeToTryOut(companyId, productId, sellerId, companyApprovalId, applyUser
 	return
 }
 
+// FreezeToTryOutXClassRai  权益冻结转X类试用
+func FreezeToTryOutXClassRai(companyId, productId, sellerId, companyApprovalId, applyUserId int, sellerName, productName string) (newCompanyReportPermissionList []*CompanyReportPermission, startDate, endDate string, err error) {
+	o := orm.NewOrm()
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			tmpErr := to.Rollback()
+			if tmpErr != nil {
+				go alarm_msg.SendAlarmMsg("FreezeToTryOutXClassRai 事务回滚失败,Err:"+tmpErr.Error(), 3)
+			}
+		} else {
+			err = to.Commit()
+		}
+	}()
+
+	startDate = time.Now().Format(utils.FormatDate)
+	endDate = time.Now().AddDate(0, 2, 0).Format(utils.FormatDate)
+
+	//sellerItem, err := system.GetSysAdminById(applyUserId)
+	//if err != nil {
+	//	return
+	//}
+
+	//更新用户产品状态
+	sql := `UPDATE company_product SET status='永续',is_suspend=0,approve_status='已审批',freeze_start_date=null,freeze_end_date=null,
+            start_date=?,end_date=?,modify_time=NOW(),try_stage=1 WHERE company_id=?  `
+	_, err = to.Raw(sql, startDate, endDate, companyId).Exec()
+	if err != nil {
+		return
+	}
+	//更新用户状态
+	sql = `UPDATE company SET type=5,last_updated_time=NOW() WHERE company_id=? `
+	_, err = to.Raw(sql, companyId).Exec()
+	if err != nil {
+		return
+	}
+	//更新审批单
+	sql = `UPDATE company_approval SET approve_status='已审批',approve_time=NOW(),modify_time=NOW() WHERE company_approval_id=? AND company_id=? AND product_id=? `
+	_, err = to.Raw(sql, companyApprovalId, companyId, productId).Exec()
+	if err != nil {
+		return
+	}
+
+	//查询该用户所有产品权限,并把当前数据做日志(允许添加不修改的数据)
+	items := make([]*CompanyReportPermission, 0)
+	sql = `SELECT * FROM company_report_permission WHERE company_id=? AND product_id=? `
+	_, err = to.Raw(sql, companyId, productId).QueryRows(&items)
+	for _, pv := range items {
+		cpLog := new(CompanyPermissionLog)
+		cpLog.CompanyId = companyId
+		cpLog.ChartPermissionId = pv.ChartPermissionId
+		cpLog.CreateTime = time.Now()
+		cpLog.SysUserId = sellerId
+		cpLog.SysUserName = sellerName
+		cpLog.StartDate = pv.StartDate
+		cpLog.EndDate = pv.EndDate
+		cpLog.ProductId = productId
+		cpLog.ProductName = pv.ProductName
+		go AddCompanyPermissionLog(cpLog)
+	}
+
+	//查询原先是否已经存在权限,如果有权限了,那么需要先删除原有的权限
+	count, _ := GetCompanyReportPermissionCount(companyId, productId)
+	if count > 0 {
+		sql := ` DELETE FROM company_report_permission WHERE company_id=? AND product_id=? `
+		_, err = to.Raw(sql, companyId, productId).Exec()
+		if err != nil {
+			return
+		}
+	}
+
+	sql = `UPDATE company_report_permission SET  status='永续',start_date=?,end_date=? WHERE  company_id=?  ` // 更改权限的开始时间结束时间
+	_, err = to.Raw(sql, startDate, endDate, companyId).Exec()
+	if err != nil {
+		return
+	}
+
+	//获取需要试用的权限
+	delayPermissionItems, tmpErr := GetDelayPermissionItems(companyId, companyApprovalId)
+	if tmpErr != nil {
+		err = tmpErr
+		return
+	}
+	status := `永续`
+	for _, v := range delayPermissionItems {
+		tmpCompanyReportPermission := &CompanyReportPermission{
+			//CompanyReportPermissionId: 0,
+			CompanyId:          companyId,
+			ReportPermissionId: v.ChartPermissionId,
+			CreatedTime:        time.Now(),
+			LastUpdatedTime:    time.Now(),
+			ChartPermissionId:  v.ChartPermissionId,
+			StartDate:          v.StartDate,
+			EndDate:            endDate,
+			ProductId:          productId,
+			ProductName:        productName,
+			//CompanyContractId:         companyContractId,
+			Status:     status,
+			ModifyTime: time.Now(),
+			//IsUpgrade:                 pv.IsUpgrade,
+		}
+		newId, tmpErr := to.Insert(tmpCompanyReportPermission)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		tmpCompanyReportPermission.CompanyReportPermissionId = newId
+		newCompanyReportPermissionList = append(newCompanyReportPermissionList, tmpCompanyReportPermission)
+	}
+	return
+}
+
 // TryOutDelay 试用延期
 func TryOutDelay(companyId, productId, sellerId, companyApprovalId int, sellerName, endDate, productName string) (newCompanyReportPermissionList []*CompanyReportPermission, newEndDate string, err error) {
 	o := orm.NewOrm()

+ 60 - 15
models/company/company_permission.go

@@ -21,14 +21,19 @@ type ChartPermission struct {
 	ClassifyName        string    `description:"分类"`
 	PermissionType      int       `description:"1主观,2客观"`
 	Checked             bool      `description:"选中状态"`
+	ParentId            int       `description:"父级权限id"`
+	IsPublic            int       `description:"是否是公有权限1:公有权限,0私有权限"`
 }
 
 type PermissionSetItem struct {
-	ChartPermissionId int                  `description:"权限id"`
-	PermissionName    string               `description:"权限名称"`
-	PermissionType    int                  `description:"1主观,2客观"`
-	Checked           bool                 `description:"选中状态"`
-	Child             []*PermissionSetItem `description:"具体的主客观-方便前端的排版用的"`
+	ChartPermissionId int    `description:"权限id"`
+	PermissionName    string `description:"权限名称"`
+	PermissionType    int    `description:"1主观,2客观"`
+	ParentId          int    `description:"父级权限id"`
+	IsPublic          int    `description:"是否是公有权限1:公有权限,0私有权限"`
+	Checked           bool   `description:"选中状态"`
+
+	Child []*PermissionSetItem `description:"具体的主客观-方便前端的排版用的"`
 }
 
 type PermissionSetItemType struct {
@@ -58,26 +63,33 @@ type PermissionSetResp struct {
 }
 
 type ChartPermissionFirst struct {
-	ClassifyName string `description:"分类"`
+	ChartPermissionId int    `description:"权限id"`
+	ClassifyName      string `description:"分类"`
 }
 
 func GetPermissionSetItems(productId int, classifyName string) (items []*PermissionSetItem, err error) {
 	o := orm.NewOrm()
-	sql := ` SELECT * FROM chart_permission WHERE enabled=1 AND product_id=? AND classify_name=?  AND permission_type=0 ORDER BY sort ASC `
+	sql := ` SELECT * FROM chart_permission WHERE enabled=1 AND product_id=? AND classify_name=? AND parent_id>0 AND permission_type=0 ORDER BY sort ASC `
 	_, err = o.Raw(sql, productId, classifyName).QueryRows(&items)
 	return
 }
 
+func GetPermissionByProductId(productId int) (items []*PermissionSetItem, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * FROM chart_permission WHERE enabled=1 AND product_id=? AND permission_type=0 ORDER BY sort ASC `
+	_, err = o.Raw(sql, productId).QueryRows(&items)
+	return
+}
 func GetPermissionSetItemsByType(productId int, classifyName string) (items []*PermissionSetItem, err error) {
 	o := orm.NewOrm()
-	sql := ` SELECT * FROM chart_permission WHERE enabled=1 AND product_id=? AND classify_name=?  AND permission_type!=2 ORDER BY sort ASC `
+	sql := ` SELECT * FROM chart_permission WHERE enabled=1 AND product_id=? AND classify_name=? AND parent_id>0 AND permission_type!=2 ORDER BY sort ASC `
 	_, err = o.Raw(sql, productId, classifyName).QueryRows(&items)
 	return
 }
 
 func GetPermissionSetSandoItems(productId int, classifyName string) (items []*PermissionLookItem, err error) {
 	o := orm.NewOrm()
-	sql := ` SELECT * FROM chart_permission WHERE enabled=1 AND product_id=? AND classify_name=?  ORDER BY sort ASC `
+	sql := ` SELECT * FROM chart_permission WHERE enabled=1 AND product_id=? AND classify_name=? AND parent_id>0 ORDER BY sort ASC `
 	_, err = o.Raw(sql, productId, classifyName).QueryRows(&items)
 	return
 }
@@ -164,16 +176,33 @@ type PermissionLookItem struct {
 	IsUpgrade          int                   `description:"是否升级,1是,0否"`
 	ExpensiveYx        int                   `description:"权益研选: 0-3w; 1-5w ,2: 10W"`
 	Points             float64               `description:"研选扣点包点数"`
+	ParentId           int                   `description:"父级权限id"`
+	IsPublic           int                   `description:"是否是公有权限1:公有权限,0私有权限"`
 	Child              []*PermissionLookItem `description:"子权限"`
 }
 
+// todo 确认是否需要删除
 func GetPermissionLookItems(productId int, classifyName string) (items []*PermissionLookItem, err error) {
 	o := orm.NewOrm()
-	sql := ` SELECT * FROM chart_permission WHERE enabled=1 AND product_id=? AND classify_name=? ORDER BY sort ASC `
+	sql := ` SELECT * FROM chart_permission WHERE enabled=1 AND product_id=? AND classify_name=? AND parent_id > 0 ORDER BY sort ASC `
 	_, err = o.Raw(sql, productId, classifyName).QueryRows(&items)
 	return
 }
 
+func GetPermissionLookItemsByProductId(productId int) (items []*PermissionLookItem, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * FROM chart_permission WHERE enabled=1 AND product_id=? ORDER BY sort ASC `
+	_, err = o.Raw(sql, productId).QueryRows(&items)
+	return
+}
+
+func GetPermissionLookItemsByParentId(productId int, parentId int) (items []*PermissionLookItem, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * FROM chart_permission WHERE enabled=1 AND product_id=? AND parent_id=? ORDER BY sort ASC `
+	_, err = o.Raw(sql, productId, parentId).QueryRows(&items)
+	return
+}
+
 func GetCompanyPermissionCheck(companyId, permissionId int) (count int, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT COUNT(1) AS count FROM company_report_permission AS a WHERE a.company_id=? AND a.chart_permission_id=? `
@@ -203,6 +232,7 @@ func GetPermissionIdById(permissionIds string) (allpermissionId string, err erro
 			FROM
 				chart_permission 
 			WHERE
+			    parent_id > 0 and 
 				product_permission_name IN (
 				SELECT
 					product_permission_name 
@@ -251,6 +281,7 @@ type PermissionVarietyResp struct {
 
 type PermissionVarietyItem struct {
 	ChartPermissionId int    `description:"权限id"`
+	ParentId          int    `description:"父级权限id"`
 	ClassifyName      string `orm:"column(permission_name)" description:"权限名称"`
 }
 
@@ -260,13 +291,21 @@ type PermissionVarietyList struct {
 	Items             []*PermissionVarietyItem
 }
 
+// todo 删除品种列表
 func GetPermissionVarietyItems(productId int, classifyName string) (items []*PermissionVarietyItem, err error) {
 	o := orm.NewOrm()
-	sql := ` SELECT * FROM chart_permission WHERE enabled=1 AND product_id=? AND classify_name=? GROUP BY permission_name ORDER BY sort ASC `
+	sql := ` SELECT * FROM chart_permission WHERE enabled=1 AND product_id=? AND classify_name=?  AND parent_id > 0 GROUP BY permission_name ORDER BY sort ASC `
 	_, err = o.Raw(sql, productId, classifyName).QueryRows(&items)
 	return
 }
 
+func GetPermissionVarietyItemsByProductId(productId int) (items []*PermissionVarietyItem, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * FROM chart_permission WHERE enabled=1 AND product_id=? and parent_id > 0 GROUP BY permission_name ORDER BY sort ASC `
+	_, err = o.Raw(sql, productId).QueryRows(&items)
+	return
+}
+
 func GetCompanyReportPermission(companyId, productId int) (items []*CompanyReportPermission, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT * FROM company_report_permission WHERE company_id=? AND product_id=? `
@@ -349,10 +388,16 @@ func FixPermissionStatus(companyId, productId int, startDate, endDate, status st
 
 func GetPermissionLookItemsExt(productId string, classifyName string) (items []*PermissionLookItem, err error) {
 	o := orm.NewOrm()
-	sql := ` SELECT * FROM chart_permission WHERE enabled=1 AND product_id IN(` + productId + `) AND classify_name=? ORDER BY sort ASC `
+	sql := ` SELECT * FROM chart_permission WHERE enabled=1 AND product_id IN(` + productId + `) AND classify_name=? AND parent_id > 0 ORDER BY sort ASC `
 	_, err = o.Raw(sql, classifyName).QueryRows(&items)
 	return
 }
+func GetPermissionLookItemsExtByParentId(productId string, parentId int) (items []*PermissionLookItem, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * FROM chart_permission WHERE enabled=1 AND product_id IN(` + productId + `) AND parent_id=? ORDER BY sort ASC `
+	_, err = o.Raw(sql, parentId).QueryRows(&items)
+	return
+}
 
 // 客户授权产品结构体(包含产品名称)
 type CompanyReportPermissionAndName struct {
@@ -429,7 +474,7 @@ func GetPermissionLookItemsSandO(permissionIds string) (items []*PermissionLookI
 
 func GetPermissionLookItemsSandOByName(permissionName string) (items []*PermissionLookItem, err error) {
 	o := orm.NewOrm()
-	sql := ` SELECT * FROM chart_permission WHERE enabled=1  AND product_id = 2 AND remark IN (` + permissionName + `) ORDER BY sort ASC `
+	sql := ` SELECT * FROM chart_permission WHERE enabled=1  AND product_id = 2 AND remark IN (` + permissionName + `) AND parent_id > 0 ORDER BY sort ASC `
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
@@ -458,7 +503,7 @@ func GetGroupNamesById(gid int) (items *string, err error) {
 // GetChartPermissionFirst 获取排序后的权限分类
 func GetChartPermissionFirst() (list []*ChartPermissionFirst, err error) {
 	o := orm.NewOrm()
-	sql := ` SELECT classify_name FROM chart_permission_first ORDER BY yb_index_sort ASC `
+	sql := ` SELECT chart_permission_id, classify_name FROM chart_permission where enabled =1 and product_id=1 and parent_id=0 ORDER BY sort ASC `
 	_, err = o.Raw(sql).QueryRows(&list)
 	return
 }
@@ -543,7 +588,7 @@ func GetPermissionIdsByPermissionNames(names []string) (ids []int, err error) {
 			FROM
 				chart_permission
 			WHERE
-				chart_permission_name IN (` + utils.GetOrmInReplace(len(names)) + `)`
+				chart_permission_name IN (` + utils.GetOrmInReplace(len(names)) + `) AND parent_id > 0 `
 	_, err = o.Raw(sql, names).QueryRows(&ids)
 	return
 }

+ 25 - 2
models/company/company_product.go

@@ -15,6 +15,7 @@ type CompanyProduct struct {
 	Source              string    `description:"来源"`
 	Reasons             string    `description:"新增理由"`
 	Status              string    `description:"客户状态"`
+	InitStatus          string    `description:"客户初始化状态(目前用来处理权益的永续客户使用)"`
 	IndustryId          int       `description:"行业id"`
 	IndustryName        string    `description:"行业名称"`
 	SellerId            int       `description:"销售id"`
@@ -56,6 +57,9 @@ type CompanyProduct struct {
 	CloseTime           time.Time `description:"关闭时间"`
 	OverseasLabel       int       `description:"海外客户试用子标签:1未分类、2  推进、3 跟踪、4 预备、"`
 	IsOverseas          int       `description:"是否显示在海外客户0:显示,1:不显示"`
+	IsShare             int       `description:"0:非共享用户,1:共享客户"`
+	ShareSeller         string    `description:"共享销售员"`
+	ShareSellerId       int       `description:"共享销售员id"`
 }
 
 // 新增客户产品
@@ -95,8 +99,11 @@ type CompanyProductDetail struct {
 	Scale            string    `description:"管理规模,空不填,1::50亿以下,2:50~100亿,3:100亿以上。"`
 	SpecialSurplus   string    `description:"专项调研剩余次数"`
 	Points           string    `description:"公司研选服务剩余点数"`
-	ViewTotal        int       `description:"总阅读次数"`
+	IsShare          int       `description:"0:非共享用户,1:共享客户"`
+	ShareSeller      string    `description:"共享销售员"`
+	ShareSellerId    int       `description:"共享销售员id"`
 	PermissionList   []*PermissionLookList
+	ViewTotal        int `description:"总阅读次数"`
 }
 
 func GetCompanyProductsByCompanyId(companyId int) (items []*CompanyProductDetail, err error) {
@@ -490,7 +497,7 @@ func GetCompanyProductByCompanyIdAndSellerId(companyId, sellerId int) (item *Com
 
 // GetCompanyProductsByCompanyIds 根据客户id集合字符串获取所有客户产品列表
 func GetCompanyProductsBySellerId(sellerId string) (items []*CompanyProduct, err error) {
-	sql := `SELECT * FROM company_product WHERE seller_id in (` + sellerId + `) `
+	sql := `SELECT * FROM company_product WHERE (seller_id in (` + sellerId + `) OR share_seller_id IN  (` + sellerId + `) )`
 	o := orm.NewOrm()
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
@@ -660,3 +667,19 @@ func GetCompanyProductListByCompanyIds(companyIds []int, productId int) (items [
 	_, err = o.Raw(sql, companyIds, productId).QueryRows(&items)
 	return
 }
+
+// 获取权益用户客户数量
+func GetCompanyProductRaiForeverCount(companyId int) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count  FROM company_product  WHERE 1= 1  AND product_id  = 2  AND   status = '永续' AND company_id  = ?  `
+	o := orm.NewOrm()
+	err = o.Raw(sqlCount, companyId).QueryRow(&count)
+	return
+}
+
+// 根据共享销售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 `
+	o := orm.NewOrm()
+	err = o.Raw(sqlCount, shareSellerId).QueryRow(&sellerId)
+	return
+}

+ 11 - 2
models/contract/contract_service_detail.go

@@ -21,7 +21,16 @@ type ContractServiceDetail struct {
 	CreateTime        time.Time `description:"数据添加时间"`
 }
 
-//根据服务模板id获取对应的套餐表格数据详情
+type ServiceTemplateDetailCol2 struct {
+	CanEdit  bool   `json:"CanEdit"`
+	Type     string `json:"Type"`
+	ValueId  []int  `json:"ValueId"`
+	Value    string `json:"Value"`
+	HeadName string `json:"HeadName"`
+	RowName  string `json:"RowName"`
+}
+
+// 根据服务模板id获取对应的套餐表格数据详情
 func GetContractServiceDetailByTemplateId(serviceTemplateId int) (list []*ContractServiceDetail, err error) {
 	o := orm.NewOrm()
 	sql := `select * from contract_service_detail where service_template_id = ? and contract_service_id = 0 order by id asc`
@@ -45,7 +54,7 @@ func GetContractServiceDetailListByServiceIds(contractServiceIds string) (list [
 	return
 }
 
-//根据服务模板id获取对应的套餐表格数据详情
+// 根据服务模板id获取对应的套餐表格数据详情
 func GetContractServiceDetailList() (list []*ContractServiceDetail, err error) {
 	o := orm.NewOrm()
 	sql := `select * from contract_service_detail order by id asc`

+ 8 - 0
models/cygx/activity.go

@@ -722,3 +722,11 @@ func UpdateActivityTopTime(activityId, topTime int) (err error) {
 	_, err = o.Raw(sql, topTime, activityId).Exec()
 	return
 }
+
+// 添加朋友圈分享封面图片
+func UpdateCygxActivityMomentsImg(momentsImg string, activityId int) (err error) {
+	sql := `UPDATE cygx_activity SET  moments_img=?  WHERE activity_id=? `
+	o := orm.NewOrmUsingDB("hz_cygx")
+	_, err = o.Raw(sql, momentsImg, activityId).Exec()
+	return
+}

+ 18 - 0
models/cygx/activity_appointment.go

@@ -197,3 +197,21 @@ func GetActivityAppointmentOpenIdList(activityId int) (items []*OpenIdList, err
 	_, err = o.Raw(sql, activityId).QueryRows(&items)
 	return
 }
+
+
+// 获取预约活动纪要的的用户的openID
+func GetMfyxActivityAppointmentOpenIdList(activityId int) (items []*OpenIdList, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	var sql string
+	sql = `SELECT DISTINCT
+				u.open_id,
+				u.cygx_user_id AS user_id 
+			FROM
+				cygx_activity_appointment AS m
+				INNER JOIN cygx_mfyx_gzh_user_record AS u ON u.cygx_bind_account = m.mobile 
+				AND u.cygx_user_id = m.user_id 
+			WHERE
+				m.activity_id = ? `
+	_, err = o.Raw(sql, activityId).QueryRows(&items)
+	return
+}

+ 17 - 0
models/cygx/activity_help_ask.go

@@ -46,3 +46,20 @@ func GetActivityHelpAskOpenIdList(activityId int) (items []*OpenIdList, err erro
 	_, err = o.Raw(sql, activityId).QueryRows(&items)
 	return
 }
+
+// 获取活动带问的用户的openID
+func GetMfyxActivityHelpAskOpenIdList(activityId int) (items []*OpenIdList, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	var sql string
+	sql = `SELECT DISTINCT
+				u.open_id,
+				u.cygx_user_id AS user_id 
+			FROM
+				cygx_activity_help_ask AS m
+				INNER JOIN cygx_mfyx_gzh_user_record AS u ON u.cygx_bind_account = m.mobile 
+				AND u.cygx_user_id = m.user_id 
+			WHERE
+				m.activity_id = ? `
+	_, err = o.Raw(sql, activityId).QueryRows(&items)
+	return
+}

+ 77 - 1
models/cygx/allocation_company_contract.go

@@ -88,7 +88,6 @@ func AddAndUpdateCygxAllocationCompanyContract(items []*CygxAllocationCompanyCon
 		item.ChartPermissionName = v.ChartPermissionName
 		item.Proportion = v.Proportion
 		item.Money = v.Money
-		item.Money = v.Money
 		item.CreateTime = time.Now()
 		item.ModifyTime = time.Now()
 		itemsLog = append(itemsLog, item)
@@ -163,6 +162,7 @@ type CygxAllocationCompanyContractDetailResp struct {
 	Money              float64 `description:"金额(单位万)"`
 	TotalPointsContent string  `description:"总点数描述"`
 	IsGray             bool    `description:"是否置灰"`
+	IsXClass           bool    `description:"是否是X类试用客户"`
 	List               []*AllocationPermissionListResp
 }
 
@@ -173,6 +173,7 @@ type AllocationPermissionListResp struct {
 	Proportion          float64 `description:"占比"`
 	Money               float64 `description:"金额(单位万)"`
 	MoneyAvg            float64 `description:"行业所占合同的平均金额"`
+	CompanyContractId   int     `description:"合同ID"`
 	List                []*AllocationRealNameListResp
 }
 
@@ -250,3 +251,78 @@ type AllocationRealNameStatisticsListResp struct {
 	GroupProportion      string  `description:"组内占比"`
 	DepartmentProportion string  `description:"部门占比"`
 }
+
+// 行业列表
+func GetCygxAllocationCompanyContractPermissionListByIdInitYx(companyContractId int) (items []*CygxAllocationCompanyContractPermission, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ` SELECT * FROM cygx_allocation_company_contract_permission WHERE company_contract_id = ? AND  chart_permission_name  IN ('研选扣点包','研选订阅','买方研选')  `
+	_, err = o.Raw(sql, companyContractId).QueryRows(&items)
+	return
+}
+
+// 行业列表
+func GetCygxAllocationCompanyContractPermissionListByIdInit(companyContractId int) (items []*CygxAllocationCompanyContractPermission, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ` SELECT * FROM cygx_allocation_company_contract_permission WHERE company_contract_id = ?  `
+	_, err = o.Raw(sql, companyContractId).QueryRows(&items)
+	return
+}
+
+// 更新派点信息
+func AddAndUpdateCygxAllocationCompanyContractInit(items []*CygxAllocationCompanyContract, itemsPermission []*CygxAllocationCompanyContractPermission, companyContractId int) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	//删除原有的研究员派点信息
+	sql := `DELETE FROM cygx_allocation_company_contract WHERE company_contract_id = ? AND  chart_permission_name  IN ('研选扣点包','研选订阅','买方研选') `
+	_, err = to.Raw(sql, companyContractId).Exec()
+	if err != nil {
+		return
+	}
+	//删除原有的行业派点信息
+	sql = `	DELETE FROM cygx_allocation_company_contract_permission WHERE company_contract_id = ? AND  chart_permission_name  IN ('研选扣点包','研选订阅','买方研选') `
+	_, err = to.Raw(sql, companyContractId).Exec()
+	if err != nil {
+		return
+	}
+
+	//批量添加研究员派点信息
+	_, err = to.InsertMulti(len(items), items)
+	if err != nil {
+		return
+	}
+
+	//批量添加行业派点信息
+	_, err = to.InsertMulti(len(itemsPermission), itemsPermission)
+	if err != nil {
+		return
+	}
+
+	return
+}
+
+// 修改
+func Cygx_allocation_company_contractEdit(proportion float64, allocation_company_contract_id int) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `UPDATE cygx_allocation_company_contract SET proportion =?  WHERE allocation_company_contract_id=? `
+	_, err = o.Raw(sql, proportion, allocation_company_contract_id).Exec()
+	return
+}
+
+// 修改
+func Cygx_allocation_company_contract_permissionEdit(proportion, moneyAvg float64, allocation_company_contract_id int) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `UPDATE cygx_allocation_company_contract_permission SET proportion =?,money_avg = ?  WHERE allocation_company_contract_id=? `
+	_, err = o.Raw(sql, proportion, moneyAvg, allocation_company_contract_id).Exec()
+	return
+}

+ 10 - 10
models/cygx/chart_permission.go

@@ -32,7 +32,7 @@ func GetChartPermissionAll() (items []*ChartPermission, err error) {
 // 获取带有ICo的产业
 func GetChartPermissionIco(condition string) (items []*ChartPermission, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT * FROM chart_permission  WHERE 1=1 `
+	sql := `SELECT * FROM chart_permission  WHERE parent_id>0 `
 	if condition != "" {
 		sql += condition
 	}
@@ -44,7 +44,7 @@ func GetChartPermissionIco(condition string) (items []*ChartPermission, err erro
 // 获取带有ICo的产业
 func GetChartPermissionIcoNew(condition string) (items []*CygxRSlChartPermissionIcoTmp, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT chart_permission_id ,chart_permission_name,image_url as ico_link FROM chart_permission  WHERE 1=1 `
+	sql := `SELECT chart_permission_id ,chart_permission_name,image_url as ico_link FROM chart_permission  WHERE parent_id>0 `
 	if condition != "" {
 		sql += condition
 	}
@@ -56,7 +56,7 @@ func GetChartPermissionIcoNew(condition string) (items []*CygxRSlChartPermission
 // 获取带有ICo的产业
 func GetChartPermissionIcoDetail(condition string) (items []*CygxRSlChartPermissionIco, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT chart_permission_id ,chart_permission_name,image_url as ico_link FROM chart_permission  WHERE 1=1 `
+	sql := `SELECT chart_permission_id ,chart_permission_name,image_url as ico_link FROM chart_permission  WHERE parent_id>0 `
 	if condition != "" {
 		sql += condition
 	}
@@ -68,7 +68,7 @@ func GetChartPermissionIcoDetail(condition string) (items []*CygxRSlChartPermiss
 // 获取带有ICo的产业
 func GetChartPermissionDetail(condition string) (items []*CygxReportSelectionChart, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT chart_permission_id ,chart_permission_name,image_url as ico_link FROM chart_permission  WHERE 1=1 `
+	sql := `SELECT chart_permission_id ,chart_permission_name,image_url as ico_link FROM chart_permission  WHERE parent_id>0 `
 	if condition != "" {
 		sql += condition
 	}
@@ -80,21 +80,21 @@ func GetChartPermissionDetail(condition string) (items []*CygxReportSelectionCha
 // 没有策略的顶级分类
 func GetChartPermissionAllNoTactics() (items []*ChartPermission, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT * FROM chart_permission WHERE product_id=2 AND show_type=1 AND is_report=1 AND chart_permission_id != 23 AND is_other = 0 AND permission_type != 2   ORDER BY sort ASC   `
+	sql := `SELECT * FROM chart_permission WHERE product_id=2 AND show_type=1 AND is_report=1 AND chart_permission_id != 23 AND is_other = 0 AND permission_type != 2 AND parent_id>0  ORDER BY sort ASC   `
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
 
 func GetChartPermissionOtherAll() (items []*ChartPermission, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT * FROM chart_permission WHERE product_id=2 AND show_type=1 AND is_report=1  AND permission_type != 2   OR is_other = 1  ORDER BY sort ASC`
+	sql := `SELECT * FROM chart_permission WHERE product_id=2 AND show_type=1 AND is_report=1  AND permission_type != 2   OR is_other = 1 AND parent_id>0  ORDER BY sort ASC`
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
 
 // 获取产业数量
 func GetChartPermissionCount(condition string, pars []interface{}) (count int, err error) {
-	sqlCount := ` SELECT COUNT(1) AS count  FROM chart_permission WHERE 1=1 `
+	sqlCount := ` SELECT COUNT(1) AS count  FROM chart_permission WHERE parent_id>0 `
 	if condition != "" {
 		sqlCount += condition
 	}
@@ -117,7 +117,7 @@ func GetCategoryInfoByName(name string) (item *ChartPermission, err error) {
 		name = "宏观经济"
 	}
 	o := orm.NewOrm()
-	sql := `SELECT * FROM chart_permission WHERE permission_name=?`
+	sql := `SELECT * FROM chart_permission WHERE permission_name=? AND parent_id>0`
 	err = o.Raw(sql, name).QueryRow(&item)
 	return
 }
@@ -132,14 +132,14 @@ type ReportMapping struct {
 
 func GetReportMapping() (item []*ReportMapping, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
-	sql := ` SELECT *  FROM	cygx_report_mapping WHERE	match_type_name != ''  `
+	sql := ` SELECT *  FROM	cygx_report_mapping WHERE	match_type_name != '' `
 	_, err = o.Raw(sql).QueryRows(&item)
 	return
 }
 
 func GetReportMappingDetail(condition string, pars []interface{}) (item *ReportMapping, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
-	sql := ` SELECT *  FROM	cygx_report_mapping WHERE	 1= 1  ` + condition + ` LIMIT 1 `
+	sql := ` SELECT *  FROM	cygx_report_mapping WHERE 1=1 ` + condition + ` LIMIT 1 `
 	err = o.Raw(sql, pars).QueryRow(&item)
 	return
 }

+ 47 - 1
models/cygx/cygx_user_record.go

@@ -143,7 +143,7 @@ func GetCygxUserFllowDepartmentOpenid(articleId int) (items []*OpenIdList, err e
 			cr.cygx_user_id  as user_id 
 		FROM
 			cygx_article_department_follow AS f
-			INNER JOIN cygx_user_record AS cr ON cr.cygx_user_id = f.user_id 
+			INNER JOIN cygx_user_record AS cr ON cr.cygx_bind_account = f.mobile 
 			INNER JOIN cygx_article AS a ON a.department_id = f.department_id 
 		WHERE
 			 1=1   
@@ -465,3 +465,49 @@ func GetCygxUserIndustryFllowOpneidByActivityIds(activityId int) (items []*OpenI
 	_, err = o.Raw(sql, activityId).QueryRows(&items)
 	return
 }
+
+// 获取预约活动的用户的openID
+func GetMfyxActivityOpenIdList(activityId int) (items []*OpenIdList, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT DISTINCT cr.open_id,cr.cygx_user_id as  user_id
+			FROM
+			cygx_my_schedule AS m
+			INNER JOIN cygx_mfyx_gzh_user_record AS cr ON cr.cygx_bind_account = m.mobile 
+			WHERE m.activity_id = ?  `
+	_, err = o.Raw(sql, activityId).QueryRows(&items)
+	return
+}
+
+
+// 根据手机号获取用户的openid
+func GetMfyxUserRecordListByMobileArr(bindAccount []string) (items []*OpenIdList, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	lenarr := len(bindAccount)
+	if lenarr == 0 {
+		return
+	}
+	var condition string
+	var pars []interface{}
+	condition = ` AND u.cygx_bind_account IN (` + utils.GetOrmInReplace(lenarr) + `)`
+	pars = append(pars, bindAccount)
+	sql := `SELECT
+			u.open_id,
+			u.cygx_user_id AS user_id 
+		FROM
+			cygx_mfyx_gzh_user_record AS u 
+		WHERE
+			1 = 1  ` + condition
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// 获取单个用户openid
+func GetMfyxUserRecordOpenidByMobile(bindAccount string) (item *OpenIdList, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	var sql string
+	sql = `SELECT cr.open_id,cr.cygx_user_id as  user_id
+			FROM cygx_mfyx_gzh_user_record AS cr 
+			WHERE cr.cygx_bind_account = ?`
+	err = o.Raw(sql, bindAccount).QueryRow(&item)
+	return
+}

+ 2 - 1
models/cygx/cygx_yanxuan_special.go

@@ -188,7 +188,8 @@ func GetCygxYanxuanSpecialCount(condition string, pars []interface{}) (count int
 }
 
 type CygxYanxuanSpecialShowButton struct {
-	IsShowSpecialAuthor bool // 作者管理的按钮是否
+	IsShowYanXuanSpecial bool // 研选专栏文章管理按钮是否展示
+	IsShowSpecialAuthor  bool // 作者管理的按钮是否展示
 }
 
 func GetYanxuanSpecialBySpecialId(specialId int) (item *CygxYanxuanSpecialItem, err error) {

+ 25 - 3
models/cygx/cygx_yanxuan_special_user.go

@@ -25,6 +25,8 @@ type CygxYanxuanSpecialAuthor struct {
 	Status       int       // 1启用2禁用
 	CompanyId    int       `description:"公司id"`
 	CompanyName  string    `description:"公司名称"`
+	InviteName   string    //引荐人
+	Remark       string    //备注
 }
 
 type CygxYanxuanSpecialAuthorItem struct {
@@ -51,6 +53,15 @@ type CygxYanxuanSpecialAuthorItem struct {
 	FansNum            int    // 粉丝数量
 	ArticleCollectNum  int    // 文章收藏数量
 	SpecialAuthorId    int    //cygx_yanxuan_special_author 表主键ID 作者专栏ID
+	InviteName         string //引荐人
+	Remark             string //备注
+}
+
+type CygxYanxuanSpecialKeyWordReesp struct {
+	KeyWord string //引荐人
+}
+type CygxYanxuanSpecialKeyWordListReesp struct {
+	List []*CygxYanxuanSpecialKeyWordReesp //引荐人
 }
 
 func AddCygxYanxuanSpecialAuthor(item *CygxYanxuanSpecialAuthor) (lastId int64, err error) {
@@ -60,9 +71,11 @@ func AddCygxYanxuanSpecialAuthor(item *CygxYanxuanSpecialAuthor) (lastId int64,
 }
 
 type AddCygxYanxuanSpecialAuthorReq struct {
-	UserId   int    // 用户ID
-	RealName string // 姓名
-	Mobile   string // 手机号
+	UserId     int    // 用户ID
+	RealName   string // 姓名
+	Mobile     string // 手机号
+	InviteName string //引荐人
+	Remark     string //备注
 }
 
 type EnableCygxYanxuanSpecialAuthorReq struct {
@@ -147,3 +160,12 @@ func UpdateSpecialAuthormobile_init(mobile_init string, userId int) (err error)
 	_, err = o.Raw(sql, mobile_init, userId).Exec()
 	return
 }
+
+// 更新作者引荐人相关信息
+func UpdateYanxuanSpecialAuthorInviteName(inviteName, remark string, userId int) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ``
+	sql = `UPDATE cygx_yanxuan_special_author SET invite_name=? , remark = ?  WHERE user_id = ? `
+	_, err = o.Raw(sql, inviteName, remark, userId).Exec()
+	return
+}

+ 476 - 0
models/cygx/enter_score.go

@@ -0,0 +1,476 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"hongze/hz_crm_api/models/company"
+	"hongze/hz_crm_api/utils"
+	"time"
+)
+
+// CygxEnterScore 结构体代表了 cygx_enter_score 表格
+type CygxEnterScore struct {
+	EnterScoreId        int       `orm:"column(enter_score_id);pk";comment:"主键"`
+	CompanyId           int       `comment:"公司ID"`
+	CompanyName         string    `comment:"客户名称"`
+	StartDate           string    `comment:"开始日期"`
+	EndDate             string    `comment:"结束日期"`
+	Quarter             string    `comment:"季度"`
+	QuarterDate         string    `comment:"季度带有年月日的多个数组转成的字符串"`
+	EnterScoreType      int       `comment:"录入方式 1:按评分录入、2:按比例录入"`
+	Ranking             string    `comment:"排名"`
+	IsMergeScoring      int       `comment:"是否合并打分"`
+	SecuritiesFirmsName string    `comment:"券商名称"`
+	MergeProportion     float64   `comment:"合并占比"`
+	RaiProportionTotal  float64   `comment:"权益研究员占比"`
+	FiccProportionTotal float64   `comment:"FICC研究员占比"`
+	ProportionTotal     float64   `comment:"合计总占比"`
+	SellerId            int       `comment:"所属销售id"`
+	SellerName          string    `comment:"所属销售名称"`
+	AdminId             int       `comment:"操作人ID"`
+	AdminName           string    `comment:"操作人姓名"`
+	CreateTime          time.Time `comment:"创建时间"`
+	ModifyTime          time.Time `comment:"更新时间"`
+}
+
+type CygxEnterScoreDetailResp struct {
+	EnterScoreId        int               `comment:"录分ID"`
+	CompanyId           int               `comment:"公司ID,公司标识符"`
+	CompanyName         string            `comment:"公司名称"`
+	StartDate           string            `comment:"开始日期"`
+	EndDate             string            `comment:"结束日期"`
+	Quarter             []string          `comment:"季度,评分季度"`
+	EnterScoreType      int               `comment:"录入方式 1:按评分录入、2:按比例录入"`
+	Ranking             string            `comment:"排名"`
+	IsMergeScoring      int               `comment:"是否合并打分"`
+	SecuritiesFirmsName string            `comment:"券商名称"`
+	MergeProportion     float64           `comment:"合并占比"`
+	ProportionTotal     float64           `comment:"合计总占比"`
+	RaiProportionTotal  float64           `comment:"权益研究员占比"`
+	FiccProportionTotal float64           `comment:"FICC研究员占比"`
+	EnterScoreObj       EnterScoreDateObj `comment:"按评分录入"`
+	PercentageObj       EnterScoreDateObj `comment:"按比例录入"`
+}
+
+// 行业
+type EnterScoreDateObj struct {
+	ListRai   []*EnterScorePermissionListResp //权益列表
+	ListFicc  []*EnterScorePermissionListResp //FICC列表
+	ListGroup []*EnterScoreGroupListResp      //其他配置信息
+}
+
+// 行业
+type EnterScorePermissionListResp struct {
+	ChartPermissionName string   `description:"行业名称"`
+	Proportion          float64  `description:"占比"`
+	ProportionListText  []string `description:"占比列表"`
+	EnterScoreId        int      `comment:"录分ID"`
+	List                []*EnterScoreRealNameListResp
+}
+
+// 占比描述
+type EnterScoreProportionTextResp struct {
+	ProportionText string
+}
+
+// 研究员
+type EnterScoreRealNameListResp struct {
+	RealName            string   `comment:"研究员姓名"`
+	Proportion          float64  `comment:"占比"`
+	ProportionListText  []string `description:"占比列表"`
+	ChartPermissionName string   `comment:"行业名称"`
+}
+
+// 其他分组
+type EnterScoreGroupListResp struct {
+	GroupName          string   `description:"组名"`
+	Proportion         float64  `description:"占比"`
+	ProportionListText []string `description:"占比列表"`
+}
+
+// 添加或修改录分时的入参结构体
+type UpdateEnterScoreReq struct {
+	EnterScoreId        int                             `comment:"录分ID"`
+	CompanyId           int                             `comment:"公司ID"`
+	CompanyName         string                          `comment:"客户名称"`
+	StartDate           string                          `comment:"开始日期"`
+	EndDate             string                          `comment:"结束日期"`
+	Quarter             []string                        `comment:"季度"`
+	EnterScoreType      int                             `comment:"录入方式 1:按评分录入、2:按比例录入"`
+	Ranking             string                          `comment:"排名"`
+	IsMergeScoring      int                             `comment:"是否合并打分"`
+	SecuritiesFirmsName string                          `comment:"券商名称"`
+	MergeProportion     float64                         `comment:"合并占比"`
+	RaiProportionTotal  float64                         `comment:"权益研究员占比"`
+	FiccProportionTotal float64                         `comment:"FICC研究员占比"`
+	ProportionTotal     float64                         `comment:"合计总占比"`
+	ListRai             []*EnterScorePermissionListResp //权益列表
+	ListFicc            []*EnterScorePermissionListResp //FICC列表
+	ListGroup           []*EnterScoreGroupListResp      //其他配置信息
+}
+
+type EnterScoreIdReq struct {
+	EnterScoreId int `comment:"录分ID"`
+}
+
+// CygxEnterScoreGroup 结构体代表 cygx_enter_score_group 表
+type CygxEnterScoreGroup struct {
+	EnterScoreGroupId int       `orm:"column(enter_score_group_id);pk";comment:"主键"`
+	EnterScoreId      int       `comment:"cygx_enter_score主键"`
+	CompanyId         int       `comment:"公司ID"`
+	GroupName         string    `comment:"名称"`
+	Proportion        float64   `comment:"占比"`
+	AdminId           int       `comment:"操作人ID"`
+	AdminName         string    `comment:"操作人姓名"`
+	CreateTime        time.Time `comment:"创建时间"`
+	ModifyTime        time.Time `comment:"更新时间"`
+}
+
+// CygxEnterScorePermission 结构体代表 cygx_enter_score_permission 表
+type CygxEnterScorePermission struct {
+	EnterScorePermissionId int       `orm:"column(enter_score_permission_id);pk";comment:"主键"`
+	EnterScoreId           int       `comment:"cygx_enter_score主键"`
+	CompanyId              int       `comment:"公司ID"`
+	ChartPermissionName    string    `comment:"名称"`
+	Proportion             float64   `comment:"占比"`
+	ProductId              float64   `comment:"产品id,1:FICC、2:权益"`
+	AdminId                int       `comment:"操作人ID"`
+	AdminName              string    `comment:"操作人姓名"`
+	CreateTime             time.Time `comment:"创建时间"`
+	ModifyTime             time.Time `comment:"更新时间"`
+}
+
+// CygxEnterScoreResearcher 结构体代表 cygx_enter_score_researcher 表
+type CygxEnterScoreResearcher struct {
+	EnterScoreDataId    int       `orm:"column(enter_score_data_id);pk";comment:"主键"`
+	EnterScoreId        int       `comment:"cygx_enter_score主键"`
+	CompanyId           int       `comment:"公司ID"`
+	Proportion          float64   `comment:"占比"`
+	RealName            string    `comment:"研究员姓名"`
+	ChartPermissionName string    `comment:"名称"`
+	ProductId           float64   `comment:"产品id,1:FICC、2:权益"`
+	AdminId             int       `comment:"操作人ID"`
+	AdminName           string    `comment:"操作人姓名"`
+	CreateTime          time.Time `comment:"创建时间"`
+	ModifyTime          time.Time `comment:"更新时间"`
+}
+
+// 更新派点信息
+func AddCygxEnterScore(item *CygxEnterScore, itemsPermission []*CygxEnterScorePermission, itemsResearcher []*CygxEnterScoreResearcher, itemsGroup []*CygxEnterScoreGroup) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	newId, err := to.Insert(item)
+	if err != nil {
+		return
+	}
+	enterScoreId := int(newId)
+
+	for _, v := range itemsPermission {
+		v.EnterScoreId = enterScoreId
+	}
+
+	for _, v := range itemsResearcher {
+		v.EnterScoreId = enterScoreId
+	}
+
+	for _, v := range itemsGroup {
+		v.EnterScoreId = enterScoreId
+	}
+
+	//批量添加行业信息
+	_, err = to.InsertMulti(len(itemsPermission), itemsPermission)
+	if err != nil {
+		return
+	}
+
+	//批量添加研究员信息
+	_, err = to.InsertMulti(len(itemsResearcher), itemsResearcher)
+	if err != nil {
+		return
+	}
+
+	//批量添加自定义分组信息
+	_, err = to.InsertMulti(len(itemsGroup), itemsGroup)
+	if err != nil {
+		return
+	}
+	return
+}
+
+// 更新派点信息
+func UpdateCygxEnterScore(item *CygxEnterScore, itemsPermission []*CygxEnterScorePermission, itemsResearcher []*CygxEnterScoreResearcher, itemsGroup []*CygxEnterScoreGroup) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	_, err = to.Update(item, "CompanyId", "CompanyName", "StartDate", "EndDate", "Quarter", "QuarterDate", "EnterScoreType", "Ranking", "IsMergeScoring", "SecuritiesFirmsName", "MergeProportion", "RaiProportionTotal", "FiccProportionTotal", "ProportionTotal", "SellerId", "SellerName", "AdminId", "AdminName", "ModifyTime")
+	if err != nil {
+		return
+	}
+	enterScoreId := item.EnterScoreId
+
+	//批量删除行业信息
+	sql := `DELETE FROM cygx_enter_score_permission WHERE enter_score_id = ?`
+	_, err = to.Raw(sql, enterScoreId).Exec()
+	if err != nil {
+		return
+	}
+
+	//批量删除研究员信息
+	sql = `	DELETE FROM cygx_enter_score_researcher WHERE enter_score_id = ?`
+	_, err = to.Raw(sql, enterScoreId).Exec()
+	if err != nil {
+		return
+	}
+
+	//批量删除自定义分组信息
+	sql = `	DELETE FROM cygx_enter_score_group WHERE enter_score_id = ?`
+	_, err = to.Raw(sql, enterScoreId).Exec()
+	if err != nil {
+		return
+	}
+
+	for _, v := range itemsPermission {
+		v.EnterScoreId = enterScoreId
+	}
+
+	for _, v := range itemsResearcher {
+		v.EnterScoreId = enterScoreId
+	}
+
+	for _, v := range itemsGroup {
+		v.EnterScoreId = enterScoreId
+	}
+
+	//批量添加行业信息
+	_, err = to.InsertMulti(len(itemsPermission), itemsPermission)
+	if err != nil {
+		return
+	}
+
+	//批量添加研究员信息
+	_, err = to.InsertMulti(len(itemsResearcher), itemsResearcher)
+	if err != nil {
+		return
+	}
+
+	//批量添加自定义分组信息
+	_, err = to.InsertMulti(len(itemsGroup), itemsGroup)
+	if err != nil {
+		return
+	}
+	return
+}
+
+// 通过ID获取详情
+func GetCygxEnterScoreInfoById(id int) (item *CygxEnterScore, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_enter_score  WHERE enter_score_id = ? `
+	err = o.Raw(sql, id).QueryRow(&item)
+	return
+}
+
+// 行业列表
+func GetCygxEnterScorePermissionListById(enterScoreId int) (items []*CygxEnterScorePermission, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_enter_score_permission WHERE enter_score_id = ? `
+	_, err = o.Raw(sql, enterScoreId).QueryRows(&items)
+	return
+}
+
+// 根据多个录分ID获取行业列表
+func GetCygxEnterScorePermissionListByIds(enterScoreIds []int) (items []*CygxEnterScorePermission, err error) {
+	lenArr := len(enterScoreIds)
+	if lenArr == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_enter_score_permission  WHERE  enter_score_id IN  (` + utils.GetOrmInReplace(lenArr) + `) `
+	_, err = o.Raw(sql, enterScoreIds).QueryRows(&items)
+	return
+}
+
+// 研究员列表
+func GeCygxEnterScoreResearcherListById(enterScoreId int) (items []*CygxEnterScoreResearcher, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_enter_score_researcher WHERE enter_score_id = ? `
+	_, err = o.Raw(sql, enterScoreId).QueryRows(&items)
+	return
+}
+
+// 根据多个录分ID获取研究员列表
+func GeCygxEnterScoreResearcherListByIds(enterScoreIds, newcompanyIds []int) (items []*CygxEnterScoreResearcher, err error) {
+	lenArr := len(enterScoreIds)
+	if lenArr == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_enter_score_researcher  WHERE  enter_score_id IN  (` + utils.GetOrmInReplace(lenArr) + `)  AND  proportion > 0  `
+
+	//过滤销售可见的公司与研究员
+	lenCompany := len(newcompanyIds)
+	if lenCompany > 0 {
+		sql += ` AND  company_id IN  (` + utils.GetOrmInReplace(lenCompany) + `) `
+		_, err = o.Raw(sql, enterScoreIds, newcompanyIds).QueryRows(&items)
+	} else {
+		_, err = o.Raw(sql, enterScoreIds).QueryRows(&items)
+	}
+	return
+}
+
+// 自定义分组列表
+func GeCygxEnterScoreGroupListById(enterScoreId int) (items []*CygxEnterScoreGroup, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_enter_score_group WHERE enter_score_id = ? `
+	_, err = o.Raw(sql, enterScoreId).QueryRows(&items)
+	return
+}
+
+// 根据多个录分ID获取自定义分组列表
+func GeCygxEnterScoreGroupListByIds(enterScoreIds []int) (items []*CygxEnterScoreGroup, err error) {
+	lenArr := len(enterScoreIds)
+	if lenArr == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_enter_score_group  WHERE  enter_score_id IN  (` + utils.GetOrmInReplace(lenArr) + `) `
+	_, err = o.Raw(sql, enterScoreIds).QueryRows(&items)
+	return
+}
+
+// 获取列表
+func GetCygxEnterScoreList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxEnterScore, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_enter_score  WHERE 1 = 1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` LIMIT ?,?`
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+// 根据券商名称获取列表
+func GetCygxEnterScoreListBySecuritiesFirmsName(keyWord string) (items []*CygxEnterScore, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT company_id  FROM cygx_enter_score  WHERE 1 = 1  `
+	sql += ` AND securities_firms_name LIKE '%` + keyWord + `%' `
+	sql += ` GROUP  BY company_id `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+// 获取数量
+func GetCygxEnterScoreCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_enter_score  WHERE 1= 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+type EnterScoreListResp struct {
+	EnterScoreId        int      `comment:"录分ID"`
+	CompanyId           int      `comment:"公司ID,公司标识符"`
+	CompanyName         string   `comment:"公司名称"`
+	Quarter             []string `comment:"季度,评分季度"`
+	EnterScoreType      int      `comment:"录入方式 1:按评分录入、2:按比例录入"`
+	Ranking             string   `comment:"排名"`
+	IsMergeScoring      int      `comment:"是否合并打分"`
+	SecuritiesFirmsName string   `comment:"券商名称"`
+	ProportionTotal     float64  `comment:"合计总占比"`
+	SellerId            int      `comment:"所属销售id"`
+	SellerName          string   `comment:"所属销售名称"`
+	CreateTime          string   `comment:"创建时间"`
+	ModifyTime          string   `comment:"更新时间"`
+}
+
+type GetCygxEnterScoreListRep struct {
+	Paging *paging.PagingItem `description:"分页数据"`
+	List   []*EnterScoreListResp
+}
+
+// 删除
+func DeleteEnterScore(enterScoreId int) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	//删除单条录分信息
+	sql := `DELETE FROM cygx_enter_score WHERE enter_score_id = ?`
+	_, err = to.Raw(sql, enterScoreId).Exec()
+	if err != nil {
+		return
+	}
+
+	//批量删除行业信息
+	sql = `DELETE FROM cygx_enter_score_permission WHERE enter_score_id = ?`
+	_, err = to.Raw(sql, enterScoreId).Exec()
+	if err != nil {
+		return
+	}
+
+	//批量删除研究员信息
+	sql = `	DELETE FROM cygx_enter_score_researcher WHERE enter_score_id = ?`
+	_, err = to.Raw(sql, enterScoreId).Exec()
+	if err != nil {
+		return
+	}
+
+	//批量删除自定义分组信息
+	sql = `	DELETE FROM cygx_enter_score_group WHERE enter_score_id = ?`
+	_, err = to.Raw(sql, enterScoreId).Exec()
+	if err != nil {
+		return
+	}
+
+	return
+}
+
+type ScoreOverviewListResp struct {
+	ListCompany    []*company.CompanyNameAndId
+	ListPermission []*EnterScorePermissionListResp
+	ListGroup      []*EnterScoreGroupListResp
+}
+
+type RankingOverviewListResp struct {
+	ListCompany     []*company.CompanyNameAndId
+	ListQuarterDate []*QuarterDateListResp
+}
+
+// 排名总览
+type QuarterDateListResp struct {
+	Quarter            string   `description:"季度"`
+	ProportionListText []string `description:"占比列表"`
+}

+ 138 - 0
models/cygx/orde.go

@@ -0,0 +1,138 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
+)
+
+type CygxOrder struct {
+	OrderId          int       `orm:"column(order_id);pk";comment:"订单id"`
+	OrderCode        string    `comment:"订单编号"`
+	OutTradeCode     string    `comment:"外部交易号"`
+	PaymentType      int       `comment:"支付类型。支付类型。取值范围:1微信小程序,2微信扫码支付,3微信H5支付。"`
+	GoodsName        string    `comment:"商品名称"`
+	GoodsId          int       `comment:"商品ID"`
+	BuyerInvoice     string    `comment:"买家发票信息"`
+	GoodsMoney       float64   `comment:"商品总价"`
+	OrderMoney       float64   `comment:"订单总价"`
+	Point            int       `comment:"订单消耗积分"`
+	PointMoney       float64   `comment:"订单消耗积分抵多少钱"`
+	PayMoney         float64   `comment:"订单实付金额"`
+	RefundMoney      float64   `comment:"订单退款金额"`
+	RefundTime       time.Time `description:"退款时间"`
+	RefundRemark     string    `description:"退款原因说明"`
+	OrderStatus      int       `comment:"订单状态,0:已取消、1:待支付、2:已支付、3:退款成功、4:退款处理中、5:退款异常、6:退款关闭"`
+	PayTime          time.Time `comment:"订单付款时间"`
+	SourceId         int       `comment:"来源ID"`
+	Source           string    `comment:"来源\n报告 :article\n活动 :activity"`
+	SourceTitle      string    `comment:"来源名称,活动或者报告标题"`
+	UserId           int       `comment:"用户ID"`
+	Mobile           string    `comment:"手机号"`
+	Email            string    `comment:"邮箱"`
+	CompanyId        int       `comment:"公司ID"`
+	CompanyName      string    `comment:"公司名称"`
+	RealName         string    `comment:"用户实际名称"`
+	SellerName       string    `comment:"所属销售"`
+	CreateTime       time.Time `comment:"创建时间"`
+	ModifyTime       time.Time `comment:"修改时间"`
+	RegisterPlatform int       `comment:"来源 1小程序,2:网页"`
+}
+
+type CygxOrderResp struct {
+	OrderId          int       `orm:"column(order_id);pk";comment:"订单id"`
+	OrderCode        string    `comment:"订单编号"`
+	OutTradeNo       string    `comment:"【商户订单号】 商户系统内部订单号"`
+	OutTradeCode     string    `comment:"外部交易号"`
+	PaymentType      int       `comment:"支付类型。取值范围:1微信支付,2支付宝支付。"`
+	TradeType        string    `comment:"交易类型,枚举值:JSAPI:公众号支付 、 NATIVE:扫码支付 、 App:App支付 、 MICROPAY:付款码支付 、 MWEB:H5支付 、 FACEPAY:刷脸支付"`
+	GoodsName        string    `comment:"商品名称"`
+	GoodsId          int       `comment:"商品ID"`
+	BuyerInvoice     string    `comment:"买家发票信息"`
+	GoodsMoney       float64   `comment:"商品总价"`
+	OrderMoney       float64   `comment:"订单总价"`
+	Point            int       `comment:"订单消耗积分"`
+	PointMoney       float64   `comment:"订单消耗积分抵多少钱"`
+	PayMoney         float64   `comment:"订单实付金额"`
+	RefundMoney      float64   `comment:"订单退款金额"`
+	RefundTime       time.Time `comment:"退款时间"`
+	RefundRemark     string    `comment:"退款原因说明"`
+	OrderStatus      int       `comment:"订单状态,0:已取消、1:待支付、2:已支付、3:退款成功、4:退款处理中、5:退款异常、6:退款关闭"`
+	PayTime          time.Time `comment:"订单付款时间"`
+	SourceId         int       `comment:"来源ID"`
+	Source           string    `comment:"来源\n报告 :article\n活动 :activity"`
+	SourceTitle      string    `comment:"来源名称,活动或者报告标题"`
+	UserId           int       `comment:"用户ID"`
+	Mobile           string    `comment:"手机号"`
+	Email            string    `comment:"邮箱"`
+	CompanyId        int       `comment:"公司ID"`
+	CompanyName      string    `comment:"公司名称"`
+	RealName         string    `comment:"用户实际名称"`
+	SellerName       string    `comment:"所属销售"`
+	StartDate        time.Time `comment:"开始日期"`
+	EndDate          time.Time `comment:"结束日期"`
+	CreateTime       time.Time `comment:"创建时间"`
+	ModifyTime       time.Time `comment:"修改时间"`
+	RegisterPlatform int       `comment:"来源 1小程序,2:网页"`
+	ShareId          int       `comment:"分享人ID"`
+	ShareName        string    `comment:"分享人姓名"`
+}
+
+func GetCygxOrderList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxOrderResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT *
+			FROM
+			cygx_order
+			WHERE 1 = 1 ` + condition
+	sql += ` LIMIT ?,?  `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+// 获取数量
+func GetCygxOrderCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_order WHERE   1= 1  ` + condition
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+// 根据订单编号获取订单详情
+func GetCygxOrderDetailByOrderCode(orderCode string) (item *CygxOrderResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_order WHERE order_code = ? `
+	err = o.Raw(sql, orderCode).QueryRow(&item)
+	return
+}
+
+type OrderListResp struct {
+	OrderCode       string  `comment:"订单编号"`
+	UserId          int     `comment:"用户ID"`
+	Mobile          string  `comment:"手机号"`
+	Email           string  `comment:"邮箱"`
+	CompanyId       int     `comment:"公司ID"`
+	CompanyName     string  `comment:"公司名称"`
+	RealName        string  `comment:"用户实际名称"`
+	SellerName      string  `comment:"所属销售"`
+	OrderMoney      float64 `comment:"订单总价"`
+	CreateTime      string  `comment:"创建时间"`
+	SourceId        int     `comment:"来源ID"`
+	Source          string  `comment:"来源\n报告 :article\n活动 :activity"`
+	SourceTitle     string  `comment:"来源名称,活动或者报告标题"`
+	OrderStatus     int     `comment:"订单状态码"`
+	OrderStatusText string  `comment:"订单状态描述"`
+	PaymentTypeText string  `comment:"支付类型。取值范围:1微信小程序,2微信扫码支付,3微信H5支付。"`
+	StartDate       string  `comment:"开始日期"`
+	EndDate         string  `comment:"结束日期"`
+	InviteName      string  `description:"邀请人"`
+	PayTime         string  `comment:"订单付款时间"`
+	RefundTime      string  `comment:"订单退款时间"`
+	RefundRemark    string  `description:"退款原因说明"`
+	PaymentProject  string  `comment:"付款项目"`
+	HttpUrl         string  `description:"跳转地址"`
+}
+
+type UserOrderListResp struct {
+	Paging *paging.PagingItem `description:"分页数据"`
+	List   []*OrderListResp
+}

+ 90 - 0
models/cygx/order_action.go

@@ -0,0 +1,90 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// /订单操作表
+type CygxOrderAction struct {
+	ActionId         int       `orm:"column(action_id);pk";comment:"动作id"`
+	Action           string    `comment:"动作内容"`
+	OrderStatus      int       `comment:"订单状态,0:已取消、1:待支付、2:已支付、3:已退款"`
+	OrderStatusText  string    `comment:"订单状态名称"`
+	OrderCode        string    `comment:"订单编号"`
+	UserId           int       `comment:"用户ID"`
+	Mobile           string    `comment:"手机号"`
+	Email            string    `comment:"邮箱"`
+	CompanyId        int       `comment:"公司ID"`
+	CompanyName      string    `comment:"公司名称"`
+	RealName         string    `comment:"用户实际名称"`
+	SellerName       string    `comment:"所属销售"`
+	CreateTime       time.Time `comment:"创建时间"`
+	ModifyTime       time.Time `comment:"修改时间"`
+	RegisterPlatform int       `comment:"来源 1小程序,2:网页"`
+	AdminId          int       `comment:"管理员ID"`
+	AdminName        string    `comment:"管理员姓名"`
+}
+
+func AddCygxOrderRefundRevoke(item *CygxOrderAction) (err error) {
+	to := orm.NewOrmUsingDB("hz_cygx")
+	o, err := to.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = o.Rollback()
+		} else {
+			_ = o.Commit()
+		}
+	}()
+	updateParams := make(map[string]interface{})
+	updateParams["OrderStatus"] = 6 //退款关闭
+	ptrStructOrTableName := "cygx_order"
+	whereParam := map[string]interface{}{"order_code": item.OrderCode}
+	qs := o.QueryTable(ptrStructOrTableName)
+	for expr, exprV := range whereParam {
+		qs = qs.Filter(expr, exprV)
+	}
+	_, err = qs.Update(updateParams)
+	if err != nil {
+		return
+	}
+
+	_, err = o.Insert(item)
+	return
+}
+
+//// 添加CygxOrderRefund
+//func AddCygxOrderRefundRevoke(item *CygxOrderRefund) (err error) {
+//	to := orm.NewOrmUsingDB("hz_cygx")
+//	o, err := to.Begin()
+//	if err != nil {
+//		return
+//	}
+//	defer func() {
+//		if err != nil {
+//			_ = o.Rollback()
+//		} else {
+//			_ = o.Commit()
+//		}
+//	}()
+//	updateParams := make(map[string]interface{})
+//	updateParams["OrderStatus"] = 3
+//	updateParams["RefundMoney"] = item.RefundMoney
+//	updateParams["RefundRemark"] = item.Remark
+//	updateParams["RefundTime"] = time.Now()
+//	ptrStructOrTableName := "cygx_order"
+//	whereParam := map[string]interface{}{"order_code": item.OrderCode}
+//	qs := o.QueryTable(ptrStructOrTableName)
+//	for expr, exprV := range whereParam {
+//		qs = qs.Filter(expr, exprV)
+//	}
+//	_, err = qs.Update(updateParams)
+//	if err != nil {
+//		return
+//	}
+//	_, err = o.Insert(item)
+//	return
+//}

+ 58 - 0
models/cygx/order_refund.go

@@ -0,0 +1,58 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxOrderRefund struct {
+	//OrderRefundID   uint64    `description:"主键id"`
+	OrderRefundId   int       `orm:"column(order_refund_id);pk";comment:"主键id"`
+	OrderCode       string    `description:"订单编号"`
+	RefundTradeCode string    `description:"退款交易号"`
+	RefundMoney     float64   `description:"退款金额"`
+	RefundWay       int       `description:"退款方式(1:微信商户,2:支付宝商户,3:线下)"`
+	RefundTime      time.Time `description:"退款时间"`
+	Remark          string    `description:"备注"`
+	CreateTime      time.Time `description:"创建时间"`
+	AdminId         int       `description:"管理员ID"`
+	AdminName       string    `description:"管理员姓名"`
+}
+
+type CygxOrderRefundReq struct {
+	OrderCode string `description:"订单编号"`
+	Remark    string `description:"备注"`
+}
+
+// 添加CygxOrderRefund
+func AddCygxOrderRefund(item *CygxOrderRefund, orderStatus int) (err error) {
+	to := orm.NewOrmUsingDB("hz_cygx")
+	o, err := to.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = o.Rollback()
+		} else {
+			_ = o.Commit()
+		}
+	}()
+	updateParams := make(map[string]interface{})
+	updateParams["OrderStatus"] = orderStatus
+	updateParams["RefundMoney"] = item.RefundMoney
+	updateParams["RefundRemark"] = item.Remark
+	updateParams["RefundTime"] = time.Now()
+	ptrStructOrTableName := "cygx_order"
+	whereParam := map[string]interface{}{"order_code": item.OrderCode}
+	qs := o.QueryTable(ptrStructOrTableName)
+	for expr, exprV := range whereParam {
+		qs = qs.Filter(expr, exprV)
+	}
+	_, err = qs.Update(updateParams)
+	if err != nil {
+		return
+	}
+	_, err = o.Insert(item)
+	return
+}

+ 10 - 1
models/cygx/summary_manage.go

@@ -131,6 +131,7 @@ type CygxArticleResp struct {
 	SubCategoryName    string    `description:"主题名称"`
 	LinkArticleId      int       `description:"报告ID链接"`
 	NickName           string    `description:"作者昵称"`
+	HeadImgUrl         string    `description:"作者头像"`
 	SubjectIds         string    `description:"报告所关联的标的"`
 	AdminId            int       `description:"销售/管理员ID"`
 	AdminName          string    `description:"销售/管理员姓名"`
@@ -205,7 +206,7 @@ func GetArticleIdInfoBySummaryManageId(summaryManageId int) (item *CygxArticleRe
 // 通过文章ID获取文章、以及所关联的标的详情
 func GetArticleInfoOtherByArticleId(articleId int) (item *CygxArticleResp, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
-	sql := `SELECT art.* ,dm.nick_name  FROM cygx_article as art 
+	sql := `SELECT art.* ,dm.nick_name ,dm.img_url as head_img_url   FROM cygx_article as art 
 			LEFT JOIN cygx_article_department as dm ON dm.department_id = art.department_id  WHERE article_id=? `
 	err = o.Raw(sql, articleId).QueryRow(&item)
 	return
@@ -592,3 +593,11 @@ func UpdateArticleTopTime(activityId, topTime int) (err error) {
 	_, err = o.Raw(sql, topTime, activityId).Exec()
 	return
 }
+
+// 添加朋友圈分享封面图片
+func UpdateCygxArticleMomentsImg(momentsImg string, articleId int) (err error) {
+	sql := `UPDATE cygx_article SET  moments_img=?  WHERE article_id=? `
+	o := orm.NewOrmUsingDB("hz_cygx")
+	_, err = o.Raw(sql, momentsImg, articleId).Exec()
+	return
+}

+ 76 - 0
models/cygx/user_admin_share_history.go

@@ -0,0 +1,76 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
+)
+
+type CygxUserAdminShareHistory struct {
+	UserAdminShareHistoryId int       `orm:"column(user_admin_share_history_id);pk";comment:"主键ID"`
+	Action                  string    `comment:"动作内容"`
+	UserId                  int       `comment:"用户ID"`
+	Mobile                  string    `comment:"手机号"`
+	Email                   string    `comment:"邮箱"`
+	CompanyId               int       `comment:"公司ID"`
+	CompanyName             string    `comment:"公司名称"`
+	RealName                string    `comment:"用户实际名称"`
+	SellerName              string    `comment:"所属销售名称"`
+	SellerId                int       `comment:"所属销售ID"`
+	ShareId                 int       `comment:"分享人ID"`
+	ShareName               string    `comment:"分享人姓名"`
+	Source                  string    `comment:"来源(article, activity, login)"`
+	SourceId                int       `comment:"来源 ID"`
+	SourceTitle             string    `comment:"来源名称,活动或者报告标题"`
+	RegisterPlatform        int       `comment:"注册平台(1: 小程序, 2: 网页)"`
+	CreateTime              time.Time `comment:"创建时间"`
+	ModifyTime              time.Time `comment:"修改时间"`
+}
+
+type CygxUserAdminShareHistoryResp struct {
+	UserAdminShareHistoryId int    `orm:"column(user_admin_share_history_id);pk";comment:"主键ID"`
+	Action                  string `comment:"动作内容"`
+	UserId                  int    `comment:"用户ID"`
+	Mobile                  string `comment:"手机号"`
+	Email                   string `comment:"邮箱"`
+	CompanyId               int    `comment:"公司ID"`
+	CompanyName             string `comment:"公司名称"`
+	RealName                string `comment:"用户实际名称"`
+	ShareId                 int    `comment:"分享人ID"`
+	ShareName               string `comment:"分享人姓名"`
+	Source                  string `comment:"来源(article, activity, login)"`
+	SourceId                int    `comment:"来源 ID"`
+	SourceTitle             string `comment:"来源名称,活动或者报告标题"`
+	RegisterPlatform        int    `comment:"注册平台(1: 小程序, 2: 网页)"`
+	RegisterPlatformText    string `comment:"注册平台(1: 小程序, 2: 网页)"`
+	CreateTime              string `comment:"创建时间"`
+	HttpUrl                 string `comment:"跳转地址"`
+}
+
+type GetCygxUserAdminShareHistoryListResp struct {
+	Paging *paging.PagingItem `description:"分页数据"`
+	List   []*CygxUserAdminShareHistoryResp
+}
+
+// 获取数量
+func GetCygxUserAdminShareHistoryCount(condition string, pars []interface{}) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_user_admin_share_history as a WHERE 1= 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	o := orm.NewOrmUsingDB("hz_cygx")
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+// 列表
+func GetCygxUserAdminShareHistoryList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxUserAdminShareHistoryResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_user_admin_share_history as a WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` LIMIT ?,?  `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}

+ 29 - 0
models/cygx/user_business_card.go

@@ -0,0 +1,29 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxUserBusinessCard struct {
+	UserId           int       `comment:"用户ID"`
+	Mobile           string    `comment:"手机号"`
+	Email            string    `comment:"邮箱"`
+	CompanyName      string    `comment:"公司名称"`
+	RealName         string    `comment:"用户实际名称"`
+	InviteName       string    `comment:"用户实际名称"`
+	CreateTime       time.Time `comment:"创建时间"`
+	ModifyTime       time.Time `comment:"修改时间"`
+	RegisterPlatform int       `comment:"来源 1小程序,2:网页"`
+}
+
+func GetCygxUserBusinessCardList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxUserBusinessCard, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT *
+			FROM
+			cygx_user_business_card
+			WHERE 1 = 1 ` + condition
+	sql += ` LIMIT ?,?  `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}

+ 5 - 1
models/day_new/day_new_default.go

@@ -10,6 +10,8 @@ type DayNewDefault struct {
 	ClassifyNameFirst  string `description:"一级分类名称"`
 	ClassifyIdSecond   int    `description:"二级分类id"`
 	ClassifyNameSecond string `description:"二级分类名称"`
+	ClassifyIdThird    int    `description:"三级分类ID"`
+	ClassifyNameThird  string `description:"三级分类名称"`
 	Title              string `description:"标题"`
 	Abstract           string `description:"摘要"`
 	Author             string `description:"作者"`
@@ -24,6 +26,8 @@ type EnglishReportDefaultSaveReq struct {
 	ClassifyNameFirst  string `description:"一级分类名称"`
 	ClassifyIdSecond   int    `description:"二级分类id"`
 	ClassifyNameSecond string `description:"二级分类名称"`
+	ClassifyIdThird    int    `description:"三级分类ID"`
+	ClassifyNameThird  string `description:"三级分类名称"`
 	Title              string `description:"标题"`
 	Abstract           string `description:"摘要"`
 	Author             string `description:"作者"`
@@ -51,4 +55,4 @@ func (item *DayNewDefault) Update(cols []string) (err error) {
 	o := orm.NewOrm()
 	_, err = o.Update(item, cols...)
 	return
-}
+}

+ 9 - 8
models/day_new/wework_msg.go

@@ -45,7 +45,7 @@ type WeworkMsgListResp struct {
 }
 
 type DeleteWeworkMsgReq struct {
-	MsgId      string `description:"企业微信消息id"`
+	MsgId string `description:"企业微信消息id"`
 }
 
 type EditWeworkMsgContentReq struct {
@@ -59,6 +59,8 @@ type DayNewReportDefaultResp struct {
 	ClassifyNameFirst  string `description:"一级分类名称"`
 	ClassifyIdSecond   int    `description:"二级分类id"`
 	ClassifyNameSecond string `description:"二级分类名称"`
+	ClassifyIdThird    int    `description:"三级分类ID"`
+	ClassifyNameThird  string `description:"三级分类名称"`
 	Title              string `description:"标题"`
 	Abstract           string `description:"摘要"`
 	Author             string `description:"作者"`
@@ -115,7 +117,7 @@ func GetWeworkMsgByConditionLimit(condition string, pars []interface{}, limit in
 	return
 }
 
-func UpdateContentEnByMsgId(contentEn, msgId string) (err error)  {
+func UpdateContentEnByMsgId(contentEn, msgId string) (err error) {
 	o := orm.NewOrm()
 	sql := `UPDATE wework_msg 
 SET modify_time=NOW(), content_en = ?
@@ -126,7 +128,7 @@ WHERE
 }
 
 // DeleteWeworkMsgByMsgId 删除消息
-func DeleteWeworkMsgByMsgId(msgId string) (err error)  {
+func DeleteWeworkMsgByMsgId(msgId string) (err error) {
 	o := orm.NewOrm()
 	sql := `UPDATE wework_msg 
 SET modify_time=NOW(), is_delete = 1
@@ -137,7 +139,7 @@ WHERE
 }
 
 // GetWeworkMsgByMsgId 根据消息Id查询
-func GetWeworkMsgByMsgId(msgId string) (item *WeworkMsg, err error)  {
+func GetWeworkMsgByMsgId(msgId string) (item *WeworkMsg, err error) {
 	o := orm.NewOrm()
 	sql := `select * from wework_msg where msg_id = ?`
 	err = o.Raw(sql, msgId).QueryRow(&item)
@@ -155,14 +157,13 @@ type AddEnglishReportReq struct {
 	Frequency          string `description:"频度"`
 }
 
-
 // UpdateWeworkMsgIsAdd 更新消息状态为已加入报告
-func UpdateWeworkMsgIsAdd(msgIds string, reportId int64) (err error)  {
+func UpdateWeworkMsgIsAdd(msgIds string, reportId int64) (err error) {
 	o := orm.NewOrm()
 	sql := `UPDATE wework_msg 
 SET modify_time=NOW(), is_add = 1, report_id= ?
 WHERE 
-	 msg_id in (`+msgIds+`) and is_delete = 0 and is_add = 0`
+	 msg_id in (` + msgIds + `) and is_delete = 0 and is_add = 0`
 	_, err = o.Raw(sql, reportId).Exec()
 	return
 }
@@ -173,4 +174,4 @@ func GetWeworkMsgReportIdByLimit(limit int) (list []*WeworkMsg, err error) {
 	sql := `SELECT * FROM wework_msg WHERE is_add = 1 and report_id > 0 GROUP BY report_id ORDER BY report_id desc LIMIT ?`
 	_, err = o.Raw(sql, limit).QueryRows(&list)
 	return
-}
+}

+ 7 - 0
models/db.go

@@ -473,6 +473,13 @@ func initCygx() {
 		new(cygx.CygxActivitySpecialPermissionPoints),
 		new(cygx.CygxUserYanxuanPermission),
 		new(cygx.CygxUserYanxuanPermissionLog),
+		new(cygx.CygxEnterScore),
+		new(cygx.CygxEnterScoreGroup),
+		new(cygx.CygxEnterScorePermission),
+		new(cygx.CygxEnterScoreResearcher),
+		new(cygx.CygxOrderRefund),
+		new(cygx.CygxOrder),
+		new(cygx.CygxOrderAction),
 	)
 }
 

+ 27 - 17
models/english_report.go

@@ -2,7 +2,6 @@ package models
 
 import (
 	"github.com/beego/beego/v2/client/orm"
-	"github.com/rdlucklib/rdluck_tools/paging"
 	"hongze/hz_crm_api/utils"
 	"strings"
 	"time"
@@ -108,33 +107,36 @@ type EnglishClassifyList struct {
 	IsShow        int       `description:"是否在小程序显示:1-显示 0-隐藏"`
 	//ClassifyType  int       `description:"分类类型:0英文报告,1英文线上路演"`
 	EnPermissions []int `description:"英文权限IDs"`
+	Enabled       int   `description:"是否可用,1可用,0禁用"`
 	Child         []*EnglishClassifyList
 }
 
 type EnglishClassifyListResp struct {
-	List   []*EnglishClassifyList
-	Paging *paging.PagingItem `description:"分页数据"`
+	List []*EnglishClassifyList
 }
 
 // GetEnglishClassifyRootId 获取一级分类列表
-func GetEnglishClassifyRootId(startSize, pageSize int, keyWord string) (items []*EnglishClassifyList, err error) {
+func GetEnglishClassifyRootId(keyword string, enabled int) (items []*EnglishClassifyList, err error) {
 	sql := ``
 	o := orm.NewOrmUsingDB("rddp")
-	if keyWord != "" {
+	cond := ""
+	if enabled == 1 {
+		cond = " AND enabled=1 "
+	}
+	if keyword != "" {
 		sql = `SELECT * FROM (
 			                   SELECT * FROM english_classify
-                   WHERE parent_id=0 AND classify_name LIKE '%` + keyWord + `%'
+                   WHERE parent_id=0 ` + cond + ` AND classify_name LIKE ? 
                    UNION
                    SELECT * FROM english_classify
                    WHERE id IN(SELECT parent_id FROM english_classify
-                   WHERE parent_id>0 AND classify_name LIKE '%` + keyWord + `%')
+                   WHERE parent_id>0 ` + cond + ` AND classify_name LIKE ? )
                    )AS t
-                   ORDER BY sort ASC,create_time ASC
-                   LIMIT ?,? `
-		_, err = o.Raw(sql, startSize, pageSize).QueryRows(&items)
+                   ORDER BY sort ASC,create_time ASC`
+		_, err = o.Raw(sql, utils.GetLikeKeyword(keyword), utils.GetLikeKeyword(keyword)).QueryRows(&items)
 	} else {
-		sql = `SELECT * FROM english_classify WHERE parent_id=0 ORDER BY sort ASC,create_time ASC LIMIT ?,? `
-		_, err = o.Raw(sql, startSize, pageSize).QueryRows(&items)
+		sql = `SELECT * FROM english_classify WHERE parent_id=0 ` + cond + ` ORDER BY sort ASC,create_time ASC `
+		_, err = o.Raw(sql).QueryRows(&items)
 	}
 	return
 }
@@ -160,20 +162,28 @@ func GetEnglishClassifyListCount(keyWord string) (count int, err error) {
 	return
 }
 
-func GetEnglishClassifyListByRootId(rootIds []int, keyWord string) (items []*EnglishClassifyList, err error) {
+func GetEnglishClassifyListByRootId(rootIds []int, keyword string, enabled int) (items []*EnglishClassifyList, err error) {
 	sql := ``
+	pars := make([]interface{}, 0)
+
 	o := orm.NewOrmUsingDB("rddp")
-	if keyWord != "" {
+	cond := ""
+	if enabled == 1 {
+		cond = " AND enabled=1 "
+	}
+	if keyword != "" {
 		sql = `SELECT
 	a.*
 FROM
 	english_classify a
 	LEFT JOIN english_classify b ON a.root_id = b.id
 	LEFT JOIN english_classify c ON a.parent_id = c.id
-	WHERE a.parent_id > 0 and a.classify_name LIKE '%` + keyWord + `%' and a.root_id IN (` + utils.GetOrmInReplace(len(rootIds)) + `)`
-		_, err = o.Raw(sql, rootIds).QueryRows(&items)
+	WHERE a.parent_id>0  ` + cond + ` and a.classify_name LIKE ? and a.root_id IN (` + utils.GetOrmInReplace(len(rootIds)) + `)`
+		pars = append(pars, utils.GetLikeKeyword(keyword))
+		pars = append(pars, rootIds)
+		_, err = o.Raw(sql, pars).QueryRows(&items)
 	} else {
-		sql = `SELECT * FROM english_classify WHERE parent_id > 0 and root_id IN (` + utils.GetOrmInReplace(len(rootIds)) + `) `
+		sql = `SELECT * FROM english_classify WHERE parent_id>0  ` + cond + ` and root_id IN (` + utils.GetOrmInReplace(len(rootIds)) + `) `
 		_, err = o.Raw(sql, rootIds).QueryRows(&items)
 	}
 	return

+ 16 - 0
models/eta_business/eta_business.go

@@ -41,6 +41,7 @@ type EtaBusiness struct {
 	ExpiredTime      time.Time `description:"当前合约的到期时间"`
 	CreateTime       time.Time `description:"创建时间"`
 	ModifyTime       time.Time `description:"更新时间"`
+	Nation           string    `description:"所属国家"`
 }
 
 func (m *EtaBusiness) TableName() string {
@@ -247,6 +248,7 @@ type EtaBusinessAddReq struct {
 	SigningTime      string `description:"签约时间"`
 	ExpiredTime      string `description:"到期时间"`
 	IsCheck          bool   `description:"是否只做校验而不实际新增(业务操作上基础信息和签约时间分成两个步骤了)"`
+	Nation           string `description:"所属国家"`
 }
 
 // EtaBusinessEditReq 编辑商家请求体
@@ -260,6 +262,7 @@ type EtaBusinessEditReq struct {
 	CapitalScale     string `description:"资金规模"`
 	ResearchTeamSize string `description:"研究团队规模"`
 	UserMax          int    `description:"用户上限"`
+	Nation           string `description:"所属国家"`
 }
 
 // EtaBusinessSigningReq 商家签约请求体
@@ -325,4 +328,17 @@ type EtaBusinessItem struct {
 	ExpiredTime      string `description:"当前合约的到期时间"`
 	CreateTime       string `description:"创建时间"`
 	ModifyTime       string `description:"更新时间"`
+	Nation           string `description:"所属国家"`
+}
+
+// EtaBusinessEditSignReq 编辑商家签约请求体
+type EtaBusinessEditSignReq struct {
+	EtaBusinessContractId int    `description:"商家合约ID"`
+	SigningTime           string `description:"当前合约的签约时间"`
+	ExpiredTime           string `description:"当前合约的到期时间"`
+}
+
+// EtaBusinessRemoveSignReq 删除商家签约请求体
+type EtaBusinessRemoveSignReq struct {
+	EtaBusinessContractId int `description:"商家合约ID"`
 }

+ 40 - 0
models/eta_business/eta_business_contract.go

@@ -154,6 +154,46 @@ func (m *EtaBusinessContract) CreateMaybeUpdateFirst(item *EtaBusinessContract,
 	return
 }
 
+// UpdateMaybeUpdateFirst 编辑签约合同, 或同时更新首次签约合同
+func (m *EtaBusinessContract) UpdateMaybeUpdateFirst(item *EtaBusinessContract, changeFirst bool, updateCols []string) (err error) {
+	// 无需修改首次签约则直接更新
+	o := orm.NewOrm()
+	if !changeFirst {
+		e := item.Update(updateCols)
+		if e != nil {
+			return e
+		}
+		return
+	}
+
+	// 更新首次签约合同
+	tx, e := o.Begin()
+	if e != nil {
+		return e
+	}
+	defer func() {
+		if err != nil {
+			_ = tx.Rollback()
+			return
+		}
+		_ = tx.Commit()
+	}()
+
+	_, e = tx.Update(item, updateCols...)
+	if e != nil {
+		err = fmt.Errorf("contract update err: %s", e.Error())
+		return
+	}
+
+	sql := fmt.Sprintf(`UPDATE %s SET %s = 0 WHERE %s = ? AND %s <> ?`, m.TableName(), EtaBusinessContractColumns.IsFirst, EtaBusinessContractColumns.EtaBusinessId, EtaBusinessContractColumns.EtaBusinessContractId)
+	_, e = tx.Raw(sql, item.EtaBusinessId, item.EtaBusinessContractId).Exec()
+	if e != nil {
+		err = fmt.Errorf("update first contract err: %s", e.Error())
+		return
+	}
+	return
+}
+
 // EtaBusinessContractItem 商家签约信息
 type EtaBusinessContractItem struct {
 	EtaBusinessContractId int

+ 3 - 1
models/eta_business/eta_business_operation_record.go

@@ -15,6 +15,8 @@ const (
 	EtaBusinessOperationTypeEnable
 	EtaBusinessOperationTypeMoveSeller
 	EtaBusinessOperationTypeRenewalContract
+	EtaBusinessOperationTypeEditContract
+	EtaBusinessOperationTypeRemoveContract
 )
 
 // EtaBusinessOperationRecord ETA商家操作日志表
@@ -24,7 +26,7 @@ type EtaBusinessOperationRecord struct {
 	SellerId        int       `description:"操作时所对应的销售ID"`
 	SysUserId       int       `description:"操作人ID"`
 	SysRealName     string    `description:"操作人姓名"`
-	OperationType   int       `description:"操作类型:1-新增;2-编辑;3-禁用;4-启用;5-移动销售;6-添加续约"`
+	OperationType   int       `description:"操作类型:1-新增;2-编辑;3-禁用;4-启用;5-移动销售;6-添加续约;7-编辑签约;8-删除签约"`
 	OperationRemark string    `description:"操作内容"`
 	CreateTime      time.Time `description:"创建时间"`
 }

+ 4 - 4
models/eta_trial/eta_trial_manual.go

@@ -15,7 +15,7 @@ type ETATrialManualClassify struct {
 // GetETATrialManualClassify 获取ETA试用手工数据分类
 func GetETATrialManualClassify() (items []*ETATrialManualClassify, err error) {
 	o := orm.NewOrmUsingDB("weekly_trial")
-	sql := `SELECT classify_id, classify_name, parent_id FROM edb_trial.edbdata_classify WHERE is_show=1 ORDER BY sort ASC`
+	sql := `SELECT classify_id, classify_name, parent_id FROM edb_trial_new.edbdata_classify WHERE is_show=1 ORDER BY sort ASC`
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
@@ -31,7 +31,7 @@ func GetNoAuthTrialUserIds() (items []*ETATrialUserAdmin, err error) {
 	o := orm.NewOrmUsingDB("weekly_trial")
 	sql := `SELECT a.admin_id, a.real_name FROM weekly_report_trial.admin AS a
 			WHERE a.admin_id NOT IN (
-				SELECT DISTINCT b.admin_id FROM hz_data_trial.manual_user_classify AS b
+				SELECT DISTINCT b.admin_id FROM hz_data_trial_new.manual_user_classify AS b
 			)
 			AND a.department_id = 12 AND a.department_name = "ETA试用客户"`
 	_, err = o.Raw(sql).QueryRows(&items)
@@ -54,14 +54,14 @@ func InsertTrialUserManualAuth(adminId int, adminRealName string, classifyIds []
 	}()
 
 	// 新增权限用户
-	sql := `INSERT INTO hz_data_trial.manual_user (admin_id, admin_real_name, sys_user_id, sys_user_real_name, create_time) VALUES ("%d", "%s", 0, "", NOW())`
+	sql := `INSERT INTO hz_data_trial_new.manual_user (admin_id, admin_real_name, sys_user_id, sys_user_real_name, create_time) VALUES ("%d", "%s", 0, "", NOW())`
 	sql = fmt.Sprintf(sql, adminId, adminRealName)
 	if _, err = tx.Raw(sql).Exec(); err != nil {
 		return
 	}
 	// 新增权限分类
 	for i := range classifyIds {
-		sql = `INSERT INTO hz_data_trial.manual_user_classify (admin_id, classify_id, create_time) VALUES ("%d", "%d", NOW())`
+		sql = `INSERT INTO hz_data_trial_new.manual_user_classify (admin_id, classify_id, create_time) VALUES ("%d", "%d", NOW())`
 		sql = fmt.Sprintf(sql, adminId, classifyIds[i])
 		if _, err = tx.Raw(sql).Exec(); err != nil {
 			return

+ 39 - 0
models/overseas_custom/custom.go

@@ -354,3 +354,42 @@ GROUP BY a.company_id `
 	_, err = o.Raw(sql, keyword, keyword, keyword, keyword).QueryRows(&companyIds)
 	return
 }
+
+func GetOverseasCustomList(condition string, pars []interface{}) (list []*Custom, err error) {
+	o := orm.NewOrm()
+	sql := ``
+	var databaseName string
+	if utils.RunMode == "debug" {
+		databaseName = "test_v2_hongze_rddp"
+	} else {
+		databaseName = "hongze_rddp"
+	}
+
+	sql = `SELECT * FROM (
+				SELECT a.company_id,a.company_name,a.nation,b.seller_id,b.seller_name,
+				b.view_total,b.road_show_total,a.created_time AS create_time,b.last_view_time,a.is_hide,a.overseas_status,
+				2 AS source,b.overseas_label,a.reset_btn
+				FROM company AS a
+				INNER JOIN company_product AS b ON a.company_id=b.company_id
+				INNER JOIN overseas_custom_seller AS c ON b.seller_id=c.seller_id
+				WHERE b.product_id=1 AND b.is_overseas = 0`
+	sql += `
+				UNION ALL
+				SELECT t.company_id+10000000,t.company_name,t.nation,t.seller_id,t.seller_name,
+				t.view_total,t.road_show_total,t.create_time,t.last_view_time,t.is_hide,t.overseas_status,
+				1 AS source,t.overseas_label,t.reset_btn
+				FROM %s.english_company AS t
+				INNER JOIN overseas_custom_seller AS n ON t.seller_id=n.seller_id
+             WHERE 1=1 AND t.is_deleted=0 `
+
+	sql += `		)AS m WHERE 1=1 `
+
+	if condition != "" {
+		sql += condition
+	}
+
+
+	sql = fmt.Sprintf(sql, databaseName)
+	_, err = o.Raw(sql, pars).QueryRows(&list)
+	return
+}

+ 19 - 3
models/permission.go

@@ -1,6 +1,10 @@
 package models
 
-import "github.com/beego/beego/v2/client/orm"
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"hongze/hz_crm_api/utils"
+)
 
 // ChartPermissionSearchKeyWordMapping 权限相关
 type ChartPermissionSearchKeyWordMapping struct {
@@ -10,6 +14,7 @@ type ChartPermissionSearchKeyWordMapping struct {
 	From               string `description:"类型标识" json:"-"`
 	TacticType         string `description:"策略表type字段值" json:"-"`
 	TeleconferenceSort int    `description:"电话会类型排序" json:"-"`
+	ClassifyId         int    `description:"分类ID"`
 }
 
 func GetPermission(classifyNameSecond string) (items []*ChartPermissionSearchKeyWordMapping, err error) {
@@ -65,7 +70,7 @@ func AddChartPermissionSearchKeyWordMappingMulti(chartPermissionSearchKeyWordMap
 
 func AddChartPermissionChapterMapping(chartPermissionId int, reportId int64) (err error) {
 	sql := `INSERT INTO chart_permission_chapter_mapping (chart_permission_id, report_chapter_type_id,research_type)
-           VALUES(?,?,?)`
+          VALUES(?,?,?)`
 	o := orm.NewOrm()
 	_, err = o.Raw(sql, chartPermissionId, reportId, "rddp").Exec()
 	return
@@ -97,4 +102,15 @@ func UpdateChartPermissionNameFromMappingByKeyword(newKeyword, keyword, source s
 	sql := " UPDATE chart_permission_search_key_word_mapping SET key_word = ? WHERE key_word = ? AND `from` = ? "
 	_, err = o.Raw(sql, newKeyword, keyword, source).Exec()
 	return
-}
+}
+
+// GetPermissionsByClassifyIds 根据分类IDs获取权限IDs
+func GetPermissionsByClassifyIds(classifyIds []int) (items []*ChartPermissionSearchKeyWordMapping, err error) {
+	if len(classifyIds) == 0 {
+		return
+	}
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`SELECT * FROM chart_permission_search_key_word_mapping AS a WHERE a.from='rddp' AND a.classify_id IN (%s)`, utils.GetOrmInReplace(len(classifyIds)))
+	_, err = o.Raw(sql, classifyIds).QueryRows(&items)
+	return
+}

+ 11 - 16
models/report_chapter_type.go

@@ -2,7 +2,6 @@ package models
 
 import (
 	"github.com/beego/beego/v2/client/orm"
-	"github.com/rdlucklib/rdluck_tools/paging"
 	"hongze/hz_crm_api/utils"
 	"time"
 )
@@ -299,9 +298,8 @@ type UpdateReportChapterTypeResp struct {
 	Week []*ReportChapterType `description:"所有周报品种"`
 }
 
-type ReportChapterTypePageListResp struct {
-	List   []*ReportChapterTypeListItem
-	Paging *paging.PagingItem `description:"分页数据"`
+type ReportChapterTypeListResp struct {
+	List []*ReportChapterTypeListItem
 }
 
 // GetReportChapterTypeCount 获取章节类型总数
@@ -314,13 +312,12 @@ func GetReportChapterTypeCount(condition string, pars []interface{}) (count int,
 }
 
 // GetReportChapterTypeList 获取章节类型列表
-func GetReportChapterTypePageList(condition string, pars []interface{}, startSize, pageSize int) (list []*ReportChapterType, err error) {
+func GetReportChapterTypePageList(condition string, pars []interface{}) (list []*ReportChapterType, err error) {
 	o := orm.NewOrm()
 	sql := ` SELECT * FROM report_chapter_type WHERE 1 = 1 `
 	sql += condition
 	sql += ` ORDER BY sort ASC, created_time DESC`
-	sql += ` LIMIT ?,?`
-	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&list)
+	_, err = o.Raw(sql, pars).QueryRows(&list)
 	return
 }
 
@@ -336,6 +333,7 @@ type ReportChapterTypeListItem struct {
 	WordsImage            string `description:"带字的icon"`
 	EditImgUrl            string `description:"管理后台编辑时选用的图"`
 	IsShow                int    `description:"显示隐藏: 1-显示; 0-隐藏"`
+	Enabled               int    `description:"是否可用,1可用,0禁用"`
 }
 
 // ReportChapterTypeAddReq 新增章节类型请求体
@@ -352,15 +350,12 @@ type ReportChapterTypeAddReq struct {
 
 // ReportChapterTypeEditReq 编辑章节类型请求体
 type ReportChapterTypeEditReq struct {
-	ReportChapterTypeId   int    `description:"报告章节类型id"`
-	ReportChapterTypeName string `description:"报告章节类型名称"`
-	Sort                  int    `description:"排序字段"`
-	ResearchType          string `description:"研报类型"`
-	SelectedImage         string `description:"选中时的icon"`
-	UnselectedImage       string `description:"未选中时的icon"`
-	WordsImage            string `description:"带字的icon"`
-	EditImgUrl            string `description:"管理后台编辑时选用的图"`
-	IsShow                int    `description:"显示隐藏: 1-显示; 0-隐藏"`
+	ReportChapterTypeId int    `description:"报告章节类型id"`
+	SelectedImage       string `description:"选中时的icon"`
+	UnselectedImage     string `description:"未选中时的icon"`
+	WordsImage          string `description:"带字的icon"`
+	EditImgUrl          string `description:"管理后台编辑时选用的图"`
+	IsShow              int    `description:"显示隐藏: 1-显示; 0-隐藏"`
 }
 
 // ReportChapterTypeDelReq 删除章节类型请求体

+ 80 - 2
models/roadshow/calendar.go

@@ -167,6 +167,7 @@ type ResearcherGroup struct {
 	ResearcherList []*ResearcherGroup
 }
 
+
 func GetResearcherGroup() (list []*ResearcherGroup, err error) {
 	o := orm.NewOrm()
 	sql := ` SELECT group_id,group_name FROM admin AS a
@@ -180,7 +181,7 @@ func GetResearcherGroup() (list []*ResearcherGroup, err error) {
 	return
 }
 
-func GetResearcher() (list []*Researcher, err error) {
+func GetResearcher() (list []*ResearcherGroup, err error) {
 	o := orm.NewOrm()
 	sql := ` SELECT * FROM admin AS a
 			WHERE a.role_type_code IN('researcher','rai_researcher','ficc_researcher','ficc_admin')
@@ -197,7 +198,7 @@ func GetChoiceResearcher(adminIds string) (list []*Researcher, err error) {
 }
 
 // GetResearcherV2 获取研究员列表(冻结的也要)
-func GetResearcherV2() (list []*Researcher, err error) {
+func GetResearcherV2() (list []*ResearcherGroup, err error) {
 	o := orm.NewOrm()
 	sql := ` SELECT * FROM admin AS a
 			WHERE a.role_type_code IN('researcher','rai_researcher','ficc_researcher','ficc_admin')
@@ -913,3 +914,80 @@ func GetOverseaCustomCalendarList(keyword, sellerId, researcherId, startDate, en
 
 	return
 }
+
+func GetOverseaCustomCalendarList2(sellerId, researcherId, startDate, endDate, companyStatus string) (list []*RsReportRecordList, err error) {
+	var databaseName string
+	if utils.RunMode == "debug" {
+		databaseName = "test_v2_hongze_rddp"
+	} else {
+		databaseName = "hongze_rddp"
+	}
+	companyStatusList := make([]string, 0)
+	if companyStatus != "" {
+		companyStatusList = strings.Split(companyStatus, ",")
+	}
+	lenCompanyStatusList := len(companyStatusList)
+
+	o := orm.NewOrm()
+
+	pars := make([]interface{}, 0)
+
+	sql1 := `SELECT b.start_date,b.end_date,b.start_time,b.end_time,a.rs_calendar_id,b.seller_id,b.seller_name,b.researcher_name,b.company_name,b.company_id,d.overseas_status as company_status,b.roadshow_type,a.theme,a.roadshow_platform,a.province as province,a.city as city FROM  rs_calendar AS a
+    INNER JOIN rs_report_record  AS b ON a.rs_calendar_id=b.rs_calendar_id
+         JOIN company_product AS c ON a.company_id=c.company_id AND c.product_id=1
+         JOIN company AS d ON c.company_id=d.company_id 
+				INNER JOIN overseas_custom_seller AS f ON c.seller_id=f.seller_id
+		where c.is_overseas = 0 and  a.english_company= 0 AND a.source = 0  AND b.rs_calendar_researcher_status=2 AND b.researcher_id != 0`
+
+	if startDate != "" {
+		sql1 += ` AND b.start_date >= ? `
+		pars = append(pars, startDate)
+	}
+	if endDate != "" {
+		sql1 += ` AND b.start_date <= ? `
+		pars = append(pars, endDate)
+	}
+	if lenCompanyStatusList > 0 {
+		sql1 += ` AND d.overseas_status in (` + utils.GetOrmInReplace(lenCompanyStatusList) + ") "
+		pars = append(pars, companyStatusList)
+	}
+	if sellerId != "" {
+		sql1 += fmt.Sprintf(` AND b.seller_id in (%s) `, sellerId)
+	}
+	if researcherId != "" {
+		sql1 += fmt.Sprintf(` AND b.researcher_id in (%s) `, researcherId)
+	}
+	sql2 := fmt.Sprintf(`SELECT bb.start_date,bb.end_date,bb.start_time,bb.end_time,aa.rs_calendar_id,bb.seller_id,bb.seller_name,bb.researcher_name,aa.company_name,aa.company_id,cc.overseas_status as company_status,bb.roadshow_type,aa.theme,aa.roadshow_platform,aa.province as province,aa.city as city FROM  rs_calendar AS aa
+    INNER JOIN rs_report_record  AS bb ON aa.rs_calendar_id=bb.rs_calendar_id
+    INNER JOIN %s.english_company AS cc ON aa.company_id=cc.company_id
+		where aa.english_company= 1 AND aa.source = 0 AND cc.is_deleted=0  AND bb.rs_calendar_researcher_status=2 AND bb.researcher_id != 0 `, databaseName)
+
+
+	if startDate != "" {
+		sql2 += ` AND bb.start_date >= ?  `
+		pars = append(pars, startDate)
+	}
+	if endDate != "" {
+		sql2 += ` AND bb.start_date <= ?  `
+		pars = append(pars, endDate)
+	}
+	if lenCompanyStatusList > 0 {
+		sql2 += ` AND cc.overseas_status in (` + utils.GetOrmInReplace(lenCompanyStatusList) + ") "
+		pars = append(pars, companyStatusList)
+	}
+	if sellerId != "" {
+		sql2 += fmt.Sprintf(` AND bb.seller_id in (%s) `, sellerId)
+	}
+	if researcherId != "" {
+		sql2 += fmt.Sprintf(` AND bb.researcher_id in (%s) `, researcherId)
+	}
+	// 列表数据
+	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)
+
+	return
+}

+ 1 - 1
models/roadshow/company.go

@@ -39,7 +39,7 @@ 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 a.share_seller_id = ?) AND a.company_name LIKE ?
+				b.status IN ('正式', '试用') AND (b.seller_id = ? OR b.share_seller_id = ?) AND a.company_name LIKE ?
 			GROUP BY
 				b.company_id`
 	_, err = o.Raw(sql, sellerId, sellerId, keyWord).QueryRows(&companies)

+ 181 - 0
models/roadshow/report_record.go

@@ -1,7 +1,10 @@
 package roadshow
 
 import (
+	"fmt"
 	"github.com/beego/beego/v2/client/orm"
+	"hongze/hz_crm_api/utils"
+	"strings"
 	"time"
 )
 
@@ -229,3 +232,181 @@ func GetBusinessTripList(adminId int, startDate, endDate string) (list []*Busine
 	}
 	return
 }
+
+// GetOverseasGroupSellerRecordList 获取销售分组数据
+func _GetOverseasGroupSellerRecordList(condition string, pars []interface{}) (list []*RsReportRecordGroup, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT seller_id as admin_id,seller_group_id as group_id,seller_name admin_name,count(1) num
+				FROM  rs_report_record 
+				WHERE 1=1 and rs_calendar_researcher_status = 2 
+ `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` GROUP BY seller_id`
+	_, err = o.Raw(sql, pars).QueryRows(&list)
+
+	return
+}
+
+// OverseasAdminReportRecord 系统用户统计信息
+type OverseasAdminReportRecord struct {
+	Name                  string                      `description:"系统用户名"`
+	AdminId               int                         `description:"系统用户id"`
+	RsReportRecordNumList []RsOverseasReportRecordNum `description:"统计次数"`
+}
+
+// RsOverseasReportRecordNum 系统用户统计信息
+type RsOverseasReportRecordNum struct {
+	TryOutNum  int    `description:"试用路演次数"`
+	FormalNum  int    `description:"正式路演次数"`
+	CloseNum   int    `description:"关闭客户次数"`
+	OnlineNum  int    `description:"线上路演次数"`
+	OfflineNum int    `description:"线上路演次数"`
+	StartDate  string `description:"开始日期"`
+	EndDate    string `description:"结束日期"`
+	IsLook     bool   `description:"是否可以查看详情"`
+}
+
+// RsOverseasReportRecordResp 总统计信息
+type RsOverseasReportRecordResp struct {
+	List                  []OverseasAdminReportRecord `description:"系统用户分组信息"`
+	RsReportRecordNumList []RsOverseasReportRecordNum `description:"统计次数"`
+}
+
+
+
+func GetOverseasGroupResearcherRecordList(startDate, endDate, companyStatus string) (list []*RsReportRecordGroup, err error) {
+	var databaseName string
+	if utils.RunMode == "debug" {
+		databaseName = "test_v2_hongze_rddp"
+	} else {
+		databaseName = "hongze_rddp"
+	}
+	companyStatusList := make([]string, 0)
+	if companyStatus != "" {
+		companyStatusList = strings.Split(companyStatus, ",")
+	}
+	lenCompanyStatusList := len(companyStatusList)
+
+	o := orm.NewOrm()
+
+	pars := make([]interface{}, 0)
+
+	sql1 := `SELECT a.rs_calendar_id,b.researcher_id as admin_id,b.researcher_group_id as group_id,b.researcher_name AS admin_name FROM  rs_calendar AS a
+    INNER JOIN rs_report_record  AS b ON a.rs_calendar_id=b.rs_calendar_id
+         JOIN company_product AS c ON a.company_id=c.company_id AND c.product_id=1
+         JOIN company AS d ON c.company_id=d.company_id 
+				INNER JOIN overseas_custom_seller AS f ON c.seller_id=f.seller_id
+		where c.is_overseas = 0 and  a.english_company= 0 AND a.source = 0  AND b.rs_calendar_researcher_status=2 AND b.researcher_id != 0 `
+
+	if startDate != "" {
+		sql1 += ` AND b.start_date >= ? `
+		pars = append(pars, startDate)
+	}
+	if endDate != "" {
+		sql1 += ` AND b.end_date <= ? `
+		pars = append(pars, endDate)
+	}
+	if lenCompanyStatusList > 0 {
+		sql1 += ` AND d.overseas_status in (` + utils.GetOrmInReplace(lenCompanyStatusList) + ") "
+		pars = append(pars, companyStatusList)
+	}
+	//sql1 += ` GROUP BY admin_id `
+
+	sql2 := fmt.Sprintf(`SELECT aa.rs_calendar_id,bb.researcher_id as admin_id,bb.researcher_group_id as group_id,bb.researcher_name AS admin_name FROM rs_calendar AS aa
+    INNER JOIN rs_report_record  AS bb ON aa.rs_calendar_id=bb.rs_calendar_id
+    INNER JOIN %s.english_company AS cc ON aa.company_id=cc.company_id
+		where aa.english_company= 1 AND aa.source = 0 AND cc.is_deleted=0  AND bb.rs_calendar_researcher_status=2 AND bb.researcher_id != 0 `, databaseName)
+
+	if startDate != "" {
+		sql2 += ` AND bb.start_date >= ?  `
+		pars = append(pars, startDate)
+	}
+	if endDate != "" {
+		sql2 += ` AND bb.end_date <= ?  `
+		pars = append(pars, endDate)
+	}
+	if lenCompanyStatusList > 0 {
+		sql2 += ` AND cc.overseas_status in (` + utils.GetOrmInReplace(lenCompanyStatusList) + ") "
+		pars = append(pars, companyStatusList)
+	}
+	//sql2 += ` GROUP BY admin_id `
+
+	// 列表数据
+	sql := `SELECT m.*,count(1) as num  FROM (` + sql1 + ` UNION ALL ` + sql2
+	sql += ` ) AS m  WHERE 1=1 `
+
+	sql += ` Group by admin_id `
+	_, err = o.Raw(sql, pars).QueryRows(&list)
+
+	return
+}
+
+func GetOverseasGroupSellerRecordList(startDate, endDate, companyStatus string) (list []*RsReportRecordGroup, err error) {
+	var databaseName string
+	if utils.RunMode == "debug" {
+		databaseName = "test_v2_hongze_rddp"
+	} else {
+		databaseName = "hongze_rddp"
+	}
+	companyStatusList := make([]string, 0)
+	if companyStatus != "" {
+		companyStatusList = strings.Split(companyStatus, ",")
+	}
+	lenCompanyStatusList := len(companyStatusList)
+
+	o := orm.NewOrm()
+
+	pars := make([]interface{}, 0)
+
+	sql1 := `SELECT COUNT(DISTINCT a.rs_calendar_id) AS num,b.seller_id as admin_id,b.seller_group_id as group_id,b.seller_name AS admin_name FROM  rs_calendar AS a
+    INNER JOIN rs_report_record  AS b ON a.rs_calendar_id=b.rs_calendar_id
+         JOIN company_product AS c ON a.company_id=c.company_id AND c.product_id=1
+         JOIN company AS d ON c.company_id=d.company_id 
+		 INNER JOIN overseas_custom_seller AS f ON c.seller_id=f.seller_id
+		where c.is_overseas = 0 and  a.english_company= 0 AND a.source = 0  AND b.rs_calendar_researcher_status=2 AND b.researcher_id != 0`
+
+	if startDate != "" {
+		sql1 += ` AND b.start_date >= ? `
+		pars = append(pars, startDate)
+	}
+	if endDate != "" {
+		sql1 += ` AND b.end_date <= ? `
+		pars = append(pars, endDate)
+	}
+	if lenCompanyStatusList > 0 {
+		sql1 += ` AND d.overseas_status in (` + utils.GetOrmInReplace(lenCompanyStatusList) + ") "
+		pars = append(pars, companyStatusList)
+	}
+	sql1 += ` GROUP BY admin_id `
+
+	sql2 := fmt.Sprintf(`SELECT COUNT(DISTINCT aa.rs_calendar_id) AS num,bb.seller_id as admin_id,bb.seller_group_id as group_id,bb.seller_name AS admin_name FROM rs_calendar AS aa
+    INNER JOIN rs_report_record  AS bb ON aa.rs_calendar_id=bb.rs_calendar_id
+    INNER JOIN %s.english_company AS cc ON aa.company_id=cc.company_id
+		where aa.english_company= 1 AND aa.source = 0 AND cc.is_deleted=0  AND bb.rs_calendar_researcher_status=2 AND bb.researcher_id != 0 `, databaseName)
+
+	if startDate != "" {
+		sql2 += ` AND bb.start_date >= ?  `
+		pars = append(pars, startDate)
+	}
+	if endDate != "" {
+		sql2 += ` AND bb.end_date <= ?  `
+		pars = append(pars, endDate)
+	}
+	if lenCompanyStatusList > 0 {
+		sql2 += ` AND cc.overseas_status in (` + utils.GetOrmInReplace(lenCompanyStatusList) + ") "
+		pars = append(pars, companyStatusList)
+	}
+	sql2 += ` GROUP BY admin_id `
+
+	// 列表数据
+	sql := `SELECT m.*,SUM(m.num) AS num  FROM (` + sql1 + ` UNION ALL ` + sql2
+	sql += ` ) AS m  WHERE 1=1 `
+
+
+	sql += ` Group by admin_id `
+	_, err = o.Raw(sql, pars).QueryRows(&list)
+
+	return
+}

+ 4 - 1
models/statistic_report/report.go

@@ -62,7 +62,10 @@ func GetTryGroupCompanyReportRecordGroupList(date time.Time, productId int) (lis
 type IncrementalCompanyListReq struct {
 	PageSize     int `description:"每页数据条数"`
 	CurrentIndex int `description:"当前页页码,从1开始"`
-	SortParam    string `description:"排序字段参数,用来排序的字段, 枚举值:'viewTotal':总阅读次数 、 'viewTime':阅读时间 、 'roadShowTotal':累计路演次数 、'expireDay':到期时间 、 'createTime':创建时间 、 'formalTime': 转正时间 、 'freezeTime':冻结时间 、'lossTime':流失时间" 、'deadline':距离未完成的任务的截止日期的天数`
+	SortParam    string `description:"排序字段参数,用来排序的字段, 枚举值:'viewTotal':总阅读次数 、 
+'viewTime':阅读时间 、 'roadShowTotal':累计路演次数 、'expireDay':到期时间 、 'createTime':创建时间 、
+'formalTime': 转正时间 、 'freezeTime':冻结时间 、'lossTime':流失时间 、
+'deadline':距离未完成的任务的截止日期的天数、sellerName:所属销售、shareSellerName:分配销售、status:客户状态"`
 	SortType     string `description:"如何排序,是正序还是倒序,枚举值:asc 正序,desc 倒叙 "`
 	CompanyIds   string `description:"标签,多个标签用、隔开;长度255"`
 }

+ 8 - 0
models/system/sys_admin.go

@@ -512,6 +512,14 @@ func GetRaiAdmin() (items []*AdminItem, err error) {
 	return
 }
 
+// GetFiccEnterScoreAdmin 获取Ficc需要录分的研究员
+func GetFiccEnterScoreAdmin() (items []*AdminItem, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT   *  FROM admin WHERE group_name  IN('宏观组','建材组','有色组','能化组')  AND enabled = 1 `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
 // SyncRoleData 同步角色数据
 type SyncRoleData struct {
 	Source int `description:"来源: 1-CRM; 2-ETA"`

+ 24 - 0
models/user_record.go

@@ -106,3 +106,27 @@ func GetUserRecordRegisterByUserIdsMyfx(userIds string) (items []*UserRecordRegi
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
+
+// 根据手机号获取用户的openid
+func GeCygxtUserRecordListByMobile(bindAccount string) (items []*OpenIdList, err error) {
+	var sql string
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql = `SELECT
+			cr.open_id,
+			cr.cygx_user_id as  user_id 
+		FROM
+		  cygx_user_record  as cr 
+		WHERE 1= 1	AND cygx_bind_account IN (` + bindAccount + `)`
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+func GetWxOpenIdByMobileList(mobile string) (items []*OpenIdList, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ` SELECT
+				union_id,open_id,
+				cygx_user_id AS user_id
+				FROM cygx_user_record	WHERE	1 = 1	AND cygx_bind_account IN (` + mobile + `)`
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}

+ 10 - 0
models/wx_user.go

@@ -626,3 +626,13 @@ func GetCompanyFollowCount(companyId int) (count int, err error) {
 	err = o.Raw(sql, companyId).QueryRow(&count)
 	return
 }
+
+// 根据用户ID获取相关信息
+func GetWxUserItemByUserId(userId int) (item *WxUserItem, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT a.*,b.company_name FROM wx_user AS a
+			LEFT JOIN company AS b on a.company_id=b.company_id
+			WHERE a.user_id=? `
+	err = o.Raw(sql, userId).QueryRow(&item)
+	return
+}

+ 140 - 0
models/yb_research_signup_statistics.go

@@ -0,0 +1,140 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// YbResearchSignupStatistics 调研报名统计结构体
+type YbResearchSignupStatistics struct {
+	YbResearchSignupStatisticsId int       // 主键ID
+	UserId                       int       // 分享人ID
+	RealName                     string    // 分享人姓名
+	Mobile                       string    // 分享人手机号
+	CompanyName                  string    // 公司名称
+	BannerId                     int       // 活动ID
+	CreateTime                   time.Time // 创建时间
+	Amount                       float64   // 付款金额
+	CustomName                   string    // 报名人姓名
+	CustomMobile                 string    // 报名人手机号
+	CustomCompanyName            string    // 报名人公司名称
+}
+
+type YbResearchSignupStatisticsListItem struct {
+	YbResearchSignupStatisticsId int     // 主键ID
+	BannerId                     int     // 活动ID
+	Amount                       float64 // 付款金额
+	Count                        int     // 报名人数
+	Remark                       string  // 备注-活动名称
+	StartDate                    string  // 活动开始时间
+	EndDate                      string  // 活动结束时间
+	Enable                       int     // 1:有效,0:禁用
+}
+
+func GetYbResearchSignupStatisticsItems() (items []*YbResearchSignupStatisticsListItem, err error) {
+	sql := ` SELECT
+	a.*,
+	b.start_date,
+	b.end_date,
+	b.remark,
+	b.enable,
+	COUNT( 1 ) AS count 
+FROM
+	yb_research_signup_statistics AS a
+	INNER JOIN banner AS b ON a.banner_id = b.id 
+WHERE
+	1 = 1 
+GROUP BY
+	a.banner_id 
+ORDER BY
+	start_date DESC `
+	o := orm.NewOrm()
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+type YbResearchSignupStatisticsResp struct {
+	OngoingList []*YbResearchSignupStatisticsListItem
+	OverList    []*YbResearchSignupStatisticsListItem
+}
+
+type YbResearchSignupStatisticsItem struct {
+	YbResearchSignupStatisticsId int     // 主键ID
+	UserId                       int     // 分享人ID
+	RealName                     string  // 分享人姓名
+	Mobile                       string  // 分享人手机号
+	CompanyName                  string  // 公司名称
+	BannerId                     int     // 活动ID
+	CreateTime                   string  // 创建时间
+	Amount                       float64 // 付款金额
+	CustomName                   string  // 报名人姓名
+	CustomMobile                 string  // 报名人手机号
+	CustomCompanyName            string  // 报名人公司名称
+	Count                        int     // 报名人数
+	Enable                       int     // 1:有效,0:禁用
+}
+
+type YbResearchSignupStatisticsItemsResp struct {
+	List     []*YbResearchSignupStatisticsItem
+	Total    int
+	HasPayed PayItem
+	NoPay    PayItem
+}
+type PayItem struct {
+	Name       string
+	Count      int
+	Amount     float64
+	Percentage int
+}
+
+func GetYbResearchSignupStatisticsItemsById(bannerId int) (items []*YbResearchSignupStatisticsItem, err error) {
+	sql := ` SELECT
+	*,count(1) as count
+FROM
+	yb_research_signup_statistics 
+WHERE
+	1 = 1 and banner_id = ?
+GROUP BY
+	mobile 
+ORDER BY
+	count DESC `
+	o := orm.NewOrm()
+	_, err = o.Raw(sql, bannerId).QueryRows(&items)
+	return
+}
+
+func GetYbResearchSignupStatisticsItemsByMobile(mobile string, bannerId int) (items []*YbResearchSignupStatisticsItem, err error) {
+	sql := `SELECT
+	a.*,b.enable
+FROM
+	yb_research_signup_statistics AS a
+	INNER JOIN banner AS b ON a.banner_id = b.id 
+WHERE
+	1 = 1 AND mobile = ? and banner_id = ? 
+ORDER BY
+	create_time DESC `
+	o := orm.NewOrm()
+	_, err = o.Raw(sql, mobile, bannerId).QueryRows(&items)
+	return
+}
+
+// UpdateYbResearchSignupStatistics 更新付款金额
+func UpdateYbResearchSignupStatisticsAmountById(amount float64, id int) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE yb_research_signup_statistics SET amount=? WHERE yb_research_signup_statistics_id=?`
+	_, err = o.Raw(sql, amount, id).Exec()
+	return
+}
+
+func GetYbResearchSignupStatisticsAmount(bannerId int) (items []*YbResearchSignupStatisticsListItem, err error) {
+	sql := ` SELECT
+	a.*
+FROM
+	yb_research_signup_statistics AS a
+	INNER JOIN banner AS b ON a.banner_id = b.id 
+WHERE
+	1 = 1 AND a.banner_id = ? `
+	o := orm.NewOrm()
+	_, err = o.Raw(sql, bannerId).QueryRows(&items)
+	return
+}

+ 252 - 0
routers/commentsRouter.go

@@ -1456,6 +1456,69 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:EnterScoreController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:EnterScoreController"],
+        beego.ControllerComments{
+            Method: "CompanySearchList",
+            Router: `/enterScore/company/searchlist`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:EnterScoreController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:EnterScoreController"],
+        beego.ControllerComments{
+            Method: "EnterScoreDelete",
+            Router: `/enterScore/delete`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:EnterScoreController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:EnterScoreController"],
+        beego.ControllerComments{
+            Method: "EnterScoreDetail",
+            Router: `/enterScore/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:EnterScoreController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:EnterScoreController"],
+        beego.ControllerComments{
+            Method: "EnterScoreList",
+            Router: `/enterScore/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:EnterScoreController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:EnterScoreController"],
+        beego.ControllerComments{
+            Method: "EnterScoreRankingOverview",
+            Router: `/enterScore/rankingOverview`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:EnterScoreController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:EnterScoreController"],
+        beego.ControllerComments{
+            Method: "EnterScoreScoreOverview",
+            Router: `/enterScore/scoreOverview`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:EnterScoreController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:EnterScoreController"],
+        beego.ControllerComments{
+            Method: "EnterScoreUpdate",
+            Router: `/enterScore/update`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:IndustrialAnalystController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:IndustrialAnalystController"],
         beego.ControllerComments{
             Method: "IndustrialAnalystAdd",
@@ -2095,6 +2158,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:OrderController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:OrderController"],
+        beego.ControllerComments{
+            Method: "OrderList",
+            Router: `/order/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:OrderController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:OrderController"],
+        beego.ControllerComments{
+            Method: "OrderRefundList",
+            Router: `/order/refund/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ProductInteriorController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ProductInteriorController"],
         beego.ControllerComments{
             Method: "PvExport",
@@ -2878,6 +2959,33 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserAdminShareHistoryController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserAdminShareHistoryController"],
+        beego.ControllerComments{
+            Method: "OrderList",
+            Router: `/mfyx/admin/share/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserController"],
+        beego.ControllerComments{
+            Method: "OrderRefund",
+            Router: `/order/refund`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserController"],
+        beego.ControllerComments{
+            Method: "OrderRefundRevoke",
+            Router: `/order/refund_revoke`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserController"],
         beego.ControllerComments{
             Method: "Add",
@@ -3067,6 +3175,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:YanxuanSpecialController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:YanxuanSpecialController"],
+        beego.ControllerComments{
+            Method: "AuthorSearch",
+            Router: `/yanxuan_special/author/search`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:YanxuanSpecialController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:YanxuanSpecialController"],
+        beego.ControllerComments{
+            Method: "AuthorUpdate",
+            Router: `/yanxuan_special/author/update`,
+            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: "Enable",
@@ -6838,6 +6964,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/eta_business:EtaBusinessController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/eta_business:EtaBusinessController"],
+        beego.ControllerComments{
+            Method: "EditSign",
+            Router: `/edit_sign`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/eta_business:EtaBusinessController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/eta_business:EtaBusinessController"],
         beego.ControllerComments{
             Method: "Enable",
@@ -6874,6 +7009,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/eta_business:EtaBusinessController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/eta_business:EtaBusinessController"],
+        beego.ControllerComments{
+            Method: "RemoveSign",
+            Router: `/remove_sign`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/eta_business:EtaBusinessController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/eta_business:EtaBusinessController"],
         beego.ControllerComments{
             Method: "Signing",
@@ -7387,6 +7531,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "OverseasCalendarList",
+            Router: `/overseas/calendar/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"],
         beego.ControllerComments{
             Method: "OverseasCustomReportCalendarList",
@@ -7396,6 +7549,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "OverseasResearcherReportList",
+            Router: `/overseas_custom/researcher/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"],
+        beego.ControllerComments{
+            Method: "OverseasSellerReportList",
+            Router: `/overseas_custom/seller/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"],
         beego.ControllerComments{
             Method: "OverseasCustomCalendarAdminList",
@@ -8809,6 +8980,42 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:BannerController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:BannerController"],
+        beego.ControllerComments{
+            Method: "Amount",
+            Router: `/research_statistics/amount`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:BannerController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:BannerController"],
+        beego.ControllerComments{
+            Method: "StatisticsDetail",
+            Router: `/research_statistics/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:BannerController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:BannerController"],
+        beego.ControllerComments{
+            Method: "StatisticsItem",
+            Router: `/research_statistics/item`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:BannerController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:BannerController"],
+        beego.ControllerComments{
+            Method: "StatisticsList",
+            Router: `/research_statistics/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:BannerController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:BannerController"],
         beego.ControllerComments{
             Method: "BannerStatistic",
@@ -8827,6 +9034,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:ClassifyController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:ClassifyController"],
+        beego.ControllerComments{
+            Method: "Edit",
+            Router: `/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:ClassifyController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:ClassifyController"],
         beego.ControllerComments{
             Method: "ListClassify",
@@ -9655,6 +9871,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: "ShareCheckList2",
+            Router: `/seller/check/Sharelist2`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanySellerController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanySellerController"],
         beego.ControllerComments{
             Method: "CheckList",
@@ -10411,6 +10636,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:ReportChapterTypeController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:ReportChapterTypeController"],
+        beego.ControllerComments{
+            Method: "Edit",
+            Router: `/chapter_type/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:ReportChapterTypeController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:ReportChapterTypeController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/chapter_type/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:ReportController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:ReportController"],
         beego.ControllerComments{
             Method: "GetDayWeekReportChapterTypeList",
@@ -11158,6 +11401,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:SysUserAuthController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:SysUserAuthController"],
+        beego.ControllerComments{
+            Method: "GetEtaForumAdminAuthCode",
+            Router: `/forum_admin/auth_code`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:SysUserAuthController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:SysUserAuthController"],
         beego.ControllerComments{
             Method: "GetEtaAuthCode",

+ 4 - 0
routers/router.go

@@ -63,6 +63,7 @@ func init() {
 			web.NSInclude(
 				&controllers.ReportController{},
 				&controllers.ReportUploadCommonController{},
+				&controllers.ReportChapterTypeController{},
 			),
 		),
 		web.NSNamespace("/statistic_report",
@@ -158,6 +159,9 @@ func init() {
 				&cygx.ContractAllocationController{},
 				&cygx.QuestionnaireController{},
 				&cygx.AskserieVideoController{},
+				&cygx.UserAdminShareHistoryController{},
+				&cygx.EnterScoreController{},
+				&cygx.OrderController{},
 			),
 		),
 		web.NSNamespace("/advisory",

+ 184 - 0
services/classify.go

@@ -0,0 +1,184 @@
+package services
+
+import (
+	"encoding/json"
+	"fmt"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/utils"
+	"io/ioutil"
+	"net/http"
+	"strings"
+)
+
+type GetClassifyListReq struct {
+	Keyword     string
+	CompanyType string
+	HideDayWeek int
+}
+
+type ClassifySetEnabledReq struct {
+	ClassifyId int `description:"分类ID"`
+	Enabled    int `description:"是否可用,1可用,0禁用"`
+}
+
+type EditClassifyReq struct {
+	ClassifyId int `description:"分类ID"`
+	/*Abstract          string                 `description:"栏目简介"`
+	Descript          string                 `description:"分享描述"`
+	ReportAuthor      string                 `description:"栏目作者"`
+	AuthorDescript    string                 `description:"作者简介"`
+	ColumnImgUrl      string                 `description:"栏目配图"`
+	ReportImgUrl      string                 `description:"报告配图"`
+	HeadImgUrl        string                 `description:"头部banner"`
+	AvatarImgUrl      string                 `description:"头像"`
+	HomeImgUrl        string                 `description:"首页配图"`*/
+	ClassifyLabel string `description:"分类标签"`
+	ShowType      int    `description:"展示类型:1-列表 2-专栏"`
+	/*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-是"`
+}
+
+// ClassifyMenuSaveReq 保存分类子目录请求体
+type ClassifyMenuSaveReq struct {
+	MenuId   int    `description:"子目录ID, 0为新增, 大于0为编辑"`
+	MenuName string `description:"子目录名称"`
+}
+
+type CrmEtaBaseResp struct {
+	Code   int    `json:"code" description:"状态码"`
+	Msg    string `json:"msg" description:"提示信息"`
+	ErrMsg string `json:"-" description:"错误信息,不用返回给前端,只是做日志记录"`
+}
+
+func crmEtaPost(url string, param interface{}) (respBody []byte, err error) {
+	data, e := json.Marshal(param)
+	if e != nil {
+		err = fmt.Errorf("data json marshal err: %s", e.Error())
+		return
+	}
+
+	body := ioutil.NopCloser(strings.NewReader(string(data)))
+	client := &http.Client{}
+	req, e := http.NewRequest("POST", url, body)
+	if e != nil {
+		err = fmt.Errorf("http create request err: %s", e.Error())
+		return
+	}
+
+	contentType := "application/json;charset=utf-8"
+	req.Header.Set("Content-Type", contentType)
+	req.Header.Set("Authorization", utils.CrmEtaAuthorization)
+	resp, e := client.Do(req)
+	if e != nil {
+		err = fmt.Errorf("http client do err: %s", e.Error())
+		return
+	}
+	defer func() {
+		_ = resp.Body.Close()
+	}()
+	b, e := ioutil.ReadAll(resp.Body)
+	if e != nil {
+		err = fmt.Errorf("resp body read err: %s", e.Error())
+		return
+	}
+	if len(b) == 0 {
+		err = fmt.Errorf("resp body is empty")
+		return
+	}
+	// 生产环境解密, 注意有个坑前后的双引号
+	if utils.RunMode == "release" {
+		str := string(b)
+		str = strings.Trim(str, `"`)
+		b = utils.DesBase64Decrypt([]byte(str))
+	}
+
+	respBody = b
+	return
+}
+
+func EditReportClassify(pars *EditClassifyReq) (err error, errMsg string) {
+	if utils.CrmEtaServerUrl == "" {
+		return
+	}
+	url := fmt.Sprint(utils.CrmEtaServerUrl, "/api/eta/classify/edit")
+	b, err := crmEtaPost(url, pars)
+	if err != nil {
+		errMsg = "更新品种失败"
+		err = fmt.Errorf("url:%s err: %s", url, err.Error())
+		return
+	}
+	result := new(CrmEtaBaseResp)
+	if e := json.Unmarshal(b, &result); e != nil {
+		errMsg = "更新分类失败"
+		err = fmt.Errorf("result unmarshal err: %s\nresult: %s", e.Error(), string(b))
+		return
+	}
+	utils.FileLog.Info("%s", string(b))
+	if result.Code != 200 {
+		err = fmt.Errorf("result: %s, err: %s", string(b), result.ErrMsg)
+		errMsg = result.Msg
+		return
+	}
+	return
+}
+
+type EditClassifyPermissionReq struct {
+	Keyword               string
+	ChartPermissionIdList []int `description:"权限id数组"`
+	NewKeyword            string
+}
+
+// GetClassifyList 获取报告分类已绑定的权限
+func GetClassifyList(req *GetClassifyListReq) (list models.ClassifyListResp, err error) {
+	if utils.CrmEtaServerUrl == "" {
+		return
+	}
+	url := fmt.Sprint(utils.CrmEtaServerUrl, "/api/eta/classify/list")
+	b, err := crmEtaPost(url, req)
+	if err != nil {
+		err = fmt.Errorf("url:%s err: %s", url, err.Error())
+		return
+	}
+	//result := new(models.ResultData)
+	result := new(GetClassifyListResp)
+	if e := json.Unmarshal(b, &result); e != nil {
+		err = fmt.Errorf("result unmarshal err: %s\nresult: %s", e.Error(), string(b))
+		return
+	}
+	utils.FileLog.Info("%s", string(b))
+	if result.Code != 200 {
+		err = fmt.Errorf("result: %s", string(b))
+		return
+	}
+	list = result.Data
+	return
+}
+
+type ClassifyPermissionReq struct {
+	Keyword string
+}
+
+type ClassifyPermissionList struct {
+	List []*models.ChartPermissionSearchKeyWordMapping
+}
+
+type GetClassifyListResp struct {
+	Code   int                     `json:"code" description:"状态码"`
+	Msg    string                  `json:"msg" description:"提示信息"`
+	Data   models.ClassifyListResp `json:"data" description:"返回数据"`
+	ErrMsg string                  `json:"-" description:"错误信息,不用返回给前端,只是做日志记录"`
+}

+ 31 - 19
services/company.go

@@ -820,7 +820,7 @@ func CheckAdminIsSeller(roleTypeCode string) (isSeller bool) {
 //}
 //
 
-func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupIdS string, itemGroupId, sysUserGroupId, itemSellerId, sysUserId, authority, productId, shareSellerId int) (button company.ButtonPermission) {
+func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupIdS string, itemGroupId, sysUserGroupId, itemSellerId, sysUserId, authority, productId, shareSellerId int, shareSellerIds string) (button company.ButtonPermission) {
 	//产品状态map
 	productStatusMap := make(map[int]string)
 	if productId == 1 {
@@ -860,6 +860,8 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 		groupIdMap[2], _ = strconv.Atoi(groupIdSlice[1])
 	}
 
+	shareSellerIdArr := strings.Split(shareSellerIds, ",")
+
 	if roleTypeCode == utils.ROLE_TYPE_CODE_ADMIN { //超级管理员
 		button.BtnView = true //查看详情权限
 		if !strings.Contains(status, "/") {
@@ -952,11 +954,15 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 				//button.BtnDelete = true
 				button.BtnModifySeller = true
 				button.BtnFreeze = false
+				// CRM14.7.2 权益管理员可以设置试用客户为共享
+				button.BtnShare = true
 			} else if productStatus == utils.COMPANY_STATUS_FREEZE { //冻结
 				button.BtnModifySeller = true
 			} else if productStatus == utils.COMPANY_STATUS_LOSE { //流失
 				//button.BtnDelete = true
 			} else { //永续
+				button.BtnModifySeller = true
+				button.BtnShare = true
 			}
 		} else {
 			productStatus2, hasProduct2 := productStatusMap[1]
@@ -982,7 +988,7 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 
 			//如果是自己客户,那么拥有查看权限
 			if hasSellerId {
-				if sellerId == sysUserId || shareSellerId == sysUserId {
+				if sellerId == sysUserId || utils.InArrayByStr(shareSellerIdArr, strconv.Itoa(sysUserId)) || shareSellerId == sysUserId {
 					button.BtnView = true                             //显示权限、详情
 					if productStatus == utils.COMPANY_STATUS_FORMAL { //正式
 						button.BtnUpdate = true       //服务更新
@@ -1040,7 +1046,7 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 					button.BtnRemarkView = true
 					//button.BtnThaw = false
 				} else if productStatus == utils.COMPANY_STATUS_LOSE { //流失
-					if sellerId == sysUserId || groupId == sysUserGroupId || shareSellerId == sysUserId {
+					if sellerId == sysUserId || groupId == sysUserGroupId || utils.InArrayByStr(shareSellerIdArr, strconv.Itoa(sysUserId)) || shareSellerId == sysUserId {
 						button.BtnApplyReceive = true
 					} else {
 						button.BtnReceive = true
@@ -1080,7 +1086,7 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 					button.BtnRemarkView = true
 					//button.BtnThaw = false
 				} else if productStatus == utils.COMPANY_STATUS_LOSE { //流失
-					if sellerId == sysUserId || groupId == sysUserGroupId || shareSellerId == sysUserId {
+					if sellerId == sysUserId || groupId == sysUserGroupId || utils.InArrayByStr(shareSellerIdArr, strconv.Itoa(sysUserId)) || shareSellerId == sysUserId {
 						button.BtnApplyReceive = true
 					} else {
 						button.BtnReceive = true
@@ -1140,13 +1146,13 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 
 			//如果是自己客户,那么拥有查看权限
 			if hasSellerId {
-				if sellerId == sysUserId {
+				if sellerId == sysUserId || utils.InArrayByStr(shareSellerIdArr, strconv.Itoa(sysUserId)) || shareSellerId == sysUserId {
 					button.BtnView = true                             //显示权限、详情
 					if productStatus == utils.COMPANY_STATUS_FORMAL { //正式
 						button.BtnUpdate = true
 						button.BtnTryOut = true
 						button.BtnModifySeller = true
-						button.BtnShare = true
+						//button.BtnShare = true
 						button.BtnRemarkEdit = true
 						button.BtnRemarkView = true
 					} else if productStatus == utils.COMPANY_STATUS_TRY_OUT { //试用
@@ -1159,6 +1165,7 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 						button.BtnFreeze = true
 						button.BtnRemarkEdit = true
 						button.BtnRemarkView = true
+						//button.BtnShare = true
 					} else if productStatus == utils.COMPANY_STATUS_FREEZE { //冻结
 						button.BtnThaw = true
 						button.BtnModifySeller = true
@@ -1166,8 +1173,8 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 						button.BtnRemarkView = true
 					} else if productStatus == utils.COMPANY_STATUS_LOSE { //流失
 						button.BtnApplyReceive = true
-					} else { //永续
-						//button.BtnDelete = true
+					} else if productStatus == utils.COMPANY_STATUS_FOREVER { //永续
+						button.BtnTurnPositive = true
 					}
 				} else {
 					if productStatus == utils.COMPANY_STATUS_LOSE { //流失
@@ -1187,16 +1194,17 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 				button.BtnView = true                             //查看详情权限
 				if productStatus == utils.COMPANY_STATUS_FORMAL { //正式
 					button.BtnModifySeller = true
-					button.BtnShare = true
+					//button.BtnShare = true
 					button.BtnRemarkView = true
 				} else if productStatus == utils.COMPANY_STATUS_TRY_OUT { //试用
 					button.BtnModifySeller = true
 					button.BtnRemarkView = true
+					//button.BtnShare = true
 				} else if productStatus == utils.COMPANY_STATUS_FREEZE { //冻结
 					button.BtnModifySeller = true
 					button.BtnRemarkView = true
 				} else if productStatus == utils.COMPANY_STATUS_LOSE { //流失
-					if sellerId == sysUserId || groupId == sysUserGroupId {
+					if sellerId == sysUserId || groupId == sysUserGroupId || utils.InArrayByStr(shareSellerIdArr, strconv.Itoa(sysUserId)) || shareSellerId == sysUserId {
 						button.BtnApplyReceive = true
 					} else {
 						button.BtnReceive = true
@@ -2370,7 +2378,7 @@ func FilterReadAndContractAuth(chartPermissions, contractPermissions, condition
 	return
 }
 
-// GetShareCompanyPermissionButton 正式客户共享-权限按钮(目前仅FICC有正式客户共享, 所以不管权益角色)
+// GetShareCompanyPermissionButton 正式客户共享-权限按钮
 func GetShareCompanyPermissionButton(roleTypeCode, statuses string, productId int, item *company.CompanyItem, sysUser *system.Admin) (button *company.ButtonPermission) {
 	statusMap := make(map[int]string)
 	statusMap[productId] = statuses
@@ -2405,25 +2413,29 @@ func GetShareCompanyPermissionButton(roleTypeCode, statuses string, productId in
 	button.BtnView = true
 
 	// 超管, FICC管理员
-	if roleTypeCode == utils.ROLE_TYPE_CODE_ADMIN || roleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN {
+	if roleTypeCode == utils.ROLE_TYPE_CODE_ADMIN || roleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN || roleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN {
 		button.BtnModifySeller = true
 		button.BtnRemarkView = true
 		button.BtnServiceRecord = true
 	}
-	status, ok := statusMap[1]
-	if !ok {
-		return
+	if roleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
+		button.BtnModifySeller = false
 	}
+	status, _ := statusMap[1]
+	//if !ok {
+	//	return
+	//}
 	// 客户非关闭状态可见沟通记录按钮
 	if status != utils.COMPANY_STATUS_CLOSE {
 		button.BtnServiceRecord = true
 	}
 
-	// ficc销售
-	ficcArr := []string{
+	// 销售
+	sellerArr := []string{
 		utils.ROLE_TYPE_CODE_FICC_GROUP, utils.ROLE_TYPE_CODE_FICC_TEAM, utils.ROLE_TYPE_CODE_FICC_SELLER,
+		utils.ROLE_TYPE_CODE_RAI_GROUP, utils.ROLE_TYPE_CODE_RAI_SELLER, utils.ROLE_TYPE_CODE_RAI_ADMIN,
 	}
-	if !utils.InArrayByStr(ficcArr, roleTypeCode) {
+	if !utils.InArrayByStr(sellerArr, roleTypeCode) {
 		return
 	}
 	if status == utils.COMPANY_STATUS_TRY_OUT {
@@ -2440,7 +2452,7 @@ func GetShareCompanyPermissionButton(roleTypeCode, statuses string, productId in
 		button.BtnRemarkView = true
 		button.BtnServiceRecord = true
 	}
-	companyButton := GetCompanyPermissionButton(roleTypeCode, statuses, item.SellerIds, item.GroupIds, item.GroupId, sysUser.GroupId, item.SellerId, sysUser.AdminId, sysUser.Authority, item.ProductId, item.ShareSellerId)
+	companyButton := GetCompanyPermissionButton(roleTypeCode, statuses, item.SellerIds, item.GroupIds, item.GroupId, sysUser.GroupId, item.SellerId, sysUser.AdminId, sysUser.Authority, item.ProductId, -1, item.ShareSellerIds)
 	if companyButton.BtnShare == true {
 		button.BtnShare = true
 	}

+ 57 - 27
services/company_apply/company_approval.go

@@ -421,9 +421,9 @@ func Approved(approvalRecord *contract.ContractApprovalRecord, opUser *system.Ad
 				//客户研选行业转正时(王芳审批通过),模板消息提醒汪洋
 				services.AddCompanyApprovalMessageWangYang(recordInfo.CompanyId, recordInfo.CompanyContractId, recordInfo.ApplyRealName, companyInfo.CompanyName)
 				cygxService.YanXuanCompanyApproval(recordInfo.CompanyId, recordInfo.CompanyContractId) //研选审批通过的时候研选扣点更新
-				cygxService.HandleAllocationCompanyContractByYanXuan(recordInfo.CompanyContractId)     //如果合同只有研选的时候,自动处理派点
-				cygxService.HandleCompanyContractPackageDifference(recordInfo.CompanyContractId)       // 更新与上一份合同的金额的对比 '增加套餐','减少套餐','维持套餐'
-				cygxService.HandleCompanyContractPermissionContractType(recordInfo.CompanyContractId)  // 更新合同权限表中的权限名称,以及对应的行业权限类型(行业新签、行业续约)
+				//cygxService.HandleAllocationCompanyContractByYanXuan(recordInfo.CompanyContractId)     //如果合同只有研选的时候,自动处理派点
+				cygxService.HandleCompanyContractPackageDifference(recordInfo.CompanyContractId)      // 更新与上一份合同的金额的对比 '增加套餐','减少套餐','维持套餐'
+				cygxService.HandleCompanyContractPermissionContractType(recordInfo.CompanyContractId) // 更新合同权限表中的权限名称,以及对应的行业权限类型(行业新签、行业续约)
 			}
 		}()
 	} else {
@@ -630,7 +630,6 @@ func afterApproved(companyApprovalId int, opUserId int, opUserName string) (err
 		err = errors.New("获取信息客户产品失败2")
 		return
 	}
-
 	//recodeInfo.
 	logSellerId := recodeInfo.ApplyUserId
 	logSellerName := recodeInfo.ApplyRealName
@@ -669,40 +668,66 @@ func afterApproved(companyApprovalId int, opUserId int, opUserName string) (err
 		//	br.ErrMsg = "产品中合同结束时间转换失败,Err:" + err.Error()
 		//	return
 		//}
-		//如果合同时间小于等于今天,那么立马执行合同内容
-		if time.Now().After(contractStartDate) {
+		//如果是权益的用户客户转正审批单独走
+		if companyProduct.Status == utils.COMPANY_STATUS_FOREVER && companyProduct.ProductId == 2 {
+			//contractInfo.StartDate = contractStartDate.AddDate(0, 4, 0).Format(utils.FormatDate) // 开始时间与结束时间都加三个月
+			//contractInfo.EndDate = contractEndDate.AddDate(0, 4, 0).Format(utils.FormatDate)
 			startDate = contractInfo.StartDate
 			endDate = contractInfo.EndDate
-			companyReportPermissionList, tmpErr = company.TryOutToFormal(recodeInfo.CompanyId, recodeInfo.ProductId, opUser.AdminId, recodeInfo.CompanyApprovalId, contractInfo.CompanyContractId, contractInfo.StartDate, contractInfo.EndDate, opUser.RealName, companyProduct.ProductName, contractInfo.PackageType, contractInfo.RaiPackageType)
+			companyReportPermissionList, tmpErr = company.TryOutToFormalXClassRai(recodeInfo.CompanyId, recodeInfo.ProductId, opUser.AdminId, recodeInfo.CompanyApprovalId, contractInfo.CompanyContractId, contractInfo.StartDate, contractInfo.EndDate, opUser.RealName, companyProduct.ProductName, contractInfo.RaiPackageType)
 			if tmpErr != nil {
 				err = errors.New("试用转正式失败,Err:" + tmpErr.Error())
 				return
 			}
 		} else {
-			tmpErr = company.ApplyApproveContract(recodeInfo.CompanyId, recodeInfo.ProductId, recodeInfo.CompanyApprovalId, contractInfo.CompanyContractId)
-			if tmpErr != nil {
-				err = errors.New("试用转正式失败,Err:" + tmpErr.Error())
-				return
+			//如果合同时间小于等于今天,那么立马执行合同内容
+			if time.Now().After(contractStartDate) {
+				startDate = contractInfo.StartDate
+				endDate = contractInfo.EndDate
+				companyReportPermissionList, tmpErr = company.TryOutToFormal(recodeInfo.CompanyId, recodeInfo.ProductId, opUser.AdminId, recodeInfo.CompanyApprovalId, contractInfo.CompanyContractId, contractInfo.StartDate, contractInfo.EndDate, opUser.RealName, companyProduct.ProductName, contractInfo.PackageType, contractInfo.RaiPackageType)
+				if tmpErr != nil {
+					err = errors.New("试用转正式失败,Err:" + tmpErr.Error())
+					return
+				}
+			} else {
+				tmpErr = company.ApplyApproveContract(recodeInfo.CompanyId, recodeInfo.ProductId, recodeInfo.CompanyApprovalId, contractInfo.CompanyContractId)
+				if tmpErr != nil {
+					err = errors.New("试用转正式失败,Err:" + tmpErr.Error())
+					return
+				}
+				//不添加日志
+				isAddCompanyProductUpdateLog = false
+			}
+			//如果合同中的结束日期大于产品中的合同结束日期,那么就去修改产品中的合同结束日期
+			if contractEndDate.After(companyProduct.ContractEndDate) {
+				companyProduct.ContractEndDate = contractEndDate
+				cols := make([]string, 0)
+				cols = append(cols, "ContractEndDate")
+				_ = companyProduct.Update(cols)
 			}
-			//不添加日志
-			isAddCompanyProductUpdateLog = false
-		}
-		//如果合同中的结束日期大于产品中的合同结束日期,那么就去修改产品中的合同结束日期
-		if contractEndDate.After(companyProduct.ContractEndDate) {
-			companyProduct.ContractEndDate = contractEndDate
-			cols := make([]string, 0)
-			cols = append(cols, "ContractEndDate")
-			_ = companyProduct.Update(cols)
 		}
 	case 2: //冻结->试用
-		tmpCompanyReportPermissionList, tmpStartDate, tmpEndDate, tmpErr := company.FreezeToTryOut(recodeInfo.CompanyId, recodeInfo.ProductId, opUser.AdminId, recodeInfo.CompanyApprovalId, recodeInfo.ApplyUserId, opUser.RealName, companyProduct.ProductName)
-		if tmpErr != nil {
-			err = errors.New("冻结转试用失败,Err:" + tmpErr.Error())
-			return
+		//权益的 x类试用转冻结的申请解冻
+		if companyProduct.InitStatus == utils.COMPANY_STATUS_FOREVER && companyProduct.ProductId == utils.COMPANY_PRODUCT_RAI_ID {
+			tmpCompanyReportPermissionList, tmpStartDate, tmpEndDate, tmpErr := company.FreezeToTryOutXClassRai(recodeInfo.CompanyId, recodeInfo.ProductId, opUser.AdminId, recodeInfo.CompanyApprovalId, recodeInfo.ApplyUserId, opUser.RealName, companyProduct.ProductName)
+			if tmpErr != nil {
+				err = errors.New("冻结转试用失败,Err:" + tmpErr.Error())
+				return
+			}
+			companyReportPermissionList = tmpCompanyReportPermissionList
+			startDate = tmpStartDate
+			endDate = tmpEndDate
+		} else {
+			tmpCompanyReportPermissionList, tmpStartDate, tmpEndDate, tmpErr := company.FreezeToTryOut(recodeInfo.CompanyId, recodeInfo.ProductId, opUser.AdminId, recodeInfo.CompanyApprovalId, recodeInfo.ApplyUserId, opUser.RealName, companyProduct.ProductName)
+			if tmpErr != nil {
+				err = errors.New("冻结转试用失败,Err:" + tmpErr.Error())
+				return
+			}
+			companyReportPermissionList = tmpCompanyReportPermissionList
+			startDate = tmpStartDate
+			endDate = tmpEndDate
 		}
-		companyReportPermissionList = tmpCompanyReportPermissionList
-		startDate = tmpStartDate
-		endDate = tmpEndDate
+
 	case 3: //试用延期
 		tmpCompanyReportPermissionList, tmpEndDate, tmpErr := company.TryOutDelay(recodeInfo.CompanyId, recodeInfo.ProductId, opUser.AdminId, recodeInfo.CompanyApprovalId, opUser.RealName, companyProduct.EndDate, companyProduct.ProductName)
 		if tmpErr != nil {
@@ -830,7 +855,12 @@ func afterApproved(companyApprovalId int, opUserId int, opUserName string) (err
 		remark := "审批"
 		operation := "approve"
 		approveContent := "审批通过"
+		if 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
 
+		}
 		services.AddCompanyOperationRecord(recodeInfo.CompanyId, companyProduct.SellerId, opUserId, recodeInfo.ProductId, opUserId, companyProduct.CompanyName,
 			companyProduct.ProductName, opUserName, remark, operation, approveContent, opUserName, "", companyProduct.Status)
 	}

+ 18 - 0
services/company_approval_message.go

@@ -215,6 +215,22 @@ func AddCompanyApprovalMessageRai(companyId, companyContractId int, applyRealNam
 		return
 	}
 	go SendWxMsgWithRaiSell(first, keyword1, keyword2, keyword3, keyword4, openIdList)
+
+	list, e := company.GetCompanyContractPermissionByCompanyContractId(companyContractId)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCompanyContractPermissionByCompanyContractId, Err: " + e.Error())
+		return
+	}
+
+	if len(list) == 0 {
+		return
+	}
+
+	for _, v := range list {
+		if v.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN || v.ChartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID {
+			go SendWxCategoryMsgWithRaiSell(companyName, "销售:"+applyRealName, "已签约研选", time.Now().Format(utils.FormatDateTimeMinute2), openIdList)
+		}
+	}
 	return
 }
 
@@ -267,6 +283,7 @@ func AddCompanyApprovalMessageWangYang(companyId, companyContractId int, applyRe
 		keyword2 = time.Now().Format(utils.FormatDateTime)
 		keyword3 = "签约【研选订阅】"
 		go SendWxMsgWithRaiWangYang(keyword1, keyword2, keyword3, keyword4, openIdList)
+		go SendWxCategoryMsgWithRaiWangYang(companyName, "销售:"+applyRealName, keyword3, time.Now().Format(utils.FormatDateTimeMinute2), openIdList)
 	}
 
 	if points > 0 {
@@ -274,6 +291,7 @@ func AddCompanyApprovalMessageWangYang(companyId, companyContractId int, applyRe
 		keyword2 = time.Now().Format(utils.FormatDateTime)
 		keyword3 = "签约【研选扣点包(" + fmt.Sprint(points) + "个点)】"
 		go SendWxMsgWithRaiWangYang(keyword1, keyword2, keyword3, keyword4, openIdList)
+		go SendWxCategoryMsgWithRaiWangYang(companyName, "销售:"+applyRealName, keyword3, time.Now().Format(utils.FormatDateTimeMinute2), openIdList)
 	}
 
 	return

+ 41 - 0
services/company_permission.go

@@ -378,3 +378,44 @@ func GetPermissionNameMap() (mapItem map[int]string, err error) {
 	mapItem = mapPermissionName
 	return
 }
+
+func GetBasePermissionLookItem(productId int) (allPermissions []*company.PermissionLookItem, permissionMap map[int][]*company.PermissionLookItem, err error) {
+	//子权限切片集合
+	allPermissions, err = company.GetPermissionLookItemsByProductId(productId)
+	if err != nil {
+		err = fmt.Errorf("获取权限失败,Err:%s", err.Error())
+		return
+	}
+	permissionMap = make(map[int][]*company.PermissionLookItem, 0)
+	for _, v := range allPermissions {
+		if v.ParentId > 0 {
+			permissionMap[v.ParentId] = append(permissionMap[v.ParentId], v)
+		}
+	}
+	return
+}
+
+func GetBaseFiccPermissionSetItem() (allPermissions []*company.PermissionSetItem, permissionMap map[int][]*company.PermissionSetItem, err error) {
+	//子权限切片集合
+	allPermissions, err = company.GetPermissionByProductId(utils.COMPANY_PRODUCT_FICC_ID)
+	if err != nil {
+		err = fmt.Errorf("获取权限失败,Err:%s", err.Error())
+		return
+	}
+	permissionMap = make(map[int][]*company.PermissionSetItem, 0)
+	for _, v := range allPermissions {
+		if v.ParentId > 0 {
+			permissionMap[v.ParentId] = append(permissionMap[v.ParentId], v)
+		}
+	}
+	return
+}
+
+func GetPermissionFirstArr(productId int) (list []*models.ChartPermission, err error) {
+	if productId == 0 {
+		list, err = models.GetPermissionFirst()
+	} else {
+		list, err = models.GetPermissionFirstByProductId(productId)
+	}
+	return
+}

+ 51 - 51
services/contract/contract.go

@@ -1167,52 +1167,41 @@ func GetPermissionByContractService(productId int, serviceList []*contract.Contr
 // GetPermissionByPermissionIdMap 通过权限id的map,获取权限列表
 func GetPermissionByPermissionIdMap(productId int, checkPermissionIdMap map[int]int) (permissionList []*company.PermissionLookList, err error) {
 	//子权限切片集合
-	var permissionClassifyArr []string
-	if productId == 1 {
-		for _, v := range utils.PermissionFiccClassifyArr {
-			permissionClassifyArr = append(permissionClassifyArr, v)
+	allPermissions, err := company.GetPermissionLookItemsByProductId(productId)
+	if err != nil {
+		err = fmt.Errorf("获取权限失败,Err:%s", err.Error())
+		return
+	}
+	permissionMap := make(map[int][]*company.PermissionLookItem, 0)
+	for _, v := range allPermissions {
+		if v.ParentId > 0 {
+			permissionMap[v.ParentId] = append(permissionMap[v.ParentId], v)
 		}
-	} else {
-		permissionClassifyArr = append(permissionClassifyArr, "权益")
 	}
-
 	//遍历获取
-	for _, v := range permissionClassifyArr {
-		checkList := make([]int, 0)
-		plist := new(company.PermissionLookList)
-		items, tmpErr := company.GetPermissionLookItems(productId, v)
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-		for _, n := range items {
-			if _, ok := checkPermissionIdMap[n.ChartPermissionId]; ok {
-				checkList = append(checkList, n.ChartPermissionId)
-			} else if _, ok2 := checkPermissionIdMap[n.ChartPermissionId+utils.PERMISSION_ID_UPGRADE]; ok2 {
-				checkList = append(checkList, n.ChartPermissionId)
-				n.IsUpgrade = 1
+	for _, v := range allPermissions {
+		if v.ParentId == 0 {
+			checkList := make([]int, 0)
+			plist := new(company.PermissionLookList)
+			plist.Items = make([]*company.PermissionLookItem, 0)
+			items, ok1 := permissionMap[v.ChartPermissionId]
+			if ok1 {
+				for _, n := range items {
+					if _, ok := checkPermissionIdMap[n.ChartPermissionId]; ok {
+						checkList = append(checkList, n.ChartPermissionId)
+					} else if _, ok2 := checkPermissionIdMap[n.ChartPermissionId+utils.PERMISSION_ID_UPGRADE]; ok2 {
+						checkList = append(checkList, n.ChartPermissionId)
+						n.IsUpgrade = 1
+					}
+				}
+				plist.Items = items
 			}
+			plist.ClassifyName = v.PermissionName
+			plist.CheckList = checkList
+
+			permissionList = append(permissionList, plist)
 		}
-		//sandoPermissionIdMap := make(map[string]int)
-		////权益客户下,主观客观同时选择,进行合并
-		//for _, n := range items {
-		//	if _, ok := checkPermissionIdMap[n.ChartPermissionId]; ok {
-		//		if sandoPermissionIdMap[n.PermissionName] == 0 {
-		//			checkList = append(checkList, n.ChartPermissionId)
-		//		}
-		//		sandoPermissionIdMap[n.PermissionName] += 1
-		//	}
-		//}
-		//for i, n := range items {
-		//	if sandoPermissionIdMap[n.PermissionName] == 1 {
-		//		items[i].PermissionName = n.Remark
-		//	}
-		//}
-		plist.Items = items
-		plist.ClassifyName = v
-		plist.CheckList = checkList
 
-		permissionList = append(permissionList, plist)
 	}
 	return
 }
@@ -1235,18 +1224,29 @@ func GetServicePermissionMap(serviceList []*contract.ContractServiceAndDetail) (
 		}
 		switch contractService.ServiceTemplateId {
 		case 1: //ficc 大套餐
-			for _, v := range utils.PermissionFiccClassifyArr {
-				//大套餐中 市场策略暂时不作为勾选项
-				if v == "市场策略" {
-					continue
-				}
-				items, tmpErr := company.GetPermissionLookItems(1, v)
-				if tmpErr != nil {
-					err = tmpErr
-					return
+			allFiccPermissions, e := company.GetPermissionLookItemsByProductId(utils.COMPANY_PRODUCT_FICC_ID)
+			if e != nil {
+				err = fmt.Errorf("获取权限失败 Err:%v", e)
+				return
+			}
+			permissionMap := make(map[int][]*company.PermissionLookItem, 0)
+			for _, v := range allFiccPermissions {
+				if v.ParentId > 0 {
+					permissionMap[v.ParentId] = append(permissionMap[v.ParentId], v)
 				}
-				for _, n := range items {
-					checkPermissionIdMap[n.ChartPermissionId] = n.ChartPermissionId
+			}
+			for _, v := range allFiccPermissions {
+				if v.ParentId == 0 {
+					//合同这边市场策略不需要体现出来,所以调整返回
+					if v.PermissionName == "市场策略" {
+						continue
+					}
+					items, ok := permissionMap[v.ChartPermissionId]
+					if ok {
+						for _, n := range items {
+							checkPermissionIdMap[n.ChartPermissionId] = n.ChartPermissionId
+						}
+					}
 				}
 			}
 		case 2: //ficc小套餐

+ 77 - 0
services/crm_eta.go

@@ -3,6 +3,7 @@ package services
 import (
 	"encoding/json"
 	"fmt"
+	"hongze/hz_crm_api/services/alarm_msg"
 	"hongze/hz_crm_api/utils"
 	"io/ioutil"
 	"net/http"
@@ -178,3 +179,79 @@ func CodeLoginFromMiddleServer(authCode string) (tokenResp GetEtaTokenData, err
 	tokenResp = result.Data
 	return
 }
+
+// EtaTrialManualUserAddAuthReq 体验版用户添加手工权限
+type EtaTrialManualUserAddAuthReq struct {
+	AdminId   int    `json:"admin_id" description:"用户ID"`
+	AdminName string `json:"admin_name" description:"用户名"`
+}
+
+// EtaTrialManualUserAddAuth CRM_ETA服务-体验版用户添加手工权限
+func EtaTrialManualUserAddAuth(adminId int, adminName string) (err error) {
+	// 体验版无测试环境
+	//if utils.RunMode != "release" {
+	//	return
+	//}
+	defer func() {
+		if err != nil {
+			alarm_msg.SendAlarmMsg(fmt.Sprintf("EtaTrialManualUserAddAuth, 新增试用客户手工录入权限失败, ErrMsg: %s", err.Error()), 3)
+		}
+	}()
+
+	url := fmt.Sprint(utils.CrmEtaServerUrl, "/api/eta_trial/manual_user/add_auth")
+	param := EtaTrialManualUserAddAuthReq{
+		AdminId:   adminId,
+		AdminName: adminName,
+	}
+	data, e := json.Marshal(param)
+	if e != nil {
+		err = fmt.Errorf("data json marshal err: %s", e.Error())
+		return
+	}
+
+	body := ioutil.NopCloser(strings.NewReader(string(data)))
+	client := &http.Client{}
+	req, e := http.NewRequest("POST", url, body)
+	if e != nil {
+		err = fmt.Errorf("http create request err: %s", e.Error())
+		return
+	}
+
+	contentType := "application/json;charset=utf-8"
+	req.Header.Set("Content-Type", contentType)
+	req.Header.Set("Authorization", utils.CrmEtaAuthorization)
+	resp, e := client.Do(req)
+	if e != nil {
+		err = fmt.Errorf("http client do err: %s", e.Error())
+		return
+	}
+	defer func() {
+		_ = resp.Body.Close()
+	}()
+	b, e := ioutil.ReadAll(resp.Body)
+	if e != nil {
+		err = fmt.Errorf("resp body read err: %s", e.Error())
+		return
+	}
+	if len(b) == 0 {
+		err = fmt.Errorf("resp body is empty")
+		return
+	}
+	// 生产环境解密, 注意有个坑前后的双引号
+	if utils.RunMode == "release" {
+		str := string(b)
+		str = strings.Trim(str, `"`)
+		b = utils.DesBase64Decrypt([]byte(str))
+	}
+
+	result := new(MiddleServerResultData)
+	if e = json.Unmarshal(b, &result); e != nil {
+		err = fmt.Errorf("result unmarshal err: %s\nresult: %s", e.Error(), string(b))
+		return
+	}
+	if result.Code != 200 {
+		err = fmt.Errorf("result: %s", string(b))
+		return
+	}
+	return
+}

+ 35 - 1
services/cygx/acitvity.go

@@ -854,7 +854,10 @@ func DoActivityOnenIdWxTemplateMsg(activityId int) (err error) {
 	if err != nil {
 		return
 	}
-
+	industrialList, err := cygx.GetIndustrialActivityGroupManagementList(activityId, 1)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
 	if activityInfo.VisibleRange == 1 {
 		return //只要是仅对本组可见的活动,发布时,模板消息统一不发送, p2_876
 	}
@@ -1299,6 +1302,36 @@ func DoActivityOnenIdWxTemplateMsg(activityId int) (err error) {
 		err = errors.New("SendTemplateMsg, Err: " + e.Error())
 		return
 	}
+
+	industrialName := ""
+	for _, v := range industrialList {
+		industrialName += v.IndustryName + ","
+	}
+	industrialName = strings.TrimRight(industrialName, ",")
+	// 发类目模版消息
+	if activityInfo.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+		actTime, _ := time.Parse(utils.FormatDateTime, activityInfo.ActivityTime)
+		first := industrialName
+		keyword1 := "发布了新活动"
+		keyword2 := utils.TruncateActivityNameString(activityInfo.ActivityName)
+		keyword3 := actTime.Format(utils.FormatDateTimeMinute2)
+
+		redirectUrl := utils.WX_MSG_PATH_YX_ACTIVITY_DETAIL + strconv.Itoa(activityId)
+		sendInfo := new(services.SendWxCategoryTemplate)
+		sendInfo.Keywords = []string{first, keyword1, keyword2, keyword3}
+
+		sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdActivityPublishApply
+		sendInfo.RedirectUrl = redirectUrl
+		sendInfo.RedirectTarget = 3
+		sendInfo.Resource = strconv.Itoa(activityId)
+		sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_LIMIT_PEOPLE
+		sendInfo.OpenIdArr = openIdArr
+		e := services.SendCategoryTemplateMsg(sendInfo)
+		if e != nil {
+			err = errors.New("SendTemplateMsg, Err: " + e.Error())
+			return
+		}
+	}
 	return
 }
 
@@ -1368,6 +1401,7 @@ func GetActChartPermissionList() []*cygx.ChartPermissionRepMore {
 		{PermissionName: "智造"},
 		{PermissionName: "策略"},
 		{PermissionName: "固收"},
+		{PermissionName: "周期"},
 		{PermissionName: "宏观"},
 		//{PermissionName: utils.CHART_PERMISSION_NAME_MF_YANXUAN},
 		//{PermissionName: utils.CHART_PERMISSION_NAME_MF_YANXUAN + "(医药)"},

+ 237 - 0
services/cygx/activity_poster.go

@@ -328,3 +328,240 @@ func MakeCygxMp4HtmlImg(videoDuration string) (imgUrl string, err error) {
 	imgUrl = res.Data
 	return
 }
+
+//func init() {
+//	//MakeActivityMomentsImg(2850)
+//	var condition string
+//	var pars []interface{}
+//	condition = " AND   chart_permission_id  = 31  AND  publish_status   = 1   AND active_state  = 1  ORDER BY  activity_id DESC   "
+//	list, errList := cygx.GetActivityListAll(condition, pars, 0, 9999)
+//	if errList != nil {
+//		fmt.Println(errList)
+//		return
+//	}
+//	fmt.Println("list", len(list))
+//
+//	//return
+//	for _, v := range list {
+//		MakeActivityMomentsImg(v.ActivityId)
+//	}
+//
+//}
+
+// 生成活动分享到朋友圈的图片
+func MakeActivityMomentsImg(activityId int) {
+	var err error
+	//time.Sleep(3*time.Second) // 有时候同时添加多个活动,延迟三秒
+	defer func() {
+		if err != nil {
+			fmt.Println("err:", err)
+			go alarm_msg.SendAlarmMsg("生成活动分享到朋友圈的图片失败,MakeActivityMomentsImg Err:"+err.Error()+"活动ID"+strconv.Itoa(activityId), 3)
+		}
+	}()
+	detail, e := cygx.GetAddActivityInfoById(activityId)
+	if e != nil {
+		err = errors.New("GetCygxReportSelectionInfoById, Err: " + e.Error())
+		return
+	}
+
+	// 不是研选活动不生成图片
+	if detail.ChartPermissionId != utils.CHART_PERMISSION_ID_YANXUAN {
+		return
+	}
+	var configCode string
+	if detail.IsResearchPoints == 1 {
+		configCode = "activity_moments_img_points_html" // 扣点活动
+	} else {
+		configCode = "activity_moments_img_html" // 非扣点活动
+	}
+
+	detailConfig, e := cygx.GetCygxConfigDetailByCode(configCode)
+	if e != nil {
+		err = errors.New("GetCygxConfigDetailByCode 获取生成活动分享到朋友圈的图片格式信息失败, Err: " + e.Error())
+		return
+	}
+	configValue := detailConfig.ConfigValue
+	configValue = strings.Replace(configValue, "{{Title}}", detail.ActivityName, -1)
+	configValue = strings.Replace(configValue, "{{ActivityTypeName}}", detail.ActivityTypeName, -1)
+	configValue = strings.Replace(configValue, "{{Label}}", detail.Label, -1)
+	configValue = strings.Replace(configValue, "{{ActivityTimeText}}", detail.ActivityTimeText, -1)
+	htm2ImgReq := make(map[string]interface{})
+	htm2ImgReq["html_content"] = configValue
+	htm2ImgReq["width"] = 2250
+	htm2ImgReq["height"] = 3813
+	res, err := postHtml2Img(htm2ImgReq)
+	if err != nil || res == nil {
+		err = errors.New("html转图片失败: " + res.Msg)
+		return
+	}
+	if res.Code != 200 {
+		err = errors.New("html转图片失败: " + res.Msg)
+		return
+	}
+	imgUrl := res.Data
+	// 记录海报信息
+	err = cygx.UpdateCygxActivityMomentsImg(imgUrl, activityId)
+	if err != nil {
+		return
+	}
+}
+
+// MakeMfyxActivitySigninImg 生成mfyx太阳码并上传OSS
+//func MakeMfyxActivitySigninImg(activityId int) (imgUrl string, err error) {
+//	var msg string
+//	defer func() {
+//		if err != nil || msg != "" {
+//			fmt.Println(err)
+//			utils.FileLog.Info("MakeMfyxActivitySigninImg Err:", err.Error())
+//			go alarm_msg.SendAlarmMsg("扫码签到日志记录,失败,活动ID:"+strconv.Itoa(activityId)+err.Error()+";msg:"+msg, 3)
+//		}
+//	}()
+//	activityInfo, e := cygx.GetAddActivityInfoById(activityId)
+//	if e != nil {
+//		err = errors.New("活动不存在, Err: " + e.Error())
+//		return
+//	}
+//	if activityInfo == nil {
+//		return
+//	}
+//	if activityInfo.ActivityTypeId != 5 && activityInfo.ActivityTypeId != 6 && activityInfo.ActivityTypeId != 8 {
+//		return
+//	}
+//	itemToken, err := models.GetWxToken(utils.WxMfyxAppId, utils.WxMfyxAppSecret)
+//	if err != nil {
+//		return
+//	}
+//	if itemToken.AccessToken == "" {
+//		msg = "accessToken is empty"
+//		return
+//	}
+//	var envVersion string
+//	var resourceUrl string
+//	if utils.RunMode == "release" {
+//		envVersion = "release"
+//	} else {
+//		envVersion = "trial"
+//	}
+//	url := "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + itemToken.AccessToken
+//	method := "POST"
+//	payload := strings.NewReader(`{
+//		"page":"` + utils.WX_MSG_PATH_ACTIVITY_SIGNIN + `",
+//		"scene":"` + strconv.Itoa(activityId) + `",
+//		"env_version":"` + envVersion + `",
+//		"check_path":false,
+//		"auto_color":true
+//				}`)
+//	client := &http.Client{}
+//	req, err := http.NewRequest(method, url, payload)
+//	if err != nil {
+//		msg = "获取微信二维码失败,Err:" + err.Error()
+//		return
+//	}
+//	req.Header.Add("Content-Type", "application/json")
+//	postBody, err := client.Do(req)
+//	if err != nil {
+//		msg = "获取微信二维码失败,Err:" + err.Error()
+//		return
+//	}
+//	defer postBody.Body.Close()
+//	uploadDir := "static/img/share/"
+//	uuid := utils.GetRandStringNoSpecialChar(28)
+//	if !utils.FileIsExist(uploadDir) {
+//		err = os.MkdirAll(uploadDir, 0755)
+//		if err != nil {
+//			msg = "生成文件夹失败,Err:" + err.Error()
+//			return
+//		}
+//	}
+//	imagePath := uploadDir + uuid + ".jpg"
+//	switch header := postBody.Header.Get("Content-Type"); {
+//	case strings.HasPrefix(header, "application/json"):
+//		tokenResp := ReturnBodyRule{}
+//		decoder := json.NewDecoder(postBody.Body)
+//		if decodeErr := decoder.Decode(&tokenResp); decodeErr != nil {
+//			msg = "获取微信二维码失败,Err:" + decodeErr.Error()
+//			return
+//		}
+//	case strings.HasPrefix(header, "image"):
+//		reply, e := ioutil.ReadAll(postBody.Body)
+//		if e != nil {
+//			err = e
+//			msg = "获取微信二维码失败,Err:" + err.Error()
+//			return
+//		}
+//		imageContent, e := os.Create(imagePath)
+//		if e != nil {
+//			err = e
+//			msg = "获取微信二维码失败,Err:" + err.Error()
+//			return
+//		}
+//		writeStringRes, e := io.WriteString(imageContent, string(reply))
+//		if e != nil {
+//			err = e
+//			fmt.Println(writeStringRes)
+//			return
+//		}
+//		closeErr := imageContent.Close()
+//		if closeErr != nil {
+//			err = closeErr
+//			return
+//		}
+//		randStr := utils.GetRandStringNoSpecialChar(28)
+//		fileName := randStr + ".jpg"
+//		savePath := uploadDir + time.Now().Format("200601/20060102/")
+//		savePath += fileName
+//		//上传到阿里云
+//		err = services.UploadFileToAliyun(fileName, imagePath, savePath)
+//		if err != nil {
+//			fmt.Println("文件上传失败,Err:" + err.Error())
+//			return
+//		}
+//		fileHost := "https://hzstatic.hzinsights.com/"
+//		resourceUrl = fileHost + savePath
+//		defer func() {
+//			os.Remove(imagePath)
+//		}()
+//	default:
+//		msg = "生成二维码失败"
+//		return
+//	}
+//
+//	detailConfig, e := cygx.GetCygxConfigDetailByCode(Cygx_activity_sigin_html)
+//	if e != nil {
+//		err = errors.New("GetCygxConfigDetailByCode 获取配置签到码格式信息失败, Err: " + e.Error())
+//		return
+//	}
+//	configValue := detailConfig.ConfigValue
+//	configValue = strings.Replace(configValue, "{{TITLE}}", activityInfo.ActivityName, -1)
+//	configValue = strings.Replace(configValue, "{{IMG}}", resourceUrl, -1)
+//	configValue = strings.Replace(configValue, "{{PLEASE}}", "请扫码确认签到", -1)
+//	configValue = strings.Replace(configValue, "{{SHOWTEXT}}", "将签到成功页面出示给接待人员", -1)
+//	htm2ImgReq := make(map[string]interface{})
+//	htm2ImgReq["html_content"] = configValue
+//	htm2ImgReq["width"] = 1364
+//	htm2ImgReq["height"] = 2060
+//	res, err := postHtml2Img(htm2ImgReq)
+//	if err != nil || res == nil {
+//		msg = "html转图片请求失败"
+//		return
+//	}
+//	if res.Code != 200 {
+//		msg = "html转图片请求失败"
+//		err = errors.New("html转图片失败: " + res.Msg)
+//		return
+//	}
+//	imgUrl = res.Data
+//	// 记录海报信息
+//
+//	err = cygx.UpdateCygxActivitySigninImg(imgUrl, activityId)
+//	if err != nil {
+//		return
+//	}
+//	item := new(cygx.CygxActivityPoster)
+//	item.ActivityId = activityId
+//	item.ImgXcx = resourceUrl
+//	item.ImgPoster = imgUrl
+//	item.CreateTime = time.Now()
+//	err = cygx.AddCygxActivityPoster(item)
+//	return
+//}

+ 2 - 0
services/cygx/activity_power_check.go

@@ -282,6 +282,8 @@ func GetActivityDetailUserPower(user *models.WxUser, adminInfo *system.Admin, ac
 	//如果权限不包含那么直接返回
 	if !strings.Contains(permissionStr, activityInfo.ChartPermissionName) {
 		return
+	} else {
+		havePower = true
 	}
 
 	//处理决策人可见权限

+ 11 - 1
services/cygx/admin_power.go

@@ -12,13 +12,23 @@ 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
 	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 {
 		//组员查看自己
-		conditionMobile = ` SELECT mobile FROM user_seller_relation WHERE seller_id  = ` + strconv.Itoa(adminInfo.AdminId)
+		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) + ` ) `
+		}
 	}
 	mobileList, e := cygx.GetSellerUserMobile(conditionMobile)
 	if e != nil {

+ 161 - 0
services/cygx/contract_allocation.go

@@ -640,3 +640,164 @@ func initCrm13_2() {
 
 	fmt.Println(len(items))
 }
+
+func initCRM_15_4() {
+	var conditionAllocation string
+	var parsAllocation []interface{}
+	conditionAllocation = "  AND company_contract_id  IN  (SELECT   company_contract_id  FROM  cygx_allocation_company_contract_permission  WHERE chart_permission_name  LIKE '%研选%')  GROUP BY company_contract_id  "
+	allocationCompanyContractPermissionList, err := cygx.GetCygxAllocationCompanyContractPermissionList(conditionAllocation, parsAllocation)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+	var companyContractIds []int
+	for _, v := range allocationCompanyContractPermissionList {
+		companyContractIds = append(companyContractIds, v.CompanyContractId)
+	}
+	lenCon := len(companyContractIds)
+	for _, v := range companyContractIds {
+		UpdateInitAvg(v)
+	}
+	fmt.Println("lenCon", lenCon)
+	return
+}
+
+//func init() {
+//	UpdateInitAvg(1249)
+//}
+
+// 合并研选订阅与研选扣点包,为买方研选
+func UpdateInit(companyContractId int) {
+	fmt.Println(companyContractId)
+
+	allocationNames := []string{"董衡", "高亦文", "吴昂迪", "冯柯然", "汪洋"}
+	fmt.Println(allocationNames)
+	listPerssion, err := cygx.GetCygxAllocationCompanyContractPermissionListByIdInitYx(companyContractId)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+
+	//listUser, err := cygx.GetCygxAllocationCompanyContractListById(companyContractId)
+	//if err != nil {
+	//	fmt.Println(err)
+	//	return
+	//}
+
+	var totalMoney float64
+	var items []*cygx.CygxAllocationCompanyContract
+	var itemsPermission []*cygx.CygxAllocationCompanyContractPermission
+
+	//var proportionSum float64 // 校验前端传过来的占比使用
+	var AdminId int
+	var AdminName string
+	for _, v := range listPerssion {
+		totalMoney += v.Money
+		AdminId = v.AdminId
+		AdminName = v.AdminName
+	}
+
+	fmt.Println(totalMoney)
+	//return
+
+	itemPermission := new(cygx.CygxAllocationCompanyContractPermission)
+	itemPermission.CompanyContractId = companyContractId
+	itemPermission.AdminId = AdminId
+	itemPermission.AdminName = AdminName
+	//itemPermission.Proportion = v.Money / totalMoney * 100
+	itemPermission.Money = totalMoney
+	itemPermission.ChartPermissionName = utils.CHART_PERMISSION_NAME_MAI_FANG_YANXUAN
+	itemPermission.CreateTime = time.Now()
+	itemPermission.ModifyTime = time.Now()
+	itemsPermission = append(itemsPermission, itemPermission)
+	for _, v := range allocationNames {
+		item := new(cygx.CygxAllocationCompanyContract)
+		item.CompanyContractId = companyContractId
+		item.AdminId = AdminId
+		item.AdminName = AdminName
+		//item.Proportion =
+		item.Money = totalMoney / 5
+		item.RealName = v
+		item.ChartPermissionName = utils.CHART_PERMISSION_NAME_MAI_FANG_YANXUAN
+		item.CreateTime = time.Now()
+		item.ModifyTime = time.Now()
+		items = append(items, item)
+	}
+	fmt.Println(len(items))
+	fmt.Println(len(itemsPermission))
+	//return
+	err = cygx.AddAndUpdateCygxAllocationCompanyContractInit(items, itemsPermission, companyContractId)
+	fmt.Println(err)
+}
+
+func UpdateInitAvg(companyContractId int) {
+	fmt.Println(companyContractId)
+	listPerssion, err := cygx.GetCygxAllocationCompanyContractPermissionListByIdInit(companyContractId)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+
+	listUser, err := cygx.GetCygxAllocationCompanyContractListById(companyContractId)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+
+	var totalMoney float64
+	var items []*cygx.CygxAllocationCompanyContract
+	var itemsPermission []*cygx.CygxAllocationCompanyContractPermission
+
+	//var proportionSum float64 // 校验前端传过来的占比使用
+	for _, v := range listPerssion {
+		totalMoney += v.Money
+	}
+	moneyAvg := totalMoney / float64(len(listPerssion))
+	for _, v := range listPerssion {
+		itemPermission := new(cygx.CygxAllocationCompanyContractPermission)
+		itemPermission.CompanyContractId = companyContractId
+		itemPermission.AdminId = v.AdminId
+		itemPermission.AdminName = v.AdminName
+		itemPermission.Proportion = v.Money / totalMoney * 100
+		itemPermission.Money = v.Money
+		itemPermission.MoneyAvg = moneyAvg
+		itemPermission.ChartPermissionName = v.ChartPermissionName
+		itemPermission.CreateTime = time.Now()
+		itemPermission.ModifyTime = time.Now()
+		itemsPermission = append(itemsPermission, itemPermission)
+		fmt.Println(v.Money, "___", itemPermission.Proportion, "___", v.AllocationCompanyContractId)
+		err = cygx.Cygx_allocation_company_contract_permissionEdit(itemPermission.Proportion, itemPermission.MoneyAvg, v.AllocationCompanyContractId)
+		//fmt.Println("AllocationCompanyContractId", v.AllocationCompanyContractId)
+		if err != nil {
+			fmt.Println(err)
+			return
+		}
+	}
+
+	//return
+	fmt.Println("研究员修改")
+	//var userProportionSum float64 // 校验前端传过来的占比使用
+	for _, v2 := range listUser {
+		item := new(cygx.CygxAllocationCompanyContract)
+		item.CompanyContractId = companyContractId
+		item.AdminId = v2.AdminId
+		item.AdminName = v2.RealName
+		item.Proportion = v2.Money / totalMoney * 100
+		item.Money = v2.Money
+		item.RealName = v2.RealName
+		item.ChartPermissionName = v2.ChartPermissionName
+		item.CreateTime = time.Now()
+		item.ModifyTime = time.Now()
+		items = append(items, item)
+
+		err = cygx.Cygx_allocation_company_contractEdit(item.Proportion, v2.AllocationCompanyContractId)
+		fmt.Println("AllocationCompanyContractId", v2.AllocationCompanyContractId)
+		if err != nil {
+			fmt.Println(err)
+			return
+		}
+	}
+
+	//err = cygx.AddAndUpdateCygxAllocationCompanyContractInit(items, itemsPermission, companyContractId)
+	//fmt.Println(err)
+}

+ 18 - 4
services/cygx/industry_fllow.go

@@ -6,12 +6,13 @@ import (
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/cygx"
 	"hongze/hz_crm_api/services/alarm_msg"
+	"hongze/hz_crm_api/utils"
 	"strconv"
 	"time"
 )
 
 //func init() {
-//	AddUserFllowCompanyLossToTryOut(1431)
+//	AddUserFllowCompanyLossToTryOut(12841)
 //}
 
 // 流失客户转试用给下面的用户自动添加产业关注
@@ -30,6 +31,10 @@ func AddUserFllowCompanyLossToTryOut(companyId int) {
 		err = errors.New("GetWxUserListByUserMobileHaveCompany" + e.Error())
 		return
 	}
+
+	if len(userList) == 0 {
+		return
+	}
 	var condition string
 	var pars []interface{}
 	//所有的产业
@@ -38,8 +43,15 @@ func AddUserFllowCompanyLossToTryOut(companyId int) {
 		err = errors.New("GetTopOneMonthArtReadNumIndustryAll, Err: " + e.Error())
 		return
 	}
-	condition = " AND company_id =  ? "
-	pars = append(pars, companyId)
+
+	var userIds []int
+
+	for _, v := range userList {
+		userIds = append(userIds, v.UserId)
+	}
+
+	condition = " AND user_id IN  (" + utils.GetOrmInReplace(len(userIds)) + ")  "
+	pars = append(pars, userIds)
 	userFllowList, e := cygx.GetCygxIndustryFllowList(condition, pars, 0, 0)
 	if e != nil {
 		err = errors.New("GetCygxIndustryFllowList, Err: " + e.Error())
@@ -75,7 +87,7 @@ func AddUserFllowCompanyLossToTryOut(companyId int) {
 			Items = append(Items, item)
 		}
 	}
-
+	//fmt.Println("Items", len(Items))
 	//如果小于五千条就直接插入,大于五千条就批量插入
 	if len(Items) < 5000 {
 		e = cygx.AddCygxIndustryFllowMulti(Items)
@@ -118,5 +130,7 @@ func AddUserFllowCompanyLossToTryOut(companyId int) {
 			}
 		}
 	}
+
+	//fmt.Println("AddUserFllowCompanyLossToTryOut end")
 	return
 }

+ 39 - 0
services/cygx/order.go

@@ -0,0 +1,39 @@
+package cygx
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/services/alarm_msg"
+	"hongze/hz_crm_api/utils"
+)
+
+// GetCygxUserBusinessCardMap 获取手机号对应的邀请人
+func GetCygxUserBusinessCardMap(mobileArr []string) (mapResp map[string]string) {
+	lenArr := len(mobileArr)
+	if lenArr == 0 {
+		return
+	}
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg("获取手机号对应的邀请人,信息失败,GetCygxUserBusinessCardMap Err:"+err.Error(), 3)
+		}
+	}()
+	var condition string
+	var pars []interface{}
+
+	condition = ` AND  mobile IN (` + utils.GetOrmInReplace(lenArr) + `)`
+	pars = append(pars, mobileArr)
+	list, e := cygx.GetCygxUserBusinessCardList(condition, pars, 0, lenArr)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetArticlList, Err: " + e.Error())
+		return
+	}
+	mapResp = make(map[string]string, 0)
+	for _, v := range list {
+		mapResp[v.Mobile] = v.InviteName
+	}
+	return
+}

+ 98 - 1
services/cygx/research_summary.go

@@ -1,6 +1,7 @@
 package cygx
 
 import (
+	"errors"
 	"fmt"
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/cygx"
@@ -355,6 +356,10 @@ func DoArticleOnenIdWxTemplateMsg(articleId int, source int) (err error) {
 							if err != nil && err.Error() != utils.ErrNoRow() {
 								return err
 							}
+							//mfyxOpenIditem, err := cygx.GetMfyxUserRecordOpenidByMobile(k)
+							if err != nil && err.Error() != utils.ErrNoRow() {
+								return err
+							}
 							//如果没有权限或者没有获取到 openID的就不推送
 							if openIditem == nil || mapOpenidPower[openIditem.UserId] == "" {
 								continue
@@ -366,14 +371,17 @@ func DoArticleOnenIdWxTemplateMsg(articleId int, source int) (err error) {
 							if mapUserIdChooseSend[openIditem.UserId] == 0 {
 								services.SendWxMsgWithCygxActivityAppointmentNew(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
 								mapOpenidPushed[openIditem.UserId] = openIditem.OpenId
+								// 研选发类目模板消息
+								go services.SendWxCategoryMsgWithCygxActivityAppointmentNew("您预约的调研,有新报告发布", "已发布", utils.TruncateActivityNameString(articleInfo.Title), articleInfo.PublishDate.Format(utils.FormatDateTimeMinute2), openIditem, articleId)
 							}
 
 							//如果小助手勾选了对应的权限信息 就做正常推送
 							if mapUserIdChooseSend[openIditem.UserId] != 0 && mapOpenidFllow[openIditem.UserId] != "" {
 								services.SendWxMsgWithCygxActivityAppointmentNew(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
 								mapOpenidPushed[openIditem.UserId] = openIditem.OpenId
+								// 研选发类目模板消息
+								go services.SendWxCategoryMsgWithCygxActivityAppointmentNew("您预约的调研,有新报告发布", "已发布", utils.TruncateActivityNameString(articleInfo.Title), articleInfo.PublishDate.Format(utils.FormatDateTimeMinute2), openIditem, articleId)
 							}
-
 						}
 					}
 				}
@@ -401,11 +409,15 @@ func DoArticleOnenIdWxTemplateMsg(articleId int, source int) (err error) {
 			if mapUserIdChooseSend[openIditem.UserId] == 0 {
 				services.SendWxMsgWithCygxActivityAppointmentNew(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
 				mapOpenidPushed[openIditem.UserId] = openIditem.OpenId
+				// 研选发类目模板消息
+				go services.SendWxCategoryMsgWithCygxActivityAppointmentNew(articleInfo.NickName, "发布了新报告", utils.TruncateActivityNameString(articleInfo.Title), articleInfo.PublishDate.Format(utils.FormatDateTimeMinute2), openIditem, articleId)
 			}
 			//如果小助手勾选了对应的权限信息 就做正常推送
 			if mapUserIdChooseSend[openIditem.UserId] != 0 && mapOpenidDepartmentFllow[openIditem.UserId] != "" {
 				services.SendWxMsgWithCygxActivityAppointmentNew(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
 				mapOpenidPushed[openIditem.UserId] = openIditem.OpenId
+				// 研选发类目模板消息
+				go services.SendWxCategoryMsgWithCygxActivityAppointmentNew(articleInfo.NickName, "发布了新报告", utils.TruncateActivityNameString(articleInfo.Title), articleInfo.PublishDate.Format(utils.FormatDateTimeMinute2), openIditem, articleId)
 			}
 		}
 		//优先推送3: 关注产业
@@ -429,11 +441,15 @@ func DoArticleOnenIdWxTemplateMsg(articleId int, source int) (err error) {
 			if mapUserIdChooseSend[openIditem.UserId] == 0 {
 				services.SendWxMsgWithCygxActivityAppointmentNew(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
 				mapOpenidPushed[openIditem.UserId] = openIditem.OpenId
+				// 研选发类目模板消息
+				go services.SendWxCategoryMsgWithCygxActivityAppointmentNew(industryName, "发布了新报告", utils.TruncateActivityNameString(articleInfo.Title), articleInfo.PublishDate.Format(utils.FormatDateTimeMinute2), openIditem, articleId)
 			}
 			//如果小助手勾选了对应的权限信息 就做正常推送
 			if mapUserIdChooseSend[openIditem.UserId] != 0 && mapOpenidFllow[openIditem.UserId] != "" {
 				services.SendWxMsgWithCygxActivityAppointmentNew(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
 				mapOpenidPushed[openIditem.UserId] = openIditem.OpenId
+				// 研选发类目模板消息
+				go services.SendWxCategoryMsgWithCygxActivityAppointmentNew(industryName, "发布了新报告", utils.TruncateActivityNameString(articleInfo.Title), articleInfo.PublishDate.Format(utils.FormatDateTimeMinute2), openIditem, articleId)
 			}
 		}
 		//针对哪些没有关注作者,没有关注产业,没有预约纪要的人的推送
@@ -451,10 +467,14 @@ func DoArticleOnenIdWxTemplateMsg(articleId int, source int) (err error) {
 			//如果有权限而且小助手没有提交过信息的 就做正常推送
 			if mapUserIdChooseSend[openIditem.UserId] == 0 {
 				services.SendWxMsgWithCygxActivityAppointmentNew(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
+				// 研选发类目模板消息
+				go services.SendWxCategoryMsgWithCygxActivityAppointmentNew(industryName, "发布了新报告", utils.TruncateActivityNameString(articleInfo.Title), articleInfo.PublishDate.Format(utils.FormatDateTimeMinute2), openIditem, articleId)
 			}
 			//如果小助手勾选了对应的权限信息 就做正常推送
 			if mapUserIdChooseSend[openIditem.UserId] != 0 && mapOpenidFllow[openIditem.UserId] != "" {
 				services.SendWxMsgWithCygxActivityAppointmentNew(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
+				// 研选发类目模板消息
+				go services.SendWxCategoryMsgWithCygxActivityAppointmentNew(industryName, "发布了新报告", utils.TruncateActivityNameString(articleInfo.Title), articleInfo.PublishDate.Format(utils.FormatDateTimeMinute2), openIditem, articleId)
 			}
 		}
 
@@ -488,10 +508,14 @@ func DoArticleOnenIdWxTemplateMsg(articleId int, source int) (err error) {
 				//如果有权限而且小助手没有提交过信息的 就做正常推送
 				if mapUserIdChooseSend[openIditem.UserId] == 0 {
 					services.SendWxMsgWithCygxActivityAppointmentNew(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
+					// 研选发类目模板消息
+					go services.SendWxCategoryMsgWithCygxActivityAppointmentNew(industryName, "发布了新报告", utils.TruncateActivityNameString(articleInfo.Title), articleInfo.PublishDate.Format(utils.FormatDateTimeMinute2), openIditem, articleId)
 				}
 				//如果小助手勾选了对应的权限信息 就做正常推送
 				if mapUserIdChooseSend[openIditem.UserId] != 0 && mapUserFllowCeLue[openIditem.UserId] != "" {
 					services.SendWxMsgWithCygxActivityAppointmentNew(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
+					// 研选发类目模板消息
+					go services.SendWxCategoryMsgWithCygxActivityAppointmentNew(industryName, "发布了新报告", utils.TruncateActivityNameString(articleInfo.Title), articleInfo.PublishDate.Format(utils.FormatDateTimeMinute2), openIditem, articleId)
 				}
 			}
 		} else {
@@ -504,10 +528,14 @@ func DoArticleOnenIdWxTemplateMsg(articleId int, source int) (err error) {
 				//如果有权限而且小助手没有提交过信息的 就做正常推送
 				if mapUserIdChooseSend[openIditem.UserId] == 0 {
 					services.SendWxMsgWithCygxActivityAppointmentNew(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
+					// 研选发类目模板消息
+					go services.SendWxCategoryMsgWithCygxActivityAppointmentNew(industryName, "发布了新报告", utils.TruncateActivityNameString(articleInfo.Title), articleInfo.PublishDate.Format(utils.FormatDateTimeMinute2), openIditem, articleId)
 				}
 				//如果小助手勾选了对应的权限信息 就做正常推送
 				if mapUserIdChooseSend[openIditem.UserId] != 0 && mapOpenidFllow[openIditem.UserId] != "" {
 					services.SendWxMsgWithCygxActivityAppointmentNew(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
+					// 研选发类目模板消息
+					go services.SendWxCategoryMsgWithCygxActivityAppointmentNew(industryName, "发布了新报告", utils.TruncateActivityNameString(articleInfo.Title), articleInfo.PublishDate.Format(utils.FormatDateTimeMinute2), openIditem, articleId)
 				}
 			}
 		}
@@ -583,3 +611,72 @@ func DoXzsChooseSend(chartPermissionName string) string {
 	}
 	return allIn
 }
+
+//func init() {
+//	//MakeArticleMomentsImg(1000408)
+//	var condition string
+//	var pars []interface{}
+//	condition = " AND   article_type_id  > 0   AND  publish_status   = 1   ORDER BY  article_id  DESC "
+//	list, errList := cygx.GetCygxArticleList(condition, pars, 0, 999)
+//	if errList != nil {
+//		fmt.Println(errList)
+//		return
+//	}
+//	fmt.Println("list", len(list))
+//	//return
+//	for k, v := range list {
+//		fmt.Println(k)
+//		MakeArticleMomentsImg(v.ArticleId)
+//	}
+//}
+
+// 生成文章分享到朋友圈的图片
+func MakeArticleMomentsImg(articleId int) {
+	var err error
+	//time.Sleep(3*time.Second) // 有时候同时添加多个活动,延迟三秒
+	defer func() {
+		if err != nil {
+			fmt.Println("err:", err)
+			go alarm_msg.SendAlarmMsg("生成文章分享到朋友圈的图片,MakeArticleMomentsImg Err:"+err.Error()+"文章ID"+strconv.Itoa(articleId), 3)
+		}
+	}()
+	articleInfo, e := cygx.GetArticleInfoOtherByArticleId(articleId)
+	if e != nil {
+		err = errors.New("GetArticleInfoOtherByArticleId, Err: " + e.Error())
+		return
+	}
+
+	configCode := "article_moments_img_html"
+	detailConfig, e := cygx.GetCygxConfigDetailByCode(configCode)
+	if e != nil {
+		err = errors.New("GetCygxConfigDetailByCode 获取生成文章分享到朋友圈的图片格式信息失败, Err: " + e.Error())
+		return
+	}
+	configValue := detailConfig.ConfigValue
+	configValue = strings.Replace(configValue, "{{Title}}", articleInfo.Title, -1)
+	configValue = strings.Replace(configValue, "{{HeadImgUrl}}", articleInfo.HeadImgUrl, -1)
+	configValue = strings.Replace(configValue, "{{NickName}}", articleInfo.NickName, -1)
+	configValue = strings.Replace(configValue, "{{PublishDate}}", articleInfo.PublishDate.Format(utils.FormatDateTime), -1)
+	configValue = strings.Replace(configValue, "{{Abstract}}", articleInfo.Abstract, -1)
+	configValue = strings.Replace(configValue, "{{BodyText}}", articleInfo.BodyText, -1)
+
+	htm2ImgReq := make(map[string]interface{})
+	htm2ImgReq["html_content"] = configValue
+	htm2ImgReq["width"] = 2250
+	htm2ImgReq["height"] = 3813
+	res, err := postHtml2Img(htm2ImgReq)
+	if err != nil || res == nil {
+		err = errors.New("html转图片失败: " + res.Msg)
+		return
+	}
+	if res.Code != 200 {
+		err = errors.New("html转图片失败: " + res.Msg)
+		return
+	}
+	imgUrl := res.Data
+	//fmt.Println(imgUrl)
+	// 记录海报信息
+	err = cygx.UpdateCygxArticleMomentsImg(imgUrl, articleId)
+	return
+
+}

+ 125 - 0
services/cygx/wx_pay.go

@@ -0,0 +1,125 @@
+package cygx
+
+import (
+	"context"
+	"fmt"
+	"github.com/wechatpay-apiv3/wechatpay-go/core"
+	"github.com/wechatpay-apiv3/wechatpay-go/core/option"
+	"github.com/wechatpay-apiv3/wechatpay-go/services/refunddomestic"
+	payUtils "github.com/wechatpay-apiv3/wechatpay-go/utils"
+	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/services/alarm_msg"
+	"hongze/hz_crm_api/utils"
+)
+
+const (
+	//MchPKFileName              = "./utils/cert/apiclient_key.pem"
+	//MchPKFileName              = "../hongze_mfyx/utils/cert/apiclient_key.pem"
+	MchPKFileName              = "/home/code/wechat_cert/cygx/apiclient_key.pem"
+	Mchid                      = "1624495680"
+	MchCertificateSerialNumber = "5ED2719CFAE5205763034AD80BF4B8A33533C418"
+	MchAPIv3Key                = "W1tbnzQrzQ7yRRNuQCIHjis8dgdasKVX"
+)
+
+// 微信商户建立连接
+//func getWechatClient() (context.Context, *core.Client, error) {
+//	var err error
+//	defer func() {
+//		if err != nil {
+//			fmt.Println(err)
+//			go alarm_msg.SendAlarmMsg(fmt.Sprint("微信商户建立连接失败 getWechatClient, err:", err.Error()), 2)
+//		}
+//	}()
+//	// 使用 utils 提供的函数从本地文件中加载商户私钥,商户私钥会用来生成请求的签名
+//	mchPrivateKey, err := payUtils.LoadPrivateKeyWithPath(MchPKFileName)
+//	if err != nil {
+//		log.Print("load merchant private key error")
+//		return nil, nil, err
+//	}
+//	ctx := context.Background()
+//	// 使用商户私钥等初始化 client,并使它具有自动定时获取微信支付平台证书的能力
+//	opts := []core.ClientOption{
+//		option.WithWechatPayAutoAuthCipher(Mchid, MchCertificateSerialNumber, mchPrivateKey, MchAPIv3Key),
+//	}
+//	client, err := core.NewClient(ctx, opts...)
+//	if err != nil {
+//		log.Printf("new wechat pay client err:%s", err)
+//		return nil, nil, err
+//	}
+//	return ctx, client, nil
+//}
+
+var WechatCertClient *core.Client
+
+// 微信商户建立连接(全局)
+func init() {
+	if !utils.FileIsExist(MchPKFileName) {
+		//fmt.Println("商户私钥文件不存在")
+		go alarm_msg.SendAlarmMsg("微信商户链接失败 商户私钥文件不存在", 2)
+		return
+	}
+	// 使用 utils 提供的函数从本地文件中加载商户私钥,商户私钥会用来生成请求的签名
+	mchPrivateKey, err := payUtils.LoadPrivateKeyWithPath(MchPKFileName)
+	if err != nil {
+		fmt.Println(err)
+		go alarm_msg.SendAlarmMsg("微信商户链接失败 LoadPrivateKeyWithPath"+err.Error(), 2)
+	}
+	ctx := context.Background()
+	// 使用商户私钥等初始化 client,并使它具有自动定时获取微信支付平台证书的能力
+	opts := []core.ClientOption{
+		option.WithWechatPayAutoAuthCipher(Mchid, MchCertificateSerialNumber, mchPrivateKey, MchAPIv3Key),
+	}
+
+	client, err := core.NewClient(ctx, opts...)
+	if err != nil {
+		fmt.Println(err)
+		go alarm_msg.SendAlarmMsg("微信商户链接失败 NewClient"+err.Error(), 2)
+	}
+	WechatCertClient = client
+	return
+}
+
+// 微信商户退款
+func RefundsApiService(orderDetail *cygx.CygxOrderResp) (statusCode int, err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("微信商户退款失败 RefundsApiService, err:", err.Error()), 2)
+		}
+	}()
+	//ctx, client, err := getWechatClient()
+	//if err != nil {
+	//	//log.Printf("getWechatClientt err:%s", err)
+	//	return
+	//}
+	ctx := context.Background()
+	svc := refunddomestic.RefundsApiService{Client: WechatCertClient}
+	resp, result, err := svc.Create(ctx,
+		refunddomestic.CreateRequest{
+			//SubMchid:      core.String(Mchid),
+			TransactionId: core.String(orderDetail.OutTradeCode),
+			OutTradeNo:    core.String(orderDetail.OutTradeNo),
+			OutRefundNo:   core.String("RE" + orderDetail.OrderCode),
+			Reason:        core.String("退款"),
+			NotifyUrl:     core.String(utils.Wx_MFYX_Refund_NotifyUrl),
+			FundsAccount:  refunddomestic.REQFUNDSACCOUNT_AVAILABLE.Ptr(),
+			Amount: &refunddomestic.AmountReq{
+				Currency: core.String("CNY"),
+				//From: []refunddomestic.FundsFromItem{refunddomestic.FundsFromItem{
+				//	Account: refunddomestic.ACCOUNT_AVAILABLE.Ptr(),
+				//	Amount:  core.Int64(444),
+				//}},
+				Refund: core.Int64(int64(orderDetail.PayMoney * 100)),
+				Total:  core.Int64(int64(orderDetail.PayMoney * 100)),
+			},
+		},
+	)
+	if err != nil {
+		return
+	} else {
+		utils.FileLogCygx.Info("status=%d resp=%s", result.Response.StatusCode, resp)
+	}
+	statusCode = result.Response.StatusCode
+
+	return
+}

+ 27 - 11
services/eta_business/eta_business.go

@@ -45,6 +45,9 @@ func UpdateEtaBusinessAfterSigning(businessId int) (err error) {
 	businessOb := new(eta_business.EtaBusiness)
 	business, e := businessOb.GetItemById(businessId)
 	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			return
+		}
 		err = fmt.Errorf("获取商家信息失败, Err: %s", e.Error())
 		return
 	}
@@ -55,7 +58,8 @@ func UpdateEtaBusinessAfterSigning(businessId int) (err error) {
 		cond := fmt.Sprintf(` AND %s = ?`, eta_business.EtaBusinessContractColumns.EtaBusinessId)
 		pars := make([]interface{}, 0)
 		pars = append(pars, businessId)
-		list, e := ob.GetItemsByCondition(cond, pars, []string{}, "")
+		// 按签约时间倒序
+		list, e := ob.GetItemsByCondition(cond, pars, []string{}, fmt.Sprintf("%s DESC", eta_business.EtaBusinessContractColumns.SigningTime))
 		if e != nil {
 			err = fmt.Errorf("获取商家合同列表失败, Err: " + e.Error())
 			return
@@ -63,6 +67,16 @@ func UpdateEtaBusinessAfterSigning(businessId int) (err error) {
 		contracts = list
 	}
 	if len(contracts) == 0 {
+		// 重置签约信息
+		cols := []string{"ContractId", "SigningStatus", "SigningTime", "ExpiredTime", "ModifyTime"}
+		business.ContractId = 0
+		business.SigningStatus = eta_business.EtaBusinessSigningStatusWait
+		business.SigningTime = time.Time{}
+		business.ExpiredTime = time.Time{}
+		business.ModifyTime = time.Now().Local()
+		if e = business.Update(cols); e != nil {
+			err = fmt.Errorf("更新商家信息失败, Err: %s", e.Error())
+		}
 		return
 	}
 
@@ -86,18 +100,20 @@ func UpdateEtaBusinessAfterSigning(businessId int) (err error) {
 			break
 		}
 	}
-	// 不存在任一合同期内, 当前合同不变, 更新状态
-	if !using {
-		business.SigningStatus = eta_business.EtaBusinessSigningStatusTerminate
-		business.ModifyTime = time.Now().Local()
-		cols := []string{"SigningStatus", "ModifyTime"}
-		if e = business.Update(cols); e != nil {
-			err = fmt.Errorf("更新商家信息失败, Err: %s", e.Error())
-			return
+
+	// 不存在任一合同期内, 取签约时间最后的合同(已按时间排序)
+	if !using && len(contracts) > 0 {
+		business.ContractId = contracts[0].EtaBusinessContractId
+		business.SigningTime = contracts[0].SigningTime
+		business.ExpiredTime = contracts[0].ExpiredTime
+		if contracts[0].IsFirst == 1 {
+			business.SigningStatus = eta_business.EtaBusinessSigningStatusFirst
+		} else {
+			business.SigningStatus = eta_business.EtaBusinessSigningStatusTerminate
 		}
-		return
+		business.ModifyTime = time.Now().Local()
 	}
-	// 合同期内
+
 	cols := []string{"ContractId", "SigningStatus", "SigningTime", "ExpiredTime", "ModifyTime"}
 	if e = business.Update(cols); e != nil {
 		err = fmt.Errorf("更新商家信息失败, Err: %s", e.Error())

+ 54 - 0
services/eta_forum/eta_forum_hub.go

@@ -0,0 +1,54 @@
+package eta_forum
+
+import (
+	"encoding/json"
+	"fmt"
+)
+
+type GetForumAdminAuthCodeResp struct {
+	Ret         int
+	Msg         string
+	ErrMsg      string
+	ErrCode     string
+	Data        *LoginAuthCode
+	Success     bool `description:"true 执行成功,false 执行失败"`
+	IsSendEmail bool `json:"-" description:"true 发送邮件,false 不发送邮件"`
+	IsAddLog    bool `json:"-" description:"true 新增操作日志,false 不新增操作日志" `
+}
+type LoginAuthCode struct {
+	AuthCode string `json:"auth_code" description:"登录凭证"`
+}
+
+// GetLoginAuthCodeReq 获取登录编码请求体
+type GetLoginAuthCodeReq struct {
+	AdminName string `description:"用户名"`
+	Source    int    `description:"来源: 1-CRM; 2-ETA"`
+}
+
+// GetForumAdminAuthCode 获取登录凭证
+func GetForumAdminAuthCode(adminName string) (authCode string, err error) {
+	// 查询图表信息
+	param := GetLoginAuthCodeReq{
+		Source:    1,
+		AdminName: adminName,
+	}
+	reqJson, e := json.Marshal(param)
+	if e != nil {
+		err = fmt.Errorf("data json marshal err: %s", e.Error())
+		return
+	}
+	respItem, err := GetForumAdminAuthCodeLib(string(reqJson))
+	if err != nil {
+		err = fmt.Errorf("获取登录凭证,Err:" + err.Error())
+		return
+	}
+	if respItem.Ret != 200 {
+		err = fmt.Errorf("获取登录凭证,Err:" + respItem.ErrMsg)
+		return
+	}
+
+	if respItem.Data != nil {
+		authCode = respItem.Data.AuthCode
+	}
+	return
+}

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