浏览代码

Merge branch 'master' of http://8.136.199.33:3000/hongze/hz_crm_api into cygx_10.12.1

xingzai 1 年之前
父节点
当前提交
45eb95b981
共有 56 个文件被更改,包括 2333 次插入286 次删除
  1. 145 11
      controllers/company.go
  2. 11 3
      controllers/company_apply_v2.go
  3. 14 9
      controllers/company_share.go
  4. 19 7
      controllers/company_user.go
  5. 60 16
      controllers/contract/contract.go
  6. 60 4
      controllers/cygx/activity.go
  7. 12 11
      controllers/cygx/activity_meet.go
  8. 40 30
      controllers/cygx/activity_signup.go
  9. 105 7
      controllers/cygx/activity_special.go
  10. 103 9
      controllers/cygx/activity_special_trip.go
  11. 5 1
      controllers/cygx/micro_roadshow.go
  12. 15 8
      controllers/cygx/morning_meeting_review.go
  13. 13 13
      controllers/cygx/report_selection.go
  14. 6 5
      controllers/cygx/summary_manage.go
  15. 80 6
      controllers/cygx/user.go
  16. 69 0
      controllers/report.go
  17. 37 0
      controllers/sys_admin.go
  18. 22 1
      controllers/sys_department.go
  19. 39 7
      controllers/sys_group.go
  20. 34 1
      controllers/sys_role.go
  21. 23 3
      controllers/sys_team.go
  22. 69 0
      controllers/sys_user.go
  23. 26 0
      models/company/company.go
  24. 12 1
      models/company/company_apply.go
  25. 20 2
      models/company/company_product.go
  26. 23 0
      models/company/scrounge_company.go
  27. 6 0
      models/cygx/activity.go
  28. 19 17
      models/cygx/activity_points_set.go
  29. 7 1
      models/cygx/activity_signup.go
  30. 1 0
      models/cygx/activity_special.go
  31. 30 4
      models/cygx/activity_special_meeting_detail.go
  32. 51 3
      models/cygx/activity_special_trip.go
  33. 1 0
      models/cygx/activity_special_trip_bill.go
  34. 1 1
      models/cygx/activity_video.go
  35. 7 0
      models/cygx/activity_voice.go
  36. 8 0
      models/cygx/cygx_morning_meeting_review_chapter.go
  37. 17 8
      models/cygx/cygx_user.go
  38. 4 4
      models/cygx/cygx_user_company.go
  39. 49 6
      models/cygx/industrial_article_group_management.go
  40. 29 19
      models/cygx/industrial_subject.go
  41. 4 0
      models/cygx/report_selection_log.go
  42. 1 0
      models/cygx/summary_manage.go
  43. 106 1
      models/cygx/tag_history.go
  44. 1 1
      models/eta_trial/eta_trial.go
  45. 24 0
      models/system/sys_admin.go
  46. 54 0
      routers/commentsRouter.go
  47. 1 0
      routers/router.go
  48. 49 0
      services/company.go
  49. 178 0
      services/crm_eta.go
  50. 42 2
      services/cygx/acitvity.go
  51. 1 0
      services/cygx/activity_points_set.go
  52. 15 13
      services/cygx/activity_special.go
  53. 3 51
      services/cygx/special_wx_msg.go
  54. 528 0
      services/elastic/es_comprehensive.go
  55. 12 0
      utils/config.go
  56. 22 0
      utils/constants.go

+ 145 - 11
controllers/company.go

@@ -114,7 +114,17 @@ func (this *CompanyController) SearchList() {
 	}
 	// 查询当前销售是否有领取客户的权限
 	receiveEnabled, _ := services.CheckCompanyReceiveButton(sysUser.AdminId)
-
+	// 白嫖客户标记
+	scroungeList, err := company.GetScroungeCompany()
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取白嫖客户信息失败,Err:" + err.Error()
+		return
+	}
+	scroungeMap := make(map[int]int)
+	for _, v := range scroungeList {
+		scroungeMap[v.CompanyId] = 1
+	}
 	/*
 		时长根据客户状态定义,
 		若为冻结客户或者流失客户,则展示冻结时长或流失时长;
@@ -125,6 +135,10 @@ func (this *CompanyController) SearchList() {
 		duration := ""
 		item := list[i]
 		itemStatus := item.Status
+		//白嫖客户标记
+		if _, ok := scroungeMap[item.CompanyId]; ok{
+			item.IsScrounge = 1
+		}
 		if !strings.Contains(item.Status, "/") {
 			if item.Status == utils.COMPANY_STATUS_FREEZE {
 				if item.FreezeEndDate != "" {
@@ -403,6 +417,7 @@ func (this *CompanyController) SearchList() {
 // @Param   SortType   query   string  true       "如何排序,是正序还是倒序,枚举值:`asc 正序`,`desc 倒叙`"
 // @Param   SortByTodo   query   bool  true       "是否根据待办排序,true或false"
 // @Param   TryStage   query   int  false       "试用客户子标签:0全部、1未分类、2 推进、3 跟踪、4 预备"
+// @Param   IncludeShare   query   bool  true       "是否包含共享客户: true-包含; false-不包含"
 // @Success 200 {object} company.CompanyListResp
 // @router /list [get]
 func (this *CompanyController) List() {
@@ -438,8 +453,9 @@ func (this *CompanyController) List() {
 	city := this.GetString("City")
 	keyWord = strings.Trim(keyWord, " ")
 	keyWord = strings.Replace(keyWord, "'", "", -1)
-	todoStatus := this.GetString("TodoStatus") //任务状态
-	tryStage, _ := this.GetInt("TryStage")     //试用客户标签
+	todoStatus := this.GetString("TodoStatus")      //任务状态
+	tryStage, _ := this.GetInt("TryStage")          //试用客户标签
+	includeShare, _ := this.GetBool("IncludeShare") // 是否包含试用客户
 
 	// 套餐类型
 	packageType, _ := this.GetInt("PackageType")
@@ -757,8 +773,17 @@ func (this *CompanyController) List() {
 					//如果没有筛选了流失客户状态,那么需要加客户归属条件加入到查询中去
 					if sysUser.Authority <= 0 {
 						if status != utils.COMPANY_STATUS_LOSE {
-							condition += ` AND b.seller_id=?  `
-							pars = append(pars, sysUser.AdminId)
+							//condition += ` AND b.seller_id=?  `
+							//pars = append(pars, sysUser.AdminId)
+
+							// 是否包含共享客户(新增合同时, 关键词搜索客户为true)
+							if includeShare {
+								condition += ` AND (b.seller_id = ? OR (a.share_seller_id = ? AND a.is_share = 1)) `
+								pars = append(pars, sysUser.AdminId, sysUser.AdminId)
+							} else {
+								condition += ` AND b.seller_id=?  `
+								pars = append(pars, sysUser.AdminId)
+							}
 						}
 
 						permissionCondition += ` AND b.seller_id=? `
@@ -1701,6 +1726,24 @@ func (this *CompanyController) List() {
 	if companyLists == nil {
 		companyLists = make([]*company.CompanyListItem, 0)
 	}
+
+	// 白嫖客户标记
+	scroungeList, err := company.GetScroungeCompany()
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取白嫖客户信息失败,Err:" + err.Error()
+		return
+	}
+	scroungeMap := make(map[int]int)
+	for _, v := range scroungeList {
+		scroungeMap[v.CompanyId] = 1
+	}
+	for i, v := range companyLists {
+		if _, ok := scroungeMap[v.CompanyId]; ok{
+			companyLists[i].IsScrounge = 1
+		}
+	}
+
 	page = paging.GetPaging(currentIndex, pageSize, total)
 	resp.List = companyLists
 	resp.StatusCount = statusItems
@@ -3339,6 +3382,21 @@ func (this *CompanyController) Detail() {
 		}
 	}
 
+	// 白嫖客户标记
+	scroungeList, err := company.GetScroungeCompany()
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取白嫖客户信息失败,Err:" + err.Error()
+		return
+	}
+	scroungeMap := make(map[int]int)
+	for _, v := range scroungeList {
+		scroungeMap[v.CompanyId] = 1
+	}
+	if _, ok := scroungeMap[item.CompanyId]; ok{
+		item.IsScrounge = 1
+	}
+
 	resp.Item = item
 	resp.BtnItem = btnDetailItem
 	br.Ret = 200
@@ -8510,12 +8568,13 @@ func (this *CompanyController) AddRemark() {
 	}
 
 	remark := company.CompanyProductRemark{
-		CompanyProductRemakrId: 0,
-		CompanyId:              companyProduct.CompanyId,
-		ProductId:              companyProduct.ProductId,
-		ProductName:            companyProduct.ProductName,
-		Remark:                 req.Remark,
-		CreateTime:             time.Now(),
+		CompanyId:   companyProduct.CompanyId,
+		ProductId:   companyProduct.ProductId,
+		ProductName: companyProduct.ProductName,
+		Remark:      req.Remark,
+		CreateTime:  time.Now(),
+		SysUserId:   sysUser.AdminId,
+		SysRealName: sysUser.RealName,
 	}
 
 	err = company.AddCompanyRemark(&remark)
@@ -8598,9 +8657,14 @@ func (this *CompanyController) RemarkList() {
 	resp := make([]company.RemarkResp, len(remarkList))
 	for i, remark := range remarkList {
 		createDate := remark.CreateTime.Format(utils.FormatDateTime)
+		resp[i].RemarkId = remark.CompanyProductRemarkId
 		resp[i].Remark = remark.Remark
 		resp[i].ProductName = remark.ProductName
 		resp[i].CreateTime = createDate
+		// 仅自己添加的可删除
+		if remark.SysUserId == sysUser.AdminId {
+			resp[i].ButtonDel = true
+		}
 	}
 
 	br.Ret = 200
@@ -9092,3 +9156,73 @@ func (this *CompanyTodoController) CompanyActivityPointsBill() {
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// DelRemark
+// @Title 删除备注
+// @Description 删除备注
+// @Param	request	body company.RemarkDelReq true "type json string"
+// @Success 200 操作成功
+// @router /remark/del [post]
+func (this *CompanyController) DelRemark() {
+	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 company.RemarkDelReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.RemarkId <= 0 {
+		br.Msg = "参数有误"
+		br.ErrMsg = "参数有误, 备注ID有误"
+		return
+	}
+
+	item, e := company.GetCompanyRemarkById(req.RemarkId)
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Msg = "备注已被删除, 请刷新页面"
+			return
+		}
+		br.Msg = "备注信息有误"
+		br.ErrMsg = "获取客户备注失败, Err: " + e.Error()
+		return
+	}
+	if item.SysUserId != sysUser.AdminId {
+		br.Msg = "仅备注添加人可删除"
+		return
+	}
+
+	product, e := company.GetCompanyProductByCompanyIdAndProductId(item.CompanyId, item.ProductId)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取客户产品信息失败, Err: " + e.Error()
+		return
+	}
+
+	if e := company.DelCompanyRemark(req.RemarkId); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "删除客户备注失败, Err: " + e.Error()
+		return
+	}
+	content := fmt.Sprintf("%s%s", "删除备注: ", item.Remark)
+	_ = services.AddCompanyOperationRecord(product.CompanyId, product.SellerId, sysUser.AdminId, product.ProductId, sysUser.AdminId, product.CompanyName, product.ProductName, sysUser.RealName, "删除备注", "del_remark", content, sysUser.RealName, "", product.Status)
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 11 - 3
controllers/company_apply_v2.go

@@ -141,8 +141,16 @@ func (this *CompanyApplyController) ApplyServiceUpdate() {
 		br.ErrMsg = "客户状态为:" + companyProduct.Status + ";不可进行服务更新申请"
 		return
 	}
-	//客户归属判断
-	if companyProduct.SellerId != sysUser.AdminId {
+
+	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 {
 		br.Msg = "客户信息异常"
 		br.ErrMsg = "客户信息异常,不是当前所属销售,客户所属销售:" + companyProduct.SellerName + ";当前销售:" + sysUser.AdminName
 		return
@@ -811,7 +819,7 @@ func (this *CompanyApplyController) ApplyBySystemContract() {
 		br.ErrMsg = "客户不存在,不可提交审批:companyId:" + strconv.Itoa(req.CompanyId) + ";productId:" + strconv.Itoa(productId)
 		return
 	}
-	if companyProduct.SellerId != sysUser.AdminId {
+	if companyProduct.SellerId != sysUser.AdminId && companyInfo.ShareSellerId != sysUser.AdminId {
 		br.Msg = "客户信息异常"
 		br.ErrMsg = "客户信息异常,不是当前所属销售,客户所属销售:" + companyProduct.SellerName + ";当前销售:" + sysUser.AdminName
 		return

+ 14 - 9
controllers/company_share.go

@@ -299,7 +299,7 @@ func (this *CompanyController) CompanyShareList() {
 	}
 
 	// 查询当前销售是否有领取客户的权限
-	receiveEnabled, _ := services.CheckCompanyReceiveButton(sysUser.AdminId)
+	//receiveEnabled, _ := services.CheckCompanyReceiveButton(sysUser.AdminId)
 	for i := 0; i < lenList; i++ {
 		item := list[i]
 
@@ -431,11 +431,15 @@ func (this *CompanyController) CompanyShareList() {
 		//按钮显示控制
 		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.GroupIds, item.GroupIds, item.GroupId, sysUser.GroupId, item.SellerId, sysUser.AdminId, sysUser.Authority, item.ProductId, item.ShareSellerId)
 			//根据销售"领取客户"的权限对部分按钮做限制
-			btnItem = services.GetCompanyPermissionButtonByReceiveEnabled(btnItem, receiveEnabled)
+			//btnItem = services.GetCompanyPermissionButtonByReceiveEnabled(btnItem, receiveEnabled)
+
+			// 13.6正式客户共享按钮显示控制
+			btnItem = services.GetShareCompanyPermissionButton(roleTypeCode, itemStatus, item.ProductId)
 		}
 		list[i].BtnItem = btnItem
+
 		if item.FreezeStartDate != "" && item.FreezeEndDate != "" && item.Status == utils.COMPANY_STATUS_FREEZE {
 			freezeEndDate, _ := time.Parse(utils.FormatDate, item.FreezeEndDate)
 			if time.Now().Before(freezeEndDate) {
@@ -708,12 +712,13 @@ func (this *CompanyController) CompanyShareAddRemark() {
 		br.ErrMsg = "查询客户异常,Err:" + err.Error()
 	}
 	remark := company.CompanyProductRemark{
-		CompanyProductRemakrId: 0,
-		CompanyId:              companyProduct.CompanyId,
-		ProductId:              companyProduct.ProductId,
-		ProductName:            companyProduct.ProductName,
-		Remark:                 req.Remark,
-		CreateTime:             time.Now(),
+		CompanyId:   companyProduct.CompanyId,
+		ProductId:   companyProduct.ProductId,
+		ProductName: companyProduct.ProductName,
+		Remark:      req.Remark,
+		CreateTime:  time.Now(),
+		SysUserId:   sysUser.AdminId,
+		SysRealName: sysUser.RealName,
 	}
 	err = company.AddCompanyRemark(&remark)
 	if err != nil {

+ 19 - 7
controllers/company_user.go

@@ -96,6 +96,18 @@ func (this *CompanyUserController) AddUser() {
 	companyProductList := make([]*company.CompanyProduct, 0)
 
 	shareSellerId := 0
+	companyInfo := new(company.Company)
+	if req.CompanyId > 0 {
+		item, 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类客户
@@ -129,12 +141,12 @@ func (this *CompanyUserController) AddUser() {
 			return
 		} else if req.Source == "add_user" {
 			//普通类型添加客户
-			companyInfo, err := company.GetCompanyById(req.CompanyId)
-			if err != nil {
-				br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
-				br.Msg = "获取客户信息失败"
-				return
-			}
+			//companyInfo, err := company.GetCompanyById(req.CompanyId)
+			//if err != nil {
+			//	br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
+			//	br.Msg = "获取客户信息失败"
+			//	return
+			//}
 
 			//手机号、邮箱校验(必填一个)
 			if req.MobileOne == "" && req.Email == "" {
@@ -142,7 +154,7 @@ func (this *CompanyUserController) AddUser() {
 				br.IsSendEmail = false
 				return
 			}
-			shareSellerId = companyInfo.ShareSellerId
+			//shareSellerId = companyInfo.ShareSellerId
 			//获取当前操作员产品权限
 			tmpCompanyProductList, productErr := getSysCompanyProductList(productId, req.CompanyId)
 			if productErr != nil {

+ 60 - 16
controllers/contract/contract.go

@@ -2516,12 +2516,15 @@ func (this *ContractController) BusinessContractCompanyList() {
 
 	//关键字
 	keyword := this.GetString("Keyword")
+	keyword = strings.TrimSpace(keyword)
 	if keyword == "" {
 		br.Msg = "请输入客户名称"
 		br.ErrMsg = "请输入客户名称"
 		return
 	}
-	condition += ` AND (contract_code LIKE '%` + keyword + `%' OR company_name LIKE '%` + keyword + `%' OR credit_code LIKE '%` + keyword + `%' ) `
+	kw := fmt.Sprint("%", keyword, "%")
+	condition += ` AND (contract_code LIKE ? OR company_name LIKE ? OR credit_code LIKE ? ) `
+	pars = append(pars, kw, kw, kw)
 
 	list, err := contract.GetContractCompanyNameList(condition, pars)
 	if err != nil {
@@ -2535,6 +2538,25 @@ func (this *ContractController) BusinessContractCompanyList() {
 		companyNameList = append(companyNameList, v.CompanyName)
 	}
 
+	// 13.6正式共享客户的处理
+	{
+		// 通过关键词获取分配给当前销售的正式共享客户
+		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"}, "")
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取共享客户信息失败, Err: " + e.Error()
+			return
+		}
+		for _, v := range shares {
+			if !utils.InArrayByStr(companyNameList, v.CompanyName) {
+				companyNameList = append(companyNameList, v.CompanyName)
+			}
+		}
+	}
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
@@ -2576,8 +2598,13 @@ func (this *ContractController) BusinessContractListByCompanyName() {
 	//		pars = append(pars, sysUser.AdminId)
 	//	}
 	//}
-	condition += ` AND a.seller_id = ? `
-	pars = append(pars, sysUser.AdminId)
+	//condition += ` AND a.seller_id = ? `
+	//pars = append(pars, sysUser.AdminId)
+
+	// 13.6正式共享客户-可以选择分配给自己的共享客户下的非自己创建的合同
+	joinStr := ` LEFT JOIN company 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)
 
 	//关键字
 	companyName := this.GetString("CompanyName")
@@ -2586,7 +2613,7 @@ func (this *ContractController) BusinessContractListByCompanyName() {
 		br.ErrMsg = "请输入客户名称"
 		return
 	}
-	condition += ` AND  company_name = ? `
+	condition += ` AND a.company_name = ? `
 	pars = append(pars, companyName)
 
 	pageSize, _ := this.GetInt("PageSize")
@@ -2601,14 +2628,14 @@ func (this *ContractController) BusinessContractListByCompanyName() {
 	}
 	startSize = paging.StartIndex(currentIndex, pageSize)
 
-	total, err := contract.GetContractListCount(condition, "", pars)
+	total, err := contract.GetContractListCount(condition, joinStr, pars)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据总数失败,Err:" + err.Error()
 		return
 	}
 
-	list, err := contract.GetContractList(condition, "", pars, startSize, pageSize)
+	list, err := contract.GetContractList(condition, joinStr, pars, startSize, pageSize)
 	if err != nil {
 		br.Msg = "获取合同列表失败!"
 		br.ErrMsg = "获取合同列表失败,Err:" + err.Error()
@@ -2824,25 +2851,42 @@ func (this *ContractController) GetListBySeal() {
 		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")
-	condition := ""
+	condition := ` AND a.status = "已审批"`
 	pars := make([]interface{}, 0)
 	if keyword != "" {
-		condition += ` AND (company_name LIKE '%` + keyword + `%') `
-	}
-	// 如果不是合规则只能查看自己的合同
-	if this.SysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_COMPLIANCE {
-		condition += ` AND seller_id = ? `
-		pars = append(pars, this.SysUser.AdminId)
+		kw := fmt.Sprint("%", keyword, "%")
+		condition += ` AND (a.company_name LIKE ?) `
+		pars = append(pars, kw)
 	}
 
-	list, err := contract.GetSearchListBySeal(condition, pars)
-	if err != nil {
+	// 13.6正式共享客户
+	joinStr := ` LEFT JOIN company 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 = ?))`
+		pars = append(pars, sysUser.AdminId, sysUser.AdminId)
+	}
+	list, e := contract.GetContractList(condition, joinStr, pars, 0, 100)
+	if e != nil {
 		br.Msg = "获取失败"
-		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		br.ErrMsg = "获取合同列表失败, Err:" + e.Error()
 		return
 	}
+	//list, err := contract.GetSearchListBySeal(condition, pars)
+	//if err != nil {
+	//	br.Msg = "获取失败"
+	//	br.ErrMsg = "获取数据失败,Err:" + err.Error()
+	//	return
+	//}
 
 	newList := make([]response.ContractListBySealResp, 0)
 	if len(list) > 0 {

+ 60 - 4
controllers/cygx/activity.go

@@ -9,6 +9,7 @@ import (
 	"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"
 	"strconv"
 	"strings"
@@ -88,6 +89,16 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 		br.Msg = "内容不可为空"
 		return
 	}
+	//不限制人数的,强制改为全部客户可见
+	if req.LimitPeopleNum == 0 {
+		req.VisibleRange = 2
+		req.IsMakerShow = 0
+		req.Scale = ""
+		req.CustomerTypeIds = ""
+	}
+	if req.IsResearchPoints == 0 {
+		req.SiginupDeadline = ""
+	}
 	activityId := req.ActivityId
 	labelType := req.LabelType
 	labelList := req.List
@@ -103,7 +114,7 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 	industrialSubjectIdS := req.IndustrialSubjectIdS
 	body := req.Body
 	customerTypeIds := req.CustomerTypeIds
-	//不限制人数的,强制改为全部客户可见
+
 	if req.VisibleRange != 1 {
 		req.VisibleRange = 2
 	}
@@ -423,6 +434,7 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 			item.LastUpdatedTime = time.Now()
 			item.Scale = scale
 			item.IsExternalLabel = isExternalLabel
+			item.IsAllCustomerType = req.IsAllCustomerType
 			if len(labelList) == 1 {
 				item.IsCanAppointmentMinutes = labelList[0].IsCanAppointmentMinutes
 			} else {
@@ -662,10 +674,12 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 				//更新活动音频
 				if int(voiceIdNew) > 0 {
 					go cygxService.UpdateResourceData(int(voiceIdNew), "activityvoice", "add", activityInfo.ActivityTime)
+					go elastic.AddComprehensiveActivityVoice(activityId) //更新ES中的活动音频内容
 				}
 				//更新活动视频
 				if int(videoIdNew) > 0 {
 					go cygxService.UpdateResourceData(int(videoIdNew), "activityvideo", "add", activityInfo.ActivityTime)
+					go elastic.AddComprehensiveActivityVideo(activityId) //更新ES中的活动视频内容
 				}
 
 				errAct = err
@@ -694,6 +708,7 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 						go cygxService.DoActivityOnenIdWxTemplateMsg(activityId)
 					}
 				}
+
 				//已结束或者进行中的活动修改时间后,修改活动状态以及重新发送邮件附件
 				if activeState != 0 && activeState != 1 {
 					resultTime := utils.StrTimeToTime(item.ActivityTime) //时间字符串格式转时间格式
@@ -716,9 +731,10 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 				if activityInfo.ActivityName != item.ActivityName || activityInfo.SigninImg == "" {
 					go cygxService.MakeActivitySigninImg(req.ActivityId)
 				}
-				//如果活动之前是发布的状态,那么就对公司的扣点进行更新(涉及到新老公司的扣点返点,不放在Redis统一处理了)
+
 				if activityInfo.PublishStatus == 1 {
-					go cygxService.UpdateYanXuanActivityPointsBillOldComapny(activityInfo, AdminUser.AdminId, itemPointsSet, itemPointsSetOld) //活动发布以及取消发布处理研选扣点
+					go cygxService.UpdateYanXuanActivityPointsBillOldComapny(activityInfo, AdminUser.AdminId, itemPointsSet, itemPointsSetOld) //活动发布以及取消发布处理研选扣点,如果活动之前是发布的状态,那么就对公司的扣点进行更新(涉及到新老公司的扣点返点,不放在Redis统一处理了)
+					go elastic.AddComprehensiveActivity(item.ActivityId)                                                                       // Es添加活动
 				}
 
 				//如果活动之前是未发布的状态,现在又发布了那么就对公司的扣点进行更新
@@ -750,6 +766,7 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 				go cygxService.UpdateResourceData(v, "activity", "add", time.Now().Format(utils.FormatDateTime))
 				go cygxService.YiDongSaveRoadshowDetail(v)
 				go cygxService.YanXuanActivityPointsBillActivityPublishAndCancel(v, AdminUser.AdminId, 1) //活动发布以及取消发布处理研选扣点
+				go elastic.AddComprehensiveActivity(v)                                                    // Es添加活动
 			}
 			go cygxService.MakeActivitySigninImg(v)
 		}
@@ -1101,6 +1118,9 @@ func (this *ActivityCoAntroller) Detail() {
 		return
 	}
 	if PointsSetDetail != nil {
+		if PointsSetDetail.CancelDeadlineType == "0" {
+			PointsSetDetail.CancelDeadlineType = ""
+		}
 		activityInfo.PointsSet = PointsSetDetail
 	} else {
 		activityInfo.PointsSet = new(cygx.CygxActivityPointsSetRsq)
@@ -1109,7 +1129,7 @@ func (this *ActivityCoAntroller) Detail() {
 	if activityInfo.VisibleRange == 0 {
 		activityInfo.VisibleRange = 2
 	}
-
+	//activityInfo.CancelDeadlineType = cygxService.ActivityCancelDeadlineType(activityInfo) //处理活动取消报名截止时间类型展示
 	activityInfo.VoiceList = VoiceReqList
 	activityInfo.VideoDetail = VideoDetail
 	activityInfo.ShowType = detail.ShowType
@@ -1213,6 +1233,8 @@ func (this *ActivityCoAntroller) PublishAndCancel() {
 		go cygxService.YiDongUpdateActivityPublish(activityId)
 	}
 	go cygxService.YanXuanActivityPointsBillActivityPublishAndCancel(activityId, AdminUser.AdminId, item.PublishStatus) //活动发布以及取消发布处理研选扣点
+
+	go elastic.AddComprehensiveActivity(activityId) // Es添加活动
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"
@@ -1398,3 +1420,37 @@ func (this *ActivityCoAntroller) CompanySearch() {
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// @Title 报名截止时间设置
+// @Description 报名截止时间设置接口
+// @Success Ret=200
+// @router /activity/deadlineSet [get]
+func (this *ActivityCoAntroller) DeadlineSet() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	AdminUser := this.SysUser
+	if AdminUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		return
+	}
+	list := make([]cygx.SendGroupStr, 0)
+	list = append(list, cygx.SendGroupStr{
+		Id:   "1",
+		Name: "同报名截止时间",
+	})
+	list = append(list, cygx.SendGroupStr{
+		Id:   "2",
+		Name: "活动开始前24小时",
+	})
+	list = append(list, cygx.SendGroupStr{
+		Id:   "3",
+		Name: "活动开始前48小时",
+	})
+	br.Ret = 200
+	br.Success = true
+	br.Data = list
+}

+ 12 - 11
controllers/cygx/activity_meet.go

@@ -341,17 +341,18 @@ func (this *ActivityMeetCoAntroller) MeetingDo() {
 		br.ErrMsg = "操作失败,Err:" + errInfo.Error()
 		return
 	}
-	//校验活动后台管理员、销售是否有修改权限
-	havePower, popupMsg, err := cygxService.CheckActivityUpdatePower(AdminUser.AdminId, activityInfo)
-	if err != nil {
-		br.Msg = "获取管理员身份信息失败"
-		br.ErrMsg = "获取管理员身份信息失败,Err:" + err.Error()
-		return
-	}
-	if !havePower {
-		br.Msg = popupMsg
-		return
-	}
+	//校验活动后台管理员、销售是否有修改权限 校验需求取消 2023-7-10
+	//havePower, popupMsg, err := cygxService.CheckActivityUpdatePower(AdminUser.AdminId, activityInfo)
+	//if err != nil {
+	//	br.Msg = "获取管理员身份信息失败"
+	//	br.ErrMsg = "获取管理员身份信息失败,Err:" + err.Error()
+	//	return
+	//}
+	//if !havePower {
+	//	br.Msg = popupMsg
+	//	return
+	//}
+
 	noMeetingUids, err := cygx.GetSignupUserIds(activityId, meetingUids) //未到会的用户ID
 	if err != nil {
 		br.Msg = "获取信息失败"

+ 40 - 30
controllers/cygx/activity_signup.go

@@ -296,13 +296,13 @@ func (this *ActivitySignupCoAntroller) AppointmentList() {
 	}
 	for k, v := range list {
 		//公司调研电话会的活动,研选扣点的展示自主拨入,非扣点的展示预约外呼
-		if activityInfo.ActivityTypeId == 3 {
-			if activityInfo.IsResearchPoints == 1 {
-				v.SignupType = 2
-			} else {
-				v.SignupType = 1
-			}
-		}
+		//if activityInfo.ActivityTypeId == 3 {
+		//	if activityInfo.IsResearchPoints == 1 {
+		//		v.SignupType = 2
+		//	} else {
+		//		v.SignupType = 1
+		//	}
+		//}
 		list[k].SellerName = v.PsellerName
 	}
 	respList := new(cygx.GetAppointmentListRep)
@@ -1362,28 +1362,28 @@ func (this *ActivitySignupCoAntroller) SignupFailExport() {
 	sqlStrOther := sqlStr
 	var listReminder []*cygx.CygxAppointmentList
 	var summaryList []*cygx.CygxAppointmentList
-	if activityInfo.ActivityTypeId == 1 || activityInfo.ActivityTypeId == 2 {
-		var err error
-		//消息提醒
-		listReminder, err = cygx.GetCygxActivityMeetingReminderList(activityId, sqlStrOther)
-		if err != nil {
-			br.Msg = "获取失败"
-			br.ErrMsg = "获取失败,Err:" + err.Error()
-			return
-		}
-		//预约纪要
-		summaryList, err = cygx.GetCygxAppointmentSummaryList(activityId, sqlStrOther)
-		if err != nil {
-			br.Msg = "获取失败"
-			br.ErrMsg = "获取失败,Err:" + err.Error()
-			return
-		}
-		if excelType == 1 {
-			sqlStr += ` AND  s.signup_type = 1 `
-		} else if excelType == 2 {
-			sqlStr += ` AND  s.signup_type IN (2,4) `
-		}
+
+	var err error
+	//消息提醒
+	listReminder, err = cygx.GetCygxActivityMeetingReminderList(activityId, sqlStrOther)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	//预约纪要
+	summaryList, err = cygx.GetCygxAppointmentSummaryList(activityId, sqlStrOther)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
 	}
+	if excelType == 1 {
+		sqlStr += ` AND  s.signup_type = 1 `
+	} else if excelType == 2 {
+		sqlStr += ` AND  s.signup_type IN (2,4) `
+	}
+	//}
 	list, err := cygx.GetCygxAppointmentList(activityId, sqlStr)
 	if err != nil {
 		br.Msg = "获取失败"
@@ -1928,9 +1928,9 @@ func (this *ActivitySignupCoAntroller) AddSignuUser() {
 	if len(itemsSendWxMsg) > 0 {
 		go cygxService.SendWxMsgWithCygxActivitySignUpBySell(itemsSendWxMsg)
 	}
-	if len(itemsAppointment) > 0 {
+	if len(items) > 0 {
 		//1用户报名添加到处理研选扣点
-		for _, v := range itemsAppointment {
+		for _, v := range items {
 			go cygxService.YanXuanActivityPointsBillSignupAdd(v.ActivityId, v.UserId, adminInfo.AdminId)
 		}
 	}
@@ -2284,9 +2284,19 @@ func (this *ActivitySignupCoAntroller) SignupCancel() {
 			resultTime := utils.StrTimeToTime(activityInfo.ActivityTime) //时间字符串格式转时间格式
 			if time.Now().After(resultTime.Add(-time.Minute * 60)) {
 				br.Msg = "报名名单已发送至办会平台,请联系相关人员处理。"
+				br.ErrMsg = fmt.Sprint("UserId:", detail.UserId, "ActivityId:", detail.ActivityId)
 				return
 			}
 		}
+		//取消报名截止时间校验
+		//if activityInfo.CancelDeadline != utils.EmptyDateTimeStr {
+		//	cancelDeadline := utils.StrTimeToTime(activityInfo.CancelDeadline) //时间字符串格式转时间格式
+		//	if time.Now().After(cancelDeadline) {
+		//		br.Msg = "当前时间晚于取消报名截止时间,已无法取消报名。"
+		//		br.ErrMsg = fmt.Sprint("UserId:", detail.UserId, "ActivityId:", detail.ActivityId)
+		//		return
+		//	}
+		//}
 	}
 	_, err = cygx.CancelActivitySignup(detail)
 	if err != nil {

+ 105 - 7
controllers/cygx/activity_special.go

@@ -10,6 +10,7 @@ import (
 	"hongze/hz_crm_api/models/system"
 	"hongze/hz_crm_api/services"
 	cygxService "hongze/hz_crm_api/services/cygx"
+	"hongze/hz_crm_api/services/elastic"
 	"hongze/hz_crm_api/utils"
 	"os"
 	"path/filepath"
@@ -276,6 +277,7 @@ func (this *ActivitySpecialCoAntroller) PreserveAndPublish() {
 		go services.SendWxMsgWithCygxActivitySpecial(activityId)
 		go cygxService.UpdateResourceData(activityId, "activityspecial", "add", time.Now().Format(utils.FormatDateTime))
 	}
+	go elastic.AddComprehensiveActivitySpecial(activityId) // Es添加活动
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"
@@ -536,6 +538,7 @@ func (this *ActivitySpecialCoAntroller) PublishAndCancel() {
 		go cygxService.DetermineTripCancel(activityId)
 		go cygxService.UpdateResourceData(activityId, "activityspecial", "delete", time.Now().Format(utils.FormatDateTime))
 	}
+	go elastic.AddComprehensiveActivitySpecial(activityId) // Es添加活动
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"
@@ -1094,6 +1097,7 @@ func (this *ActivitySpecialCoAntroller) TripPreserveAndPublish() {
 			cygxService.DetermineTripChange(activityId, "dateList", changeMsg)
 		}
 	}
+	go elastic.AddComprehensiveActivitySpecial(activityId) // Es添加活动
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"
@@ -1167,13 +1171,6 @@ func (this *ActivitySpecialCoAntroller) Offline() {
 		br.ErrMsg = "操作失败,Err:" + err.Error()
 		return
 	}
-	//item.ActivityId = req.ActivityId
-	//err = cygx.EditActivitySpecialIsOffline(item)
-	//if err != nil {
-	//	br.Msg = "操作失败"
-	//	br.ErrMsg = "操作失败,Err:" + err.Error()
-	//	return
-	//}
 	//模板消息推送
 	if item.PublishStatus == 1 {
 		go cygxService.UpdateResourceData(activityId, "activityspecial", "add", time.Now().Format(utils.FormatDateTime))
@@ -1181,8 +1178,109 @@ func (this *ActivitySpecialCoAntroller) Offline() {
 	} else {
 		go cygxService.UpdateResourceData(activityId, "activityspecial", "delete", time.Now().Format(utils.FormatDateTime))
 	}
+	go elastic.AddComprehensiveActivitySpecial(activityId) // Es添加活动
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"
 	br.IsAddLog = true
 }
+
+// @Title 发送模版消息
+// @Description 发送模版消息接口
+// @Param	request	body cygx.AddOutboundPersonnelItm true "type json string"
+// @Success 200 操作成功
+// @router /special/trip/tempMsg [post]
+func (this *ActivitySpecialTripCoAntroller) TempMsg() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	AdminUser := this.SysUser
+	if AdminUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		return
+	}
+	var req cygx.ActivitySpecialSignupTempMsgReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	idSlice := strings.Split(req.ActivityIds, ",")
+	for _, sId := range idSlice {
+		id, e := strconv.Atoi(sId)
+		if e != nil {
+			br.Msg = "活动Id参数异常"
+			br.ErrMsg = "参数解析异常, Err:" + e.Error()
+			return
+		}
+		var openIdList []*models.OpenIdList
+		idMap := make(map[string]string, 0)
+		//1已报名
+		if strings.Contains(req.SendGroup, "1") {
+			listSignup, err := cygx.GetCygxActivitySpecialTripListByActivityId(id)
+			if err != nil {
+				br.Msg = "查询报名信息失败失败"
+				br.ErrMsg = "GetCygxActivitySpecialTripListByActivityId,Err:" + err.Error()
+				return
+			}
+			if len(listSignup) == 0 {
+				continue
+			}
+			var mobileArr []string
+			for _, v := range listSignup {
+				if v.Mobile != "" {
+					mobileArr = append(mobileArr, v.Mobile)
+				}
+			}
+			mobileLen := len(mobileArr)
+			var condition string
+			var pars []interface{}
+			if mobileLen > 0 {
+				condition += ` AND u.mobile IN (` + utils.GetOrmInReplace(mobileLen) + `)`
+				pars = append(pars, mobileArr)
+			}
+			list, err := models.GetActivitySpecialOpenIdListMobile(condition, pars)
+			if err != nil {
+				br.Msg = "查询openId失败"
+				br.ErrMsg = "查询openId失败,Err:" + err.Error()
+				return
+			}
+			for _, idList := range list {
+				openIdList = append(openIdList, idList)
+				idMap[idList.OpenId] = idList.OpenId
+			}
+		}
+
+		if len(openIdList) > 0 {
+			openIdArr := make([]string, len(openIdList))
+			for i, v := range openIdList {
+				openIdArr[i] = v.OpenId
+			}
+			sendInfo := new(services.SendWxTemplate)
+			sendInfo.Keyword1 = req.ResearchTheme
+			sendInfo.Keyword2 = req.Content
+			sendInfo.TemplateId = utils.WxMsgTemplateIdActivityChangeApplyXzs
+			sendInfo.RedirectUrl = utils.WX_MSG_PATH_ACTIVITY_SPECIAL_DETAIL + strconv.Itoa(id)
+			if utils.RunMode == "debug" {
+				sendInfo.RedirectUrl = utils.WX_MSG_PATH_ACTIVITY_SPECIAL_DETAIL + strconv.Itoa(110) //测试环境调正式的ID
+			}
+			sendInfo.RedirectTarget = 3
+			sendInfo.Resource = strconv.Itoa(id)
+			sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_CUSTOMIZE
+			sendInfo.OpenIdArr = openIdArr
+			e = services.SendTemplateMsg(sendInfo)
+			if e != nil {
+				br.Msg = "推送模板消息失败!"
+				br.ErrMsg = "参数解析失败,Err:" + e.Error()
+				return
+			}
+		}
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "发送成功"
+}

+ 103 - 9
controllers/cygx/activity_special_trip.go

@@ -48,6 +48,7 @@ func (this *ActivitySpecialTripCoAntroller) AddUser() {
 	}
 	var items []*cygx.CygxActivitySpecialTrip
 	var itemsBill []*cygx.CygxActivitySpecialTripBill
+	var itemsMeet []*cygx.CygxActivitySpecialMeetingDetail
 	activityIds := req.ActivityIds
 	uidList := req.List
 	if activityIds == "" {
@@ -119,14 +120,13 @@ func (this *ActivitySpecialTripCoAntroller) AddUser() {
 				br.ErrMsg = "获取失败,Err:" + errtotal.Error()
 				return
 			}
+			infoUser, err := cygx.GetUserAndCompanyNameList(uid)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取数据失败,Err:" + err.Error()
+				return
+			}
 			if total == 0 {
-				infoUser, err := cygx.GetUserAndCompanyNameList(uid)
-				if err != nil {
-					br.Msg = "获取失败"
-					br.ErrMsg = "获取数据失败,Err:" + err.Error()
-					return
-				}
-
 				//流水记录表
 				itemBill := new(cygx.CygxActivitySpecialTripBill)
 				itemBill.UserId = infoUser.UserId
@@ -176,9 +176,20 @@ func (this *ActivitySpecialTripCoAntroller) AddUser() {
 				items = append(items, item)
 				itemsBill = append(itemsBill, itemBill)
 			}
+
+			var itemMeeting = new(cygx.CygxActivitySpecialMeetingDetail)
+			itemMeeting.UserId = v.UserId
+			itemMeeting.ActivityId = activityId
+			itemMeeting.CreateTime = time.Now()
+			itemMeeting.Mobile = infoUser.Mobile
+			itemMeeting.Email = infoUser.Email
+			itemMeeting.CompanyId = infoUser.CompanyId
+			itemMeeting.CompanyName = infoUser.CompanyName
+			itemMeeting.RealName = infoUser.RealName
+			itemsMeet = append(itemsMeet, itemMeeting)
 		}
 	}
-	err = cygx.AddCygxActivitySpecialTrip(items, itemsBill)
+	err = cygx.AddCygxActivitySpecialTrip(items, itemsBill, itemsMeet)
 	if err != nil {
 		br.Msg = "操作失败"
 		br.ErrMsg = "新增用户失败,Err:" + err.Error()
@@ -607,6 +618,7 @@ func (this *ActivitySpecialTripCoAntroller) MeetingDo() {
 		return
 	}
 	var userIdArr []int
+	var newMeetingUserid = make(map[int]bool) //新提交的到会的额用户ID
 	meetingUids := req.UserIds
 	if len(meetingUids) == 0 {
 		meetingUids = "0"
@@ -620,6 +632,7 @@ func (this *ActivitySpecialTripCoAntroller) MeetingDo() {
 				userId, _ := strconv.Atoi(v)
 				if userId > 0 {
 					userIdArr = append(userIdArr, userId)
+					newMeetingUserid[userId] = true
 				}
 			}
 		}
@@ -667,7 +680,66 @@ func (this *ActivitySpecialTripCoAntroller) MeetingDo() {
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
+
+	var condition string
+	var pars []interface{}
+	condition += " AND is_meeting = 1  AND  activity_id = ? "
+	pars = append(pars, activityId)
+	listOldMeetingDetail, err := cygx.GetCygxActivitySpecialMeetingDetailList(condition, pars)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取失败"
+		br.ErrMsg = "GetCygxActivitySpecialMeetingDetailList,Err:" + err.Error()
+		return
+	}
+	//获取之前已经到会的人
+	//var oldMeetingUserid = make(map[int]bool)
+
+	pars = make([]interface{}, 0)
+	condition = "  AND  activity_id = ? "
+	pars = append(pars, activityId)
+	listTripBill, err := cygx.GetCygxActivitySpecialTripBill(condition, pars)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取失败"
+		br.ErrMsg = "GetCygxActivitySpecialTripBill,Err:" + err.Error()
+		return
+	}
+	//获取用户最后一次的扣点状态
+	mapUserLastTripBill := make(map[int]*cygx.CygxActivitySpecialTripBill)
+	for _, v := range listTripBill {
+		mapUserLastTripBill[v.UserId] = v
+	}
+
 	var items []*cygx.CygxActivitySpecialMeetingDetail
+	var itemsBill []*cygx.CygxActivitySpecialTripBill
+	if len(listOldMeetingDetail) > 0 {
+		for _, v := range listOldMeetingDetail {
+			if mapUserLastTripBill[v.UserId] == nil {
+				continue
+			}
+			//如果上一次空降的用户,这一次提交的时候没有带入,而且还被扣点了,那么就进行返点处理
+			if !newMeetingUserid[v.UserId] && v.IsAirborne == 1 && mapUserLastTripBill[v.UserId].BillDetailed < 0 {
+				var itemBill = new(cygx.CygxActivitySpecialTripBill)
+				//流水记录表
+				itemBill.UserId = v.UserId
+				itemBill.ActivityId = activityInfo.ActivityId
+				itemBill.CreateTime = time.Now()
+				itemBill.Mobile = v.Mobile
+				itemBill.Email = v.Email
+				itemBill.CompanyId = v.CompanyId
+				itemBill.CompanyName = v.CompanyName
+				itemBill.RealName = v.RealName
+				itemBill.Source = 2
+				itemBill.DoType = 2
+				itemBill.BillDetailed = 1 // 流水加一
+				itemBill.RegisterPlatform = 1
+				itemBill.ChartPermissionId = activityInfo.ChartPermissionId
+				itemBill.AdminId = AdminUser.AdminId
+				itemBill.Way = 2
+				itemsBill = append(itemsBill, itemBill)
+			}
+		}
+	}
+
 	for _, v := range listUser {
 		var item = new(cygx.CygxActivitySpecialMeetingDetail)
 		item.UserId = v.UserId
@@ -678,13 +750,35 @@ func (this *ActivitySpecialTripCoAntroller) MeetingDo() {
 		item.CompanyId = v.CompanyId
 		item.CompanyName = v.CompanyName
 		item.IsMeeting = 1
+		item.RealName = v.RealName
 		//添加空降人员字段
 		if _, ok := UserMap[v.UserId]; !ok {
 			item.IsAirborne = 1
 		}
+		var itemBill = new(cygx.CygxActivitySpecialTripBill)
+		//如果是空降客户,(没有扣点记录,或者上一次的流水不为负) 就进行扣点处理
+		if item.IsAirborne == 1 && (mapUserLastTripBill[v.UserId] == nil || mapUserLastTripBill[v.UserId].BillDetailed >= 0) {
+			//流水记录表
+			itemBill.UserId = v.UserId
+			itemBill.ActivityId = activityInfo.ActivityId
+			itemBill.CreateTime = time.Now()
+			itemBill.Mobile = v.Mobile
+			itemBill.Email = v.Email
+			itemBill.CompanyId = v.CompanyId
+			itemBill.CompanyName = v.CompanyName
+			itemBill.RealName = v.RealName
+			itemBill.Source = 2
+			itemBill.DoType = 1
+			itemBill.BillDetailed = -1 // 流水减一
+			itemBill.RegisterPlatform = 1
+			itemBill.ChartPermissionId = activityInfo.ChartPermissionId
+			itemBill.AdminId = AdminUser.AdminId
+			itemBill.Way = 2
+			itemsBill = append(itemsBill, itemBill)
+		}
 		items = append(items, item)
 	}
-	err = cygx.MeetingDopecialMeet(meetingUids, noMeetingUids, activityId, items)
+	err = cygx.MeetingDopecialMeet(meetingUids, noMeetingUids, activityId, items, itemsBill)
 	if err != nil {
 		br.Msg = "操作失败"
 		br.ErrMsg = "操作失败,Err:" + err.Error()

+ 5 - 1
controllers/cygx/micro_roadshow.go

@@ -8,6 +8,7 @@ import (
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/cygx"
 	cygxService "hongze/hz_crm_api/services/cygx"
+	"hongze/hz_crm_api/services/elastic"
 	"hongze/hz_crm_api/utils"
 	"os"
 	"path/filepath"
@@ -276,6 +277,7 @@ func (this *MicroRoadshowController) Add() {
 		}
 
 		go cygxService.UpdateResourceData(req.VideoId, "roadshow", "update", publishDate.Format(utils.FormatDateTime))
+		go elastic.AddComprehensiveRoadshow(req.VideoId) //Es添加微路演
 		br.Ret = 200
 		br.Success = true
 		br.Msg = "编辑成功"
@@ -319,6 +321,7 @@ func (this *MicroRoadshowController) Add() {
 		if req.PublishOrSave == 1 {
 			go cygxService.SendWxMsgWithCygxMicroRoadshowVideo(int(newId))
 			go cygxService.UpdateResourceData(int(newId), "roadshow", "add", publishDate.Format(utils.FormatDateTime))
+			go elastic.AddComprehensiveRoadshow(req.VideoId) //Es添加微路演
 		}
 
 		br.Ret = 200
@@ -389,7 +392,7 @@ func (this *MicroRoadshowController) Edit() {
 		br.ErrMsg = "编辑失败,Err:" + err.Error()
 		return
 	}
-
+	go elastic.AddComprehensiveRoadshow(req.VideoId) //Es添加微路演
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "编辑成功"
@@ -444,6 +447,7 @@ func (this *MicroRoadshowController) PublishCancel() {
 		go cygxService.UpdateResourceData(int(videoId), "roadshow", "add", videoInfo.PublishDate.Format(utils.FormatDateTime))
 		br.Msg = "发布成功"
 	}
+	go elastic.AddComprehensiveRoadshow(videoId) //Es添加微路演
 }
 
 // @Title 视频详情

+ 15 - 8
controllers/cygx/morning_meeting_review.go

@@ -9,6 +9,7 @@ import (
 	"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"
 	"strconv"
 	"strings"
@@ -240,6 +241,7 @@ func (this *MorningMeetingController) PreserveAndPublish() {
 			}
 			for _, itemchapter := range listchapter {
 				go cygxService.UpdateResourceData(itemchapter.Id, "meetingreviewchapt", "add", time.Now().Format(utils.FormatDateTime))
+				go elastic.AddComprehensiveMeetingreviewchapt(itemchapter.Id) //Es添加晨会精华
 			}
 			br.Msg = "发布成功"
 			br.Data = meetingId
@@ -299,6 +301,7 @@ func (this *MorningMeetingController) PreserveAndPublish() {
 						br.ErrMsg = "删除章节失败,Err:" + err.Error()
 						return
 					}
+					go elastic.DeleteComprehensiveMeetingreviewchapt(item.Id) //Es删除晨会精华
 				}
 			}
 		}
@@ -378,7 +381,16 @@ func (this *MorningMeetingController) PreserveAndPublish() {
 			industryIds = append(industryIds, item.IndustryId)
 			go cygxService.UpdateIndustryLayoutTime(industryIds, false)
 		}
-
+		//添加到首页最新
+		listchapter, err := cygx.GetCygxMorningMeetingReviewsListById(reqList.MeetingId)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取数据失败,Err:" + err.Error()
+			return
+		}
+		for _, itemchapter := range listchapter {
+			go elastic.AddComprehensiveMeetingreviewchapt(itemchapter.Id) //Es添加晨会精华
+		}
 		br.Ret = 200
 		br.Success = true
 		if reqList.DoType == 0 {
@@ -387,13 +399,6 @@ func (this *MorningMeetingController) PreserveAndPublish() {
 			for _, item := range reqList.List {
 				go services.SendWxMsgWithCygxMorningMeeting(reqList.MeetingId, item.IndustryId, item.IndustryName)
 			}
-			//添加到首页最新
-			listchapter, err := cygx.GetCygxMorningMeetingReviewsListById(reqList.MeetingId)
-			if err != nil {
-				br.Msg = "获取失败"
-				br.ErrMsg = "获取数据失败,Err:" + err.Error()
-				return
-			}
 			for _, itemchapter := range listchapter {
 				go cygxService.UpdateResourceData(itemchapter.Id, "meetingreviewchapt", "add", time.Now().Format(utils.FormatDateTime))
 			}
@@ -549,6 +554,7 @@ func (this *MorningMeetingController) PublishReport() {
 		for _, item := range list {
 			go services.SendWxMsgWithCygxMorningMeeting(vint, item.IndustryId, item.IndustryName)
 			go cygxService.UpdateResourceData(item.Id, "meetingreviewchapt", "add", time.Now().Format(utils.FormatDateTime))
+			go elastic.AddComprehensiveMeetingreviewchapt(item.Id) //Es添加晨会精华
 		}
 	}
 
@@ -595,6 +601,7 @@ func (this *MorningMeetingController) PublishCancleReport() {
 	}
 	for _, item := range list {
 		go cygxService.UpdateResourceData(item.Id, "meetingreviewchapt", "delete", time.Now().Format(utils.FormatDateTime))
+		go elastic.DeleteComprehensiveMeetingreviewchapt(item.Id) //Es删除晨会精华
 	}
 	var condition string
 	var pars []interface{}

+ 13 - 13
controllers/cygx/report_selection.go

@@ -317,7 +317,19 @@ func (this *ReportSelectionController) Detail() {
 	listMore, err := cygx.GetChartPermissionDetail(condition)
 	var list []*cygx.CygxReportSelectionChart
 	//排序方式修改
-	permissionNameList := []cygx.CygxChartPermissionName{{ChartPermissionName: "消费"}, {ChartPermissionName: "医药"}, {ChartPermissionName: "科技"}, {ChartPermissionName: "智造"}}
+	permissionNameList := []cygx.CygxChartPermissionName{}
+	//获取行业核心逻辑汇总
+	listChartLog, err := cygx.GetCygxReportSelectionChartLogRepList(articleId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	mapChartLog := make(map[string]string)
+	for _, v := range listChartLog {
+		mapChartLog[v.ChartPermissionName] = v.BodyChartSummary
+		permissionNameList = append(permissionNameList, cygx.CygxChartPermissionName{v.ChartPermissionName})
+	}
 	for _, v := range permissionNameList {
 		for _, v2 := range listMore {
 			if v.ChartPermissionName == v2.ChartPermissionName {
@@ -335,18 +347,6 @@ func (this *ReportSelectionController) Detail() {
 		return
 	}
 
-	//获取行业核心逻辑汇总
-	listChartLog, err := cygx.GetCygxReportSelectionChartLogRepList(articleId)
-	if err != nil {
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取失败,Err:" + err.Error()
-		return
-	}
-	mapChartLog := make(map[string]string)
-	for _, v := range listChartLog {
-		mapChartLog[v.ChartPermissionName] = v.BodyChartSummary
-	}
-
 	//获取关联的文章信息
 	mapArticle := make(map[int]string)
 	listSelectionLog, err := cygx.GetReportSelectionlogListAll(articleId)

+ 6 - 5
controllers/cygx/summary_manage.go

@@ -11,6 +11,7 @@ import (
 	"hongze/hz_crm_api/models/system"
 	"hongze/hz_crm_api/services"
 	cygxService "hongze/hz_crm_api/services/cygx"
+	"hongze/hz_crm_api/services/elastic"
 	"hongze/hz_crm_api/utils"
 	"os"
 	"path/filepath"
@@ -259,7 +260,6 @@ func (this *SummaryManage) PreserveAndPublish() {
 			//articleInfo, err := cygx.GetArticleIdInfoBySummaryManageIdEdit(int(artNewId))
 			if err == nil && req.DoType == 1 {
 				go cygxService.DoArticleOnenIdWxTemplateMsg(articleIdNew, 1)
-
 			}
 		}
 	} else {
@@ -311,11 +311,11 @@ func (this *SummaryManage) PreserveAndPublish() {
 		}
 	}
 
-	// 查研观向7.4-更新产业布局时间
 	if len(industryIds) > 0 {
-		go cygxService.UpdateIndustryLayoutTime(industryIds, false)
+		go cygxService.UpdateIndustryLayoutTime(industryIds, false)       // 查研观向7.4-更新产业布局时间
+		go elastic.AddComprehensiveIndustrialSource("Yx", item.ArticleId) // 查研观向10.6 更新搜索引擎的产业资源包
 	}
-
+	go elastic.AddComprehensiveArticle(item.ArticleId) // ES添加文章:报告、纪要
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"
@@ -400,9 +400,10 @@ func (this *SummaryManage) PublishAndCancel() {
 			if articleIndustrial.ArticleId > 0 {
 				go cygxService.DoArticleOnenIdWxTemplateMsg(articleId, 1)
 			}
+			go elastic.AddComprehensiveIndustrialSource("Yx", item.ArticleId) // 查研观向10.6 更新搜索引擎的产业资源包
 		}
 	}
-
+	go elastic.AddComprehensiveArticle(articleId) // ES添加文章:报告、纪要
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"

+ 80 - 6
controllers/cygx/user.go

@@ -619,8 +619,10 @@ func (this *UserController) TableList() {
 		{PermissionName: "关注的产业", Source: 5, TotalNum: countDetail.IndustryFllowNum},
 		{PermissionName: "关注的作者", Source: 6, TotalNum: countDetail.DepartmentFollowNum},
 		{PermissionName: "搜索", Source: 7, TotalNum: countDetail.KeyWordNum},
-		{PermissionName: "音视频播放", Source: 9, TotalNum: countDetail.RoadshowVideoNum + countDetail.ActivityVideoNum + countDetail.ActivityVoiceNum}}
-	resp := new(cygx.CygxUserTableListRep)
+		{PermissionName: "音视频播放", Source: 9, TotalNum: countDetail.RoadshowVideoNum + countDetail.ActivityVideoNum + countDetail.ActivityVoiceNum},
+		{PermissionName: "首页标签点击", Source: 10, TotalNum: countDetail.TagNum}}
+
+resp := new(cygx.CygxUserTableListRep)
 	resp.List = List
 	resp.UserName = wxUser.RealName
 	resp.Mobile = wxUser.Mobile
@@ -696,7 +698,16 @@ func (this *UserController) TableDetail() {
 	var NoMeetingNum int
 	var list []*cygx.UserInteraction
 
-	listTable := []*cygx.CygxUserTableRep{{PermissionName: "报告阅读列表", Source: 1, TotalNum: 10}, {PermissionName: "活动互动记录", Source: 2, TotalNum: 10}, {PermissionName: "收藏的报告", Source: 3, TotalNum: 10}, {PermissionName: "收藏图表", Source: 4, TotalNum: 10}, {PermissionName: "关注的产业", Source: 5, TotalNum: 10}, {PermissionName: "关注的作者", Source: 6, TotalNum: 10}, {PermissionName: "搜索", Source: 7, TotalNum: 10}, {PermissionName: "专项调研", Source: 8, TotalNum: 10}, {PermissionName: "音视频播放", Source: 9, TotalNum: 10}}
+	listTable := []*cygx.CygxUserTableRep{{PermissionName: "报告阅读列表", Source: 1, TotalNum: 10},
+		{PermissionName: "活动互动记录", Source: 2, TotalNum: 10},
+		{PermissionName: "收藏的报告", Source: 3, TotalNum: 10},
+		{PermissionName: "收藏图表", Source: 4, TotalNum: 10},
+		{PermissionName: "关注的产业", Source: 5, TotalNum: 10},
+		{PermissionName: "关注的作者", Source: 6, TotalNum: 10},
+		{PermissionName: "搜索", Source: 7, TotalNum: 10},
+		{PermissionName: "专项调研", Source: 8, TotalNum: 10},
+		{PermissionName: "音视频播放", Source: 9, TotalNum: 10},
+		{PermissionName: "首页标签点击", Source: 10, TotalNum: 10}}
 	for _, v := range listTable {
 		if v.Source == source {
 			checkSource = true
@@ -973,6 +984,19 @@ func (this *UserController) TableDetail() {
 			br.Msg = "获取搜索记录列表失败"
 			return
 		}
+	} else if source == 10 { //标签点击记录
+		total, err = cygx.GetCygxTagHistoryCountByUserId(userId)
+		if err != nil {
+			br.ErrMsg = "获取信息失败,Err:" + err.Error()
+			br.Msg = "获取搜索记录失败"
+			return
+		}
+		list, err = cygx.GetCygxTagHistoryByUserId(userId, startSize, pageSize)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.ErrMsg = "获取信息失败,Err:" + err.Error()
+			br.Msg = "获取搜索记录列表失败"
+			return
+		}
 	}
 	page := paging.GetPaging(currentIndex, pageSize, total)
 	resp := new(cygx.UserInteractionListResp)
@@ -1895,6 +1919,12 @@ func (this *UserController) CompanyTableList() {
 		br.ErrMsg = "获取搜索记录失败,Err:" + err.Error()
 		return
 	}
+	tagNum, err := cygx.GetCygxTagHistoryCountByCompanyId(companyId,"")
+	if err != nil {
+		br.ErrMsg = "获取信息失败,Err:" + err.Error()
+		br.Msg = "获取搜索记录失败"
+		return
+	}
 	List := []*cygx.CygxUserTableRep{{PermissionName: "报告阅读列表", Source: 1, TotalNum: historyNum},
 		{PermissionName: "活动互动记录", Source: 2, TotalNum: activityNum},
 		{PermissionName: "专项调研", Source: 8, TotalNum: triptotal},
@@ -1903,7 +1933,8 @@ func (this *UserController) CompanyTableList() {
 		{PermissionName: "关注的产业", Source: 5, TotalNum: industryFllowNum},
 		{PermissionName: "关注的作者", Source: 6, TotalNum: departmentFollowNum},
 		{PermissionName: "搜索", Source: 7, TotalNum: keyWordNum},
-		{PermissionName: "音视频播放", Source: 9, TotalNum: roadshowTotal}}
+		{PermissionName: "音视频播放", Source: 9, TotalNum: roadshowTotal},
+		{PermissionName: "首页标签点击", Source: 10, TotalNum: tagNum}}
 	resp := new(cygx.CygxUserTableListRep)
 	resp.List = List
 	resp.ComapnyName = comanyDetail.CompanyName
@@ -2296,6 +2327,23 @@ func (this *UserController) CompanyTableDetail() {
 			br.ErrMsg = "获取搜索记录列表失败,Err:" + err.Error()
 			return
 		}
+	} else if source == 10 { //标签点击记录
+		condition = ``
+		if keyWord != "" {
+			condition += ` AND  (a.mobile LIKE '%` + keyWord + `%' OR a.email LIKE '%` + keyWord + `%' OR a.real_name LIKE '%` + keyWord + `%'` + ` OR a.company_name LIKE '%` + keyWord + `%') `
+		}
+		total, err = cygx.GetCygxTagHistoryCountByCompanyId(companyId, condition)
+		if err != nil {
+			br.ErrMsg = "获取信息失败,Err:" + err.Error()
+			br.Msg = "获取搜索记录失败"
+			return
+		}
+		list, err = cygx.GetCygxTagHistoryByCompanyId(companyId, startSize, pageSize, condition)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.ErrMsg = "获取信息失败,Err:" + err.Error()
+			br.Msg = "获取搜索记录列表失败"
+			return
+		}
 	}
 
 	page := paging.GetPaging(currentIndex, pageSize, total)
@@ -3238,6 +3286,26 @@ func (this *UserController) CompanyList() {
 			br.ErrMsg = "获取搜索记录列表失败,Err:" + err.Error()
 			return
 		}
+	} else if source == 10 { //标签点击记录
+		condition = ``
+		if adminId != "" {
+			condition += ` AND p.seller_id IN (` + adminId + `) `
+		}
+		if keyWord != "" {
+			condition += ` AND  (a.mobile LIKE '%` + keyWord + `%' OR a.email LIKE '%` + keyWord + `%' OR a.real_name LIKE '%` + keyWord + `%'` + ` OR a.company_name LIKE '%` + keyWord + `%') `
+		}
+		total, err = cygx.GetCygxTagHistoryCountByCompanyIds(companyIds, condition)
+		if err != nil {
+			br.ErrMsg = "获取信息失败,Err:" + err.Error()
+			br.Msg = "获取搜索记录失败"
+			return
+		}
+		list, err = cygx.GetCygxTagHistoryByCompanyIds(companyIds, condition, startSize, pageSize)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.ErrMsg = "获取信息失败,Err:" + err.Error()
+			br.Msg = "获取搜索记录列表失败"
+			return
+		}
 	}
 	page := paging.GetPaging(currentIndex, pageSize, total)
 
@@ -4095,7 +4163,12 @@ func (this *UserController) TableCompanyList() {
 		br.ErrMsg = "获取搜索记录失败,Err:" + err.Error()
 		return
 	}
-
+	tagNum, err := cygx.GetCygxTagHistoryCountByCompanyIds(companyCondition,"")
+	if err != nil {
+		br.ErrMsg = "获取信息失败,Err:" + err.Error()
+		br.Msg = "获取搜索记录失败"
+		return
+	}
 	List := []*cygx.CygxUserTableRep{{PermissionName: "报告阅读列表", Source: 1, TotalNum: historyNum},
 		{PermissionName: "活动互动记录", Source: 2, TotalNum: activityNum},
 		{PermissionName: "专项调研", Source: 8, TotalNum: triptotal},
@@ -4104,7 +4177,8 @@ func (this *UserController) TableCompanyList() {
 		{PermissionName: "关注的产业", Source: 5, TotalNum: industryFllowNum},
 		{PermissionName: "关注的作者", Source: 6, TotalNum: departmentFollowNum},
 		{PermissionName: "搜索", Source: 7, TotalNum: keyWordNum},
-		{PermissionName: "音视频播放", Source: 9, TotalNum: roadshowTotal}}
+		{PermissionName: "音视频播放", Source: 9, TotalNum: roadshowTotal},
+		{PermissionName: "首页标签点击", Source: 10, TotalNum: tagNum}}
 	resp := new(cygx.CygxUserTableListRep)
 	resp.List = List
 	br.Ret = 200

+ 69 - 0
controllers/report.go

@@ -2,8 +2,14 @@ package controllers
 
 import (
 	"encoding/json"
+	"fmt"
+	"github.com/beego/beego/v2/server/web"
 	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/services"
+	"hongze/hz_crm_api/services/alarm_msg"
 	"hongze/hz_crm_api/utils"
+	"os"
+	"path"
 	"strings"
 	"time"
 )
@@ -13,6 +19,11 @@ type ReportController struct {
 	BaseAuthController
 }
 
+// 报告上传
+type ReportUploadCommonController struct {
+	web.Controller
+}
+
 // GetDayWeekReportChapterTypeList
 // @Title 获取晨报周报章节类型列表
 // @Description 获取晨报周报章节类型列表
@@ -311,3 +322,61 @@ func (this *ReportController) GetStopDayWeekReportChapterTypeList() {
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// @Title 图片上传
+// @Description 图片上传接口
+// @Param   File   query   file  true       "文件"
+// @Success 200 上传成功
+// @router /uploadImg [post]
+func (this *ReportUploadCommonController) UploadImg() {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println("文件上传失败:", err.Error())
+			go alarm_msg.SendAlarmMsg("URI:"+this.Ctx.Input.URI()+" 文件上传失败:"+err.Error(), 3)
+			//go utils.SendEmail(utils.APPNAME+"失败提醒", "URI:"+this.Ctx.Input.URI()+" 文件上传失败:"+err.Error(), utils.EmailSendToUsers)
+		}
+	}()
+	f, h, err := this.GetFile("file")
+	if err != nil {
+		return
+	}
+	ext := path.Ext(h.Filename)
+	dateDir := time.Now().Format("20060102")
+	uploadDir := utils.STATIC_DIR + "hongze/" + dateDir
+	err = os.MkdirAll(uploadDir, 777)
+	if err != nil {
+		return
+	}
+	randStr := utils.GetRandStringNoSpecialChar(28)
+	fileName := randStr + ext
+	fpath := uploadDir + "/" + fileName
+	defer f.Close() //关闭上传文件
+	err = this.SaveToFile("file", fpath)
+	if err != nil {
+		return
+	}
+	//上传到阿里云
+	resourceUrl, err := services.UploadAliyunV2(fileName, fpath)
+	if err != nil {
+		return
+	}
+
+	defer func() {
+		os.Remove(fpath)
+	}()
+
+	item := new(models.Resource)
+	item.ResourceUrl = resourceUrl
+	item.ResourceType = 1
+	item.CreateTime = time.Now()
+	newId, err := models.AddResource(item)
+	if err != nil {
+		return
+	}
+	resp := new(models.ResourceResp)
+	resp.Id = newId
+	resp.ResourceUrl = resourceUrl
+	this.Data["json"] = map[string]string{"link": resourceUrl}
+	this.ServeJSON()
+}

+ 37 - 0
controllers/sys_admin.go

@@ -536,6 +536,13 @@ func (this *SysAdminController) Add() {
 		br.ErrMsg = "新增失败,Err:" + err.Error()
 		return
 	}
+
+	// 同步用户缓存
+	var syncData system.SyncAdminData
+	syncData.Source = utils.SOURCE_CRM_FLAG
+	syncData.AdminName = admin.AdminName
+	_ = utils.Rc.LPush(utils.CACHE_SYNC_ADMIN, syncData)
+
 	//err = services.UpdateAdminResearchGroup(admin.AdminId, req.ResearchGroupIds)
 	err = services.UpdateResearcherTagGroup(admin.AdminId, req.ResearchGroupIds)
 	if err != nil {
@@ -761,6 +768,12 @@ func (this *SysAdminController) Edit() {
 		return
 	}
 
+	// 同步用户缓存
+	var syncData system.SyncAdminData
+	syncData.Source = utils.SOURCE_CRM_FLAG
+	syncData.AdminName = adminInfo.AdminName
+	_ = utils.Rc.LPush(utils.CACHE_SYNC_ADMIN, syncData)
+
 	// 用户登出
 	logOutSystemUser(adminInfo.AdminId)
 
@@ -827,6 +840,12 @@ func (this *SysAdminController) EditEnabled() {
 		}
 	}
 
+	// 同步用户缓存
+	var syncData system.SyncAdminData
+	syncData.Source = utils.SOURCE_CRM_FLAG
+	syncData.AdminName = adminItem.AdminName
+	_ = utils.Rc.LPush(utils.CACHE_SYNC_ADMIN, syncData)
+
 	//用户被禁用的情况下,需要将他对应的token给过期
 	if adminItem.Enabled == 1 && req.Enabled == 0 {
 		logOutSystemUser(adminItem.AdminId)
@@ -883,6 +902,12 @@ func (this *SysAdminController) Delete() {
 		return
 	}
 
+	// 同步用户缓存
+	var syncData system.SyncAdminData
+	syncData.Source = utils.SOURCE_CRM_FLAG
+	syncData.AdminName = adminInfo.AdminName
+	_ = utils.Rc.LPush(utils.CACHE_SYNC_ADMIN, syncData)
+
 	// 删除手工数据关联用户
 	{
 		go data_manage.DeleteManualUser(req.AdminId)
@@ -1132,6 +1157,12 @@ func (this *SysAdminController) Move() {
 		}
 	}
 
+	// 同步用户缓存
+	var syncData system.SyncAdminData
+	syncData.Source = utils.SOURCE_CRM_FLAG
+	syncData.AdminName = adminInfo.AdminName
+	_ = utils.Rc.LPush(utils.CACHE_SYNC_ADMIN, syncData)
+
 	// 清除系统用户列表缓存key
 	_ = utils.Rc.Delete(utils.CACHE_KEY_ADMIN)
 	_ = utils.Rc.Delete(utils.CACHE_KEY_ADMIN_ID)
@@ -1211,6 +1242,12 @@ func (this *SysAdminController) ResetPass() {
 		return
 	}
 
+	// 同步用户缓存
+	var syncData system.SyncAdminData
+	syncData.Source = utils.SOURCE_CRM_FLAG
+	syncData.AdminName = adminInfo.AdminName
+	_ = utils.Rc.LPush(utils.CACHE_SYNC_ADMIN, syncData)
+
 	// 清除系统用户列表缓存key
 	_ = utils.Rc.Delete(utils.CACHE_KEY_ADMIN)
 	_ = utils.Rc.Delete(utils.CACHE_KEY_ADMIN_ID)

+ 22 - 1
controllers/sys_department.go

@@ -48,12 +48,19 @@ func (this *SysDepartmentController) Add() {
 	item := new(system.SysDepartment)
 	item.DepartmentName = req.DepartmentName
 	item.CreateTime = time.Now()
-	_, err = system.AddSysDepartment(item)
+	departmentId, err := system.AddSysDepartment(item)
 	if err != nil {
 		br.Msg = "新增失败"
 		br.ErrMsg = "新增失败,Err:" + err.Error()
 		return
 	}
+
+	// 同步部门缓存
+	var syncData system.SyncDepartmentData
+	syncData.Source = utils.SOURCE_CRM_FLAG
+	syncData.DepartmentId = int(departmentId)
+	_ = utils.Rc.LPush(utils.CACHE_SYNC_DEPARTMENT, syncData)
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "新增成功"
@@ -104,6 +111,13 @@ func (this *SysDepartmentController) Edit() {
 		br.ErrMsg = "修改失败,Err:" + err.Error()
 		return
 	}
+
+	// 同步部门缓存
+	var syncData system.SyncDepartmentData
+	syncData.Source = utils.SOURCE_CRM_FLAG
+	syncData.DepartmentId = req.DepartmentId
+	_ = utils.Rc.LPush(utils.CACHE_SYNC_DEPARTMENT, syncData)
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "修改成功"
@@ -138,6 +152,13 @@ func (this *SysDepartmentController) Delete() {
 		br.ErrMsg = "删除失败,Err:" + err.Error()
 		return
 	}
+
+	// 同步部门缓存
+	var syncData system.SyncDepartmentData
+	syncData.Source = utils.SOURCE_CRM_FLAG
+	syncData.DepartmentId = req.DepartmentId
+	_ = utils.Rc.LPush(utils.CACHE_SYNC_DEPARTMENT, syncData)
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "删除成功"

+ 39 - 7
controllers/sys_group.go

@@ -54,14 +54,21 @@ func (this *SysGroupController) Add() {
 			item.GroupName = v
 			item.DepartmentId = req.DepartmentId
 			item.CreateTime = time.Now()
-			_, err = system.AddSysGroup(item)
-			if err != nil {
+			groupId, e := system.AddSysGroup(item)
+			if e != nil {
 				br.Msg = "新增失败"
-				br.ErrMsg = "新增失败,Err:" + err.Error()
+				br.ErrMsg = "新增失败,Err:" + e.Error()
 				return
 			}
+
+			// 同步分组缓存
+			var syncData system.SyncGroupData
+			syncData.Source = utils.SOURCE_CRM_FLAG
+			syncData.GroupId = int(groupId)
+			_ = utils.Rc.LPush(utils.CACHE_SYNC_GROUP, syncData)
 		}
 	}
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "新增成功"
@@ -112,6 +119,13 @@ func (this *SysGroupController) Edit() {
 		br.ErrMsg = "修改失败,Err:" + err.Error()
 		return
 	}
+
+	// 同步分组缓存
+	var syncData system.SyncGroupData
+	syncData.Source = utils.SOURCE_CRM_FLAG
+	syncData.GroupId = req.GroupId
+	_ = utils.Rc.LPush(utils.CACHE_SYNC_GROUP, syncData)
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "修改成功"
@@ -152,6 +166,13 @@ func (this *SysGroupController) Delete() {
 		br.ErrMsg = "删除失败,情况分组失败,Err:" + err.Error()
 		return
 	}
+
+	// 同步分组缓存
+	var syncData system.SyncGroupData
+	syncData.Source = utils.SOURCE_CRM_FLAG
+	syncData.GroupId = req.GroupId
+	_ = utils.Rc.LPush(utils.CACHE_SYNC_GROUP, syncData)
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "删除成功"
@@ -215,10 +236,21 @@ func (this *SysGroupController) SetSort() {
 				})
 			}
 		}
-		if e := system.MultiUpdateGroupSort(updateArr); e != nil {
-			br.Msg = "操作失败"
-			br.ErrMsg = "批量更新分组排序失败, Err: " + e.Error()
-			return
+
+		if len(updateArr) > 0 {
+			if e := system.MultiUpdateGroupSort(updateArr); e != nil {
+				br.Msg = "操作失败"
+				br.ErrMsg = "批量更新分组排序失败, Err: " + e.Error()
+				return
+			}
+
+			// 同步分组缓存
+			for _, g := range updateArr {
+				var syncData system.SyncGroupData
+				syncData.Source = utils.SOURCE_CRM_FLAG
+				syncData.GroupId = g.GroupId
+				_ = utils.Rc.LPush(utils.CACHE_SYNC_GROUP, syncData)
+			}
 		}
 	}
 

+ 34 - 1
controllers/sys_role.go

@@ -55,12 +55,19 @@ func (this *SysRoleController) Add() {
 	item.RoleTypeCode = services.GetRoleTypeCode(req.RoleType)
 	item.CreateTime = time.Now()
 	item.ModifyTime = time.Now()
-	_, err = system.AddSysRole(item)
+	roleId, err := system.AddSysRole(item)
 	if err != nil {
 		br.Msg = "新增失败"
 		br.ErrMsg = "新增失败,Err:" + err.Error()
 		return
 	}
+
+	// 同步角色缓存
+	var syncData system.SyncRoleData
+	syncData.Source = utils.SOURCE_CRM_FLAG
+	syncData.RoleId = int(roleId)
+	_ = utils.Rc.LPush(utils.CACHE_SYNC_ROLE, syncData)
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "新增成功"
@@ -112,6 +119,13 @@ func (this *SysRoleController) Edit() {
 		br.ErrMsg = "修改失败,Err:" + err.Error()
 		return
 	}
+
+	// 同步角色缓存
+	var syncData system.SyncRoleData
+	syncData.Source = utils.SOURCE_CRM_FLAG
+	syncData.RoleId = item.RoleId
+	_ = utils.Rc.LPush(utils.CACHE_SYNC_ROLE, syncData)
+
 	br.Ret = 200
 	br.Success = true
 	br.IsAddLog = true
@@ -141,12 +155,31 @@ func (this *SysRoleController) Delete() {
 		br.ErrMsg = "参数错误,GroupId 小于等于0 "
 		return
 	}
+
+	role, e := system.GetSysRoleById(req.RoleId)
+	if e != nil {
+		if err.Error() == utils.ErrNoRow() {
+			br.Msg = "角色不存在, 请刷新页面"
+			return
+		}
+		br.Msg = "删除失败"
+		br.ErrMsg = "获取角色信息失败, Err: " + e.Error()
+		return
+	}
+
 	err = system.DeleteSysRole(req.RoleId)
 	if err != nil {
 		br.Msg = "删除失败"
 		br.ErrMsg = "删除失败,Err:" + err.Error()
 		return
 	}
+
+	// 同步角色缓存
+	var syncData system.SyncRoleData
+	syncData.Source = utils.SOURCE_CRM_FLAG
+	syncData.RoleId = role.RoleId
+	_ = utils.Rc.LPush(utils.CACHE_SYNC_ROLE, syncData)
+
 	br.Ret = 200
 	br.Success = true
 	br.IsAddLog = true

+ 23 - 3
controllers/sys_team.go

@@ -55,12 +55,18 @@ func (this *SysTeamController) Add() {
 			item.DepartmentId = req.DepartmentId
 			item.ParentId = req.GroupId
 			item.CreateTime = time.Now()
-			_, err = system.AddSysGroup(item)
-			if err != nil {
+			groupId, e := system.AddSysGroup(item)
+			if e != nil {
 				br.Msg = "新增失败"
-				br.ErrMsg = "新增失败,Err:" + err.Error()
+				br.ErrMsg = "新增失败,Err:" + e.Error()
 				return
 			}
+
+			// 同步分组缓存
+			var syncData system.SyncGroupData
+			syncData.Source = utils.SOURCE_CRM_FLAG
+			syncData.GroupId = int(groupId)
+			_ = utils.Rc.LPush(utils.CACHE_SYNC_GROUP, syncData)
 		}
 	}
 	br.Ret = 200
@@ -113,6 +119,13 @@ func (this *SysTeamController) Edit() {
 		br.ErrMsg = "修改失败,Err:" + err.Error()
 		return
 	}
+
+	// 同步分组缓存
+	var syncData system.SyncGroupData
+	syncData.Source = utils.SOURCE_CRM_FLAG
+	syncData.GroupId = item.GroupId
+	_ = utils.Rc.LPush(utils.CACHE_SYNC_GROUP, syncData)
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "修改成功"
@@ -153,6 +166,13 @@ func (this *SysTeamController) Delete() {
 		br.ErrMsg = "删除失败,情况分组失败,Err:" + err.Error()
 		return
 	}
+
+	// 同步分组缓存
+	var syncData system.SyncGroupData
+	syncData.Source = utils.SOURCE_CRM_FLAG
+	syncData.GroupId = req.TeamId
+	_ = utils.Rc.LPush(utils.CACHE_SYNC_GROUP, syncData)
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "删除成功"

+ 69 - 0
controllers/sys_user.go

@@ -287,3 +287,72 @@ func (this *SysUserController) Uuid() {
 	br.Msg = "获取成功"
 	br.Data = uuid
 }
+
+// GetEtaAuthCode
+// @Title 免密登录-获取登录ETA系统的编码
+// @Description 免密登录-获取登录ETA系统的编码
+// @Success 200 Ret=200 获取成功
+// @router /get_eta_auth_code [get]
+func (this *SysUserAuthController) GetEtaAuthCode() {
+	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 := services.GetAuthCodeFromMiddleServer(sysUser.AdminName)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取登录编码失败, Err: " + e.Error()
+		return
+	}
+
+	br.Data = code
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// AuthCodeLogin
+// @Title 编码登录
+// @Description 编码登录
+// @Success 200 Ret=200 操作成功
+// @router /auth_code_login [get]
+func (this *SysUserController) AuthCodeLogin() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	authCode := this.GetString("AuthCode", "")
+	if authCode == "" {
+		br.Msg = "参数有误"
+		br.ErrMsg = "参数缺失, AuthCode"
+		return
+	}
+
+	data, e := services.CodeLoginFromMiddleServer(authCode)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取登录Token失败, Err: " + e.Error()
+		return
+	}
+
+	br.Data = data
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}

+ 26 - 0
models/company/company.go

@@ -90,6 +90,7 @@ type CompanySearchItem struct {
 	ShareSeller     string `description:"共享销售员"`
 	ShareSellerId   int    `description:"共享销售员id"`
 	IsShare         int    `description:"0:非共享用户,1:共享客户"`
+	IsScrounge      int    `description:"是否白嫖 0不是 1是"`
 }
 
 type CompanySearchListResp struct {
@@ -269,6 +270,7 @@ type CompanyListItem struct {
 	ServiceTimes     int                  `description:"服务次数"`
 	CloseReason      string               `description:"关闭客户原因"`
 	CloseTime        string               `description:"关闭客户时间"`
+	IsScrounge       int                  `description:"是否白嫖 0不是 1是"`
 }
 
 type TryStageSliceItem struct {
@@ -575,6 +577,7 @@ type CompanyDetail struct {
 	IsShare         int    `description:"0:非共享用户,1:共享客户"`
 	ShareSeller     string `description:"共享销售员"`
 	ShareSellerId   int    `description:"共享销售员id"`
+	IsScrounge      int    `description:"是否白嫖 0不是 1是"`
 }
 
 type CompanyDetailResp struct {
@@ -1540,11 +1543,18 @@ type RemarkReq struct {
 	Remark    string `description:"备注"`
 }
 
+// RemarkDelReq 删除备注请求
+type RemarkDelReq struct {
+	RemarkId int `description:"备注ID"`
+}
+
 // RemarkResp 备注说明
 type RemarkResp struct {
+	RemarkId    int    `description:"备注ID"`
 	Remark      string `description:"未续约说明"`
 	ProductName string `description:"客户产品:ficc:权益:"`
 	CreateTime  string `description:"添加时间"`
+	ButtonDel   bool   `description:"删除权限"`
 }
 
 type RoadShowTotalSlice struct {
@@ -1880,3 +1890,19 @@ func Close2Loss(companyId, productId int) (err error) {
 	_, err = o.Raw(sql, companyId, productId).Exec()
 	return
 }
+
+// GetCompanyListByCondition 获取客户列表
+func GetCompanyListByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*Company, err error) {
+	o := orm.NewOrm()
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY created_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM company WHERE 1=1 %s %s`, fields, condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}

+ 12 - 1
models/company/company_apply.go

@@ -54,6 +54,7 @@ type CompanyContractHistory struct {
 	ModifyTimeStr     string    `description:"合同修改时间"`
 	Status            int       `description:"状态"`
 	ProductId         int       `description:"产品id"`
+	ContractId        int       `description:"合同ID"`
 	PermissionList    []*ContractPermissionList
 }
 
@@ -63,7 +64,17 @@ type CompanyContractHistoryResp struct {
 
 func GetCompanyContractHistoryList(companyId int, productId string) (items []*CompanyContractHistory, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT * FROM company_contract WHERE company_id=? AND product_id IN(` + productId + `) AND status="1" ORDER BY modify_time DESC `
+	//sql := `SELECT * FROM company_contract WHERE company_id=? AND product_id IN(` + productId + `) AND status="1" ORDER BY modify_time DESC `
+	sql := `SELECT
+				a.*,
+				b.contract_id
+			FROM
+				company_contract AS a
+			LEFT JOIN contract AS b ON a.contract_code = b.contract_code
+			WHERE
+				a.company_id = ? AND a.product_id IN (` + productId + `) AND a.status = 1
+			ORDER BY
+				a.modify_time DESC`
 	_, err = o.Raw(sql, companyId).QueryRows(&items)
 	return
 }

+ 20 - 2
models/company/company_product.go

@@ -343,14 +343,16 @@ func UpdateCompanyProductModifyTime(companyId, productId int) (err error) {
 	return
 }
 
-// CompanyRemark 备注
+// CompanyProductRemark 备注
 type CompanyProductRemark struct {
-	CompanyProductRemakrId int       `orm:"column(company_product_remark_id);pk" description:"备注id"`
+	CompanyProductRemarkId int       `orm:"column(company_product_remark_id);pk" description:"备注id"`
 	CompanyId              int       `description:"客户id"`
 	ProductId              int       `description:"产品id"`
 	ProductName            string    `description:"产品名称"`
 	Remark                 string    `description:"备注"`
 	CreateTime             time.Time `description:"创建时间"`
+	SysUserId              int       `description:"创建人ID"`
+	SysRealName            string    `description:"创建人姓名"`
 }
 
 func AddCompanyRemark(remark *CompanyProductRemark) (err error) {
@@ -541,3 +543,19 @@ func GetCompanyProductListByScale(status string, productId int) (items []*Compan
 	_, err = o.Raw(sql, status, productId).QueryRows(&items)
 	return
 }
+
+// GetCompanyRemarkById 获取客户备注
+func GetCompanyRemarkById(remarkId int) (item *CompanyProductRemark, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM company_product_remark WHERE company_product_remark_id = ? LIMIT 1`
+	err = o.Raw(sql, remarkId).QueryRow(&item)
+	return
+}
+
+// DelCompanyRemark 删除客户备注
+func DelCompanyRemark(remarkId int) (err error) {
+	o := orm.NewOrm()
+	sql := `DELETE FROM company_product_remark WHERE company_product_remark_id = ? LIMIT 1`
+	_, err = o.Raw(sql, remarkId).Exec()
+	return
+}

+ 23 - 0
models/company/scrounge_company.go

@@ -0,0 +1,23 @@
+package company
+
+import (
+"github.com/beego/beego/v2/client/orm"
+"time"
+)
+
+type ScroungeCompany struct {
+	Id          int `orm:"column(id);pk"`
+	CompanyId   int
+	CompanyName string // 公司名
+	ProductId   int
+	CreateTime  time.Time // 申请时间
+	ModifyTime  time.Time // 修改时间
+	Remark      string    // 备注
+}
+
+func GetScroungeCompany() (list []*ScroungeCompany, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM scrounge_company   `
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}

+ 6 - 0
models/cygx/activity.go

@@ -77,6 +77,7 @@ type ActivityRep struct {
 	SiginupDeadline         string                    `description:"报名截止时间"`
 	IsResearchPoints        int                       `description:"是否为研选扣点  1是,0否"`
 	PointsSet               *CygxActivityPointsSetRsq `description:"研选扣点明细"`
+	IsAllCustomerType       int                       `description:"是否全选活动可见类型 0无 1全选"`
 	List                    []*ActivityGroupIndustrialRep
 	VoiceList               []*CygxActivityVoiceReq
 	VideoDetail             *CygxActivityVideoReq
@@ -225,7 +226,9 @@ type CygxActivity struct {
 	IsBClass                int       `description:"是否为B类电话会 1是,0否"`
 	IsNeedEmail             int       `description:"是否需要提供邮箱 1是,0否"`
 	SiginupDeadline         string    `description:"报名截止时间"`
+	CancelDeadline          string    `description:"取消报名截止时间"`
 	IsResearchPoints        int       `description:"是否为研选扣点  1是,0否"`
+	IsAllCustomerType       int       `description:"是否全选活动可见类型 0无 1全选"`
 }
 
 type CygxActivityEditDetail struct {
@@ -390,6 +393,8 @@ func EditActivity(item *CygxActivity, oldPublishStatus int, industrialActivityIt
 	updateParams["IsNeedEmail"] = item.IsNeedEmail
 	updateParams["SiginupDeadline"] = item.SiginupDeadline
 	updateParams["IsResearchPoints"] = item.IsResearchPoints
+	updateParams["CancelDeadline"] = item.CancelDeadline
+	updateParams["IsAllCustomerType"] = item.IsAllCustomerType
 	//修改活动信息
 	ptrStructOrTableName := "cygx_activity"
 	whereParam := map[string]interface{}{"activity_id": item.ActivityId}
@@ -502,6 +507,7 @@ func EditActivity(item *CygxActivity, oldPublishStatus int, industrialActivityIt
 				updateParams["PointsType"] = itemPointsSet.PointsType
 				updateParams["CompanyPointsNum"] = itemPointsSet.CompanyPointsNum
 				updateParams["ModifyTime"] = itemPointsSet.ModifyTime
+				updateParams["CancelDeadlineType"] = itemPointsSet.CancelDeadlineType
 				//修改活动信息
 				ptrStructOrTableName = "cygx_activity_points_set"
 				whereParam := map[string]interface{}{"activity_id": itemPointsSet.ActivityId}

+ 19 - 17
models/cygx/activity_points_set.go

@@ -18,26 +18,28 @@ type YanXuanActivityPointsRedis struct {
 }
 
 type CygxActivityPointsSet struct {
-	Id               int       `gorm:"column:id;primary_key;AUTO_INCREMENT" json:"id"`
-	ActivityId       int       `gorm:"column:activity_id;NOT NULL" json:"activity_id"`                         // 活动ID
-	PointsObject     string    `gorm:"column:points_object;default:1;NOT NULL" json:"points_object"`           // 扣点对象,1:参会人、2:办会人、3:办会人和参会人
-	CompanyId        int       `gorm:"column:company_id;default:0;NOT NULL" json:"company_id"`                 // 公司ID
-	CompanyName      string    `gorm:"column:company_name;NOT NULL" json:"company_name"`                       // 公司名称
-	UserPointsNum    string    `gorm:"column:user_points_num;default:0;NOT NULL" json:"user_points_num"`       // 参会人扣点数量
-	PointsType       string    `gorm:"column:points_type;default:0;NOT NULL" json:"points_type"`               // 扣点形式,1:报名即扣点,2:到会即扣点
-	CompanyPointsNum string    `gorm:"column:company_points_num;default:0;NOT NULL" json:"company_points_num"` // 办会人扣点数量
-	CreateTime       time.Time `gorm:"column:create_time;NOT NULL" json:"create_time"`                         // 创建时间
-	ModifyTime       time.Time `gorm:"column:modify_time;NOT NULL" json:"modify_time"`                         // 更新时间
+	Id                 int       `gorm:"column:id;primary_key;AUTO_INCREMENT" json:"id"`
+	ActivityId         int       `gorm:"column:activity_id;NOT NULL" json:"activity_id"`                             // 活动ID
+	PointsObject       string    `gorm:"column:points_object;default:1;NOT NULL" json:"points_object"`               // 扣点对象,1:参会人、2:办会人、3:办会人和参会人
+	CompanyId          int       `gorm:"column:company_id;default:0;NOT NULL" json:"company_id"`                     // 公司ID
+	CompanyName        string    `gorm:"column:company_name;NOT NULL" json:"company_name"`                           // 公司名称
+	UserPointsNum      string    `gorm:"column:user_points_num;default:0;NOT NULL" json:"user_points_num"`           // 参会人扣点数量
+	PointsType         string    `gorm:"column:points_type;default:0;NOT NULL" json:"points_type"`                   // 扣点形式,1:报名即扣点,2:到会即扣点
+	CompanyPointsNum   string    `gorm:"column:company_points_num;default:0;NOT NULL" json:"company_points_num"`     // 办会人扣点数量
+	CancelDeadlineType string    `gorm:"column:cancel_deadline_type;default:0;NOT NULL" json:"cancel_deadline_type"` // 取消报名截止时间类型,0:不设置,1:同报名截止时间, 2:24小时之前、3:48小时之前
+	CreateTime         time.Time `gorm:"column:create_time;NOT NULL" json:"create_time"`                             // 创建时间
+	ModifyTime         time.Time `gorm:"column:modify_time;NOT NULL" json:"modify_time"`                             // 更新时间
 }
 
 type CygxActivityPointsSetRsq struct {
-	ActivityId       int    `gorm:"column:activity_id;NOT NULL" json:"ActivityId"`                        // 活动ID
-	PointsObject     string `gorm:"column:points_object;NOT NULL" json:"PointsObject"`                    // 扣点对象,1:参会人、2:办会人、3:办会人和参会人
-	CompanyId        int    `gorm:"column:company_id;default:0;NOT NULL" json:"CompanyId"`                // 公司ID
-	CompanyName      string `gorm:"column:company_name;NOT NULL" json:"CompanyName"`                      // 公司名称
-	UserPointsNum    string `gorm:"column:user_points_num;default:0;NOT NULL" json:"UserPointsNum"`       // 参会人扣点数量
-	PointsType       string `gorm:"column:points_type;default:0;NOT NULL" json:"PointsType"`              // 扣点形式,1:报名即扣点,2:到会即扣点
-	CompanyPointsNum string `gorm:"column:company_points_num;default:0;NOT NULL" json:"CompanyPointsNum"` // 办会人扣点数量
+	ActivityId         int    `gorm:"column:activity_id;NOT NULL" json:"ActivityId"`                        // 活动ID
+	PointsObject       string `gorm:"column:points_object;NOT NULL" json:"PointsObject"`                    // 扣点对象,1:参会人、2:办会人、3:办会人和参会人
+	CompanyId          int    `gorm:"column:company_id;default:0;NOT NULL" json:"CompanyId"`                // 公司ID
+	CompanyName        string `gorm:"column:company_name;NOT NULL" json:"CompanyName"`                      // 公司名称
+	UserPointsNum      string `gorm:"column:user_points_num;default:0;NOT NULL" json:"UserPointsNum"`       // 参会人扣点数量
+	PointsType         string `gorm:"column:points_type;default:0;NOT NULL" json:"PointsType"`              // 扣点形式,1:报名即扣点,2:到会即扣点
+	CompanyPointsNum   string `gorm:"column:company_points_num;default:0;NOT NULL" json:"CompanyPointsNum"` // 办会人扣点数量
+	CancelDeadlineType string `description:"取消报名截止时间类型,0:不设置,1:同报名截止时间, 2:24小时之前、3:48小时之前"`
 }
 
 type CygxActivityPointsSetConfigListResp struct {

+ 7 - 1
models/cygx/activity_signup.go

@@ -5,7 +5,7 @@ import (
 	"hongze/hz_crm_api/models/company"
 	"hongze/hz_crm_api/utils"
 
-	//"hongze/hz_crm_api/models"
+	//"hongze/hongze_admin/models"
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/rdlucklib/rdluck_tools/paging"
 	"time"
@@ -37,6 +37,7 @@ type CygxSignupList struct {
 	IsCanAppointmentMinutes int    `description:"是否可预约纪要 1是 ,0 否 默认0 "`
 	IsCancel                int    `description:"是否取消,1是,0否"`
 	IsYidongConduct         int    `description:"是否属于易董办会 1:是 、0:否"`
+	IsResearchPoints        int    `description:"是否为研选扣点  1是,0否"`
 }
 
 type GetCygxSignupListRep struct {
@@ -1101,6 +1102,11 @@ type SendGroup struct {
 	Name string
 }
 
+type SendGroupStr struct {
+	Id   string
+	Name string
+}
+
 type PermissionList struct {
 	CompanyId  int
 	Permission string

+ 1 - 0
models/cygx/activity_special.go

@@ -94,6 +94,7 @@ type ActivitySpecialDetail struct {
 	IsOffline             int            `description:"是否下线,1已下线,0未下线"`
 	DateYmdList           []*DateYmdList `description:"时间年月日"`
 	IsSubmitMeeting       int            `description:"是否提交过到会信息 ,1是,0否"`
+	LastUpdatedTime       time.Time      `description:"更新时间"`
 }
 
 type ActivityDetailSpecialRep struct {

+ 30 - 4
models/cygx/cygx_activity_special_meeting_detail.go → models/cygx/activity_special_meeting_detail.go

@@ -17,6 +17,7 @@ type CygxActivitySpecialMeetingDetail struct {
 	CompanyName string    `description:"公司名称"`
 	IsMeeting   int       `description:"是否到会  1.是 ,0否"`
 	IsAirborne  int       `description:"是否属于空降  1.是 ,0否"`
+	RealName    string    `description:"真实姓名"`
 }
 
 type CygxActivitySpecialMeetingDetailResp struct {
@@ -42,7 +43,7 @@ type MeetingSpeciaDoRep struct {
 	ActivityId int    `description:"活动ID"`
 }
 
-//列表
+// 列表
 func GetCygxActivitySpecialMeetingDetailListByActivity(activityId int) (items []*CygxActivitySpecialMeetingDetailResp, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT s.* , u.real_name
@@ -52,8 +53,8 @@ func GetCygxActivitySpecialMeetingDetailListByActivity(activityId int) (items []
 	return
 }
 
-//到会操作
-func MeetingDopecialMeet(meetingUids, noMeetingUids string, ActivityId int, items []*CygxActivitySpecialMeetingDetail) (err error) {
+// 到会操作
+func MeetingDopecialMeet(meetingUids, noMeetingUids string, ActivityId int, items []*CygxActivitySpecialMeetingDetail, itemsBill []*CygxActivitySpecialTripBill) (err error) {
 	o := orm.NewOrm()
 	to, err := o.Begin()
 	if err != nil {
@@ -110,10 +111,19 @@ func MeetingDopecialMeet(meetingUids, noMeetingUids string, ActivityId int, item
 	if err != nil {
 		return
 	}
+	//添加到会扣点流水记录
+	if len(itemsBill) > 0 {
+		for _, v := range itemsBill {
+			_, err = to.Insert(v)
+			if err != nil {
+				return
+			}
+		}
+	}
 	return
 }
 
-//列表
+// 列表
 func GetCygxActivitySpecialMeetingDetailList(condition string, pars []interface{}) (items []*CygxActivitySpecialMeetingDetail, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT s.* 
@@ -131,3 +141,19 @@ func GetCygxActivitySpecialMeetingDetailListByActivityId(activityId int) (item [
 	_, err = o.Raw(sql, activityId).QueryRows(&item)
 	return
 }
+
+// 列表
+func UpdateCygxActivitySpecialMeetingDetailRealName(realName, mobile string) (err error) {
+	o := orm.NewOrm()
+	//添加记录表的到会信息
+	sql := `UPDATE cygx_activity_special_meeting_detail SET real_name = ?  WHERE mobile = ? `
+	_, err = o.Raw(sql, realName, mobile).Exec()
+	return
+}
+
+// 添加
+func AddCygxActivitySpecialMeetingDetail(item *CygxActivitySpecialMeetingDetail) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Insert(item)
+	return
+}

+ 51 - 3
models/cygx/activity_special_trip.go

@@ -2,7 +2,7 @@ package cygx
 
 import (
 
-	//"hongze/hz_crm_api/models"
+	//"hongze/hongze_admin/models"
 	"github.com/beego/beego/v2/client/orm"
 	"time"
 )
@@ -20,6 +20,7 @@ type CygxActivitySpecialTrip struct {
 	SellerName     string    `description:"所属销售"`
 	AdminId        int       `description:"销售/管理员ID"`
 	Source         int       `description:"来源,1小程序,2后台添加"`
+	IsMeeting      int       `description:"是否到会"`
 	OutboundMobile string    `description:"外呼手机号"`
 	CountryCode    string    `description:"手机国家区号"`
 }
@@ -78,7 +79,7 @@ func GetActivitySpecialTripCount(uid, activityId int) (count int, err error) {
 }
 
 // 新增预约人数
-func AddCygxActivitySpecialTrip(items []*CygxActivitySpecialTrip, itemsBill []*CygxActivitySpecialTripBill) (err error) {
+func AddCygxActivitySpecialTrip(items []*CygxActivitySpecialTrip, itemsBill []*CygxActivitySpecialTripBill, itemsMeet []*CygxActivitySpecialMeetingDetail) (err error) {
 	o := orm.NewOrm()
 	to, err := o.Begin()
 	if err != nil {
@@ -118,6 +119,14 @@ func AddCygxActivitySpecialTrip(items []*CygxActivitySpecialTrip, itemsBill []*C
 			return
 		}
 	}
+
+	//添加到会信息记录查询表
+	for _, item := range itemsMeet {
+		_, err = to.Insert(item)
+		if err != nil {
+			return
+		}
+	}
 	return
 }
 
@@ -166,9 +175,25 @@ func GetActivitySpecialTripTotal(activityId int, sqlStr string) (count int, err
 
 // ActivitySpecialTripCancel 取消报名
 func ActivitySpecialTripCancel(isValid, activityId, uid int) (err error) {
-	o := orm.NewOrm()
+	o, err := orm.NewOrm().Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = o.Rollback()
+		} else {
+			_ = o.Commit()
+		}
+	}()
 	sql := `UPDATE cygx_activity_special_trip SET   is_valid= ?, is_cancel = 1  WHERE activity_id=? AND user_id = ? `
 	_, err = o.Raw(sql, isValid, activityId, uid).Exec()
+	if err != nil {
+		return
+	}
+	//删除到会记录表信息
+	sql = ` DELETE FROM cygx_activity_special_meeting_detail  WHERE activity_id = ?  AND user_id = ?  `
+	_, err = o.Raw(sql, activityId, uid).Exec()
 	return
 }
 
@@ -232,3 +257,26 @@ func GetCygxActivitySpecialTripAirborneListByComapnyId(companyId int) (item []*C
 	_, err = o.Raw(sql, companyId).QueryRows(&item)
 	return
 }
+
+type ActivitySpecialSignupTempMsgReq struct {
+	ActivityIds   string `description:"活动id,用,隔开"`
+	SendGroup     string `description:"发送对象,1已报名 用,隔开"`
+	ResearchTheme string `description:"调研主题"`
+	Content       string `description:"推送内容"`
+}
+
+// 列表
+func GetCygxActivitySpecialTripListCondition(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxActivitySpecialTrip, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_activity_special_trip as art WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	if startSize+pageSize > 0 {
+		sql += ` LIMIT ?,?  `
+		_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	} else {
+		_, err = o.Raw(sql, pars).QueryRows(&items)
+	}
+	return
+}

+ 1 - 0
models/cygx/activity_special_trip_bill.go

@@ -21,6 +21,7 @@ type CygxActivitySpecialTripBill struct {
 	DoType            int       `description:"操作方式,1报名,2取消报名"`
 	RegisterPlatform  int       `description:"来源 1小程序,2:网页"`
 	ChartPermissionId int       `description:"行业id"`
+	Way               int       `description:"1报名,取消报名。2到会取消到会"`
 }
 
 type CygxActivitySpecialTripBillList struct {

+ 1 - 1
models/cygx/activity_video.go

@@ -96,7 +96,7 @@ func GetActivityVideoHistoryById(condition string, pars []interface{}) (item []*
 	return
 }
 
-// 列表
+// 详情
 func GetCygxActivityVideoReqDetail(activityId int) (item *CygxActivityVideo, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT *  FROM cygx_activity_video  WHERE activity_id= ? `

+ 7 - 0
models/cygx/activity_voice.go

@@ -45,3 +45,10 @@ func GetActivityVoiceList(condition string, pars []interface{}) (items []*CygxAc
 	_, err = o.Raw(sql, pars).QueryRows(&items)
 	return
 }
+
+func GetCygxActivityVoiceReqDetail(activityId int) (item *CygxActivityVoice, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT *  FROM cygx_activity_voice  WHERE activity_id= ? `
+	err = o.Raw(sql, activityId).QueryRow(&item)
+	return
+}

+ 8 - 0
models/cygx/cygx_morning_meeting_review_chapter.go

@@ -150,3 +150,11 @@ func UpdateCygxMorningMeetingGather(meetingIds string, meetingGatherId int) (err
 	_, err = o.Raw(sql, meetingIds, meetingGatherId).Exec()
 	return
 }
+
+// 详情
+func GetCygxMorningMeetingReviewChapterDetail(meetingGatherId int) (item *CygxMorningMeetingReviewChapter, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT *  FROM cygx_morning_meeting_review_chapter  WHERE id= ? `
+	err = o.Raw(sql, meetingGatherId).QueryRow(&item)
+	return
+}

+ 17 - 8
models/cygx/cygx_user.go

@@ -154,7 +154,7 @@ func GetCygxCompanyUserListSplit(userIds string) (items []*CygxCompanyUser, err
 				 AND t.activity_type = 1  AND h.do_fail_type = 0 ) AS on_line_num,
 			( SELECT COUNT( 1 ) FROM cygx_activity_signup_detail AS h INNER JOIN cygx_activity as a ON a.activity_id = h.activity_id  INNER JOIN cygx_activity_type as t ON t.activity_type_id = a.activity_type_id   WHERE h.mobile = u.mobile  
 				 AND t.activity_type = 0 AND h.do_fail_type = 0 ) AS office_num,
-			( SELECT COUNT( 1 ) FROM cygx_activity_special_trip AS h INNER JOIN cygx_activity_special AS a ON a.activity_id = h.activity_id WHERE h.mobile = u.mobile  AND h.is_cancel = 0   AND a.publish_status = 1 AND a.activity_time_end < NOW()) AS trip_num,
+			( SELECT COUNT( 1 ) FROM cygx_activity_special_meeting_detail AS h INNER JOIN cygx_activity_special AS a ON a.activity_id = h.activity_id WHERE h.mobile = u.mobile   AND a.publish_status = 1 AND a.activity_time_end < NOW()) AS trip_num,
 			( SELECT COUNT( 1 ) FROM cygx_micro_roadshow_video_history AS h  INNER JOIN cygx_micro_roadshow_video as v ON v.video_id = h.video_id WHERE  h.mobile = u.mobile  ) AS roadshow_video_num,
 			( SELECT COUNT( 1 ) FROM cygx_activity_video_history AS h  INNER JOIN cygx_activity_video as v ON v.video_id = h.video_id WHERE  h.mobile = u.mobile  ) AS activity_video_num,
 			( SELECT COUNT( 1 ) FROM cygx_activity_voice_history AS h  INNER JOIN cygx_activity_voice as v ON v.activity_voice_id = h.activity_voice_id WHERE  h.mobile = u.mobile  ) AS activity_voice_num,
@@ -324,8 +324,15 @@ type UserInteraction struct {
 	CurrentIndex          int    `description:"当前页页码,配合前端分页添加的参数"`
 	RegisterPlatform      int    `description:"来源 1小程序,2:网页 ,3:策略平台"`
 	SourcePlatform        string `description:"来源 'MOBILE:移动端小程序','PC:PC端小程序','CELUE:上海策略平台','WEB:查研观向网页版'"`
+	TagId                 int
+	TagName               string `orm:"column(tag_name);NOT NULL"`       // 标签名
+	ArticleTypes          string `orm:"column(article_types);NOT NULL"`  // 报告系列
+	ActivityTypes         string `orm:"column(activity_types);NOT NULL"` // 活动类型
+	Industries            string `orm:"column(industries);NOT NULL"`     // 产业
+	SubjectNames          string `orm:"column(subject_names);NOT NULL"`  // 标的
 }
 
+
 // 查研观向图表
 type CygxChartResp struct {
 	Title       string `description:"标题"`
@@ -508,12 +515,12 @@ func GetCygxActivitySpecialTripCount(condition string, pars []interface{}) (coun
 	sqlCount := `SELECT
 	COUNT( 1 ) 
 FROM
-	cygx_activity_special_trip AS h
+	cygx_activity_special_meeting_detail AS h
 	INNER JOIN cygx_activity_special AS a ON a.activity_id = h.activity_id
 	INNER JOIN wx_user AS u ON h.mobile = u.mobile 
 WHERE
 	1 = 1 
-	AND h.is_cancel = 0 AND a.publish_status = 1 AND a.activity_time_end < NOW() ` + condition
+	AND a.publish_status = 1 AND a.activity_time_end < NOW() ` + condition
 	err = o.Raw(sqlCount, pars).QueryRow(&count)
 	return
 }
@@ -530,12 +537,12 @@ func GetCygxActivitySpecialTripByUser(uid, startSize, pageSize int) (items []*Us
 			a.special_type AS activity_type,
 			h.is_meeting 
 		FROM
-			cygx_activity_special_trip AS h
+			cygx_activity_special_meeting_detail AS h
 			INNER JOIN cygx_activity_special AS a ON a.activity_id = h.activity_id
 			INNER JOIN wx_user AS u ON h.mobile = u.mobile 
 		WHERE
 			1 = 1
-			AND h.is_cancel = 0 AND a.publish_status = 1 AND a.activity_time_end < NOW()
+			 AND a.publish_status = 1 AND a.activity_time_end < NOW()
 			AND u.user_id = ?
 			ORDER BY  a.activity_time DESC LIMIT ?,? `
 	_, err = o.Raw(sql, uid, startSize, pageSize).QueryRows(&items)
@@ -835,6 +842,7 @@ type GetUserInteractionTableCountResp struct {
 	RoadshowVideoNum    int `description:"产业视频播放量"`
 	ActivityVideoNum    int `description:"活动视频播放量"`
 	ActivityVoiceNum    int `description:"活动音频播放量"`
+	TagNum              int `description:"首页标签点击量"`
 }
 
 // 用户互动总数统计
@@ -851,11 +859,12 @@ func GetUserInteractionTableCount(uid int) (item *GetUserInteractionTableCountRe
 					  AND t.activity_type=1 AND h.do_fail_type = 0   ) AS on_line_num,
 			( SELECT  	COUNT( DISTINCT a.activity_id )  as count  FROM cygx_activity_signup_detail AS h INNER JOIN cygx_activity as a ON a.activity_id = h.activity_id  INNER JOIN cygx_activity_type as t ON t.activity_type_id = a.activity_type_id   WHERE h.mobile = u.mobile  
 				  AND t.activity_type = 0 AND h.do_fail_type = 0  ) AS office_num,
-			( SELECT COUNT( 1 ) FROM cygx_activity_special_trip AS h INNER JOIN cygx_activity_special AS a ON a.activity_id = h.activity_id WHERE h.mobile = u.mobile  AND h.is_cancel = 0   AND a.publish_status = 1 AND a.activity_time_end < NOW()) AS trip_num,
+			( SELECT COUNT( 1 ) FROM cygx_activity_special_meeting_detail AS h INNER JOIN cygx_activity_special AS a ON a.activity_id = h.activity_id WHERE h.mobile = u.mobile  AND a.publish_status = 1 AND a.activity_time_end < NOW()) AS trip_num,
 			( SELECT COUNT( 1 ) FROM cygx_micro_roadshow_video_history AS h  INNER JOIN cygx_micro_roadshow_video as v ON v.video_id = h.video_id WHERE  h.mobile = u.mobile  ) AS roadshow_video_num,
 			( SELECT COUNT( 1 ) FROM cygx_activity_video_history AS h  INNER JOIN cygx_activity_video as v ON v.video_id = h.video_id WHERE  h.mobile = u.mobile  ) AS activity_video_num,
-			( SELECT COUNT( 1 ) FROM cygx_activity_voice_history AS h  INNER JOIN cygx_activity_voice as v ON v.activity_id = h.activity_id WHERE  h.mobile = u.mobile  ) AS activity_voice_num
-		FROM
+			( SELECT COUNT( 1 ) FROM cygx_activity_voice_history AS h  INNER JOIN cygx_activity_voice as v ON v.activity_id = h.activity_id WHERE  h.mobile = u.mobile  ) AS activity_voice_num,
+			( SELECT COUNT(1) FROM cygx_tag_history as a INNER JOIN cygx_tag AS b ON a.tag_id = b.tag_id WHERE a.user_id=u.user_id  ) AS tag_num
+			FROM
 			wx_user  as u
 		WHERE
 			u.user_id = ?`

+ 4 - 4
models/cygx/cygx_user_company.go

@@ -302,11 +302,11 @@ func GetCygxActivitySpecialTripCountByCompany(condition string) (count int, err
 	sqlCount := ` SELECT
 			COUNT( 1 ) 
 		FROM
-			cygx_activity_special_trip AS r
+			cygx_activity_special_meeting_detail AS r
 			INNER JOIN cygx_activity_special AS a ON a.activity_id = r.activity_id
 		WHERE
 			1 = 1 
-			AND r.is_cancel = 0 AND a.publish_status = 1 AND a.activity_time_end < NOW()   ` + condition
+			 AND a.publish_status = 1 AND a.activity_time_end < NOW()   ` + condition
 	err = o.Raw(sqlCount).QueryRow(&count)
 	return
 }
@@ -325,10 +325,10 @@ func CygxActivitySpecialTripByCompany(condition string, startSize, pageSize int)
 			r.real_name,
 			r.is_meeting 
 		FROM
-			cygx_activity_special_trip AS r
+			cygx_activity_special_meeting_detail AS r
 			INNER JOIN cygx_activity_special AS a ON a.activity_id = r.activity_id
 			LEFT JOIN cygx_user_interaction_num AS ui ON ui.user_id = r.user_id
-			WHERE 1= 1  	AND r.is_cancel = 0 AND a.publish_status = 1 AND a.activity_time_end < NOW() ` + condition + `
+			WHERE 1= 1   AND a.publish_status = 1 AND a.activity_time_end < NOW() ` + condition + `
 			ORDER BY  ui.trip_num DESC, r.create_time DESC  LIMIT ?,? `
 	_, err = o.Raw(sql, startSize, pageSize).QueryRows(&items)
 	return

+ 49 - 6
models/cygx/industrial_article_group_management.go

@@ -2,6 +2,7 @@ package cygx
 
 import (
 	"github.com/beego/beego/v2/client/orm"
+	"strconv"
 	"time"
 )
 
@@ -13,7 +14,7 @@ type CygxIndustrialArticleGroupManagement struct {
 	CreateTime             time.Time `description:"创建时间"`
 }
 
-//新增
+// 新增
 func AddCygxIndustrialArticleGroupManagement(item *CygxIndustrialArticleGroupManagement) (newId int64, err error) {
 	o := orm.NewOrm()
 	_, err = o.Insert(item)
@@ -23,7 +24,7 @@ func AddCygxIndustrialArticleGroupManagement(item *CygxIndustrialArticleGroupMan
 	return
 }
 
-//列表
+// 列表
 func GetIndustrialArticleGroupManagementList(articleId int) (items []*IndustrialActivityGroupManagementRep, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT
@@ -41,7 +42,7 @@ func GetIndustrialArticleGroupManagementList(articleId int) (items []*Industrial
 	return
 }
 
-//通过名称获取详情
+// 通过名称获取详情
 func GetIndustrialManagemenDetailByAaticle(articleId int) (item *CygxIndustrialArticleGroupManagement, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT * FROM cygx_industrial_article_group_management WHERE article_id = ? `
@@ -66,7 +67,7 @@ type ArticleIndustrialSubjectNameResp struct {
 	IndustrialManagementId int    `description:"产业id"`
 }
 
-//通过文章ID获取所关联的产业与标的
+// 通过文章ID获取所关联的产业与标的
 func GetCygxArticleIndustrialSubjectName(articleIds string) (items []*ArticleIndustrialSubjectNameResp, err error) {
 	o := orm.NewOrm()
 	sql := ` SELECT
@@ -101,7 +102,7 @@ type IndustrialArticleGroupResp struct {
 	IndustryName           string `description:"产业名称"`
 }
 
-//通过id 获取详情
+// 通过id 获取详情
 func GetIndustrialManagemenDetailByAaticleID(articleId int) (items []*ArticleIndustrialSubjectNameResp, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT
@@ -117,7 +118,7 @@ func GetIndustrialManagemenDetailByAaticleID(articleId int) (items []*ArticleInd
 	return
 }
 
-//列表
+// 列表
 func GetIndustrialArticleGroupListByarticleIds(articleIds string) (items []*IndustrialArticleGroupResp, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT  mg.*,m.industry_name  FROM
@@ -128,3 +129,45 @@ func GetIndustrialArticleGroupListByarticleIds(articleIds string) (items []*Indu
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
+
+// 用户收藏榜start
+type IndustrialManagementHotResp struct {
+	IndustrialManagementId int                      `orm:"column(industrial_management_id);pk" description:"产业id"`
+	IndustryName           string                   `description:"产业名称"`
+	IsFollw                bool                     `description:"是否关注"`
+	FllowNum               int                      `description:"关注数量"`
+	IsNew                  bool                     `description:"是否新标签"`
+	IsHot                  bool                     `description:"是否新标签"`
+	IsRed                  bool                     `description:"是否标记红点"`
+	Readnum                int                      `description:"阅读数量"`
+	PublishDate            string                   `description:"发布时间"`
+	MinReportTime          string                   `description:"报告最早发布时间"`
+	ArticleReadNum         int                      `description:"文章阅读数量"`
+	Source                 int                      `description:"来源 1:弘则资源包(报告)、2:研选主题(报告)"`
+	IndustrialSubjectList  []*CygxIndustrialSubject `description:"标的列表"`
+}
+
+// 产业与文章关联列表
+func GetSearchResourceList(userId int, condition string, startSize, pageSize int) (items []*IndustrialManagementHotResp, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+			m.industry_name,
+			m.industrial_management_id,
+ 			MAX( a.publish_date ) as publish_date_order,
+			MIN(a.publish_date) AS min_report_time,
+			date_format( MAX( a.publish_date ), '%Y-%m-%d' ) AS publish_date,
+			(SELECT COUNT(1) FROM cygx_article_history_record AS rec WHERE rec.user_id = ` + strconv.Itoa(userId) + ` AND  rec.article_id=a.article_id) AS readnum 
+		FROM
+			cygx_industrial_management AS m
+			INNER JOIN cygx_industrial_article_group_management AS mg ON mg.industrial_management_id = m.industrial_management_id
+			INNER JOIN cygx_article AS a ON a.article_id = mg.article_id  AND  a.article_type != 'lyjh'
+		WHERE
+			1 = 1
+			AND publish_status = 1 ` + condition + `  GROUP BY m.industrial_management_id  ORDER BY publish_date_order DESC `
+
+	if startSize > 0 || pageSize > 0 {
+		sql += ` LIMIT ` + strconv.Itoa(startSize) + "," + strconv.Itoa(pageSize)
+	}
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}

+ 29 - 19
models/cygx/industrial_subject.go

@@ -65,7 +65,7 @@ func UpdateIndustrialManagementSubjectNames(industrialManagementId int, industry
 	return
 }
 
-//新增
+// 新增
 func AddIndustrialSubject(item *CygxIndustrialSubject) (newId int64, err error) {
 	o := orm.NewOrm()
 	newId, err = o.Insert(item)
@@ -75,7 +75,7 @@ func AddIndustrialSubject(item *CygxIndustrialSubject) (newId int64, err error)
 	return
 }
 
-//批量新增
+// 批量新增
 func AddIndustrialSubjectList(items []*CygxIndustrialSubject) (newIdStr string, err error) {
 	o := orm.NewOrm()
 	to, err := o.Begin()
@@ -100,7 +100,7 @@ func AddIndustrialSubjectList(items []*CygxIndustrialSubject) (newIdStr string,
 	return
 }
 
-//列表
+// 列表
 func GetIndustrialSubjectAll(IndustrialManagementId int) (items []*CygxIndustrialSubjectNum, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT *,
@@ -113,7 +113,7 @@ func GetIndustrialSubjectAll(IndustrialManagementId int) (items []*CygxIndustria
 	return
 }
 
-//获取数量
+// 获取数量
 func GetIndustrialSubjectCount(condition string, pars []interface{}) (count int, err error) {
 	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_industrial_subject WHERE 1=1 `
 	if condition != "" {
@@ -124,7 +124,7 @@ func GetIndustrialSubjectCount(condition string, pars []interface{}) (count int,
 	return
 }
 
-//修改
+// 修改
 func EditIndustrialSubject(item *CygxIndustrialSubject) (err error) {
 	o := orm.NewOrm()
 	sql := `UPDATE cygx_industrial_subject SET  subject_name=? WHERE industrial_subject_id=? `
@@ -132,7 +132,7 @@ func EditIndustrialSubject(item *CygxIndustrialSubject) (err error) {
 	return
 }
 
-//删除数据
+// 删除数据
 func DeleteIndustrialSubject(industrialSubjectId int) (err error) {
 	o := orm.NewOrm()
 	sql := ` DELETE FROM cygx_industrial_subject WHERE industrial_Subject_id = ?`
@@ -148,7 +148,7 @@ type ArtGroupIndustrialSubjectRepList struct {
 	List []*ArtGroupIndustrialSubjectRep
 }
 
-//获取文章关联的标的数量
+// 获取文章关联的标的数量
 func GetArtGroupIndustrialSubject(reportId int) (item []*ArtGroupIndustrialSubjectRep, err error) {
 	sql := ` SELECT sub.subject_name FROM cygx_industrial_article_group_subject AS sub_g
 		INNER JOIN cygx_industrial_subject AS sub ON sub.industrial_subject_id = sub_g.industrial_subject_id
@@ -159,7 +159,7 @@ func GetArtGroupIndustrialSubject(reportId int) (item []*ArtGroupIndustrialSubje
 	return
 }
 
-//获取标的关联的文章数量
+// 获取标的关联的文章数量
 func GetIndustrialSubjectGroupArtCount(industrialSubjectId int) (count int, err error) {
 	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_industrial_article_group_subject WHERE industrial_subject_id=? `
 	o := orm.NewOrm()
@@ -167,7 +167,7 @@ func GetIndustrialSubjectGroupArtCount(industrialSubjectId int) (count int, err
 	return
 }
 
-//列表
+// 列表
 func GetIndustrialSubjectAllByIds(condition string) (items []*CygxIndustrialSubjectNum, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT *,
@@ -193,7 +193,7 @@ func GetIndustrialSubjectDetailByName(IndustrialSubjectName string) (item *CygxI
 	return
 }
 
-//列表
+// 列表
 func GetIndustrialSubjectListName(condition string) (items []*ArtGroupIndustrialSubjectRep, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT s.*
@@ -233,7 +233,7 @@ type SubjectNameRep struct {
 	Name string `description:"标的名称"`
 }
 
-//列表
+// 列表
 func GetIndustrialSubjectListNameByChartId(condition string) (items []*CygxIndustrialSubjectListRep, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT 	s.*,m.industry_name
@@ -250,7 +250,7 @@ func GetIndustrialSubjectListNameByChartId(condition string) (items []*CygxIndus
 	return
 }
 
-//通过多个标的ID获取产业名称
+// 通过多个标的ID获取产业名称
 func GetindustrialSubjectNames(subjectIds string) (names string, err error) {
 	sql := ` SELECT
 			GROUP_CONCAT( DISTINCT s.subject_name SEPARATOR '/' ) AS names 
@@ -263,7 +263,7 @@ func GetindustrialSubjectNames(subjectIds string) (names string, err error) {
 	return
 }
 
-//列表
+// 列表
 func GetIndustrialSubjectListNameByName(condition string) (items []*CygxIndustrialSubject, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT * FROM cygx_industrial_subject WHERE 1= 1`
@@ -274,7 +274,7 @@ func GetIndustrialSubjectListNameByName(condition string) (items []*CygxIndustri
 	return
 }
 
-//通过标的名称获取标的关联的ID
+// 通过标的名称获取标的关联的ID
 func GetIndustrialSubjectIdsByName(subjectName string) (industrialSubjectIds string, err error) {
 	sql := ` SELECT
 			GROUP_CONCAT( DISTINCT s.industrial_subject_id SEPARATOR ',' ) AS industrial_subject_ids 
@@ -287,7 +287,7 @@ func GetIndustrialSubjectIdsByName(subjectName string) (industrialSubjectIds str
 	return
 }
 
-//通过标的名称获取标的关联的ID
+// 通过标的名称获取标的关联的ID
 func GetIndustrialSubjectIdsByNameLike(subjectName string) (industrialSubjectIds string, err error) {
 	sql := ` SELECT
 			GROUP_CONCAT( DISTINCT s.industrial_subject_id SEPARATOR ',' ) AS industrial_subject_ids 
@@ -301,7 +301,7 @@ func GetIndustrialSubjectIdsByNameLike(subjectName string) (industrialSubjectIds
 }
 
 type IndustrySubjectCountDetail struct {
-	ArtTotalNum int    `description:"文章总数量"`
+	ArtTotalNum int `description:"文章总数量"`
 	List        []*IndustrySubjectArtTypeCountList
 }
 
@@ -339,10 +339,20 @@ func GetIndustrySubjectArtTypeCountList(subjectId int) (list []*IndustrySubjectA
 	return
 }
 
-//列表
+// 列表
 func GetIndustrySubjectListByIds(IndustrialSubjectIds string) (items []*CygxIndustrialSubject, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT * FROM cygx_industrial_subject WHERE industrial_subject_id IN (`+ IndustrialSubjectIds +`) `
+	sql := `SELECT * FROM cygx_industrial_subject WHERE industrial_subject_id IN (` + IndustrialSubjectIds + `) `
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
-}
+}
+
+// 获取标的列表
+func GetCygxIndustrialSubjectListCondition(condition string, pars []interface{}) (items []*CygxIndustrialSubject, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * 
+		FROM
+			cygx_industrial_subject WHERE 1 = 1 ` + condition
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}

+ 4 - 0
models/cygx/report_selection_log.go

@@ -17,6 +17,8 @@ type CygxReportSelectionLog struct {
 	CompanyLabel           string    `description:"公司标签多个用{|}隔开"`
 	OverviewArticleId      int       `description:"关联的综述报告ID"`
 	IsNew                  int       `description:"是否为New标签"`
+	SubjectSort            int       `description:"标的排序"`
+	ChartPermissionSort    int       `description:"品种排序"`
 }
 
 type CygxReportSelectionLogRep struct {
@@ -56,6 +58,8 @@ type CygxReportSelectionLogResp struct {
 	OverviewArticleId        int      `description:"综述报告Id"`
 	OverviewArticleTitle     string   `description:"综述报告标题"`
 	IsNew                    int      `description:"是否为New标签"`
+	SubjectSort              int      `description:"标的排序"`
+	ChartPermissionSort      int      `description:"品种排序"`
 }
 
 type CygxReportSelectionChart struct {

+ 1 - 0
models/cygx/summary_manage.go

@@ -133,6 +133,7 @@ type CygxArticleResp struct {
 	SubjectIds         string    `description:"报告所关联的标的"`
 	AdminId            int       `description:"销售/管理员ID"`
 	AdminName          string    `description:"销售/管理员姓名"`
+	Annotation         string    `description:"核心观点"`
 	VisibleRange       int       `description:"设置可见范围1全部,0内部"`
 }
 

+ 106 - 1
models/cygx/tag_history.go

@@ -7,7 +7,7 @@ import (
 
 type CygxTagHistory struct {
 	Id               int `orm:"column(id);pk"`
-	TimeLineId       int
+	TagId            int
 	UserId           int
 	CreateTime       time.Time
 	Mobile           string    `description:"手机号"`
@@ -61,3 +61,108 @@ func GetCygxTagHistoryCountPv(tagId int) (count int, err error) {
 	err = o.Raw(sqlCount, tagId).QueryRow(&count)
 	return
 }
+
+// 获取数量
+func GetCygxTagHistoryCountByUserId(userId int) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_tag_history as a 
+	INNER JOIN cygx_tag AS b ON a.tag_id = b.tag_id 
+	WHERE a.user_id=? ORDER BY a.create_time  `
+	o := orm.NewOrm()
+	err = o.Raw(sqlCount, userId).QueryRow(&count)
+	return
+}
+
+// 获取数量
+func GetCygxTagHistoryByUserId(userId, startSize, pageSize int) (list []*UserInteraction, err error) {
+	sqlCount := ` SELECT b.*,a.create_time FROM cygx_tag_history as a INNER JOIN cygx_tag AS b ON a.tag_id = b.tag_id 
+WHERE a.user_id=? ORDER BY a.create_time DESC LIMIT ?,? `
+	o := orm.NewOrm()
+	_, err = o.Raw(sqlCount, userId, startSize, pageSize).QueryRows(&list)
+	return
+}
+
+// 获取数量
+func GetCygxTagHistoryCountByCompanyId(companyId int, condition string) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count  FROM (SELECT b.* FROM cygx_tag_history as a 
+	INNER JOIN cygx_tag AS b ON a.tag_id = b.tag_id 
+	LEFT JOIN cygx_user_interaction_num AS ui ON ui.user_id = a.user_id `
+	if condition != "" {
+		sqlCount += condition
+	}
+	sqlCount += ` WHERE a.company_id=? ) AS t `
+	o := orm.NewOrm()
+	err = o.Raw(sqlCount, companyId).QueryRow(&count)
+	return
+}
+
+// 获取数量
+func GetCygxTagHistoryByCompanyId(companyId, startSize, pageSize int, condition string) (list []*UserInteraction, err error) {
+	sqlCount := ` SELECT a.real_name,a.mobile,ui.tag_num, a.create_time AS create_time,
+b.tag_id,b.tag_name,b.article_types,b.activity_types,b.industries,b.subject_names   
+FROM cygx_tag_history as a 
+	INNER JOIN cygx_tag AS b ON a.tag_id = b.tag_id  
+	LEFT JOIN cygx_user_interaction_num AS ui ON ui.user_id = a.user_id `
+	if condition != "" {
+		sqlCount += condition
+	}
+	sqlCount += ` 
+	WHERE a.company_id=? ORDER BY tag_num DESC ,create_time DESC LIMIT ?,? `
+	o := orm.NewOrm()
+	_, err = o.Raw(sqlCount, companyId, startSize, pageSize).QueryRows(&list)
+	return
+}
+
+// 获取数量
+func GetCygxTagHistoryCountByCompanyIds(companyIds, condition string) (count int, err error) {
+	sqlCount := ` SELECT a.real_name,a.mobile,b.*,ci.tag_num,ui.tag_num AS ui_tag_num,a.company_name  FROM cygx_tag_history as a  
+	INNER JOIN cygx_tag AS b ON a.tag_id = b.tag_id 
+	LEFT JOIN company_product AS p ON a.company_id=p.company_id 
+	LEFT JOIN cygx_company_interaction_num AS ci ON ci.company_id = a.company_id 
+	LEFT JOIN cygx_user_interaction_num AS ui ON ui.user_id = a.user_id WHERE p.product_id=2 `
+	if companyIds != "" {
+		sqlCount += `AND a.company_id IN ( ` + companyIds + `) `
+	}
+	if condition != "" {
+		sqlCount += condition
+	}
+	sql := `SELECT COUNT(1) AS count  FROM (` + sqlCount + `)  AS t`
+	o := orm.NewOrm()
+	err = o.Raw(sql).QueryRow(&count)
+	return
+}
+
+// 获取数量
+func GetCygxTagHistoryByCompanyIds(companyIds, condition string, startSize, pageSize int) (list []*UserInteraction, err error) {
+	sqlCount := ` SELECT a.real_name,a.mobile,ci.tag_num,ui.tag_num AS ui_tag_num,a.company_name, a.create_time AS create_time,
+b.tag_id,b.tag_name,b.article_types,b.activity_types,b.industries,b.subject_names
+FROM cygx_tag_history as a 
+INNER JOIN cygx_tag AS b ON a.tag_id = b.tag_id 
+LEFT JOIN company_product AS p ON a.company_id=p.company_id 
+LEFT JOIN cygx_company_interaction_num AS ci ON ci.company_id = a.company_id 
+LEFT JOIN cygx_user_interaction_num AS ui ON ui.user_id = a.user_id WHERE p.product_id=2 `
+	if companyIds != "" {
+		sqlCount += `AND a.company_id IN ( ` + companyIds + `) `
+	}
+	if condition != "" {
+		sqlCount += condition
+	}
+	sqlCount += ` ORDER BY tag_num DESC ,ui_tag_num DESC , create_time DESC LIMIT ?,? `
+	o := orm.NewOrm()
+	_, err = o.Raw(sqlCount, startSize, pageSize).QueryRows(&list)
+	return
+}
+
+// 获取数量
+func GetCygxTagHistoryCountByCompanyIdCondition(condition string) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_tag_history as a  
+	INNER JOIN cygx_tag AS b ON a.tag_id = b.tag_id 
+	INNER JOIN company_product AS p ON a.company_id=p.company_id WHERE p.product_id=2`
+	if condition != "" {
+		sqlCount += condition
+	}
+	sqlCount += `GROUP BY a.user_id,a.tag_id   `
+	sql := `SELECT COUNT(1) AS count  FROM (` + sqlCount + `)  AS t`
+	o := orm.NewOrm()
+	err = o.Raw(sql).QueryRow(&count)
+	return
+}

+ 1 - 1
models/eta_trial/eta_trial.go

@@ -110,7 +110,7 @@ func AddETATrial(item *EtaTrial) (lastId int64, err error) {
 }
 
 func GetETATrialByAccount(account string) (items []*EtaTrial, err error) {
-	sql := `SELECT * FROM eta_trial WHERE user_name = ? `
+	sql := `SELECT * FROM eta_trial WHERE account = ? `
 	o := orm.NewOrm()
 
 	_, err = o.Raw(sql, account).QueryRows(&items)

+ 24 - 0
models/system/sys_admin.go

@@ -505,3 +505,27 @@ func GetRaiAdmin() (items []*AdminItem, err error) {
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
+
+// SyncRoleData 同步角色数据
+type SyncRoleData struct {
+	Source int `description:"来源: 1-CRM; 2-ETA"`
+	RoleId int `description:"角色ID"`
+}
+
+// SyncAdminData 同步用户数据
+type SyncAdminData struct {
+	Source    int    `description:"来源: 1-CRM; 2-ETA"`
+	AdminName string `description:"用户名"`
+}
+
+// SyncDepartmentData 同步部门数据
+type SyncDepartmentData struct {
+	Source       int `description:"来源: 1-CRM; 2-ETA"`
+	DepartmentId int `description:"部门ID"`
+}
+
+// SyncGroupData 同步分组数据
+type SyncGroupData struct {
+	Source  int `description:"来源: 1-CRM; 2-ETA"`
+	GroupId int `description:"分组ID"`
+}

+ 54 - 0
routers/commentsRouter.go

@@ -511,6 +511,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ActivityCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ActivityCoAntroller"],
+        beego.ControllerComments{
+            Method: "DeadlineSet",
+            Router: `/activity/deadlineSet`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ActivityCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ActivityCoAntroller"],
         beego.ControllerComments{
             Method: "Delete",
@@ -1114,6 +1123,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ActivitySpecialTripCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ActivitySpecialTripCoAntroller"],
+        beego.ControllerComments{
+            Method: "TempMsg",
+            Router: `/special/trip/tempMsg`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ActivitySpecialTripCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ActivitySpecialTripCoAntroller"],
         beego.ControllerComments{
             Method: "TripList",
@@ -8467,6 +8485,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanyController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanyController"],
+        beego.ControllerComments{
+            Method: "DelRemark",
+            Router: `/remark/del`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanyController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanyController"],
         beego.ControllerComments{
             Method: "RenewReasonList",
@@ -9376,6 +9403,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:ReportUploadCommonController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:ReportUploadCommonController"],
+        beego.ControllerComments{
+            Method: "UploadImg",
+            Router: `/uploadImg`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:ResearchGroupController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:ResearchGroupController"],
         beego.ControllerComments{
             Method: "GetAdminResearchGroup",
@@ -9997,6 +10033,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: "GetEtaAuthCode",
+            Router: `/get_eta_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: "ModifyPwd",
@@ -10006,6 +10051,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:SysUserController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:SysUserController"],
+        beego.ControllerComments{
+            Method: "AuthCodeLogin",
+            Router: `/auth_code_login`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:SysUserController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:SysUserController"],
         beego.ControllerComments{
             Method: "Login",

+ 1 - 0
routers/router.go

@@ -58,6 +58,7 @@ func init() {
 		web.NSNamespace("/report",
 			web.NSInclude(
 				&controllers.ReportController{},
+				&controllers.ReportUploadCommonController{},
 			),
 		),
 		web.NSNamespace("/statistic_report",

+ 49 - 0
services/company.go

@@ -2300,3 +2300,52 @@ func FilterReadAndContractAuth(chartPermissions, contractPermissions, condition
 	cond += ` AND a.company_id IN (` + strings.Join(queryIdArr, ",") + `) `
 	return
 }
+
+// GetShareCompanyPermissionButton 正式客户共享-权限按钮(目前仅FICC有正式客户共享, 所以不管权益角色)
+func GetShareCompanyPermissionButton(roleTypeCode, statuses string, productId int) (button *company.ButtonPermission) {
+	statusMap := make(map[int]string)
+	statusMap[productId] = statuses
+	if strings.Contains(statuses, "/") {
+		statusArr := strings.Split(statuses, "/")
+		statusMap[1] = statusArr[0]
+		statusMap[2] = statusArr[1]
+	}
+
+	// 查看权限均有
+	button = new(company.ButtonPermission)
+	button.BtnView = true
+
+	// 超管, FICC管理员
+	if roleTypeCode == utils.ROLE_TYPE_CODE_ADMIN || roleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN {
+		button.BtnModifySeller = true
+		button.BtnRemarkView = true
+		button.BtnServiceRecord = true
+	}
+	status, ok := statusMap[1]
+	if !ok {
+		return
+	}
+
+	// ficc销售
+	ficcArr := []string{
+		utils.ROLE_TYPE_CODE_FICC_GROUP, utils.ROLE_TYPE_CODE_FICC_TEAM, utils.ROLE_TYPE_CODE_FICC_SELLER,
+	}
+	if !utils.InArrayByStr(ficcArr, roleTypeCode) {
+		return
+	}
+	if status == utils.COMPANY_STATUS_TRY_OUT {
+		button.BtnTurnPositive = true
+		button.BtnRemarkEdit = true
+		button.BtnRemarkView = true
+		button.BtnServiceRecord = true
+	}
+	if status == utils.COMPANY_STATUS_FORMAL {
+		button.BtnUpdate = true
+		button.BtnAddAgreement = true
+		button.BtnTryOut = true
+		button.BtnRemarkEdit = true
+		button.BtnRemarkView = true
+		button.BtnServiceRecord = true
+	}
+	return
+}

+ 178 - 0
services/crm_eta.go

@@ -0,0 +1,178 @@
+package services
+
+import (
+	"encoding/json"
+	"fmt"
+	"hongze/hz_crm_api/utils"
+	"io/ioutil"
+	"net/http"
+	"strings"
+)
+
+const (
+	LoginAuthCodeSource = 1
+)
+
+// MiddleServerResultData 中间服务响应体
+type MiddleServerResultData struct {
+	Code   int         `json:"code" description:"状态码"`
+	Msg    string      `json:"msg" description:"提示信息"`
+	Data   interface{} `json:"data" description:"返回数据"`
+	ErrMsg string      `json:"-" description:"错误信息,不用返回给前端,只是做日志记录"`
+}
+
+// GetLoginAuthCodeReq 获取登录编码请求体
+type GetLoginAuthCodeReq struct {
+	AdminName string `json:"admin_name" description:"用户名"`
+	Source    int    `json:"source" description:"来源: 1-CRM; 2-ETA"`
+}
+
+// GetAuthCodeFromMiddleServer CRM_ETA服务-获取登录编码
+func GetAuthCodeFromMiddleServer(adminName string) (authCode string, err error) {
+	url := fmt.Sprint(utils.CrmEtaServerUrl, "/api/auth/auth_code")
+	param := GetLoginAuthCodeReq{
+		Source:    LoginAuthCodeSource,
+		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)
+	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
+	}
+
+	code, ok := result.Data.(string)
+	if !ok {
+		err = fmt.Errorf("auth code empty")
+		return
+	}
+	authCode = code
+	return
+}
+
+// GetEtaTokenReq 获取Token请求体
+type GetEtaTokenReq struct {
+	AuthCode string `json:"auth_code"`
+}
+
+// GetEtaTokenDataResp 获取Token信息响应体
+type GetEtaTokenDataResp struct {
+	Code int             `json:"code" description:"状态码"`
+	Msg  string          `json:"msg" description:"提示信息"`
+	Data GetEtaTokenData `json:"data" description:"返回数据"`
+}
+
+// GetEtaTokenData Token数据
+type GetEtaTokenData struct {
+	Authorization   string `description:"Auth Token"`
+	AdminName       string `description:"系统用户名称"`
+	RealName        string `description:"系统用户姓名"`
+	RoleName        string `description:"角色名称"`
+	RoleTypeCode    string `description:"角色类型编码"`
+	SysRoleTypeCode string `description:"角色类型编码"`
+	AdminId         int    `description:"系统用户id"`
+	ProductName     string `description:"产品名称:admin,ficc,权益"`
+	Authority       int    `description:"管理权限,0:无,1:部门负责人,2:小组负责人,或者ficc销售主管,4:ficc销售组长"`
+}
+
+// CodeLoginFromMiddleServer 中间服务-编码登录
+func CodeLoginFromMiddleServer(authCode string) (tokenResp GetEtaTokenData, err error) {
+	url := fmt.Sprint(utils.CrmEtaServerUrl, "/api/auth/crm_token")
+	param := GetEtaTokenReq{
+		AuthCode: authCode,
+	}
+	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)
+	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(GetEtaTokenDataResp)
+	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
+	}
+	tokenResp = result.Data
+	return
+}

+ 42 - 2
services/cygx/acitvity.go

@@ -499,10 +499,37 @@ func CheckActivityAddAppointment(activityInfo *cygx.ActivityDetail) (isProhibit
 	return
 }
 
+//// 处理活动取消报名截止时间类型展示
+//func ActivityCancelDeadlineType(activityInfo *cygx.ActivityDetail) (cancelDeadlineType int) {
+//	//CancelDeadlineType      int                       `description:"取消报名截止时间类型,0:不设置,1:24小时之前、2:48小时之前"`
+//	//如果时间是初始值或者为空,就是默认为0 状态
+//	if activityInfo.CancelDeadline == "" || activityInfo.CancelDeadline == utils.EmptyDateTimeStr {
+//		cancelDeadlineType = 0
+//		return
+//	}
+//	activityTime := utils.StrTimeToTime(activityInfo.ActivityTime)     //时间字符串格式转时间格式
+//	cancelDeadline := utils.StrTimeToTime(activityInfo.CancelDeadline) //时间字符串格式转时间格式
+//	hourNum := activityTime.Sub(cancelDeadline).Hours()
+//	if hourNum == 24 {
+//		cancelDeadlineType = 1
+//	}
+//	if hourNum == 48 {
+//		cancelDeadlineType = 2
+//	}
+//	return
+//}
+
 // 解析查研观向的模板内容
 func ActivityBodyAnalysis(body string, activeState int, req cygx.ActivityRep) (itemr *cygx.CygxActivity, errstr string) {
 	item := new(cygx.CygxActivity)
 	body = strings.Replace(body, "<p data-f-id=\"pbf\" style=\"text-align: center; font-size: 14px; margin-top: 30px; opacity: 0.65; font-family: sans-serif;\">Powered by <a href=\"https://www.froala.com/wysiwyg-editor?pb=1\" title=\"Froala Editor\">Froala Editor</a></p>", "", -1)
+
+	//活动地址,活动地点,地点,地址,办会地点,办会地址。对地址字眼进行替换,对上述字段兼容做内容解析
+	body = strings.Replace(body, "活动地点:", "活动地址:", -1)
+	body = strings.Replace(body, "地点:", "活动地址:", -1)
+	body = strings.Replace(body, "地址:", "活动地址:", -1)
+	body = strings.Replace(body, "办会地点:", "活动地址:", -1)
+	body = strings.Replace(body, "办会地址:", "活动地址:", -1)
 	doc, _ := goquery.NewDocumentFromReader(strings.NewReader(body))
 	doc.Find("p").Each(func(i int, s *goquery.Selection) {
 		contentTxt := s.Text()
@@ -562,14 +589,27 @@ func ActivityBodyAnalysis(body string, activeState int, req cygx.ActivityRep) (i
 					errstr = "时间格式错误,请按照模板时间格式填写!"
 					return
 				}
-				//如果报名时间不为空,那么就做校验、
-				if req.SiginupDeadline != "" {
+				//如果报名时间不为空,而且是买方研选活动那么就做校验、
+				if req.SiginupDeadline != "" && strings.Contains(req.PermissionName, utils.CHART_PERMISSION_NAME_MF_YANXUAN) {
 					siginupDeadline := utils.StrTimeToTime(req.SiginupDeadline)
 					if siginupDeadline.After(resultTime) && activeState == 0 {
 						errstr = "截止时间需早于活动开始时间!"
 						return
 					}
 				}
+				//设置取消报名截止时间为会前一小时
+				item.CancelDeadline = resultTime.Add(-time.Hour * 1).Format(utils.FormatDateTime)
+				if req.IsResearchPoints == 1 {
+					if req.PointsSet.CancelDeadlineType == "1" && req.SiginupDeadline != "" {
+						item.CancelDeadline = req.SiginupDeadline
+					}
+					if req.PointsSet.CancelDeadlineType == "2" {
+						item.CancelDeadline = resultTime.Add(-time.Hour * 24).Format(utils.FormatDateTime)
+					}
+					if req.PointsSet.CancelDeadlineType == "3" {
+						item.CancelDeadline = resultTime.Add(-time.Hour * 48).Format(utils.FormatDateTime)
+					}
+				}
 			}
 		}
 		if strings.Contains(contentTxt, "主讲人:") {

+ 1 - 0
services/cygx/activity_points_set.go

@@ -131,6 +131,7 @@ func CheckActivityPointsSet(pointsSet *cygx.CygxActivityPointsSetRsq, activityId
 	item.UserPointsNum = pointsSet.UserPointsNum
 	item.PointsType = pointsSet.PointsType
 	item.CompanyPointsNum = pointsSet.CompanyPointsNum
+	item.CancelDeadlineType = pointsSet.CancelDeadlineType
 	item.CreateTime = time.Now()
 	item.ModifyTime = time.Now()
 	itemResp = item

+ 15 - 13
services/cygx/activity_special.go

@@ -234,11 +234,12 @@ func GetSpecialSurplusByCompany(companyId int) (specialSurplus string, err error
 			condition += ` AND company_id = ? `
 			pars = append(pars, companyId)
 
-			airborneTota, e = cygx.GetActivitySpecialTripAirborneCountByActivitySpecial(condition, pars)
-			if e != nil {
-				err = errors.New("GetActivitySpecialTripAirborneCountByActivitySpecial, Err: " + e.Error())
-				return
-			}
+			//到会空降的也加入流水记录表,这里不在做单独计算 2023-07-10
+			//airborneTota, e = cygx.GetActivitySpecialTripAirborneCountByActivitySpecial(condition, pars)
+			//if e != nil {
+			//	err = errors.New("GetActivitySpecialTripAirborneCountByActivitySpecial, Err: " + e.Error())
+			//	return
+			//}
 			//condition += ` AND is_valid = 1 `
 			//查询当年的数据
 			condition += ` AND create_time >= ?  `
@@ -286,14 +287,15 @@ func GetSpecialSurplusByCompany(companyId int) (specialSurplus string, err error
 			if len(chartList) == 0 {
 				return
 			}
-			airborneList, e := cygx.GetCygxActivitySpecialTripAirborneListByComapnyId(companyId)
-			if e != nil {
-				err = errors.New("获取品种信息失败, Err:" + e.Error())
-				return
-			}
-			for _, v := range airborneList {
-				mapPermissionNameTrip[v.ChartPermissionName] += 1
-			}
+			//到会空降的也加入流水记录表,这里不在做单独计算 2023-07-10
+			//airborneList, e := cygx.GetCygxActivitySpecialTripAirborneListByComapnyId(companyId)
+			//if e != nil {
+			//	err = errors.New("获取品种信息失败, Err:" + e.Error())
+			//	return
+			//}
+			//for _, v := range airborneList {
+			//	mapPermissionNameTrip[v.ChartPermissionName] += 1
+			//}
 
 			var condition string
 			var pars []interface{}

+ 3 - 51
services/cygx/special_wx_msg.go

@@ -231,27 +231,6 @@ func DetermineTripChange(activityId int, changeType, changeMsg string) (err erro
 		fmt.Println(e)
 		return
 	}
-	//var accessToken string
-	//if utils.RunMode == "release" {
-	//	accessToken, e = models.GetWxAccessTokenByXzs()
-	//	if e != nil {
-	//		err = e
-	//		return
-	//	}
-	//	if accessToken == "" {
-	//		return
-	//	}
-	//} else {
-	//	accessToken, e = models.GetWxAccessToken()
-	//	if e != nil {
-	//		return
-	//	}
-	//	if accessToken == "" {
-	//		msg = "accessToken is empty"
-	//		return
-	//	}
-	//}
-	//fmt.Println(listSignup)
 	var mobileArr []string
 	for _, v := range listSignup {
 		if v.Mobile != "" {
@@ -259,6 +238,9 @@ func DetermineTripChange(activityId int, changeType, changeMsg string) (err erro
 		}
 	}
 	mobileLen := len(mobileArr)
+	if mobileLen == 0 {
+		return
+	}
 	var condition string
 	var pars []interface{}
 	if mobileLen > 0 {
@@ -274,36 +256,6 @@ func DetermineTripChange(activityId int, changeType, changeMsg string) (err erro
 	if len(openIdList) == 0 {
 		return
 	}
-	//sendMap := make(map[string]interface{})
-	//sendData := make(map[string]interface{})
-	//var first string
-	//var keyword1 string
-	//var keyword2 string
-	//
-	//if changeType == "City" {
-	//	first = "【" + activityInfo.ResearchTheme + "】专项调研发生了城市变更"
-	//} else if changeType == "dateList" {
-	//	first = "【" + activityInfo.ResearchTheme + "】专项调研发生了时间变更"
-	//} else {
-	//	first = "【" + activityInfo.ResearchTheme + "】专项调研发生了调研形式变更"
-	//}
-	//keyword1 = activityInfo.ResearchTheme
-	//keyword2 = changeMsg
-	//redirectUrl := ""
-	//sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
-	//sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
-	//sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
-	//sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
-	//if utils.RunMode == "release" {
-	//	sendMap["template_id"] = utils.WxMsgTemplateIdActivityChangeApplyXzs
-	//} else {
-	//	sendMap["template_id"] = utils.WxMsgTemplateIdActivityChangeApply
-	//}
-	//sendMap["url"] = redirectUrl
-	//sendMap["data"] = sendData
-	//sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxCygxAppId, "pagepath": "activityPages/specialDetail/specialDetail?id=" + strconv.Itoa(activityId)}
-	//services.PublicsendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(activityId), utils.TEMPLATE_MSG_CYGX_ACTIVITY_UPDATE)
-
 	openIdArr := make([]string, len(openIdList))
 	for i, v := range openIdList {
 		openIdArr[i] = v.OpenId

+ 528 - 0
services/elastic/es_comprehensive.go

@@ -0,0 +1,528 @@
+package elastic
+
+import (
+	"context"
+	"errors"
+	"fmt"
+	"github.com/PuerkitoBio/goquery"
+	"github.com/olivere/elastic/v7"
+	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/services/alarm_msg"
+	"hongze/hz_crm_api/utils"
+	"html"
+	"strconv"
+	"strings"
+)
+
+type ElasticComprehensiveDetail struct {
+	SourceId     int    `description:"资源ID"`
+	IsSummary    int    `description:"是否是纪要"`
+	Source       string `description:"资源类型 报告 :article 、图表 :newchart、微路演 :roadshow、活动 :activity、活动视频:activityvideo、活动音频:activityvoice、专项调研活动:activityspecial 、 本周研究汇总: researchsummary 、 上周纪要汇总 :minutessummary 、晨会精华 :meetingreviewchapt  、 产品内测:productinterior 、 产业资源包:industrialsource"`
+	Title        string `description:"标题"`
+	BodyText     string `description:"内容"`
+	PublishDate  string `description:"发布时间"`
+	Abstract     string `description:"摘要"`
+	Annotation   string `description:"核心观点"`
+	IndustryName string `description:"产业名称"`
+	SubjectNames string `description:"标的名称"`
+}
+
+// 新增和修改数据
+func EsAddOrEditComprehensiveData(item *ElasticComprehensiveDetail) (err error) {
+	indexName := utils.IndexNameComprehensive // 避免调用错别的项目的索引 ,这里写死
+	//return
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg("更新综合页面数据Es失败"+err.Error()+fmt.Sprint(item), 2)
+		}
+	}()
+	client, err := NewClient()
+	if err != nil {
+		fmt.Println(err, "err1")
+		return
+	}
+	mustMap := make([]interface{}, 0)
+	mustMap = append(mustMap, map[string]interface{}{
+		"term": map[string]interface{}{
+			"SourceId": item.SourceId,
+		},
+	})
+	mustMap = append(mustMap, map[string]interface{}{
+		"term": map[string]interface{}{
+			"Source": item.Source,
+		},
+	})
+	//fmt.Println(item.SourceId)
+	queryMap := map[string]interface{}{
+		"query": map[string]interface{}{
+			"bool": map[string]interface{}{
+				"must": mustMap,
+			},
+		},
+	}
+	requestTotalHits := client.Count(indexName).BodyJson(queryMap)
+	total, e := requestTotalHits.Do(context.Background())
+	if e != nil {
+		err = errors.New("requestTotalHits.Do(context.Background()), Err: " + e.Error())
+		return
+	}
+	//return
+	//根据来源以及ID ,判断内容是否存在,如果存在就新增,如果不存在就修改
+	if total == 0 {
+		resp, e := client.Index().Index(indexName).BodyJson(item).Do(context.Background())
+		if e != nil {
+			err = errors.New("client.Index().Index(indexName).BodyJson(item).Do(context.Background()), Err: " + e.Error())
+			return
+		}
+		if resp.Status == 0 && resp.Result == "created" {
+			//fmt.Println("新增成功")
+			//err = nil
+			return
+		} else {
+			err = errors.New(fmt.Sprint(resp))
+			return
+		}
+	} else {
+		//拼接需要改动的前置条件
+		bool_query := elastic.NewBoolQuery()
+		bool_query.Must(elastic.NewTermQuery("SourceId", item.SourceId))
+		bool_query.Must(elastic.NewTermQuery("Source", item.Source))
+		//设置需要改动的内容
+		var script string
+		script += fmt.Sprint("ctx._source['SubjectNames'] = '", item.SubjectNames, "';")
+		script += fmt.Sprint("ctx._source['PublishDate'] = '", item.PublishDate, "';")
+		script += fmt.Sprint("ctx._source['IsSummary'] = ", item.IsSummary, ";")
+		script += fmt.Sprint("ctx._source['Abstract'] = '", item.Abstract, "';")
+		script += fmt.Sprint("ctx._source['Title'] = '", item.Title, "';")
+		script += fmt.Sprint("ctx._source['BodyText'] = '", item.BodyText, "';")
+		script += fmt.Sprint("ctx._source['Annotation'] = '", item.Annotation, "';")
+		script += fmt.Sprint("ctx._source['IndustryName'] = '", item.IndustryName, "'")
+
+		_, e := client.UpdateByQuery(indexName).
+			Query(bool_query).
+			Script(elastic.NewScriptInline(script)).
+			Refresh("true").
+			Do(context.Background())
+		if e != nil {
+			err = errors.New(" client.UpdateByQuery(indexName), Err: " + e.Error())
+			return
+		}
+	}
+	return
+}
+
+// 删除数据
+func EsDeleteComprehensiveData(item *ElasticComprehensiveDetail) (err error) {
+	indexName := utils.IndexNameComprehensive // 避免调用错别的项目的索引 ,这里写死
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg("删除数据综合页面数据Es失败"+err.Error()+fmt.Sprint(item), 2)
+		}
+	}()
+	fmt.Println("删除", item.SourceId)
+	client, err := NewClient()
+	//拼接需要删除的前置条件
+	bool_query := elastic.NewBoolQuery()
+	bool_query.Must(elastic.NewTermQuery("SourceId", item.SourceId))
+	bool_query.Must(elastic.NewTermQuery("Source", item.Source))
+	_, e := client.DeleteByQuery(indexName).
+		Query(bool_query).
+		Do(context.Background())
+	if e != nil {
+		err = errors.New(" client.DeleteByQuery(indexName), Err: " + e.Error())
+		return
+	}
+	return
+}
+
+// ES添加文章:报告、纪要
+func AddComprehensiveArticle(sourceId int) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println("err:", err)
+			go alarm_msg.SendAlarmMsg("AddComprehensiveArticle,Err:"+err.Error(), 3)
+		}
+	}()
+	v, e := cygx.GetArticleInfoOtherByArticleId(sourceId)
+	if e != nil {
+		err = errors.New("GetArticleInfoOtherByArticleId" + e.Error())
+		return
+	}
+	content := html.UnescapeString(v.Body)
+	doc, e := goquery.NewDocumentFromReader(strings.NewReader(content))
+	if e != nil {
+		err = errors.New("goquery.NewDocumentFromReader" + e.Error())
+		return
+	}
+	bodyText := doc.Text()
+	item := new(ElasticComprehensiveDetail)
+	item.SourceId = v.ArticleId
+	item.IsSummary = v.IsSummary
+	item.Source = utils.CYGX_OBJ_ARTICLE
+	item.Title = v.Title
+	item.PublishDate = v.PublishDate.Format(utils.FormatDateTime)
+	item.BodyText = bodyText
+	item.Annotation = html.UnescapeString(v.Annotation)
+	item.Abstract = html.UnescapeString(v.Abstract)
+	if v.PublishStatus == 1 {
+		EsAddOrEditComprehensiveData(item) //如果发布了就新增
+	} else {
+		EsDeleteComprehensiveData(item) // 没有发布就删除
+	}
+	return
+}
+
+// Es添加活动
+func AddComprehensiveActivity(sourceId int) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println("err:", err)
+			go alarm_msg.SendAlarmMsg("AddComprehensiveActivity,Err:"+err.Error(), 3)
+		}
+	}()
+	activityId := sourceId
+	detail, e := cygx.GetAddActivityInfoById(sourceId)
+	if e != nil {
+		err = errors.New("GetAddActivityInfoById" + e.Error())
+		return
+	}
+	mapActivityIndustrialManagement := make(map[int][]string)
+	mapActivitySubject := make(map[int][]string)
+	industrialList, e := cygx.GetIndustrialActivityGroupManagementList(activityId, 1)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetIndustrialActivityGroupManagementList" + e.Error())
+		return
+	}
+	if len(industrialList) > 0 {
+		for _, v := range industrialList {
+			mapActivityIndustrialManagement[activityId] = append(mapActivityIndustrialManagement[activityId], v.IndustryName)
+		}
+		subjectList, e := cygx.GetSubjectActivityGroupManagementList(activityId, 1)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			err = errors.New("GetSubjectActivityGroupManagementList" + e.Error())
+			return
+		}
+		if len(subjectList) > 0 {
+			for _, v := range subjectList {
+				mapActivitySubject[activityId] = append(mapActivitySubject[activityId], v.SubjectName)
+			}
+		}
+	}
+
+	item := new(ElasticComprehensiveDetail)
+	item.SourceId = detail.ActivityId
+	item.Source = utils.CYGX_OBJ_ACTIVITY
+	item.SubjectNames = strings.Join(mapActivitySubject[detail.ActivityId], ",")
+	item.IndustryName = strings.Join(mapActivityIndustrialManagement[detail.ActivityId], ",")
+	item.Title = detail.ActivityName
+	item.PublishDate = detail.ActivityTime
+	if detail.PublishStatus == 1 {
+		EsAddOrEditComprehensiveData(item) //如果发布了就新增
+	} else {
+		EsDeleteComprehensiveData(item) // 没有发布就删除
+	}
+	return
+}
+
+// Es添加专项调研活动
+func AddComprehensiveActivitySpecial(sourceId int) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println("err:", err)
+			go alarm_msg.SendAlarmMsg("AddComprehensiveActivitySpecial,Err:"+err.Error(), 3)
+		}
+	}()
+	activityId := sourceId
+	detail, e := cygx.GetAddActivityInfoSpecialById(sourceId)
+	if e != nil {
+		err = errors.New("GetAddActivityInfoSpecialById" + e.Error())
+		return
+	}
+	mapActivityIndustrialManagement := make(map[int][]string)
+	mapActivitySubject := make(map[int][]string)
+	industrialList, e := cygx.GetIndustrialActivityGroupManagementList(activityId, 2)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetIndustrialActivityGroupManagementList" + e.Error())
+		return
+	}
+	if len(industrialList) > 0 {
+		for _, v := range industrialList {
+			mapActivityIndustrialManagement[activityId] = append(mapActivityIndustrialManagement[activityId], v.IndustryName)
+		}
+		subjectList, e := cygx.GetSubjectActivityGroupManagementList(activityId, 2)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			err = errors.New("GetSubjectActivityGroupManagementList" + e.Error())
+			return
+		}
+		if len(subjectList) > 0 {
+			for _, v := range subjectList {
+				mapActivitySubject[activityId] = append(mapActivitySubject[activityId], v.SubjectName)
+			}
+		}
+	}
+
+	item := new(ElasticComprehensiveDetail)
+	item.SourceId = detail.ActivityId
+	item.Source = utils.CYGX_OBJ_ACTIVITYSPECIAL
+	item.SubjectNames = strings.Join(mapActivitySubject[detail.ActivityId], ",")
+	item.IndustryName = strings.Join(mapActivityIndustrialManagement[detail.ActivityId], ",")
+	item.Title = detail.ResearchTheme
+	if detail.ActivityTime == utils.EmptyDateTimeStr {
+		item.PublishDate = detail.LastUpdatedTime.Format(utils.FormatDateTime)
+	} else {
+		item.PublishDate = detail.ActivityTime
+	}
+	if detail.PublishStatus == 1 {
+		EsAddOrEditComprehensiveData(item) //如果发布了就新增
+	} else {
+		EsDeleteComprehensiveData(item) // 没有发布就删除
+	}
+	return
+}
+
+// Es添加活动视频
+func AddComprehensiveActivityVideo(activityId int) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println("err:", err)
+			go alarm_msg.SendAlarmMsg("AddComprehensiveActivityVideo,Err:"+err.Error(), 3)
+		}
+	}()
+
+	detailactivity, e := cygx.GetAddActivityInfoById(activityId)
+	if e != nil {
+		err = errors.New("GetAddActivityInfoById" + e.Error())
+		return
+	}
+	detail, e := cygx.GetCygxActivityVideoReqDetail(activityId)
+	if e != nil {
+		err = errors.New("GetAddActivityInfoById" + e.Error())
+		return
+	}
+	item := new(ElasticComprehensiveDetail)
+	item.SourceId = detail.VideoId
+	item.Source = utils.CYGX_OBJ_ACTIVITYVIDEO
+	if detail == nil {
+		EsDeleteComprehensiveData(item) //如果活动视频不存在 没有发布就删除
+	}
+
+	mapActivityIndustrialManagement := make(map[int][]string)
+	mapActivitySubject := make(map[int][]string)
+	industrialList, e := cygx.GetIndustrialActivityGroupManagementList(activityId, 1)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetIndustrialActivityGroupManagementList" + e.Error())
+		return
+	}
+	if len(industrialList) > 0 {
+		for _, v := range industrialList {
+			mapActivityIndustrialManagement[activityId] = append(mapActivityIndustrialManagement[activityId], v.IndustryName)
+		}
+		subjectList, e := cygx.GetSubjectActivityGroupManagementList(activityId, 1)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			err = errors.New("GetSubjectActivityGroupManagementList" + e.Error())
+			return
+		}
+		if len(subjectList) > 0 {
+			for _, v := range subjectList {
+				mapActivitySubject[activityId] = append(mapActivitySubject[activityId], v.SubjectName)
+			}
+		}
+	}
+	item.SubjectNames = strings.Join(mapActivitySubject[detail.ActivityId], ",")
+	item.IndustryName = strings.Join(mapActivityIndustrialManagement[detail.ActivityId], ",")
+	item.Title = detail.VideoName
+	item.BodyText = detailactivity.ActivityName
+	item.PublishDate = detailactivity.ActivityTime
+	EsAddOrEditComprehensiveData(item) //新增或者修改
+	return
+}
+
+// Es添加活动音频
+func AddComprehensiveActivityVoice(activityId int) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println("err:", err)
+			go alarm_msg.SendAlarmMsg("AddComprehensiveActivityVoice,Err:"+err.Error(), 3)
+		}
+	}()
+
+	detailactivity, e := cygx.GetAddActivityInfoById(activityId)
+	if e != nil {
+		err = errors.New("GetAddActivityInfoById" + e.Error())
+		return
+	}
+
+	detail, e := cygx.GetCygxActivityVoiceReqDetail(activityId)
+	if e != nil {
+		err = errors.New("GetAddActivityInfoById" + e.Error())
+		return
+	}
+	item := new(ElasticComprehensiveDetail)
+	item.SourceId = detail.ActivityVoiceId
+	item.Source = utils.CYGX_OBJ_ACTIVITYVOICE
+	if detail == nil {
+		EsDeleteComprehensiveData(item) //如果不存在就先删除
+	}
+
+	mapActivityIndustrialManagement := make(map[int][]string)
+	mapActivitySubject := make(map[int][]string)
+	industrialList, e := cygx.GetIndustrialActivityGroupManagementList(activityId, 1)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetIndustrialActivityGroupManagementList" + e.Error())
+		return
+	}
+	if len(industrialList) > 0 {
+		for _, v := range industrialList {
+			mapActivityIndustrialManagement[activityId] = append(mapActivityIndustrialManagement[activityId], v.IndustryName)
+		}
+		subjectList, e := cygx.GetSubjectActivityGroupManagementList(activityId, 1)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			err = errors.New("GetSubjectActivityGroupManagementList" + e.Error())
+			return
+		}
+		if len(subjectList) > 0 {
+			for _, v := range subjectList {
+				mapActivitySubject[activityId] = append(mapActivitySubject[activityId], v.SubjectName)
+			}
+		}
+	}
+	item.SubjectNames = strings.Join(mapActivitySubject[detail.ActivityId], ",")
+	item.IndustryName = strings.Join(mapActivityIndustrialManagement[detail.ActivityId], ",")
+	item.Title = detail.VoiceName
+	item.BodyText = detailactivity.ActivityName
+	item.PublishDate = detailactivity.ActivityTime
+	EsAddOrEditComprehensiveData(item) //新增或者修改
+	return
+}
+
+// Es添加微路演
+func AddComprehensiveRoadshow(sourceId int) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println("err:", err)
+			go alarm_msg.SendAlarmMsg("AddComprehensiveActivityVoice,Err:"+err.Error(), 3)
+		}
+	}()
+	v, e := cygx.GetMicroRoadshowVideoByVideoId(sourceId)
+	if e != nil {
+		err = errors.New("GetMicroRoadshowVideoByVideoId" + e.Error())
+		return
+	}
+	item := new(ElasticComprehensiveDetail)
+	item.SourceId = v.VideoId
+	item.Source = utils.CYGX_OBJ_ROADSHOW
+	item.IndustryName = v.IndustryName
+	item.Title = v.VideoName
+	item.PublishDate = v.PublishDate.Format(utils.FormatDateTime)
+	if v.PublishStatus == 1 {
+		EsAddOrEditComprehensiveData(item) //如果发布了就新增
+	} else {
+		EsDeleteComprehensiveData(item) // 没有发布就删除
+	}
+	return
+
+}
+
+// Es添加晨会精华
+func AddComprehensiveMeetingreviewchapt(sourceId int) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println("err:", err)
+			go alarm_msg.SendAlarmMsg("AddComprehensiveMeetingreviewchapt,Err:"+err.Error(), 3)
+		}
+	}()
+	v, e := cygx.GetCygxMorningMeetingReviewChapterDetail(sourceId)
+	if e != nil {
+		err = errors.New("GetCygxMorningMeetingReviewChapterDetail" + e.Error())
+		return
+	}
+	content := html.UnescapeString(v.Content)
+	doc, e := goquery.NewDocumentFromReader(strings.NewReader(content))
+	if e != nil {
+		err = errors.New("goquery.NewDocumentFromReader" + e.Error())
+		return
+	}
+	bodyText := doc.Text()
+	item := new(ElasticComprehensiveDetail)
+	item.SourceId = sourceId
+	item.Source = utils.CYGX_OBJ_MEETINGREVIEWCHAPT
+	item.IndustryName = v.IndustryName
+	item.PublishDate = v.MeetingTime.Format(utils.FormatDateTime)
+	item.Abstract = bodyText
+	EsAddOrEditComprehensiveData(item) //如果发布了就新增
+	return
+}
+
+// Es删除晨会精华
+func DeleteComprehensiveMeetingreviewchapt(sourceId int) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println("err:", err)
+			go alarm_msg.SendAlarmMsg("AddComprehensiveMeetingreviewchapt,Err:"+err.Error(), 3)
+		}
+	}()
+	item := new(ElasticComprehensiveDetail)
+	item.SourceId = sourceId
+	item.Source = utils.CYGX_OBJ_MEETINGREVIEWCHAPT
+	EsDeleteComprehensiveData(item) //删除
+	return
+}
+
+// 添加产业资源包
+func AddComprehensiveIndustrialSource(sourceType string, articleId int) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg("AddComprehensiveIndustrialSource"+err.Error(), 2)
+		}
+	}()
+	var condition string
+	var pars []interface{}
+	mapActivitySubject := make(map[int][]string, 0)
+	listsubject, e := cygx.GetCygxIndustrialSubjectListCondition(condition, pars)
+	if e != nil {
+		err = errors.New("GetIndustrialManagementRepList, Err: " + e.Error())
+		return
+	}
+	for _, v := range listsubject {
+		mapActivitySubject[v.IndustrialManagementId] = append(mapActivitySubject[v.IndustrialManagementId], v.SubjectName)
+	}
+	var industrialsource string
+	if sourceType == "Hz" {
+		condition = " AND a.article_type_id  = 0  " // 弘则资源包
+		industrialsource = "industrialsourceHz"
+	} else {
+		condition = " AND a.article_type_id  > 0  " //研选资源包
+		industrialsource = "industrialsourceYx"
+	}
+	if articleId > 0 {
+		condition += "  AND a.article_id = " + strconv.Itoa(articleId)
+	}
+	list, err := cygx.GetSearchResourceList(0, condition, 0, 0)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+	if len(list) == 0 {
+		return
+	}
+	for _, v := range list {
+		item := new(ElasticComprehensiveDetail)
+		item.SourceId = v.IndustrialManagementId
+		item.Source = industrialsource
+		item.IndustryName = v.IndustryName
+		item.SubjectNames = strings.Join(mapActivitySubject[v.IndustrialManagementId], ",")
+		item.PublishDate = v.PublishDate + " 00:00:00"
+		EsAddOrEditComprehensiveData(item)
+	}
+}

+ 12 - 0
utils/config.go

@@ -79,6 +79,7 @@ var (
 var (
 	IndexName                      string //Es索引
 	IndexNameArticleHistory        string //文章阅读记录Es索引
+	IndexNameComprehensive         string //综合搜索Es索引
 	SummaryArticleId               int    //手动添加的纪要库开始ID
 	YanxSummaryPermissionId        int    //研选纪要分类ID
 	YanxViewpointPermissionId      int    //研选观点分类ID
@@ -152,6 +153,9 @@ var EnPolicyReportUrl string
 // MayCurBaseUrl 每刻报销地址
 var MayCurBaseUrl string
 
+// CrmEtaServerUrl CRM-ETA服务地址
+var CrmEtaServerUrl string
+
 func init() {
 	tmpRunMode, err := web.AppConfig.String("run_mode")
 	if err != nil {
@@ -237,6 +241,7 @@ ZwIDAQAB
 		//Endpoint = "oss-cn-shanghai.aliyuncs.com"
 		IndexName = "cygx_article_v03_23"
 		IndexNameArticleHistory = "cygx_article_history_v07_08"
+		IndexNameComprehensive = "cygx_comprehensive"
 		TemplateCompanyApplyRedirectUrl = "https://ficc.hzinsights.com/approval/approval/list"
 
 		//同花顺正式地址
@@ -261,6 +266,9 @@ ZwIDAQAB
 		EnPolicyReportUrl = "https://en.hzinsights.com/v2api/"
 
 		MayCurBaseUrl = "https://ng.maycur.com"
+
+		// CRM-ETA服务地址
+		CrmEtaServerUrl = "http://127.0.0.1:8708"
 	} else {
 
 		TemplateRedirectUrl = "http://rddpweb.brilliantstart.cn/reportdtl?id="
@@ -272,6 +280,7 @@ ZwIDAQAB
 		Endpoint = "oss-cn-shanghai.aliyuncs.com"
 		IndexName = "cygx_article_v1"
 		IndexNameArticleHistory = "cygx_article_history_v1"
+		IndexNameComprehensive = "cygx_comprehensive_test"
 
 		//同花顺测试地址
 		THS_SendUrl = `https://mtest.10jqka.com.cn/gateway/ps/syncNews`
@@ -296,6 +305,9 @@ ZwIDAQAB
 
 		//MayCurBaseUrl = "https://ng-uat.maycur.com"
 		MayCurBaseUrl = "https://ng.maycur.com"
+
+		// CRM-ETA服务地址
+		CrmEtaServerUrl = "http://127.0.0.1:8702"
 	}
 	tmpLibreOfficePath, err := web.AppConfig.String("libreOfficePath")
 	if err != nil {

+ 22 - 0
utils/constants.go

@@ -290,6 +290,11 @@ const (
 	CACHE_KEY_DAYNEW_REFRESH          = "admin:day_new:refresh"               //每日资讯拉取企业微信聊天记录
 	CACHE_KEY_DAYNEW_TRANSLATE        = "admin:day_new:translate"             //每日资讯中翻英
 	CACHE_KEY_ADMIN_OPERATE_RECORD    = "HZ_ADMIN_CACHE_ADMIN_OPERATE_RECORD" //系统用户操作日志队列
+
+	CACHE_SYNC_ADMIN      = "hz_crm_eta:sync_admin"      // 同步用户的缓存队列key
+	CACHE_SYNC_ROLE       = "hz_crm_eta:sync_role"       // 同步角色的缓存队列key
+	CACHE_SYNC_DEPARTMENT = "hz_crm_eta:sync_department" // 同步部门的缓存队列key
+	CACHE_SYNC_GROUP      = "hz_crm_eta:sync_group"      // 同步分组的缓存队列key
 )
 
 // 模板消息推送类型
@@ -398,6 +403,17 @@ const (
 	CHART_PERMISSION_ID_45W                        = 2002     // 权益45w大套餐表示的权限ID(自定义)
 )
 
+const (
+	CYGX_OBJ_ARTICLE            string = "article"            // 对象类型:文章
+	CYGX_OBJ_ACTIVITY           string = "activity"           // 对象类型:活动
+	CYGX_OBJ_ACTIVITYVIDEO      string = "activityvideo"      // 对象类型:活动视频
+	CYGX_OBJ_ACTIVITYVOICE      string = "activityvoice"      // 对象类型:活动音频
+	CYGX_OBJ_ACTIVITYSPECIAL    string = "activityspecial"    // 对象类型:专项调研活动
+	CYGX_OBJ_MEETINGREVIEWCHAPT string = "meetingreviewchapt" // 对象类型:晨会精华
+	CYGX_OBJ_ROADSHOW           string = "roadshow"           // 对象类型:路演
+)
+
+
 const (
 	SendTemplateMsgAuthorization = "dc855fce962a639faa779cbdd4cd332f"
 )
@@ -486,3 +502,9 @@ var FrequencyDaysMap = map[string]int{
 const (
 	AiChatLimit = 50
 )
+
+// 系统来源
+const (
+	SOURCE_CRM_FLAG = 1
+	SOURCE_ETA_FLAG = 2
+)