Browse Source

Merge branch 'master' of http://8.136.199.33:3000/hongze/hz_crm_api into export_article_pv

xingzai 5 months ago
parent
commit
68f145b114
53 changed files with 2460 additions and 470 deletions
  1. 90 8
      controllers/company.go
  2. 2 2
      controllers/company_apply_v2.go
  3. 20 1
      controllers/company_renewal.go
  4. 198 14
      controllers/company_seller.go
  5. 20 1
      controllers/company_service_record.go
  6. 24 1
      controllers/company_share.go
  7. 30 1
      controllers/cygx/activity.go
  8. 1 1
      controllers/cygx/activity_meet.go
  9. 36 9
      controllers/cygx/activity_video.go
  10. 2 2
      controllers/cygx/askserie_video.go
  11. 1 1
      controllers/cygx/micro_roadshow.go
  12. 8 0
      controllers/cygx/order.go
  13. 165 8
      controllers/cygx/rai_serve.go
  14. 126 1
      controllers/cygx/report_article.go
  15. 582 197
      controllers/cygx/user.go
  16. 3 2
      controllers/cygx/user_admin_share_history.go
  17. 26 2
      controllers/cygx/user_feedback.go
  18. 2 2
      controllers/cygx/yanxuan_special.go
  19. 13 1
      controllers/help_doc/doc.go
  20. 109 13
      controllers/roadshow/calendar.go
  21. 5 0
      controllers/statistic_company_merge.go
  22. 35 25
      models/company/company.go
  23. 103 0
      models/company/company_history_remark.go
  24. 2 2
      models/company/company_no_renewed_note.go
  25. 13 4
      models/company/company_product.go
  26. 2 2
      models/company/company_service_record.go
  27. 47 45
      models/cygx/activity.go
  28. 45 0
      models/cygx/activity_user_template_record.go
  29. 75 0
      models/cygx/activity_vivo_points_set.go
  30. 6 1
      models/cygx/cygx_user.go
  31. 7 3
      models/cygx/cygx_user_record.go
  32. 1 1
      models/cygx/rai_serve_company.go
  33. 11 1
      models/cygx/user_feedback.go
  34. 3 0
      models/db.go
  35. 3 3
      models/roadshow/rs_calendar_meeting_user.go
  36. 9 0
      models/statistic_report.go
  37. 12 0
      models/system/sys_group.go
  38. 6 6
      models/yb/apply_record.go
  39. 18 0
      routers/commentsRouter.go
  40. 2 2
      services/aliyun_ocr.go
  41. 54 8
      services/company.go
  42. 243 0
      services/company_record.go
  43. 106 46
      services/cygx/acitvity.go
  44. 16 16
      services/cygx/activity_ocr.go
  45. 44 0
      services/cygx/activity_points_set.go
  46. 23 6
      services/cygx/activity_poster.go
  47. 36 7
      services/cygx/activity_wx_msg.go
  48. 4 4
      services/cygx/askserie_video.go
  49. 31 0
      services/cygx/contract_allocation.go
  50. 4 4
      services/cygx/mail.go
  51. 1 1
      services/cygx/user_label.go
  52. 29 12
      services/wechat_send_category_template_msg.go
  53. 6 4
      utils/constants.go

+ 90 - 8
controllers/company.go

@@ -1702,6 +1702,14 @@ func (this *CompanyController) List() {
 			//永续客户X类试用客户出参转换
 			v.StatusStr = strings.Replace(v.StatusStr, utils.COMPANY_STATUS_FOREVER, utils.COMPANY_STATUS_X_CLASS_TRY_OUT, -1)
 
+			if !utils.InArrayByStr([]string{"正式", "试用", "永续", "X类试用"}, v.Status) { //不是这几种状态不做标红处理
+				v.IsUserMaker = 0
+			}
+
+			//解决共享客户正式筛选下是否标红的问题
+			if v.WeekViewActive == 0 && v.IsUserMaker == 1 {
+				v.WeekViewActive = 1
+			}
 			companyList := &company.CompanyListItem{
 				CompanyId:        v.CompanyId,
 				CompanyName:      v.CompanyName,
@@ -1766,6 +1774,7 @@ func (this *CompanyController) List() {
 				CloseReason:     v.CloseReason,
 				ShareSellerId:   v.ShareSellerId,
 				ShareSellerIds:  v.ShareSellerIds,
+				IsUserMaker:     v.IsUserMaker,
 			}
 			if v.ShareSellerIds != "" {
 				shareSellerIds := strings.Split(v.ShareSellerIds, ",")
@@ -2866,7 +2875,7 @@ func (this *CompanyController) Add() {
 				return
 			}
 			if tryOutCountRai >= utils.COMPANY_STATUS_TRY_OUT_COUNT_RAI {
-				br.Msg = "非研选试用客户最多30家"
+				br.Msg = "非研选试用客户最多40家"
 				return
 			}
 		}
@@ -3988,7 +3997,7 @@ func (this *CompanyController) Edit() {
 					return
 				}
 				if tryOutCountRai >= utils.COMPANY_STATUS_TRY_OUT_COUNT_RAI {
-					br.Msg = "非研选试用客户最多30家"
+					br.Msg = "非研选试用客户最多40家"
 					return
 				}
 			}
@@ -4989,7 +4998,7 @@ func (this *CompanyController) Receive() {
 				return
 			}
 			if tryOutCountRai >= utils.COMPANY_STATUS_TRY_OUT_COUNT_RAI {
-				br.Msg = "非研选试用客户最多30家"
+				br.Msg = "非研选试用客户最多40家"
 				return
 			}
 		}
@@ -5271,7 +5280,7 @@ func (this *CompanyController) MoveSeller() {
 				return
 			}
 			if tryOutCountRai >= utils.COMPANY_STATUS_TRY_OUT_COUNT_RAI {
-				br.Msg = seller.RealName + "的非研选试用客户已超过30家"
+				br.Msg = seller.RealName + "的非研选试用客户已超过40家"
 				return
 			}
 		}
@@ -8237,7 +8246,8 @@ func (this *CompanyController) EditTryOutCompanyReason() {
 	endDateTime, _ = time.Parse(utils.FormatDate, endDate)
 	sub := time.Now().Sub(endDateTime)
 	renewalReason.ExpirationTimeExceeded = int(sub.Hours() / 24)
-	err = company.AddRenewalReason(&renewalReason)
+	var newId int64
+	newId, err = company.AddRenewalReason(&renewalReason)
 	if err != nil {
 		br.Msg = "新增续约情况说明操作异常!"
 		br.ErrMsg = "新增续约情况说明操作异常,err:" + err.Error()
@@ -8342,6 +8352,22 @@ func (this *CompanyController) EditTryOutCompanyReason() {
 		return
 	}
 
+	if req.ProductId == utils.COMPANY_PRODUCT_RAI_ID {
+		//权益客户新增历史备注总表
+		itemRecord := new(company.CompanyHistoryRemark)
+		itemRecord.CompanyId = req.CompanyId
+		itemRecord.Content = req.Remark
+		itemRecord.SysAdminId = sysUser.AdminId
+		itemRecord.SysAdminName = sysUser.RealName
+		itemRecord.CreateTime = time.Now().Local()
+		itemRecord.ModifyTime = time.Now().Local()
+		itemRecord.ShowTime = time.Now().Local()
+		itemRecord.ProductId = 2
+		itemRecord.TableName = "company_renewal_reason"
+		itemRecord.TableId = int(newId)
+		go services.AddCompanyHistoryRemark(itemRecord)
+	}
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "编辑成功"
@@ -8437,7 +8463,8 @@ func (this *CompanyController) AddTryOutCompanyReason() {
 	endDateTime, _ = time.Parse(utils.FormatDate, endDate)
 	sub := time.Now().Sub(endDateTime)
 	renewalReason.ExpirationTimeExceeded = int(sub.Hours() / 24)
-	err = company.AddRenewalReason(&renewalReason)
+	var newId int64
+	newId, err = company.AddRenewalReason(&renewalReason)
 	if err != nil {
 		br.Msg = "新增续约情况说明操作异常!"
 		br.ErrMsg = "新增续约情况说明操作异常,err:" + err.Error()
@@ -8523,6 +8550,22 @@ func (this *CompanyController) AddTryOutCompanyReason() {
 			companyProduct.ProductName, sysUser.RealName, remark, operation, approveContent, approveContentExtra, sysUser.RealName, "", companyProduct.Status)
 	}
 
+	if req.ProductId == utils.COMPANY_PRODUCT_RAI_ID {
+		//权益客户新增历史备注总表
+		itemRecord := new(company.CompanyHistoryRemark)
+		itemRecord.CompanyId = req.CompanyId
+		itemRecord.Content = req.Remark
+		itemRecord.SysAdminId = sysUser.AdminId
+		itemRecord.SysAdminName = sysUser.RealName
+		itemRecord.CreateTime = time.Now().Local()
+		itemRecord.ModifyTime = time.Now().Local()
+		itemRecord.ShowTime = time.Now().Local()
+		itemRecord.ProductId = 2
+		itemRecord.TableName = "company_renewal_reason"
+		itemRecord.TableId = int(newId)
+		go services.AddCompanyHistoryRemark(itemRecord)
+	}
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "编辑成功"
@@ -8678,7 +8721,9 @@ func (this *CompanyController) AddRenewalReason() {
 	endDateTime, _ = time.Parse(utils.FormatDate, endDate)
 	sub := time.Now().Sub(endDateTime)
 	renewalReason.ExpirationTimeExceeded = int(sub.Hours() / 24)
-	err = company.AddRenewalReason(&renewalReason)
+
+	var newId int64
+	newId, err = company.AddRenewalReason(&renewalReason)
 	if err != nil {
 		br.Msg = "新增续约情况说明操作异常!"
 		br.ErrMsg = "新增续约情况说明操作异常,err:" + err.Error()
@@ -8774,6 +8819,22 @@ func (this *CompanyController) AddRenewalReason() {
 		}
 	}
 
+	if req.ProductId == utils.COMPANY_PRODUCT_RAI_ID {
+		//权益客户新增历史备注总表
+		itemRecord := new(company.CompanyHistoryRemark)
+		itemRecord.CompanyId = req.CompanyId
+		itemRecord.Content = req.Remark
+		itemRecord.SysAdminId = sysUser.AdminId
+		itemRecord.SysAdminName = sysUser.RealName
+		itemRecord.CreateTime = time.Now().Local()
+		itemRecord.ModifyTime = time.Now().Local()
+		itemRecord.ShowTime = time.Now().Local()
+		itemRecord.ProductId = 2
+		itemRecord.TableName = "company_renewal_reason"
+		itemRecord.TableId = int(newId)
+		go services.AddCompanyHistoryRemark(itemRecord)
+	}
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "编辑成功"
@@ -8849,7 +8910,8 @@ func (this *CompanyController) AddRemark() {
 		SysRealName: sysUser.RealName,
 	}
 
-	err = company.AddCompanyRemark(&remark)
+	var newId int64
+	newId, err = company.AddCompanyRemark(&remark)
 
 	{
 		approveContent := req.Remark
@@ -8863,6 +8925,23 @@ func (this *CompanyController) AddRemark() {
 		br.Msg = "编辑失败"
 		br.ErrMsg = "编辑失败,Err:" + err.Error()
 	}
+
+	//如果是权益的写入历史备注表
+	if productId == utils.COMPANY_PRODUCT_RAI_ID {
+		//权益客户新增历史备注总表
+		itemRecord := new(company.CompanyHistoryRemark)
+		itemRecord.CompanyId = req.CompanyId
+		itemRecord.Content = req.Remark
+		itemRecord.SysAdminId = sysUser.AdminId
+		itemRecord.SysAdminName = sysUser.RealName
+		itemRecord.CreateTime = time.Now().Local()
+		itemRecord.ModifyTime = time.Now().Local()
+		itemRecord.ShowTime = time.Now().Local()
+		itemRecord.ProductId = 2
+		itemRecord.TableName = "company_product_remark"
+		itemRecord.TableId = int(newId)
+		go services.AddCompanyHistoryRemark(itemRecord)
+	}
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "编辑成功"
@@ -9505,6 +9584,9 @@ func (this *CompanyController) DelRemark() {
 	content := fmt.Sprintf("%s%s", "删除备注: ", item.Remark)
 	_ = services.AddCompanyOperationRecord(product.CompanyId, product.SellerId, sysUser.AdminId, product.ProductId, sysUser.AdminId, product.CompanyName, product.ProductName, sysUser.RealName, "删除备注", "del_remark", content, sysUser.RealName, "", product.Status)
 
+	if item.ProductId == utils.COMPANY_PRODUCT_RAI_ID {
+		go services.DelCompanyHistoryRemark("company_product_remark", req.RemarkId) // 删除
+	}
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"

+ 2 - 2
controllers/company_apply_v2.go

@@ -1482,7 +1482,7 @@ func (this *CompanyApplyController) ApplyThaw() {
 				return
 			}
 			if tryOutCountRai >= utils.COMPANY_STATUS_TRY_OUT_COUNT_RAI {
-				br.Msg = "非研选试用客户最多30家"
+				br.Msg = "非研选试用客户最多40家"
 				return
 			}
 		}
@@ -1984,7 +1984,7 @@ func (this *CompanyApplyController) ApplyReceive() {
 				return
 			}
 			if tryOutCountRai >= utils.COMPANY_STATUS_TRY_OUT_COUNT_RAI {
-				br.Msg = "非研选试用客户最多30家"
+				br.Msg = "非研选试用客户最多40家"
 				return
 			}
 		}

+ 20 - 1
controllers/company_renewal.go

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

+ 198 - 14
controllers/company_seller.go

@@ -188,6 +188,7 @@ func (this *CompanySellerController) CheckListV2() {
 	}
 
 	getAllSeller, _ := this.GetBool("AllSeller", false)
+	getAllUser, _ := this.GetBool("AllUser", false)
 	status, _ := this.GetInt("Status", 0)
 	getAllEnabled, _ := this.GetBool("AllEnabled", false)
 	enabled := 1       //默认只获取正常状态的用户
@@ -195,6 +196,164 @@ func (this *CompanySellerController) CheckListV2() {
 		enabled = -1
 	}
 	list := make([]company.DepartmentGroupSellers, 0)
+	if getAllUser {
+		departmentList, err := system.GetDepartmentList()
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取部门失败,Err:" + err.Error()
+			return
+		}
+		for _, department := range departmentList {
+			departmentGroupSellerList := make([]company.DepartmentGroupSellers, 0)
+			item := company.DepartmentGroupSellers{
+				AdminId: fmt.Sprint("department_", department.DepartmentId),
+				//AdminName string `description:"系统用户名称"`
+				RealName:     department.DepartmentName,
+				ChildrenList: departmentGroupSellerList,
+			}
+
+			groupList, err := system.GetSysGroupByDepartmentId(department.DepartmentId)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取分组失败,Err:" + err.Error()
+				return
+			}
+			for _, group := range groupList {
+				groupSellerList := make([]company.DepartmentGroupSellers, 0)
+				groupItem := company.DepartmentGroupSellers{
+					AdminId: fmt.Sprint("group_", group.DepartmentId),
+					//AdminName string `description:"系统用户名称"`
+					RealName:     group.GroupName,
+					ChildrenList: groupSellerList,
+				}
+				teamList, err := system.GetSysTeamByDepartmentId(group.GroupId)
+				if err != nil {
+					br.Msg = "获取小组失败"
+					br.ErrMsg = "获取小组失败,Err:" + err.Error()
+					return
+				}
+				for _, team := range teamList {
+					teamSellerList := make([]company.DepartmentGroupSellers, 0)
+					teamItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint("team_", team.GroupId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     team.GroupName,
+						ChildrenList: teamSellerList,
+					}
+					sellerList, err := system.GetTeamSysUserList(team.GroupId, enabled)
+					if err != nil {
+						br.Msg = "获取销售失败"
+						br.ErrMsg = "获取销售失败,Err:" + err.Error()
+						return
+					}
+					for _, seller := range sellerList {
+						sellerItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint(seller.AdminId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     seller.RealName,
+							Authority:    seller.Authority,
+							RoleTypeCode: seller.RoleTypeCode,
+						}
+						//fmt.Println("seller.RealName:", seller.RealName)
+						teamSellerList = append(teamSellerList, sellerItem)
+					}
+					teamSellerList = sortDepartmentGroupSellers(teamSellerList)
+					teamItem.ChildrenList = teamSellerList
+					if len(teamSellerList) > 0 {
+						groupSellerList = append(groupSellerList, teamItem)
+					}
+				}
+				//分组为0的销售(直属分组)
+				groupTeamSellerList, err := system.GetGrooupsysUserList(group.GroupId, roleCodeTypeStr, enabled)
+				if err != nil {
+					br.Msg = "获取销售失败"
+					br.ErrMsg = "获取销售失败,Err:" + err.Error()
+					return
+				}
+				if len(groupTeamSellerList) > 0 {
+					tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+					for _, seller := range groupTeamSellerList {
+						sellerItem := company.DepartmentGroupSellers{
+							AdminId: fmt.Sprint(seller.AdminId),
+							//AdminName string `description:"系统用户名称"`
+							RealName:     seller.RealName,
+							Authority:    seller.Authority,
+							RoleTypeCode: seller.RoleTypeCode,
+						}
+						tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+					}
+					//排个序
+					tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+					groupSellerList = append(groupSellerList, tmpDepartmentGroupSellersList...)
+				}
+
+				//groupItem.ChildrenList = groupSellerList
+				//if len(groupSellerList) > 0 {
+				//	list = append(list, item)
+				//}
+
+				//sellerList, err := system.GetGroupSysUserList(group.DepartmentId)
+				//if err != nil {
+				//	br.Msg = "获取销售失败"
+				//	br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				//	return
+				//}
+				//for _, seller := range sellerList {
+				//	sellerItem := company.DepartmentGroupSellers{
+				//		AdminId: fmt.Sprint(seller.AdminId),
+				//		//AdminName string `description:"系统用户名称"`
+				//		RealName:     seller.RealName,
+				//		Authority:    seller.Authority,
+				//		RoleTypeCode: seller.RoleTypeCode,
+				//	}
+				//	groupSellerList = append(groupSellerList, sellerItem)
+				//}
+				//groupSellerList = sortDepartmentGroupSellers(groupSellerList)
+				groupItem.ChildrenList = groupSellerList
+				if len(groupSellerList) > 0 {
+					departmentGroupSellerList = append(departmentGroupSellerList, groupItem)
+				}
+			}
+
+			//分组为0的销售(直属部门)
+			departmentSellerList, err := system.GetDepartmentGroupSysUserList(department.DepartmentId, 0, roleCodeTypeStr)
+			if err != nil {
+				br.Msg = "获取销售失败"
+				br.ErrMsg = "获取销售失败,Err:" + err.Error()
+				return
+			}
+			if len(departmentSellerList) > 0 {
+				tmpDepartmentGroupSellersList := make([]company.DepartmentGroupSellers, 0)
+				for _, seller := range departmentSellerList {
+					sellerItem := company.DepartmentGroupSellers{
+						AdminId: fmt.Sprint(seller.AdminId),
+						//AdminName string `description:"系统用户名称"`
+						RealName:     seller.RealName,
+						Authority:    seller.Authority,
+						RoleTypeCode: seller.RoleTypeCode,
+					}
+					tmpDepartmentGroupSellersList = append(tmpDepartmentGroupSellersList, sellerItem)
+				}
+				//排个序
+				tmpDepartmentGroupSellersList = sortDepartmentGroupSellers(tmpDepartmentGroupSellersList)
+				departmentGroupSellerList = append(departmentGroupSellerList, tmpDepartmentGroupSellersList...)
+			}
+
+			item.ChildrenList = departmentGroupSellerList
+			if len(departmentGroupSellerList) > 0 {
+				list = append(list, item)
+			}
+		}
+
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		br.Data = company.DepartmentGroupSellersResp{
+			List: list,
+		}
+
+		return
+	}
 	if getAllSeller == false {
 		//超管看部门、小组、销售
 		if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
@@ -5316,28 +5475,53 @@ func (this *CompanySellerController) RaiServeSellerList() {
 		return
 	}
 	resp := make([]company.DepartmentGroupSellers, 0)
-
-	groupId := 0
+	groupIds := []int{}
 	if utils.RunMode == "release" {
-		groupId = 68
+		groupIds = []int{68, 72}
 	} else {
-		groupId = 132
+		groupIds = []int{132, 134}
 	}
-	subAdmins, err := system.GetAdminByGroupId(groupId)
-	if err != nil && err.Error() != utils.ErrNoRow() {
+
+	groupNameList, err := system.GetSysGroupByGroupIds(groupIds)
+	if err != nil {
 		br.Msg = "获取销售失败"
-		br.ErrMsg = "获取销售失败,Err:" + err.Error()
+		br.ErrMsg = "获取组别信息失败,Err:" + err.Error()
 		return
 	}
 
-	for _, seller := range subAdmins {
-		sellerItem := company.DepartmentGroupSellers{
-			AdminId:      fmt.Sprint(seller.AdminId),
-			RealName:     seller.RealName,
-			Authority:    seller.Authority,
-			RoleTypeCode: seller.RoleTypeCode,
+	for _, group := range groupNameList {
+		groupSellerList := make([]company.DepartmentGroupSellers, 0)
+		groupItem := company.DepartmentGroupSellers{
+			AdminId: fmt.Sprint("group_", group.DepartmentId),
+			//AdminName string `description:"系统用户名称"`
+			RealName:     group.GroupName,
+			ChildrenList: groupSellerList,
+		}
+		teamSellerList := make([]company.DepartmentGroupSellers, 0)
+		sellerList, err := system.GetAdminByGroupId(group.GroupId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取销售失败"
+			br.ErrMsg = "获取销售失败,Err:" + err.Error()
+			return
+		}
+
+		for _, seller := range sellerList {
+			sellerItem := company.DepartmentGroupSellers{
+				AdminId: fmt.Sprint(seller.AdminId),
+				//AdminName string `description:"系统用户名称"`
+				RealName:     seller.RealName,
+				Authority:    seller.Authority,
+				RoleTypeCode: seller.RoleTypeCode,
+			}
+			teamSellerList = append(teamSellerList, sellerItem)
+		}
+		groupItem.ChildrenList = teamSellerList
+		if len(teamSellerList) > 0 {
+			groupSellerList = append(groupSellerList, groupItem)
+		}
+		if len(groupSellerList) > 0 {
+			resp = append(resp, groupItem)
 		}
-		resp = append(resp, sellerItem)
 	}
 
 	br.Ret = 200

+ 20 - 1
controllers/company_service_record.go

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

+ 24 - 1
controllers/company_share.go

@@ -594,6 +594,10 @@ func (this *CompanyController) CompanyShareList() {
 				//如果已经是共享客户了,取消共享按钮全都显示,和修改销售权限一样
 				v.BtnItem.BtnShare = true
 			}
+			//解决共享客户正式筛选下是否标红的问题
+			if v.WeekViewActive == 0 && v.IsUserMaker == 1 {
+				v.WeekViewActive = 1
+			}
 
 			companyList := &company.CompanyListItem{
 				CompanyId:        v.CompanyId,
@@ -653,6 +657,7 @@ func (this *CompanyController) CompanyShareList() {
 				ShareSellerId:   v.ShareSellerId,
 				LastServiceTime: v.LastServiceTime,
 				ServiceTimes:    v.ServiceTimes,
+				IsUserMaker:     v.IsUserMaker,
 			}
 			if v.ShareSellerIds != "" {
 				shareSellerIds := strings.Split(v.ShareSellerIds, ",")
@@ -848,7 +853,8 @@ func (this *CompanyController) CompanyShareAddRemark() {
 		SysUserId:   sysUser.AdminId,
 		SysRealName: sysUser.RealName,
 	}
-	err = company.AddCompanyRemark(&remark)
+	var newId int64
+	newId, err = company.AddCompanyRemark(&remark)
 	if err != nil {
 		br.Msg = "操作失败"
 		br.ErrMsg = "新增共享客户备注失败, Err: " + err.Error()
@@ -863,6 +869,23 @@ func (this *CompanyController) CompanyShareAddRemark() {
 			companyProduct.ProductName, sysUser.RealName, remark, operation, approveContent, sysUser.RealName, "", companyProduct.Status)
 	}()
 
+	//如果是权益的写入历史备注表
+	if productId == utils.COMPANY_PRODUCT_RAI_ID {
+		//权益客户新增历史备注总表
+		itemRecord := new(company.CompanyHistoryRemark)
+		itemRecord.CompanyId = req.CompanyId
+		itemRecord.Content = req.Remark
+		itemRecord.SysAdminId = sysUser.AdminId
+		itemRecord.SysAdminName = sysUser.RealName
+		itemRecord.CreateTime = time.Now().Local()
+		itemRecord.ModifyTime = time.Now().Local()
+		itemRecord.ShowTime = time.Now().Local()
+		itemRecord.ProductId = 2
+		itemRecord.TableName = "company_product_remark"
+		itemRecord.TableId = int(newId)
+		go services.AddCompanyHistoryRemark(itemRecord)
+	}
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "编辑成功"

+ 30 - 1
controllers/cygx/activity.go

@@ -128,6 +128,7 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 	videoDetail := req.VideoDetail
 	isBClass := req.IsBClass
 	isResearchPoints := req.IsResearchPoints
+	vivoPointsSet := req.VivoPointsSet
 	isShowHz := req.IsShowHz
 	isResearch := req.IsResearch //是否是研选类型的活动
 	if isResearch {
@@ -654,6 +655,7 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 				//音频 目前只有一个
 				itemVoice := new(cygx.CygxActivityVoice)
 				//var itemVoiceList []*cygx.CygxActivityVoice
+				var sourceVivo string // 音视频文件类型
 				if len(voiceList) > 0 {
 					for _, vo := range voiceList {
 						itemVoice.ActivityId = activityId
@@ -663,6 +665,7 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 						itemVoice.BackgroundImg = req.BackgroundImg
 						itemVoice.ShareImg = req.ShareImg
 						itemVoice.CreateTime = time.Now()
+						sourceVivo = utils.CYGX_OBJ_ACTIVITYVOICE
 					}
 				}
 				//视频
@@ -676,6 +679,7 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 					itemVideo.ShareImg = req.ShareImg
 					itemVideo.ModifyDate = time.Now().Format(utils.FormatDateTime)
 					itemVideo.CreateTime = time.Now().Format(utils.FormatDateTime)
+					sourceVivo = utils.CYGX_OBJ_ACTIVITYVIDEO
 				}
 				//删除原有的视频数据
 				//if itemVideo.VideoUrl != "" {
@@ -690,12 +694,19 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 				//}
 				//}
 				//处理音视频上传
-				err := cygxService.UpdateActivityVideoAndVoice(activityInfo, itemVoice, itemVideo)
+				err = cygxService.UpdateActivityVideoAndVoice(activityInfo, itemVoice, itemVideo)
 				if err != nil && err.Error() != utils.ErrNoRow() {
 					br.Msg = "获取信息失败"
 					br.ErrMsg = "UpdateActivityVideoAndVoice,Err:" + err.Error() + "activityId:" + strconv.Itoa(activityId)
 					return
 				}
+
+				err = cygxService.UpdateActivityVivoPointsSet(activityInfo, vivoPointsSet, itemPointsSet, sourceVivo)
+				if err != nil {
+					br.Msg = "获取信息失败"
+					br.ErrMsg = "UpdateActivityVideoAndVoice,Err:" + err.Error() + "activityId:" + strconv.Itoa(activityId)
+					return
+				}
 				//if itemVoice.VoiceUrl != "" {
 				//voiceReqList, err := cygx.GetCygxActivityVoiceReqList(activityId)
 				//if err != nil && err.Error() != utils.ErrNoRow() {
@@ -1180,6 +1191,24 @@ func (this *ActivityCoAntroller) Detail() {
 		activityInfo.BackgroundImg = VideoDetail.BackgroundImg
 		activityInfo.ShareImg = VideoDetail.ShareImg
 	}
+
+	totalVivo, err := cygx.GetCygxActivityVivoPointsSetCountByActivityId(activityId)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "GetCygxActivityVivoPointsSetCountByActivityId,Err:" + err.Error() + "activityId:" + strconv.Itoa(activityId)
+	}
+
+	if totalVivo > 0 {
+		vivoPointsSetDetail, err := cygx.GetCygxActivityVivoPointsSetByActivityId(activityId)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取信息失败,Err:" + err.Error()
+			return
+		}
+		vivoPointsSetDetail.IsPay = 1
+		activityInfo.VivoPointsSet = *vivoPointsSetDetail
+	}
+
 	if activityInfo.CustomerTypeIds != "" {
 		customerTypeIdslist := strings.Split(activityInfo.CustomerTypeIds, ",")
 		var permissionValueStr string

+ 1 - 1
controllers/cygx/activity_meet.go

@@ -1485,7 +1485,7 @@ func (this *ActivityMeetCoAntroller) AttendanceDetail() {
 			}
 			//如果这个活动属于销售创建,而且不是这个销售自己查看的,并且查看的角色不属于管理员或者权益管理员,那么就做限制处理
 			if isBloneSell && sysUser.AdminId != adminInfoActivity.AdminId && (sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_RAI_ADMIN) {
-				//isProhibit = true  //限制又取消了。2023-06-14
+				isProhibit = true //限制又取消了。2023-06-14 ,2024.09.04又开启了
 			}
 		}
 	}

+ 36 - 9
controllers/cygx/activity_video.go

@@ -401,20 +401,37 @@ func (this *ActivityVideoCoAntroller) VideoAndVoice() {
 			br.ErrMsg = "活动ID错误,Err:" + err.Error() + "activityId:" + strconv.Itoa(activityId)
 			return
 		}
-		//key := utils.MicroRoadshowDefaultImgKey
-		if fileType == 1 {
-			for _, v := range list.Audio {
-				if v.ChartPermissionId == activityInfo.ChartPermissionId {
-					resp.List = v.List
+
+		if activityInfo.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN { // 研选的音视频看全部行业
+			if fileType == 1 {
+				for _, v := range list.Audio {
+					for _, vFile := range v.List {
+						resp.List = append(resp.List, vFile)
+					}
+				}
+			} else {
+				for _, v := range list.Video {
+					for _, vFile := range v.List {
+						resp.List = append(resp.List, vFile)
+					}
 				}
 			}
 		} else {
-			for _, v := range list.Video {
-				if v.ChartPermissionId == activityInfo.ChartPermissionId {
-					resp.List = v.List
+			if fileType == 1 {
+				for _, v := range list.Audio {
+					if v.ChartPermissionId == activityInfo.ChartPermissionId {
+						resp.List = v.List
+					}
+				}
+			} else {
+				for _, v := range list.Video {
+					if v.ChartPermissionId == activityInfo.ChartPermissionId {
+						resp.List = v.List
+					}
 				}
 			}
 		}
+		//key := utils.MicroRoadshowDefaultImgKey
 	}
 
 	br.Ret = 200
@@ -434,6 +451,7 @@ func (this *ActivityVideoCoAntroller) VideoAndVoice() {
 // @Param   KeyWord   query   string  false       "搜索关键词"
 // @Param   SortType          query   string    false		"排序顺序:asc、desc"
 // @Param   SearchType          query   int    false		"类型 1 路演回放 ,2:调研反馈"
+// @Param   IsResearch   query   bool  true       "是否为研选"
 // @Success 200 {object} cygx.CygxActivityVideoListRep
 // @router /activity_voice_and_video/list [get]
 func (this *ActivityVideoCoAntroller) ActivityVoiceAndVideoList() {
@@ -458,6 +476,7 @@ func (this *ActivityVideoCoAntroller) ActivityVoiceAndVideoList() {
 	endDate := this.GetString("EndDate")
 	keyWord := this.GetString("KeyWord")
 	sortType := this.GetString("SortType")
+	isResearch, _ := this.GetBool("IsResearch")
 
 	var startSize int
 	if pageSize <= 0 {
@@ -475,6 +494,14 @@ func (this *ActivityVideoCoAntroller) ActivityVoiceAndVideoList() {
 		conditionVideo += ` AND (v.video_name LIKE '%` + keyWord + `%' )  `
 		conditionVoice += ` AND (v.voice_name LIKE '%` + keyWord + `%' )  `
 	}
+
+	if isResearch {
+		chartPermissionId = utils.CHART_PERMISSION_ID_YANXUAN //如果是研选添加一个研选行业的筛选
+		searchType = 0
+	} else {
+		condition += ` AND art.chart_permission_id  != ?  `
+		pars = append(pars, utils.CHART_PERMISSION_ID_YANXUAN)
+	}
 	//行业名称
 	if chartPermissionId > 0 {
 		condition += ` AND art.chart_permission_id  = ?  `
@@ -552,7 +579,7 @@ func (this *ActivityVideoCoAntroller) ActivityVoiceAndVideoList() {
 
 		//处理音视文件标识
 		mapVoice := make(map[int]bool)
-		var conditionVoice string
+		//var conditionVoice string
 		var parsVoice []interface{}
 		conditionVoice = " AND activity_id IN (" + activityIds + ")  "
 		listVoice, err := cygx.GetActivityVoiceList(conditionVoice, parsVoice)

+ 2 - 2
controllers/cygx/askserie_video.go

@@ -86,7 +86,7 @@ func (this *AskserieVideoController) PreserveAndPublish() {
 	item.CreateTime = time.Now()
 
 	if askserieVideoId == 0 {
-		shareImg, _ = cygxService.MakeCygxMp3HtmlImg(videoDuration) //生成分享图片
+		shareImg, _ = cygxService.MakeCygxMp3HtmlImg(videoDuration, 0) //生成分享图片
 		item.ShareImg = shareImg
 		//新增
 		newId, err := cygx.AddCygxAskserieVideo(item, industrialManagementIds)
@@ -106,7 +106,7 @@ func (this *AskserieVideoController) PreserveAndPublish() {
 		}
 		//如果时长有变更就更新分享图片
 		if detail.VideoDuration != videoDuration {
-			shareImg, _ = cygxService.MakeCygxMp3HtmlImg(videoDuration) //生成分享图片
+			shareImg, _ = cygxService.MakeCygxMp3HtmlImg(videoDuration, 0) //生成分享图片
 			item.ShareImg = shareImg
 		}
 

+ 1 - 1
controllers/cygx/micro_roadshow.go

@@ -254,7 +254,7 @@ func (this *MicroRoadshowController) Add() {
 			return
 		}
 	}
-	shareImg, _ := cygxService.MakeCygxMp4HtmlImg(req.VideoDuration) //生成分享图片
+	shareImg, _ := cygxService.MakeCygxMp4HtmlImg(req.VideoDuration, 0) //生成分享图片
 	req.ShareImgUrl = shareImg
 	nameItem.IndustryName = utils.RemoveFileSuffixName(nameItem.IndustryName) //去掉后缀名称
 	if req.VideoId > 0 {

+ 8 - 0
controllers/cygx/order.go

@@ -161,6 +161,10 @@ func (this *OrderController) OrderList() {
 			item.HttpUrl = utils.CYGX_MFYX_URL + "/material/info/" + strconv.Itoa(v.SourceId)
 		case utils.CYGX_OBJ_ACTIVITY: //活动详情
 			item.HttpUrl = utils.CYGX_MFYX_URL + "/activity/detail/" + strconv.Itoa(v.SourceId)
+		case utils.CYGX_OBJ_ACTIVITYVIDEO: //活动视频
+			item.HttpUrl = utils.CYGX_MFYX_URL + "/activity/detail/" + strconv.Itoa(v.SourceId)
+		case utils.CYGX_OBJ_ACTIVITYVOICE: //活动音频
+			item.HttpUrl = utils.CYGX_MFYX_URL + "/activity/detail/" + strconv.Itoa(v.SourceId)
 		case utils.CYGX_OBJ_YANXUANSPECIAL: //专栏详情
 			item.HttpUrl = utils.CYGX_MFYX_URL + "/column/detail/" + strconv.Itoa(v.SourceId)
 		}
@@ -447,6 +451,10 @@ func (this *OrderController) OrderRefundList() {
 		case utils.CYGX_OBJ_ARTICLE: //文章详情
 			item.HttpUrl = utils.CYGX_MFYX_URL + "/material/info/" + strconv.Itoa(v.SourceId)
 		case utils.CYGX_OBJ_ACTIVITY: //活动详情
+		case utils.CYGX_OBJ_ACTIVITYVIDEO: //活动视频
+			item.HttpUrl = utils.CYGX_MFYX_URL + "/activity/detail/" + strconv.Itoa(v.SourceId)
+		case utils.CYGX_OBJ_ACTIVITYVOICE: //活动音频
+			item.HttpUrl = utils.CYGX_MFYX_URL + "/activity/detail/" + strconv.Itoa(v.SourceId)
 			item.HttpUrl = utils.CYGX_MFYX_URL + "/activity/detail/" + strconv.Itoa(v.SourceId)
 		case utils.CYGX_OBJ_YANXUANSPECIAL: //专栏详情
 			item.HttpUrl = utils.CYGX_MFYX_URL + "/column/detail/" + strconv.Itoa(v.SourceId)

+ 165 - 8
controllers/cygx/rai_serve.go

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

+ 126 - 1
controllers/cygx/report_article.go

@@ -1979,7 +1979,7 @@ func (this *IndustrialSubjectController) ReportMappingAdd() {
 }
 
 //func init() {
-//	initRsList()
+//	initHistoryRemarList()
 //}
 
 func initart() {
@@ -2982,3 +2982,128 @@ func initRsList() {
 	}
 
 }
+
+func initHistoryRemarList() {
+
+	remarkList, err := company.GetCompanyHistoryRemarkListInitExport()
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+
+	var companyids []int
+	//var companyidsMap  +
+	resp := new(company.CompanyHistoryRemarkListResp)
+	for _, v := range remarkList {
+		item := new(company.CompanyHistoryRemarkResp)
+		item.CompanyId = v.CompanyId
+		if !utils.InArrayByInt(companyids, v.CompanyId) {
+			companyids = append(companyids, v.CompanyId)
+		}
+
+		item.Content = v.Content
+		item.SysAdminName = v.SysAdminName
+		//item.SysAdminName = v.C
+		item.CreateTime = v.ShowTime.Format(utils.FormatDateTime)
+		switch v.TableName {
+		case "company_service_record":
+			item.RemarkType = "沟通记录"
+		case "company_product_remark":
+			item.RemarkType = "备注"
+		case "company_no_renewed_note":
+			item.RemarkType = "未续约备注"
+		case "company_renewal_reason":
+			item.RemarkType = "未续约说明"
+		case "cygx_user_feedback":
+			item.RemarkType = "交流反馈(" + v.RealName + ")"
+		default:
+			item.RemarkType = "备注"
+		}
+		resp.List = append(resp.List, item)
+	}
+
+	listCompany, err := company.GetOverseasCompanysByCompanyIds(companyids)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+
+	mapCompamyName := make(map[int]string)
+
+	for _, v := range listCompany {
+		mapCompamyName[v.CompanyId] = v.CompanyName
+	}
+
+	//创建excel
+	dir, err := os.Executable()
+	exPath := filepath.Dir(dir)
+	downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
+	xlsxFile := xlsx.NewFile()
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+	style := xlsx.NewStyle()
+	alignment := xlsx.Alignment{
+		Horizontal: "center",
+		Vertical:   "center",
+		WrapText:   true,
+	}
+	style.Alignment = alignment
+	style.ApplyAlignment = true
+
+	redStyle := xlsx.NewStyle()
+	redStyle.Alignment = alignment
+	redStyle.ApplyAlignment = true
+	redStyle.Font.Color = "ff0000"
+	//定义底色需要标黄的 单元格颜色
+	redFill := xlsx.Fill{"solid", "ffff00", "ffff00"}
+	redStyle.Fill = redFill
+	//redStyle.Border = *border
+
+	var sheetName string
+	sheetName = "备注"
+	sheet, err := xlsxFile.AddSheet(sheetName)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+	//标头
+	rowTitle := sheet.AddRow()
+	cellA := rowTitle.AddCell()
+	cellA.Value = "录入人"
+	cellB := rowTitle.AddCell()
+	cellB.Value = " 录入时间"
+	cellC := rowTitle.AddCell()
+	cellC.Value = " 客户名称"
+
+	cellMoney := rowTitle.AddCell()
+	cellMoney.Value = "录入类型"
+
+	cellConct := rowTitle.AddCell()
+	cellConct.Value = "录入内容"
+
+	for _, item := range resp.List {
+		row := sheet.AddRow()
+		cellAData := row.AddCell()
+		cellAData.Value = item.SysAdminName
+
+		cellBData := row.AddCell()
+		cellBData.Value = item.CreateTime
+		cellCData := row.AddCell()
+		cellCData.Value = mapCompamyName[item.CompanyId]
+
+		cellCnameData := row.AddCell()
+		cellCnameData.Value = item.RemarkType
+
+		cellContentData := row.AddCell()
+		cellContentData.Value = item.Content
+	}
+
+	err = xlsxFile.Save(downLoadnFilePath)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+
+}

+ 582 - 197
controllers/cygx/user.go

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

+ 3 - 2
controllers/cygx/user_admin_share_history.go

@@ -70,7 +70,8 @@ func (this *UserAdminShareHistoryController) OrderList() {
 	}
 
 	//用户行为搜索
-	if action == "查看专栏" || action == "查看报告" || action == "查看活动" || action == "注册" {
+	//if action == "查看专栏" || action == "查看报告" || action == "查看活动" || action == "注册" {
+	if action != "" {
 		condition += " 	AND action = ? "
 		pars = append(pars, action)
 	}
@@ -119,7 +120,7 @@ func (this *UserAdminShareHistoryController) OrderList() {
 		switch v.Source {
 		case utils.CYGX_OBJ_ARTICLE: //文章详情
 			v.HttpUrl = utils.CYGX_MFYX_URL + "/material/info/" + strconv.Itoa(v.SourceId)
-		case utils.CYGX_OBJ_ACTIVITY: //活动详情
+		case utils.CYGX_OBJ_ACTIVITY, utils.CYGX_OBJ_ACTIVITYVIDEO, utils.CYGX_OBJ_ACTIVITYVOICE: //活动详情
 			v.HttpUrl = utils.CYGX_MFYX_URL + "/activity/detail/" + strconv.Itoa(v.SourceId)
 		case utils.CYGX_OBJ_YANXUANSPECIAL: //研选专栏
 			v.HttpUrl = utils.CYGX_MFYX_URL + "/column/detail/" + strconv.Itoa(v.SourceId)

+ 26 - 2
controllers/cygx/user_feedback.go

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

+ 2 - 2
controllers/cygx/yanxuan_special.go

@@ -825,7 +825,7 @@ func (this *YanxuanSpecialController) ShowButton() {
 		return
 	}
 	articleMobileSlice := strings.Split(cnfArticle.ConfigValue, ",")
-	if utils.InArrayByStr(articleMobileSlice, sysUser.Mobile) || sysUser.Role == utils.ROLE_TYPE_CODE_ADMIN {
+	if utils.InArrayByStr(articleMobileSlice, sysUser.Mobile) || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
 		resp.IsShowYanXuanSpecial = true
 	}
 
@@ -837,7 +837,7 @@ func (this *YanxuanSpecialController) ShowButton() {
 		return
 	}
 	authorMobileSlice := strings.Split(cnfAuthor.ConfigValue, ",")
-	if utils.InArrayByStr(authorMobileSlice, sysUser.Mobile) || sysUser.Role == utils.ROLE_TYPE_CODE_ADMIN {
+	if utils.InArrayByStr(authorMobileSlice, sysUser.Mobile) || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
 		resp.IsShowSpecialAuthor = true
 	}
 

+ 13 - 1
controllers/help_doc/doc.go

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

+ 109 - 13
controllers/roadshow/calendar.go

@@ -83,6 +83,18 @@ func (this *CalendarController) Add() {
 	for _, v := range sysUserList {
 		raiAskadminMap[v.AdminId] = true
 	}
+
+	sysUserFwang, e := system.GetSysUserByAdminName("fwang") // 手动拼接王芳到权益的策略行业下 start
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Msg = "用户不存在, 请检查"
+			return
+		}
+		br.Msg = "账号错误, 请重新输入"
+		br.ErrMsg = "fwang 用户名获取用户失败, Err: " + e.Error()
+		return
+	}
+	raiAskadminMap[sysUserFwang.AdminId] = true // 手动拼接王芳到权益的策略行业下 end
 	//var tipMsg string
 	for _, v := range req.ResearcherList {
 		if v.ResearcherId <= 0 {
@@ -1075,6 +1087,25 @@ func (this *CalendarController) ResearcherList() {
 	for _, v := range listPermission {
 		mapPermissionId[v.PermissionName] = v.ChartPermissionId
 	}
+
+	sysUserFwang, e := system.GetSysUserByAdminName("fwang") // 手动拼接王芳到权益的策略行业下 start
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Msg = "用户不存在, 请检查"
+			return
+		}
+		br.Msg = "账号错误, 请重新输入"
+		br.ErrMsg = "fwang 用户名获取用户失败, Err: " + e.Error()
+		return
+	}
+	itemFwang := new(roadshow.ResearcherGroup)
+	itemFwang.AdminId = sysUserFwang.AdminId
+	itemFwang.GroupId = sysUserFwang.GroupId
+	itemFwang.GroupName = sysUserFwang.GroupName
+	itemFwang.RealName = sysUserFwang.RealName
+	itemFwang.RoleTypeCode = sysUserFwang.RoleTypeCode
+	mapPermissionUser["策略"] = append(mapPermissionUser["策略"], itemFwang) // 手动拼接王芳到权益的策略行业下 end
+
 	for _, v := range askUserList {
 		if admin, ok := adminMap[v.AdminId]; ok {
 			item := &roadshow.ResearcherGroup{
@@ -1087,6 +1118,7 @@ func (this *CalendarController) ResearcherList() {
 			mapPermissionUser[v.ChartPermissionName] = append(mapPermissionUser[v.ChartPermissionName], item)
 		}
 	}
+
 	raiList := make([]*roadshow.ResearcherGroup, 0)
 	for k, v := range mapPermissionUser {
 		respItem := new(roadshow.ResearcherGroup)
@@ -2273,11 +2305,16 @@ func (this *CalendarController) ResearcherCalendarDetail() {
 	//go roadshowService.SyncCalendarFromShanghai(researcherInfo.Mobile, startDate, endDate)
 	go roadshowService.InsertSyncCalendarFromShanghaiLPush(researcherInfo.Mobile, startDate, endDate)
 
-	condition += ` AND b.start_date>=?`
-	pars = append(pars, startDate)
-	condition += ` AND b.end_date<=?`
-	pars = append(pars, endDate)
-
+	//condition += ` AND b.start_date>=?`
+	//pars = append(pars, startDate)
+	//condition += ` AND b.end_date<=?`
+	//pars = append(pars, endDate)
+	//解决研究员休假,产生跨周的数据查询不到的bug,
+	condition += ` AND ( b.start_date >= ? AND b.end_date <= ? 
+						OR ( b.start_date >= ?  AND  b.start_date <= ? )
+						OR ( b.start_date <= ?  AND  b.end_date  >=  ? ) 
+						OR ( b.end_date >= ?    AND  b.end_date  <=  ? ) )  `
+	pars = append(pars, startDate, endDate, startDate, endDate, startDate, endDate, startDate, endDate)
 	condition += ` AND b.status IN(2) `
 	//pars = append(pars, 2)
 
@@ -2395,19 +2432,18 @@ func (this *CalendarController) MyCalendarDetail() {
 	fmt.Println("roleTypeCode:", roleTypeCode)
 	//销售
 	sales := isSellerRole(sysUser.RoleTypeCode)
-	if sales {
+	if sales || roleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN { // 王芳也作为销售身份处理
 		condition += ` AND a.sys_user_id=?`
 		pars = append(pars, sysUser.AdminId)
 
-		condition += ` AND a.activity_type IN('路演','公开会议') `
+		condition += ` AND a.activity_type IN('路演','公开会议','沙龙') `
 	}
 
 	//研究员
 	if roleTypeCode == utils.ROLE_TYPE_CODE_FICC_RESEARCHR ||
 		roleTypeCode == utils.ROLE_TYPE_CODE_RESEARCHR ||
 		roleTypeCode == utils.ROLE_TYPE_CODE_RAI_RESEARCHR ||
-		roleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN ||
-		roleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER {
+		roleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN {
 		condition += ` AND b.researcher_id=?`
 		pars = append(pars, sysUser.AdminId)
 
@@ -2427,10 +2463,16 @@ func (this *CalendarController) MyCalendarDetail() {
 		pars = append(pars, sysUser.AdminId)
 	}
 
-	condition += ` AND b.start_date>=?`
-	pars = append(pars, startDate)
-	condition += ` AND b.end_date<=?`
-	pars = append(pars, endDate)
+	//condition += ` AND b.start_date>=?`
+	//pars = append(pars, startDate)
+	//condition += ` AND b.end_date<=?`
+	//pars = append(pars, endDate)
+	//解决研究员休假,产生跨周的数据查询不到的bug,
+	condition += ` AND ( b.start_date >= ? AND b.end_date <= ? 
+						OR ( b.start_date >= ?  AND  b.start_date <= ? )
+						OR ( b.start_date <= ?  AND  b.end_date  >=  ? ) 
+						OR ( b.end_date >= ?    AND  b.end_date  <=  ? ) )  `
+	pars = append(pars, startDate, endDate, startDate, endDate, startDate, endDate, startDate, endDate)
 
 	condition += ` AND b.status IN(2) `
 	//pars = append(pars, 2)
@@ -2443,6 +2485,60 @@ func (this *CalendarController) MyCalendarDetail() {
 		return
 	}
 
+	if calendarList == nil {
+		calendarList = make([]*roadshow.CalendarListView, 0)
+	} else {
+		var sysUserIds []int             //建会人ID
+		var companyIds []int             //公司ID
+		for _, v := range calendarList { //上海同步过来信息展示逻辑替换 需求池 953
+			if v.Source == 1 && v.CompanyName == "" {
+				v.CompanyName = v.Title
+			}
+			if v.SysUserId > 0 {
+				sysUserIds = append(sysUserIds, v.SysUserId)
+			}
+			if v.CompanyId > 1 {
+				companyIds = append(companyIds, v.CompanyId)
+			}
+		}
+
+		//如果是权益销售建的会,客户状态替换成权益那边的
+		mapSellRai := make(map[int]bool)  // 是否是权益销售
+		mapStatus := make(map[int]string) //权益客户对应的状态
+		if len(sysUserIds) > 0 && len(companyIds) > 0 {
+			//判断哪些人是权益销售
+			adminList, err := system.GetAdminListByIdListWithoutEnable(sysUserIds)
+			if err != nil {
+				br.Msg = "获取数据失败"
+				br.ErrMsg = "获取数据失败,GetAdminListByIdListWithoutEnable Err:" + err.Error()
+				return
+			}
+			for _, v := range adminList {
+				if v.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER || v.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP {
+					mapSellRai[v.AdminId] = true
+				}
+			}
+
+			conditionProduct := `  AND company_id  IN (` + utils.GetOrmInReplace(len(companyIds)) + `) AND  product_id = 2 `
+			parsProduct := make([]interface{}, 0)
+			parsProduct = append(parsProduct, companyIds)
+			productList, err := company.GetCompanyProductList(conditionProduct, parsProduct)
+			if err != nil {
+				br.Msg = "获取数据失败"
+				br.ErrMsg = "获取数据失败,GetCompanyProductList Err:" + err.Error()
+				return
+			}
+			for _, v := range productList {
+				mapStatus[v.CompanyId] = v.Status
+			}
+		}
+		for _, v := range calendarList {
+			if mapSellRai[v.SysUserId] && mapStatus[v.CompanyId] != "" {
+				v.CompanyStatus = mapStatus[v.CompanyId]
+			}
+		}
+	}
+
 	matterList, err := roadshow.GetRsMattersList(startDate, endDate, sysUser.AdminId)
 	if err != nil {
 		br.Msg = "获取数据失败"

+ 5 - 0
controllers/statistic_company_merge.go

@@ -403,6 +403,7 @@ func (this *StatisticCompanyMergerController) MergeCompanyList() {
 		list = make([]*models.IncrementalList, 0)
 	}
 	var companyContractIds []int
+	var companyIds []int
 	for i := 0; i < listLen; i++ {
 		item := list[i]
 		companyContractIds = append(companyContractIds, item.CompanyContractId)
@@ -415,6 +416,7 @@ func (this *StatisticCompanyMergerController) MergeCompanyList() {
 			expireDay := fmt.Sprintf("%v", int(sub.Hours()/24))
 			list[i].ExpireDay = expireDay
 		}
+		companyIds = append(companyIds, item.CompanyId)
 	}
 
 	//合并合同所对应的权限
@@ -424,8 +426,11 @@ func (this *StatisticCompanyMergerController) MergeCompanyList() {
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
+
+	mapIsUserMaker := cygxService.GetCompanyProductIsUserMakerByCompanyIds(companyIds) //根据公司ID获取近四周之内有决策人互动的客户
 	for _, v := range list {
 		v.PermissionName = mappermissionName[v.CompanyContractId]
+		v.IsUserMaker = mapIsUserMaker[v.CompanyId]
 	}
 
 	page := paging.GetPaging(currentIndex, pageSize, dataTotal)

+ 35 - 25
models/company/company.go

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

+ 103 - 0
models/company/company_history_remark.go

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

+ 2 - 2
models/company/company_no_renewed_note.go

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

+ 13 - 4
models/company/company_product.go

@@ -61,6 +61,7 @@ type CompanyProduct struct {
 	ShareSeller         string    `description:"共享销售员"`
 	ShareSellerId       int       `description:"共享销售员id"`
 	ShareGroupId        int       `description:"共享销售员所属分组ID"`
+	IsUserMaker         int       `description:"近四周之内是否包含决策人互动过 ,0否,1是"`
 }
 
 // 新增客户产品
@@ -300,9 +301,9 @@ type CompanyRenewalReason struct {
 }
 
 // AddRenewalReason 新增续约情况说明
-func AddRenewalReason(renewalReason *CompanyRenewalReason) (err error) {
+func AddRenewalReason(renewalReason *CompanyRenewalReason) (newId int64, err error) {
 	o := orm.NewOrm()
-	_, err = o.Insert(renewalReason)
+	newId, err = o.Insert(renewalReason)
 	return
 }
 
@@ -366,9 +367,9 @@ type CompanyProductRemark struct {
 	SysRealName            string    `description:"创建人姓名"`
 }
 
-func AddCompanyRemark(remark *CompanyProductRemark) (err error) {
+func AddCompanyRemark(remark *CompanyProductRemark) (newId int64, err error) {
 	o := orm.NewOrm()
-	_, err = o.Insert(remark)
+	newId, err = o.Insert(remark)
 	return
 }
 
@@ -380,6 +381,14 @@ func GetRemarkList(CompanyId, ProductId string) (items []*CompanyProductRemark,
 	return
 }
 
+// GetRemarkList 获取备注列表15.9.1job
+func GetRemarkListInit() (items []*CompanyProductRemark, err error) {
+	o := orm.NewOrm()
+	sql := "SELECT * FROM company_product_remark WHERE product_id=2 ORDER BY create_time DESC"
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
 // GetRemarkList 获取备注列表
 func GetRemarkListByCompanyId(CompanyId string) (items []*CompanyProductRemark, err error) {
 	o := orm.NewOrm()

+ 2 - 2
models/company/company_service_record.go

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

+ 47 - 45
models/cygx/activity.go

@@ -61,30 +61,31 @@ func GetActivityCcustomerTypeList(condition string) (items []*ActivityCcustomerT
 
 // 活动添加、修改入参
 type ActivityRep struct {
-	ActivityTypeId          int                       `description:"活动类型id"`
-	PermissionName          string                    `description:"行业名称"`
-	Body                    string                    `description:"内容"`
-	LimitPeopleNum          int                       `description:"限制的人数数量"`
-	CustomerTypeIds         string                    `description:"活动可见的客户类型,多个ID用 , 隔开  1、永续客户; 2、大套餐客户; 3、行业套餐客户; 4、专家套餐客户; 5、试用客户;6、冻结客户;7、流失客户  "`
-	ActivityId              int                       `description:"活动ID 等于0新增活动,大于0修改活动"`
-	DoType                  int                       `description:"操作类型 0,保存 、1,发布"`
-	IsMakerShow             int                       `description:"是否仅决策人可见 0,否 、1,是"`
-	VisibleRange            int                       `description:"可见范围 1,仅本组可见 、2,全部客户可见"`
-	IsYidongConduct         int                       `description:"是否属于易董办会 1:是 、0:否"`
-	IsCanOutboundCall       int                       `description:"是否提供外呼 1:是 、0:否"`
-	LabelType               int                       `description:"标签类型 ,1单主题标签 ,2多主题标签"`
-	IndustrialManagementIdS string                    `description:"产业ID,多个用 , 隔开"`
-	IndustrialSubjectIdS    string                    `description:"标的ID,多个用,隔开"`
-	Scale                   string                    `description:"管理规模,空不填,1::50亿以下,2:50~100亿,3:100亿以上。多个用, 隔开"`
-	IsExternalLabel         int                       `description:"是否为外部资源 1是,0否"`
-	IsBClass                int                       `description:"是否为B类电话会 1是,0否"`
-	IsNeedEmail             int                       `description:"是否需要提供邮箱 1是,0否"`
-	SiginupDeadline         string                    `description:"报名截止时间"`
-	IsResearchPoints        int                       `description:"是否为研选扣点  1是,0否"`
-	IsResearch              bool                      `description:"是否为研选"`
-	IsShowHz                int                       `description:"是否同时在弘则展示  1是,0否"`
-	PointsSet               *CygxActivityPointsSetRsq `description:"研选扣点明细"`
-	IsAllCustomerType       int                       `description:"是否全选活动可见类型 0无 1全选"`
+	ActivityTypeId          int                          `description:"活动类型id"`
+	PermissionName          string                       `description:"行业名称"`
+	Body                    string                       `description:"内容"`
+	LimitPeopleNum          int                          `description:"限制的人数数量"`
+	CustomerTypeIds         string                       `description:"活动可见的客户类型,多个ID用 , 隔开  1、永续客户; 2、大套餐客户; 3、行业套餐客户; 4、专家套餐客户; 5、试用客户;6、冻结客户;7、流失客户  "`
+	ActivityId              int                          `description:"活动ID 等于0新增活动,大于0修改活动"`
+	DoType                  int                          `description:"操作类型 0,保存 、1,发布"`
+	IsMakerShow             int                          `description:"是否仅决策人可见 0,否 、1,是"`
+	VisibleRange            int                          `description:"可见范围 1,仅本组可见 、2,全部客户可见"`
+	IsYidongConduct         int                          `description:"是否属于易董办会 1:是 、0:否"`
+	IsCanOutboundCall       int                          `description:"是否提供外呼 1:是 、0:否"`
+	LabelType               int                          `description:"标签类型 ,1单主题标签 ,2多主题标签"`
+	IndustrialManagementIdS string                       `description:"产业ID,多个用 , 隔开"`
+	IndustrialSubjectIdS    string                       `description:"标的ID,多个用,隔开"`
+	Scale                   string                       `description:"管理规模,空不填,1::50亿以下,2:50~100亿,3:100亿以上。多个用, 隔开"`
+	IsExternalLabel         int                          `description:"是否为外部资源 1是,0否"`
+	IsBClass                int                          `description:"是否为B类电话会 1是,0否"`
+	IsNeedEmail             int                          `description:"是否需要提供邮箱 1是,0否"`
+	SiginupDeadline         string                       `description:"报名截止时间"`
+	IsResearchPoints        int                          `description:"是否为研选扣点  1是,0否"`
+	IsResearch              bool                         `description:"是否为研选"`
+	IsShowHz                int                          `description:"是否同时在弘则展示  1是,0否"`
+	PointsSet               *CygxActivityPointsSetRsq    `description:"研选扣点明细"`
+	VivoPointsSet           CygxActivityVivoPointsSetReq `description:"研选音视频扣点设置"`
+	IsAllCustomerType       int                          `description:"是否全选活动可见类型 0无 1全选"`
 	List                    []*ActivityGroupIndustrialRep
 	VoiceList               []*CygxActivityVoiceReq
 	VideoDetail             *CygxActivityVideoReq
@@ -156,27 +157,28 @@ type ActivityDetail struct {
 	YidongActivityEndTime     string `description:"易董活动截止时间"`
 	VoiceList                 []*CygxActivityVoiceReq
 	VideoDetail               *CygxActivityVideo
-	ActivityJoinType          string                    `description:"活动入会类型01报名审核后可入会 02预约即可入会 03仅定向邀请人员可入会"`
-	YidongSignUpEnd           string                    `description:"易董活动截止时间"` // 报名结束时间,适应于报名审核后可入会,为空表示不限制报名时间
-	YidongSignUpStart         string                    `description:"易董活动截止时间"` // 报名开始时间,适应于报名审核后可入会,为空表示不限制报名时间
-	PublishDate               string                    `description:"发布时间"`
-	IsYidongConduct           int                       `description:"是否属于易董办会 1:是 、0:否"`
-	IsCanOutboundCall         int                       `description:"是否提供外呼 1:是 、0:否"`
-	YidongActivityIdByCygx    string                    `description:"通过查研观向建会易董返回的活动ID"`
-	TencentConferenceNumber   string                    `description:"腾讯会议号"`
-	IsExternalLabel           int                       `description:"是否为外部资源 1是,0否"`
-	SigninImg                 string                    `description:"签到码图片"`
-	IsResearchPoints          int                       `description:"是否为研选扣点  1是,0否"`
-	IsBClass                  int                       `description:"是否为B类电话会 1是,0否"`
-	IsNeedEmail               int                       `description:"是否需要提供邮箱 1是,0否"`
-	SiginupDeadline           string                    `description:"报名截止时间"`
-	PointsSet                 *CygxActivityPointsSetRsq `description:"研选扣点明细"`
-	IsShowHz                  int                       `description:"是否同时在弘则展示  1是,0否"`
-	ChartPermissionNameDeputy string                    `description:"副行业名称"`
-	BackgroundImg             string                    `description:"封面图片"`
-	ShareImg                  string                    `description:"分享图片"`
-	TopTime                   int                       `description:"置顶时间"`
-	AreaType                  int                       `description:"地区,1国内,2海外,默认1"`
+	ActivityJoinType          string                     `description:"活动入会类型01报名审核后可入会 02预约即可入会 03仅定向邀请人员可入会"`
+	YidongSignUpEnd           string                     `description:"易董活动截止时间"` // 报名结束时间,适应于报名审核后可入会,为空表示不限制报名时间
+	YidongSignUpStart         string                     `description:"易董活动截止时间"` // 报名开始时间,适应于报名审核后可入会,为空表示不限制报名时间
+	PublishDate               string                     `description:"发布时间"`
+	IsYidongConduct           int                        `description:"是否属于易董办会 1:是 、0:否"`
+	IsCanOutboundCall         int                        `description:"是否提供外呼 1:是 、0:否"`
+	YidongActivityIdByCygx    string                     `description:"通过查研观向建会易董返回的活动ID"`
+	TencentConferenceNumber   string                     `description:"腾讯会议号"`
+	IsExternalLabel           int                        `description:"是否为外部资源 1是,0否"`
+	SigninImg                 string                     `description:"签到码图片"`
+	IsResearchPoints          int                        `description:"是否为研选扣点  1是,0否"`
+	IsBClass                  int                        `description:"是否为B类电话会 1是,0否"`
+	IsNeedEmail               int                        `description:"是否需要提供邮箱 1是,0否"`
+	SiginupDeadline           string                     `description:"报名截止时间"`
+	PointsSet                 *CygxActivityPointsSetRsq  `description:"研选扣点明细"`
+	VivoPointsSet             CygxActivityVivoPointsResp `description:"音视频扣点明细"`
+	IsShowHz                  int                        `description:"是否同时在弘则展示  1是,0否"`
+	ChartPermissionNameDeputy string                     `description:"副行业名称"`
+	BackgroundImg             string                     `description:"封面图片"`
+	ShareImg                  string                     `description:"分享图片"`
+	TopTime                   int                        `description:"置顶时间"`
+	AreaType                  int                        `description:"地区,1国内,2海外,默认1"`
 }
 
 type ActivityDetailRep struct {

+ 45 - 0
models/cygx/activity_user_template_record.go

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

+ 75 - 0
models/cygx/activity_vivo_points_set.go

@@ -0,0 +1,75 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxActivityVivoPointsSet struct {
+	PointSetId   int       `orm:"column(point_set_id);pk";comment:"主键id"`
+	ActivityId   int       `comment:"活动ID"`
+	PointsObject string    `comment:"扣点设置方式 1:同报名参会时的扣点数、2:输入其余点数"`
+	PointsNum    string    `comment:"扣点数量"`
+	GoodsMoney   string    `comment:"商品总价"`
+	Source       string    `comment:"来源 activityvideo 活动视频、activityvoice 活动音频"`
+	CreateTime   time.Time `comment:"创建时间"`
+	ModifyTime   time.Time `comment:"更新时间"`
+}
+
+type CygxActivityVivoPointsResp struct {
+	IsPay        int    `comment:"是否付费查看 ,1是。0否,默认否"`
+	PointSetId   int    `orm:"column(point_set_id);pk";comment:"主键id"`
+	ActivityId   int    `comment:"活动ID"`
+	PointsObject string `comment:"扣点设置方式 1:同报名参会时的扣点数、2:输入其余点数"`
+	PointsNum    string `comment:"扣点数量"`
+	GoodsMoney   string `comment:"商品总价"`
+	Source       string `comment:"来源 activityvideo 活动视频、activityvoice 活动音频"`
+}
+
+type CygxActivityVivoPointsSetReq struct {
+	IsPay        int    `comment:"是否付费查看 ,1是。0否,默认否"`
+	PointsObject string `comment:"扣点设置方式 1:同报名参会时的扣点数、2:输入其余点数"`
+	PointsNum    string `comment:"扣点数量"`
+	GoodsMoney   string `comment:"商品总价"`
+}
+
+// 根据活动ID判断音视频是否设置了扣点
+func GetCygxActivityVivoPointsSetCountByActivityId(activityId int) (count int, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_activity_vivo_points_set  WHERE activity_id =?  `
+	err = o.Raw(sqlCount, activityId).QueryRow(&count)
+	return
+}
+
+func GetCygxActivityVivoPointsSetByActivityId(activityId int) (item *CygxActivityVivoPointsResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_activity_vivo_points_set WHERE activity_id = ?  `
+	err = o.Raw(sql, activityId).QueryRow(&item)
+	return
+}
+
+// 添加
+func AddCygxActivityVivoPointsSet(item *CygxActivityVivoPointsSet) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	_, err = o.Insert(item)
+	return
+}
+
+// 编辑
+func EditCygxActivityVivoPointsSet(item *CygxActivityVivoPointsSet) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	updateParams := make(map[string]interface{})
+	updateParams["PointsObject"] = item.PointsObject
+	updateParams["PointsNum"] = item.PointsNum
+	updateParams["GoodsMoney"] = item.GoodsMoney
+	updateParams["Source"] = item.Source
+	updateParams["ModifyTime"] = time.Now()
+	ptrStructOrTableName := "cygx_activity_vivo_points_set"
+	whereParam := map[string]interface{}{"activity_id": item.ActivityId}
+	qs := o.QueryTable(ptrStructOrTableName)
+	for expr, exprV := range whereParam {
+		qs = qs.Filter(expr, exprV)
+	}
+	_, err = qs.Update(updateParams)
+	return
+}

+ 6 - 1
models/cygx/cygx_user.go

@@ -44,11 +44,14 @@ type CygxCompanyUser struct {
 	ActivityVideoNum            int    `description:"活动视频播放量"`
 	ActivityVoiceNum            int    `description:"活动音频播放量"`
 	YanxuanspecialNum           int    `description:"研选专栏查看数量"`
+	RsCalendarNum               int    `description:"1V1 路演数量"`
+	FeedbackNum                 int    `description:"交流反馈数量"`
 	PackageType                 int    `description:"套餐类型,0:无,1:大套餐,2:小套餐"`
 	TryStage                    int    `description:"试用客户子标签:0全部、1未分类、2 推进、3 跟踪、4 预备"`
 	Content                     string `description:"备注信息"`
 	IsRemind                    bool   `description:"是否添加互动提醒"`
 	IsSubscribeCygx             int    `description:"是否关注了查研观向微信公众号: 0-未关注; 1-已关注"`
+	IsUserMaker                 int    `description:"近四周之内是否包含决策人互动过 ,0否,1是"`
 }
 
 type CompanyUserListResp struct {
@@ -203,7 +206,9 @@ func GetCygxCompanyUserListSplit(userIds string) (items []*CygxCompanyUser, err
 			( SELECT COUNT( 1 ) FROM cygx_micro_roadshow_video_history AS h  INNER JOIN cygx_micro_roadshow_video as v ON v.video_id = h.video_id WHERE  h.mobile = u.mobile  ) AS roadshow_video_num,
 			( SELECT COUNT( 1 ) FROM cygx_activity_video_history AS h  INNER JOIN cygx_activity_video as v ON v.video_id = h.video_id WHERE  h.mobile = u.mobile  ) AS activity_video_num,
 			( SELECT COUNT( 1 ) FROM cygx_activity_voice_history AS h  INNER JOIN cygx_activity_voice as v ON v.activity_voice_id = h.activity_voice_id WHERE  h.mobile = u.mobile  ) AS activity_voice_num,
-			( SELECT COUNT( 1 ) FROM cygx_yanxuan_special_record AS h  INNER JOIN cygx_yanxuan_special as v ON v.id = h.yanxuan_special_id WHERE  h.mobile = u.mobile  ) AS yanxuanspecial_num
+			( SELECT COUNT( 1 ) FROM cygx_yanxuan_special_record AS h  INNER JOIN cygx_yanxuan_special as v ON v.id = h.yanxuan_special_id WHERE  h.mobile = u.mobile  ) AS yanxuanspecial_num,
+			( SELECT COUNT(1) FROM cygx_user_feedback as h WHERE h.mobile = u.mobile   ) AS feedback_num,
+			( SELECT COUNT(1) FROM  ` + databaseName + `.rs_calendar_meeting_user as h WHERE h.mobile = u.mobile    ) AS rs_calendar_num
 		FROM ` + databaseName + `.wx_user AS u WHERE  u.user_id IN (` + userIds + `)  AND u.mobile != ''	GROUP BY u.user_id  `
 	_, err = o.Raw(sql).QueryRows(&items)
 	return

+ 7 - 3
models/cygx/cygx_user_record.go

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

+ 1 - 1
models/cygx/rai_serve_company.go

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

+ 11 - 1
models/cygx/user_feedback.go

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

+ 3 - 0
models/db.go

@@ -268,6 +268,7 @@ func initCompany() {
 		new(company.CompanyContractNoRenewedAscribeLog),      // 合同确认不续约记录日志
 		new(company.CrmConfig),                               // 管理后台基本配置表
 		new(company.CompanyRenewalRecord),                    // 客户续约状态记录表
+		new(company.CompanyHistoryRemark),                    // 客户记录历史记录表
 	)
 }
 
@@ -397,10 +398,12 @@ func initCygx() {
 		new(cygx.CygxIndustrialSubject),
 		new(cygx.CygxArticle),
 		new(cygx.CygxActivity),
+		new(cygx.CygxActivityVivoPointsSet),
 		new(cygx.CygxActivitySignup),
 		new(cygx.CygxActivityRestrictSignup),
 		new(cygx.CygxActivityAttendanceDetail),
 		new(cygx.CygxActivityOfflineMeetingDetail),
+		new(cygx.CygxActivityUserTemplateRecord),
 		new(cygx.CygxSummaryFastsearchKeywords),
 		new(cygx.CygxMySchedule),
 		new(cygx.CygxIndustrialArticleGroupManagement),

+ 3 - 3
models/roadshow/rs_calendar_meeting_user.go

@@ -180,7 +180,7 @@ func GetRsCalendarMeetingUserByRai(condition string, startSize, pageSize int) (t
 			INNER JOIN rs_calendar_researcher AS b ON a.rs_calendar_id = b.rs_calendar_id 
 			LEFT JOIN rs_calendar_meeting_label_group AS g ON g.rs_calendar_id = b.rs_calendar_id 
 		WHERE
-			1 = 1 ` + condition + ` GROUP  BY a.rs_calendar_id  `
+			1 = 1 ` + condition + ` GROUP  BY 	r.rs_calendar_meeting_user_id   `
 
 	totalSql := `SELECT COUNT(1) total FROM (` + sql + `) z `
 	err = o.Raw(totalSql).QueryRow(&total)
@@ -188,7 +188,7 @@ func GetRsCalendarMeetingUserByRai(condition string, startSize, pageSize int) (t
 		return
 	}
 
-	sql += ` ORDER BY  start_date  DESC `
+	sql += ` ORDER BY  b.start_date   DESC ,b.start_time   DESC , a.rs_calendar_id DESC  `
 	if startSize > 0 || pageSize > 0 {
 		sql += ` LIMIT ` + strconv.Itoa(startSize) + "," + strconv.Itoa(pageSize)
 	}
@@ -226,7 +226,7 @@ func GetRsCalendarMeetingUserByRaiWeekly(condition string, startSize, pageSize i
 		return
 	}
 
-	sql += ` ORDER BY  start_date  DESC `
+	sql += `ORDER BY  b.start_date   DESC ,b.start_time   DESC , a.rs_calendar_id DESC   `
 	if startSize > 0 || pageSize > 0 {
 		sql += ` LIMIT ` + strconv.Itoa(startSize) + "," + strconv.Itoa(pageSize)
 	}

+ 9 - 0
models/statistic_report.go

@@ -405,6 +405,7 @@ type IncrementalList struct {
 	PermissionNameStatus string                             `description:"权限状态"`
 	CompanyProductStatus string                             `description:"客户状态"`
 	//CompanyContractIdGroup string                             `description:"表company_contract合并的 company_contract_id"`
+	IsUserMaker int `description:"近四周之内是否包含决策人互动过 ,0否,1是"`
 }
 
 // GetIncrementalNewCompanyCount 获取增量客户报表列表统计数据(根据合同来展示)
@@ -842,6 +843,14 @@ func GetMoreRenewalReason(CompanyId, ProductId string) (items []*company.Company
 	return
 }
 
+// GetMoreRenewalReason 获取更多未续约说明列表15.9.1
+func GetMoreRenewalReasoninit() (items []*company.CompanyRenewalReason, err error) {
+	o := orm.NewOrm()
+	sql := "SELECT * FROM company_renewal_reason WHERE  product_id=2 ORDER BY create_time DESC"
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
 // GetLastContractMoney 获取上一份权益合同的金额
 func GetLastContractMoney(CompanyIds string) (items []*IncrementalList, err error) {
 	o := orm.NewOrm()

+ 12 - 0
models/system/sys_group.go

@@ -2,6 +2,7 @@ package system
 
 import (
 	"github.com/beego/beego/v2/client/orm"
+	"hongze/hz_crm_api/utils"
 	"time"
 )
 
@@ -122,6 +123,17 @@ func GetSysGroupByDirectorId(directorId int) (items []*SysGroupList, err error)
 	return
 }
 
+func GetSysGroupByGroupIds(groupIds []int) (items []*SysGroupList, err error) {
+	lenArr := len(groupIds)
+	if lenArr == 0 {
+		return
+	}
+	sql := `SELECT * FROM sys_group WHERE group_id IN  (` + utils.GetOrmInReplace(lenArr) + `) ORDER BY sort ASC, create_time ASC`
+	o := orm.NewOrm()
+	_, err = o.Raw(sql, groupIds).QueryRows(&items)
+	return
+}
+
 // GetSysGroupByGroupId 销售主管用,查找销售主管所在大组的名称
 func GetSysGroupByGroupId(groupId int) (items []*SysGroupList, err error) {
 	sql := `SELECT * FROM sys_group WHERE department_id=2 AND parent_id=0 AND group_id=? ORDER BY sort ASC, create_time ASC`

+ 6 - 6
models/yb/apply_record.go

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

+ 18 - 0
routers/commentsRouter.go

@@ -2329,6 +2329,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"],
+        beego.ControllerComments{
+            Method: "AddRemark",
+            Router: `/rai_serve/remark/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"],
+        beego.ControllerComments{
+            Method: "RemarkList",
+            Router: `/rai_serve/remark/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:RaiServeCoAntroller"],
         beego.ControllerComments{
             Method: "SearchTag",

+ 2 - 2
services/aliyun_ocr.go

@@ -11,7 +11,7 @@ import (
 )
 
 var (
-	AliyunAppCode = "6985365523f847c196e8e2222eaba550" // AppCode
+	AliyunAppCode = "22553c4ba74545568aba70ac6cfd441d" // AppCode
 )
 
 type AliOcrByImageToTextResp struct {
@@ -49,7 +49,7 @@ func AliOcrByImageToText(imageurl string) (item *AliOcrByImageToTextResp, err er
 		fmt.Println(err)
 		return
 	}
-	req.Header.Add("Authorization", "APPCODE "+AliyunAppCode)
+	req.Header.Add("Authorization", "APPCODE "+AlAppCode)
 	req.Header.Add("Content-Type", "application/json")
 
 	res, err := client.Do(req)

+ 54 - 8
services/company.go

@@ -867,12 +867,20 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 		if !strings.Contains(status, "/") {
 			if status == utils.COMPANY_STATUS_FORMAL { //正式
 				//button.BtnModifySeller = true
-				button.BtnRemarkView = true
+				if productId == utils.COMPANY_PRODUCT_RAI_ID {
+					button.BtnRemarkViewHistory = true
+				} else {
+					button.BtnRemarkView = true
+				}
 				return
 			} else if status == utils.COMPANY_STATUS_TRY_OUT { //试用
 				button.BtnEdit = true
 				button.BtnDelete = true
-				button.BtnRemarkView = true
+				if productId == utils.COMPANY_PRODUCT_RAI_ID {
+					button.BtnRemarkViewHistory = true
+				} else {
+					button.BtnRemarkView = true
+				}
 				//button.BtnModifySeller = true
 				button.BtnFreeze = false
 				if productId == utils.COMPANY_PRODUCT_FICC_ID {
@@ -881,11 +889,18 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 				return
 			} else if status == utils.COMPANY_STATUS_FREEZE { //冻结
 				//button.BtnModifySeller = true
-				button.BtnRemarkView = true
+				if productId == utils.COMPANY_PRODUCT_RAI_ID {
+					button.BtnRemarkViewHistory = true
+				} else {
+					button.BtnRemarkView = true
+				}
 				return
 			} else if status == utils.COMPANY_STATUS_LOSE { //流失
 				//button.BtnModifySeller = true
 				button.BtnDelete = true
+				if productId == utils.COMPANY_PRODUCT_RAI_ID {
+					button.BtnRemarkViewHistory = true
+				}
 				return
 			} else if status == utils.COMPANY_STATUS_CLOSE { // 关闭
 				//button.BtnModifySeller = true
@@ -898,6 +913,9 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 				//button.BtnModifySeller = true
 				button.BtnDelete = true
 				button.BtnEdit = true
+				if productId == utils.COMPANY_PRODUCT_RAI_ID {
+					button.BtnRemarkViewHistory = true
+				}
 				return
 			}
 		}
@@ -949,6 +967,7 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 			if productStatus == utils.COMPANY_STATUS_FORMAL { //正式
 				button.BtnModifySeller = true
 				button.BtnShare = true
+				button.BtnRemarkViewHistory = true
 			} else if productStatus == utils.COMPANY_STATUS_TRY_OUT { //试用
 				button.BtnEdit = true
 				//button.BtnDelete = true
@@ -956,13 +975,17 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 				button.BtnFreeze = false
 				// CRM14.7.2 权益管理员可以设置试用客户为共享
 				button.BtnShare = true
+				button.BtnRemarkViewHistory = true
 			} else if productStatus == utils.COMPANY_STATUS_FREEZE { //冻结
 				button.BtnModifySeller = true
+				button.BtnRemarkViewHistory = true
 			} else if productStatus == utils.COMPANY_STATUS_LOSE { //流失
 				//button.BtnDelete = true
+				button.BtnRemarkViewHistory = true
 			} else { //永续
 				button.BtnModifySeller = true
 				button.BtnShare = true
+				button.BtnRemarkViewHistory = true
 			}
 		} else {
 			productStatus2, hasProduct2 := productStatusMap[1]
@@ -1163,7 +1186,8 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 						button.BtnModifySeller = true
 						//button.BtnShare = true
 						button.BtnRemarkEdit = true
-						button.BtnRemarkView = true
+						//button.BtnRemarkView = true //权益销售隐藏
+						button.BtnRemarkViewHistory = true
 					} else if productStatus == utils.COMPANY_STATUS_TRY_OUT { //试用
 						button.BtnEdit = true
 						button.BtnDelete = true
@@ -1173,7 +1197,8 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 						button.BtnModifySeller = true
 						button.BtnFreeze = true
 						button.BtnRemarkEdit = true
-						button.BtnRemarkView = true
+						//button.BtnRemarkView = true //权益销售隐藏
+						button.BtnRemarkViewHistory = true
 						//button.BtnShare = true
 					} else if productStatus == utils.COMPANY_STATUS_FREEZE { //冻结
 						button.BtnThaw = true
@@ -1182,12 +1207,15 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 						button.BtnRemarkView = true
 					} else if productStatus == utils.COMPANY_STATUS_LOSE { //流失
 						button.BtnApplyReceive = true
+						button.BtnRemarkViewHistory = true
 					} else if productStatus == utils.COMPANY_STATUS_FOREVER { //永续
 						button.BtnTurnPositive = true
+						button.BtnRemarkViewHistory = true
 					}
 				} else {
 					if productStatus == utils.COMPANY_STATUS_LOSE { //流失
 						button.BtnView = true //显示权限、详情
+						button.BtnRemarkViewHistory = true
 						//如果不是自己客户,那么判断是否是本小组的,如果是本小组,那么还是申请领取,非本小组的话,那就是领取
 						if groupId == sysUserGroupId {
 							button.BtnApplyReceive = true
@@ -1201,25 +1229,31 @@ func GetCompanyPermissionButton(roleTypeCode, status, itemSellerIds, itemGroupId
 			//如果是组长,且该客户属于本组客户
 			if authority == 2 && hasGroupId && groupId == sysUserGroupId {
 				button.BtnView = true                             //查看详情权限
+				button.BtnRemarkViewHistory = true                //历史备注
 				if productStatus == utils.COMPANY_STATUS_FORMAL { //正式
 					button.BtnModifySeller = true
 					//button.BtnShare = true
-					button.BtnRemarkView = true
+					//button.BtnRemarkView = true //权益销售隐藏
+					//button.BtnRemarkViewHistory = true
 				} else if productStatus == utils.COMPANY_STATUS_TRY_OUT { //试用
 					button.BtnModifySeller = true
-					button.BtnRemarkView = true
+					//button.BtnRemarkView = true //权益销售隐藏
+					//button.BtnRemarkViewHistory = true
 					//button.BtnShare = true
 				} else if productStatus == utils.COMPANY_STATUS_FREEZE { //冻结
 					button.BtnModifySeller = true
-					button.BtnRemarkView = true
+					//button.BtnRemarkView = true //权益销售隐藏
+					//button.BtnRemarkViewHistory = true
 				} else if productStatus == utils.COMPANY_STATUS_LOSE { //流失
 					if sellerId == sysUserId || groupId == sysUserGroupId || utils.InArrayByStr(shareSellerIdArr, strconv.Itoa(sysUserId)) || shareSellerId == sysUserId {
 						button.BtnApplyReceive = true
 					} else {
 						button.BtnReceive = true
 					}
+					//button.BtnRemarkViewHistory = true
 				} else { //永续
 					//button.BtnDelete = true
+					//button.BtnRemarkViewHistory = true
 				}
 			}
 
@@ -2389,6 +2423,7 @@ func FilterReadAndContractAuth(chartPermissions, contractPermissions, condition
 
 // GetShareCompanyPermissionButton 正式客户共享-权限按钮
 func GetShareCompanyPermissionButton(roleTypeCode, statuses string, productId int, item *company.CompanyItem, sysUser *system.Admin) (button *company.ButtonPermission) {
+	statuses = strings.Replace(statuses, "(共享)", "", -1)
 	statusMap := make(map[int]string)
 	statusMap[productId] = statuses
 	if strings.Contains(statuses, "/") {
@@ -2470,5 +2505,16 @@ func GetShareCompanyPermissionButton(roleTypeCode, statuses string, productId in
 	if companyButton.BtnShare == true {
 		button.BtnShare = true
 	}
+	//备注与历史备注修改 CRM15.9.1
+	button.BtnRemarkView = companyButton.BtnRemarkView
+
+	if productId == 2 {
+		button.BtnRemarkView = false
+		button.BtnRemarkViewHistory = true
+	}
+
+	if utils.InArrayByStr([]string{utils.ROLE_TYPE_CODE_RAI_ADMIN, utils.ROLE_TYPE_CODE_RAI_SELLER, utils.ROLE_TYPE_CODE_RAI_GROUP}, roleTypeCode) {
+		button.BtnServiceRecord = false //王芳,权益销售,权益销售组长,这三种身份看不到这个按钮
+	}
 	return
 }

+ 243 - 0
services/company_record.go

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

+ 106 - 46
services/cygx/acitvity.go

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

+ 16 - 16
services/cygx/activity_ocr.go

@@ -175,13 +175,13 @@ func UpdateActivityVideoAndVoice(activityInfo *cygx.ActivityDetail, itemVoice *c
 			err = errors.New("GetCygxActivityVoiceCount" + e.Error())
 			return
 		}
-		activityId := itemVoice.ActivityId
-		//获取活动详情
-		activityInfo, e := cygx.GetAddActivityInfoById(activityId)
-		if e != nil {
-			err = errors.New("GetAddActivityInfoById, Err: " + e.Error())
-			return
-		}
+		//activityId := itemVoice.ActivityId
+		////获取活动详情
+		//activityInfo, e := cygx.GetAddActivityInfoById(activityId)
+		//if e != nil {
+		//	err = errors.New("GetAddActivityInfoById, Err: " + e.Error())
+		//	return
+		//}
 		//易董办会的分析师电话会,为路演回放
 		if (activityInfo.ActivityTypeId == 2 || activityInfo.ActivityTypeId == 7) && activityInfo.IsYidongConduct == 1 {
 			itemVoice.FileType = 1
@@ -189,7 +189,7 @@ func UpdateActivityVideoAndVoice(activityInfo *cygx.ActivityDetail, itemVoice *c
 			itemVoice.FileType = 2
 		}
 
-		shareImg, _ := MakeCygxMp3HtmlImg(itemVoice.VoicePlaySeconds) //生成分享图片
+		shareImg, _ := MakeCygxMp3HtmlImg(itemVoice.VoicePlaySeconds, activityInfo.ChartPermissionId) //生成分享图片
 		itemVoice.ShareImg = shareImg
 		itemVoice.VoiceName = utils.RemoveFileSuffixName(itemVoice.VoiceName) //去掉后缀名称
 
@@ -246,13 +246,13 @@ func UpdateActivityVideoAndVoice(activityInfo *cygx.ActivityDetail, itemVoice *c
 			err = errors.New("GetActivityVideoCount" + e.Error())
 			return
 		}
-		activityId := itemVideo.ActivityId
-		//获取活动详情
-		activityInfo, e := cygx.GetAddActivityInfoById(activityId)
-		if e != nil {
-			err = errors.New("GetAddActivityInfoById, Err: " + e.Error())
-			return
-		}
+		//activityId := itemVideo.ActivityId
+		////获取活动详情
+		//activityInfo, e := cygx.GetAddActivityInfoById(activityId)
+		//if e != nil {
+		//	err = errors.New("GetAddActivityInfoById, Err: " + e.Error())
+		//	return
+		//}
 		//易董办会的分析师电话会,为路演回放
 		if (activityInfo.ActivityTypeId == 2 || activityInfo.ActivityTypeId == 7) && activityInfo.IsYidongConduct == 1 {
 			itemVideo.FileType = 1
@@ -260,7 +260,7 @@ func UpdateActivityVideoAndVoice(activityInfo *cygx.ActivityDetail, itemVoice *c
 			itemVideo.FileType = 2
 		}
 
-		shareImg, _ := MakeCygxMp4HtmlImg(itemVideo.VideoDuration) //生成分享图片
+		shareImg, _ := MakeCygxMp4HtmlImg(itemVideo.VideoDuration, activityInfo.ChartPermissionId) //生成分享图片
 		itemVideo.ShareImg = shareImg
 		itemVideo.VideoName = utils.RemoveFileSuffixName(itemVideo.VideoName) //去掉后缀名称
 

+ 44 - 0
services/cygx/activity_points_set.go

@@ -401,3 +401,47 @@ func init0703() {
 	fmt.Println(companyIds)
 	fmt.Println(err)
 }
+
+func UpdateActivityVivoPointsSet(activityInfo *cygx.ActivityDetail, vivoPointsSet cygx.CygxActivityVivoPointsSetReq, itemPointsSet *cygx.CygxActivityPointsSet, sourceVivo string) (err error) {
+	activityId := activityInfo.ActivityId
+	if vivoPointsSet.IsPay == 0 {
+		return
+	}
+	if sourceVivo == "" {
+		return
+	}
+	total, e := cygx.GetCygxActivityVivoPointsSetCountByActivityId(activityId)
+	if e != nil {
+		err = errors.New("GetCygxActivityVivoPointsSetCountByActivityId, Err: " + e.Error())
+		return
+	}
+	if vivoPointsSet.PointsNum == "" {
+		vivoPointsSet.PointsNum = "0"
+	}
+	if vivoPointsSet.GoodsMoney == "" {
+		vivoPointsSet.GoodsMoney = "0"
+	}
+	item := new(cygx.CygxActivityVivoPointsSet)
+	item.ActivityId = activityId
+	item.PointsObject = vivoPointsSet.PointsObject
+	item.PointsNum = vivoPointsSet.PointsNum
+	item.GoodsMoney = vivoPointsSet.GoodsMoney
+	item.Source = sourceVivo
+	item.CreateTime = time.Now()
+	item.ModifyTime = time.Now()
+	if total == 0 {
+		e = cygx.AddCygxActivityVivoPointsSet(item)
+		if e != nil {
+			err = errors.New("AddCygxActivityVivoPointsSet, Err: " + e.Error())
+			return
+		}
+	} else {
+		e = cygx.EditCygxActivityVivoPointsSet(item)
+		if e != nil {
+			err = errors.New("AddCygxActivityVivoPointsSet, Err: " + e.Error())
+			return
+		}
+	}
+
+	return
+}

+ 23 - 6
services/cygx/activity_poster.go

@@ -23,6 +23,8 @@ var (
 	Cygx_activity_sigin_html = "cygx_activity_sigin_html"
 	Cygx_mp3_html            = "cygx_mp3_html"
 	Cygx_mp4_html            = "cygx_mp4_html"
+	Cygx_mp3_yx_html         = "cygx_mp3_yx_html"
+	Cygx_mp4_yx_html         = "cygx_mp4_yx_html"
 )
 
 type Html2ImgResp struct {
@@ -237,7 +239,7 @@ func MakeActivitySigninImg(activityId int) (imgUrl string, err error) {
 }
 
 // 生成音视频分享封面图
-func MakeCygxMp3HtmlImg(videoDuration string) (imgUrl string, err error) {
+func MakeCygxMp3HtmlImg(videoDuration string, chartPermissionId int) (imgUrl string, err error) {
 	var msg string
 	defer func() {
 		if err != nil || msg != "" {
@@ -245,7 +247,14 @@ func MakeCygxMp3HtmlImg(videoDuration string) (imgUrl string, err error) {
 			go alarm_msg.SendAlarmMsg("生成音视频分享封面图,失败 MakeCygxMp3HtmlImg:"+err.Error()+";msg:"+msg, 3)
 		}
 	}()
-	detailConfig, e := cygx.GetCygxConfigDetailByCode(Cygx_mp3_html)
+
+	var configCode string
+	if chartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+		configCode = Cygx_mp3_yx_html
+	} else {
+		configCode = Cygx_mp3_html
+	}
+	detailConfig, e := cygx.GetCygxConfigDetailByCode(configCode)
 	if e != nil {
 		err = errors.New("GetCygxConfigDetailByCode 获取配置生成音视频分享封面图格式信息失败, Err: " + e.Error())
 		return
@@ -283,7 +292,7 @@ func MakeCygxMp3HtmlImg(videoDuration string) (imgUrl string, err error) {
 }
 
 // 生成音视频分享封面图
-func MakeCygxMp4HtmlImg(videoDuration string) (imgUrl string, err error) {
+func MakeCygxMp4HtmlImg(videoDuration string, chartPermissionId int) (imgUrl string, err error) {
 	var msg string
 	defer func() {
 		if err != nil || msg != "" {
@@ -291,7 +300,15 @@ func MakeCygxMp4HtmlImg(videoDuration string) (imgUrl string, err error) {
 			go alarm_msg.SendAlarmMsg("生成音视频分享封面图,失败 MakeCygxMp4HtmlImg:"+err.Error()+";msg:"+msg, 3)
 		}
 	}()
-	detailConfig, e := cygx.GetCygxConfigDetailByCode(Cygx_mp4_html)
+
+	var configCode string
+	if chartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+		configCode = Cygx_mp4_yx_html
+	} else {
+		configCode = Cygx_mp4_html
+	}
+
+	detailConfig, e := cygx.GetCygxConfigDetailByCode(configCode)
 	if e != nil {
 		err = errors.New("GetCygxConfigDetailByCode 获取配置生成音视频分享封面图格式信息失败, Err: " + e.Error())
 		return
@@ -391,7 +408,7 @@ func MakeActivityMomentsImg(activityId int) {
 	htm2ImgReq["height"] = 3813
 	res, err := postHtml2Img(htm2ImgReq)
 	if err != nil || res == nil {
-		err = errors.New("html转图片失败: " + res.Msg)
+		err = errors.New("html转图片失败: ")
 		return
 	}
 	if res.Code != 200 {
@@ -564,4 +581,4 @@ func MakeActivityMomentsImg(activityId int) {
 //	item.CreateTime = time.Now()
 //	err = cygx.AddCygxActivityPoster(item)
 //	return
-//}
+//}

+ 36 - 7
services/cygx/activity_wx_msg.go

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

+ 4 - 4
services/cygx/askserie_video.go

@@ -149,7 +149,7 @@ func initpy() {
 	}
 
 	for _, v := range listVoice {
-		shareImg, _ := MakeCygxMp3HtmlImg(v.VoicePlaySeconds) //生成分享图片
+		shareImg, _ := MakeCygxMp3HtmlImg(v.VoicePlaySeconds, 0) //生成分享图片
 		v.ShareImg = shareImg
 		err = cygx.UpdateCygxActivityVoice(v)
 		if err != nil {
@@ -166,7 +166,7 @@ func initpy() {
 	}
 
 	for _, v := range listVideo {
-		shareImg, _ := MakeCygxMp4HtmlImg(v.VideoDuration) //生成分享图片
+		shareImg, _ := MakeCygxMp4HtmlImg(v.VideoDuration, 0) //生成分享图片
 		v.ShareImg = shareImg
 		err = cygx.UpdateCygxActivityVideo(v)
 		if err != nil {
@@ -183,7 +183,7 @@ func initpy() {
 	}
 
 	for _, v := range listVideoRoadshow {
-		shareImg, _ := MakeCygxMp4HtmlImg(v.VideoDuration) //生成分享图片
+		shareImg, _ := MakeCygxMp4HtmlImg(v.VideoDuration, 0) //生成分享图片
 		v.ShareImgUrl = shareImg
 		err = cygx.UpdateCygxMicroRoadshowVideo(v)
 		if err != nil {
@@ -200,7 +200,7 @@ func initpy() {
 	}
 
 	for _, v := range listAskserVoice {
-		shareImg, _ := MakeCygxMp3HtmlImg(v.VideoDuration) //生成分享图片
+		shareImg, _ := MakeCygxMp3HtmlImg(v.VideoDuration, 0) //生成分享图片
 		v.ShareImg = shareImg
 		err = cygx.EditCygxAskserieVideoShareImg(shareImg, v.AskserieVideoId)
 		if err != nil {

+ 31 - 0
services/cygx/contract_allocation.go

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

+ 4 - 4
services/cygx/mail.go

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

+ 1 - 1
services/cygx/user_label.go

@@ -267,7 +267,7 @@ func GetUserInteractionNumMap(userIds []int) (mapResp map[int]int) {
 	}
 	mapResp = make(map[int]int, 0)
 	for k, v := range list {
-		mapResp[int(v.UserId)] = list[k].HistoryNum + list[k].CountNum + list[k].IndustryFllowNum + list[k].DepartmentFollowNum + list[k].KeyWordNum + list[k].OnLineNum + list[k].OfficeNum + list[k].ChartNum + list[k].TripNum + list[k].RoadshowVideoNum + list[k].ActivityVideoNum + list[k].ActivityVoiceNum + list[k].YanxuanspecialNum
+		mapResp[int(v.UserId)] = list[k].HistoryNum + list[k].CountNum + list[k].IndustryFllowNum + list[k].DepartmentFollowNum + list[k].KeyWordNum + list[k].OnLineNum + list[k].OfficeNum + list[k].ChartNum + list[k].TripNum + list[k].RoadshowVideoNum + list[k].ActivityVideoNum + list[k].ActivityVoiceNum + list[k].YanxuanspecialNum + list[k].FeedbackNum + list[k].RsCalendarNum
 	}
 	return
 }

+ 29 - 12
services/wechat_send_category_template_msg.go

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

+ 6 - 4
utils/constants.go

@@ -106,7 +106,7 @@ const (
 	COMPANY_STATUS_CLOSE             = "关闭"
 	COMPANY_STATUS_CLOSE_FLAG        = "close"
 	COMPANY_STATUS_TRY_OUT_COUNT     = 60
-	COMPANY_STATUS_TRY_OUT_COUNT_RAI = 30 // 权益试用客户上限
+	COMPANY_STATUS_TRY_OUT_COUNT_RAI = 40 // 权益试用客户上限
 
 	COMPANY_APPROVE_STATUS = "待审批"
 )
@@ -432,8 +432,10 @@ const (
 )
 
 var CYGX_REGISTER_PLATFORM_MAP = map[string]string{
-	"1": "小程序",
-	"2": "网页版",
+	"1": "查研小程序",
+	"2": "查研网页版",
+	"5": "研选小程序",
+	"6": "研选网页版",
 }
 
 var ACTIVITY_SPECIAL_TRIP_PERMISSION_NAME_OTHER = []string{"策略", "固收", "周期"} //专项调研活动带扣点的行业
@@ -558,7 +560,7 @@ const (
 const BusinessCodeSalt = "dr7WY0OZgGR7upw1"
 
 const (
-	ApproveUserId = 2 //施琪-出差审批人
+	ApproveUserId = 9 //戚明之-出差审批人
 )
 
 // 查研观向 研选专栏 作者头像和背景