Răsfoiți Sursa

Merge branch 'master' of http://8.136.199.33:3000/hongze/hz_crm_api into crm/crm_14.2

xingzai 1 an în urmă
părinte
comite
cbbb2135dc
74 a modificat fișierele cu 4310 adăugiri și 727 ștergeri
  1. 3 1
      controllers/business_trip/business_calendar.go
  2. 8 1
      controllers/company.go
  3. 44 12
      controllers/company_apply.go
  4. 8 0
      controllers/company_apply_v2.go
  5. 6 2
      controllers/company_permission.go
  6. 70 5
      controllers/cygx/activity.go
  7. 7 0
      controllers/cygx/activity_meet.go
  8. 49 0
      controllers/cygx/activity_signup.go
  9. 14 14
      controllers/cygx/activity_special.go
  10. 324 18
      controllers/cygx/activity_video.go
  11. 486 0
      controllers/cygx/askserie_video.go
  12. 9 6
      controllers/cygx/contract_allocation.go
  13. 32 8
      controllers/cygx/micro_roadshow.go
  14. 159 2
      controllers/cygx/morning_meeting_review.go
  15. 327 0
      controllers/cygx/questionnaire.go
  16. 6 1
      controllers/cygx/report_article.go
  17. 135 2
      controllers/cygx/tag_management.go
  18. 38 10
      controllers/cygx/yanxuan_special.go
  19. 11 2
      controllers/english_report/email.go
  20. 89 45
      controllers/english_report/english_classify.go
  21. 43 3
      controllers/english_report/english_video.go
  22. 96 0
      controllers/eta_business/eta_business_menu.go
  23. 7 2
      controllers/sys_admin.go
  24. 3 0
      controllers/yb/apply_record.go
  25. 1 0
      models/business_trip/business_calendar.go
  26. 3 1
      models/company/company_config.go
  27. 19 3
      models/company/company_permission.go
  28. 18 0
      models/cygx/activity.go
  29. 1 1
      models/cygx/activity_appointment.go
  30. 1 1
      models/cygx/activity_help_ask.go
  31. 1 1
      models/cygx/activity_special_trip.go
  32. 76 0
      models/cygx/activity_video.go
  33. 39 0
      models/cygx/activity_voice.go
  34. 207 0
      models/cygx/askserie_video.go
  35. 74 0
      models/cygx/askserie_video_history_record.go
  36. 8 0
      models/cygx/config.go
  37. 62 0
      models/cygx/cygx_morning_meeting_review_chapter_history.go
  38. 2 0
      models/cygx/cygx_morning_meeting_reviews.go
  39. 18 0
      models/cygx/cygx_tag.go
  40. 5 5
      models/cygx/cygx_user.go
  41. 11 0
      models/cygx/cygx_yanxuan_special_user.go
  42. 41 0
      models/cygx/industrial_askserie_video_group_management.go
  43. 31 25
      models/cygx/micro_roadshow.go
  44. 218 0
      models/cygx/questionnaire.go
  45. 79 0
      models/cygx/questionnaire_vote.go
  46. 1 0
      models/cygx/report_article.go
  47. 8 0
      models/cygx/report_mapping_celue.go
  48. 30 10
      models/cygx/resource_data.go
  49. 1 1
      models/data_manage/request/cygx_tag.go
  50. 6 0
      models/db.go
  51. 58 477
      models/english_report.go
  52. 1 0
      models/english_report_email.go
  53. 3 0
      models/english_video.go
  54. 118 0
      models/eta_business/eta_business_config_relate.go
  55. 17 0
      models/eta_business/eta_business_menu.go
  56. 1 1
      models/yb/apply_record.go
  57. 180 0
      routers/commentsRouter.go
  58. 2 0
      routers/router.go
  59. 11 1
      services/company_permission.go
  60. 2 1
      services/cygx/acitvity.go
  61. 73 19
      services/cygx/activity_ocr.go
  62. 1 0
      services/cygx/activity_points_set.go
  63. 115 0
      services/cygx/activity_wx_msg.go
  64. 137 0
      services/cygx/askserie_video.go
  65. 4 0
      services/cygx/contract_allocation.go
  66. 103 0
      services/cygx/cygx_questionnaire.go
  67. 45 0
      services/cygx/morning_meeting.go
  68. 427 15
      services/cygx/resource_data.go
  69. 14 14
      services/elastic.go
  70. 43 1
      services/elastic/es_comprehensive.go
  71. 2 7
      services/english_video.go
  72. 2 2
      services/wechat_send_msg.go
  73. 5 5
      services/yb/apply_record.go
  74. 11 2
      utils/constants.go

+ 3 - 1
controllers/business_trip/business_calendar.go

@@ -10,7 +10,7 @@ import (
 	"time"
 )
 
-// ResearcherReportList
+// BusinessTripCalendar
 // @Title 出差日历表
 // @Description 出差日历表接口
 // @Param   AdminId   query   string  false       "用户id,多个用英文逗号分开"
@@ -190,6 +190,7 @@ func (this *BusinessTrip) BusinessTripCalendar() {
 							tripItem.City = r.City
 							tripItem.BusinessApplyId = r.BusinessApplyId
 							tripItem.Status = r.Status
+							tripItem.Reason = r.Reason
 						}
 					}
 
@@ -212,6 +213,7 @@ func (this *BusinessTrip) BusinessTripCalendar() {
 							tripItem.City = r.City
 							tripItem.BusinessApplyId = r.BusinessApplyId
 							tripItem.Status = r.Status
+							tripItem.Reason = r.Reason
 						}
 					}
 					tripItem.WeekDate = weekDate

+ 8 - 1
controllers/company.go

@@ -2833,8 +2833,15 @@ func (this *CompanyController) Add() {
 			br.ErrMsg = "新增失败,ModifyCompanyUserCompanyId err:" + err.Error()
 			return
 		}
+		//获取联系人详情
+		userInfo, err := models.GetWxUserByUserId(req.UserId)
+		if err != nil {
+			br.Msg = "获取联系人异常!"
+			br.ErrMsg = "获取联系人异常,Err:" + err.Error()
+			return
+		}
 		//添加该联系人 与 当前销售的关系
-		models.AddUserSellerRelation(int64(req.UserId), int(companyId), seller.AdminId, productId, seller.RealName, "", "")
+		models.AddUserSellerRelation(int64(req.UserId), int(companyId), seller.AdminId, productId, seller.RealName, userInfo.Mobile, userInfo.Email)
 	}
 
 	companyProduct := new(company.CompanyProduct)

+ 44 - 12
controllers/company_apply.go

@@ -74,7 +74,7 @@ func (this *CompanyApplyController) ApplyContractHistoryList() {
 	//	raiPermissions = ps
 	//}
 
-	expMap := map[int]string{0: "(3w)", 1: "(5w)"} // 买方研选价格
+	//expMap := map[int]string{0: "(3w)", 1: "(5w)"} // 买方研选价格
 	for i := 0; i < listLen; i++ {
 		companyContract := list[i]
 		list[i].ModifyTimeStr = companyContract.ModifyTime.Format(utils.FormatDateTime)
@@ -120,6 +120,7 @@ func (this *CompanyApplyController) ApplyContractHistoryList() {
 			//	br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
 			//	return
 			//}
+			var expensiveYx int
 			hasPermissions, e := company.GetCompanyContractPermissionByCompanyContractId(companyContract.CompanyContractId)
 			if e != nil {
 				br.Msg = "获取失败"
@@ -129,6 +130,9 @@ func (this *CompanyApplyController) ApplyContractHistoryList() {
 			hasMap := make(map[int]*company.CompanyContractPermission)
 			for _, p := range hasPermissions {
 				hasMap[p.ChartPermissionId] = p
+				if p.ExpensiveYx > 0 {
+					expensiveYx = p.ExpensiveYx
+				}
 			}
 
 			checkItems := make([]*company.PermissionLookItem, 0)
@@ -155,7 +159,14 @@ func (this *CompanyApplyController) ApplyContractHistoryList() {
 				}
 				// 买方研选(3w/5w)
 				if n.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN {
-					n.PermissionName += expMap[match.ExpensiveYx]
+					if expensiveYx == 1 {
+						n.PermissionName += "(5w)"
+					} else if expensiveYx == 2 {
+						n.PermissionName += "(10w)"
+					} else if expensiveYx == 0 {
+						n.PermissionName += "(3w)"
+					}
+					//n.PermissionName += expMap[match.ExpensiveYx]
 					checkList = append(checkList, n.ChartPermissionId)
 					checkItems = append(checkItems, n)
 					continue
@@ -390,8 +401,8 @@ func (this *CompanyApplyController) ApplyContractDetail() {
 		}
 		permissions := make([]int, 0) // 合同权限IDs
 		checkItems := make([]*company.PermissionLookItem, 0)
-		expMap := map[bool]string{false: "(3w)", true: "(5w)"} // 买方研选价格
-
+		//expMap := map[bool]string{false: "(3w)", true: "(5w)"} // 买方研选价格
+		var expensiveYx int
 		// 未选大套餐, 走老逻辑
 		if detail.RaiPackageType == 0 {
 			mapUpgrade := make(map[int]bool) // 通过合同获取所勾选的升级行业权限
@@ -400,8 +411,9 @@ func (this *CompanyApplyController) ApplyContractDetail() {
 				if v.IsUpgrade == 1 {
 					mapUpgrade[v.ChartPermissionId] = true
 				}
-				if v.ExpensiveYx == 1 {
+				if v.ExpensiveYx > 0 {
 					mapExpensive[v.ChartPermissionId] = true
+					expensiveYx = v.ExpensiveYx
 				}
 				permissions = append(permissions, v.ChartPermissionId)
 			}
@@ -438,7 +450,12 @@ func (this *CompanyApplyController) ApplyContractDetail() {
 					}
 					// 买方研选
 					if p.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
-						p.PermissionName += expMap[mapExpensive[p.ChartPermissionId]]
+						if expensiveYx == 1 {
+							p.PermissionName += "(5w)"
+						} else if expensiveYx == 2 {
+							p.PermissionName += "(10w)"
+						}
+						//p.PermissionName += expMap[mapExpensive[p.ChartPermissionId]]
 					}
 				}
 			}
@@ -474,7 +491,12 @@ func (this *CompanyApplyController) ApplyContractDetail() {
 					continue
 				}
 				if n.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
-					n.PermissionName += expMap[mapExpensive[n.ChartPermissionId]]
+					//n.PermissionName += expMap[mapExpensive[n.ChartPermissionId]]
+					if expensiveYx == 1 {
+						n.PermissionName += "(5w)"
+					} else if expensiveYx == 2 {
+						n.PermissionName += "(10w)"
+					}
 				}
 				if utils.InArrayByInt(permissions, n.ChartPermissionId) {
 					checkList = append(checkList, n.ChartPermissionId)
@@ -1918,6 +1940,7 @@ func (this *CompanyApplyController) ApplyContract() {
 		//升级
 		mapUpgrade := make(map[int]int)
 		mapExpensive := make(map[int]bool)
+		var expensiveYx int
 		permissionList, err := company.GetCompanyContractPermissionByCompanyContractId(contractItem.CompanyContractId)
 		if err != nil && err.Error() != utils.ErrNoRow() {
 			br.Msg = "获取失败"
@@ -1929,8 +1952,9 @@ func (this *CompanyApplyController) ApplyContract() {
 			if v.IsUpgrade == 1 {
 				mapUpgrade[v.ChartPermissionId] = v.ChartPermissionId
 			}
-			if v.ExpensiveYx == 1 {
+			if v.ExpensiveYx > 0 {
 				mapExpensive[v.ChartPermissionId] = true
+				expensiveYx = v.ExpensiveYx
 			}
 			permissionIds = append(permissionIds, v.ChartPermissionId)
 		}
@@ -1951,8 +1975,12 @@ func (this *CompanyApplyController) ApplyContract() {
 					checkList = append(checkList, n.ChartPermissionId+utils.PERMISSION_ID_UPGRADE)
 				} else {
 					if mapExpensive[n.ChartPermissionId] {
-						// 研选5w
-						checkList = append(checkList, n.ChartPermissionId+utils.PERMISSION_ID_YANXUAN_DIFF)
+						// 研选5w与10W
+						if expensiveYx == 1 {
+							checkList = append(checkList, n.ChartPermissionId+utils.PERMISSION_ID_YANXUAN_DIFF) // 5W
+						} else {
+							checkList = append(checkList, utils.PERMISSION_ID_YANXUAN_10W_DIFF) // 10W
+						}
 					} else {
 						// 非内部人员, 忽略掉已有的客观权限, 否则前端升级的反选会出现问题, 重新提交的时候只提交主观权限也有对应的处理
 						if !strings.Contains(n.Remark, "客观") {
@@ -1967,9 +1995,9 @@ func (this *CompanyApplyController) ApplyContract() {
 				//mapChartPermissionId[n.ChartPermissionId] = n.ChartPermissionId
 			}
 
-			// 买方研选3w/5w
+			// 买方研选3w/5w/10w
 			if n.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN {
-				m3, m5 := new(company.PermissionLookItem), new(company.PermissionLookItem)
+				m3, m5, m10 := new(company.PermissionLookItem), new(company.PermissionLookItem), new(company.PermissionLookItem)
 				m3.ChartPermissionId = n.ChartPermissionId
 				m3.PermissionName = fmt.Sprint(n.PermissionName, "(3w)")
 				plist.Items = append(plist.Items, m3)
@@ -1977,6 +2005,10 @@ func (this *CompanyApplyController) ApplyContract() {
 				m5.ChartPermissionId = n.ChartPermissionId + utils.PERMISSION_ID_YANXUAN_DIFF
 				m5.PermissionName = fmt.Sprint(n.PermissionName, "(5w)")
 				plist.Items = append(plist.Items, m5)
+
+				m10.ChartPermissionId = utils.PERMISSION_ID_YANXUAN_10W_DIFF
+				m10.PermissionName = fmt.Sprint(n.PermissionName, "(10w)")
+				plist.Items = append(plist.Items, m10)
 				continue
 			}
 

+ 8 - 0
controllers/company_apply_v2.go

@@ -451,6 +451,14 @@ func (this *CompanyApplyController) ApplyTurnPositive() {
 				continue
 			}
 
+			// 研选10w的处理
+			if permissionId == utils.PERMISSION_ID_YANXUAN_10W_DIFF {
+				//permissionIdsNew += strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN) + ","
+				strPermissionIdArr = append(strPermissionIdArr, strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN))
+				expensiveYx = 2
+				continue
+			}
+
 			if permissionId > utils.PERMISSION_ID_UPGRADE {
 				//permissionIdsNew += strconv.Itoa(permissionId-utils.PERMISSION_ID_UPGRADE) + ","
 				permissionIdOnly = permissionId - utils.PERMISSION_ID_UPGRADE

+ 6 - 2
controllers/company_permission.go

@@ -153,9 +153,9 @@ func (this *CompanyPermissionController) List() {
 					continue
 				}
 
-				// 买方研选划分为3w和5w
+				// 买方研选划分为3w和5w,10W三
 				if v.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN {
-					m3, m5 := new(company.PermissionSetItem), new(company.PermissionSetItem)
+					m3, m5, m10 := new(company.PermissionSetItem), new(company.PermissionSetItem), new(company.PermissionSetItem)
 					m3.ChartPermissionId = v.ChartPermissionId
 					m3.PermissionName = fmt.Sprint(v.PermissionName, "(3w)")
 					p.Items = append(p.Items, m3)
@@ -163,6 +163,10 @@ func (this *CompanyPermissionController) List() {
 					m5.ChartPermissionId = v.ChartPermissionId + utils.PERMISSION_ID_YANXUAN_DIFF
 					m5.PermissionName = fmt.Sprint(v.PermissionName, "(5w)")
 					p.Items = append(p.Items, m5)
+
+					m10.ChartPermissionId = utils.PERMISSION_ID_YANXUAN_10W_DIFF
+					m10.PermissionName = fmt.Sprint(v.PermissionName, "(10w)")
+					p.Items = append(p.Items, m10)
 					continue
 				}
 

+ 70 - 5
controllers/cygx/activity.go

@@ -442,6 +442,7 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 			item.IsYidongConduct = req.IsYidongConduct
 			item.IsCanOutboundCall = req.IsCanOutboundCall
 			item.IsNeedEmail = isNeedEmail
+			item.AreaType = req.AreaType
 
 			if len(listImgToText) > 0 {
 				resultTime := utils.StrTimeToTime(item.ActivityTime)                                       //时间字符串格式转时间格式
@@ -821,6 +822,7 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 			cygxService.UpdateActivityResourceData(req.ActivityId)                                             //写入首页最新  cygx_resource_data 表
 			go cygxService.YanXuanActivityPointsBillActivityPublishAndCancel(activityId, AdminUser.AdminId, 1) //活动发布以及取消发布处理研选扣点
 		}
+
 		//如果二次编辑的时候,取消了易董办会选项,那么就对易董发送取消发布到广场的通知
 		if req.IsYidongConduct == 0 {
 			go cygxService.YiDongUpdateActivityStatus(activityId)
@@ -966,7 +968,7 @@ func (this *ActivityCoAntroller) ActivityList() {
 		return
 	}
 	if activeState == "NotStarted" {
-		condition += ` ORDER BY art.activity_time ASC `
+		condition += ` ORDER BY art.top_time DESC , art.activity_time ASC `
 	} else {
 		condition += ` ORDER BY art.activity_time DESC `
 	}
@@ -1280,7 +1282,6 @@ func (this *ActivityCoAntroller) PublishAndCancel() {
 		go cygxService.DoActivityOnenIdWxTemplateMsg(activityId)
 		//go cygxService.UpdateResourceData(activityId, "activity", "add", time.Now().Format(utils.FormatDateTime))
 
-		cygxService.UpdateActivityResourceData(activityId) //写入首页最新  cygx_resource_data 表
 	} else {
 		item.PublishStatus = 0
 		item.IsCancel = 1
@@ -1289,7 +1290,6 @@ func (this *ActivityCoAntroller) PublishAndCancel() {
 		go services.SendWxMsgWithCygxActivity(req.ActivityId)
 		//同步活动到最新数据表
 		//go cygxService.UpdateResourceData(req.ActivityId, "activity", "delete", "")
-		cygxService.UpdateActivityResourceData(activityId) //写入首页最新  cygx_resource_data 表
 	}
 	item.ActivityId = req.ActivityId
 	if item.PublishStatus == 1 {
@@ -1316,8 +1316,8 @@ func (this *ActivityCoAntroller) PublishAndCancel() {
 		go cygxService.YiDongUpdateActivityPublish(activityId)
 	}
 	go cygxService.YanXuanActivityPointsBillActivityPublishAndCancel(activityId, AdminUser.AdminId, item.PublishStatus) //活动发布以及取消发布处理研选扣点
-
-	go elastic.AddComprehensiveActivity(activityId) // 同步Es添加活动
+	go elastic.AddComprehensiveActivity(activityId)                                                                     // 同步Es添加活动
+	go cygxService.UpdateActivityResourceData(activityId)                                                               //写入首页最新  cygx_resource_data 表
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"
@@ -1637,3 +1637,68 @@ func (this *ActivityCoAntroller) ImgToText() {
 	br.Data = resp
 	br.IsAddLog = true
 }
+
+// @Title 活动的置顶与取消置顶
+// @Description 活动的发布与取消发布接口
+// @Param	request	body cygx.ActivityIdRep true "type json string"
+// @Success 200 操作成功
+// @router /activity/tope_change [post]
+func (this *ActivityCoAntroller) TopeChange() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	AdminUser := this.SysUser
+	if AdminUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	var req cygx.ActivityIdRep
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	activityId := req.ActivityId
+	activityInfo, errInfo := cygx.GetAddActivityInfoById(activityId)
+	if activityInfo == nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "活动ID错误,不存在activityId:" + strconv.Itoa(activityId)
+		return
+	}
+	if errInfo != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "操作失败,Err:" + errInfo.Error()
+		return
+	}
+	//校验活动后台管理员、销售是否有修改权限
+	havePower, popupMsg, err := cygxService.CheckActivityUpdatePower(AdminUser.AdminId, activityInfo)
+	if err != nil {
+		br.Msg = "获取管理员身份信息失败"
+		br.ErrMsg = "获取管理员身份信息失败,Err:" + err.Error()
+		return
+	}
+	if !havePower {
+		br.Msg = popupMsg
+		return
+	}
+	var topTime int
+	//如果有置顶时间就设为取消置顶,如果没有就写入当前置顶时间
+	if activityInfo.TopTime == 0 {
+		topTime = int(time.Now().Unix())
+	}
+	err = cygx.UpdateActivityTopTime(activityId, topTime)
+	if err != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "操作失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+	br.IsAddLog = true //添加操作日志记录
+}

+ 7 - 0
controllers/cygx/activity_meet.go

@@ -942,6 +942,13 @@ func (this *ActivityMeetCoAntroller) AppointmentList() {
 				respList.List = append(respList.List, v)
 			}
 		}
+		if adminInfo.RoleTypeCode == "rai_group" {
+			//组长查看本组所有组员
+			memberType = "GroupLeader"
+		} else {
+			//组员查看自己
+			memberType = "Sale"
+		}
 	} else {
 		respList.List = list
 	}

+ 49 - 0
controllers/cygx/activity_signup.go

@@ -295,6 +295,18 @@ func (this *ActivitySignupCoAntroller) AppointmentList() {
 		br.ErrMsg = "客户总数获取失败,Err:" + errtotal.Error()
 		return
 	}
+
+	companyIdsPower, err := cygxService.GetAdminLookUserCompanyIds(sysUser)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,GetAdminLookUserCompanyIds Err:" + err.Error()
+		return
+	}
+	var companyIdstr []string
+	for _, v := range companyIdsPower {
+		companyIdstr = append(companyIdstr, strconv.Itoa(v))
+	}
+	sqlStr += ` AND s.company_id  IN (` + strings.Join(companyIdstr, ",") + `) `
 	myTotal, errmyTotal := cygx.GetCygxAppointmentCount(activityId, sqlStr)
 	if errmyTotal != nil {
 		br.Msg = "获取失败"
@@ -318,6 +330,13 @@ func (this *ActivitySignupCoAntroller) AppointmentList() {
 				respList.List = append(respList.List, v)
 			}
 		}
+		if adminInfo.RoleTypeCode == "rai_group" {
+			//组长查看本组所有组员
+			memberType = "GroupLeader"
+		} else {
+			//组员查看自己
+			memberType = "Sale"
+		}
 	} else {
 		respList.List = list
 	}
@@ -739,6 +758,13 @@ func (this *ActivitySignupCoAntroller) SalonFailSignupList() {
 				respList.List = append(respList.List, v)
 			}
 		}
+		if adminInfo.RoleTypeCode == "rai_group" {
+			//组长查看本组所有组员
+			memberType = "GroupLeader"
+		} else {
+			//组员查看自己
+			memberType = "Sale"
+		}
 	} else {
 		respList.List = list
 	}
@@ -1034,6 +1060,13 @@ func (this *ActivitySignupCoAntroller) FailSignupList() {
 				respList.List = append(respList.List, v)
 			}
 		}
+		if adminInfo.RoleTypeCode == "rai_group" {
+			//组长查看本组所有组员
+			memberType = "GroupLeader"
+		} else {
+			//组员查看自己
+			memberType = "Sale"
+		}
 	} else {
 		respList.List = listNew
 	}
@@ -2468,6 +2501,14 @@ func (this *ActivitySignupCoAntroller) SummaryList() {
 				companyIdstr = append(companyIdstr, strconv.Itoa(v))
 			}
 			sqlStr += ` AND s.company_id IN (` + strings.Join(companyIdstr, ",") + `) `
+
+			if adminInfo.RoleTypeCode == "rai_group" {
+				//组长查看本组所有组员
+				memberType = "GroupLeader"
+			} else {
+				//组员查看自己
+				memberType = "Sale"
+			}
 		}
 	}
 	list, err := cygx.GetCygxAppointmentSummaryList(activityId, sqlStr)
@@ -2758,6 +2799,14 @@ func (this *ActivitySignupCoAntroller) ReminderList() {
 			companyIdstr = append(companyIdstr, strconv.Itoa(v))
 		}
 		sqlStr += ` AND s.company_id IN (` + strings.Join(companyIdstr, ",") + `) `
+
+		if adminInfo.RoleTypeCode == "rai_group" {
+			//组长查看本组所有组员
+			memberType = "GroupLeader"
+		} else {
+			//组员查看自己
+			memberType = "Sale"
+		}
 	}
 
 	list, err := cygx.GetCygxActivityMeetingReminderList(activityId, sqlStr)

+ 14 - 14
controllers/cygx/activity_special.go

@@ -155,20 +155,20 @@ func (this *ActivitySpecialCoAntroller) PreserveAndPublish() {
 		industrialActivityItems = make([]*cygx.CygxIndustrialActivityGroupManagement, 0)
 		subjectActivityItems = make([]*cygx.CygxIndustrialActivityGroupSubject, 0)
 	}
-	List := []*cygx.ChartPermissionRepMore{{PermissionName: "医药"}, {PermissionName: "消费"}, {PermissionName: "科技"}, {PermissionName: "智造"}, {PermissionName: "研选"}}
-	var haveCheck bool
-	for _, v := range List {
-		if permissionName == v.PermissionName {
-			haveCheck = true
-		}
-	}
-	if !haveCheck {
-		br.Msg = "行业名称:" + permissionName + "不存在"
-		return
-	}
-	if strings.Contains(permissionName, "研选") {
-		permissionName = utils.CHART_PERMISSION_NAME_MF_YANXUAN
-	}
+	//List := []*cygx.ChartPermissionRepMore{{PermissionName: "医药"}, {PermissionName: "消费"}, {PermissionName: "科技"}, {PermissionName: "智造"}, {PermissionName: "研选"}}
+	//var haveCheck bool
+	//for _, v := range List {
+	//	if permissionName == v.PermissionName {
+	//		haveCheck = true
+	//	}
+	//}
+	//if !haveCheck {
+	//	br.Msg = "行业名称:" + permissionName + "不存在"
+	//	return
+	//}
+	//if strings.Contains(permissionName, "研选") {
+	//	permissionName = utils.CHART_PERMISSION_NAME_MF_YANXUAN
+	//}
 	charInfo, errCategory := cygx.GetCategoryInfoByName(permissionName)
 	if errCategory != nil {
 		br.Msg = "请选择所属行业"

+ 324 - 18
controllers/cygx/activity_video.go

@@ -192,6 +192,10 @@ func (this *ActivityVideoCoAntroller) VideoDeatil() {
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
 		return
 	}
+
+	for _, v := range list {
+		v.RegisterPlatform = utils.CYGX_REGISTER_PLATFORM_MAP[v.RegisterPlatform]
+	}
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
@@ -349,6 +353,7 @@ func (this *ActivityVideoCoAntroller) CommentList() {
 // @Description 获取音视频上传之后的封面图
 // @Param   ActivityId   query   int  true       "活动ID"
 // @Param   FileType   query   int  true       "音视频文件类型 。1:音频。2:视频"
+// @Param   ChartPermissionId     query   int  true       "行业ID"
 // @Success 200 {object} cygx.ChartPermissionRepMoreList
 // @router /activityVideo/video_and_voice/img [get]
 func (this *ActivityVideoCoAntroller) VideoAndVoice() {
@@ -364,19 +369,6 @@ func (this *ActivityVideoCoAntroller) VideoAndVoice() {
 		br.Ret = 408
 		return
 	}
-	activityId, _ := this.GetInt("ActivityId")
-	fileType, _ := this.GetInt("FileType")
-	if activityId < 1 {
-		br.Msg = "请输入活动ID"
-		return
-	}
-	activityInfo, err := cygx.GetAddActivityInfoById(activityId)
-	if err != nil {
-		br.Msg = "活动不存在"
-		br.ErrMsg = "活动ID错误,Err:" + err.Error() + "activityId:" + strconv.Itoa(activityId)
-		return
-	}
-	//key := utils.MicroRoadshowDefaultImgKey
 	conf, err := cygx.GetCygxConfigDetailByCode("activity_video_default_img")
 	if err != nil {
 		br.Msg = "获取微路演默认图配置失败" + err.Error()
@@ -388,21 +380,335 @@ func (this *ActivityVideoCoAntroller) VideoAndVoice() {
 		return
 	}
 	resp := new(cygx.ActivityVideoDefaultImgListResp)
-	if fileType == 1 {
+	chartPermissionId, _ := this.GetInt("ChartPermissionId")
+	activityId, _ := this.GetInt("ActivityId")
+	fileType, _ := this.GetInt("FileType")
+
+	if chartPermissionId > 0 {
 		for _, v := range list.Audio {
-			if v.ChartPermissionId == activityInfo.ChartPermissionId {
+			if v.ChartPermissionId == chartPermissionId {
 				resp.List = v.List
 			}
 		}
 	} else {
-		for _, v := range list.Video {
-			if v.ChartPermissionId == activityInfo.ChartPermissionId {
-				resp.List = v.List
+		if activityId < 1 {
+			br.Msg = "请输入活动ID"
+			return
+		}
+		activityInfo, err := cygx.GetAddActivityInfoById(activityId)
+		if err != nil {
+			br.Msg = "活动不存在"
+			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
+				}
+			}
+		} else {
+			for _, v := range list.Video {
+				if v.ChartPermissionId == activityInfo.ChartPermissionId {
+					resp.List = v.List
+				}
+			}
+		}
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 路演反馈、调研反馈列表
+// @Description 路演反馈、调研反馈列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   ChartPermissionId   query   string  false     "行业id"
+// @Param   ActivityTypeId   query   string  false     "活动类型id"
+// @Param   StartDate   query   string  false       "开始时间 ,列如2021-03-06 "
+// @Param   EndDate   query   string  false       "结束时间,列如2021-03-06 "
+// @Param   KeyWord   query   string  false       "搜索关键词"
+// @Param   SortType          query   string    false		"排序顺序:asc、desc"
+// @Param   SearchType          query   int    false		"类型 1 路演回放 ,2:调研反馈"
+// @Success 200 {object} cygx.CygxActivityVideoListRep
+// @router /activity_voice_and_video/list [get]
+func (this *ActivityVideoCoAntroller) ActivityVoiceAndVideoList() {
+	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"
+		return
+	}
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	chartPermissionId, _ := this.GetInt("ChartPermissionId")
+	ActivityTypeId, _ := this.GetInt("ActivityTypeId")
+	searchType, _ := this.GetInt("SearchType", 1)
+	startDate := this.GetString("StartDate")
+	endDate := this.GetString("EndDate")
+	keyWord := this.GetString("KeyWord")
+	sortType := this.GetString("SortType")
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+	var condition string
+	var conditionVideo string
+	var conditionVoice string
+	var pars []interface{}
+	if keyWord != "" {
+		conditionVideo += ` AND (v.video_name LIKE '%` + keyWord + `%' )  `
+		conditionVoice += ` AND (v.voice_name LIKE '%` + keyWord + `%' )  `
+	}
+	//行业名称
+	if chartPermissionId > 0 {
+		condition += ` AND art.chart_permission_id  = ?  `
+		pars = append(pars, chartPermissionId)
+	}
+
+	if startDate != "" {
+		condition += ` AND art.activity_time >= ` + "'" + startDate + " 00:00:00'"
+	}
+	if endDate != "" {
+		condition += ` AND art.activity_time <= ` + "'" + endDate + " 23:59:59'"
+	}
+	if ActivityTypeId > 0 {
+		condition += ` AND art.activity_type_id  = ?  `
+		pars = append(pars, ActivityTypeId)
+	}
+	//类型 1 路演反馈 ,2:调研反馈
+	if searchType == 1 {
+		condition += ` AND v.file_type = 1 `
+	} else if searchType == 2 {
+		condition += ` AND v.file_type = 2   `
+	}
+
+	var conditionOrder string
+	if sortType == "asc" || sortType == "desc" {
+		conditionOrder += ` ORDER BY video_counts   ` + sortType
+	} else {
+		conditionOrder += ` 	ORDER BY activity_time DESC  `
+	}
+
+	list, total, err := cygx.GetActivityVoiceAndVideoList(condition, conditionVoice, conditionVideo, conditionOrder, pars, startSize, pageSize)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	var activityIds string
+	for k, v := range list {
+		if v.ChartPermissionNames != "" {
+			list[k].ChartPermissionName = v.ChartPermissionNames
+		}
+		activityIds += strconv.Itoa(v.ActivityId) + ","
+	}
+	activityIds = strings.TrimRight(activityIds, ",")
+	mapIndustrial := make(map[int]string)
+	mapSubject := make(map[string]string)
+	if activityIds != "" {
+		industrialList, err := cygx.GetIndustrialActivityGroupListByactivityIds(activityIds)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetIndustrialActivityGroupListByactivityIds Err:" + err.Error()
+			return
+		}
+		subjectList, err := cygx.GetSubjectActivityGroupListByactivityIds(activityIds)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetSubjectActivityGroupListByactivityIds Err:" + err.Error()
+			return
+		}
+		//合并活动对应的多个标的
+		for _, v := range subjectList {
+			mapSubject[fmt.Sprint(v.ActivityId, "_", v.IndustrialManagementId)] += v.SubjectName + "/"
+		}
+		//活动对应的产业
+		for _, v := range industrialList {
+			var labelSubject string
+			labelSubject = mapSubject[fmt.Sprint(v.ActivityId, "_", v.IndustrialManagementId)]
+			if labelSubject != "" {
+				mapIndustrial[v.ActivityId] += v.IndustryName + "--" + strings.TrimRight(labelSubject, "/") + ","
+			} else {
+				mapIndustrial[v.ActivityId] += v.IndustryName + ","
+			}
+		}
+
+		//处理音视文件标识
+		mapVoice := make(map[int]bool)
+		var conditionVoice string
+		var parsVoice []interface{}
+		conditionVoice = " AND activity_id IN (" + activityIds + ")  "
+		listVoice, err := cygx.GetActivityVoiceList(conditionVoice, parsVoice)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取数据失败,Err:" + err.Error()
+			return
+		}
+		if len(listVoice) > 0 {
+			for _, v := range listVoice {
+				mapVoice[v.ActivityId] = true
+			}
+		}
+		for k, v := range list {
+			if mapIndustrial[v.ActivityId] != "" && v.TemporaryLabel == "" {
+				list[k].Label = strings.TrimRight(mapIndustrial[v.ActivityId], ",")
+			}
+			if mapVoice[v.ActivityId] {
+				v.FileName = "音频"
+			} else {
+				v.FileName = "视频"
 			}
 		}
+		if len(list) == 0 {
+			list = make([]*cygx.CygxActivityVideoListResp, 0)
+		}
 	}
+
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp := new(cygx.CygxActivityVideoListRep)
+	resp.List = list
+	resp.Paging = page
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// @Title 留言列表详情
+// @Description 获取留言列表详情接口
+// @Param   ActivityId   query   int  true     "活动ID"
+// @Param   IsExport   query   bool  false       "是否导出excel,默认是false"
+// @Success 200 {object} cygx.ArticleCommentListResp
+// @router /activity_voice_and_video/commentList [get]
+func (this *ActivityVideoCoAntroller) VoiceAndVideoCommentList() {
+	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"
+		return
+	}
+	activityId, _ := this.GetInt("ActivityId")
+	//是否导出报表
+	isExport, _ := this.GetBool("IsExport")
+	var condition string
+	var pars []interface{}
+
+	videoInfo, _ := cygx.GetCygxActivityVideoReqDetail(activityId)
+	if videoInfo != nil {
+		condition += `  AND activity_id =  ? AND video_id = ?  `
+		pars = append(pars, videoInfo.ActivityId, videoInfo.VideoId)
+	} else {
+		videoInfo, _ := cygx.GetMicroRoadshowVoiceById(activityId)
+		if videoInfo == nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = "音频ID错误"
+			return
+		}
+		condition += `  AND activity_voice_id = ? `
+		pars = append(pars, videoInfo.ActivityVoiceId)
+	}
+	list, err := cygx.GetArticleCommentListSearch(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	resp := new(cygx.ArticleCommentListResp)
+	resp.List = list
+	//导出excel
+	if isExport {
+		VoiceAndVideoCommentListExport(this, resp, br)
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// VoiceAndVideoCommentListExport 导出Excel
+func VoiceAndVideoCommentListExport(this *ActivityVideoCoAntroller, resp *cygx.ArticleCommentListResp, 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()
+	cellA := rowTitle.AddCell()
+	cellA.Value = "姓名"
+	cellB := rowTitle.AddCell()
+	cellB.Value = "公司名称"
+	cellC := rowTitle.AddCell()
+	cellC.Value = "留言"
+	cellD := rowTitle.AddCell()
+	cellD.Value = "提交时间"
+
+	for _, item := range resp.List {
+		row := sheet.AddRow()
+		cellA := row.AddCell()
+		cellA.Value = item.RealName
+		cellB := row.AddCell()
+		cellB.Value = item.CompanyName
+		cellC := row.AddCell()
+		cellC.Value = item.Content
+		cellD := row.AddCell()
+		cellD.Value = item.CreateTime
+	}
+	err = xlsxFile.Save(downLoadnFilePath)
+	if err != nil {
+		br.Msg = "保存文件失败"
+		br.ErrMsg = "保存文件失败"
+		return
+	}
+	downloadFileName := time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
+	this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
+	defer func() {
+		os.Remove(downLoadnFilePath)
+	}()
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "导出成功"
+}

+ 486 - 0
controllers/cygx/askserie_video.go

@@ -0,0 +1,486 @@
+package cygx
+
+import (
+	"encoding/json"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"github.com/tealeg/xlsx"
+	"hongze/hz_crm_api/controllers"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/cygx"
+	cygxService "hongze/hz_crm_api/services/cygx"
+	"hongze/hz_crm_api/services/elastic"
+	"hongze/hz_crm_api/utils"
+	"os"
+	"path/filepath"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// 系列问答视频
+type AskserieVideoController struct {
+	controllers.BaseAuthController
+}
+
+// @Title 新增
+// @Description 新增系列问答接口
+// @Param	request	body cygx.AddProductInteriorReq true "type json string"
+// @Success 200 {object} "保存成功"
+// @router /askserie_video/preserveAndEdit [post]
+func (this *AskserieVideoController) PreserveAndPublish() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req cygx.AddAskserieVideoReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	askserieVideoId := req.AskserieVideoId
+	videoName := req.VideoName
+	videoUrl := req.VideoUrl
+	videoDuration := req.VideoDuration
+	chartPermissionId := req.ChartPermissionId
+	chartPermissionName := req.ChartPermissionName
+	industrialManagementIds := req.IndustrialManagementIds
+	backgroundImg := req.BackgroundImg
+	shareImg := req.ShareImg
+	// 产业ID校验
+	if industrialManagementIds != "" {
+		industrialManagementIdList := strings.Split(industrialManagementIds, ",")
+		for _, v := range industrialManagementIdList {
+			_, err := strconv.Atoi(v)
+			if err != nil {
+				br.Msg = "参数解析异常!"
+				br.ErrMsg = "产业ID不规范,Err:" + err.Error() + industrialManagementIds
+				return
+			}
+		}
+	}
+
+	item := new(cygx.CygxAskserieVideo)
+	item.AskserieVideoId = askserieVideoId
+	item.VideoName = videoName
+	item.VideoUrl = videoUrl
+	item.VideoDuration = videoDuration
+	item.ChartPermissionId = chartPermissionId
+	item.ChartPermissionName = chartPermissionName
+	item.PublishStatus = 1
+	item.BackgroundImg = backgroundImg
+	item.ShareImg = shareImg
+	item.AdminId = sysUser.AdminId
+	item.ModifyDate = time.Now()
+	item.PublishDate = time.Now()
+	item.CreateTime = time.Now()
+
+	if askserieVideoId == 0 {
+		//新增
+		newId, err := cygx.AddCygxAskserieVideo(item, industrialManagementIds)
+		if err != nil {
+			br.Msg = "保存失败"
+			br.ErrMsg = "保存失败,Err:" + err.Error()
+			return
+		}
+		askserieVideoId = int(newId)
+	} else {
+		//更新
+		_, err := cygx.GetCygxAskserieVideoDetail(askserieVideoId)
+		if err != nil {
+			br.Msg = "详情不存在"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		err = cygx.UpdateCygxAskserieVideo(item, industrialManagementIds)
+		if err != nil {
+			br.Msg = "保存失败"
+			br.ErrMsg = "保存失败,Err:" + err.Error()
+			return
+		}
+	}
+
+	go cygxService.UpdateAskserieVideoResourceData(askserieVideoId) //写入首页最新  cygx_resource_data 表
+	go elastic.EsAddAskserieVideo(askserieVideoId)                  // 写入es 综合搜索
+	br.Ret = 200
+	br.Success = true
+	br.IsAddLog = true
+	br.Msg = "操作成功"
+}
+
+// @Title 列表
+// @Description 列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   StartDate   query   string  false       "开始时间 ,列如2021-03-06 "
+// @Param   EndDate   query   string  false       "结束时间,列如2021-03-06 "
+// @Param   PublishStatus   query   int  true       "发布状态: -1-默认全部; 0-未发布; 1-已关注"
+// @Param   ChartPermissionId   query   string  false       "行业Id"
+// @Param   KeyWord   query   string  false       "搜索关键词"
+// @Param   SortType          query   string    false		"排序顺序:asc、desc"
+// @Success Ret=200 {object} cygx.GetCygxTacticsTimeLineResp
+// @router /askserie_video/list [get]
+func (this *AskserieVideoController) List() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	resp := new(cygx.GetCygxAskserieVideoRespListResp)
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	publishStatus, _ := this.GetInt("PublishStatus", -1)
+	startDate := this.GetString("StartDate")
+	endDate := this.GetString("EndDate")
+	chartPermissionId, _ := this.GetInt("ChartPermissionId")
+	keyWord := this.GetString("KeyWord")
+	keyWord = strings.Trim(keyWord, " ")
+	keyWord = strings.Replace(keyWord, "'", "", -1)
+	sortType := this.GetString("SortType")
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+	var condition string
+	var pars []interface{}
+	//发布状态查询
+	if publishStatus == 0 || publishStatus == 1 || publishStatus == 3 {
+		condition += ` AND art.publish_status = ? `
+		pars = append(pars, publishStatus)
+	}
+	//起始日期查询
+	if startDate != "" && endDate != "" {
+		condition += ` 	AND art.publish_date  BETWEEN ?   AND  ? `
+		pars = append(pars, startDate+" 00:00:00", endDate+" 23:59:59")
+	}
+	//行业查询
+	if chartPermissionId > 0 {
+		condition += ` 	AND art.chart_permission_id = ?`
+		pars = append(pars, chartPermissionId)
+	}
+	if keyWord != "" {
+		condition += ` AND ( video_name LIKE '%` + keyWord + `%' ) `
+	}
+	total, err := cygx.GetCygxAskserieVideoCount(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	var conditionOrder string
+	if sortType == "asc" || sortType == "desc" {
+		conditionOrder += ` ORDER BY art.video_counts   ` + sortType
+	} else {
+		conditionOrder += ` 	ORDER BY art.modify_date DESC  `
+	}
+	//condition += "	ORDER BY art.modify_date DESC  "
+	condition += conditionOrder
+	list, err := cygx.GetCygxAskserieVideoList(condition, pars, startSize, pageSize)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	var askserieVideoIds []int
+	for _, v := range list {
+		askserieVideoIds = append(askserieVideoIds, v.AskserieVideoId)
+	}
+
+	mapLabel := cygxService.GetCygxAskserieVideoLabelMap(askserieVideoIds) // 标签
+	for _, v := range list {
+		v.IndustryName = mapLabel[v.AskserieVideoId]
+	}
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp.List = list
+	resp.Paging = page
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title  详情
+// @Description 获取详情接口
+// @Param   AskserieVideoId   query   int  true       "ID"
+// @Success Ret=200 {object} cygx.GetCygxProductInteriorDetailResp
+// @router /askserie_video/detail [get]
+func (this *AskserieVideoController) Detail() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	AdminUser := this.SysUser
+	if AdminUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	resp := new(cygx.GetCygxAskserieVideoDetailResp)
+	askserieVideoId, _ := this.GetInt("AskserieVideoId")
+	if askserieVideoId < 1 {
+		br.Msg = "请输入详情ID"
+		return
+	}
+	detail, err := cygx.GetCygxAskserieVideoDetail(askserieVideoId)
+	if err != nil {
+		br.Msg = "详情不存在"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	//产业标签
+	industrialListMap := cygxService.GetCygxAskserieVideoLabelListMap([]int{askserieVideoId})
+	detail.ListIndustrial = industrialListMap[askserieVideoId]
+	resp.Detail = detail
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title  播放记录详情
+// @Description 播放记录详情接口
+// @Param   AskserieVideoId   query   int  true       "ID"
+// @Success Ret=200 {object} cygx.GetCygxProductInteriorDetailResp
+// @router /askserie_video/history_list [get]
+func (this *AskserieVideoController) HistoryList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	AdminUser := this.SysUser
+	if AdminUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	resp := new(cygx.CygxCygxAskserieVideoHistoryRecordListResp)
+	askserieVideoId, _ := this.GetInt("AskserieVideoId")
+	if askserieVideoId < 1 {
+		br.Msg = "请输入详情ID"
+		return
+	}
+	_, err := cygx.GetCygxAskserieVideoDetail(askserieVideoId)
+	if err != nil {
+		br.Msg = "详情不存在"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	var condition string
+	var pars []interface{}
+	condition = ` AND askserie_video_id = ?  ORDER BY id DESC  `
+	pars = append(pars, askserieVideoId)
+	list, err := cygx.GetCygxAskserieVideoHistoryRecordList(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+
+	for _, v := range list {
+		v.PlaySeconds = v.VideoDuration
+		v.RegisterPlatform = utils.CYGX_REGISTER_PLATFORM_MAP[v.RegisterPlatform]
+	}
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title  留言记录详情
+// @Description 留言记录详情接口
+// @Param   AskserieVideoId   query   int  true       "ID"
+// @Param   IsExport   query   bool  false       "是否导出excel,默认是false"
+// @Success Ret=200 {object} cygx.GetCygxProductInteriorDetailResp
+// @router /askserie_video/collection_list [get]
+func (this *AskserieVideoController) CollectionList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	AdminUser := this.SysUser
+	if AdminUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	resp := new(cygx.CygxAskserieVideoCollectionListResp)
+	askserieVideoId, _ := this.GetInt("AskserieVideoId")
+	if askserieVideoId < 1 {
+		br.Msg = "请输入详情ID"
+		return
+	}
+	//是否导出报表
+	isExport, _ := this.GetBool("IsExport")
+	_, err := cygx.GetCygxAskserieVideoDetail(askserieVideoId)
+	if err != nil {
+		br.Msg = "详情不存在"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	var condition string
+	var pars []interface{}
+	condition = ` AND askserie_video_id = ?  ORDER BY id DESC  `
+	pars = append(pars, askserieVideoId)
+	list, err := cygx.GetCygxAskserieVideoCollectionList(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	for _, v := range list {
+		v.RegisterPlatform = utils.CYGX_REGISTER_PLATFORM_MAP[v.RegisterPlatform]
+	}
+	resp.List = list
+	//导出excel
+	if isExport {
+		CollectionListExport(this, resp, br)
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// VoiceAndVideoCommentListExport 导出Excel
+func CollectionListExport(this *AskserieVideoController, resp *cygx.CygxAskserieVideoCollectionListResp, 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()
+	cellA := rowTitle.AddCell()
+	cellA.Value = "姓名"
+	cellB := rowTitle.AddCell()
+	cellB.Value = "公司名称"
+	cellC := rowTitle.AddCell()
+	cellC.Value = "留言"
+	cellD := rowTitle.AddCell()
+	cellD.Value = "提交时间"
+
+	for _, item := range resp.List {
+		row := sheet.AddRow()
+		cellA := row.AddCell()
+		cellA.Value = item.RealName
+		cellB := row.AddCell()
+		cellB.Value = item.CompanyName
+		cellC := row.AddCell()
+		cellC.Value = item.Content
+		cellD := row.AddCell()
+		cellD.Value = item.CreateTime
+	}
+	err = xlsxFile.Save(downLoadnFilePath)
+	if err != nil {
+		br.Msg = "保存文件失败"
+		br.ErrMsg = "保存文件失败"
+		return
+	}
+	downloadFileName := time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
+	this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
+	defer func() {
+		os.Remove(downLoadnFilePath)
+	}()
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "导出成功"
+}
+
+// @Title 发布/取消发布
+// @Description 发布/取消发布接口
+// @Param	request	body cygx.ProductInteriorIdReq true "type json string"
+// @Success 200 Ret=200 发布成功
+// @router /askserie_video/publishAndcancel [post]
+func (this *AskserieVideoController) PublishReport() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req cygx.AskserieVideoIdIdReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	askserieVideoId := req.AskserieVideoId
+	if askserieVideoId == 0 {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误,id不可为空"
+		return
+	}
+	detail, err := cygx.GetCygxAskserieVideoDetail(askserieVideoId)
+	if err != nil {
+		br.Msg = "详情不存在"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	var status int
+	if detail.PublishStatus != 1 {
+		status = 1
+	} else {
+		status = 3
+	}
+	err = cygx.EditCygxAskserieVideoStatus(status, askserieVideoId)
+	if err != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	go cygxService.UpdateAskserieVideoResourceData(askserieVideoId) //写入首页最新  cygx_resource_data 表
+	go elastic.EsAddAskserieVideo(askserieVideoId)                  // 写入es 综合搜索
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 9 - 6
controllers/cygx/contract_allocation.go

@@ -507,7 +507,7 @@ func (this *ContractAllocationController) CompanyContracDetail() {
 	}
 
 	//var contractPermissionList []*company.ContractPermissionList
-	expMap := map[int]string{0: "(3w)", 1: "(5w)"} // 买方研选价格
+	expMap := map[int]string{0: "(3w)", 1: "(5w)", 2: "(10w)"} // 买方研选价格
 	hasPermissions, e := company.GetCompanyContractPermissionByCompanyContractId(companyContractId)
 	if e != nil {
 		br.Msg = "获取失败"
@@ -534,7 +534,7 @@ func (this *ContractAllocationController) CompanyContracDetail() {
 		}
 
 		mapPermissionNameHave[n.PermissionName] = true
-		// 买方研选(3w/5w)
+		// 买方研选(3w/5w/10w)
 		if n.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN {
 			expensiveYx = match.ExpensiveYx
 			n.PermissionName += expMap[match.ExpensiveYx]
@@ -549,9 +549,10 @@ func (this *ContractAllocationController) CompanyContracDetail() {
 		var moneyYx float64
 		if expensiveYx == 0 {
 			moneyYx = 3
-		}
-		if expensiveYx == 1 {
+		} else if expensiveYx == 1 {
 			moneyYx = 5
+		} else if expensiveYx == 2 {
+			moneyYx = 10
 		}
 		resp.TotalPointsContent = fmt.Sprint(resp.Money, "W,", "其中", moneyYx, "w默认归属买方研选,请对剩余", resp.Money-moneyYx, "w按照100%进行比值分配")
 		if showDetail {
@@ -733,10 +734,12 @@ func (this *ContractAllocationController) CompanyContracUpdate() {
 			continue
 		}
 
-		// 买方研选(3w/5w)
+		// 买方研选(3w/5w/10W)
 		if n.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN {
 			if match.ExpensiveYx == 1 {
 				money = money - 5
+			} else if match.ExpensiveYx == 2 {
+				money = money - 10
 			} else {
 				money = money - 3
 			}
@@ -991,7 +994,7 @@ func (this *ContractAllocationController) CompanyContractStatistics() {
 		item := new(cygx.AllocationRealNameStatisticsListResp)
 		item.RealName = "合计"
 		item.TotalRelatedContract = mapPermissionAllocation[k]
-		item.TotalDispatchPoint = fmt.Sprint(utils.SubFloatToString(mapPermissionMoney[k], 2), "/", mapPermissionMoneyAvg[k])
+		item.TotalDispatchPoint = fmt.Sprint(utils.SubFloatToString(mapPermissionMoney[k], 2), "/", utils.SubFloatToString(mapPermissionMoneyAvg[k], 2))
 		item.GroupProportion = "100%"
 
 		//部门占比

+ 32 - 8
controllers/cygx/micro_roadshow.go

@@ -80,12 +80,12 @@ func (this *MicroRoadshowController) List() {
 
 	if startDate != "" {
 		condition += ` AND publish_date>=? `
-		pars = append(pars, startDate)
+		pars = append(pars, startDate+" 00:00:00")
 	}
 
 	if endDate != "" {
 		condition += ` AND publish_date<=? `
-		pars = append(pars, endDate)
+		pars = append(pars, endDate+" 23:59:59")
 	}
 
 	if chartPermissionId > 0 {
@@ -223,6 +223,13 @@ func (this *MicroRoadshowController) Add() {
 		return
 	}
 
+	charInfo, errCategory := cygx.GetCategoryInfoById(nameItem.PermissionId)
+	if errCategory != nil {
+		br.Msg = "获取品种信息失败"
+		br.ErrMsg = "获取品种信息失败,Err:" + errCategory.Error()
+		return
+	}
+	nameItem.PermissionName = charInfo.PermissionName
 	publishDate, err := time.Parse(utils.FormatDate, req.PublishDate)
 	if err != nil {
 		br.Msg = "时间格式转换失败"
@@ -276,8 +283,9 @@ func (this *MicroRoadshowController) Add() {
 			go cygxService.SendWxMsgWithCygxMicroRoadshowVideo(req.VideoId)
 		}
 
-		go cygxService.UpdateResourceData(req.VideoId, "roadshow", "update", publishDate.Format(utils.FormatDateTime))
-		go elastic.AddComprehensiveRoadshow(req.VideoId) //Es添加微路演
+		//go cygxService.UpdateResourceData(req.VideoId, "roadshow", "update", publishDate.Format(utils.FormatDateTime))
+		go cygxService.UpdateMicroRoadshowResourceData(req.VideoId) //写入首页最新  cygx_resource_data 表
+		go elastic.AddComprehensiveRoadshow(req.VideoId)            //Es添加微路演
 		br.Ret = 200
 		br.Success = true
 		br.Msg = "编辑成功"
@@ -320,8 +328,9 @@ func (this *MicroRoadshowController) Add() {
 
 		if req.PublishOrSave == 1 {
 			go cygxService.SendWxMsgWithCygxMicroRoadshowVideo(int(newId))
-			go cygxService.UpdateResourceData(int(newId), "roadshow", "add", publishDate.Format(utils.FormatDateTime))
-			go elastic.AddComprehensiveRoadshow(req.VideoId) //Es添加微路演
+			//go cygxService.UpdateResourceData(int(newId), "roadshow", "add", publishDate.Format(utils.FormatDateTime))
+			go cygxService.UpdateMicroRoadshowResourceData(int(newId)) //写入首页最新  cygx_resource_data 表
+			go elastic.AddComprehensiveRoadshow(req.VideoId)           //Es添加微路演
 		}
 
 		br.Ret = 200
@@ -441,10 +450,12 @@ func (this *MicroRoadshowController) PublishCancel() {
 	br.Success = true
 	if publishOrCancle == 0 {
 		br.Msg = "取消发布成功"
-		go cygxService.UpdateResourceData(int(videoId), "roadshow", "delete", time.Now().Format(utils.FormatDateTime))
+		//go cygxService.UpdateResourceData(int(videoId), "roadshow", "delete", time.Now().Format(utils.FormatDateTime))
+		go cygxService.UpdateMicroRoadshowResourceData(int(videoId)) //写入首页最新  cygx_resource_data 表
 	} else {
 		go cygxService.SendWxMsgWithCygxMicroRoadshowVideo(videoId)
-		go cygxService.UpdateResourceData(int(videoId), "roadshow", "add", videoInfo.PublishDate.Format(utils.FormatDateTime))
+		//go cygxService.UpdateResourceData(int(videoId), "roadshow", "add", videoInfo.PublishDate.Format(utils.FormatDateTime))
+		go cygxService.UpdateMicroRoadshowResourceData(int(videoId)) //写入首页最新  cygx_resource_data 表
 		br.Msg = "发布成功"
 	}
 	go elastic.AddComprehensiveRoadshow(videoId) //Es添加微路演
@@ -507,6 +518,10 @@ func (this *MicroRoadshowController) Deatil() {
 		br.ErrMsg = "获取历史详情失败,Err:" + err.Error()
 		return
 	}
+
+	for _, v := range list {
+		v.RegisterPlatform = utils.CYGX_REGISTER_PLATFORM_MAP[v.RegisterPlatform]
+	}
 	//resp := new(cygx.MicroRoadshowVideoHistoryListResp)
 	//page := paging.GetPaging(currentIndex, pageSize, total)
 	//resp.List = list
@@ -679,6 +694,12 @@ func (this *MicroRoadshowController) VoiceDeatil() {
 		return
 	}
 	voiceId, _ := this.GetInt("VoiceId")
+	videoId, _ := this.GetInt("VideoId")
+
+	//参数ID做兼容
+	if voiceId == 0 {
+		voiceId = videoId
+	}
 
 	if voiceId <= 0 {
 		br.Msg = "参数错误"
@@ -698,6 +719,9 @@ func (this *MicroRoadshowController) VoiceDeatil() {
 		return
 	}
 
+	for _, v := range list {
+		v.RegisterPlatform = utils.CYGX_REGISTER_PLATFORM_MAP[v.RegisterPlatform]
+	}
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"

+ 159 - 2
controllers/cygx/morning_meeting_review.go

@@ -5,13 +5,17 @@ import (
 	"errors"
 	"fmt"
 	"github.com/rdlucklib/rdluck_tools/paging"
+	"github.com/tealeg/xlsx"
 	"hongze/hz_crm_api/controllers"
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/models/system"
 	"hongze/hz_crm_api/services"
 	cygxService "hongze/hz_crm_api/services/cygx"
 	"hongze/hz_crm_api/services/elastic"
 	"hongze/hz_crm_api/utils"
+	"os"
+	"path/filepath"
 	"strconv"
 	"strings"
 	"time"
@@ -86,7 +90,7 @@ func (this *MorningMeetingController) List() {
 		return
 	}
 
-	condition += ` ORDER BY meeting_time DESC  `
+	condition += ` ORDER BY publish_time DESC  `
 	resp := new(cygx.CygxMorningMeetingReviewsList)
 	list, err := cygx.GetCygxMorningMeetingReviewsList(condition, pars, startSize, pageSize)
 	if err != nil {
@@ -95,6 +99,7 @@ func (this *MorningMeetingController) List() {
 		return
 	}
 
+	var meetingIds []int
 	for _, item := range list {
 		respItem := cygx.CygxMorningMeetingReviewItem{
 			Id:            item.Id,
@@ -108,9 +113,15 @@ func (this *MorningMeetingController) List() {
 		if item.Status == 1 {
 			respItem.PublishTime = item.PublishTime.Local().Format(utils.FormatDateTime)
 		}
-
+		meetingIds = append(meetingIds, item.Id)
 		resp.List = append(resp.List, &respItem)
 	}
+	//PvUv 数量
+	mapPv, mapUv := cygxService.GetCygxMorningMeetingReviewChapterHistoryPvUvMap(meetingIds)
+	for _, v := range resp.List {
+		v.Pv = mapPv[v.Id]
+		v.Uv = mapUv[v.Id]
+	}
 
 	page := paging.GetPaging(currentIndex, pageSize, total)
 	resp.Paging = page
@@ -690,3 +701,149 @@ func (this *MorningMeetingController) Delete() {
 	br.Success = true
 	br.Msg = "删除成功"
 }
+
+// @Title  下载PV
+// @Description 下载PV接口
+// @Param   MeetingId   query   int  true       "晨会点评id"
+// @Param   IsExport   query   bool  false       "是否导出excel,默认是false"
+// @router /morningMeeting/list_pv [get]
+func (this *MorningMeetingController) ListPv() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	AdminUser := this.SysUser
+	if AdminUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	meetingId, _ := this.GetInt("MeetingId")
+	if meetingId < 1 {
+		br.Msg = "请输入晨会ID"
+		return
+	}
+	//是否导出报表
+	isExport, _ := this.GetBool("IsExport")
+	var condition string
+	var pars []interface{}
+	condition = ` AND meeting_id = ?  ORDER BY id DESC  `
+	pars = append(pars, meetingId)
+	var respList []*cygx.CygxMorningMeetingReviewChapterHistoryResp
+
+	list, err := cygx.GetCygxMorningMeetingReviewChapterHistoryList(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	//超级管理员和权益管理员、权益研究员可以下载所有客户,销售组长能下载本组客户,销售只能下载本人名下客户
+	var isCanDownload bool
+	adminInfo, errAdmin := system.GetSysUserById(AdminUser.AdminId)
+	if errAdmin != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + errAdmin.Error()
+		return
+	}
+	if adminInfo.Role == "admin" || adminInfo.Role == "researcher" {
+		isCanDownload = true
+	}
+	//销售查看自己客户,销售组长查看组员
+	if isCanDownload == false {
+		mapMobile, err := cygxService.GetAdminLookUserMobile(adminInfo)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,销售对应权限,Err:" + err.Error()
+			return
+		}
+		for _, v := range list {
+			if _, ok := mapMobile[v.Mobile]; ok {
+				respList = append(respList, v)
+			}
+		}
+	} else {
+		respList = list
+	}
+	resp := cygx.CygxMorningMeetingReviewChapterHistoryResptListResp{
+		List: list,
+	}
+	//导出excel
+	if isExport {
+		MorningMeetingHistoryListExport(this, resp, br)
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+
+}
+
+// MorningMeetingHistoryListExport 导出Excel
+func MorningMeetingHistoryListExport(this *MorningMeetingController, resp cygx.CygxMorningMeetingReviewChapterHistoryResptListResp, 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()
+	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 = "阅读时间"
+
+	for _, item := range resp.List {
+		row := sheet.AddRow()
+		cellA := row.AddCell()
+		cellA.Value = item.RealName
+		cellB := row.AddCell()
+		cellB.Value = item.Mobile
+		cellC := row.AddCell()
+		cellC.Value = item.CompanyName
+		cellD := row.AddCell()
+		cellD.Value = item.SellerName
+		cellE := row.AddCell()
+		cellE.Value = item.CreateTime
+	}
+	err = xlsxFile.Save(downLoadnFilePath)
+	if err != nil {
+		br.Msg = "保存文件失败"
+		br.ErrMsg = "保存文件失败"
+		return
+	}
+	downloadFileName := time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
+	this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
+	defer func() {
+		os.Remove(downLoadnFilePath)
+	}()
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "导出成功"
+}

+ 327 - 0
controllers/cygx/questionnaire.go

@@ -0,0 +1,327 @@
+package cygx
+
+import (
+	"encoding/json"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"hongze/hz_crm_api/controllers"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/cygx"
+	cygxService "hongze/hz_crm_api/services/cygx"
+	"hongze/hz_crm_api/utils"
+	"time"
+)
+
+// 问卷调查
+type QuestionnaireController struct {
+	controllers.BaseAuthController
+}
+
+// @Title 新增、修改问卷内容
+// @Description  新增、修改问卷内容接口
+// @Param	request	body cygx.AddCygxQuestionnaireReq true "type json string"
+// @Success 200 {object} "保存成功"
+// @router /questionnaire/preserveAndEdit [post]
+func (this *QuestionnaireController) PreserveAndPublish() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var req cygx.AddCygxQuestionnaireReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	endTime := utils.StrDateToDate(req.EndTime) //时间字符串格式转时间格式
+	questionnaireId := req.QuestionnaireId
+	activityTypeId := req.ActivityTypeId
+	content := req.Content
+	maxChooseTotal := req.MaxChooseTotal
+	listTheme := req.ListTheme
+
+	activityTypeInfo, errType := cygx.GetActivityTypeDetailById(activityTypeId)
+	if errType != nil {
+		br.Msg = "请选择活动类型"
+		br.ErrMsg = "获取活动类型信息失败,Err:" + errType.Error()
+		return
+	}
+	item := new(cygx.CygxQuestionnaire)
+	item.QuestionnaireId = req.QuestionnaireId
+	item.ActivityTypeId = activityTypeId
+	item.ActivityTypeName = activityTypeInfo.ActivityTypeName
+	item.Content = content
+	item.EndTime = endTime
+	item.PublishTime = time.Now()
+	item.CreateTime = time.Now()
+	item.ModifyTime = time.Now()
+	item.AdminId = sysUser.AdminId
+	item.MaxChooseTotal = maxChooseTotal
+
+	if questionnaireId == 0 {
+		newId, err := cygx.AddCygxQuestionnaire(item, listTheme)
+		if err != nil {
+			br.Msg = "保存失败"
+			br.ErrMsg = "保存失败,Err:" + err.Error()
+			return
+		}
+		//投票发布时,给所有开通买方研选正式试用的客户,推送模板消息
+		go cygxService.SendWxMsgCygxQuestionnaire(int(newId))
+
+	} else {
+		err = cygx.EditCygxQuestionnaire(item, listTheme)
+		if err != nil {
+			br.Msg = "保存失败"
+			br.ErrMsg = "保存失败,Err:" + err.Error()
+			return
+		}
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.IsAddLog = true
+	br.Msg = "操作成功"
+}
+
+// @Title 列表
+// @Description 列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Success Ret=200 {object} cygx.GetCygxQuestionnaireResp
+// @router /questionnaire/list [get]
+func (this *QuestionnaireController) List() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	resp := new(cygx.GetCygxQuestionnaireResp)
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+	var condition string
+	var pars []interface{}
+
+	total, err := cygx.GetCygxQuestionnaireCount(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	condition += "	ORDER BY art.publish_time DESC  "
+	list, err := cygx.GetCygxQuestionnaireList(condition, pars, startSize, pageSize)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	for _, v := range list {
+		endTime := utils.StrTimeToTime(v.EndTime + " 23:59:59") //时间字符串格式转时间格式
+		if endTime.Before(time.Now()) {
+			v.State = "已截止"
+		} else {
+			v.State = "发布中"
+		}
+	}
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp.List = list
+	resp.Paging = page
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 详情
+// @Description 详情接口
+// @Param   QuestionnaireId   query   int  true       "问卷ID"
+// @Success Ret=200 {object} cygx.GetCygxTacticsTimeLineResp
+// @router /questionnaire/detail [get]
+func (this *QuestionnaireController) Detail() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	resp := new(cygx.GetCygxQuestionnaireDetailResp)
+	questionnaireId, _ := this.GetInt("QuestionnaireId")
+	detail, err := cygx.GetCygxQuestionnaireDetail(questionnaireId)
+	if err != nil {
+		br.Msg = "详情不存在"
+		br.ErrMsg = "获取失败,GetCygxQuestionnaireDetail Err:" + err.Error()
+		return
+	}
+
+	ListTheme, err := cygx.GetCygxQuestionnaireThemeListByQuestionnaireId(questionnaireId)
+	if err != nil {
+		br.Msg = "详情不存在"
+		br.ErrMsg = "获取失败,GetCygxQuestionnaireThemeListByQuestionnaireId Err:" + err.Error()
+		return
+	}
+	detail.ListTheme = ListTheme
+	resp.Detail = detail
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 投票结果
+// @Description 投票结果接口
+// @Param   QuestionnaireId   query   int  true       "问卷ID"
+// @Success Ret=200 {object} cygx.CygxQuestionnaireVoteListResp
+// @router /questionnaire/vote_detail [get]
+func (this *QuestionnaireController) VoteDetail() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	resp := new(cygx.CygxQuestionnaireVoteListResp)
+	questionnaireId, _ := this.GetInt("QuestionnaireId")
+
+	listTheme, err := cygx.GetCygxQuestionnaireThemeListByQuestionnaireId(questionnaireId)
+	if err != nil {
+		br.Msg = "详情不存在"
+		br.ErrMsg = "获取失败,GetCygxQuestionnaireThemeListByQuestionnaireId Err:" + err.Error()
+		return
+	}
+
+	listVote, err := cygx.GetCygxCygxQuestionnaireVoteListByQuestionnaireId(questionnaireId)
+	if err != nil {
+		br.Msg = "详情不存在"
+		br.ErrMsg = "获取失败,GetCygxCygxQuestionnaireVoteListByQuestionnaireId Err:" + err.Error()
+		return
+	}
+	//计算每个主题的投票数量
+	mapVoteTotal := make(map[int]int)
+	for _, v := range listVote {
+		mapVoteTotal[v.QuestionnaireThemeId] += 1
+	}
+
+	for _, v := range listTheme {
+		item := new(cygx.AddCygxQuestionnaireThemeReq)
+		item.QuestionnaireThemeId = v.QuestionnaireThemeId
+		item.ActivityTheme = v.ActivityTheme
+		item.VoteTotal = mapVoteTotal[v.QuestionnaireThemeId]
+		resp.List = append(resp.List, item)
+	}
+	if len(resp.List) == 0 {
+		resp.List = make([]*cygx.AddCygxQuestionnaireThemeReq, 0)
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 票数明细
+// @Description 票数明细接口
+// @Param   QuestionnaireThemeId   query   int  true       "主题问卷ID"
+// @Success Ret=200 {object} cygx.GetCygxTacticsTimeLineResp
+// @router /questionnaire/vote_list [get]
+func (this *QuestionnaireController) VoteList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	resp := new(cygx.CygxCygxQuestionnaireVoteListResp)
+	questionnaireThemeId, _ := this.GetInt("QuestionnaireThemeId")
+	listVote, err := cygx.GetCygxQuestionnaireVoteListByQuestionnaireThemeId(questionnaireThemeId)
+	if err != nil {
+		br.Msg = "详情不存在"
+		br.ErrMsg = "获取失败,GetCygxQuestionnaireVoteListByQuestionnaireThemeId Err:" + err.Error()
+		return
+	}
+	resp.List = listVote
+	if len(resp.List) == 0 {
+		resp.List = make([]*cygx.CygxQuestionnaireVoteResp, 0)
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 其余主题投票结果
+// @Description 其余主题投票结果接口
+// @Param   QuestionnaireId   query   int  true       "问卷ID"
+// @Success Ret=200 {object} cygx.CygxQuestionnaireVoteListResp
+// @router /questionnaire/vote_other [get]
+func (this *QuestionnaireController) VoteOther() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	resp := new(cygx.CygxQuestionnaireVoteOtherThemeListResp)
+	questionnaireId, _ := this.GetInt("QuestionnaireId")
+
+	listOther, err := cygx.GetCygxQuestionnaireVoteOtherThemeListByQuestionnaireId(questionnaireId)
+	if err != nil {
+		br.Msg = "详情不存在"
+		br.ErrMsg = "获取失败,GetCygxCygxQuestionnaireVoteListByQuestionnaireId Err:" + err.Error()
+		return
+	}
+	resp.List = listOther
+	if len(resp.List) == 0 {
+		resp.List = make([]*cygx.CygxQuestionnaireVoteOtherThemeResp, 0)
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 6 - 1
controllers/cygx/report_article.go

@@ -13,6 +13,7 @@ import (
 	"hongze/hz_crm_api/services"
 	cygxService "hongze/hz_crm_api/services/cygx"
 	"hongze/hz_crm_api/utils"
+	"html"
 	"os"
 	"path/filepath"
 	"strconv"
@@ -349,7 +350,6 @@ func (this *ReportArticleController) ReportArticleList() {
 		list[k].ListIndustrial = mapIndustrialList[v.ArticleId]
 		list[k].ListSubject = mapSubjectList[v.ArticleId]
 	}
-	fmt.Println(mapCommment)
 	page := paging.GetPaging(currentIndex, pageSize, total)
 	resp := new(cygx.GetReportArticleListRep)
 	resp.List = list
@@ -1003,6 +1003,11 @@ func (this *ReportArticleController) Detail() {
 			articleInfo.ChartPermissionId, _ = strconv.Atoi(chartPermissionIdArr[0])
 		}
 	}
+
+	if articleId < utils.SummaryArticleId {
+		articleInfo.Abstract, _ = cygx.GetReportContentTextSub(articleInfo.Abstract)
+		articleInfo.Body = html.UnescapeString(articleInfo.Body)
+	}
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"

+ 135 - 2
controllers/cygx/tag_management.go

@@ -12,6 +12,8 @@ import (
 	"hongze/hz_crm_api/utils"
 	"os"
 	"path/filepath"
+	"strconv"
+	"strings"
 	"time"
 )
 
@@ -88,6 +90,7 @@ func (this *TagManagementController) TagList() {
 
 // @Title 获取标签列表-自定义顺序
 // @Description 获取标签列表-自定义顺序接口
+// @Param   SearchType   query   string  false       "搜索类型 1:自定义标签 、 2:固定标签 ,-1查询所有 默认-1"
 // @Success 200 {object} cygx.ChartPermissionResp
 // @router /tag/list/custom [get]
 func (this *TagManagementController) TagCustomizeList() {
@@ -104,8 +107,14 @@ func (this *TagManagementController) TagCustomizeList() {
 		br.Ret = 408
 		return
 	}
-
+	searchType, _ := this.GetInt("SearchType", -1)
 	var condition string
+	if searchType == 1 {
+		condition = " AND  tag_type = 0 "
+	}
+	if searchType == 2 {
+		condition = " AND  tag_type > 0 "
+	}
 	list, err := cygx.GetCygxTagList(condition)
 	if err != nil {
 		br.Msg = "获取标签失败"
@@ -320,6 +329,24 @@ func (this *TagManagementController) TagSave() {
 		br.ErrMsg = "标签名为空"
 		return
 	}
+
+	tagName := req.TagName
+	tagId := req.TagId
+	var condition string
+	var pars []interface{}
+	condition = " AND tag_name = ? AND tag_id != ?  "
+	pars = append(pars, tagName, tagId)
+	total, err := cygx.GetCygxTagListCountByCondition(condition, pars)
+	if err != nil {
+		br.Msg = "编辑标签失败"
+		br.ErrMsg = "获取标签总数失败,Err:" + err.Error()
+		return
+	}
+	if total > 0 {
+		br.Msg = "标签名称已存在"
+		br.ErrMsg = "标签名称已存在,TagName:" + tagName
+		return
+	}
 	if req.TagId > 0 {
 		item := cygx.CygxTag{
 			TagId:         int64(req.TagId),
@@ -330,8 +357,18 @@ func (this *TagManagementController) TagSave() {
 			SubjectNames:  req.SubjectNames,
 			ModifyTime:    time.Now(),
 		}
+		detail, err := cygx.GetCygxTagInfoById(req.TagId)
+		if err != nil {
+			br.Msg = "编辑标签失败!"
+			br.ErrMsg = "编辑标签失败,Err:" + err.Error()
+			return
+		}
 
-		err = item.Update([]string{"TagName","ArticleTypes","ActivityTypes","Industries","SubjectNames","ModifyTime"})
+		if detail.TagType > 0 {
+			br.Msg = "固定标签无法编辑!"
+			return
+		}
+		err = item.Update([]string{"TagName", "ArticleTypes", "ActivityTypes", "Industries", "SubjectNames", "ModifyTime"})
 		if err != nil {
 			br.Msg = "编辑标签失败!"
 			br.ErrMsg = "编辑标签失败,Err:" + err.Error()
@@ -509,3 +546,99 @@ func (this *TagManagementController) PvExport() {
 	br.Msg = "获取成功"
 }
 
+// @Title 热门活动
+// @Description 热门活动接口
+// @Param   KeyWord   query   string  false       "搜索关键词"
+// @Success 200 {object} cygx.GetCygxActivityListRep
+// @router /tag/hot_activity/list [get]
+func (this *TagManagementController) TagHotActivityList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	keyWord := this.GetString("KeyWord")
+	resp := new(cygx.GetCygxActivityListRep)
+	var condition string
+	var pars []interface{}
+	if keyWord == "" {
+		conf, err := cygx.GetCygxConfigDetailByCode(utils.CYGX_TAG_HOT_ACTIVITY_ID)
+		if err != nil {
+			br.Msg = "获取数据失败"
+			br.ErrMsg = "买方研选产品介绍信息失败,Err:" + err.Error()
+			return
+		}
+		if conf.ConfigValue == "" {
+			conf.ConfigValue = "0"
+		}
+		condition += " AND art.activity_id IN  (" + conf.ConfigValue + ") "
+	} else {
+		condition += ` AND art.activity_name LIKE '%` + keyWord + `%'   `
+	}
+	condition += ` AND art.publish_status = 1  AND art.active_state IN (1,2) `
+	list, err := cygx.GetActivityListAll(condition, pars, 0, 1000)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	if len(list) == 0 {
+		list = make([]*cygx.CygxActivityList, 0)
+	}
+	resp.List = list
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 更新热门活动
+// @Description 更新热门活动接口
+// @router /tag/hot_activity/update [post]
+func (this *TagManagementController) TagHotActivityUpdate() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var req cygx.ActivityIdsResp
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	activityIdList := req.ActivityIds
+	var activityIds []string
+	for _, v := range activityIdList {
+		activityIds = append(activityIds, strconv.Itoa(v))
+	}
+	err = cygx.CygxConfigUpdateByCode(strings.Join(activityIds, ","), utils.CYGX_TAG_HOT_ACTIVITY_ID)
+	if err != nil {
+		br.Msg = "保存失败"
+		br.ErrMsg = "保存失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.IsAddLog = true
+	br.Msg = "保存成功"
+}

+ 38 - 10
controllers/cygx/yanxuan_special.go

@@ -55,18 +55,29 @@ func (this *YanxuanSpecialController) Add() {
 		br.Msg = "请输入手机号"
 		return
 	}
+
+	//获取关联公司的用户信息
+	infoUser, err := cygx.GetUserAndCompanyNameList(req.UserId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+
 	rnd := utils.GetRandInt(1, 5)
 	item := cygx.CygxYanxuanSpecialAuthor{
-		UserId:     req.UserId,
-		RealName:   req.RealName,
-		Mobile:     req.Mobile,
-		CreateTime: time.Now(),
-		ModifyTime: time.Now(),
-		HeadImg:    utils.CYGX_YANXUAN_SPECIAL_HEAD_IMG_URL + strconv.Itoa(rnd) + ".png",
-		BgImg:      utils.CYGX_YANXUAN_SPECIAL_BG_IMG_URL + strconv.Itoa(rnd) + "a.png",
-		BgImgDown:  utils.CYGX_YANXUAN_SPECIAL_BG_IMG_URL + strconv.Itoa(rnd) + "b.png",
-		BgImgPc:    utils.CYGX_YANXUAN_SPECIAL_BG_IMG_URL_PC + strconv.Itoa(rnd) + ".png",
-		Status:     1,
+		UserId:      req.UserId,
+		RealName:    req.RealName,
+		Mobile:      req.Mobile,
+		CompanyName: infoUser.CompanyName,
+		CompanyId:   infoUser.CompanyId,
+		CreateTime:  time.Now(),
+		ModifyTime:  time.Now(),
+		HeadImg:     utils.CYGX_YANXUAN_SPECIAL_HEAD_IMG_URL + strconv.Itoa(rnd) + ".png",
+		BgImg:       utils.CYGX_YANXUAN_SPECIAL_BG_IMG_URL + strconv.Itoa(rnd) + "a.png",
+		BgImgDown:   utils.CYGX_YANXUAN_SPECIAL_BG_IMG_URL + strconv.Itoa(rnd) + "b.png",
+		BgImgPc:     utils.CYGX_YANXUAN_SPECIAL_BG_IMG_URL_PC + strconv.Itoa(rnd) + ".png",
+		Status:      1,
 	}
 
 	_, err = cygx.AddCygxYanxuanSpecialAuthor(&item)
@@ -163,6 +174,23 @@ func (this *YanxuanSpecialController) AuthorList() {
 	br.Msg = "获取成功"
 }
 
+//V12.0.1 上线脚本
+//func init() {
+//	list, err := cygx.GetYanxuanSpecialAuthorList()
+//	if err != nil {
+//		fmt.Println(err)
+//	}
+//	for _, v := range list {
+//		//获取关联公司的用户信息
+//		infoUser, err := cygx.GetUserAndCompanyNameList(v.UserId)
+//		if err != nil {
+//			fmt.Println(err)
+//		}
+//		err = cygx.UpdateSpecialAuthorComapony(infoUser.UserId, infoUser.CompanyId, infoUser.CompanyName)
+//		fmt.Println(infoUser.UserId)
+//	}
+//}
+
 // @Title 审核列表
 // @Description 审核列表
 // @Param	request	body help_doc.AddHelpDocReq true "type json string"

+ 11 - 2
controllers/english_report/email.go

@@ -1677,7 +1677,12 @@ func (this *EnglishReportEmailController) VideoSend() {
 		br.Msg = "无权操作"
 		return
 	}
-
+	noCompanyIdsMap := make(map[int]struct{})
+	if len(req.NoCompanyIds) > 0 {
+		for _, v := range req.NoCompanyIds {
+			noCompanyIdsMap[v] = struct{}{}
+		}
+	}
 	// 指定品种的客户
 	sendCompanyIds := make([]int, 0)
 	if len(req.EnPermissions) > 0 {
@@ -1687,7 +1692,11 @@ func (this *EnglishReportEmailController) VideoSend() {
 			br.ErrMsg = "获取指定品种的客户IDs失败, Err: " + e.Error()
 			return
 		}
-		sendCompanyIds = companyIds
+		for _, v := range companyIds {
+			if _, ok := noCompanyIdsMap[v]; !ok {
+				sendCompanyIds = append(sendCompanyIds, v)
+			}
+		}
 	}
 	// 指定收件人列表
 	sendEmailIds := make([]int, 0)

+ 89 - 45
controllers/english_report/english_classify.go

@@ -31,7 +31,6 @@ func (this *EnglishReportController) ListClassify() {
 	pageSize, _ := this.GetInt("PageSize")
 	currentIndex, _ := this.GetInt("CurrentIndex")
 	keyWord := this.GetString("KeyWord")
-	classifyType, _ := this.GetInt("ClassifyType", 0)
 
 	var startSize int
 	if pageSize <= 0 {
@@ -46,13 +45,21 @@ func (this *EnglishReportController) ListClassify() {
 	page := paging.GetPaging(currentIndex, pageSize, 0)
 	resp := new(models.EnglishClassifyListResp)
 
-	list, err := models.GetEnglishClassifyList(startSize, pageSize, keyWord, classifyType)
+	// 处理一级分类分页的情况
+	rootList, err := models.GetEnglishClassifyRootId(startSize, pageSize, keyWord)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
-	total, err := models.GetEnglishClassifyListCount(keyWord, classifyType)
+	var ids []int
+	var rootIds []int
+	rootMap := make(map[int]struct{}, 0)
+	for _, v := range rootList {
+		rootIds = append(rootIds, v.Id)
+		rootMap[v.Id] = struct{}{}
+	}
+	total, err := models.GetEnglishClassifyListCount(keyWord)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
@@ -68,65 +75,102 @@ func (this *EnglishReportController) ListClassify() {
 		br.Msg = "获取成功"
 		return
 	}
-	var parentIds []int
-	for _, v := range list {
-		parentIds = append(parentIds, v.Id)
-	}
+	page = paging.GetPaging(currentIndex, pageSize, total)
 
-	childMap := make(map[int][]*models.EnglishClassifyList)
-	tmpList, err := models.GetEnglishClassifyChildByParentIds(parentIds, keyWord, classifyType)
+	//获取相关的分类ID
+	idList, err := models.GetEnglishClassifyListByRootId(rootIds, keyWord)
 	if err != nil {
-		br.Msg = "获取二级分类失败"
-		br.ErrMsg = "获取二级分类失败,Err:" + err.Error()
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
-
-	// 二级分类-品种权限
+	secondListMap := make(map[int][]*models.EnglishClassifyList)
+	thirdListMap := make(map[int][]*models.EnglishClassifyList)
+	var thirdIds []int
+	var sortChildList models.RSChildClassifyList
+	// 三级分类-品种权限
 	permissionMap := make(map[int][]int)
-	{
-		classifyIds := make([]int, 0)
+
+	if len(idList) > 0 {
+		childIdMap := make(map[int]struct{}, 0)
+		for _, v := range idList {
+			if _, ok := childIdMap[v.ParentId]; !ok {
+				ids = append(ids, v.ParentId)
+				childIdMap[v.ParentId] = struct{}{}
+			}
+			if _, ok := childIdMap[v.Id]; !ok {
+				ids = append(ids, v.Id)
+				childIdMap[v.ParentId] = struct{}{}
+			}
+		}
+		tmpList, err := models.GetEnglishClassifyChildByIds(ids)
+		if err != nil {
+			br.Msg = "获取二级分类失败"
+			br.ErrMsg = "获取二级分类失败,Err:" + err.Error()
+			return
+		}
 		for _, v := range tmpList {
-			classifyIds = append(classifyIds, v.Id)
+			if _, ok := rootMap[v.ParentId]; !ok {
+				thirdIds = append(thirdIds, v.Id)
+			}
 		}
-		if len(classifyIds) > 0 {
-			cond := fmt.Sprintf(` AND %s IN (%s)`, models.EnClassifyPermissionColumns.EnClassifyId, utils.GetOrmInReplace(len(classifyIds)))
-			pars := make([]interface{}, 0)
-			pars = append(pars, classifyIds)
-			ob := new(models.EnClassifyPermission)
-			items, e := ob.GetItemsByCondition(cond, pars, []string{}, "")
-			if e != nil {
-				br.Msg = "获取失败"
-				br.ErrMsg = "获取客户权限列表失败, Err: " + e.Error()
-				return
+		{
+			classifyIds := thirdIds
+			if len(classifyIds) > 0 {
+				cond := fmt.Sprintf(` AND %s IN (%s)`, models.EnClassifyPermissionColumns.EnClassifyId, utils.GetOrmInReplace(len(classifyIds)))
+				pars := make([]interface{}, 0)
+				pars = append(pars, classifyIds)
+				ob := new(models.EnClassifyPermission)
+				items, e := ob.GetItemsByCondition(cond, pars, []string{}, "")
+				if e != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取客户权限列表失败, Err: " + e.Error()
+					return
+				}
+				for _, v := range items {
+					if permissionMap[v.EnClassifyId] == nil {
+						permissionMap[v.EnClassifyId] = make([]int, 0)
+					}
+					permissionMap[v.EnClassifyId] = append(permissionMap[v.EnClassifyId], v.EnPermissionId)
+				}
 			}
-			for _, v := range items {
-				if permissionMap[v.EnClassifyId] == nil {
-					permissionMap[v.EnClassifyId] = make([]int, 0)
+		}
+		// 处理三级分类
+		for _, v := range tmpList {
+			if _, ok := rootMap[v.ParentId]; !ok {
+				if p, ok1 := permissionMap[v.Id]; ok1 {
+					v.EnPermissions = p
 				}
-				permissionMap[v.EnClassifyId] = append(permissionMap[v.EnClassifyId], v.EnPermissionId)
+				thirdListMap[v.ParentId] = append(thirdListMap[v.ParentId], v)
 			}
 		}
-	}
 
-	for _, v := range tmpList {
-		v.EnPermissions = permissionMap[v.Id]
-		childMap[v.ParentId] = append(childMap[v.ParentId], v)
-	}
-	for _, v := range list {
-		if child, ok := childMap[v.Id]; ok {
-			v.Child = child
+		//处理二级分类
+		for _, v := range tmpList {
+			if _, ok := rootMap[v.ParentId]; ok {
+				if child, ok1 := thirdListMap[v.Id]; ok1 {
+					sortChildList = child
+					sort.Sort(sortChildList)
+					v.Child = sortChildList
+				}
+				secondListMap[v.ParentId] = append(secondListMap[v.ParentId], v)
+			}
 		}
 	}
+
+	//处理一级分类
 	var sortList models.RSClassifyList
-	sortList = list
+	for _, v := range rootList {
+		if child, ok := secondListMap[v.Id]; ok {
+			sortChildList = child
+			sort.Sort(sortChildList)
+			v.Child = sortChildList
+		}
+		sortList = append(sortList, v)
+	}
+
 	sort.Sort(sortList)
 
-	for _, item := range sortList {
-		var sortChildList models.RSChildClassifyList
-		sortChildList = item.Child
-		sort.Sort(sortChildList)
-		item.Child = sortChildList
-	}
 	resp.List = sortList
 	resp.Paging = page
 

+ 43 - 3
controllers/english_report/english_video.go

@@ -314,12 +314,42 @@ func (this *EnglishVideoController) List() {
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
-	list, err := models.GetEnglishVideoList(condition, pars, startSize, pageSize)
+	list := make([]*models.EnglishVideoList, 0)
+	list, err = models.GetEnglishVideoList(condition, pars, startSize, pageSize)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp := new(models.EnglishVideoListResp)
+	if len(list) == 0 {
+		list = make([]*models.EnglishVideoList, 0)
+		resp.Paging = page
+		resp.List = list
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		br.Data = resp
+	}
+	// 查询分类信息
+	var classifyIdSecondSlice []int
+	classifyNameMap := make(map[int]*models.EnglishClassifyFullName)
+	for _, item := range list {
+		classifyIdSecondSlice = append(classifyIdSecondSlice, item.ClassifyIdSecond)
+	}
+	if len(classifyIdSecondSlice) > 0 {
+		nameList, err := models.GetEnglishClassifyFullNameByIds(classifyIdSecondSlice)
+		if err != nil {
+			br.Msg = "获取分类名称失败"
+			br.ErrMsg = "获取分类名称失败, ERR:" + err.Error()
+			return
+		}
+
+		for _, v := range nameList {
+			classifyNameMap[v.Id] = v
+		}
+	}
 
 	// todo 获取邮件配置-是否有权限群发
 	conf := new(models.EnglishReportEmailConf)
@@ -372,9 +402,19 @@ func (this *EnglishVideoController) List() {
 		if item.PvEmail > 0 {
 			item.Pv = 0
 		}
+		//处理分类名
+		//处理分类名
+		if n, ok := classifyNameMap[item.ClassifyIdSecond]; ok {
+			if n.RootId == 0 {
+				item.FullClassifyName = strings.Join([]string{n.ParentName, n.ClassifyName}, "/")
+			} else {
+				item.FullClassifyName = strings.Join([]string{n.RootName, n.ParentName, n.ClassifyName}, "/")
+			}
+			item.ClassifyIdRoot = n.RootId
+			item.ClassifyNameRoot = n.RootName
+		}
 	}
-	page := paging.GetPaging(currentIndex, pageSize, total)
-	resp := new(models.EnglishVideoListResp)
+
 	resp.Paging = page
 	resp.List = list
 	br.Ret = 200

+ 96 - 0
controllers/eta_business/eta_business_menu.go

@@ -666,3 +666,99 @@ func (this *EtaBusinessMenuController) IconAdd() {
 	br.Success = true
 	br.Msg = "操作成功"
 }
+
+// SystemApiConfig
+// @Title 系统配置接口列表
+// @Description 系统配置接口列表
+// @Success 200 {object} []system.BusinessConf
+// @router /api/config/list [get]
+func (this *EtaBusinessMenuController) SystemApiConfig() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var relates []*eta_business.EtaBusinessConfigRelate
+	businessId, _ := this.GetInt("EtaBusinessId", 0)
+	var err error
+	if businessId > 0 {
+		relateOb := new(eta_business.EtaBusinessConfigRelate)
+		cond := ` AND eta_business_id = ?`
+		pars := make([]interface{}, 0)
+		pars = append(pars, businessId)
+		relates, err = relateOb.GetItemsByCondition(cond, pars, []string{}, "")
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取商家菜单关联列表失败, Err: " + err.Error()
+			return
+		}
+	}
+
+
+	br.Data = relates
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// SystemApiConfig
+// @Title 系统配置接口列表
+// @Description 系统配置接口列表
+// @Success 200 {object} []system.BusinessConf
+// @router /api/config/set [post]
+func (this *EtaBusinessMenuController) SystemApiConfigSet() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var req eta_business.SetBusinessConfReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+	ob := new(eta_business.EtaBusinessConfigRelate)
+	items := make([]*eta_business.EtaBusinessConfigRelate, 0)
+	for _, v := range req.List {
+		t := new(eta_business.EtaBusinessConfigRelate)
+		t.ConfigCode = v.ConfigCode
+		t.ConfigValue = v.ConfigValue
+		t.EtaBusinessId = req.EtaBusinessId
+		items = append(items, t)
+	}
+	if e := ob.CreateMulti(req.EtaBusinessId, items); e != nil {
+		br.Msg = "保存失败"
+		br.ErrMsg = "保存商家菜单关联失败, Err: " + e.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "设置成功"
+}

+ 7 - 2
controllers/sys_admin.go

@@ -366,8 +366,13 @@ func (this *SysAdminController) Add() {
 			br.Msg = "邮箱格式有误, 请检查"
 			return
 		}
-		_, e := system.GetSysUserByEmail(req.Email)
-		if e.Error() != utils.ErrNoRow() {
+		emailUser, e := system.GetSysUserByEmail(req.Email)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			br.Msg = "操作失败"
+			br.ErrMsg = "邮箱获取用户失败"
+			return
+		}
+		if emailUser != nil && emailUser.AdminId > 0 {
 			br.Msg = "邮箱已存在, 请重新填写"
 			return
 		}

+ 3 - 0
controllers/yb/apply_record.go

@@ -409,6 +409,9 @@ func (this *ApplyRecordController) UserApplyList() {
 	}()
 	w2.Wait()
 	for k, v := range list {
+		if v.OpStatus == 1 && v.MarkGroup == "" {
+			list[k].OpStatus = 0
+		}
 		sourceStr := ""
 		if v.ApplyRecordId > 0 {
 			if v.SourceAgent == 3 {

+ 1 - 0
models/business_trip/business_calendar.go

@@ -17,6 +17,7 @@ type BusinessTripCalendar struct {
 	City            string `description:"城市"`
 	Week            string `description:"周"`
 	WeekType        string `description:"当前周:current,下一周:next"`
+	Reason          string `description:"出差事由"`
 }
 
 // GetResearcherV2 获取研究员列表(冻结的也要)

+ 3 - 1
models/company/company_config.go

@@ -9,9 +9,11 @@ const (
 )
 
 type CrmConfig struct {
+	ConfigCode   string `description:"详情Code"`
 	ConfigValue string `description:"详情"`
 }
 
+
 func GetConfigValueByCode(configCode string) (total int, err error) {
 	o := orm.NewOrm()
 	sql := ` SELECT config_value FROM crm_config WHERE config_code=? `
@@ -29,7 +31,7 @@ func CrmConfigUpdate(newValue, configCode string) (err error) {
 
 func GetConfigDetailByCode(configCode string) (item CrmConfig, err error) {
 	o := orm.NewOrm()
-	sql := ` SELECT config_value FROM crm_config WHERE config_code=? `
+	sql := ` SELECT * FROM crm_config WHERE config_code=? `
 	err = o.Raw(sql, configCode).QueryRow(&item)
 	return
 }

+ 19 - 3
models/company/company_permission.go

@@ -104,7 +104,7 @@ type CompanyReportPermission struct {
 	Status                    string    `description:"'正式','试用','关闭'"`
 	ModifyTime                time.Time `description:"修改时间"`
 	IsUpgrade                 int       `description:"是否升级,1是,0否"`
-	ExpensiveYx               int       `description:"权益研选: 0-3w; 1-5w"`
+	ExpensiveYx               int       `description:"权益研选: 0-3w; 1-5w ,2: 10W"`
 }
 
 // 新增客户权限
@@ -162,6 +162,7 @@ type PermissionLookItem struct {
 	IsMerge            bool                  `description:"是否合并行业, 给前端的标识, 暂时仅权益使用"`
 	RaiBothHas         bool                  `description:"权益-是否主客观都有"`
 	IsUpgrade          int                   `description:"是否升级,1是,0否"`
+	ExpensiveYx        int                   `description:"权益研选: 0-3w; 1-5w ,2: 10W"`
 	Child              []*PermissionLookItem `description:"子权限"`
 }
 
@@ -624,7 +625,6 @@ func GetReportPermissionIdsByCompanyIds(companyIds []int) (items []*CompanyListP
 	return
 }
 
-
 // GetCompanyReportPermissionByCompanyIdAndProductId 获取权限类型
 func GetCompanyReportPermissionByCompanyIdAndProductId(companyId, productId int) (items []*CompanyReportPermission, err error) {
 	o := orm.NewOrm()
@@ -639,4 +639,20 @@ WHERE
 	AND STATUS = '正式' `
 	_, err = o.Raw(sql, companyId, productId).QueryRows(&items)
 	return
-}
+}
+
+// 列表
+func GetCompanyReportPermissionList(condition string, pars []interface{}, startSize, pageSize int) (items []*CompanyReportPermission, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM company_report_permission  WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	if startSize+pageSize > 0 {
+		sql += ` LIMIT ?,?  `
+		_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	} else {
+		_, err = o.Raw(sql, pars).QueryRows(&items)
+	}
+	return
+}

+ 18 - 0
models/cygx/activity.go

@@ -19,6 +19,10 @@ type ActivityIdRep struct {
 	ActivityId int `description:"活动id"`
 }
 
+type ActivityIdsResp struct {
+	ActivityIds []int `description:"活动ID"`
+}
+
 type ActivityList struct {
 	List []*ActivityType
 }
@@ -87,6 +91,7 @@ type ActivityRep struct {
 	ListImgToText           []*AliyunOcrTextActivityResp `description:"识图建会的会议信息列表"`
 	BackgroundImg           string                       `description:"封面图片"`
 	ShareImg                string                       `description:"分享图片"`
+	AreaType                int                          `description:"地区,1国内,2海外,默认1"`
 }
 
 // 活动添加、修改入参
@@ -170,6 +175,8 @@ type ActivityDetail struct {
 	ChartPermissionNameDeputy string                    `description:"副行业名称"`
 	BackgroundImg             string                    `description:"封面图片"`
 	ShareImg                  string                    `description:"分享图片"`
+	TopTime                   int                       `description:"置顶时间"`
+	AreaType                  int                       `description:"地区,1国内,2海外,默认1"`
 }
 
 type ActivityDetailRep struct {
@@ -242,6 +249,7 @@ type CygxActivity struct {
 	ChartPermissionIdDeputy   int       `description:"行业id"`
 	ChartPermissionNameDeputy string    `description:"行业名称"`
 	CancelDeadline            string    `description:"取消报名截止时间"`
+	AreaType                  int       `description:"地区,1国内,2海外,默认1"`
 }
 
 type CygxActivityEditDetail struct {
@@ -414,6 +422,7 @@ func EditActivity(item *CygxActivity, oldPublishStatus int, industrialActivityIt
 	updateParams["ChartPermissionNameDeputy"] = item.ChartPermissionNameDeputy
 	updateParams["ChartPermissionIdDeputy"] = item.ChartPermissionIdDeputy
 	updateParams["CancelDeadline"] = item.CancelDeadline
+	updateParams["AreaType"] = item.AreaType
 	//修改活动信息
 	ptrStructOrTableName := "cygx_activity"
 	whereParam := map[string]interface{}{"activity_id": item.ActivityId}
@@ -567,6 +576,7 @@ type CygxActivityList struct {
 	IsShowSigninButton        bool   `description:"是否展示签到码按钮"`
 	SigninImg                 string `description:"签到码图片"`
 	ChartPermissionNameDeputy string `description:"副行业名称"`
+	TopTime                   int    `description:"置顶时间"`
 }
 
 type GetCygxActivityListRep struct {
@@ -704,3 +714,11 @@ type AliyunOcrTextActivityResp struct {
 type AliyunOcrTextActivityListResp struct {
 	List []*AliyunOcrTextActivityResp
 }
+
+// 更新活动置顶时间
+func UpdateActivityTopTime(activityId, topTime int) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ` UPDATE cygx_activity SET  top_time=? WHERE activity_id=?`
+	_, err = o.Raw(sql, topTime, activityId).Exec()
+	return
+}

+ 1 - 1
models/cygx/activity_appointment.go

@@ -193,7 +193,7 @@ func GetActivityAppointmentOpenIdList(activityId int) (items []*OpenIdList, err
 				INNER JOIN cygx_user_record AS u ON u.cygx_bind_account = m.mobile 
 				AND u.cygx_user_id = m.user_id 
 			WHERE
-				m.activity_id < ? `
+				m.activity_id = ? `
 	_, err = o.Raw(sql, activityId).QueryRows(&items)
 	return
 }

+ 1 - 1
models/cygx/activity_help_ask.go

@@ -42,7 +42,7 @@ func GetActivityHelpAskOpenIdList(activityId int) (items []*OpenIdList, err erro
 				INNER JOIN cygx_user_record AS u ON u.cygx_bind_account = m.mobile 
 				AND u.cygx_user_id = m.user_id 
 			WHERE
-				m.activity_id < ? `
+				m.activity_id = ? `
 	_, err = o.Raw(sql, activityId).QueryRows(&items)
 	return
 }

+ 1 - 1
models/cygx/activity_special_trip.go

@@ -143,7 +143,7 @@ type GetAppointmentSpecialListRsep struct {
 
 func GetCygxActivitySpecialTripList(activityId int, condition string) (item []*CygxActivitySpecialTripResp, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
-	sql := `SELECT s.*
+	sql := `SELECT s.*,
 					a.activity_time,
 					a.special_type
 			FROM

+ 76 - 0
models/cygx/activity_video.go

@@ -16,6 +16,8 @@ type CygxActivityVideo struct {
 	VideoUrl      string `description:"视频地址"`
 	BackgroundImg string `description:"封面图片"`
 	ShareImg      string `description:"分享图片"`
+	IsByHand      int    `description:"是否手动修改过"`
+	FileType      int    `description:"文件类型,1:路演回放,2:调研反馈"`
 	CreateTime    string `description:"创建时间"`
 }
 
@@ -44,6 +46,8 @@ type CygxActivityVideoListResp struct {
 	VideoCounts          int    `description:"播放量"`
 	VideoDuration        string `description:"视频时长"`
 	CommentNum           int    `description:"留言总数"`
+	VideoUrl             string `description:"视频地址"`
+	FileName             string `description:"文件类型名称"`
 }
 
 type CygxActivityVideoListRep struct {
@@ -67,6 +71,7 @@ func UpdateCygxActivityVideo(item *CygxActivityVideo) (err error) {
 	updateParams["VideoUrl"] = item.VideoUrl
 	updateParams["BackgroundImg"] = item.BackgroundImg
 	updateParams["ShareImg"] = item.ShareImg
+	updateParams["FileType"] = item.FileType
 	updateParams["ModifyDate"] = time.Now()
 	ptrStructOrTableName := "cygx_activity_video"
 	whereParam := map[string]interface{}{"activity_id": item.ActivityId}
@@ -95,6 +100,18 @@ func GetActivityVideoCount(condition string, pars []interface{}) (count int, err
 	return
 }
 
+// 获取数量
+func GetActivityVideoCountByActivityId(activityId int) (count int, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sqlCount := ` SELECT
+				COUNT( 1 ) AS count 
+			FROM
+   				JOIN cygx_activity_video
+			WHERE activity_id = ? `
+	err = o.Raw(sqlCount, activityId).QueryRow(&count)
+	return
+}
+
 // 列表
 func GetActivityVideoListAll(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxActivityVideoListResp, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
@@ -196,3 +213,62 @@ func DeleteCygxActivityVideo(activityId int) (err error) {
 	_, err = o.Raw(sql, activityId).Exec()
 	return
 }
+
+func Updatevideo_url(video_url string, video_id int) (err error) {
+	sql := `UPDATE cygx_activity_video SET video_url =? WHERE video_id=? `
+	o := orm.NewOrmUsingDB("hz_cygx")
+	_, err = o.Raw(sql, video_url, video_id).Exec()
+	return
+}
+
+// 获取数量
+func GetActivityVoiceAndVideoList(condition, conditionVoice, conditionVideo, conditionOrder string, pars []interface{}, startSize, pageSize int) (items []*CygxActivityVideoListResp, total int, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ` 	
+		SELECT
+		art.activity_id,
+		art.activity_time,
+		art.activity_name,
+		art.activity_type_name,
+		art.chart_permission_name,
+		art.activity_time_text,
+		v.activity_voice_id as video_id,
+		v.voice_name as video_name,
+		v.voice_counts as video_counts,
+		v.comment_num as comment_num,
+		v.voice_play_seconds as  video_duration,
+		v.voice_url as  video_url
+	FROM
+		cygx_activity AS art
+		INNER JOIN cygx_activity_voice AS v ON v.activity_id = art.activity_id 
+	WHERE
+		1 = 1 ` + condition + conditionVoice
+
+	sql += `	UNION ALL`
+	sql += ` SELECT
+		art.activity_id,
+		art.activity_time,
+		art.activity_name,
+		art.activity_type_name,
+		art.chart_permission_name,
+		art.activity_time_text,
+		v.video_id,
+		v.video_name,
+		v.video_counts,
+		v.comment_num as comment_num,
+		v.video_duration,
+		v.video_url
+	FROM
+		cygx_activity AS art
+		INNER JOIN cygx_activity_video AS v ON v.activity_id = art.activity_id 
+	WHERE
+		1 = 1  ` + condition + conditionVideo + conditionOrder
+	totalSql := `SELECT COUNT(1) total FROM (` + sql + `) z `
+	err = o.Raw(totalSql, pars, pars).QueryRow(&total)
+	if err != nil {
+		return
+	}
+	sql += ` LIMIT ?,?`
+	_, err = o.Raw(sql, pars, pars, startSize, pageSize).QueryRows(&items)
+	return
+}

+ 39 - 0
models/cygx/activity_voice.go

@@ -14,6 +14,8 @@ type CygxActivityVoice struct {
 	VoicePlaySeconds string    `description:"音频时长"`
 	BackgroundImg    string    `description:"封面图片"`
 	ShareImg         string    `description:"分享图片"`
+	IsByHand         int       `description:"是否手动修改过"`
+	FileType         int       `description:"文件类型,1:路演回放,2:调研反馈"`
 	CreateTime       time.Time `description:"创建时间"`
 }
 
@@ -43,6 +45,7 @@ func UpdateCygxActivityVoice(item *CygxActivityVoice) (err error) {
 	updateParams["VoiceUrl"] = item.VoiceUrl
 	updateParams["BackgroundImg"] = item.BackgroundImg
 	updateParams["ShareImg"] = item.ShareImg
+	updateParams["FileType"] = item.FileType
 	ptrStructOrTableName := "cygx_activity_voice"
 	whereParam := map[string]interface{}{"activity_id": item.ActivityId}
 	qs := to.QueryTable(ptrStructOrTableName)
@@ -89,6 +92,26 @@ func GetActivityVoiceList(condition string, pars []interface{}) (items []*CygxAc
 	return
 }
 
+// 列表
+func GetActivityVoiceListNew(condition string, pars []interface{}) (items []*CygxActivityVoice, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ` SELECT
+	v.*
+FROM
+	cygx_activity_voice as v  
+	INNER JOIN cygx_activity as  a ON a.activity_id = v.activity_id
+WHERE
+	1= 1 
+	AND a.activity_time > '2023-09-22'
+	AND  v.voice_name NOT LIKE '%调研反馈%'
+	AND  v.voice_name NOT LIKE '%【%'  `
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
 func GetCygxActivityVoiceReqDetail(activityId int) (item *CygxActivityVoice, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
 	sql := `SELECT *  FROM cygx_activity_voice  WHERE activity_id= ? `
@@ -103,3 +126,19 @@ func DeleteCygxActivityVoice(activityId int) (err error) {
 	_, err = o.Raw(sql, activityId).Exec()
 	return
 }
+
+// 根据音频ID获取详情
+func GetCygxActivityVoiceReqDetailByActivityVoiceId(activityVoiceId int) (item *CygxActivityVoice, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT *  FROM cygx_activity_voice  WHERE activity_voice_id= ? `
+	err = o.Raw(sql, activityVoiceId).QueryRow(&item)
+	return
+}
+
+// 根据活动ID获取详情
+func GetCygxActivityVoiceReqDetailByActivityId(activityId int) (item *CygxActivityVoice, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT *  FROM cygx_activity_voice  WHERE activity_id= ? `
+	err = o.Raw(sql, activityId).QueryRow(&item)
+	return
+}

+ 207 - 0
models/cygx/askserie_video.go

@@ -0,0 +1,207 @@
+package cygx
+
+import (
+	//"github.com/beego/beego/v2/client/orm"
+	//"github.com/rdlucklib/rdluck_tools/paging"
+	//"strconv"
+	//"strings"
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"strconv"
+	"strings"
+	"time"
+)
+
+type CygxAskserieVideo struct {
+	AskserieVideoId     int       `orm:"column(askserie_video_id);pk"description:"视频id"`
+	VideoName           string    `description:"视频标题"`
+	VideoUrl            string    `description:"视频地址"`
+	VideoDuration       string    `description:"视频时长"`
+	ChartPermissionId   int       `description:"行业ID"`
+	ChartPermissionName string    `description:"行业名称"`
+	PublishStatus       int       `description:"发布状态 1发布 0没有"`
+	VideoCounts         int       `description:"播放量"`
+	BackgroundImg       string    `description:"封面图片"`
+	ShareImg            string    `description:"分享图片"`
+	AdminId             int       `description:"管理员、销售ID"`
+	ModifyDate          time.Time `description:"更新时间"`
+	PublishDate         time.Time `description:"发布时间"`
+	CreateTime          time.Time `description:"创建时间"`
+	ActivityId          int       ` description:"活动ID"`
+}
+
+type AddAskserieVideoReq struct {
+	AskserieVideoId         int    `description:"askserie_video_id"`
+	VideoName               string `description:"视频标题"`
+	VideoUrl                string `description:"视频地址"`
+	VideoDuration           string `description:"视频时长"`
+	ChartPermissionId       int    `description:"行业ID"`
+	ChartPermissionName     string `description:"行业名称"`
+	IndustrialManagementIds string `description:"产业id 多个用 , 隔开"`
+	BackgroundImg           string `description:"封面图片"`
+	ShareImg                string `description:"分享图片"`
+}
+
+type CygxAskserieVideoResp struct {
+	AskserieVideoId     int    `orm:"column(askserie_video_id);pk"description:"视频id"`
+	VideoName           string `description:"视频标题"`
+	VideoUrl            string `description:"视频地址"`
+	VideoDuration       string `description:"视频时长"`
+	ChartPermissionId   int    `description:"行业ID"`
+	ChartPermissionName string `description:"行业名称"`
+	PublishStatus       int    `description:"发布状态 1发布 0没有"`
+	VideoCounts         int    `description:"播放量"`
+	CommentNum          int    `description:"留言总数"`
+	BackgroundImg       string `description:"封面图片"`
+	ShareImg            string `description:"分享图片"`
+	AdminId             int    `description:"管理员、销售ID"`
+	IndustryName        string `description:"产业名称"`
+	ModifyDate          string `description:"更新时间"`
+	PublishDate         string `description:"发布时间"`
+	CreateTime          string `description:"创建时间"`
+	ListIndustrial      []*IndustrialActivityGroupManagementRep
+}
+
+type GetCygxAskserieVideoDetailResp struct {
+	Detail *CygxAskserieVideoResp
+}
+
+// 通过ID获取详情
+func GetCygxAskserieVideoDetail(askserieVideoId int) (item *CygxAskserieVideoResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_askserie_video  WHERE askserie_video_id=? `
+	err = o.Raw(sql, askserieVideoId).QueryRow(&item)
+	return
+}
+
+// 添加
+func AddCygxAskserieVideo(item *CygxAskserieVideo, industrialManagementIds string) (newId int64, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+	newId, err = to.Insert(item)
+	if err != nil {
+		return
+	}
+	//添加与产业的关联
+	//new(cygx.CygxIndustrialAskserieVideoGroupManagement),
+	industrialManagementIdList := strings.Split(industrialManagementIds, ",")
+	for _, v := range industrialManagementIdList {
+		itemIndustrialManagementGroup := new(CygxIndustrialAskserieVideoGroupManagement)
+		newIndustrialId, _ := strconv.Atoi(v)
+		if newIndustrialId == 0 {
+			continue
+		}
+		itemIndustrialManagementGroup.CreateTime = time.Now()
+		itemIndustrialManagementGroup.AskserieVideoId = int(newId)
+		itemIndustrialManagementGroup.IndustrialManagementId = newIndustrialId
+		_, err = to.Insert(itemIndustrialManagementGroup)
+		if err != nil {
+			return
+		}
+	}
+	return
+}
+
+// 修改
+func UpdateCygxAskserieVideo(item *CygxAskserieVideo, industrialManagementIds string) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	updateParams := make(map[string]interface{})
+	updateParams["VideoName"] = item.VideoName
+	updateParams["VideoUrl"] = item.VideoUrl
+	updateParams["VideoDuration"] = item.VideoDuration
+	updateParams["ChartPermissionId"] = item.ChartPermissionId
+	updateParams["ChartPermissionName"] = item.ChartPermissionName
+	updateParams["BackgroundImg"] = item.BackgroundImg
+	updateParams["ShareImg"] = item.ShareImg
+	updateParams["ModifyDate"] = time.Now()
+	ptrStructOrTableName := "cygx_askserie_video"
+	whereParam := map[string]interface{}{"askserie_video_id": item.AskserieVideoId}
+	qs := to.QueryTable(ptrStructOrTableName)
+	for expr, exprV := range whereParam {
+		qs = qs.Filter(expr, exprV)
+	}
+	_, err = qs.Update(updateParams)
+	if err != nil {
+		return
+	}
+
+	//删除关联产业 (避免截断表时产生的脏数据,故不用update而是先删除再增加)
+	sql := `	DELETE FROM cygx_industrial_askserie_video_group_management WHERE askserie_video_id = ?`
+	_, err = to.Raw(sql, item.AskserieVideoId).Exec()
+	if err != nil {
+		return
+	}
+
+	industrialManagementIdList := strings.Split(industrialManagementIds, ",")
+	for _, v := range industrialManagementIdList {
+		itemIndustrialManagementGroup := new(CygxIndustrialAskserieVideoGroupManagement)
+		newIndustrialId, _ := strconv.Atoi(v)
+		itemIndustrialManagementGroup.CreateTime = time.Now()
+		itemIndustrialManagementGroup.AskserieVideoId = item.AskserieVideoId
+		itemIndustrialManagementGroup.IndustrialManagementId = newIndustrialId
+		_, err = to.Insert(itemIndustrialManagementGroup)
+		if err != nil {
+			return
+		}
+	}
+
+	return
+}
+
+// 获取数量
+func GetCygxAskserieVideoCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_askserie_video as art WHERE 1= 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+// 列表
+func GetCygxAskserieVideoList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxAskserieVideoResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_askserie_video as art WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` LIMIT ?,?  `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+type GetCygxAskserieVideoRespListResp struct {
+	Paging *paging.PagingItem `description:"分页数据"`
+	List   []*CygxAskserieVideoResp
+}
+
+// 修改是否展示
+func EditCygxAskserieVideoStatus(status, askserieVideoId int) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `UPDATE cygx_askserie_video SET publish_status=?,publish_date = NOW() , modify_date=NOW()   WHERE askserie_video_id=? `
+	_, err = o.Raw(sql, status, askserieVideoId).Exec()
+	return
+}

+ 74 - 0
models/cygx/askserie_video_history_record.go

@@ -0,0 +1,74 @@
+package cygx
+
+import "github.com/beego/beego/v2/client/orm"
+
+type CygxAskserieVideoHistoryRecordResp struct {
+	Id               int    `orm:"column(id);pk"`
+	AskserieVideoId  int    `description:"askserie_video_id"`
+	UserId           int    `description:"用户ID"`
+	CreateTime       string `description:"创建时间"`
+	Mobile           string `description:"手机号"`
+	Email            string `description:"邮箱"`
+	CompanyId        int    `description:"公司id"`
+	CompanyName      string `description:"公司名称"`
+	RealName         string `description:"用户实际名称"`
+	SellerName       string `description:"所属销售"`
+	RegisterPlatform string `description:"来源 1小程序,2:网页"`
+	ModifyTime       string `description:"更新时间"`
+	VideoDuration    string `description:"视频时长"`
+	PlaySeconds      string `description:"播放时间 单位s"`
+}
+
+type AskserieVideoIdIdReq struct {
+	AskserieVideoId int `description:"ID"`
+}
+
+// Pv数据列表
+type CygxCygxAskserieVideoHistoryRecordListResp struct {
+	//Paging *paging.PagingItem `description:"分页数据"`
+	List []*CygxAskserieVideoHistoryRecordResp
+}
+
+// 列表
+func GetCygxAskserieVideoHistoryRecordList(condition string, pars []interface{}) (items []*CygxAskserieVideoHistoryRecordResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_askserie_video_history_record as art WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+type CygxAskserieVideoCollectionResp struct {
+	Id               int    `orm:"column(id);pk"`
+	AskserieVideoId  int    `description:"askserie_video_id"`
+	UserId           int    `description:"用户ID"`
+	CreateTime       string `description:"创建时间"`
+	Mobile           string `description:"手机号"`
+	Email            string `description:"邮箱"`
+	CompanyId        int    `description:"公司id"`
+	CompanyName      string `description:"公司名称"`
+	RealName         string `description:"用户实际名称"`
+	SellerName       string `description:"所属销售"`
+	RegisterPlatform string `description:"来源 1小程序,2:网页"`
+	ModifyTime       string `description:"更新时间"`
+	Content          string `description:"留言"`
+}
+
+// Pv数据列表
+type CygxAskserieVideoCollectionListResp struct {
+	//Paging *paging.PagingItem `description:"分页数据"`
+	List []*CygxAskserieVideoCollectionResp
+}
+
+// 列表
+func GetCygxAskserieVideoCollectionList(condition string, pars []interface{}) (items []*CygxAskserieVideoCollectionResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_askserie_video_collection as art WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}

+ 8 - 0
models/cygx/config.go

@@ -41,3 +41,11 @@ func GetCygxConfigDetailByCode(code string) (item *CygxConfig, err error) {
 	err = o.Raw(sql, code).QueryRow(&item)
 	return
 }
+
+// 修改
+func CygxConfigUpdateByCode(configValue, newValue string) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `UPDATE cygx_config SET  config_value=?   WHERE config_code= ? `
+	_, err = o.Raw(sql, configValue, newValue).Exec()
+	return
+}

+ 62 - 0
models/cygx/cygx_morning_meeting_review_chapter_history.go

@@ -0,0 +1,62 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+)
+
+type CygxMorningMeetingReviewChapterHistoryResp struct {
+	Id               int    `orm:"column(id);pk"`
+	ArticleId        int    `description:"文章ID"`
+	UserId           int    `description:"用户ID"`
+	CreateTime       string `description:"创建时间"`
+	Mobile           string `description:"手机号"`
+	Email            string `description:"邮箱"`
+	CompanyId        int    `description:"公司id"`
+	CompanyName      string `description:"公司名称"`
+	RealName         string `description:"用户实际名称"`
+	SellerName       string `description:"所属销售"`
+	SourcePage       string `description:"页面来源 微信、首页、展开"`
+	RegisterPlatform int    `description:"来源 1小程序,2:网页"`
+	ModifyTime       string `description:"更新时间"`
+	MeetingId        int    `description:"晨会ID"`
+}
+
+// Pv数据列表
+type CygxMorningMeetingReviewChapterHistoryResptListResp struct {
+	//Paging *paging.PagingItem `description:"分页数据"`
+	List []*CygxMorningMeetingReviewChapterHistoryResp
+}
+
+type ListPvUvResp struct {
+	ArticleId int `description:"文章ID"`
+	Pv        int `description:"pv"`
+	Uv        int `description:"pv"`
+}
+
+// 列表
+func GetCygxMorningMeetingReviewChapterHistoryPvUv(condition string, pars []interface{}) (items []*ListPvUvResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT
+			COUNT( 1 ) AS pv,
+			COUNT( DISTINCT user_id ) AS uv,
+			meeting_id  as article_id
+		FROM
+			cygx_morning_meeting_review_chapter_history  WHERE 1 = 1  `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` GROUP BY meeting_id `
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// 列表
+func GetCygxMorningMeetingReviewChapterHistoryList(condition string, pars []interface{}) (items []*CygxMorningMeetingReviewChapterHistoryResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_morning_meeting_review_chapter_history as art WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}

+ 2 - 0
models/cygx/cygx_morning_meeting_reviews.go

@@ -57,6 +57,8 @@ type CygxMorningMeetingReviewItem struct {
 	Status        int    `json:"status"`       // 0:未发布,1:已发布
 	PartNums      int    `json:"partNums"`     // 段落数
 	IndustryNames string `json:"industryName"` // 产业名称
+	Pv            int    `description:"PV"`
+	Uv            int    `description:"UV"`
 }
 
 type CygxMorningMeetingReviewsList struct {

+ 18 - 0
models/cygx/cygx_tag.go

@@ -27,6 +27,14 @@ func AddCygxTag(item *CygxTag) (id int64, err error) {
 	return
 }
 
+// 通过ID获取分类详情
+func GetCygxTagInfoById(tagId int) (item *CygxTagList, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_tag WHERE tag_id=?`
+	err = o.Raw(sql, tagId).QueryRow(&item)
+	return
+}
+
 func (m *CygxTag) Update(cols []string) (err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
 	_, err = o.Update(m, cols...)
@@ -48,6 +56,7 @@ type CygxTagList struct {
 	Status        int    `orm:"column(status);NOT NULL"`         // 状态:0-禁用 1-启用
 	Pv            int    `description:"PV"`
 	Uv            int    `description:"UV"`
+	TagType       int    `description:"1:热门活动、2:海外研究、3:路演回放、4:语音问答"`
 }
 
 // 获取tag列表
@@ -76,6 +85,15 @@ func GetCygxTagListCount(cond string) (count int, err error) {
 	return
 }
 
+// 获取tag列表-总数
+func GetCygxTagListCountByCondition(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT COUNT(1) AS count FROM cygx_tag  WHERE 1=1  ` + condition
+
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
 // 获取tag列表-分页
 func GetCygxTagListPage(cond string, startSize, pageSize int) (items []*CygxTagList, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")

+ 5 - 5
models/cygx/cygx_user.go

@@ -366,11 +366,11 @@ type UserInteraction struct {
 	RegisterPlatform      int    `description:"来源 1小程序,2:网页 ,3:策略平台"`
 	SourcePlatform        string `description:"来源 'MOBILE:移动端小程序','PC:PC端小程序','CELUE:上海策略平台','WEB:查研观向网页版'"`
 	TagId                 int
-	TagName               string `orm:"column(tag_name);NOT NULL"`       // 标签名
-	ArticleTypes          string `orm:"column(article_types);NOT NULL"`  // 报告系列
-	ActivityTypes         string `orm:"column(activity_types);NOT NULL"` // 活动类型
-	Industries            string `orm:"column(industries);NOT NULL"`     // 产业
-	SubjectNames          string `orm:"column(subject_names);NOT NULL"`  // 标的
+	TagName               string // 标签名
+	ArticleTypes          string // 报告系列
+	ActivityTypes         string // 活动类型
+	Industries            string // 产业
+	SubjectNames          string // 标的
 }
 
 // 查研观向图表

+ 11 - 0
models/cygx/cygx_yanxuan_special_user.go

@@ -21,6 +21,8 @@ type CygxYanxuanSpecialAuthor struct {
 	BgImgDown    string    // 背景图下部分
 	BgImgPc      string    // pc背景图
 	Status       int       // 1启用2禁用
+	CompanyId    int       `description:"公司id"`
+	CompanyName  string    `description:"公司名称"`
 }
 
 type CygxYanxuanSpecialAuthorItem struct {
@@ -76,3 +78,12 @@ FROM
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
+
+// 启用禁用作者
+func UpdateSpecialAuthorComapony(userId, CompanyId int, CompanyName string) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ``
+	sql = `UPDATE cygx_yanxuan_special_author SET company_id=?,company_name = ?  WHERE user_id = ? `
+	_, err = o.Raw(sql, CompanyId, CompanyName, userId).Exec()
+	return
+}

+ 41 - 0
models/cygx/industrial_askserie_video_group_management.go

@@ -0,0 +1,41 @@
+package cygx
+
+import (
+	//"github.com/beego/beego/v2/client/orm"
+	"github.com/beego/beego/v2/client/orm"
+	"hongze/hz_crm_api/utils"
+	"time"
+)
+
+// 首页资源表与产业的关系
+type CygxIndustrialAskserieVideoGroupManagement struct {
+	Id                     int       `orm:"column(id);pk" description:"主键ID"`
+	AskserieVideoId        int       `description:"askserie_video_id"`
+	IndustrialManagementId int       `description:"cygx_industrial_management表的主键ID"`
+	CreateTime             time.Time `description:"创建时间"`
+}
+
+type IndustrialAskserieVideoManagementRep struct {
+	AskserieVideoId        int    `description:"askserie_video_id"`
+	IndustrialManagementId int    `description:"cygx_industrial_management表的主键ID"`
+	IndustryName           string `description:"产业名称"`
+	ChartPermissionId      int    `description:"权限id"`
+	PermissionName         string `description:"行业名称"`
+}
+
+// 列表GetCygxIndustrialAskserieVideoGroupManagementList
+func GetCygxIndustrialAskserieVideoGroupManagementList(askserieVideoIds []int) (items []*IndustrialAskserieVideoManagementRep, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT
+			am.askserie_video_id,
+			m.chart_permission_id,
+			m.industrial_management_id,
+			m.industry_name 
+			FROM
+			cygx_industrial_askserie_video_group_management AS am
+			INNER JOIN cygx_industrial_management AS m ON m.industrial_management_id = am.industrial_management_id
+			WHERE
+			am.askserie_video_id IN (` + utils.GetOrmInReplace(len(askserieVideoIds)) + `)`
+	_, err = o.Raw(sql, askserieVideoIds).QueryRows(&items)
+	return
+}

+ 31 - 25
models/cygx/micro_roadshow.go

@@ -132,6 +132,10 @@ func EditVideo(item *CygxMicroRoadshowVideo) (err error) {
 }
 
 func PublishVideoCancel(videoId, publishOrCancle int) (err error) {
+
+	if publishOrCancle == 0 {
+		publishOrCancle = 3 // 取消发布状态
+	}
 	o := orm.NewOrmUsingDB("hz_cygx")
 	sql := `UPDATE cygx_micro_roadshow_video SET publish_status=?,modify_date=NOW() WHERE video_id =?`
 	_, err = o.Raw(sql, publishOrCancle, videoId).Exec()
@@ -139,18 +143,19 @@ func PublishVideoCancel(videoId, publishOrCancle int) (err error) {
 }
 
 type CygxMicroRoadshowVideoHistory struct {
-	Id          int       `orm:"column(id);pk"description:"微路演视频浏览记录表id"`
-	VideoId     int       `description:"微路演视频id"`
-	UserId      int       `description:"用户id"`
-	Mobile      string    `description:"手机号"`
-	Email       string    `description:"邮箱"`
-	CompanyId   int       `description:"公司Id"`
-	CompanyName string    `description:"公司名称"`
-	RealName    string    `description:"用户实际名称"`
-	SellerName  string    `description:"所属销售"`
-	PlaySeconds string    `description:"播放时间 单位s"`
-	CreateTime  string    `description:"视频创建时间"`
-	ModifyTime  time.Time `description:"视频修改时间"`
+	Id               int       `orm:"column(id);pk"description:"微路演视频浏览记录表id"`
+	VideoId          int       `description:"微路演视频id"`
+	UserId           int       `description:"用户id"`
+	Mobile           string    `description:"手机号"`
+	Email            string    `description:"邮箱"`
+	CompanyId        int       `description:"公司Id"`
+	CompanyName      string    `description:"公司名称"`
+	RealName         string    `description:"用户实际名称"`
+	SellerName       string    `description:"所属销售"`
+	PlaySeconds      string    `description:"播放时间 单位s"`
+	CreateTime       string    `description:"视频创建时间"`
+	ModifyTime       time.Time `description:"视频修改时间"`
+	RegisterPlatform string    `description:"来源 1小程序,2:网页"`
 }
 
 func GetMicroRoadshowVideoHistoryByIdPage(condition string, pars []interface{}, startSize, pageSize int) (item []*CygxMicroRoadshowVideoHistory, err error) {
@@ -312,19 +317,20 @@ type MicroRoadshowVideoHistoryListResp struct {
 }
 
 type CygxMicroRoadshowVoiceHistory struct {
-	Id          int       `orm:"column(id);pk"description:"音频id"`
-	VideoId     int       `description:"微路演音频id"`
-	ActivityId  int       `description:"活动id"`
-	UserId      int       `description:"用户id"`
-	Mobile      string    `description:"手机号"`
-	Email       string    `description:"邮箱"`
-	CompanyId   int       `description:"公司Id"`
-	CompanyName string    `description:"公司名称"`
-	RealName    string    `description:"用户实际名称"`
-	SellerName  string    `description:"所属销售"`
-	PlaySeconds string    `description:"播放时间 单位s"`
-	CreateTime  string    `description:"视频创建时间"`
-	ModifyTime  time.Time `description:"视频修改时间"`
+	Id               int       `orm:"column(id);pk"description:"音频id"`
+	VideoId          int       `description:"微路演音频id"`
+	ActivityId       int       `description:"活动id"`
+	UserId           int       `description:"用户id"`
+	Mobile           string    `description:"手机号"`
+	Email            string    `description:"邮箱"`
+	CompanyId        int       `description:"公司Id"`
+	CompanyName      string    `description:"公司名称"`
+	RealName         string    `description:"用户实际名称"`
+	SellerName       string    `description:"所属销售"`
+	PlaySeconds      string    `description:"播放时间 单位s"`
+	CreateTime       string    `description:"视频创建时间"`
+	ModifyTime       time.Time `description:"视频修改时间"`
+	RegisterPlatform string    `description:"来源 1小程序,2:网页"`
 }
 
 func GetMicroRoadshowVoiceHistoryById(condition string, pars []interface{}) (item []*CygxMicroRoadshowVoiceHistory, err error) {

+ 218 - 0
models/cygx/questionnaire.go

@@ -0,0 +1,218 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"strconv"
+	"strings"
+	"time"
+)
+
+type CygxQuestionnaire struct {
+	QuestionnaireId  int       `orm:"column(questionnaire_id);pk"`
+	ActivityTypeId   int       `description:"活动类型id"`
+	ActivityTypeName string    `description:"活动名称"`
+	Content          string    `description:"内容"`
+	EndTime          time.Time `description:"截止日期"`
+	CreateTime       time.Time `description:"创建时间"`
+	ModifyTime       time.Time `description:"更新时间"`
+	PublishTime      time.Time `description:"发布时间"`
+	AdminId          int       `description:"管理员ID"`
+	MaxChooseTotal   int       `description:"最多可选几项"`
+	OtherThemeTotal  int       `description:"其余主题投票数量"`
+}
+
+type CygxQuestionnaireTheme struct {
+	QuestionnaireThemeId int       `orm:"column(questionnaire_theme_id);pk"`
+	QuestionnaireId      int       `description:"问卷ID"`
+	ActivityTheme        string    `description:"活动主题"`
+	CreateTime           time.Time `description:"创建时间"`
+	ModifyTime           time.Time `description:"更新时间"`
+}
+
+type AddCygxQuestionnaireReq struct {
+	QuestionnaireId int    `description:"ID"`
+	ActivityTypeId  int    `description:"活动类型id"`
+	Content         string `description:"内容"`
+	EndTime         string `description:"截止日期"`
+	MaxChooseTotal  int    `description:"最多可选几项"`
+	ListTheme       []*AddCygxQuestionnaireThemeReq
+}
+
+type AddCygxQuestionnaireThemeReq struct {
+	QuestionnaireThemeId int    `description:"问卷主题ID"`
+	ActivityTheme        string `description:"活动主题"`
+	VoteTotal            int    `description:"票数"`
+}
+
+type CygxQuestionnaireResp struct {
+	QuestionnaireId  int    `orm:"column(questionnaire_id);pk"`
+	ActivityTypeId   int    `description:"活动类型id"`
+	ActivityTypeName string `description:"活动类型名称"`
+	Content          string `description:"内容"`
+	EndTime          string `description:"截止日期"`
+	CreateTime       string `description:"创建时间"`
+	ModifyTime       string `description:"更新时间"`
+	PublishTime      string `description:"发布时间"`
+	AdminId          int    `description:"管理员ID"`
+	MaxChooseTotal   int    `description:"最多可选几项"`
+	State            string `description:"状态"`
+	OtherThemeTotal  int    `description:"其余主题投票数量"`
+	ListTheme        []*AddCygxQuestionnaireThemeReq
+}
+
+type GetCygxQuestionnaireResp struct {
+	Paging *paging.PagingItem `description:"分页数据"`
+	List   []*CygxQuestionnaireResp
+}
+
+// 添加
+func AddCygxQuestionnaire(item *CygxQuestionnaire, listTheme []*AddCygxQuestionnaireThemeReq) (newId int64, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+	newId, err = to.Insert(item)
+	if err != nil {
+		return
+	}
+	//添加主题与问卷ID的关联
+	for _, v := range listTheme {
+		itemTheme := new(CygxQuestionnaireTheme)
+		itemTheme.QuestionnaireId = int(newId)
+		itemTheme.ActivityTheme = v.ActivityTheme
+		itemTheme.CreateTime = time.Now()
+		itemTheme.ModifyTime = time.Now()
+		_, err = to.Insert(itemTheme)
+		if err != nil {
+			return
+		}
+	}
+	return
+}
+
+// 编辑
+func EditCygxQuestionnaire(item *CygxQuestionnaire, listTheme []*AddCygxQuestionnaireThemeReq) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+	updateParams := make(map[string]interface{})
+	updateParams["ActivityTypeId"] = item.ActivityTypeId
+	updateParams["ActivityTypeName"] = item.ActivityTypeName
+	updateParams["EndTime"] = item.EndTime
+	updateParams["ModifyTime"] = time.Now()
+	updateParams["MaxChooseTotal"] = item.MaxChooseTotal
+	updateParams["Content"] = item.Content
+	ptrStructOrTableName := "cygx_questionnaire"
+	whereParam := map[string]interface{}{"questionnaire_id": item.QuestionnaireId}
+	qs := to.QueryTable(ptrStructOrTableName)
+	for expr, exprV := range whereParam {
+		qs = qs.Filter(expr, exprV)
+	}
+	_, err = qs.Update(updateParams)
+	if err != nil {
+		return
+	}
+
+	//如果有减少的就进行删除
+	var questionnaireThemeIds []string
+	for _, v := range listTheme {
+		questionnaireThemeIds = append(questionnaireThemeIds, strconv.Itoa(v.QuestionnaireThemeId))
+	}
+	sql := `	DELETE FROM cygx_questionnaire_theme WHERE questionnaire_id = ? AND  questionnaire_theme_id NOT IN  (` + strings.Join(questionnaireThemeIds, ",") + `)`
+	_, err = to.Raw(sql, item.QuestionnaireId).Exec()
+	if err != nil {
+		return
+	}
+
+	//添加主题与问卷ID的关联
+	for _, v := range listTheme {
+		if v.QuestionnaireThemeId == 0 {
+			itemTheme := new(CygxQuestionnaireTheme)
+			itemTheme.QuestionnaireId = item.QuestionnaireId
+			itemTheme.ActivityTheme = v.ActivityTheme
+			itemTheme.CreateTime = time.Now()
+			itemTheme.ModifyTime = time.Now()
+			_, err = to.Insert(itemTheme)
+			if err != nil {
+				return
+			}
+		} else {
+			updateParams := make(map[string]interface{})
+			updateParams["ActivityTheme"] = v.ActivityTheme
+			updateParams["ModifyTime"] = time.Now()
+			ptrStructOrTableName := "cygx_questionnaire_theme"
+			whereParam := map[string]interface{}{"questionnaire_theme_id": v.QuestionnaireThemeId}
+			qs := to.QueryTable(ptrStructOrTableName)
+			for expr, exprV := range whereParam {
+				qs = qs.Filter(expr, exprV)
+			}
+			_, err = qs.Update(updateParams)
+			if err != nil {
+				return
+			}
+		}
+
+	}
+	return
+}
+
+// 获取数量
+func GetCygxQuestionnaireCount(condition string, pars []interface{}) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_questionnaire as art WHERE 1= 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	o := orm.NewOrmUsingDB("hz_cygx")
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+// 列表
+func GetCygxQuestionnaireList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxQuestionnaireResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_questionnaire as art WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` LIMIT ?,?  `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+type GetCygxQuestionnaireDetailResp struct {
+	Detail *CygxQuestionnaireResp
+}
+
+// 通过ID获取详情
+func GetCygxQuestionnaireDetail(questionnaireId int) (item *CygxQuestionnaireResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_questionnaire  WHERE questionnaire_id=? `
+	err = o.Raw(sql, questionnaireId).QueryRow(&item)
+	return
+}
+
+// 列表
+func GetCygxQuestionnaireThemeListByQuestionnaireId(questionnaireId int) (items []*AddCygxQuestionnaireThemeReq, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_questionnaire_theme as art WHERE questionnaire_id = ? `
+	_, err = o.Raw(sql, questionnaireId).QueryRows(&items)
+	return
+}

+ 79 - 0
models/cygx/questionnaire_vote.go

@@ -0,0 +1,79 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+)
+
+type CygxQuestionnaireVoteResp struct {
+	QuestionnaireVoteId  int    `orm:"column(questionnaire_vote_id);pk"`
+	QuestionnaireId      int    `description:"问卷ID"`
+	QuestionnaireThemeId int    `description:"问卷主题ID"`
+	UserId               int    `description:"用户ID"`
+	CreateTime           string `description:"创建时间"`
+	Mobile               string `description:"手机号"`
+	Email                string `description:"邮箱"`
+	CompanyId            int    `description:"公司id"`
+	CompanyName          string `description:"公司名称"`
+	ModifyTime           string `description:"修改时间"`
+	RealName             string `description:"用户实际名称"`
+	SellerName           string `description:"所属销售"`
+	RegisterPlatform     int    `description:"来源 1小程序,2:网页"`
+}
+
+type CygxQuestionnaireVoteOtherThemeResp struct {
+	QuestionnaireVoteOtherThemeId int `orm:"column(questionnaire_vote_other_theme_id);pk"`
+	QuestionnaireId               int `description:"问卷ID"`
+	UserId                        int `description:"用户ID"`
+	CreateTime                    string
+	Mobile                        string `description:"手机号"`
+	Email                         string `description:"邮箱"`
+	CompanyId                     int    `description:"公司id"`
+	CompanyName                   string `description:"公司名称"`
+	ModifyTime                    string `description:"修改时间"`
+	RealName                      string `description:"用户实际名称"`
+	SellerName                    string `description:"所属销售"`
+	Content                       string `description:"内容"`
+	RegisterPlatform              int    `description:"来源 1小程序,2:网页"`
+}
+
+type CygxQuestionnaireVoteReq struct {
+	QuestionnaireId       int    `description:"问卷ID"`
+	QuestionnaireThemeIds []int  `description:"问卷主题ID"`
+	Content               string `description:"内容"`
+}
+
+type CygxQuestionnaireVoteListResp struct {
+	List []*AddCygxQuestionnaireThemeReq
+}
+
+// 列表
+func GetCygxCygxQuestionnaireVoteListByQuestionnaireId(questionnaireId int) (items []*CygxQuestionnaireVoteResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_questionnaire_vote as art WHERE questionnaire_id = ? `
+	_, err = o.Raw(sql, questionnaireId).QueryRows(&items)
+	return
+}
+
+type CygxCygxQuestionnaireVoteListResp struct {
+	List []*CygxQuestionnaireVoteResp
+}
+
+// 列表
+func GetCygxQuestionnaireVoteListByQuestionnaireThemeId(questionnaireThemeId int) (items []*CygxQuestionnaireVoteResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_questionnaire_vote as art WHERE questionnaire_theme_id = ?  ORDER BY create_time DESC  `
+	_, err = o.Raw(sql, questionnaireThemeId).QueryRows(&items)
+	return
+}
+
+type CygxQuestionnaireVoteOtherThemeListResp struct {
+	List []*CygxQuestionnaireVoteOtherThemeResp
+}
+
+// 列表
+func GetCygxQuestionnaireVoteOtherThemeListByQuestionnaireId(questionnaireId int) (items []*CygxQuestionnaireVoteOtherThemeResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_questionnaire_vote_other_theme as art WHERE questionnaire_id = ?   ORDER BY create_time DESC  `
+	_, err = o.Raw(sql, questionnaireId).QueryRows(&items)
+	return
+}

+ 1 - 0
models/cygx/report_article.go

@@ -479,6 +479,7 @@ type ArticleDetail struct {
 	IsClass              int    `description:"是否归类,1是,0否"`
 	IsSummary            int    `description:"是否是纪要库,1是,0否"`
 	CategoryId           int    `description:"分类ID"`
+	CategoryIdTwo        int    `description:"分类ID"`
 	FileLink             string `description:"下载预览链接"`
 	ReportType           int    `description:"报告类型,2产业报告,1行业报告"`
 	TypeName             string `description:"策略平台类型字段名称"`

+ 8 - 0
models/cygx/report_mapping_celue.go

@@ -45,6 +45,14 @@ func GetCygxReportMappingCelueMaxDetail() (item *CygxReportMappingCelue, err err
 	return
 }
 
+// 通过 categoryId 获取详情
+func GetCygxReportMappingCelueMaxDetailByCategoryId(categoryId int) (item *CygxReportMappingCelue, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT  * FROM cygx_report_mapping_celue  WHERE  category_id = ?  LIMIT 1 `
+	err = o.Raw(sql, categoryId).QueryRow(&item)
+	return
+}
+
 // 列表
 func GetCygxReportMappingList(condition string, pars []interface{}) (items []*CygxReportMappingCelueResp, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")

+ 30 - 10
models/cygx/resource_data.go

@@ -6,21 +6,22 @@ import (
 )
 
 type CygxResourceData struct {
-	Id          int       `orm:"column(id);pk"`
-	SourceId    int       `description:"资源ID"`
-	Source      string    `description:"资源类型 报告 :article 、图表 :newchart、微路演 :roadshow、活动 :activity、活动视频:activityvideo、活动音频:activityvoice、专项调研活动:activityspecial"`
-	Title       string    `description:"标题"`
-	Annotation  string    `description:"核心观点"`
-	CreateTime  time.Time `description:"创建时间"`
-	PublishDate string    `description:"发布时间"`
-	Abstract    string    `description:"摘要"`
-	SearchTag   string    `description:"搜索标签"`
+	Id                int       `orm:"column(id);pk"`
+	SourceId          int       `description:"资源ID"`
+	Source            string    `description:"资源类型 报告 :article 、图表 :newchart、微路演 :roadshow、活动 :activity、活动视频:activityvideo、活动音频:activityvoice、专项调研活动:activityspecial"`
+	Title             string    `description:"标题"`
+	Annotation        string    `description:"核心观点"`
+	CreateTime        time.Time `description:"创建时间"`
+	PublishDate       string    `description:"发布时间"`
+	Abstract          string    `description:"摘要"`
+	SearchTag         string    `description:"搜索标签"`
+	ChartPermissionId int       `description:"行业id"`
 }
 
 // 根据资源类型获取列表
 func GetCygxResourceDataListBysource(source string) (items []*CygxResourceData, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
-	sql := `SELECT * FROM cygx_resource_data as art WHERE 1= 1  AND  source = ? `
+	sql := `SELECT * FROM cygx_resource_data as art WHERE 1= 1  AND  source = ?  AND chart_permission_id = 0   `
 	_, err = o.Raw(sql, source).QueryRows(&items)
 	return
 }
@@ -54,6 +55,25 @@ func UpdateResourceDataByItem(item *CygxResourceData) (err error) {
 	updateParams := make(map[string]interface{})
 	updateParams["PublishDate"] = item.PublishDate
 	updateParams["SearchTag"] = item.SearchTag
+	updateParams["ChartPermissionId"] = item.ChartPermissionId
+	ptrStructOrTableName := "cygx_resource_data"
+	whereParam := map[string]interface{}{"source_id": item.SourceId, "source": item.Source}
+	qs := o.QueryTable(ptrStructOrTableName)
+	for expr, exprV := range whereParam {
+		qs = qs.Filter(expr, exprV)
+	}
+	_, err = qs.Update(updateParams)
+	if err != nil {
+		return
+	}
+	return
+}
+
+// 修改
+func UpdateChartPermissionIdResourceDataByItem(item *CygxResourceData) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	updateParams := make(map[string]interface{})
+	updateParams["ChartPermissionId"] = item.ChartPermissionId
 	ptrStructOrTableName := "cygx_resource_data"
 	whereParam := map[string]interface{}{"source_id": item.SourceId, "source": item.Source}
 	qs := o.QueryTable(ptrStructOrTableName)

+ 1 - 1
models/data_manage/request/cygx_tag.go

@@ -9,7 +9,7 @@ import (
 type MoveTagReq struct {
 	TagId     int `description:"指标id"`
 	PrevTagId int `description:"上一个节点标签id"`
-	NextTagId  int `description:"下一个节点标签id"`
+	NextTagId int `description:"下一个节点标签id"`
 }
 
 // SaveTagReq 保存标签请求参数

+ 6 - 0
models/db.go

@@ -261,6 +261,7 @@ func initCompany() {
 		new(company.CompanyNoRenewedNote),                    // 客户未续约记录
 		new(company.CompanyNoRenewedAscribe),                 // 确认不续约记录
 		new(company.CompanyNoRenewedAscribeLog),              // 确认不续约记录日志
+		new(company.CrmConfig),                               // 管理后台基本配置表
 	)
 }
 
@@ -457,6 +458,10 @@ func initCygx() {
 		new(cygx.CygxAllocationCompanyContractLog),
 		new(cygx.CygxAllocationCompanyContractPermission),
 		new(cygx.CygxAllocationCompanyContractPermissionLog),
+		new(cygx.CygxQuestionnaire),
+		new(cygx.CygxQuestionnaireTheme),
+		new(cygx.CygxAskserieVideo),
+		new(cygx.CygxIndustrialAskserieVideoGroupManagement),
 	)
 }
 
@@ -678,6 +683,7 @@ func initEtaBusiness() {
 		new(eta_business.EtaBusinessOperationRecord), // ETA操作记录表
 		new(eta_business.EtaBusinessMenu),            // ETA商家菜单表
 		new(eta_business.EtaBusinessMenuRelate),      // ETA商家菜单关联表
+		new(eta_business.EtaBusinessConfigRelate),    // ETA商家配置关联表
 		new(eta_business.EtaBusinessMenuIcon),        // ETA商家菜单icon表
 	)
 }

+ 58 - 477
models/english_report.go

@@ -23,6 +23,7 @@ type EnglishReport struct {
 	ModifyTime         time.Time `description:"修改时间"`
 	State              int       `description:"1:未发布,2:已发布"`
 	PublishTime        time.Time `description:"发布时间"`
+	PrePublishTime     time.Time `description:"预发布时间"`
 	Stage              int       `description:"期数"`
 	Content            string    `description:"内容"`
 	VideoUrl           string    `description:"音频文件URL"`
@@ -54,19 +55,6 @@ func GetEnglishReportStage(classifyIdFirst, classifyIdSecond int) (count int, er
 	return
 }
 
-func GetEnglishReportStageEdit(classifyIdFirst, classifyIdSecond, reportId int) (count int, err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := ``
-	if classifyIdSecond > 0 {
-		sql = "SELECT MAX(stage) AS max_stage FROM english_report WHERE classify_id_second=? AND id<>? "
-		o.Raw(sql, classifyIdSecond, reportId).QueryRow(&count)
-	} else {
-		sql = "SELECT MAX(stage) AS max_stage FROM english_report WHERE classify_id_first=? AND id<>? "
-		o.Raw(sql, classifyIdFirst, reportId).QueryRow(&count)
-	}
-	return
-}
-
 func AddEnglishReport(item *EnglishReport) (lastId int64, err error) {
 	o := orm.NewOrmUsingDB("rddp")
 	lastId, err = o.Insert(item)
@@ -80,57 +68,11 @@ func ModifyEnglishReportCode(reportId int64, reportCode string) (err error) {
 	return
 }
 
-type AddEnglishReportReq struct {
-	AddType            int    `description:"新增方式:1:新增报告,2:继承报告"`
-	ClassifyIdFirst    int    `description:"一级分类id"`
-	ClassifyNameFirst  string `description:"一级分类名称"`
-	ClassifyIdSecond   int    `description:"二级分类id"`
-	ClassifyNameSecond string `description:"二级分类名称"`
-	Title              string `description:"标题"`
-	Abstract           string `description:"摘要"`
-	Author             string `description:"作者"`
-	Frequency          string `description:"频度"`
-	State              int    `description:"状态:1:未发布,2:已发布"`
-	Content            string `description:"内容"`
-	CreateTime         string `description:"创建时间"`
-	Overview           string `description:"英文概述部分"`
-}
-
 type AddEnglishReportResp struct {
 	ReportId   int64  `description:"报告id"`
 	ReportCode string `description:"报告code"`
 }
 
-type EditEnglishReportReq struct {
-	ReportId           int64  `description:"报告id"`
-	ClassifyIdFirst    int    `description:"一级分类id"`
-	ClassifyNameFirst  string `description:"一级分类名称"`
-	ClassifyIdSecond   int    `description:"二级分类id"`
-	ClassifyNameSecond string `description:"二级分类名称"`
-	Title              string `description:"标题"`
-	Abstract           string `description:"摘要"`
-	Author             string `description:"作者"`
-	Frequency          string `description:"频度"`
-	State              int    `description:"状态:1:未发布,2:已发布"`
-	Content            string `description:"内容"`
-	CreateTime         string `description:"创建时间"`
-	Overview           string `description:"英文概述部分"`
-}
-
-type EditEnglishReportFromPolicyReq struct {
-	ReportId   int64  `description:"报告id"`
-	Title      string `description:"标题"`
-	Abstract   string `description:"摘要"`
-	Author     string `description:"作者"`
-	Frequency  string `description:"频度"`
-	CreateTime string `description:"创建时间"`
-	//Overview           string `description:"英文概述部分"`
-}
-type EditEnglishReportResp struct {
-	ReportId   int64  `description:"报告id"`
-	ReportCode string `description:"报告code"`
-}
-
 type ElasticEnglishReportDetail struct {
 	Id                 string `description:"报告id或者线上路演Id"`
 	ReportId           int    `description:"报告id"`
@@ -153,229 +95,19 @@ type ElasticEnglishReportDetail struct {
 	Overview           string `description:"英文概述部分"`
 }
 
-func EditEnglishReport(item *EnglishReport, reportId int64) (err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := `UPDATE english_report
-			SET
-			  classify_id_first =?,
-			  classify_name_first = ?,
-			  classify_id_second = ?,
-			  classify_name_second = ?,
-			  title = ?,
-			  abstract = ?,
-			  author = ?,
-			  frequency = ?,
-			  state = ?,
-			  content = ?,
-			  content_sub = ?,
-			  stage =?,
-			  create_time = ?,
-			  modify_time = ?,
-			  overview = ?
-			WHERE id = ? `
-	_, err = o.Raw(sql, item.ClassifyIdFirst, item.ClassifyNameFirst, item.ClassifyIdSecond, item.ClassifyNameSecond, item.Title,
-		item.Abstract, item.Author, item.Frequency, item.State, item.Content, item.ContentSub, item.Stage, item.CreateTime, time.Now(), item.Overview, reportId).Exec()
-	return
-}
-
-type EnglishReportDetail struct {
-	Id                 int    `orm:"column(id)" description:"报告Id"`
-	AddType            int    `description:"新增方式:1:新增报告,2:继承报告"`
-	ClassifyIdFirst    int    `description:"一级分类id"`
-	ClassifyNameFirst  string `description:"一级分类名称"`
-	ClassifyIdSecond   int    `description:"二级分类id"`
-	ClassifyNameSecond string `description:"二级分类名称"`
-	Title              string `description:"标题"`
-	Abstract           string `description:"摘要"`
-	Author             string `description:"作者"`
-	Frequency          string `description:"频度"`
-	CreateTime         string `description:"创建时间"`
-	ModifyTime         string `description:"修改时间"`
-	State              int    `description:"1:未发布,2:已发布"`
-	PublishTime        string `description:"发布时间"`
-	Stage              int    `description:"期数"`
-	MsgIsSend          int    `description:"消息是否已发送,0:否,1:是"`
-	ReportCode         string `description:"报告唯一编码"`
-	Content            string `description:"内容"`
-	VideoUrl           string `description:"音频文件URL"`
-	VideoName          string `description:"音频文件名称"`
-	VideoPlaySeconds   string `description:"音频播放时长"`
-	ContentSub         string `description:"内容前两个章节"`
-	Pv                 int    `description:"Pv"`
-	Overview           string `description:"英文概述部分"`
-	FromReportId       int    `description:"继承的报告ID(英文策略报告ID)"`
-	KeyTakeaways       string `description:"关键点"`
-}
-
-func GetEnglishReportById(reportId int) (item *EnglishReportDetail, err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := `SELECT * FROM english_report WHERE id=?`
-	err = o.Raw(sql, reportId).QueryRow(&item)
-	return
-}
-
-func GetEnglishReportItemById(reportId int) (item *EnglishReport, err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := `SELECT * FROM english_report WHERE id = ? LIMIT 1`
-	err = o.Raw(sql, reportId).QueryRow(&item)
-	return
-}
-
-type EnglishReportList struct {
-	Id                 int       `description:"报告Id"`
-	AddType            int       `description:"新增方式:1:新增报告,2:继承报告"`
-	ClassifyIdFirst    int       `description:"一级分类id"`
-	ClassifyNameFirst  string    `description:"一级分类名称"`
-	ClassifyIdSecond   int       `description:"二级分类id"`
-	ClassifyNameSecond string    `description:"二级分类名称"`
-	Title              string    `description:"标题"`
-	Abstract           string    `description:"摘要"`
-	Author             string    `description:"作者"`
-	Frequency          string    `description:"频度"`
-	CreateTime         string    `description:"创建时间"`
-	ModifyTime         time.Time `description:"修改时间"`
-	State              int       `description:"1:未发布,2:已发布"`
-	PublishTime        string    `description:"发布时间"`
-	Stage              int       `description:"期数"`
-	Content            string    `description:"内容"`
-	VideoUrl           string    `description:"音频文件URL"`
-	VideoName          string    `description:"音频文件名称"`
-	VideoPlaySeconds   string    `description:"音频播放时长"`
-	ContentSub         string    `description:"内容前两个章节"`
-	ReportCode         string    `description:"报告唯一编码"`
-	Pv                 int       `description:"Pv"`
-	ShareUrl           string    `description:"分享url"`
-	PvEmail            int       `description:"邮箱PV"`
-	EmailState         int       `description:"群发邮件状态: 0-未发送; 1-已发送"`
-	EmailAuth          bool      `description:"是否有权限群发邮件"`
-	EmailHasFail       bool      `description:"是否存在邮件发送失败的记录"`
-	CanEdit            bool      `description:"是否可编辑"`
-	Editor             string    `description:"编辑人"`
-	FromReportId       int       `description:"继承的报告ID(英文策略报告ID)"`
-	AdminId            int       `description:"创建者账号"`
-	AdminRealName      string    `description:"创建者姓名"`
-}
-
-type EnglishReportListResp struct {
-	List   []*EnglishReportList
-	Paging *paging.PagingItem `description:"分页数据"`
-}
-
-func GetEnglishReportListCount(condition string, pars []interface{}, companyType string) (count int, err error) {
-	//产品权限
-	companyTypeSqlStr := ``
-	if companyType == "ficc" {
-		companyTypeSqlStr = " AND classify_id_first != 40 "
-	} else if companyType == "权益" {
-		companyTypeSqlStr = " AND classify_id_first = 40 "
-	}
-
-	oRddp := orm.NewOrmUsingDB("rddp")
-	sql := `SELECT COUNT(1) AS count  FROM english_report WHERE 1=1 ` + companyTypeSqlStr
-	if condition != "" {
-		sql += condition
-	}
-	err = oRddp.Raw(sql, pars).QueryRow(&count)
-	return
-}
-
-func GetEnglishReportList(condition string, pars []interface{}, companyType string, startSize, pageSize int) (items []*EnglishReportList, err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	//产品权限
-	companyTypeSqlStr := ``
-	if companyType == "ficc" {
-		companyTypeSqlStr = " AND classify_id_first != 40 "
-	} else if companyType == "权益" {
-		companyTypeSqlStr = " AND classify_id_first = 40 "
-	}
-
-	sql := `SELECT * 
-        FROM english_report WHERE 1=1  ` + companyTypeSqlStr
-	if condition != "" {
-		sql += condition
-	}
-	sql += `ORDER BY state ASC, modify_time DESC LIMIT ?,?`
-	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
-	return
-}
-
-func GetEnglishReportByCondition(condition string, pars []interface{}) (items []*EnglishReport, err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := `SELECT * 
-        FROM english_report WHERE 1=1  `
-	if condition != "" {
-		sql += condition
-	}
-	_, err = o.Raw(sql, pars).QueryRows(&items)
-	return
-}
-
-// 发布报告
-func PublishEnglishReportById(reportId int) (err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := `UPDATE english_report SET state=2,publish_time=now(),modify_time=NOW() WHERE id = ? `
-	_, err = o.Raw(sql, reportId).Exec()
-	return
-}
-
-// 取消发布报告
-func PublishCancelEnglishReport(reportIds int) (err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := ` UPDATE english_report SET state=1,publish_time=null WHERE id =?  `
-	_, err = o.Raw(sql, reportIds).Exec()
-	return
-}
-
-// DeleteEnglishReportAndChapter 删除报告及章节
-//func DeleteEnglishReportAndChapter(reportInfo *EnglishReportDetail) (err error) {
-//	reportId := reportInfo.Id
-//	if reportInfo.State == 2 {
-//		err = errors.New("报告已发布,不可删除")
-//		return
-//	}
-//	err = DeleteEnglishReport(reportId)
-//	if err != nil {
-//		err = errors.New("删除失败, Err: " + err.Error())
-//		return
-//	}
-//
-//	return
-//}
-
-// 删除报告
-func DeleteEnglishReport(reportIds int) (err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := ` DELETE FROM english_report WHERE id =? `
-	_, err = o.Raw(sql, reportIds).Exec()
-	return
-}
-
-func EditEnglishReportContent(reportId int, content, contentSub string) (err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := ` UPDATE english_report SET content=?,content_sub=?,modify_time=NOW() WHERE id=? `
-	_, err = o.Raw(sql, content, contentSub, reportId).Exec()
-	return
-}
-
-func AddEnglishReportSaveLog(reportId, adminId int, content, contentSub, adminName string) (err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := ` INSERT INTO english_report_save_log(report_id, content,content_sub,admin_id,admin_name) VALUES (?,?,?,?,?) `
-	_, err = o.Raw(sql, reportId, content, contentSub, adminId, adminName).Exec()
-	return
-}
-
 type EnglishClassifyList struct {
 	Id            int       `orm:"column(id);pk"`
 	ClassifyName  string    `description:"分类名称"`
 	Sort          int       `description:"排序"`
 	ParentId      int       `description:"父级分类id"`
+	RootId        int       `description:"一级分类ID"`
 	CreateTime    time.Time `description:"创建时间"`
 	ModifyTime    time.Time `description:"修改时间"`
 	ClassifyLabel string    `description:"分类标签"`
 	ShowType      int       `description:"展示类型:1-列表 2-专栏"`
 	IsShow        int       `description:"是否在小程序显示:1-显示 0-隐藏"`
-	ClassifyType  int       `description:"分类类型:0英文报告,1英文线上路演"`
-	EnPermissions []int     `description:"英文权限IDs"`
+	//ClassifyType  int       `description:"分类类型:0英文报告,1英文线上路演"`
+	EnPermissions []int `description:"英文权限IDs"`
 	Child         []*EnglishClassifyList
 }
 
@@ -384,84 +116,73 @@ type EnglishClassifyListResp struct {
 	Paging *paging.PagingItem `description:"分页数据"`
 }
 
-// 获取分类列表
-func GetEnglishClassifyList(startSize, pageSize int, keyWord string, classifyType int) (items []*EnglishClassifyList, err error) {
+// GetEnglishClassifyRootId 获取一级分类列表
+func GetEnglishClassifyRootId(startSize, pageSize int, keyWord string) (items []*EnglishClassifyList, err error) {
 	sql := ``
 	o := orm.NewOrmUsingDB("rddp")
 	if keyWord != "" {
 		sql = `SELECT * FROM (
-                   SELECT * FROM english_classify
-                   WHERE parent_id=0 AND classify_name LIKE '%` + keyWord + `%' AND classify_type = ?
+			                   SELECT * FROM english_classify
+                   WHERE parent_id=0 AND classify_name LIKE '%` + keyWord + `%'
                    UNION
                    SELECT * FROM english_classify
                    WHERE id IN(SELECT parent_id FROM english_classify
-                   WHERE parent_id>0 AND classify_name LIKE '%` + keyWord + `%') AND classify_type = ?
+                   WHERE parent_id>0 AND classify_name LIKE '%` + keyWord + `%')
                    )AS t
                    ORDER BY sort ASC,create_time ASC
                    LIMIT ?,? `
-		_, err = o.Raw(sql, classifyType, classifyType, startSize, pageSize).QueryRows(&items)
+		_, err = o.Raw(sql, startSize, pageSize).QueryRows(&items)
 	} else {
-		sql = `SELECT * FROM english_classify WHERE parent_id=0 AND classify_type = ? ORDER BY sort ASC,create_time ASC LIMIT ?,? `
-		_, err = o.Raw(sql, classifyType, startSize, pageSize).QueryRows(&items)
+		sql = `SELECT * FROM english_classify WHERE parent_id=0 ORDER BY sort ASC,create_time ASC LIMIT ?,? `
+		_, err = o.Raw(sql, startSize, pageSize).QueryRows(&items)
 	}
 	return
 }
 
-func GetEnglishClassifyListCount(keyWord string, classifyType int) (count int, err error) {
+func GetEnglishClassifyListCount(keyWord string) (count int, err error) {
 	sqlCount := ``
 	o := orm.NewOrmUsingDB("rddp")
 	if keyWord != "" {
 		sqlCount = `SELECT  COUNT(1) AS count FROM (
                SELECT * FROM english_classify
-               WHERE parent_id=0 AND classify_name LIKE '%` + keyWord + `%' AND classify_type = ?
+               WHERE parent_id=0 AND classify_name LIKE '%` + keyWord + `%'
                UNION
                SELECT * FROM english_classify
                WHERE id IN(SELECT parent_id FROM english_classify
-               WHERE parent_id>0 AND classify_name LIKE '%` + keyWord + `%' AND classify_type = ?)
+               WHERE parent_id>0 AND classify_name LIKE '%` + keyWord + `%')
                )AS t `
-		err = o.Raw(sqlCount, classifyType, classifyType).QueryRow(&count)
+		err = o.Raw(sqlCount).QueryRow(&count)
 	} else {
-		sqlCount = `SELECT COUNT(1) AS count FROM english_classify WHERE parent_id=0 AND classify_type = ?`
-		err = o.Raw(sqlCount, classifyType).QueryRow(&count)
+		sqlCount = `SELECT COUNT(1) AS count FROM english_classify WHERE parent_id=0`
+		err = o.Raw(sqlCount).QueryRow(&count)
 	}
 
 	return
 }
 
-func GetEnglishClassifyChild(parentId int, keyWord string, classifyType int) (items []*EnglishClassify, err error) {
-	o := orm.NewOrmUsingDB("rddp")
+func GetEnglishClassifyListByRootId(rootIds []int, keyWord string) (items []*EnglishClassifyList, err error) {
 	sql := ``
-	if keyWord != "" {
-		sql = `SELECT * FROM english_classify WHERE parent_id=? AND classify_type = ? AND classify_name LIKE '%` + keyWord + `%' ORDER BY create_time ASC `
-	} else {
-		sql = `SELECT * FROM english_classify WHERE parent_id=? AND classify_type = ? ORDER BY create_time ASC `
-	}
-	_, err = o.Raw(sql, parentId, classifyType).QueryRows(&items)
-	return
-}
-
-func GetEnglishClassifyChildByParentIds(parentIds []int, keyWord string, classifyType int) (items []*EnglishClassifyList, err error) {
 	o := orm.NewOrmUsingDB("rddp")
-	sql := ``
 	if keyWord != "" {
-		sql = `SELECT * FROM english_classify WHERE parent_id IN (` + utils.GetOrmInReplace(len(parentIds)) + `) AND classify_type = ? AND classify_name LIKE '%` + keyWord + `%' ORDER BY create_time ASC `
+		sql = `SELECT
+	a.*
+FROM
+	english_classify a
+	LEFT JOIN english_classify b ON a.root_id = b.id
+	LEFT JOIN english_classify c ON a.parent_id = c.id
+	WHERE a.parent_id > 0 and a.classify_name LIKE '%` + keyWord + `%' and a.root_id IN (` + utils.GetOrmInReplace(len(rootIds)) + `)`
+		_, err = o.Raw(sql, rootIds).QueryRows(&items)
 	} else {
-		sql = `SELECT * FROM english_classify WHERE parent_id IN (` + utils.GetOrmInReplace(len(parentIds)) + `) AND classify_type = ? ORDER BY create_time ASC `
+		sql = `SELECT * FROM english_classify WHERE parent_id > 0 and root_id IN (` + utils.GetOrmInReplace(len(rootIds)) + `) `
+		_, err = o.Raw(sql, rootIds).QueryRows(&items)
 	}
-	_, err = o.Raw(sql, parentIds, classifyType).QueryRows(&items)
 	return
 }
 
-func GetEnglishReportDetailByClassifyId(classifyIdFirst, classifyIdSecond int) (item *EnglishReport, err error) {
+func GetEnglishClassifyChildByIds(ids []int) (items []*EnglishClassifyList, err error) {
 	o := orm.NewOrmUsingDB("rddp")
-	sql := ` SELECT * FROM english_report WHERE 1=1 `
-	if classifyIdSecond > 0 {
-		sql = sql + ` AND classify_id_second=?   ORDER BY stage DESC LIMIT 1`
-		err = o.Raw(sql, classifyIdSecond).QueryRow(&item)
-	} else {
-		sql = sql + ` AND classify_id_first=?   ORDER BY stage DESC LIMIT 1`
-		err = o.Raw(sql, classifyIdFirst).QueryRow(&item)
-	}
+	sql := `SELECT * FROM english_classify WHERE id IN (` + utils.GetOrmInReplace(len(ids)) + `) ORDER BY create_time ASC `
+	_, err = o.Raw(sql, ids).QueryRows(&items)
 	return
 }
 
@@ -472,117 +193,17 @@ func (item *EnglishReport) Update(cols []string) (err error) {
 	return
 }
 
-// ModifyEnglishReportAuthor 更改英文报告作者
-func ModifyEnglishReportAuthor(condition string, pars []interface{}, authorName string) (count int, err error) {
-	//产品权限
-	oRddp := orm.NewOrmUsingDB("rddp")
-	sql := `UPDATE english_report set author = ? WHERE 1=1 `
-	if condition != "" {
-		sql += condition
-	}
-	err = oRddp.Raw(sql, authorName, pars).QueryRow(&count)
-	return
-}
-
 type EnglishClassify struct {
 	Id            int       `orm:"column(id);pk"`
 	ClassifyName  string    `description:"分类名称"`
 	Sort          int       `description:"排序"`
 	ParentId      int       `description:"父级分类id"`
+	RootId        int       `description:"一级分类ID"`
 	CreateTime    time.Time `description:"创建时间"`
 	ModifyTime    time.Time `description:"修改时间"`
 	ClassifyLabel string    `description:"分类标签"`
 	ShowType      int       `description:"展示类型:1-列表 2-专栏"`
 	IsShow        int       `description:"是否在小程序显示:1-显示 0-隐藏"`
-	ClassifyType  int       `description:"分类类型:0英文报告,1英文线上路演"`
-}
-
-func AddEnglishClassify(item *EnglishClassify) (lastId int64, err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	lastId, err = o.Insert(item)
-	return
-}
-
-func ModifyEnglishClassify(item *EnglishClassify) (err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := `UPDATE english_classify
-	SET
-	classify_name = ?,
-	sort = ?,
-	parent_id = ?,
-	modify_time = ? 
-	WHERE id = ? `
-	_, err = o.Raw(sql, item.ClassifyName, item.Sort, item.ParentId, item.ModifyTime, item.Id).Exec()
-	return
-}
-
-// UpdateClassify 更新分类
-func (classifyInfo *EnglishClassify) UpdateEnglishClassify(cols []string) (err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	_, err = o.Update(classifyInfo, cols...)
-
-	return
-}
-
-// DeleteEnglishClassify 删除英文分类
-func DeleteEnglishClassify(classifyId int) (err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := ` DELETE FROM english_classify WHERE id =? `
-	_, err = o.Raw(sql, classifyId).Exec()
-	return
-}
-
-func GetEnglishClassifyChildCounts(parentId int) (count int, err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := `SELECT COUNT(1) AS count FROM english_classify WHERE parent_id=? `
-	err = o.Raw(sql, parentId).QueryRow(&count)
-	return
-}
-
-func GetEnglishReportCounts(classifyId, parentId int) (count int, err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := ``
-	if parentId == 0 {
-		sql = `SELECT COUNT(1) AS count FROM english_report WHERE classify_id_first=? `
-	} else {
-		sql = `SELECT COUNT(1) AS count FROM english_report WHERE classify_id_second=? `
-	}
-	err = o.Raw(sql, classifyId).QueryRow(&count)
-	return
-}
-
-func GetEnglishClassifyCountsByName(name string, parentId int, classifyType int) (count int, err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := `SELECT COUNT(1) AS count FROM english_classify WHERE classify_name=? AND parent_id = ? AND classify_type = ? `
-	err = o.Raw(sql, name, parentId, classifyType).QueryRow(&count)
-	return
-}
-
-// 获取分类列表
-func GetEnglishFirstClassifyList(classifyType, startSize, pageSize int) (items []*EnglishClassifyList, err error) {
-	sql := ``
-
-	sql = `SELECT * FROM english_classify WHERE parent_id=0 AND classify_type = ?  ORDER BY sort ASC,create_time ASC LIMIT ?,? `
-
-	o := orm.NewOrmUsingDB("rddp")
-	_, err = o.Raw(sql, classifyType, startSize, pageSize).QueryRows(&items)
-	return
-}
-
-func GetEnglishFirstClassifyListCount(classifyType int) (count int, err error) {
-	sqlCount := ``
-	sqlCount = `SELECT COUNT(1) AS count FROM english_classify WHERE parent_id=0 AND classify_type = ? `
-
-	o := orm.NewOrmUsingDB("rddp")
-	err = o.Raw(sqlCount, classifyType).QueryRow(&count)
-	return
-}
-
-func GetEnglishReportClassifyById(classifyId int) (item *EnglishClassify, err error) {
-	sql := `SELECT * FROM english_classify WHERE id=?`
-	o := orm.NewOrmUsingDB("rddp")
-	err = o.Raw(sql, classifyId).QueryRow(&item)
-	return
 }
 
 func GetEnglishReportClassifyByIds(classifyIds []int) (list []*EnglishClassify, err error) {
@@ -592,38 +213,6 @@ func GetEnglishReportClassifyByIds(classifyIds []int) (list []*EnglishClassify,
 	return
 }
 
-// UpdateEnglishReportSecondClassifyNameByClassifyId 更新报告分类名称字段
-func UpdateEnglishReportSecondClassifyNameByClassifyId(classifyId int, classifyName string) (err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := " UPDATE english_report SET classify_name_second = ? WHERE classify_id_second = ? "
-	_, err = o.Raw(sql, classifyName, classifyId).Exec()
-	return
-}
-
-// UpdateEnglishReportFirstClassifyNameByClassifyId 更新报告分类名称字段
-func UpdateEnglishReportFirstClassifyNameByClassifyId(classifyId int, classifyName string) (err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := " UPDATE english_report SET classify_name_first = ? WHERE classify_id_first = ? "
-	_, err = o.Raw(sql, classifyName, classifyId).Exec()
-	return
-}
-
-// UpdateEnglishReportFirstClassifyNameByClassifyId 更新报告分类名称字段
-func UpdateEnglishReportByClassifyId(classifyFirstName, classifySecondName string, firstClassifyId, secondClassifyId int, ids string) (err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := " UPDATE english_report SET classify_name_first = ?,classify_name_second = ?,classify_id_first=?, classify_id_second =?  WHERE id IN (" + ids + ") "
-	_, err = o.Raw(sql, classifyFirstName, classifySecondName, firstClassifyId, secondClassifyId).Exec()
-	return
-}
-
-// FetchEnglishReportById 主键获取英文报告
-func FetchEnglishReportById(reportId int) (item *EnglishReport, err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := `SELECT * FROM english_report WHERE id=?`
-	err = o.Raw(sql, reportId).QueryRow(&item)
-	return
-}
-
 // UpdateReport 更新英文报告
 func (reportInfo *EnglishReport) UpdateReport(cols []string) (err error) {
 	o := orm.NewOrmUsingDB("rddp")
@@ -632,14 +221,6 @@ func (reportInfo *EnglishReport) UpdateReport(cols []string) (err error) {
 	return
 }
 
-// GetAllEnglishClassify 获取所有英文分类
-func GetAllEnglishClassify(classifyType int) (list []*Classify, err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := ` SELECT * FROM english_classify where classify_type = ? `
-	_, err = o.Raw(sql, classifyType).QueryRows(&list)
-	return
-}
-
 // GetEnglishReportByIds 根据IDs获取英文报告列表
 func GetEnglishReportByIds(reportIds []int, fieldArr []string) (list []*EnglishReport, err error) {
 	listLen := len(reportIds)
@@ -662,26 +243,6 @@ type MarkEditEnReport struct {
 	Status   int `description:"标记状态,1:编辑中,2:编辑完成"`
 }
 
-type EnglishClassifyNameParentName struct {
-	Id                 int       `description:"分类ID"`
-	ClassifyName       string    `description:"分类名称"`
-	Sort               int       `description:"排序"`
-	ParentId           int       `description:"父级分类id"`
-	CreateTime         time.Time `description:"创建时间"`
-	ModifyTime         time.Time `description:"修改时间"`
-	ClassifyLabel      string    `description:"分类标签"`
-	ShowType           int       `description:"展示类型:1-列表 2-专栏"`
-	IsShow             int       `description:"是否在小程序显示:1-显示 0-隐藏"`
-	ParentClassifyName string    `description:"父级分类名称"`
-}
-
-func GetEnglishClassifyByClassifyNameAndParentName(parentClassiyName, classifyName string) (item EnglishClassifyNameParentName, err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := "SELECT c1.*, c2.classify_name as parent_classify_name FROM english_classify c1 LEFT JOIN english_classify c2 on c1.parent_id = c2.id where c1.parent_id > 0 and c2.classify_name = ? and c1.classify_name= ?"
-	err = o.Raw(sql, parentClassiyName, classifyName).QueryRow(&item)
-	return
-}
-
 type RSClassifyList []*EnglishClassifyList
 
 func (m RSClassifyList) Len() int {
@@ -710,10 +271,30 @@ func (m RSChildClassifyList) Swap(i, j int) {
 	m[i], m[j] = m[j], m[i]
 }
 
-// GetEnglishClassifyByClassifyNameParentId 获取英文分类
-func GetEnglishClassifyByClassifyNameParentId(classifyName string, parentId, classifyType int) (item *Classify, err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := ` SELECT * FROM english_classify where classify_name = ? and parent_id = ? and classify_type = ? `
-	err = o.Raw(sql, classifyName, parentId, classifyType).QueryRow(&item)
+type EnglishClassifyFullName struct {
+	Id           int    `description:"分类ID"`
+	ParentId     int    `description:"父级分类id"`
+	RootId       int    `description:"一级分类ID"`
+	RootName     string `description:"一级分类名"`
+	ParentName   string `description:"二级分类名"`
+	ClassifyName string `description:"分类名称"`
+}
+
+// GetEnglishClassifyFullNameByIds 获取英文分类名一级/二级/三级
+func GetEnglishClassifyFullNameByIds(classifyIds []int) (list []*EnglishClassifyFullName, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := ` SELECT
+	a.id,
+	a.parent_id,
+	a.root_id,
+	a.classify_name,
+	b.classify_name AS root_name,
+	c.classify_name AS parent_name 
+FROM
+	english_classify a
+	LEFT JOIN english_classify b ON a.root_id = b.id
+	LEFT JOIN english_classify c ON a.parent_id = c.id 
+where a.id IN (` + utils.GetOrmInReplace(len(classifyIds)) + `)`
+	_, err = o.Raw(sql, classifyIds).QueryRows(&list)
 	return
 }

+ 1 - 0
models/english_report_email.go

@@ -187,6 +187,7 @@ type EnglishReportEmailSendReq struct {
 	EmailIds      string `description:"邮箱IDs"`
 	Theme         string `description:"邮件主题"`
 	EnPermissions []int  `description:"品种权限IDs"`
+	NoCompanyIds  []int  `description:"禁止接收邮件的英文客户IDs"`
 }
 
 // EnglishReportEmailConf 英文研报邮件配置

+ 3 - 0
models/english_video.go

@@ -170,6 +170,9 @@ type EnglishVideoList struct {
 	Overview           string `description:"英文概述部分"`
 	AdminId            int    `description:"上传视频的管理员账号"`
 	AdminRealName      string `description:"上传视频的管理员姓名"`
+	FullClassifyName   string `description:"顶级分类名/父级分类名/当前分类名"`
+	ClassifyIdRoot     int    `description:"顶级分类id"`
+	ClassifyNameRoot   string `description:"顶级分类名称"`
 }
 
 type EnglishVideoListResp struct {

+ 118 - 0
models/eta_business/eta_business_config_relate.go

@@ -0,0 +1,118 @@
+package eta_business
+
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strings"
+)
+
+// EtaBusinessConfigRelate ETA商家菜单api关联表
+type EtaBusinessConfigRelate struct {
+	Id            int `orm:"column(id);pk"`
+	EtaBusinessId int `description:"商家ID"`
+	ConfigCode    string `description:"配置编码"`
+	ConfigValue   string `description:"配置值"`
+}
+
+func (m *EtaBusinessConfigRelate) TableName() string {
+	return "eta_business_config_relate"
+}
+
+func (m *EtaBusinessConfigRelate) PrimaryId() string {
+	return "id"
+}
+
+
+func (m *EtaBusinessConfigRelate) CreateMulti(businessId int, items []*EtaBusinessConfigRelate) (err error) {
+	if businessId == 0 {
+		return
+	}
+	o := orm.NewOrm()
+	tx, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = tx.Rollback()
+			return
+		}
+		_ = tx.Commit()
+	}()
+
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE eta_business_id = ?`, m.TableName())
+	_, err = tx.Raw(sql, businessId).Exec()
+	if err != nil {
+		return
+	}
+
+	if len(items) > 0 {
+		_, err = tx.InsertMulti(len(items), items)
+	}
+	return
+}
+
+func (m *EtaBusinessConfigRelate) Update(cols []string) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Update(m, cols...)
+	return
+}
+
+
+func (m *EtaBusinessConfigRelate) GetItemById(id int) (item *EtaBusinessConfigRelate, err error) {
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())
+	err = o.Raw(sql, id).QueryRow(&item)
+	return
+}
+
+func (m *EtaBusinessConfigRelate) GetItemByCondition(condition string, pars []interface{}) (item *EtaBusinessConfigRelate, err error) {
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s LIMIT 1`, m.TableName(), condition)
+	err = o.Raw(sql, pars).QueryRow(&item)
+	return
+}
+
+func (m *EtaBusinessConfigRelate) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+func (m *EtaBusinessConfigRelate) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*EtaBusinessConfigRelate, err error) {
+	o := orm.NewOrm()
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := ``
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+func (m *EtaBusinessConfigRelate) GetPageItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, startSize, pageSize int) (items []*EtaBusinessConfigRelate, err error) {
+	o := orm.NewOrm()
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := ``
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s LIMIT ?,?`, fields, m.TableName(), condition, order)
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+// EtaBusinessConfigRelateSaveReq 保存商家菜单关联
+type EtaBusinessConfigRelateSaveReq struct {
+	EtaBusinessId int   `description:"商家ID"`
+	MenuIds       []int `description:"菜单IDs"`
+	HalfMenuIds   []int `description:"半选菜单IDs-仅供前端回显用的"`
+}

+ 17 - 0
models/eta_business/eta_business_menu.go

@@ -208,3 +208,20 @@ type EtaBusinessMenuEditReq struct {
 type EtaBusinessMenuRemoveReq struct {
 	MenuId int
 }
+
+// BusinessConf 商户配置表
+type BusinessConf struct {
+	ConfKey string `description:"配置Key"`
+	ConfVal string `description:"配置值"`
+}
+
+// SetBusinessConfReq 设置用户的配置
+type SetBusinessConfReq struct {
+	EtaBusinessId int `description:"商家ID"`
+	List          []BusinessConfReq
+}
+
+type BusinessConfReq struct {
+	ConfigCode  string `description:"配置编码"`
+	ConfigValue string `description:"配置值"`
+}

+ 1 - 1
models/yb/apply_record.go

@@ -158,7 +158,7 @@ SELECT
 	y.is_move,
 	y.source,
 	y.from_page,
-	IF(y.mark_group = '' OR y.mark_group IS NULL, a.mark_group, y.mark_group) AS mark_group,
+	IF(y.mark_group = '' OR y.mark_group IS NULL OR y.apply_record_id = 0 OR y.apply_record_id IS NULL , a.mark_group, y.mark_group) AS mark_group,
     y.company_name as user_company_name
     #bp.seller_id,
 	#bp.seller_name

+ 180 - 0
routers/commentsRouter.go

@@ -565,6 +565,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ActivityCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ActivityCoAntroller"],
+        beego.ControllerComments{
+            Method: "TopeChange",
+            Router: `/activity/tope_change`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ActivityLossCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ActivityLossCoAntroller"],
         beego.ControllerComments{
             Method: "CompanyList",
@@ -1249,6 +1258,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ActivityVideoCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ActivityVideoCoAntroller"],
+        beego.ControllerComments{
+            Method: "VoiceAndVideoCommentList",
+            Router: `/activity_voice_and_video/commentList`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ActivityVideoCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ActivityVideoCoAntroller"],
+        beego.ControllerComments{
+            Method: "ActivityVoiceAndVideoList",
+            Router: `/activity_voice_and_video/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:AdviceController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:AdviceController"],
         beego.ControllerComments{
             Method: "List",
@@ -1276,6 +1303,60 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:AskserieVideoController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:AskserieVideoController"],
+        beego.ControllerComments{
+            Method: "CollectionList",
+            Router: `/askserie_video/collection_list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:AskserieVideoController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:AskserieVideoController"],
+        beego.ControllerComments{
+            Method: "Detail",
+            Router: `/askserie_video/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:AskserieVideoController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:AskserieVideoController"],
+        beego.ControllerComments{
+            Method: "HistoryList",
+            Router: `/askserie_video/history_list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:AskserieVideoController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:AskserieVideoController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/askserie_video/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:AskserieVideoController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:AskserieVideoController"],
+        beego.ControllerComments{
+            Method: "PreserveAndPublish",
+            Router: `/askserie_video/preserveAndEdit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:AskserieVideoController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:AskserieVideoController"],
+        beego.ControllerComments{
+            Method: "PublishReport",
+            Router: `/askserie_video/publishAndcancel`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:BannerCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:BannerCoAntroller"],
         beego.ControllerComments{
             Method: "PreserveAndPublish",
@@ -1969,6 +2050,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:MorningMeetingController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:MorningMeetingController"],
+        beego.ControllerComments{
+            Method: "ListPv",
+            Router: `/morningMeeting/list_pv`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:MorningMeetingController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:MorningMeetingController"],
         beego.ControllerComments{
             Method: "PreserveAndPublish",
@@ -2059,6 +2149,60 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:QuestionnaireController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:QuestionnaireController"],
+        beego.ControllerComments{
+            Method: "Detail",
+            Router: `/questionnaire/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:QuestionnaireController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:QuestionnaireController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/questionnaire/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:QuestionnaireController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:QuestionnaireController"],
+        beego.ControllerComments{
+            Method: "PreserveAndPublish",
+            Router: `/questionnaire/preserveAndEdit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:QuestionnaireController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:QuestionnaireController"],
+        beego.ControllerComments{
+            Method: "VoteDetail",
+            Router: `/questionnaire/vote_detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:QuestionnaireController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:QuestionnaireController"],
+        beego.ControllerComments{
+            Method: "VoteList",
+            Router: `/questionnaire/vote_list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:QuestionnaireController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:QuestionnaireController"],
+        beego.ControllerComments{
+            Method: "VoteOther",
+            Router: `/questionnaire/vote_other`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ReportArticleController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:ReportArticleController"],
         beego.ControllerComments{
             Method: "ExportList",
@@ -2644,6 +2788,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:TagManagementController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:TagManagementController"],
+        beego.ControllerComments{
+            Method: "TagHotActivityList",
+            Router: `/tag/hot_activity/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:TagManagementController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:TagManagementController"],
+        beego.ControllerComments{
+            Method: "TagHotActivityUpdate",
+            Router: `/tag/hot_activity/update`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:TagManagementController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:TagManagementController"],
         beego.ControllerComments{
             Method: "IndustrialManagementlistByName",
@@ -6658,6 +6820,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/eta_business:EtaBusinessMenuController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/eta_business:EtaBusinessMenuController"],
+        beego.ControllerComments{
+            Method: "SystemApiConfig",
+            Router: `/api/config/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/eta_business:EtaBusinessMenuController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/eta_business:EtaBusinessMenuController"],
+        beego.ControllerComments{
+            Method: "SystemApiConfigSet",
+            Router: `/api/config/set`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/eta_business:EtaBusinessMenuController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/eta_business:EtaBusinessMenuController"],
         beego.ControllerComments{
             Method: "Add",

+ 2 - 0
routers/router.go

@@ -155,6 +155,8 @@ func init() {
 				&cygx.TagManagementController{},
 				&cygx.YanxuanSpecialController{},
 				&cygx.ContractAllocationController{},
+				&cygx.QuestionnaireController{},
+				&cygx.AskserieVideoController{},
 			),
 		),
 		web.NSNamespace("/advisory",

+ 11 - 1
services/company_permission.go

@@ -70,6 +70,8 @@ func RaiCompanyPermissionAndCheckList(companyId int, unify bool) (resp *company.
 			if v.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN && strings.Contains("正式,永续", v.Status) {
 				if p.ExpensiveYx == 1 {
 					v.PermissionName = fmt.Sprint(v.PermissionName, "(5w)")
+				} else if p.ExpensiveYx == 2 {
+					v.PermissionName = fmt.Sprint(v.PermissionName, "(10w)")
 				} else {
 					v.PermissionName = fmt.Sprint(v.PermissionName, "(3w)")
 				}
@@ -295,13 +297,21 @@ func CheckCompanyUpgradeV2(strPermissionIds string, isRai bool) (newPermissions
 			continue
 		}
 		// 买方研选5w
-		if p > utils.PERMISSION_ID_YANXUAN_DIFF {
+		if p > utils.PERMISSION_ID_YANXUAN_DIFF && p < utils.PERMISSION_ID_YANXUAN_10W_DIFF {
 			o := p - utils.PERMISSION_ID_YANXUAN_DIFF
 			expensiveMap[o] = 1
 			existsId[o] = true
 			newPermissionArr = append(newPermissionArr, strconv.Itoa(o))
 			continue
 		}
+		// 买方研选10w
+		if p == utils.PERMISSION_ID_YANXUAN_10W_DIFF {
+			o := utils.PERMISSION_ID_YANXUAN_10W_DIFF
+			expensiveMap[o] = 1
+			existsId[o] = true
+			newPermissionArr = append(newPermissionArr, strconv.Itoa(o))
+			continue
+		}
 		// 非升级权限
 		existsId[p] = true
 		newPermissionArr = append(newPermissionArr, strconv.Itoa(p))

+ 2 - 1
services/cygx/acitvity.go

@@ -827,7 +827,7 @@ func IsShowAppointmentByadminSet(IsCanAppointmentMinutes int) (isShowAppointment
 }
 
 //func init() {
-//	DoActivityOnenIdWxTemplateMsg(2621)
+//	DoActivityOnenIdWxTemplateMsg(2703)
 //}
 
 // 处理活动是否进行模板消息推送
@@ -987,6 +987,7 @@ func DoActivityOnenIdWxTemplateMsg(activityId int) (err error) {
 		}
 		var conditionPer string
 		var parsPer []interface{}
+		companyIdsRecord = append(companyIdsRecord, 0)
 		conditionPer = ` AND r.company_id IN (  ` + utils.GetOrmInReplace(len(companyIdsRecord)) + `) `
 		parsPer = append(parsPer, companyIdsRecord)
 		companyReportPermissionItemList, e := cygx.GetCompanyReportPermissionItem(conditionPer, parsPer)

+ 73 - 19
services/cygx/activity_ocr.go

@@ -175,6 +175,21 @@ 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
+		}
+		//易董办会的分析师电话会,为路演回放
+		if (activityInfo.ActivityTypeId == 2 || activityInfo.ActivityTypeId == 7) && activityInfo.IsYidongConduct == 1 {
+			itemVoice.FileType = 1
+		} else {
+			itemVoice.FileType = 2
+		}
+
 		//如果等于0就新增,反之就修改
 		if total == 0 {
 			newId, e := cygx.AddCygxActivityVoice(itemVoice)
@@ -182,14 +197,41 @@ func UpdateActivityVideoAndVoice(activityInfo *cygx.ActivityDetail, itemVoice *c
 				err = errors.New("GetCygxActivityVoiceCount" + e.Error())
 				return
 			}
-			go UpdateResourceData(int(newId), utils.CYGX_OBJ_ACTIVITYVOICE, "add", activityInfo.ActivityTime) // 把活动音频的数据添加到 cygx_resource_data 表
+			go UpdateActivityVoiceResourceData(int(newId)) //写入首页最新  cygx_resource_data 表
+
+			go SendWxMsgWithUpdateActivityVideoAndVoice(activityId, itemVoice.VoiceName) //  已结束的活动上传音频或视频后给已关注这个活动关联的产业的正式、试用 客户发送模板信息
 		} else {
+			//获取音频详情
+			voiceDetail, e := cygx.GetCygxActivityVoiceReqDetailByActivityId(activityId)
+			if e != nil {
+				err = errors.New("GetCygxActivityVoiceReqDetail" + e.Error())
+				return
+			}
+			//手动修改过的,二次编辑,文件类型不变
+			if voiceDetail.IsByHand == 1 {
+				itemVoice.FileType = voiceDetail.FileType
+			}
 			e = cygx.UpdateCygxActivityVoice(itemVoice)
 			if e != nil {
 				err = errors.New("UpdateCygxActivityVoice" + e.Error())
 				return
 			}
 		}
+	} else {
+		voiceDetail, e := cygx.GetCygxActivityVoiceReqDetail(activityId)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			err = errors.New("GetCygxActivityVoiceReqDetail" + e.Error())
+			return
+		}
+		if voiceDetail != nil {
+			e = cygx.DeleteCygxActivityVoice(activityId)
+			if e != nil {
+				err = errors.New("DeleteCygxActivityVoice" + e.Error())
+				return
+			}
+
+			go UpdateActivityVoiceResourceData(voiceDetail.ActivityVoiceId) //写入首页最新  cygx_resource_data 表
+		}
 	}
 
 	//处理视频
@@ -201,6 +243,23 @@ 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
+		}
+		//易董办会的分析师电话会,为路演回放
+		if (activityInfo.ActivityTypeId == 2 || activityInfo.ActivityTypeId == 7) && activityInfo.IsYidongConduct == 1 {
+			itemVideo.FileType = 1
+		} else {
+			itemVideo.FileType = 2
+		}
+		//视频文件更换阿里云oss地址 避免卡顿
+		var newOssUrl string
+		newOssUrl = strings.Replace(itemVideo.VideoUrl, "https://hzstatic.hzinsights.com", "https://hzchart.oss-accelerate.aliyuncs.com", -1)
+		itemVideo.VideoUrl = newOssUrl
 		//如果等于0就新增,反之就修改
 		if total == 0 {
 			newId, e := cygx.AddCygxActivityVideo(itemVideo)
@@ -208,32 +267,27 @@ func UpdateActivityVideoAndVoice(activityInfo *cygx.ActivityDetail, itemVoice *c
 				err = errors.New("AddCygxActivityVideo" + e.Error())
 				return
 			}
-			go UpdateResourceData(int(newId), utils.CYGX_OBJ_ACTIVITYVIDEO, "add", activityInfo.ActivityTime) // 把活动视频的数据添加到 cygx_resource_data 表
+			go UpdateActivityVideoResourceData(int(newId))                               //写入首页最新  cygx_resource_data 表
+			go SendWxMsgWithUpdateActivityVideoAndVoice(activityId, itemVideo.VideoName) //  已结束的活动上传音频或视频后给已关注这个活动关联的产业的正式、试用 客户发送模板信息
 		} else {
-			e = cygx.UpdateCygxActivityVideo(itemVideo)
+			//获取视频详情
+			videoDetail, e := cygx.GetCygxActivityVideoReqDetail(activityId)
 			if e != nil {
-				err = errors.New("UpdateCygxActivityVideo" + e.Error())
+				err = errors.New("GetCygxActivityVideoReqDetail" + e.Error())
 				return
 			}
-		}
-	}
+			//手动修改过的,二次编辑,文件类型不变
+			if videoDetail.IsByHand == 1 {
+				itemVideo.FileType = videoDetail.FileType
+			}
 
-	//如果两个都为空,就判断之前是否上传过
-	if itemVoice.ActivityId == 0 && itemVideo.ActivityId == 0 {
-		voiceDetail, e := cygx.GetCygxActivityVoiceReqDetail(activityId)
-		if e != nil && e.Error() != utils.ErrNoRow() {
-			err = errors.New("GetCygxActivityVoiceReqDetail" + e.Error())
-			return
-		}
-		if voiceDetail != nil {
-			e = cygx.DeleteCygxActivityVoice(activityId)
+			e = cygx.UpdateCygxActivityVideo(itemVideo)
 			if e != nil {
-				err = errors.New("DeleteCygxActivityVoice" + e.Error())
+				err = errors.New("UpdateCygxActivityVideo" + e.Error())
 				return
 			}
-			go UpdateResourceData(voiceDetail.ActivityVoiceId, utils.CYGX_OBJ_ACTIVITYVOICE, "delete", time.Now().Format(utils.FormatDateTime)) // 把活动音频在 cygx_resource_data 表中删除
 		}
-
+	} else {
 		//删除原有的视频数据
 		videoDetail, e := cygx.GetCygxActivityVideoReqDetail(activityId)
 		if e != nil && e.Error() != utils.ErrNoRow() {
@@ -246,7 +300,7 @@ func UpdateActivityVideoAndVoice(activityInfo *cygx.ActivityDetail, itemVoice *c
 				err = errors.New("DeleteCygxActivityVideo" + e.Error())
 				return
 			}
-			go UpdateResourceData(videoDetail.VideoId, utils.CYGX_OBJ_ACTIVITYVIDEO, "delete", time.Now().Format(utils.FormatDateTime)) // 把活动视频在 cygx_resource_data 表中删除
+			go UpdateActivityVideoResourceData(videoDetail.VideoId) //写入首页最新  cygx_resource_data 表
 		}
 	}
 	return

+ 1 - 0
services/cygx/activity_points_set.go

@@ -210,6 +210,7 @@ func UpdateYanXuanActivityPointsBillOldComapny(activityInfo *cygx.ActivityDetail
 
 // 1用户报名添加到处理研选扣点
 func YanXuanActivityPointsBillSignupAdd(activityId, uid, adminId int) (err error) {
+	time.Sleep(1 * time.Second) // 添加一秒的延时
 	defer func() {
 		if err != nil {
 			fmt.Println(err)

+ 115 - 0
services/cygx/activity_wx_msg.go

@@ -4,6 +4,7 @@ import (
 	"errors"
 	"fmt"
 	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/company"
 	"hongze/hz_crm_api/models/cygx"
 	"hongze/hz_crm_api/services"
 	"hongze/hz_crm_api/services/alarm_msg"
@@ -192,3 +193,117 @@ func SendWxMsgWithCygxActivitySignUpBySell(items []*cygx.CygxSignupUser) (err er
 	}
 	return
 }
+
+// 已结束的活动上传音频或视频后给已关注这个活动关联的产业的正式、试用 客户发送模板信息
+func SendWxMsgWithUpdateActivityVideoAndVoice(activityId int, fileName string) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("已结束的活动上传音频或视频后给已关注这个活动关联的产业的正式、试用 客户发送模板信息失败,Err:"+err.Error()+";activityId:", activityId), 3)
+			//utils.FileLogCygx.Info(fmt.Sprintf("发送模版消息失败,Err:%s,%s", err.Error(), msg))
+		}
+	}()
+	activityInfo, e := cygx.GetAddActivityInfoById(activityId)
+	if e != nil {
+		err = errors.New("活动不存在, Err: " + e.Error())
+		return
+	}
+	if activityInfo == nil {
+		return
+	}
+	industrialList, e := cygx.GetIndustrialActivityGroupListByactivityIds(strconv.Itoa(activityId))
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetIndustrialActivityGroupListByactivityIds: " + e.Error())
+		return
+	}
+
+	//if len(industrialList) == 0 {
+	//	return
+	//}
+
+	var industrialManagementIds []int
+
+	for _, v := range industrialList {
+		industrialManagementIds = append(industrialManagementIds, v.IndustrialManagementId)
+	}
+	lenindustrialManagementIds := len(industrialManagementIds)
+	if lenindustrialManagementIds == 0 {
+		return
+	}
+
+	var condition string
+	var pars []interface{}
+
+	//获取试用正式权益客户
+	condition = "  AND product_id = 2 AND `status` IN('正式','试用')  "
+	listCompany, e := company.GetCompanyProductList(condition, pars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCompanyProductList, Err: " + e.Error())
+		return
+	}
+	var companyIds []int
+	for _, v := range listCompany {
+		companyIds = append(companyIds, v.CompanyId)
+	}
+	lencompanyIds := len(companyIds)
+	if lencompanyIds == 0 {
+		return
+	}
+
+	//根据产业关注ID,与有权限的公司ID获取对应的用户列表
+	condition = " AND  industrial_management_id IN (" + utils.GetOrmInReplace(lenindustrialManagementIds) + ")  AND company_id IN (" + utils.GetOrmInReplace(lencompanyIds) + ") "
+	pars = append(pars, industrialManagementIds, companyIds)
+	userFllowList, e := cygx.GetCygxIndustryFllowList(condition, pars, 0, 0)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCygxIndustryFllowList, Err: " + e.Error())
+		return
+	}
+
+	//获取这些用户的手机号
+	var mobileArr []string
+	for _, v := range userFllowList {
+		mobileArr = append(mobileArr, v.Mobile)
+	}
+	mobileLen := len(mobileArr)
+	if mobileLen == 0 {
+		return
+	}
+
+	openIdList, e := cygx.GetUserRecordListByMobileArr(mobileArr)
+	if e != nil {
+		err = errors.New("GetWxOpenIdBList, Err: " + e.Error())
+		return
+	}
+	if len(openIdList) == 0 {
+		return
+	}
+	openIdArr := make([]string, len(openIdList))
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+
+	keyword1 := fileName
+	keyword2 := "路演回放已发布,欢迎查看"
+	keyword3 := ""
+	keyword4 := ""
+
+	redirectUrl := utils.WX_MSG_PATH_ACTIVITY_DETAIL + strconv.Itoa(activityId)
+	sendInfo := new(services.SendWxTemplate)
+	sendInfo.Keyword1 = keyword1
+	sendInfo.Keyword2 = keyword2
+	sendInfo.Keyword3 = keyword3
+	sendInfo.Keyword4 = keyword4
+
+	sendInfo.TemplateId = utils.WxMsgTemplateIdActivityChangeApplyXzs
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	sendInfo.Resource = strconv.Itoa(activityId)
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_LIMIT_PEOPLE
+	sendInfo.OpenIdArr = openIdArr
+	e = services.SendTemplateMsg(sendInfo)
+	if e != nil {
+		err = errors.New("SendTemplateMsg, Err: " + e.Error())
+		return
+	}
+	return
+}

+ 137 - 0
services/cygx/askserie_video.go

@@ -0,0 +1,137 @@
+package cygx
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/services/alarm_msg"
+	"hongze/hz_crm_api/utils"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// 获取问答系列产业列表
+func GetCygxAskserieVideoLabelListMap(askserieVideoIds []int) (mapResp map[int][]*cygx.IndustrialActivityGroupManagementRep) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg("获取产品内测的阅读数据,信息失败,GetCygxAskserieVideoLabelListMap Err:"+err.Error(), 3)
+		}
+	}()
+	lenArr := len(askserieVideoIds)
+	if lenArr == 0 {
+		return
+	}
+	industrialList, e := cygx.GetCygxIndustrialAskserieVideoGroupManagementList(askserieVideoIds)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("获取详情失败 GetCygxIndustrialAskserieVideoGroupManagementList Err" + e.Error())
+		return
+	}
+	mapResp = make(map[int][]*cygx.IndustrialActivityGroupManagementRep, 0)
+	for _, v := range industrialList {
+		item := new(cygx.IndustrialActivityGroupManagementRep)
+		item.IndustryName = v.IndustryName
+		item.IndustrialManagementId = v.IndustrialManagementId
+		item.ChartPermissionId = v.ChartPermissionId
+		mapResp[v.AskserieVideoId] = append(mapResp[v.AskserieVideoId], item)
+	}
+	return
+}
+
+// 获取问答系列产业列表
+func GetCygxAskserieVideoLabelMap(askserieVideoIds []int) (mapResp map[int]string) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg("获取产品内测的阅读数据,信息失败,GetCygxAskserieVideoLabelListMap Err:"+err.Error(), 3)
+		}
+	}()
+	lenArr := len(askserieVideoIds)
+	if lenArr == 0 {
+		return
+	}
+	industrialList, e := cygx.GetCygxIndustrialAskserieVideoGroupManagementList(askserieVideoIds)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("获取详情失败 GetCygxIndustrialAskserieVideoGroupManagementList Err" + e.Error())
+		return
+	}
+	mapIndustryName := make(map[int][]string)
+	mapResp = make(map[int]string, 0)
+	for _, v := range industrialList {
+		mapIndustryName[v.AskserieVideoId] = append(mapIndustryName[v.AskserieVideoId], v.IndustryName)
+	}
+
+	for k, v := range mapIndustryName {
+		mapResp[k] = strings.Join(v, ",")
+	}
+	return
+}
+
+//func init() {
+//	UpdateAskserieVideoResourceData(75)
+//}
+
+func init12() {
+	var conditionupload string
+	var pars []interface{}
+	conditionupload = " "
+	listVoice, err := cygx.GetActivityVoiceListNew(conditionupload, pars)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		fmt.Println(err)
+		return
+	}
+
+	for _, v := range listVoice {
+		activityId := v.ActivityId
+		var industrialManagementIds []string
+		industrialList, err := cygx.GetIndustrialActivityGroupManagementList(activityId, 1)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			fmt.Println(v.ActivityId)
+			fmt.Println(err)
+			return
+		}
+		for _, vi := range industrialList {
+			industrialManagementIds = append(industrialManagementIds, strconv.Itoa(vi.IndustrialManagementId))
+		}
+
+		activityInfo, err := cygx.GetAddActivityInfoById(activityId)
+		if err != nil {
+			fmt.Println(v.ActivityId)
+			fmt.Println(err)
+			return
+		}
+		if activityInfo != nil {
+
+			item := new(cygx.CygxAskserieVideo)
+			//item.AskserieVideoId = askserieVideoId
+			item.VideoName = v.VoiceName
+			item.VideoUrl = v.VoiceUrl
+			item.VideoDuration = v.VoicePlaySeconds
+			item.ChartPermissionId = activityInfo.ChartPermissionId
+			item.ChartPermissionName = activityInfo.ChartPermissionName
+			item.PublishStatus = 1
+			item.BackgroundImg = v.BackgroundImg
+			item.ShareImg = v.ShareImg
+			item.ActivityId = v.ActivityId
+			//item.AdminId = sysUser.AdminId
+			item.ModifyDate = time.Now()
+			item.PublishDate = utils.StrTimeToTime(activityInfo.ActivityTime)
+			item.CreateTime = time.Now()
+
+			fmt.Println(item.VideoDuration, "VideoDuration")
+			fmt.Println(item.ShareImg, "ShareImg")
+			fmt.Println(item.PublishDate, "PublishDate")
+			//fmt.Println(item, strings.Join(industrialManagementIds, ","))
+			//continue
+			newId, err := cygx.AddCygxAskserieVideo(item, strings.Join(industrialManagementIds, ","))
+			fmt.Println(newId)
+			if err != nil {
+				fmt.Println(err)
+				return
+			}
+		}
+	}
+}

+ 4 - 0
services/cygx/contract_allocation.go

@@ -115,6 +115,8 @@ func GetCompanyContractPermissionNameMapById(companyContractIds []int) (mapContr
 			if v.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
 				if v.ExpensiveYx == 1 {
 					mapContractIdPerssion[(v.CompanyContractId)] += utils.CHART_PERMISSION_NAME_MF_YANXUAN + "(5w),"
+				} else if v.ExpensiveYx == 2 {
+					mapContractIdPerssion[(v.CompanyContractId)] += utils.CHART_PERMISSION_NAME_MF_YANXUAN + "(10w),"
 				} else {
 					mapContractIdPerssion[(v.CompanyContractId)] += utils.CHART_PERMISSION_NAME_MF_YANXUAN + "(3w),"
 				}
@@ -264,6 +266,8 @@ func HandleAllocationCompanyContractByYanXuan(companyContractId int) (err error)
 		}
 		if v.ExpensiveYx == 1 {
 			expensiveYxmoney = 5
+		} else if v.ExpensiveYx == 2 {
+			expensiveYxmoney = 10
 		} else {
 			expensiveYxmoney = 3
 		}

+ 103 - 0
services/cygx/cygx_questionnaire.go

@@ -0,0 +1,103 @@
+package cygx
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/company"
+	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/services"
+	"hongze/hz_crm_api/services/alarm_msg"
+	"hongze/hz_crm_api/utils"
+	"strconv"
+)
+
+//func init() {
+//	SendWxMsgCygxQuestionnaire(2)
+//}
+
+// 投票发布时,给所有开通买方研选正式试用的客户
+func SendWxMsgCygxQuestionnaire(questionnaireId int) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("投票发布时,给所有开通买方研选正式试用的客户,questionnaireId:", questionnaireId, err.Error()), 2)
+		}
+	}()
+
+	//获取问卷详情
+	detail, e := cygx.GetCygxQuestionnaireDetail(questionnaireId)
+	if e != nil {
+		err = errors.New("GetCygxQuestionnaireDetail, Err: " + e.Error())
+		return
+	}
+
+	var keyword1 string
+	var keyword2 string
+	var keyword3 string
+	var keyword4 string
+	var companyIds []int
+
+	var condition string
+	var pars []interface{}
+	condition = "  AND  chart_permission_id = 31 AND `status` IN ('正式','试用')  "
+	//获取所有开通买方研选正式试用的客户列表
+	listCompany, e := company.GetCompanyReportPermissionList(condition, pars, 0, 0)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCygxQuestionnaireDetail, Err: " + e.Error())
+		return
+	}
+	for _, v := range listCompany {
+		companyIds = append(companyIds, v.CompanyId)
+	}
+
+	//获取相关的用户
+	userList, e := models.GetWxUserByCompanyIds(companyIds)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetWxUserByCompanyIds, Err: " + e.Error())
+		return
+	}
+	mobile := make([]string, 0)
+	for _, v := range userList {
+		mobile = append(mobile, v.Mobile)
+	}
+
+	//获取用户对应的Openid
+	openIdList, e := cygx.GetUserRecordListByMobileArr(mobile)
+	if e != nil {
+		err = errors.New("GetSellerByAdminId, Err: " + e.Error())
+		return
+	}
+
+	if len(openIdList) == 0 {
+		return
+	}
+	keyword1 = "买方研选【" + detail.ActivityTypeName + "】主题投票"
+	keyword2 = "请选择您感兴趣的主题"
+
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+	redirectUrl := ""
+	if utils.RunMode == "release" {
+		redirectUrl = utils.WX_MSG_PATH_QUESTIONNAIRE_DETAIL + strconv.Itoa(questionnaireId)
+	}
+	sendInfo := new(services.SendWxTemplate)
+	sendInfo.Keyword1 = keyword1
+	sendInfo.Keyword2 = keyword2
+	sendInfo.Keyword3 = keyword3
+	sendInfo.Keyword4 = keyword4
+	sendInfo.TemplateId = utils.WxMsgTemplateIdActivityChangeApplyXzs
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	sendInfo.Resource = strconv.Itoa(questionnaireId)
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
+	sendInfo.OpenIdArr = openIdArr
+	e = services.SendTemplateMsg(sendInfo)
+	if e != nil {
+		err = errors.New("SendTemplateMsg, Err: " + e.Error())
+		return
+	}
+	return
+}

+ 45 - 0
services/cygx/morning_meeting.go

@@ -0,0 +1,45 @@
+package cygx
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/services/alarm_msg"
+	"hongze/hz_crm_api/utils"
+)
+
+//func init() {
+//	fmt.Println(GetCygxMorningMeetingReviewChapterHistoryPvUvMap([]int{111}))
+//}
+
+// 根据ID获取pvUv
+func GetCygxMorningMeetingReviewChapterHistoryPvUvMap(articleIdArr []int) (mapPvResp, mapUvResp map[int]int) {
+	lenArr := len(articleIdArr)
+	if lenArr == 0 {
+		return
+	}
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg("根据文章ID获取文章行业分类,信息失败,GetCygxArticlePerssionNameListMap Err:"+err.Error(), 3)
+		}
+	}()
+	var condition string
+	var pars []interface{}
+
+	condition = ` AND  meeting_id IN (` + utils.GetOrmInReplace(lenArr) + `)`
+	pars = append(pars, articleIdArr)
+	list, e := cygx.GetCygxMorningMeetingReviewChapterHistoryPvUv(condition, pars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetArticlList, Err: " + e.Error())
+		return
+	}
+	mapPvResp = make(map[int]int, 0)
+	mapUvResp = make(map[int]int, 0)
+	for _, v := range list {
+		mapPvResp[v.ArticleId] = v.Pv
+		mapUvResp[v.ArticleId] = v.Uv
+	}
+	return
+}

+ 427 - 15
services/cygx/resource_data.go

@@ -26,7 +26,7 @@ import (
 //roadshow
 
 //func init() {
-//	UpdateMeetingreviewchaptResourceData(141)
+//	UpdateActivityResourceData(2703)
 //}
 
 // 更新活动
@@ -81,6 +81,7 @@ func UpdateActivityResourceData(sourceId int) {
 		item.Source = source
 		//分析师电话会(C类)
 		item.SearchTag = detail.ActivityTypeName
+		item.ChartPermissionId = detail.ChartPermissionId
 		item.PublishDate = publishDate
 		item.CreateTime = time.Now()
 		if totalData == 0 {
@@ -167,6 +168,11 @@ func UpdateActivitySpecialResourceData(sourceId int) {
 		err = errors.New("GetCygxReportSelection, Err: " + e.Error())
 		return
 	}
+	activityInfo, e := cygx.GetAddActivityInfoSpecialById(sourceId)
+	if e != nil {
+		err = errors.New("GetAddActivityInfoSpecialById, Err: " + e.Error())
+		return
+	}
 	//如果取消发布了就做删除处理
 	if total == 0 {
 		e = cygx.DeleteResourceData(sourceId, source)
@@ -195,6 +201,7 @@ func UpdateActivitySpecialResourceData(sourceId int) {
 		//分析师电话会(C类)
 		item.SearchTag = ""
 		item.PublishDate = publishDate
+		item.ChartPermissionId = activityInfo.ChartPermissionId
 		item.CreateTime = time.Now()
 		if totalData == 0 {
 			newId, e := cygx.AddCygxResourceData(item)
@@ -304,14 +311,22 @@ func UpdateArticleResourceData(sourceId int) {
 			err = errors.New("GetCygxReportSelectionInfoById, Err: " + e.Error())
 			return
 		}
+
 		var resourceDataId int
 		publishDate := time.Now().Format(utils.FormatDateTime)
 		item := new(cygx.CygxResourceData)
 		if detail.ArticleTypeId > 0 {
 			item.SearchTag = detail.ArticleTypeName // 研选类型名称
+			item.ChartPermissionId = utils.CHART_PERMISSION_ID_YANXUAN
 		} else {
 			item.SearchTag = detail.MatchTypeName
+			//获取文章分类详情
+			detailCategory, _ := cygx.GetCygxReportMappingCelueMaxDetailByCategoryId(detail.CategoryId)
+			if detailCategory != nil {
+				item.ChartPermissionId = detailCategory.ChartPermissionId
+			}
 		}
+
 		item.SourceId = sourceId
 		item.Source = source
 		item.PublishDate = publishDate
@@ -434,6 +449,7 @@ func UpdateProductInteriorResourceData(sourceId int) {
 		item.Source = source
 		item.SearchTag = mapMatchTypeName[detail.MatchTypeId]
 		item.PublishDate = publishDate
+		item.ChartPermissionId = detail.ChartPermissionId
 		item.CreateTime = time.Now()
 		if totalData == 0 {
 			newId, e := cygx.AddCygxResourceData(item)
@@ -548,6 +564,7 @@ func UpdateMeetingreviewchaptResourceData(sourceId int) {
 		item.Source = source
 		item.SearchTag = "晨会精华"
 		item.PublishDate = publishDate
+		item.ChartPermissionId = detail.ChartPermissionId
 		item.CreateTime = time.Now()
 		if totalData == 0 {
 			newId, e := cygx.AddCygxResourceData(item)
@@ -800,7 +817,293 @@ func UpdateMinutesSummaryResourceData(sourceId int) {
 	return
 }
 
-func init1123232() {
+// 更新活动音频
+func UpdateActivityVoiceResourceData(sourceId int) {
+	time.Sleep(1 * time.Second) // 添加1秒的延迟
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println("err:", err)
+			go alarm_msg.SendAlarmMsg("更新更新活动音频 失败,UpdateActivityVoiceResourceData Err:"+err.Error()+"资源ID"+strconv.Itoa(sourceId), 3)
+		}
+	}()
+	var source = utils.CYGX_OBJ_ACTIVITYVOICE
+
+	var condition string
+	var pars []interface{}
+	condition = ` AND activity_voice_id = ? `
+	pars = append(pars, sourceId)
+	total, e := cygx.GetCygxActivityVoiceCount(condition, pars)
+	if e != nil {
+		err = errors.New("GetCygxResearchSummary, Err: " + e.Error())
+		return
+	}
+	//如果取消发布了就做删除处理
+	if total == 0 {
+		e = cygx.DeleteResourceData(sourceId, source)
+		if e != nil {
+			err = errors.New("DeleteResourceData, Err: " + e.Error())
+			return
+		}
+	} else {
+		//获取音频详情
+		voiceDetail, e := cygx.GetCygxActivityVoiceReqDetailByActivityVoiceId(sourceId)
+		if e != nil {
+			err = errors.New("GetCygxActivityVoiceReqDetail" + e.Error())
+			return
+		}
+		activityId := voiceDetail.ActivityId
+		//获取活动详情
+		activityInfo, e := cygx.GetAddActivityInfoById(activityId)
+		if e != nil {
+			err = errors.New("GetAddActivityInfoById, Err: " + e.Error())
+			return
+		}
+		//判断是否存在,如果不存在就新增,存在就更新
+		totalData, e := cygx.GetCygxReportSelectionBySourceAndId(sourceId, source)
+		if e != nil {
+			err = errors.New("GetCygxReportSelectionBySourceAndId, Err: " + e.Error())
+			return
+		}
+		publishDate := time.Now().Format(utils.FormatDateTime)
+		item := new(cygx.CygxResourceData)
+		item.SourceId = sourceId
+		item.Source = source
+		//易董办会的分析师电话会,为路演回放
+		if voiceDetail.FileType == 1 {
+			item.SearchTag = "路演回放"
+		} else {
+			item.SearchTag = "调研反馈"
+		}
+		item.PublishDate = publishDate
+		item.ChartPermissionId = activityInfo.ChartPermissionId
+		item.CreateTime = utils.StrDateToDate(activityInfo.ActivityTime)
+		if totalData == 0 {
+			_, e := cygx.AddCygxResourceData(item)
+			if e != nil {
+				err = errors.New("AddCygxResourceData, Err: " + e.Error())
+				return
+			}
+		} else {
+			e = cygx.UpdateResourceDataByItem(item)
+			if e != nil {
+				err = errors.New("UpdateResourceDataByItem, Err: " + e.Error())
+				return
+			}
+		}
+	}
+	return
+}
+
+// 更新活动视频
+func UpdateActivityVideoResourceData(sourceId int) {
+	time.Sleep(1 * time.Second) // 添加1秒的延迟
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println("err:", err)
+			go alarm_msg.SendAlarmMsg("更新更新活动视频 失败,UpdateActivityVideoResourceData Err:"+err.Error()+"资源ID"+strconv.Itoa(sourceId), 3)
+		}
+	}()
+	var source = utils.CYGX_OBJ_ACTIVITYVIDEO
+	var condition string
+	var pars []interface{}
+	condition = ` AND v.video_id = ? `
+	pars = append(pars, sourceId)
+	total, e := cygx.GetActivityVideoCount(condition, pars)
+	if e != nil {
+		err = errors.New("GetCygxResearchSummary, Err: " + e.Error())
+		return
+	}
+	//如果取消发布了就做删除处理
+	if total == 0 {
+		e = cygx.DeleteResourceData(sourceId, source)
+		if e != nil {
+			err = errors.New("DeleteResourceData, Err: " + e.Error())
+			return
+		}
+	} else {
+		videoDetail, e := cygx.GetCygxActivityVideoReqDetailByVideoId(sourceId)
+		if e != nil {
+			err = errors.New("GetCygxActivityVoiceReqDetail" + e.Error())
+			return
+		}
+		activityId := videoDetail.ActivityId
+
+		activityInfo, e := cygx.GetAddActivityInfoById(activityId)
+		if e != nil {
+			err = errors.New("GetAddActivityInfoById, Err: " + e.Error())
+			return
+		}
+		//判断是否存在,如果不存在就新增,存在就更新
+		totalData, e := cygx.GetCygxReportSelectionBySourceAndId(sourceId, source)
+		if e != nil {
+			err = errors.New("GetCygxReportSelectionBySourceAndId, Err: " + e.Error())
+			return
+		}
+		publishDate := time.Now().Format(utils.FormatDateTime)
+		item := new(cygx.CygxResourceData)
+		item.SourceId = sourceId
+		item.Source = source
+		//易董办会的分析师电话会,为路演回放
+		if videoDetail.FileType == 1 {
+			item.SearchTag = "路演回放"
+		} else {
+			item.SearchTag = "调研反馈"
+		}
+
+		item.PublishDate = publishDate
+		item.ChartPermissionId = activityInfo.ChartPermissionId
+		item.CreateTime = utils.StrDateToDate(activityInfo.ActivityTime)
+		if totalData == 0 {
+			_, e := cygx.AddCygxResourceData(item)
+			if e != nil {
+				err = errors.New("AddCygxResourceData, Err: " + e.Error())
+				return
+			}
+		} else {
+			e = cygx.UpdateResourceDataByItem(item)
+			if e != nil {
+				err = errors.New("UpdateResourceDataByItem, Err: " + e.Error())
+				return
+			}
+		}
+	}
+	return
+}
+
+// 更新产业视频
+func UpdateMicroRoadshowResourceData(sourceId int) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println("err:", err)
+			go alarm_msg.SendAlarmMsg("更新产业视频 失败,UpdateMicroRoadshowResourceData Err:"+err.Error()+"资源ID"+strconv.Itoa(sourceId), 3)
+		}
+	}()
+	var source = utils.CYGX_OBJ_ROADSHOW
+	var condition string
+	var pars []interface{}
+	condition = ` AND publish_status = 1  AND video_id = ? `
+	pars = append(pars, sourceId)
+	total, e := cygx.GetMicroRoadshowVideoListCount(condition, pars)
+	if e != nil {
+		err = errors.New("GetMicroRoadshowVideoListCount, Err: " + e.Error())
+		return
+	}
+	//如果取消发布了就做删除处理
+	if total == 0 {
+		e = cygx.DeleteResourceData(sourceId, source)
+		if e != nil {
+			err = errors.New("DeleteResourceData, Err: " + e.Error())
+			return
+		}
+	} else {
+		//判断是否存在,如果不存在就新增,存在就更新
+		totalData, e := cygx.GetCygxReportSelectionBySourceAndId(sourceId, source)
+		if e != nil {
+			err = errors.New("GetCygxReportSelectionBySourceAndId, Err: " + e.Error())
+			return
+		}
+		detail, e := cygx.GetMicroRoadshowVideoByVideoId(sourceId)
+		if e != nil {
+			err = errors.New("GetCygxReportSelectionBySourceAndId, Err: " + e.Error())
+			return
+		}
+		publishDate := time.Now().Format(utils.FormatDateTime)
+		item := new(cygx.CygxResourceData)
+		item.SourceId = sourceId
+		item.Source = source
+		item.SearchTag = ""
+		item.PublishDate = publishDate
+		item.ChartPermissionId = detail.ChartPermissionId
+		item.CreateTime = time.Now()
+		if totalData == 0 {
+			_, e := cygx.AddCygxResourceData(item)
+			if e != nil {
+				err = errors.New("AddCygxResourceData, Err: " + e.Error())
+				return
+			}
+		} else {
+			e = cygx.UpdateResourceDataByItem(item)
+			if e != nil {
+				err = errors.New("UpdateResourceDataByItem, Err: " + e.Error())
+				return
+			}
+		}
+	}
+	return
+}
+
+//func init() {
+//	UpdateAskserieVideoResourceData(7)
+//}
+
+// 更新问答系列  写入首页最新  cygx_resource_data 表
+func UpdateAskserieVideoResourceData(sourceId int) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("更新问答系列ourceId: ", sourceId, err.Error()), 2)
+		}
+	}()
+	var source = utils.CYGX_OBJ_ASKSERIEVIDEO
+	var condition string
+	var pars []interface{}
+	condition = ` AND publish_status = 1  AND  askserie_video_id = ?  `
+	pars = append(pars, sourceId)
+	total, e := cygx.GetCygxAskserieVideoCount(condition, pars)
+
+	if e != nil {
+		err = errors.New("GetCygxAskserieVideoCount, Err: " + e.Error())
+		return
+	}
+	//如果取消发布了就做删除处理
+	if total == 0 {
+		e = cygx.DeleteResourceData(sourceId, source)
+		if e != nil {
+			err = errors.New("DeleteResourceData, Err: " + e.Error())
+			return
+		}
+	} else {
+		//判断是否存在,如果不存在就新增,存在就更新
+		totalData, e := cygx.GetCygxResourceDataBySourceAndIdCount(sourceId, source)
+		if e != nil {
+			err = errors.New("GetCygxReportSelectionBySourceAndId, Err: " + e.Error())
+			return
+		}
+		detail, e := cygx.GetCygxAskserieVideoDetail(sourceId)
+		if e != nil {
+			err = errors.New("GetCygxAskserieVideoDetail, Err: " + e.Error())
+			return
+		}
+
+		publishDate := time.Now().Format(utils.FormatDateTime)
+		item := new(cygx.CygxResourceData)
+		item.SourceId = sourceId
+		item.Source = source
+		item.PublishDate = publishDate
+		item.ChartPermissionId = detail.ChartPermissionId
+		item.CreateTime = time.Now()
+		if totalData == 0 {
+			_, e := cygx.AddCygxResourceData(item)
+			if e != nil {
+				err = errors.New("AddCygxResourceData, Err: " + e.Error())
+				return
+			}
+		} else {
+			e = cygx.UpdateResourceDataByItem(item)
+			if e != nil {
+				err = errors.New("UpdateResourceDataByItem, Err: " + e.Error())
+				return
+			}
+		}
+	}
+	return
+}
+
+func init23() {
 	//var condition string
 	//var pars []interface{}
 	//
@@ -812,7 +1115,36 @@ func init1123232() {
 	//	}
 	//	for _, v := range list {
 	//		fmt.Println(v.Source)
-	//		//UpdateActivityResourceData(v.SourceId)
+	//		UpdateActivityResourceData(v.SourceId)
+	//	}
+	//}
+
+	//12.4
+
+	//{
+	//	//活动
+	//	list, err := cygx.GetCygxResourceDataListBysource(utils.CYGX_OBJ_ACTIVITY)
+	//	if err != nil {
+	//		fmt.Println(err)
+	//	}
+	//
+	//	for _, v := range list {
+	//		detail, e := cygx.GetAddActivityInfoById(v.SourceId)
+	//		if e != nil {
+	//			err = errors.New("GetCygxReportSelectionInfoById, Err: " + e.Error())
+	//			fmt.Println(err)
+	//			return
+	//		}
+	//		item := new(cygx.CygxResourceData)
+	//		item.SourceId = v.SourceId
+	//		item.Source = utils.CYGX_OBJ_ACTIVITY
+	//		item.ChartPermissionId = detail.ChartPermissionId
+	//		fmt.Println(v.Source)
+	//		err = cygx.UpdateChartPermissionIdResourceDataByItem(item)
+	//		if err != nil {
+	//			fmt.Println(err)
+	//			return
+	//		}
 	//	}
 	//}
 
@@ -840,6 +1172,49 @@ func init1123232() {
 	//	}
 	//}
 
+	//{
+	//	//文章//12.4
+	//	list, err := cygx.GetCygxResourceDataListBysource(utils.CYGX_OBJ_ARTICLE)
+	//	if err != nil {
+	//		fmt.Println(err)
+	//		return
+	//	}
+	//	for _, v := range list {
+	//		detail, e := cygx.GetArticleDetailByArticleId(v.SourceId)
+	//		if e != nil {
+	//			err = errors.New("GetCygxReportSelectionInfoById, Err: " + e.Error())
+	//			fmt.Println(err)
+	//			return
+	//		}
+	//
+	//		item := new(cygx.CygxResourceData)
+	//		if detail.ArticleTypeId > 0 {
+	//			//item.SearchTag = detail.ArticleTypeName // 研选类型名称
+	//			item.ChartPermissionId = utils.CHART_PERMISSION_ID_YANXUAN
+	//		} else {
+	//			//item.SearchTag = detail.MatchTypeName
+	//			//获取文章分类详情
+	//			detailCategory, _ := cygx.GetCygxReportMappingCelueMaxDetailByCategoryId(detail.CategoryId)
+	//			if detailCategory != nil {
+	//				item.ChartPermissionId = detailCategory.ChartPermissionId
+	//			}else{
+	//				detailCategoryTwo, _ := cygx.GetCygxReportMappingCelueMaxDetailByCategoryId(detail.CategoryIdTwo)
+	//				if detailCategoryTwo != nil {
+	//					item.ChartPermissionId = detailCategoryTwo.ChartPermissionId
+	//				}
+	//			}
+	//		}
+	//		item.SourceId = v.SourceId
+	//		item.Source = utils.CYGX_OBJ_ARTICLE
+	//		fmt.Println(v.Source)
+	//		err = cygx.UpdateChartPermissionIdResourceDataByItem(item)
+	//		if err != nil {
+	//			fmt.Println(err)
+	//			return
+	//		}
+	//	}
+	//}
+
 	//{
 	//	//产品内测
 	//	list, err := cygx.GetCygxResourceDataListBysource(utils.CYGX_OBJ_PRODUCTINTERIOR)
@@ -848,7 +1223,7 @@ func init1123232() {
 	//	}
 	//	for _, v := range list {
 	//		fmt.Println(v.Source)
-	//		//UpdateProductInteriorResourceData(v.SourceId)
+	//		UpdateProductInteriorResourceData(v.SourceId)
 	//	}
 	//}
 	//
@@ -890,15 +1265,52 @@ func init1123232() {
 	//	}
 	//}
 	//
-	{
-		//更新本周研究汇总
-		list, err := cygx.GetCygxResourceDataListBysource(utils.CYGX_OBJ_MINUTESSUMMARY)
-		if err != nil {
-			fmt.Println(err)
-		}
-		for _, v := range list {
-			fmt.Println(v.Source)
-			//UpdateMinutesSummaryResourceData(v.SourceId)
-		}
-	}
+	//{
+	//	//更新本周研究汇总
+	//	list, err := cygx.GetCygxResourceDataListBysource(utils.CYGX_OBJ_MINUTESSUMMARY)
+	//	if err != nil {
+	//		fmt.Println(err)
+	//	}
+	//	for _, v := range list {
+	//		fmt.Println(v.Source)
+	//		//UpdateMinutesSummaryResourceData(v.SourceId)
+	//	}
+	//}
+
+	//{
+	//	//活动音频
+	//	list, err := cygx.GetCygxResourceDataListBysource(utils.CYGX_OBJ_ACTIVITYVOICE)
+	//	if err != nil {
+	//		fmt.Println(err)
+	//	}
+	//	for _, v := range list {
+	//		fmt.Println(v.Source)
+	//		UpdateActivityVoiceResourceData(v.SourceId)
+	//	}
+	//}
+
+	//{
+	//	//活动视频
+	//	list, err := cygx.GetCygxResourceDataListBysource(utils.CYGX_OBJ_ACTIVITYVIDEO)
+	//	if err != nil {
+	//		fmt.Println(err)
+	//	}
+	//	for _, v := range list {
+	//		fmt.Println(v.Source)
+	//		UpdateActivityVideoResourceData(v.SourceId)
+	//	}
+	//}
+
+	//{
+	//	//活动音频
+	//	list, err := cygx.GetCygxResourceDataListBysource(utils.CYGX_OBJ_ROADSHOW)
+	//	if err != nil {
+	//		fmt.Println(err)
+	//	}
+	//	for _, v := range list {
+	//		fmt.Println(v.Source)
+	//		UpdateMicroRoadshowResourceData(v.SourceId)
+	//	}
+	//}
+
 }

+ 14 - 14
services/elastic.go

@@ -374,20 +374,20 @@ func SearcCygxArticleHistoryData(indexName, keyword, startDate, endDate, company
 	//机构阅读数量
 	sortMap := make([]interface{}, 0)
 	//如果是一家公司就不按照这个字段排序
-	if len(seliceid) > 1 {
-		sortMap = append(sortMap, map[string]interface{}{
-			"CompanyArticleHistoryNum": map[string]interface{}{
-				"order": "desc",
-			},
-		})
-	}
-
-	//用户阅读数量
-	sortMap = append(sortMap, map[string]interface{}{
-		"UserArticleHistoryNum": map[string]interface{}{
-			"order": "desc",
-		},
-	})
+	//if len(seliceid) > 1 {
+	//	sortMap = append(sortMap, map[string]interface{}{
+	//		"CompanyArticleHistoryNum": map[string]interface{}{
+	//			"order": "desc",
+	//		},
+	//	})
+	//}
+	//
+	////用户阅读数量
+	//sortMap = append(sortMap, map[string]interface{}{
+	//	"UserArticleHistoryNum": map[string]interface{}{
+	//		"order": "desc",
+	//	},
+	//})
 	//时间
 	sortMap = append(sortMap, map[string]interface{}{
 		"CreateTime": map[string]interface{}{

+ 43 - 1
services/elastic/es_comprehensive.go

@@ -8,6 +8,7 @@ import (
 	"github.com/olivere/elastic/v7"
 	"hongze/hz_crm_api/models/cygx"
 	"hongze/hz_crm_api/services/alarm_msg"
+	cygxService "hongze/hz_crm_api/services/cygx"
 	"hongze/hz_crm_api/utils"
 	"html"
 	"strconv"
@@ -543,7 +544,7 @@ func EsAddYanxuanSpecial(sourceId int) {
 	defer func() {
 		if err != nil {
 			fmt.Println("err:", err)
-			go alarm_msg.SendAlarmMsg(fmt.Sprint("更新研选专栏失败sourceId: ", sourceId), 2)
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("更新研选专栏失败sourceId: ", sourceId, err.Error()), 2)
 		}
 	}()
 	detail, e := cygx.GetYanxuanSpecialItemById(sourceId)
@@ -571,3 +572,44 @@ func EsAddYanxuanSpecial(sourceId int) {
 	}
 	return
 }
+
+//func init() {
+//	EsAddAskserieVideo(74)
+//}
+
+// Es问答系列视频
+func EsAddAskserieVideo(sourceId int) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println("err:", err)
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("Es更新问答系列视频AddAskserieVideo失败sourceId: ", sourceId, err.Error()), 2)
+		}
+	}()
+	detail, e := cygx.GetCygxAskserieVideoDetail(sourceId)
+	if e != nil {
+		err = errors.New("GetArticleInfoOtherByArticleId" + e.Error())
+		return
+	}
+	content := html.UnescapeString(detail.VideoName)
+	doc, e := goquery.NewDocumentFromReader(strings.NewReader(content))
+	if e != nil {
+		err = errors.New("goquery.NewDocumentFromReader" + e.Error())
+		return
+	}
+	bodyText := doc.Text()
+	item := new(ElasticComprehensiveDetail)
+	item.SourceId = detail.AskserieVideoId
+	item.Source = utils.CYGX_OBJ_ASKSERIEVIDEO
+	item.Title = detail.VideoName
+	item.PublishDate = detail.PublishDate
+	item.BodyText = bodyText
+	mapLabel := cygxService.GetCygxAskserieVideoLabelMap([]int{sourceId}) // 标签
+	item.IndustryName = mapLabel[sourceId]
+	if detail.PublishStatus == 1 {
+		EsAddOrEditComprehensiveData(item) //如果发布了就新增
+	} else {
+		EsDeleteComprehensiveData(item) // 没有发布就删除
+	}
+	return
+}

+ 2 - 7
services/english_video.go

@@ -125,14 +125,9 @@ func SaveEnglishVideo(req models.SaveEnglishVideoReq, adminInfo *system.Admin) (
 	firstClassify := new(models.EnglishClassify)
 	secondClassify := new(models.EnglishClassify)
 	for _, v := range classifyList {
-		if v.ClassifyType != 1 {
-			err = fmt.Errorf("分类类型出错")
-			errMsg = fmt.Sprintf("分类类型出错, Err: %v", err)
-			return
-		}
-		if v.ParentId == 0 {
+		if v.ParentId == v.RootId {
 			firstClassify = v
-		} else {
+		} else if v.ParentId > 0 {
 			secondClassify = v
 		}
 	}

+ 2 - 2
services/wechat_send_msg.go

@@ -2012,7 +2012,7 @@ func SendWxMsgWithCygxMorningMeeting(meetingId, industryId int, industryName str
 	sendInfo := new(SendWxTemplate)
 	//sendInfo.First = "【" + industryName + "】产业,有新的跟踪点评"
 	sendInfo.Keyword1 = "【" + industryName + "】产业,有新的跟踪点评"
-	sendInfo.Keyword2 = "点评内容:" + content
+	sendInfo.Keyword2 = content
 	sendInfo.Keyword3 = meetingTime
 	sendInfo.Remark = "点击进入小程序对应的产业资源包页面"
 	if utils.RunMode == "release" {
@@ -2020,7 +2020,7 @@ func SendWxMsgWithCygxMorningMeeting(meetingId, industryId int, industryName str
 	} else {
 		sendInfo.TemplateId = utils.TemplateIdByProductXzs
 	}
-	sendInfo.RedirectUrl = utils.WX_MSG_PATH_INDUSTRY_DETAIL + strconv.Itoa(industryId) + "&IsSendWx=1"
+	sendInfo.RedirectUrl = utils.WX_MSG_PATH_INDUSTRY_DETAIL + strconv.Itoa(industryId) + "&IsSendWx=1&ChapterId=" + strconv.Itoa(chapter.Id)
 	sendInfo.RedirectTarget = 3
 	sendInfo.Resource = strconv.Itoa(industryId)
 	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_MORNING_MEETING

+ 5 - 5
services/yb/apply_record.go

@@ -284,10 +284,10 @@ func MarkGroupApplyRecord(applyRecordId, adminId, userId int, groupName string)
 			}
 			return
 		}
-		if applyRecord.OpStatus != 0 {
-			err = errors.New(fmt.Sprint("申请记录处理状态有误:", err))
-			return
-		}
+		//if applyRecord.OpStatus != 0 {
+		//	err = errors.New(fmt.Sprint("申请记录处理状态有误:", err))
+		//	return
+		//}
 		if userId > 0 && userId != applyRecord.UserId {
 			err = errors.New(fmt.Sprint("申请记录ID与用户ID不匹配:", err))
 			return
@@ -317,7 +317,7 @@ func MarkGroupApplyRecord(applyRecordId, adminId, userId int, groupName string)
 		return
 	}
 	// 未处理过则进行标记
-	if wxUser.IsDeal == 0 {
+	if wxUser.IsDeal == 0 || wxUser.MarkGroup == "" {
 		wxUser.IsDeal = 1
 		wxUser.MarkGroup = groupName
 		wxUser.LastUpdatedTime = time.Now()

+ 11 - 2
utils/constants.go

@@ -158,8 +158,8 @@ const (
 	COMPANY_PRODUCT_RAI_NAME  = "权益"
 )
 
-var PermissionFiccClassifyArr = [...]string{"宏观经济", "化工产业", "建材产业", "有色产业", "市场策略"}
-var PermissionAllClassifyArr = [...]string{"宏观经济", "化工产业", "建材产业", "有色产业", "市场策略", "权益"}
+var PermissionFiccClassifyArr = [...]string{"宏观经济", "化工产业", "建材产业", "有色产业", "新能源", "市场策略"}
+var PermissionAllClassifyArr = [...]string{"宏观经济", "化工产业", "建材产业", "有色产业", "新能源", "市场策略", "权益"}
 
 //apply_method:申请类型:1:试用->正式,2:冻结—>试用,3:流失—>正式,4:试用延期,5:原销售申请领取流失客户,6:正式客户申请服务更新
 
@@ -394,12 +394,14 @@ const (
 	CYGX_LYJH                               string = "路演精华"
 	PERMISSION_ID_UPGRADE                   int    = 100000 //行业权限升级的时候所添加的起步值
 	CYGX_TACTICS_TIME_LINE_STATUS           string = "cygx_tactics_time_line_status"
+	CYGX_TAG_HOT_ACTIVITY_ID                string = "cygx_tag_hot_activity_id"         //标签管理自定义的热门活动ID
 	TEMPLATE_MSG_CYGX_ACTIVITY_LIMIT_PEOPLE int    = 1001                               //查研观向修改活动人数限制之后,对于因为人数已满而失败的用户,推送模板消息 1001
 	YI_DONG_ZHENG_TONG_YUN_TOKEN_KEY        string = "YI_DONG_ZHENG_TONG_YUN_TOKEN_KEY" //易董证通云的token,存Redis使用
 	CYGX_USER_KEY_LABEL                            = "CYGX_USER_KEY_LABEL"              //查研观向用户标签
 	TPL_MSG_WANG_YANG                              = "tpl_msg_wang_yang"                //汪洋手机号地址参数
 	MicroRoadshowDefaultImgKey                     = "micro_roadshow_default_img"       // 音视频封面图
 	PERMISSION_ID_YANXUAN_DIFF                     = 20000                              // 买方研选区分3w和5w的差值
+	PERMISSION_ID_YANXUAN_10W_DIFF                 = 20032                              // 买方研选区分10W
 	ZHUAN_JIA_NAME                          string = "专家"
 	ZHUAN_JIA_ID                            int    = 29
 	CHART_PERMISSION_NAME_70W                      = "70w大套餐" // 权益70w大套餐名称
@@ -409,6 +411,11 @@ const (
 	HONG_GUAN_NAME                          string = "宏观"
 )
 
+var CYGX_REGISTER_PLATFORM_MAP = map[string]string{
+	"1": "小程序",
+	"2": "网页版",
+}
+
 const (
 	CYGX_OBJ_ARTICLE            string = "article"            // 对象类型:文章
 	CYGX_OBJ_ACTIVITY           string = "activity"           // 对象类型:活动
@@ -422,6 +429,7 @@ const (
 	CYGX_OBJ_RESEARCHSUMMARY    string = "researchsummary"    // 对象类型:本周研究汇总
 	CYGX_OBJ_MINUTESSUMMARY     string = "minutessummary"     // 对象类型:本周研究汇总
 	CYGX_OBJ_YANXUANSPECIAL     string = "yanxuanspecial"     // 对象类型:研选专栏
+	CYGX_OBJ_ASKSERIEVIDEO      string = "askserievideo"      // 对象类型:问答系列视频
 )
 
 const (
@@ -465,6 +473,7 @@ const (
 	WX_MSG_PATH_YX_SPECIAL_DETAIL               = "pages-purchaser/noteAndViewpoint/noteAndViewpoint?id="         //研选专栏详情
 	WX_MSG_PATH_YX_SPECIAL_ENABLE_DETAIL        = "pages-purchaser/toExamine/toExamine?id="                       //研选专栏审核详情页面
 	WX_MSG_PATH_YX_SPECIAL_CENTER               = "pages-purchaser/contentAllPage/contentAllPage?Status=4"        //研选专栏内容中心
+	WX_MSG_PATH_QUESTIONNAIRE_DETAIL            = "pages-purchaser/themeVote/themeVote?id="                       //问卷调查详情页
 )
 
 // 图表类型