Browse Source

Merge branch 'master' of http://8.136.199.33:3000/hongze/hongze_cygx into cygx_need_p1_812

xingzai 1 year ago
parent
commit
995048c64c

+ 79 - 42
controllers/activity.go

@@ -24,6 +24,10 @@ type ActivityABaseController struct {
 	BaseCommonController
 }
 
+type ActivityNoLoginController struct {
+	BaseAuthMobileController
+}
+
 // @Title 活动类型列表
 // @Description活动类型列表接口
 // @Success 200 {object} models.ActivityTypeListResp
@@ -212,7 +216,7 @@ func (this *ActivityCoAntroller) ScheduleList() {
 			list[k].IsShowSustainable = true
 		}
 		if strings.Contains(v.ChartPermissionName, "研选") && v.ActivityTypeId == 1 {
-			list[k].ActivityTypeName = "买方研选电话会"
+			//list[k].ActivityTypeName = "买方研选电话会"
 			list[k].ImgUrlText = utils.YAN_XUAN_IMG
 		}
 		if v.ActivityType == 0 {
@@ -525,7 +529,7 @@ func (this *ActivityCoAntroller) Detail() {
 		} else {
 			activityInfo.ArticleList = make([]*models.ActivityArticleResp, 0)
 		}
-		if (activityInfo.ActivityTypeId == 5 || activityInfo.ActivityTypeId == 6) && services.GetBelongingRai(user.Mobile) && activityInfo.SigninImg != "" {
+		if services.GetBelongingRai(user.Mobile) && activityInfo.SigninImg != "" {
 			activityInfo.IsShowSigninButton = true
 			activityInfo.IsShowSignUpDetail = true
 		}
@@ -1000,6 +1004,12 @@ func (this *ActivityCoAntroller) SignupCancel() {
 		br.ErrMsg = "操作失败,Err:" + errSignup.Error()
 		return
 	}
+
+	// 如果是买方研选下的专家沙龙,同时推给内容组四人
+	if activityInfo.ActivityTypeId == 5 {
+		go services.SendActivitieCancelSignTemplateMsg(user, activityInfo)
+	}
+
 	go services.YanXuanActivityPointsBillSignupCancel(activityId, uid) // 用户取消报名添加到处理研选扣点
 	br.Ret = 200
 	br.Success = true
@@ -1010,6 +1020,7 @@ func (this *ActivityCoAntroller) SignupCancel() {
 // @Title  用户搜索详情
 // @Description 获取用户搜索详情接口
 // @Param   IsShowJurisdiction   query   int  true       "是否仅展示有权限的,默认为0,1是,2否 "
+// @Param   IsHideResearch   query   int  true       "是否隐藏研选行业 "
 // @Success Ret=200 {object} models.ActivityUserSearchContentList
 // @router /getUserSearchContent [get]
 func (this *ActivityCoAntroller) GetUserSearchContent() {
@@ -1025,6 +1036,7 @@ func (this *ActivityCoAntroller) GetUserSearchContent() {
 		br.Ret = 408
 		return
 	}
+	isHideResearch, _ := this.GetBool("IsHideResearch", false)
 	uid := user.UserId
 	detailSeearch := new(models.CygxActivityUserSearchContent)
 	detailSeearch.IsShowJurisdiction = 0
@@ -1101,7 +1113,7 @@ func (this *ActivityCoAntroller) GetUserSearchContent() {
 	}
 	var listChartPermissionidNew2 []*models.ActivityChartPermission
 	for _, v := range list2 {
-		if userType == 1 {
+		if userType == 1 || isHideResearch {
 			//if v.PermissionName != "研选" {
 			if !strings.Contains(v.PermissionName, "研选") {
 				listChartPermissionidNew2 = append(listChartPermissionidNew2, v)
@@ -1113,7 +1125,7 @@ func (this *ActivityCoAntroller) GetUserSearchContent() {
 	resp.ListChartPermission2 = listChartPermissionidNew2
 	var listChartPermissionidNew []*models.ActivityChartPermission
 	for _, v := range listChartPermissionid {
-		if userType == 1 {
+		if userType == 1 || isHideResearch {
 			if !strings.Contains(v.PermissionName, "研选") {
 				listChartPermissionidNew = append(listChartPermissionidNew, v)
 			}
@@ -1690,6 +1702,7 @@ func (this *ActivityCoAntroller) LabelMoreList() {
 // @Param   TypeName   query   string  false       "电话会类型 ,1专家电话会 2分析师电话会"
 // @Param   IsExternalLabel   query   int  false       "是否仅展示外部资源 1:是、0:否 默认0"
 // @Param   IsResearchPoints   query   string  false       "是否仅展示研选扣点 1:展示研选扣点、2:展示外部资源 ,1,2两者都展示" //兼容前端
+// @Param   IsResearch   query   bool  true       "是否为研选"
 // @Success 200 {object} models.GetCygxActivityListRep
 // @router /listNew [get]
 func (this *ActivityCoAntroller) ActivityListNew() {
@@ -1722,7 +1735,7 @@ func (this *ActivityCoAntroller) ActivityListNew() {
 	activityId, _ := this.GetInt("ActivityId") // 仅用于判断【新】标签
 	//isExternalLabel, _ := this.GetInt("IsExternalLabel")   //
 	isResearchPoints := this.GetString("IsResearchPoints") //
-
+	isResearch, _ := this.GetBool("IsResearch", false)     // 是否为研选 查研观向11.0 (研选活动独立显示)
 	if label == "undefined" {
 		label = ""
 	}
@@ -1762,6 +1775,14 @@ func (this *ActivityCoAntroller) ActivityListNew() {
 	if label != "" {
 		conditioninit += ` AND art.label  LIKE "%` + label + `%" `
 	}
+	//是否是研选
+	if isResearch {
+		chartPermissionIds = strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN)
+	} else {
+		conditioninit += ` AND ( art.chart_permission_id  !=  ` + strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN) + `  OR  ( art.is_show_hz = 1 AND art.chart_permission_id  =  ` + strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN) + `)  )`
+
+		conditioninit += ` AND IF (	 art.active_state = 3, art.chart_permission_id != ` + strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN) + `, 1 = 1 ) ` //V 11.0 研选活动结束后就不在已结束页面展示了
+	}
 	//行业名称
 	if len(chartPermissionIds) > 0 {
 		conditioninit += ` AND art.chart_permission_id  IN (` + chartPermissionIds + `)`
@@ -1902,8 +1923,8 @@ func (this *ActivityCoAntroller) ActivityListNew() {
 	if label != "" && activeState == "1" {
 		conditionOrder = ` ORDER BY art.activity_time ASC  `
 	}
-
-	if activeState == "1" {
+	//未开始进行中默认按照时间正序
+	if activeState == "1" || activeState == "1,2" || activeState == "" {
 		conditionOrder = ` ORDER BY art.activity_time ASC  `
 	}
 	//conditionActivityKey += condition + conditionOrder
@@ -1965,7 +1986,7 @@ func (this *ActivityCoAntroller) ActivityListNew() {
 			list[k].IsShowSustainable = true
 		}
 		if strings.Contains(v.ChartPermissionName, "研选") && v.ActivityTypeId == 1 {
-			list[k].ActivityTypeName = "买方研选电话会"
+			//list[k].ActivityTypeName = "买方研选电话会"
 			//list[k].ImgUrlText = "https://hongze.oss-cn-shanghai.aliyuncs.com/static/images/202112/20211221/bIdfv8t86xrFRpDOeGGHXOmKEuKl.png"
 			list[k].ImgUrlText = utils.YAN_XUAN_IMG
 		}
@@ -2045,9 +2066,9 @@ func (this *ActivityCoAntroller) ActivityListNew() {
 			list[k].AudioLink = true
 			list[k].VideoDetail = mapActivityVideo[v.ActivityId]
 		}
-		resp.List = append(resp.List, services.ActivityButtonShow(v))
+		//resp.List = append(resp.List, services.ActivityButtonShow(v))
 	}
-
+	resp.List = services.ActivityArrButtonShow(activityList)
 	// 查研观向7.4-判断标签是否为产业, 为产业时是否跳转资源包
 	if label != "" {
 		industry, e := models.GetIndustryByName(label)
@@ -2186,6 +2207,7 @@ func (this *ActivityCoAntroller) CheckAsk() {
 // @Param   WhichMonth   query   string  false       "哪一月 本月:1 上月:2"
 // @Param   WhichMonth   query   string  false       "哪一月 本月:1 上月:2"
 // @Param   IsPower   query   int  false       "是否选择有权限行业 ,1是 0 否 默认0"
+// @Param   IsResearch   query   bool  true       "是否为研选"
 // @Success 200 {object} models.ActivityTypeListHomeResp
 // @router /labelTypeListV5 [get]
 func (this *ActivityCoAntroller) LabelTypeListV5() {
@@ -2205,7 +2227,7 @@ func (this *ActivityCoAntroller) LabelTypeListV5() {
 	chartPermissionIds := this.GetString("ChartPermissionIds")
 	whichDay := this.GetString("WhichDay")
 	activeState := this.GetString("ActiveState")
-
+	isResearch, _ := this.GetBool("IsResearch", false) // 是否为研选 查研观向11.0 (研选活动独立显示)
 	//入参为 undefined 时的处理
 	if chartPermissionIds == "undefined" {
 		chartPermissionIds = ""
@@ -2216,6 +2238,7 @@ func (this *ActivityCoAntroller) LabelTypeListV5() {
 	if activeState == "undefined" || activeState == "" {
 		activeState = "1"
 	}
+
 	// 查研观向7.4-始终查询宏观的活动
 	if chartPermissionIds != "" {
 		chartPermissionIds += ",1"
@@ -2256,14 +2279,14 @@ func (this *ActivityCoAntroller) LabelTypeListV5() {
 	permissionNameStr = strings.Replace(permissionNameStr, "(主观)", "", -1)
 	permissionNameStr = strings.Replace(permissionNameStr, "(客观)", "", -1)
 	permissionNameStr = strings.TrimRight(permissionNameStr, ",")
-	//
-	//// 查研观向7.4-始终查询宏观的权限(无论是否有权限)
-	//if permissionNameStr == `` {
-	//	permissionNameStr = `'宏观'`
-	//} else {
-	//	permissionNameStr += `, '宏观'`
-	//}
 
+	if isResearch {
+		chartPermissionIds = strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN)
+	} else {
+		conditioninit += ` AND ( art.chart_permission_id  !=  '` + strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN) + `'  OR  ( art.is_show_hz = 1 AND art.chart_permission_id  =  '` + strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN) + `')  )`
+
+		conditioninit += ` AND IF (	 art.active_state = 3, art.chart_permission_id != ` + strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN) + `, 1 = 1 ) ` //V 11.0 研选活动结束后就不在已结束页面展示了
+	}
 	//行业名称
 	if len(chartPermissionIds) > 0 {
 		conditioninit += ` AND art.chart_permission_id  IN (` + chartPermissionIds + `)`
@@ -2318,7 +2341,6 @@ func (this *ActivityCoAntroller) LabelTypeListV5() {
 	} else {
 		conditioninit += ` AND art.active_state  IN (1,2)`
 	}
-
 	var condition string
 	//conditionActivity, err := services.GetActivityonditionList(user, "", chartPermissionIds, whichDay, activeState, "", isPower, 0, "", 0, 1)
 
@@ -2363,20 +2385,34 @@ func (this *ActivityCoAntroller) LabelTypeListV5() {
 		}
 		item.Resource = 1
 		item.ActivityId = v.ActivityId
+		if v.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+			item.IsResearch = true
+		}
 
+		//易董同步过来的活动只展示外部资源标签
+		if v.YidongActivityId != "" {
+			item.IsResearchPoints = false
+			item.IsResearch = false
+		}
 		item.IsExternalLabel = v.IsExternalLabel
 
 		mapActivity[v.ActivityTypeId] = append(mapActivity[v.ActivityTypeId], item)
 		mapkeyWord[fmt.Sprint(v.ActivityTypeId, "-", item.KeyWord)] = item.KeyWord
 	}
 	//
-	list, err := models.GetActivityTypeHomeList()
+	var conditionType string
+	var parsType []interface{}
+	if isResearch {
+		conditionType = "  AND  source_type IN (0,2) "
+	} else {
+		conditionType = " AND source_type IN (0,1) "
+	}
+	list, err := models.GetActivityTypeHomeList(conditionType, parsType)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
 		return
 	}
-
 	resp := new(models.ActivityTypeListHomeResp)
 	for k, v := range list {
 		if len(mapActivity[v.ActivityTypeId]) > 0 {
@@ -2418,11 +2454,9 @@ func (this *ActivityCoAntroller) LabelTypeListV5() {
 		return
 	}
 	for k, _ := range list {
-		//if v.ActivityTypeId == 1 {
 		for k2 := range list[k].List {
 			list[k].List[k2].IsNew = newLabelMap[list[k].List[k2].ActivityId]
 		}
-		//}
 	}
 
 	var itemsNew []*models.ActivityTypeHome
@@ -2471,23 +2505,25 @@ func (this *ActivityCoAntroller) LabelTypeListV5() {
 			}
 		}
 	}
+	//研选互动不展示专项产业调研
+	if !isResearch {
+		//查询专项产业调研展示权限 仅对大套餐客户跟永续客户展示
+		if whichDay == "" {
 
-	//查询专项产业调研展示权限 仅对大套餐客户跟永续客户展示
-	if whichDay == "" {
-
-		speciaItem, err := services.GetActivityLabelSpecialList(user, isPower, chartPermissionIds, permissionNameStr)
-		if err != nil {
-			br.Msg = "获取失败"
-			br.ErrMsg = "获取失败,Err:" + err.Error()
-			return
-		}
-		if leftPx > rightPx {
-			speciaItem.Position = 2
-		} else {
-			speciaItem.Position = 1
-		}
-		if len(speciaItem.List) > 0 {
-			itemsNew = append(itemsNew, speciaItem)
+			speciaItem, err := services.GetActivityLabelSpecialList(user, isPower, chartPermissionIds, permissionNameStr)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取失败,Err:" + err.Error()
+				return
+			}
+			if leftPx > rightPx {
+				speciaItem.Position = 2
+			} else {
+				speciaItem.Position = 1
+			}
+			if len(speciaItem.List) > 0 {
+				itemsNew = append(itemsNew, speciaItem)
+			}
 		}
 	}
 	//记录用户搜索的筛选条件
@@ -3136,7 +3172,7 @@ func (this *ActivityCoAntroller) SpecialMsg() {
 // @Param   WhichDay   query   string  false       "哪一天 今天:1、明天:2,多个用 , 隔开"
 // @Param   IsPower   query   int  false       "是否选择有权限行业 ,1是 0 否 默认0"
 // @Success 200 {object} models.ActivityTypeListHomeRespPc
-// @router /labelTypeListV6Pc [get]
+// @router /labelTypeListV6Pc_del [get]
 func (this *ActivityCoAntroller) LabelTypeListV6Pc() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
@@ -3727,6 +3763,7 @@ func (this *ActivityCoAntroller) ActivityVideoHistoryAdd() {
 // @Param   PageSize   query   int  true       "每页数据条数"
 // @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
 // @Param   KeyWord   query   string  false       "搜索关键词 多个用 , 隔开"
+// @Param   IsResearch   query   bool  true       "是否为研选"
 // @Success 200 {object} models.GetCygxActivityListRep
 // @router /listSearch [get]
 func (this *ActivityCoAntroller) ActivityListSearch() {
@@ -3833,8 +3870,8 @@ func (this *ActivityCoAntroller) OverActivityList() {
 	var conditionSpecial string
 	var sortTime string
 	var pars []interface{}
-	//已结束的活动
-	condition = ` AND art.publish_status = 1  AND art.label != ''  AND art.active_state = 3 `
+	//已结束的活动  不展示研选 11.0
+	condition = ` AND art.publish_status = 1  AND art.label != ''  AND art.active_state = 3  AND art.chart_permission_id !=  ` + strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN)
 	if whichDay != "" {
 		var startDate string
 		var endDate string

+ 39 - 0
controllers/activity_special.go

@@ -7,6 +7,7 @@ import (
 	"hongze/hongze_cygx/services"
 	"hongze/hongze_cygx/utils"
 	"strconv"
+	"strings"
 	"time"
 )
 
@@ -246,6 +247,7 @@ func (this *ActivitySpecialCoAntroller) SpecialTripAdd() {
 			itemBill.RegisterPlatform = 1
 			itemBill.ChartPermissionId = activityInfo.ChartPermissionId
 
+
 			var itemMeeting = new(models.CygxActivitySpecialMeetingDetail)
 			itemMeeting.UserId = user.UserId
 			itemMeeting.ActivityId = activityId
@@ -319,6 +321,24 @@ func (this *ActivitySpecialCoAntroller) SpecialTripAdd() {
 					itemBill.BillDetailed = 0 //48小时之内,取消报名之后二次报名,不扣除流水记录
 				}
 			}
+			userType, tripRemaining, mapChartName, err := services.GetChartPermissionSpecialSurplusByCompany(user.CompanyId)
+			if err != nil {
+				br.Msg = "获取专项调研剩余次数失败"
+				br.ErrMsg = "获取专项调研剩余次数失败,err:" + err.Error()
+				return
+			}
+			if userType == 2 {
+				tripRemaining = tripRemaining+itemBill.BillDetailed
+				itemBill.Total = strconv.Itoa(tripRemaining) + "次"
+			} else {
+				for k, num := range mapChartName {
+					if activityInfo.ChartPermissionName == k {
+						num = num+ itemBill.BillDetailed
+					}
+					itemBill.Total += k + strconv.Itoa(num) + "次+"
+				}
+				itemBill.Total = strings.TrimRight(itemBill.Total, "+")
+			}
 			//添加流水记录
 			err = models.AddCygxActivitySpecialTripBill(itemBill)
 			if err != nil {
@@ -413,6 +433,25 @@ func (this *ActivitySpecialCoAntroller) Tripcancel() {
 		isValid = 1
 		itemBill.BillDetailed = 0 //48小时之内取消的活动扣点不返回
 	}
+	userType, tripRemaining, mapChartName, err := services.GetChartPermissionSpecialSurplusByCompany(user.CompanyId)
+	if err != nil {
+		br.Msg = "获取专项调研剩余次数失败"
+		br.ErrMsg = "获取专项调研剩余次数失败,err:" + err.Error()
+		return
+	}
+	if userType == 2 {
+		tripRemaining += itemBill.BillDetailed
+		itemBill.Total = strconv.Itoa(tripRemaining) + "次"
+	} else {
+		for k, num := range mapChartName {
+			if activityInfo.ChartPermissionName == k {
+				num += itemBill.BillDetailed
+			}
+			itemBill.Total += k + strconv.Itoa(num) + "次+"
+		}
+		itemBill.Total = strings.TrimRight(itemBill.Total, "+")
+	}
+
 	err = models.CancelActivitySpecialTripIsValid(isValid, activityInfo.ActivityId, uid)
 	if err != nil {
 		br.Msg = "操作失败"

+ 56 - 0
controllers/article.go

@@ -90,6 +90,7 @@ func (this *ArticleController) Detail() {
 	if strings.Contains(detail.CategoryName, utils.CHART_PERMISSION_NAME_YANXUAN) {
 		detail.IsResearch = true
 	}
+
 	// 高毅资产的联系人,有权限的行业也不能查看报告详情页。提示无权限页面
 	if detail.ArticleTypeId == 0 && user.CompanyId == utils.GAO_YI_ZI_CHAN_COMPANY_ID {
 		_, sellerName, sellerMobile, popupMsg, err := services.GetUserHasPermissionArticle(user)
@@ -428,6 +429,9 @@ Loop:
 			detail.ReportLink += "?token=" + chartUserTokenByMobile
 		}
 	}
+	if detail.ArticleTypeId == 14 {
+		detail.IsApplyAppointmentExpert = true //判断文章类型是否属于专家访谈  查研观向11.0
+	}
 	resp.HasPermission = hasPermission
 	resp.HaveResearch = haveResearch
 	resp.Detail = detail
@@ -1646,3 +1650,55 @@ func (this *ArticleCommonController) PageHistoryPublic() {
 	br.Success = true
 	br.Msg = "新增成功"
 }
+
+// @Title 约访专家
+// @Description 约访专家接口
+// @Param  request	body models.CygxArticleIdReq true "type json string"
+// @Success 200 {object}
+// @router /applyAppointmentExpert [post]
+func (this *ArticleController) ApplyAppointmentExpert() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	user := this.User
+	if user == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	var req models.CygxArticleIdReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	articleId := req.ArticleId
+	var condition string
+	var pars []interface{}
+	condition += ` AND article_id =? AND user_id = ?  `
+	pars = append(pars, articleId, user.UserId)
+	total, err := models.GetCygxArticleApplyAppointmentExpertCount(condition, pars)
+	if err != nil {
+		br.Msg = "约访专家失败"
+		br.ErrMsg = "约访专家失败,Err:" + err.Error()
+		return
+	}
+	if total > 0 {
+		br.Msg = "您已提交申请,请勿重复提交。"
+		return
+	}
+	err = services.AddArticleApplyAppointmentExpert(user, articleId)
+	if err != nil {
+		br.Msg = "约访专家失败"
+		br.ErrMsg = "约访专家失败,Err:" + err.Error()
+		return
+	}
+	services.SendArticleApplyAppointmentExpertTemplateMsg(user, articleId)
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 132 - 0
controllers/banner.go

@@ -4,6 +4,8 @@ import (
 	"encoding/json"
 	"hongze/hongze_cygx/models"
 	"hongze/hongze_cygx/services"
+	"hongze/hongze_cygx/utils"
+	"time"
 )
 
 // Banner
@@ -95,3 +97,133 @@ func (this *BannerController) History() {
 	br.Success = true
 	br.Msg = "记录成功"
 }
+
+// @Title 研选banner列表
+// @Description 研选banner列表接口
+// @Success Ret=200 {object} cygx.CygxBannerListResp
+// @router /listYx [get]
+func (this *BannerController) ListYx() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	user := this.User
+	if user == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	resp := new(models.BannerUrlYxListResp)
+	var listA []*models.BannerUrlYxResp
+	var listB []*models.BannerUrlYxResp
+	listA = []*models.BannerUrlYxResp{
+		&models.BannerUrlYxResp{IndexImg: "https://hzstatic.hzinsights.com/banner/yx/1.png", Path: "pages-purchaser/leaflet/leaflet?leafletImage=https%3A%2F%2Fhzstatic.hzinsights.com%2Fcygx%2Fconfig%2Fresearch_11_0.png"},
+		&models.BannerUrlYxResp{IndexImg: "https://hzstatic.hzinsights.com/banner/yx/2.png", Path: "pages-purchaser/survey/surveySubmit"},
+	}
+
+	listB = []*models.BannerUrlYxResp{
+		&models.BannerUrlYxResp{IndexImg: "https://hzstatic.hzinsights.com/banner/yx/3.png", Path: "/index/"},
+	}
+	resp.ListA = listA
+	resp.ListB = listB
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 提交我要调研内容
+// @Description 提交我要调研内容接口
+// @Param	request	body cygx.CygxBannerIdReq true "type json string"
+// @Success 200 Ret=200 提交成功
+// @router /add/yxSurvey [post]
+func (this *BannerController) YxSurvey() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	user := this.User
+	if user == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	var req models.CygxBannerYxSurveyReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	content := req.Content
+	if content == "" {
+		br.Msg = "内容不能为空"
+		br.ErrMsg = "内容不能为空"
+		return
+	}
+	item := new(models.CygxBannerYxSurvey)
+	item.UserId = user.UserId
+	item.CreateTime = time.Now()
+	item.ModifyTime = time.Now()
+	item.Mobile = user.Mobile
+	item.Email = user.Email
+	item.CompanyId = user.CompanyId
+	item.CompanyName = user.CompanyName
+	item.Content = content
+	item.RegisterPlatform = utils.REGISTER_PLATFORM
+	sellerItem, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	item.RealName = user.RealName
+	if sellerItem != nil {
+		item.SellerName = sellerItem.RealName
+	}
+	newId, err := models.AddCygxBannerYxSurvey(item)
+	if err != nil {
+		br.Msg = "申请失败"
+		br.ErrMsg = "申请失败,Err:" + err.Error()
+		return
+	}
+	go services.SendCygxBannerYxSurveyTemplateMsg(user, content, int(newId))
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "记录成功"
+}
+
+// @Title 我要调研内容详情
+// @Description 我要调研内容详情接口
+// @Param   SuveryId   query   int  true       "ID"
+// @Success Ret=200 {object} cygx.CygxBannerListResp
+// @router /yxSurvey/detail [get]
+func (this *BannerController) YxSurveyDetail() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	user := this.User
+	if user == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	suveryId, _ := this.GetInt("SuveryId")
+	resp := new(models.CygxBannerYxSurveyRespDetailResp)
+	detail, err := models.GetCygxBannerYxSurveyDetail(suveryId)
+	if err != nil {
+		br.Msg = "详情不存在"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	resp.Detail = detail
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 42 - 102
controllers/home.go

@@ -559,64 +559,6 @@ func (this *HomeController) ListHomeArtAndChart() {
 			list = homeList
 		}
 
-		////研选的五张图片
-		//detailResearch, err := models.GetConfigByCode("category_research_img_url")
-		//if err != nil {
-		//	br.Msg = "获取数据失败"
-		//	br.ErrMsg = "获取数据研选分类图片失败,Err:" + err.Error()
-		//	return
-		//}
-		//researchList := strings.Split(detailResearch.ConfigValue, "{|}")
-		////对应分类的所图片
-		//detailCategoryUrl, err := models.GetConfigByCode("category_map_img_url")
-		//if err != nil {
-		//	br.Msg = "获取数据失败"
-		//	br.ErrMsg = "行业配置信息失败,Err:" + err.Error()
-		//	return
-		//}
-		//categoryUrlList := strings.Split(detailCategoryUrl.ConfigValue, "{|}")
-		//mapCategoryUrl := make(map[string]string)
-		//var categoryId string
-		//var imgUrlChart string
-		//for _, v := range categoryUrlList {
-		//	vslice := strings.Split(v, "_")
-		//	categoryId = vslice[0]
-		//	imgUrlChart = vslice[len(vslice)-1]
-		//	mapCategoryUrl[categoryId] = imgUrlChart
-		//}
-		//
-		//for k, v := range list {
-		//	if v.HomeType != 0 {
-		//		continue
-		//	}
-		//	item := list[k]
-		//	//如果文章一开始的内容是图片,优先展示第一张图片
-		//	imgurl, _ := services.FixArticleImgUrl(html.UnescapeString(list[k].Body))
-		//	newBody, _ := services.GetReportContentTextSubByarticle(item.Body, item.Annotation, item.ArticleId)
-		//	list[k].Body = newBody
-		//	if imgurl != "" {
-		//		list[k].BodyHtml = imgurl
-		//	}
-		//	list[k].PublishDate = utils.StrTimeToTime(item.PublishDate).Format(utils.FormatDate) //时间字符串格式转时间格式
-		//	if strings.Contains(item.CategoryName, utils.CHART_PERMISSION_NAME_YANXUAN) {
-		//		list[k].IsResearch = true
-		//	}
-		//	if item.Pv > 999 {
-		//		list[k].Pv = 999
-		//	}
-		//	//如果是研选系列的任意取五张图片的中的一张
-		//	if v.CategoryId == "0" {
-		//		knum := v.ArticleId % 5
-		//		list[k].ImgUrlPc = researchList[knum]
-		//	} else {
-		//		list[k].ImgUrlPc = mapCategoryUrl[v.CategoryId]
-		//	}
-		//	if list[k].ArticleId < utils.SummaryArticleId {
-		//		list[k].HttpUrl = utils.StrategyPlatform + strconv.Itoa(v.ArticleId)
-		//		list[k].IsNeedJump = true
-		//	}
-		//	list[k].Source = 1
-		//}
 		resp.List, err = services.HandleArticleCategoryImg(list)
 		if err != nil {
 			br.Msg = "获取信息失败"
@@ -684,11 +626,11 @@ func (this *HomeController) NewList() {
 	}
 
 	var articleTypes, activityTypes, industries, subjectNames string
-	articleTypeCondSlice := make([]string,0)
-	activityTypesCondSlice := make([]string,0)
-	industriesCondSlice := make([]string,0)
-	subjectNamesSlice := make([]string,0)
-	articleTypeSlice := make([]string,0)
+	articleTypeCondSlice := make([]string, 0)
+	activityTypesCondSlice := make([]string, 0)
+	industriesCondSlice := make([]string, 0)
+	subjectNamesSlice := make([]string, 0)
+	articleTypeSlice := make([]string, 0)
 	if tagIds != "" {
 		tags := strings.Split(tagIds, ",")
 		for _, tagIdStr := range tags {
@@ -739,48 +681,48 @@ func (this *HomeController) NewList() {
 				var articleTypeStr string
 				if articleType != "" {
 					articleTypeSlice := strings.Split(articleType, ",")
-					newArticleTypeSlice := make([]string,0)
+					newArticleTypeSlice := make([]string, 0)
 					for _, s := range articleTypeSlice {
-						newArticleTypeSlice = append(newArticleTypeSlice, "'"+ s + "'")
+						newArticleTypeSlice = append(newArticleTypeSlice, "'"+s+"'")
 					}
 					articleTypeStr = strings.Join(newArticleTypeSlice, ",")
-					articleTypeStr = strings.TrimRight(articleTypeStr,",")
-					articleTypeCond += ` AND (art.sub_category_name In (`+ articleTypeStr +`) OR (art.article_type_name In (`+ articleTypeStr +`) AND art.article_type_name <> '路演精华' AND art.article_type_id <> 0 ) ) `
+					articleTypeStr = strings.TrimRight(articleTypeStr, ",")
+					articleTypeCond += ` AND (art.sub_category_name In (` + articleTypeStr + `) OR (art.article_type_name In (` + articleTypeStr + `) AND art.article_type_name <> '路演精华' AND art.article_type_id <> 0 ) ) `
 				}
 				activityTypesCond := ``
 				if activityType != "" {
 					activityTypeSlice := strings.Split(activityType, ",")
-					newActivityTypeSlice := make([]string,0)
+					newActivityTypeSlice := make([]string, 0)
 					for _, s := range activityTypeSlice {
-						newActivityTypeSlice = append(newActivityTypeSlice, "'"+ s + "'")
+						newActivityTypeSlice = append(newActivityTypeSlice, "'"+s+"'")
 					}
 					activityTypeStr := strings.Join(newActivityTypeSlice, ",")
-					activityTypeStr = strings.TrimRight(activityTypeStr,",")
-					activityTypesCond += ` AND act.activity_type_name In (`+ activityTypeStr +`) `
+					activityTypeStr = strings.TrimRight(activityTypeStr, ",")
+					activityTypesCond += ` AND act.activity_type_name In (` + activityTypeStr + `) `
 				}
 				industriesCond := ``
 				var industryStr string
 				if industry != "" {
 					industrieSlice := strings.Split(industry, ",")
-					newIndustrieSlice := make([]string,0)
+					newIndustrieSlice := make([]string, 0)
 					for _, s := range industrieSlice {
-						newIndustrieSlice = append(newIndustrieSlice, "'"+ s + "'")
+						newIndustrieSlice = append(newIndustrieSlice, "'"+s+"'")
 					}
 					industryStr = strings.Join(newIndustrieSlice, ",")
 					industryStr = strings.TrimRight(industryStr, ",")
-					industriesCond += ` AND im.industry_name In (`+ industryStr +`) `
+					industriesCond += ` AND im.industry_name In (` + industryStr + `) `
 				}
 				subjectNamesCond := ``
 				var subjectNameStr string
 				if subjectName != "" {
 					subjectNameSlice := strings.Split(subjectName, ",")
-					newSubjectNameSlice := make([]string,0)
+					newSubjectNameSlice := make([]string, 0)
 					for _, s := range subjectNameSlice {
-						newSubjectNameSlice = append(newSubjectNameSlice, "'"+ s + "'")
+						newSubjectNameSlice = append(newSubjectNameSlice, "'"+s+"'")
 					}
 					subjectNameStr = strings.Join(newSubjectNameSlice, ",")
 					subjectNameStr = strings.TrimRight(subjectNameStr, ",")
-					subjectNamesCond += ` AND cis.subject_name In (`+ subjectNameStr +`) `
+					subjectNamesCond += ` AND cis.subject_name In (` + subjectNameStr + `) `
 				}
 				articleTypeCondSlice = append(articleTypeCondSlice, articleTypeCond)
 				activityTypesCondSlice = append(activityTypesCondSlice, activityTypesCond)
@@ -800,61 +742,61 @@ func (this *HomeController) NewList() {
 		return
 	}
 
-	articleTypes = strings.TrimRight(articleTypes,",")
-	activityTypes = strings.TrimRight(activityTypes,",")
-	industries = strings.TrimRight(industries,",")
-	subjectNames = strings.TrimRight(subjectNames,",")
+	articleTypes = strings.TrimRight(articleTypes, ",")
+	activityTypes = strings.TrimRight(activityTypes, ",")
+	industries = strings.TrimRight(industries, ",")
+	subjectNames = strings.TrimRight(subjectNames, ",")
 
 	articleTypesCond := ``
 	var articleTypeStr string
 	if articleTypes != "" {
 		articleTypeSlice := strings.Split(articleTypes, ",")
-		newArticleTypeSlice := make([]string,0)
+		newArticleTypeSlice := make([]string, 0)
 		for _, s := range articleTypeSlice {
-			newArticleTypeSlice = append(newArticleTypeSlice, "'"+ s + "'")
+			newArticleTypeSlice = append(newArticleTypeSlice, "'"+s+"'")
 		}
 		articleTypeStr = strings.Join(newArticleTypeSlice, ",")
-		articleTypeStr = strings.TrimRight(articleTypeStr,",")
-		articleTypesCond += ` AND (art.sub_category_name In (`+ articleTypeStr +`) OR (art.article_type_name In (`+ articleTypeStr +`) AND art.article_type_name <> '路演精华' AND art.article_type_id <> 0 ) ) `
+		articleTypeStr = strings.TrimRight(articleTypeStr, ",")
+		articleTypesCond += ` AND (art.sub_category_name In (` + articleTypeStr + `) OR (art.article_type_name In (` + articleTypeStr + `) AND art.article_type_name <> '路演精华' AND art.article_type_id <> 0 ) ) `
 	}
 	activityTypesCond := ``
 	if activityTypes != "" {
 		activityTypeSlice := strings.Split(activityTypes, ",")
-		newActivityTypeSlice := make([]string,0)
+		newActivityTypeSlice := make([]string, 0)
 		for _, s := range activityTypeSlice {
-			newActivityTypeSlice = append(newActivityTypeSlice, "'"+ s + "'")
+			newActivityTypeSlice = append(newActivityTypeSlice, "'"+s+"'")
 		}
 		activityTypeStr := strings.Join(newActivityTypeSlice, ",")
-		activityTypeStr = strings.TrimRight(activityTypeStr,",")
-		activityTypesCond += ` AND act.activity_type_name In (`+ activityTypeStr +`) `
+		activityTypeStr = strings.TrimRight(activityTypeStr, ",")
+		activityTypesCond += ` AND act.activity_type_name In (` + activityTypeStr + `) `
 	}
 	industriesCond := ``
 	var industryStr string
 	if industries != "" {
 		industrieSlice := strings.Split(industries, ",")
-		newIndustrieSlice := make([]string,0)
+		newIndustrieSlice := make([]string, 0)
 		for _, s := range industrieSlice {
-			newIndustrieSlice = append(newIndustrieSlice, "'"+ s + "'")
+			newIndustrieSlice = append(newIndustrieSlice, "'"+s+"'")
 		}
 		industryStr = strings.Join(newIndustrieSlice, ",")
 		industryStr = strings.TrimRight(industryStr, ",")
-		industriesCond += ` AND im.industry_name In (`+ industryStr +`) `
+		industriesCond += ` AND im.industry_name In (` + industryStr + `) `
 	}
 	subjectNamesCond := ``
 	var subjectNameStr string
 	if subjectNames != "" {
 		subjectNameSlice := strings.Split(subjectNames, ",")
-		newSubjectNameSlice := make([]string,0)
+		newSubjectNameSlice := make([]string, 0)
 		for _, s := range subjectNameSlice {
-			newSubjectNameSlice = append(newSubjectNameSlice, "'"+ s + "'")
+			newSubjectNameSlice = append(newSubjectNameSlice, "'"+s+"'")
 		}
 		subjectNameStr = strings.Join(newSubjectNameSlice, ",")
 		subjectNameStr = strings.TrimRight(subjectNameStr, ",")
-		subjectNamesCond += ` AND cis.subject_name In (`+ subjectNameStr +`) `
+		subjectNamesCond += ` AND cis.subject_name In (` + subjectNameStr + `) `
 	}
 
-	var tagArticleIds,tagActivityIds, mmIds string
-	if articleTypesCond != "" || activityTypesCond != "" || industryStr != "" || subjectNameStr != ""{
+	var tagArticleIds, tagActivityIds, mmIds string
+	if articleTypesCond != "" || activityTypesCond != "" || industryStr != "" || subjectNameStr != "" {
 		tagArticleIds, tagActivityIds, mmIds, err = models.GetCygxCygxArticleListByCondition(articleTypesCond, activityTypesCond, industryStr, subjectNameStr, articleTypeStr)
 		if err != nil && err.Error() != utils.ErrNoRow() {
 			br.Msg = "获取失败"
@@ -923,7 +865,6 @@ func (this *HomeController) NewList() {
 		}
 		lenActivityIds := len(activityIds)
 
-
 		listActivitySpecial, _, err := services.GetActivitySpecialList(user, 1, 200, "")
 		if err != nil {
 			br.Msg = "获取失败"
@@ -937,12 +878,11 @@ func (this *HomeController) NewList() {
 		}
 		lenActivityspecialIds := len(activityspecialIds)
 
-
 		if tagIds != "" {
 			if tagArticleIds != "" {
 				condition = ` AND ((source = 'article' AND source_id IN (` + tagArticleIds + `) ) `
 				if mmIds != "" {
-					condition = ` OR ( source = 'meetingreviewchapt' AND source_id IN (` + mmIds + `) )   `
+					condition += ` OR ( source = 'meetingreviewchapt' AND source_id IN (` + mmIds + `) )   `
 				}
 				if tagActivityIds != "" && lenActivityIds > 0 {
 					condition += ` OR (source = 'activity' AND source_id IN (` + tagActivityIds + `) AND source_id IN (` + utils.GetOrmInReplace(lenActivityIds) + `) )) `
@@ -954,7 +894,7 @@ func (this *HomeController) NewList() {
 			} else if tagActivityIds != "" {
 				condition = ` AND ((source = 'article' AND source_id IN (0))  `
 				if mmIds != "" {
-					condition = ` OR ( source = 'meetingreviewchapt' AND source_id IN (` + mmIds + `) )   `
+					condition += ` OR ( source = 'meetingreviewchapt' AND source_id IN (` + mmIds + `) )   `
 				}
 				if tagActivityIds != "" && lenActivityIds > 0 {
 					condition += ` OR (source = 'activity' AND source_id IN (` + tagActivityIds + `) AND source_id IN (` + utils.GetOrmInReplace(lenActivityIds) + `))) `
@@ -975,7 +915,7 @@ func (this *HomeController) NewList() {
 			pars = append(pars, activityIds)
 		}
 
-		if lenActivityspecialIds > 0  && tagIds == "" {
+		if lenActivityspecialIds > 0 && tagIds == "" {
 			condition += ` OR ( source = 'activityspecial' AND source_id IN (` + utils.GetOrmInReplace(lenActivityspecialIds) + `) ` + conditionInit + ` )   `
 			pars = append(pars, activityspecialIds)
 		}

+ 7 - 0
controllers/search.go

@@ -597,6 +597,7 @@ func (this *SearchController) ListHomeArtAndChartPage() {
 	resp.ChartList = chartList
 	var result []*models.SearchItem
 	var total int64
+	var articleIds []int
 	if listType == 1 || listType == 2 {
 		//添加映射关系
 		keyWord = strings.ToUpper(keyWord)
@@ -668,6 +669,7 @@ func (this *SearchController) ListHomeArtAndChartPage() {
 			}
 			result[k].Source = 1
 			v.PublishDate = utils.TimeRemoveHms(v.PublishDate)
+			articleIds = append(articleIds, v.ArticleId)
 		}
 	}
 	//记录用户搜索关键词
@@ -688,6 +690,11 @@ func (this *SearchController) ListHomeArtAndChartPage() {
 	}
 	if len(result) == 0 {
 		result = make([]*models.SearchItem, 0)
+	} else {
+		yxArticleIdMap := services.GetYxArticleIdMap(articleIds)
+		for _, v := range result {
+			v.IsResearch = yxArticleIdMap[v.ArticleId] // 添加是否属于研选的标识
+		}
 	}
 	page := paging.GetPaging(currentIndex, pageSize, int(total))
 	resp.Paging = page

+ 2 - 1
controllers/user.go

@@ -568,10 +568,11 @@ func (this *UserController) CollectList() {
 		list[i].DepartmentId = article.DepartmentId
 		list[i].NickName = article.NickName
 		list[i].PublishDate = article.PublishDate
-		if article.ArticleId < utils.SummaryArticleId {
+		if article.ArticleTypeId == 0 {
 			list[i].Source = 1
 		} else {
 			list[i].Source = 2
+			list[i].IsResearch = true
 		}
 		if mapArticleCollectNum[article.ArticleId] != nil {
 			list[i].CollectNum = mapArticleCollectNum[article.ArticleId].CollectNum

+ 162 - 154
models/activity.go

@@ -11,63 +11,66 @@ import (
 
 // 活动详情
 type CygxActivity struct {
-	ActivityId              int       `orm:"column(activity_id);pk";description:"活动ID 等于0新增活动,大于0修改活动"`
-	ActivityTypeId          int       `description:"活动类型id"`
-	ActivityTypeName        string    `description:"活动类型名称"`
-	ChartPermissionId       int       `description:"行业id"`
-	ChartPermissionName     string    `description:"行业名称"`
-	ChartPermissionNames    string    `description:"行业名称辅助字段,区分研选子分类"`
-	Body                    string    `description:"内容"`
-	CreateTime              time.Time `description:"创建时间"`
-	IsLimitPeople           int       `description:"是否限制人数 1是,0否"`
-	LimitPeopleNum          int       `description:"限制的人数数量"`
-	CustomerTypeIds         string    `description:"活动可见的客户类型,多个ID用 , 隔开"`
-	PublishStatus           int       `description:"发布状态 1已发布,0未发布"`
-	LastUpdatedTime         time.Time `description:"更新时间"`
-	ActivityTime            string    `description:"活动时间"`
-	ActivityTimeText        string    `description:"活动时间带文字"`
-	DistinguishedGuest      string    `description:"嘉宾"`
-	Host                    string    `description:"主持人"`
-	MainlandTell            string    `description:"大陆拨入号"`
-	HongKongTell            string    `description:"香港拨入号"`
-	TaiwanTell              string    `description:"台湾拨入号"`
-	AmericaTell             string    `description:"美国拨入号"`
-	ParticipationCode       string    `description:"参会密码"`
-	Theme                   string    `description:"主题"`
-	Expert                  string    `description:"专家"`
-	ActivityName            string    `description:"活动名称"`
-	ActivityNameTask        string    `description:"活动名称定时任务同步的时候使用"`
-	OnlineParticipation     string    `description:"网络参会"`
-	ReportLink              string    `description:"报告链接"`
-	City                    string    `description:"城市"`
-	Address                 string    `description:"活动地址"`
-	Highlights              string    `description:"活动亮点"`
-	Remarks                 string    `description:"备注"`
-	Speaker                 string    `description:"主讲人"`
-	ArticleId               int       `description:"关联报告id"`
-	Label                   string    `description:"标签"`
-	LinkParticipants        string    `description:"链接参会"`
-	AppAttendance           string    `description:"App参会"`
-	ConferencePassword      string    `description:"会议密码"`
-	TemporaryLabel          string    `description:"临时标签"`
-	IsMakerShow             int       `description:"是否仅决策人可见 0,否 、1,是"`
-	VisibleRange            int       `description:"可见范围 1,仅本组可见 、2,全部客户可见"`
-	Scale                   string    `description:"管理规模,空不填,1::50亿以下,2:50~100亿,3:100亿以上。多个用, 隔开"`
-	IsShowSubjectName       int       `description:"小程序内是否展示标的名称 1是 ,0 否 默认0 "`
-	IsHideAppointment       int       `description:"是否隐藏预约纪要按钮 1是 ,0 否 默认0 "`
-	AdminId                 int       `description:"销售/管理员ID"`
-	AdminName               string    `description:"销售/管理员姓名"`
-	IsCanAppointmentMinutes int       `description:"是否可预约纪要 1是 ,0 否 默认0 "`
-	YidongActivityId        string    `description:"易董活动ID"`
-	YidongActivityUrl       string    `description:"易董活动跳转地址"`
-	YidongActivityEndTime   string    `description:"易董活动截止时间"`
-	ActivityJoinType        string    `description:"活动入会类型01报名审核后可入会 02预约即可入会 03仅定向邀请人员可入会"`
-	YidongSignUpEnd         string    `description:"易董活动截止时间"` // 报名结束时间,适应于报名审核后可入会,为空表示不限制报名时间
-	YidongSignUpStart       string    `description:"易董活动截止时间"` // 报名开始时间,适应于报名审核后可入会,为空表示不限制报名时间
-	IsExternalLabel         int       `description:"是否为外部资源 1是,0否"`
-	YidongActivityIdByCygx  string    `description:"通过查研观向建会易董返回的活动ID"`
-	JmcjRoadshowTitle       string    `description:"进门财经的活动标题"`
-	JmcjActivityId          string    `description:"进门财经的活动ID"`
+	ActivityId                int       `orm:"column(activity_id);pk";description:"活动ID 等于0新增活动,大于0修改活动"`
+	ActivityTypeId            int       `description:"活动类型id"`
+	ActivityTypeName          string    `description:"活动类型名称"`
+	ChartPermissionId         int       `description:"行业id"`
+	ChartPermissionName       string    `description:"行业名称"`
+	ChartPermissionNames      string    `description:"行业名称辅助字段,区分研选子分类"`
+	IsShowHz                  int       `description:"是否同时在弘则展示  1是,0否"`
+	ChartPermissionIdDeputy   int       `description:"行业id"`
+	ChartPermissionNameDeputy string    `description:"副行业名称"`
+	Body                      string    `description:"内容"`
+	CreateTime                time.Time `description:"创建时间"`
+	IsLimitPeople             int       `description:"是否限制人数 1是,0否"`
+	LimitPeopleNum            int       `description:"限制的人数数量"`
+	CustomerTypeIds           string    `description:"活动可见的客户类型,多个ID用 , 隔开"`
+	PublishStatus             int       `description:"发布状态 1已发布,0未发布"`
+	LastUpdatedTime           time.Time `description:"更新时间"`
+	ActivityTime              string    `description:"活动时间"`
+	ActivityTimeText          string    `description:"活动时间带文字"`
+	DistinguishedGuest        string    `description:"嘉宾"`
+	Host                      string    `description:"主持人"`
+	MainlandTell              string    `description:"大陆拨入号"`
+	HongKongTell              string    `description:"香港拨入号"`
+	TaiwanTell                string    `description:"台湾拨入号"`
+	AmericaTell               string    `description:"美国拨入号"`
+	ParticipationCode         string    `description:"参会密码"`
+	Theme                     string    `description:"主题"`
+	Expert                    string    `description:"专家"`
+	ActivityName              string    `description:"活动名称"`
+	ActivityNameTask          string    `description:"活动名称定时任务同步的时候使用"`
+	OnlineParticipation       string    `description:"网络参会"`
+	ReportLink                string    `description:"报告链接"`
+	City                      string    `description:"城市"`
+	Address                   string    `description:"活动地址"`
+	Highlights                string    `description:"活动亮点"`
+	Remarks                   string    `description:"备注"`
+	Speaker                   string    `description:"主讲人"`
+	ArticleId                 int       `description:"关联报告id"`
+	Label                     string    `description:"标签"`
+	LinkParticipants          string    `description:"链接参会"`
+	AppAttendance             string    `description:"App参会"`
+	ConferencePassword        string    `description:"会议密码"`
+	TemporaryLabel            string    `description:"临时标签"`
+	IsMakerShow               int       `description:"是否仅决策人可见 0,否 、1,是"`
+	VisibleRange              int       `description:"可见范围 1,仅本组可见 、2,全部客户可见"`
+	Scale                     string    `description:"管理规模,空不填,1::50亿以下,2:50~100亿,3:100亿以上。多个用, 隔开"`
+	IsShowSubjectName         int       `description:"小程序内是否展示标的名称 1是 ,0 否 默认0 "`
+	IsHideAppointment         int       `description:"是否隐藏预约纪要按钮 1是 ,0 否 默认0 "`
+	AdminId                   int       `description:"销售/管理员ID"`
+	AdminName                 string    `description:"销售/管理员姓名"`
+	IsCanAppointmentMinutes   int       `description:"是否可预约纪要 1是 ,0 否 默认0 "`
+	YidongActivityId          string    `description:"易董活动ID"`
+	YidongActivityUrl         string    `description:"易董活动跳转地址"`
+	YidongActivityEndTime     string    `description:"易董活动截止时间"`
+	ActivityJoinType          string    `description:"活动入会类型01报名审核后可入会 02预约即可入会 03仅定向邀请人员可入会"`
+	YidongSignUpEnd           string    `description:"易董活动截止时间"` // 报名结束时间,适应于报名审核后可入会,为空表示不限制报名时间
+	YidongSignUpStart         string    `description:"易董活动截止时间"` // 报名开始时间,适应于报名审核后可入会,为空表示不限制报名时间
+	IsExternalLabel           int       `description:"是否为外部资源 1是,0否"`
+	YidongActivityIdByCygx    string    `description:"通过查研观向建会易董返回的活动ID"`
+	JmcjRoadshowTitle         string    `description:"进门财经的活动标题"`
+	JmcjActivityId            string    `description:"进门财经的活动ID"`
 }
 
 type ActivityCheck struct {
@@ -141,98 +144,101 @@ type ActivityArticleResp struct {
 
 // 活动详情
 type ActivityDetail struct {
-	ActivityId              int                        `orm:"column(activity_id);pk";description:"活动ID "`
-	ActivityTypeId          int                        `description:"活动类型id"`
-	PublishStatus           int                        `description:"发布状态,0未发布,1已发布"`
-	ActivityTypeName        string                     `description:"活动类型名称"`
-	ChartPermissionId       int                        `description:"行业id"`
-	ChartPermissionName     string                     `description:"行业名称"`
-	ChartPermissionNames    string                     `description:"行业名称辅助字段,区分研选子分类"`
-	Body                    string                     `description:"内容"`
-	CreateTime              string                     `description:"创建时间"`
-	IsLimitPeople           int                        `description:"是否限制人数 1是,0否"`
-	LimitPeopleNum          int                        `description:"限制的人数数量"`
-	LastUpdatedTime         string                     `description:"更新时间"`
-	ActivityTime            string                     `description:"活动时间"`
-	ActivityTimeText        string                     `description:"活动时间带文字"`
-	DistinguishedGuest      string                     `description:"嘉宾"`
-	Host                    string                     `description:"主持人"`
-	Speaker                 string                     `description:"主讲人"`
-	MainlandTell            string                     `description:"大陆拨入号"`
-	HongKongTell            string                     `description:"香港拨入号"`
-	TaiwanTell              string                     `description:"台湾拨入号"`
-	AmericaTell             string                     `description:"美国拨入号"`
-	ParticipationCode       string                     `description:"参会密码"`
-	Theme                   string                     `description:"主题"`
-	Expert                  string                     `description:"专家"`
-	ActivityName            string                     `description:"活动名称"`
-	OnlineParticipation     string                     `description:"网络参会"`
-	ReportLink              string                     `description:"报告链接"`
-	City                    string                     `description:"城市"`
-	Address                 string                     `description:"活动地址"`
-	Highlights              string                     `description:"活动亮点"`
-	Remarks                 string                     `description:"备注"`
-	ShowType                string                     `description:"人数限制类型,1不展示限制,2可选限制,3强制限制"`
-	IsSignup                int                        `description:"是否已报名 1是 ,0 否"`
-	IsAppointment           int                        `description:"是否已预约纪要 1是 ,0 否"`
-	SignupNum               int                        `description:"已报名人数"`
-	SignupType              int                        `description:"报名方式,1预约外呼,2自主拨入,3我要报名"`
-	ActiveState             string                     `description:"活动进行状态 未开始:1、进行中2、已结束3"`
-	IsCancelMeetingReminder int                        `description:"是否取消会议提醒 1展示取消会议提醒 ,0展示会议提醒"`
-	ArticleId               int                        `description:"报告id(报告链接跳转使用)"`
-	CustomerTypeIds         string                     `description:"活动可见的客户类型,多个ID用 , 隔开"`
-	IsShowSustainable       bool                       `description:"是否展示限免标签"`
-	Description             string                     `description:"研选内容说明"`
-	IsResearch              bool                       `description:"是否属于研选"`
-	LinkParticipants        string                     `description:"链接参会"`
-	AppAttendance           string                     `description:"App参会"`
-	ConferencePassword      string                     `description:"会议密码"`
-	Scale                   string                     `description:"管理规模,空不填,1::50亿以下,2:50~100亿,3:100亿以上。多个用, 隔开"`
-	IsShowAppointment       bool                       `description:"是否展示预约纪要"`
-	IsHideAppointment       int                        `description:"是否隐藏预约纪要按钮  1是,0 否"`
-	IsCClassMeeting         bool                       `description:"是否是c类电话会"`
-	ArticleList             []*ActivityArticleResp     // 下面是列表添加的部分结构体
-	IsBrackets              int                        `description:"是否有方括号 1是 ,0 否"`
-	Label                   string                     `description:"主题标签"`
-	ImgUrl                  string                     `description:"图片链接"`
-	ImgUrlText              string                     `description:"图片链接文字"`
-	ActivityType            int                        `description:"活动线上线下类型 1线上,0 线下"`
-	JmcjRoadshowTitle       string                     `description:"进门财经手动匹配的活动名称"`
-	Listndustrial           []*IndustrialManagementRep `description:"活动关联的产业信息"`
-	IsShowOutboundCall      bool                       `description:"是否展示预约外呼"`
-	IsShowMeetingReminder   bool                       `description:"是否展示会议提醒"`
-	IsShowHelpSsk           bool                       `description:"是否展示帮我带问"`
-	IsShowSignup            bool                       `description:"是否展示我要报名"`
-	IsShowDetails           bool                       `description:"是否展示查看详情按钮"`
-	TemporaryLabel          string                     `description:"临时标签"`
-	IsCanAppointmentMinutes int                        `description:"是否可预约纪要 1是 ,0 否 默认0 "`
-	YidongActivityId        string                     `description:"易董活动ID"`
-	YidongActivityUrl       string                     `description:"易董活动跳转地址"`
-	AudioLink               bool                       `description:"是否展示回放按钮"`
-	VoiceList               *CygxActivityVoiceReq      `description:"音频数据"`
-	AdminId                 int                        `description:"管理员、销售ID "`
-	IsMakerShow             int                        `description:"是否仅决策人可见 0,否 、1,是"`
-	VisibleRange            int                        `description:"可见范围 1,仅本组可见 、2,全部客户可见"`
-	VideoDetail             *CygxActivityVideoListResp `description:"视频数据"`
-	FileType                int                        `description:"类型: 1-音频; 2-视频"`
-	IsCollect               bool                       `description:"是否收藏"`
-	SourceType              int                        `description:"活动来源。 1:活动 、2:专项产业调研"`
-	TripImgLink             string                     `description:"专项产业调研行程链接"`
-	ActivityTimeEnd         string                     `description:"专项产业调研活动预期结束时间"`
-	IsShowFollowButton      bool                       `description:"是否展示关注取关按钮"`
-	IsFollowButton          bool                       `description:"是否关注"`
-	IsYidongConduct         bool                       `description:"是否属于易董办会 1:是 、0:否"`
-	IsCanOutboundCall       int                        `description:"是否提供外呼 1:是 、0:否"`
-	TencentConferenceNumber string                     `description:"腾讯会议号"`
-	YidongActivityIdByCygx  string                     `description:"通过查研观向建会易董返回的活动ID"`
-	IsShowSigninButton      bool                       `description:"是否展示签到码按钮"`
-	IsShowSignUpDetail      bool                       `description:"是否展示报名详情按钮"`
-	SigninImg               string                     `description:"签到码图片"`
-	IsNeedEmail             int                        `description:"是否需要提供邮箱 1是,0否"`
-	SiginupDeadline         string                     `description:"报名截止时间"`
-	IsExternalLabel         bool                       `description:"是否为外部资源"`
-	IsResearchPoints        bool                       `description:"是否为研选扣点"`
-	CancelDeadline          string                     `description:"取消报名截止时间"`
+	ActivityId                int                        `orm:"column(activity_id);pk";description:"活动ID "`
+	ActivityTypeId            int                        `description:"活动类型id"`
+	PublishStatus             int                        `description:"发布状态,0未发布,1已发布"`
+	ActivityTypeName          string                     `description:"活动类型名称"`
+	ChartPermissionId         int                        `description:"行业id"`
+	ChartPermissionName       string                     `description:"行业名称"`
+	ChartPermissionNames      string                     `description:"行业名称辅助字段,区分研选子分类"`
+	Body                      string                     `description:"内容"`
+	CreateTime                string                     `description:"创建时间"`
+	IsLimitPeople             int                        `description:"是否限制人数 1是,0否"`
+	LimitPeopleNum            int                        `description:"限制的人数数量"`
+	LastUpdatedTime           string                     `description:"更新时间"`
+	ActivityTime              string                     `description:"活动时间"`
+	ActivityTimeText          string                     `description:"活动时间带文字"`
+	DistinguishedGuest        string                     `description:"嘉宾"`
+	Host                      string                     `description:"主持人"`
+	Speaker                   string                     `description:"主讲人"`
+	MainlandTell              string                     `description:"大陆拨入号"`
+	HongKongTell              string                     `description:"香港拨入号"`
+	TaiwanTell                string                     `description:"台湾拨入号"`
+	AmericaTell               string                     `description:"美国拨入号"`
+	ParticipationCode         string                     `description:"参会密码"`
+	Theme                     string                     `description:"主题"`
+	Expert                    string                     `description:"专家"`
+	ActivityName              string                     `description:"活动名称"`
+	OnlineParticipation       string                     `description:"网络参会"`
+	ReportLink                string                     `description:"报告链接"`
+	City                      string                     `description:"城市"`
+	Address                   string                     `description:"活动地址"`
+	Highlights                string                     `description:"活动亮点"`
+	Remarks                   string                     `description:"备注"`
+	ShowType                  string                     `description:"人数限制类型,1不展示限制,2可选限制,3强制限制"`
+	IsSignup                  int                        `description:"是否已报名 1是 ,0 否"`
+	IsAppointment             int                        `description:"是否已预约纪要 1是 ,0 否"`
+	SignupNum                 int                        `description:"已报名人数"`
+	SignupType                int                        `description:"报名方式,1预约外呼,2自主拨入,3我要报名"`
+	ActiveState               string                     `description:"活动进行状态 未开始:1、进行中2、已结束3"`
+	IsCancelMeetingReminder   int                        `description:"是否取消会议提醒 1展示取消会议提醒 ,0展示会议提醒"`
+	ArticleId                 int                        `description:"报告id(报告链接跳转使用)"`
+	CustomerTypeIds           string                     `description:"活动可见的客户类型,多个ID用 , 隔开"`
+	IsShowSustainable         bool                       `description:"是否展示限免标签"`
+	Description               string                     `description:"研选内容说明"`
+	IsResearch                bool                       `description:"是否属于研选"`
+	IsResearchSpecial         bool                       `description:"是否属于特殊的研选"`
+	LinkParticipants          string                     `description:"链接参会"`
+	AppAttendance             string                     `description:"App参会"`
+	ConferencePassword        string                     `description:"会议密码"`
+	Scale                     string                     `description:"管理规模,空不填,1::50亿以下,2:50~100亿,3:100亿以上。多个用, 隔开"`
+	IsShowAppointment         bool                       `description:"是否展示预约纪要"`
+	IsHideAppointment         int                        `description:"是否隐藏预约纪要按钮  1是,0 否"`
+	IsCClassMeeting           bool                       `description:"是否是c类电话会"`
+	ArticleList               []*ActivityArticleResp     // 下面是列表添加的部分结构体
+	IsBrackets                int                        `description:"是否有方括号 1是 ,0 否"`
+	Label                     string                     `description:"主题标签"`
+	ImgUrl                    string                     `description:"图片链接"`
+	ImgUrlText                string                     `description:"图片链接文字"`
+	ActivityType              int                        `description:"活动线上线下类型 1线上,0 线下"`
+	JmcjRoadshowTitle         string                     `description:"进门财经手动匹配的活动名称"`
+	Listndustrial             []*IndustrialManagementRep `description:"活动关联的产业信息"`
+	IsShowOutboundCall        bool                       `description:"是否展示预约外呼"`
+	IsShowMeetingReminder     bool                       `description:"是否展示会议提醒"`
+	IsShowHelpSsk             bool                       `description:"是否展示帮我带问"`
+	IsShowSignup              bool                       `description:"是否展示我要报名"`
+	IsShowDetails             bool                       `description:"是否展示查看详情按钮"`
+	TemporaryLabel            string                     `description:"临时标签"`
+	IsCanAppointmentMinutes   int                        `description:"是否可预约纪要 1是 ,0 否 默认0 "`
+	YidongActivityId          string                     `description:"易董活动ID"`
+	YidongActivityUrl         string                     `description:"易董活动跳转地址"`
+	AudioLink                 bool                       `description:"是否展示回放按钮"`
+	VoiceList                 *CygxActivityVoiceReq      `description:"音频数据"`
+	AdminId                   int                        `description:"管理员、销售ID "`
+	IsMakerShow               int                        `description:"是否仅决策人可见 0,否 、1,是"`
+	VisibleRange              int                        `description:"可见范围 1,仅本组可见 、2,全部客户可见"`
+	VideoDetail               *CygxActivityVideoListResp `description:"视频数据"`
+	FileType                  int                        `description:"类型: 1-音频; 2-视频"`
+	IsCollect                 bool                       `description:"是否收藏"`
+	SourceType                int                        `description:"活动来源。 1:活动 、2:专项产业调研"`
+	TripImgLink               string                     `description:"专项产业调研行程链接"`
+	ActivityTimeEnd           string                     `description:"专项产业调研活动预期结束时间"`
+	IsShowFollowButton        bool                       `description:"是否展示关注取关按钮"`
+	IsFollowButton            bool                       `description:"是否关注"`
+	IsYidongConduct           bool                       `description:"是否属于易董办会 1:是 、0:否"`
+	IsCanOutboundCall         int                        `description:"是否提供外呼 1:是 、0:否"`
+	TencentConferenceNumber   string                     `description:"腾讯会议号"`
+	YidongActivityIdByCygx    string                     `description:"通过查研观向建会易董返回的活动ID"`
+	IsShowSigninButton        bool                       `description:"是否展示签到码按钮"`
+	IsShowSignUpDetail        bool                       `description:"是否展示报名详情按钮"`
+	SigninImg                 string                     `description:"签到码图片"`
+	IsNeedEmail               int                        `description:"是否需要提供邮箱 1是,0否"`
+	SiginupDeadline           string                     `description:"报名截止时间"`
+	IsExternalLabel           bool                       `description:"是否为外部资源"`
+	IsResearchPoints          bool                       `description:"是否为研选扣点"`
+	ImgUrlBgYx                string                     `description:"研选背景图片"`
+	CancelDeadline            string                     `description:"取消报名截止时间"`
+	ChartPermissionNameDeputy string                     `description:"副行业名称"`
 }
 type ListArticleActivity struct {
 	Title   string `description:"文章标题"`
@@ -551,7 +557,7 @@ func UpdateActivitySattusToHaveInHand() (err error) {
 	condition += ` AND activity_time < NOW()`
 	sqlOr = condition
 	condition += ` AND (activity_type_id IN ( 1, 2, 3, 7 ) AND  activity_time > ` + "'" + resultTime_30 + "'" + ")"
-	condition += ` OR(activity_type_id IN ( 4, 5, 6 ) AND  activity_time > ` + "'" + resultTime_60 + "'" + sqlOr + ")"
+	condition += ` OR(activity_type_id IN ( 4, 5, 6, 8 ) AND  activity_time > ` + "'" + resultTime_60 + "'" + sqlOr + ")"
 	msql := " UPDATE cygx_activity SET active_state = 2 WHERE 1 = 1 " + condition
 	_, err = o.Raw(msql).Exec()
 	return
@@ -574,7 +580,7 @@ func UpdateActivitySattusToComplete() (err error) {
 	//condition += ` AND activity_time < NOW()`
 	//sqlOr = condition
 	condition += ` AND (activity_type_id IN ( 1, 2, 3, 7 ) AND  activity_time < ` + "'" + resultTime_30 + "'" + ")"
-	condition += ` OR(activity_type_id IN ( 4, 5, 6 ) AND  activity_time < ` + "'" + resultTime_60 + "'" + ")"
+	condition += ` OR(activity_type_id IN ( 4, 5, 6 ,8 ) AND  activity_time < ` + "'" + resultTime_60 + "'" + ")"
 	msql := " UPDATE cygx_activity SET active_state = 3 WHERE 1 = 1 " + condition
 	_, err = o.Raw(msql).Exec()
 	return
@@ -782,19 +788,21 @@ type CygxActivityLabelList struct {
 	Resource          int    `description:"位置 ,1:活动 ,2:专项产业调研"`
 	TemporaryLabel    string `description:"临时标签"`
 	IsNew             bool   `description:"是否为新:活动存在关联的的产业所关联的报告均在3个月内/无报告则标记新"`
-	YidongActivityId  int    `description:"易董活动ID"`
+	YidongActivityId  string `description:"易董活动ID"`
 	IsExternalLabel   bool   `description:"是否为外部资源"`
 	IsResearchPoints  bool   `description:"是否为研选扣点"`
 	TripStatus        int    `description:"行程进行状态 1:预报名,2:确定行程"`
 	City              string `description:"城市"`
 	Days              int    `description:"天数"`
 	ActivityTypeId    int    `description:"活动类型id"`
+	IsResearch        bool   `description:"是否属于研选"`
+	ChartPermissionId int    `description:"行业id"`
 }
 
 // 主题列表
 func GetActivityLabelListAll(condition, sortTime string, pars []interface{}, startSize, pageSize int) (items []*CygxActivityLabelList, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT	activity_id,activity_type_id, label,temporary_label,is_show_subject_name, MAX( art.activity_time ) AS timesort, MIn( art.activity_time ) AS mintimesort , yidong_activity_id,city,is_external_label,is_research_points
+	sql := `SELECT	activity_id,activity_type_id, label,temporary_label,is_show_subject_name, MAX( art.activity_time ) AS timesort, MIn( art.activity_time ) AS mintimesort , yidong_activity_id,city,is_external_label,is_research_points,chart_permission_id
 		FROM cygx_activity as art WHERE 1= 1 `
 	if condition != "" {
 		sql += condition
@@ -1193,7 +1201,7 @@ func GetActivityListNew(condition string, pars []interface{}, uid, startSize, pa
 	}
 
 	o := orm.NewOrm()
-	sql := `SELECT art.* ,t.activity_type,t.img_url_text,c.image_url as  img_url,
+	sql := `SELECT art.* ,t.activity_type,t.img_url_text,c.image_url as  img_url,t.img_url_bg_yx,
 		( SELECT COUNT( 1 ) FROM cygx_activity_signup AS s WHERE s.activity_id = art.activity_id AND s.user_id = ?   AND s.is_cancel = 0  AND s.do_fail_type = 0) AS is_signup,
 		( SELECT COUNT( DISTINCT user_id ) FROM cygx_activity_signup AS s WHERE s.activity_id = art.activity_id   AND s.is_cancel = 0  AND s.do_fail_type = 0) AS signup_num,
 		( SELECT COUNT( 1 ) FROM cygx_activity_meeting_reminder AS m WHERE m.activity_id = art.activity_id AND m.user_id = ?  AND m.is_cancel = 0  ) AS is_cancel_meeting_reminder,

+ 147 - 0
models/activity_special_trip_bill.go

@@ -21,6 +21,9 @@ type CygxActivitySpecialTripBill struct {
 	DoType            int       `description:"操作方式,1报名,2取消报名"`
 	RegisterPlatform  int       `description:"来源 1小程序,2:网页"`
 	ChartPermissionId int       `description:"行业id"`
+	Way               int       `description:"1报名,取消报名。2到会取消到会 3转正或清零 4取消活动"`
+	Content           string    `description:"内容"`
+	Total             string    `description:"总和"`
 }
 
 // 添加
@@ -42,3 +45,147 @@ func GetCygxActivitySpecialTripBill(condition string, pars []interface{}) (item
 	_, err = o.Raw(sql, pars).QueryRows(&item)
 	return
 }
+
+type CygxActivitySpecialTripBillList struct {
+	Id                  int       `orm:"column(id);pk"`
+	UserId              int       `description:"用户id,多个用,隔开"`
+	ActivityId          int       `description:"活动ID"`
+	CreateTime          time.Time `description:"创建时间"`
+	Mobile              string    `description:"手机号"`
+	Email               string    `description:"邮箱号"`
+	CompanyId           int       `description:"公司ID"`
+	CompanyName         string    `description:"公司名称"`
+	RealName            string    `description:"用户实际名称"`
+	AdminId             int       `description:"销售/管理员ID"`
+	Source              int       `description:"来源,1小程序,2后台添加, 3开发人员手动添加"`
+	BillDetailed        int       `description:"流水明细,判断是进账还是出账"`
+	DoType              int       `description:"操作方式,1报名,2取消报名"`
+	RegisterPlatform    int       `description:"来源 1小程序,2:网页"`
+	ChartPermissionId   int       `description:"行业id"`
+	ChartPermissionName string    `description:"行业名称"`
+	Way                 int       `description:"1报名,取消报名。2到会取消到会 3转正或清零 4取消活动"`
+	Content             string    `description:"内容"`
+}
+
+func GetCygxActivitySpecialTripBillList(condition string, pars []interface{}) (item []*CygxActivitySpecialTripBillList, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+			b.*,
+			c.chart_permission_name 
+		FROM
+			cygx_activity_special_trip_bill AS b
+			LEFT JOIN chart_permission AS c ON c.chart_permission_id = b.chart_permission_id 
+		WHERE
+			1 = 1` + condition
+	_, err = o.Raw(sql, pars).QueryRows(&item)
+	return
+}
+
+type SpecialBillInitBig struct {
+	ApprovalTime time.Time
+	CompanyId    int
+	CompanyName  string
+}
+
+func GetActivitySecialTirpBillForInit(packageType int) (item []*SpecialBillInitBig, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT
+	a.approve_time,d.company_id,c.company_name 
+FROM
+	company_approval a
+	INNER JOIN company_contract b ON a.company_contract_id = b.company_contract_id
+	INNER JOIN company c ON a.company_id = c.company_id
+	INNER JOIN cygx_company_user_type d ON a.company_id = d.company_id
+WHERE
+	a.apply_method = 1 
+	AND a.product_id = 2 
+	AND a.approve_status = '已审批' 
+	AND b.product_id = 2 
+	AND d.package_type = ?
+	GROUP BY d.company_id `
+	_, err = o.Raw(sql, packageType).QueryRows(&item)
+	return
+}
+
+type SpecialBillInitNotBig struct {
+	ApprovalTime       time.Time
+	CompanyId          int
+	CompanyName        string
+	ChartPermissionIds string
+}
+
+func GetActivitySecialTirpBillForInitNotBig() (item []*SpecialBillInitNotBig, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT
+	a.approve_time,d.company_id,d.company_name,GROUP_CONCAT(DISTINCT c.chart_permission_id) AS chart_permission_ids
+FROM
+	company_approval a
+	INNER JOIN company_contract b ON a.company_contract_id = b.company_contract_id
+	INNER JOIN company_report_permission c ON a.company_id = c.company_id 
+	INNER JOIN company d ON a.company_id = d.company_id
+WHERE
+	a.apply_method = 1 
+	AND a.product_id = 2 
+	AND a.approve_status = '已审批' 
+	AND b.product_id = 2 
+	AND c.product_id = 2
+	AND c.is_upgrade = 1
+	GROUP BY d.company_id `
+	_, err = o.Raw(sql).QueryRows(&item)
+	return
+}
+
+// 批量添加
+func AddCygxActivitySpecialTripBillMulti(items []*CygxActivitySpecialTripBill) (err error) {
+	o := orm.NewOrm()
+	if len(items) > 0 {
+		//批量添加
+		_, err = o.InsertMulti(len(items), items)
+	}
+	return
+}
+
+type SpecialBillInitReduce struct {
+	CreateTime       time.Time
+	CompanyId          int
+	CompanyName        string
+}
+
+func GetActivitySecialTirpBillForReduce() (item []*SpecialBillInitReduce, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT
+	a.create_time,a.company_id,c.company_name 
+FROM
+	company_operation_record a
+	INNER JOIN company c ON a.company_id = c.company_id
+	INNER JOIN company_report_permission e ON a.company_id = e.company_id 
+WHERE
+	a.operation = 'try_out' 
+	AND a.product_id = 2 
+	AND e.status NOT IN ('正式','永续')
+	GROUP BY a.company_id `
+	_, err = o.Raw(sql).QueryRows(&item)
+	return
+}
+
+func GetCygxActivitySpecialTripBillForInit() (item []*CygxActivitySpecialTripBill, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * FROM cygx_activity_special_trip_bill GROUP BY company_id `
+	_, err = o.Raw(sql).QueryRows(&item)
+	return
+}
+
+func GetCygxActivitySpecialTripBillByCompanyIdForInit(companyId int) (item []*CygxActivitySpecialTripBill, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * FROM cygx_activity_special_trip_bill WHERE company_id = ? ORDER BY create_time DESC  `
+	_, err = o.Raw(sql, companyId).QueryRows(&item)
+	return
+}
+
+
+func UpdateCygxActivitySpecialTripBillByCompanyIdForInit(total string, id int) (err error) {
+	o := orm.NewOrm()
+	sql := ` UPDATE cygx_activity_special_trip_bill SET total=? WHERE id = ?  `
+	_, err = o.Raw(sql,total, id).Exec()
+	return
+}

+ 9 - 6
models/activity_type.go

@@ -18,7 +18,7 @@ type ActivityTypeListResp struct {
 	List []*ActivityType
 }
 
-//列表
+// 列表
 func GetActivityTypeList() (items []*ActivityType, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT * FROM cygx_activity_type ORDER BY sort DESC`
@@ -61,15 +61,18 @@ type ActivityTypeHomePc struct {
 	List             []*CygxActivityLabelList
 }
 
-//列表
-func GetActivityTypeHomeList() (items []*ActivityTypeHome, err error) {
+// 列表
+func GetActivityTypeHomeList(condition string, pars []interface{}) (items []*ActivityTypeHome, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT * FROM cygx_activity_type ORDER BY sort DESC`
-	_, err = o.Raw(sql).QueryRows(&items)
+	sql := `SELECT * FROM cygx_activity_type  WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
 	return
 }
 
-//列表
+// 列表
 func GetActivityTypeHomeListPc() (items []*ActivityTypeHomePc, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT * FROM cygx_activity_type WHERE activity_type_id != 7   ORDER BY sort DESC`

+ 59 - 53
models/article.go

@@ -79,6 +79,10 @@ type CygxArticleEs struct {
 	MatchTypeName    string `description:"匹配类型"`
 }
 
+type CygxArticleIdReq struct {
+	ArticleId int `description:"文章id"`
+}
+
 // 新增文章
 func AddCygxArticle(item *CygxArticle) (lastId int64, err error) {
 	o := orm.NewOrm()
@@ -116,63 +120,65 @@ type HomeArticle struct {
 	Readnum             int                  `description:"阅读数量"`
 	Cover               string               `description:"封面图片"`
 	BodyHighlight       []string             `description:"搜索高亮展示结果"`
+	ArticleTypeId       int                  `description:"文章类型ID"`
 	List                []*IndustrialManagementIdInt
 }
 
 type ArticleDetail struct {
-	ArticleId               int    `description:"报告id"`
-	Title                   string `description:"标题"`
-	TitleEn                 string `description:"英文标题 "`
-	UpdateFrequency         string `description:"更新周期"`
-	CreateDate              string `description:"创建时间"`
-	PublishDate             string `description:"发布时间"`
-	Body                    string `description:"内容"`
-	Abstract                string `description:"摘要"`
-	CategoryName            string `description:"一级分类"`
-	SubCategoryName         string `description:"二级分类"`
-	IsCollect               bool   `description:"是否收藏:true,已收藏,false:未收藏"`
-	IsInterviewApply        bool   `description:"是否申请访谈:true,已申请,false:未申请"`
-	BodyText                string `description:"内容"`
-	InterviewApplyStatus    string `description:"当前访谈申请状态:'待邀请','待访谈','已完成','已取消'"`
-	InterviewDate           string `description:"访谈时间"`
-	ExpertBackground        string `description:"专家背景"`
-	ExpertNumber            string `description:"专家编号"`
-	Department              string `description:"作者"`
-	SellerMobile            string `description:"销售手机号"`
-	SellerName              string `description:"销售名称"`
-	ArticleIdMd5            string `description:"纪要id"`
-	IsClass                 int    `description:"是否归类,1是,0否"`
-	CategoryId              int    `description:"分类ID"`
-	IsSummary               int    `description:"是否是纪要库,1是,0否"`
-	IsReport                int    `description:"是否属于报告,1是,0否"`
-	IsResearch              bool   `description:"是否属于研选"`
-	FileLink                string `description:"下载预览链接"`
-	SellerAndMobile         string `description:"销售和手机号"`
-	IsFollow                bool   `description:"是否关注,1是,0否"`
-	IsBelongSummary         bool   `description:"是否属于纪要库"`
-	IsBelongReport          bool   `description:"是否属于报告"`
-	FollowNum               int    `description:"关注数量"`
-	CollectionNum           int    `description:"收藏数量"`
-	DepartmentId            int    `description:"作者ID"`
-	DepartmentImgUrl        string `description:"作者头像"`
-	NickName                string `description:"作者昵称"`
-	SubjectIds              string `description:"文章关联标的的ID字符串"`
-	IndustrialAndSubjectIds string `description:"文章关联产业和标的的ID字符串"`
-	IndustrialManagementId  int    `description:"文章关联产业ID"`
-	SellerList              []*SellerRep
-	HttpUrl                 string `description:"文章链接跳转地址"`
-	IsNeedJump              bool   `description:"是否需要跳转链接地址"`
-	ReportLink              string `description:"报告链接"`
-	IsShowLinkButton        int    `description:"这种报告类型是否展示查看报告链接"`
-	ArticleTypeId           int    `description:"文章类型ID"`
-	IsSpecialArticle        bool   `description:"是否属于专项调研报告"`
-	Annotation              string `description:"核心观点"`
-	IsShowFollowButton      bool   `description:"是否展示关注取关按钮"`
-	IsFollowButton          bool   `description:"是否关注"`
-	IsRoadShow              bool   `description:"是否是路演精华"`
-	ReportType              int    `description:"报告类型,1行业报告,2产业报告,0无"`
-	FieldName               string `description:"策略平台的领域字段名称"`
-	TypeName                string `description:"策略平台类型字段名称"`
+	ArticleId                int    `description:"报告id"`
+	Title                    string `description:"标题"`
+	TitleEn                  string `description:"英文标题 "`
+	UpdateFrequency          string `description:"更新周期"`
+	CreateDate               string `description:"创建时间"`
+	PublishDate              string `description:"发布时间"`
+	Body                     string `description:"内容"`
+	Abstract                 string `description:"摘要"`
+	CategoryName             string `description:"一级分类"`
+	SubCategoryName          string `description:"二级分类"`
+	IsCollect                bool   `description:"是否收藏:true,已收藏,false:未收藏"`
+	IsInterviewApply         bool   `description:"是否申请访谈:true,已申请,false:未申请"`
+	BodyText                 string `description:"内容"`
+	InterviewApplyStatus     string `description:"当前访谈申请状态:'待邀请','待访谈','已完成','已取消'"`
+	InterviewDate            string `description:"访谈时间"`
+	ExpertBackground         string `description:"专家背景"`
+	ExpertNumber             string `description:"专家编号"`
+	Department               string `description:"作者"`
+	SellerMobile             string `description:"销售手机号"`
+	SellerName               string `description:"销售名称"`
+	ArticleIdMd5             string `description:"纪要id"`
+	IsClass                  int    `description:"是否归类,1是,0否"`
+	CategoryId               int    `description:"分类ID"`
+	IsSummary                int    `description:"是否是纪要库,1是,0否"`
+	IsReport                 int    `description:"是否属于报告,1是,0否"`
+	IsResearch               bool   `description:"是否属于研选"`
+	FileLink                 string `description:"下载预览链接"`
+	SellerAndMobile          string `description:"销售和手机号"`
+	IsFollow                 bool   `description:"是否关注,1是,0否"`
+	IsBelongSummary          bool   `description:"是否属于纪要库"`
+	IsBelongReport           bool   `description:"是否属于报告"`
+	FollowNum                int    `description:"关注数量"`
+	CollectionNum            int    `description:"收藏数量"`
+	DepartmentId             int    `description:"作者ID"`
+	DepartmentImgUrl         string `description:"作者头像"`
+	NickName                 string `description:"作者昵称"`
+	SubjectIds               string `description:"文章关联标的的ID字符串"`
+	IndustrialAndSubjectIds  string `description:"文章关联产业和标的的ID字符串"`
+	IndustrialManagementId   int    `description:"文章关联产业ID"`
+	SellerList               []*SellerRep
+	HttpUrl                  string `description:"文章链接跳转地址"`
+	IsNeedJump               bool   `description:"是否需要跳转链接地址"`
+	ReportLink               string `description:"报告链接"`
+	IsShowLinkButton         int    `description:"这种报告类型是否展示查看报告链接"`
+	ArticleTypeId            int    `description:"文章类型ID"`
+	IsSpecialArticle         bool   `description:"是否属于专项调研报告"`
+	Annotation               string `description:"核心观点"`
+	IsShowFollowButton       bool   `description:"是否展示关注取关按钮"`
+	IsFollowButton           bool   `description:"是否关注"`
+	IsRoadShow               bool   `description:"是否是路演精华"`
+	ReportType               int    `description:"报告类型,1行业报告,2产业报告,0无"`
+	FieldName                string `description:"策略平台的领域字段名称"`
+	TypeName                 string `description:"策略平台类型字段名称"`
+	IsApplyAppointmentExpert bool   `description:"是否属于专家访谈"`
 }
 
 type ArticleDetailFileLink struct {

+ 39 - 0
models/article_apply_appointment_expert.go

@@ -0,0 +1,39 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxArticleApplyAppointmentExpert struct {
+	Id               int       `gorm:"column:id;primary_key;AUTO_INCREMENT" json:"id"`
+	ArticleId        int       `gorm:"column:article_id" json:"article_id"`                                  // cygx_article表article_id
+	UserId           int       `gorm:"column:user_id" json:"user_id"`                                        // 用户ID
+	Mobile           string    `gorm:"column:mobile" json:"mobile"`                                          // 手机号
+	Email            string    `gorm:"column:email" json:"email"`                                            // 邮箱
+	CompanyId        int       `gorm:"column:company_id;default:0" json:"company_id"`                        // 公司ID
+	CompanyName      string    `gorm:"column:company_name" json:"company_name"`                              // 公司名称
+	RealName         string    `gorm:"column:real_name" json:"real_name"`                                    // 用户实际名称
+	SellerName       string    `gorm:"column:seller_name" json:"seller_name"`                                // 所属销售
+	CreateTime       time.Time `gorm:"column:create_time" json:"create_time"`                                // 创建时间
+	ModifyTime       time.Time `gorm:"column:modify_time" json:"modify_time"`                                // 修改时间
+	RegisterPlatform int       `gorm:"column:register_platform;default:1;NOT NULL" json:"register_platform"` // 来源 1小程序,2:网页
+}
+
+// 添加历史信息
+func AddCygxArticleApplyAppointmentExpert(item *CygxArticleApplyAppointmentExpert) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.Insert(item)
+	return
+}
+
+// 获取数量
+func GetCygxArticleApplyAppointmentExpertCount(condition string, pars []interface{}) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_article_apply_appointment_expert WHERE 1= 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	o := orm.NewOrm()
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}

+ 10 - 0
models/banner.go

@@ -72,6 +72,16 @@ type BannerUrlResp struct {
 	Path              string `description:"小程序路径"`
 }
 
+type BannerUrlYxResp struct {
+	IndexImg string `description:"小程序封面图"`
+	Path     string `description:"小程序路径"`
+}
+
+type BannerUrlYxListResp struct {
+	ListA []*BannerUrlYxResp
+	ListB []*BannerUrlYxResp
+}
+
 // 列表
 func GetCygxBannerImgList() (items []*CygxBannerImgResp, err error) {
 	o := orm.NewOrm()

+ 74 - 0
models/banner_yx_survey.go

@@ -0,0 +1,74 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+//type CygxBannerYxSurvey struct {
+//	SuveryId         int       `gorm:"column:suvery_id;primary_key;AUTO_INCREMENT" json:"suvery_id"`
+//	UserId           int       `gorm:"column:user_id" json:"user_id"`                                        // 用户ID
+//	Mobile           string    `gorm:"column:mobile" json:"mobile"`                                          // 手机号
+//	Email            string    `gorm:"column:email" json:"email"`                                            // 邮箱
+//	CompanyId        int       `gorm:"column:company_id;default:0" json:"company_id"`                        // 公司ID
+//	CompanyName      string    `gorm:"column:company_name" json:"company_name"`                              // 公司名称
+//	RealName         string    `gorm:"column:real_name" json:"real_name"`                                    // 用户实际名称
+//	SellerName       string    `gorm:"column:seller_name" json:"seller_name"`                                // 所属销售
+//	CreateTime       time.Time `gorm:"column:create_time" json:"create_time"`                                // 创建时间
+//	ModifyTime       time.Time `gorm:"column:modify_time" json:"modify_time"`                                // 修改时间
+//	RegisterPlatform int       `gorm:"column:register_platform;default:1;NOT NULL" json:"register_platform"` // 来源 1小程序,2:网页
+//	Content          string    `gorm:"column:content;NOT NULL" json:"content"`                               // 内容
+//}
+
+type CygxBannerYxSurvey struct {
+	SuveryId         int `orm:"column(suvery_id);pk"`
+	UserId           int
+	CreateTime       time.Time
+	Mobile           string    `description:"手机号"`
+	Email            string    `description:"邮箱"`
+	CompanyId        int       `description:"公司id"`
+	CompanyName      string    `description:"公司名称"`
+	ModifyTime       time.Time `description:"修改时间"`
+	RealName         string    `description:"用户实际名称"`
+	SellerName       string    `description:"所属销售"`
+	Content          string    `description:"内容"`
+	RegisterPlatform int       `description:"来源 1小程序,2:网页"`
+}
+
+type CygxBannerYxSurveyReq struct {
+	Content string `description:"内容"`
+}
+
+type CygxBannerYxSurveyResp struct {
+	SuveryId         int    `gorm:"column:suvery_id;primary_key;AUTO_INCREMENT" json:""`
+	UserId           int    `gorm:"column:user_id" json:""`                              // 用户ID
+	Mobile           string `gorm:"column:mobile" json:""`                               // 手机号
+	Email            string `gorm:"column:email" json:""`                                // 邮箱
+	CompanyId        int    `gorm:"column:company_id;default:0" json:""`                 // 公司ID
+	CompanyName      string `gorm:"column:company_name" json:""`                         // 公司名称
+	RealName         string `gorm:"column:real_name" json:""`                            // 用户实际名称
+	SellerName       string `gorm:"column:seller_name" json:""`                          // 所属销售
+	CreateTime       string `gorm:"column:create_time" json:""`                          // 创建时间
+	ModifyTime       string `gorm:"column:modify_time" json:""`                          // 修改时间
+	RegisterPlatform int    `gorm:"column:register_platform;default:1;NOT NULL" json:""` // 来源 1小程序,2:网页
+	Content          string `gorm:"column:content;NOT NULL" json:""`                     // 内容
+}
+
+// 添加信息
+func AddCygxBannerYxSurvey(item *CygxBannerYxSurvey) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.Insert(item)
+	return
+}
+
+// 通过ID获取详情
+func GetCygxBannerYxSurveyDetail(suveryId int) (item *CygxBannerYxSurveyResp, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_banner_yx_survey  WHERE suvery_id=?  `
+	err = o.Raw(sql, suveryId).QueryRow(&item)
+	return
+}
+
+type CygxBannerYxSurveyRespDetailResp struct {
+	Detail *CygxBannerYxSurveyResp
+}

+ 33 - 0
models/company/company_approval.go

@@ -0,0 +1,33 @@
+package company
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CompanyApproval struct {
+	CompanyApprovalId   int `orm:"column(company_approval_id);pk"`
+	CompanyId           int
+	ProductId           int
+	ApproveStatus       string    `description:"'待审批','已审批','驳回','已撤回'"`
+	ApproveUserId       int       `description:"审批人"`
+	ApproveRoleTypeCode string    `description:"审批人角色类型"`
+	ApproveRealName     string    `description:"审批人姓名"`
+	ApproveTime         time.Time `description:"审批时间"`
+	ApproveContent      string    `description:"待审内容"`
+	ApplyMethod         int       `description:"申请类型:1:试用->正式,2:冻结—>试用,3:试用延期,4:原销售申请领取流失客户,5:正式客户申请服务更新,6:正式客户补充协议"`
+	ApplyReasons        string    `description:"申请原因"`
+	ApplyUserId         int       `description:"申请人"`
+	ApplyRealName       string    `description:"申请人姓名"`
+	CreateTime          time.Time `description:"申请时间"`
+	ModifyTime          time.Time `description:"修改时间"`
+	CompanyContractId   int       `description:"合同id"`
+	IsFormal            int       `description:"是否已经转正式,0是没有转正式,1是已经转过正式"`
+}
+
+func GetCompanyApprovalById(companyId int) (item *CompanyApproval, err error) {
+	sql := `SELECT * FROM company_approval WHERE company_id=? AND product_id=2 AND approve_status='已审批' order by company_approval_id desc LIMIT 1 `
+	o := orm.NewOrm()
+	err = o.Raw(sql, companyId).QueryRow(&item)
+	return
+}

+ 26 - 0
models/company/company_contract.go

@@ -0,0 +1,26 @@
+package company
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CompanyContractPermission struct {
+	Id                int       `orm:"column(id);pk" description:"客户合同id"`
+	CompanyId         int       `description:"客户id"`
+	CompanyContractId int       `description:"合同id"`
+	ChartPermissionId int       `description:"权限id"`
+	IsUpgrade         int       `description:"是否升级,1是,0否"`
+	ExpensiveYx       int       `description:"权益研选: 0-3w; 1-5w"`
+	StartDate         string    `description:"开始日期"`
+	EndDate           string    `description:"结束日期"`
+	CreateTime        time.Time `description:"创建时间"`
+	ModifyTime        time.Time `description:"修改时间"`
+}
+
+func GetCompanyContractPermissionCheck(companyContractId, permissionId int) (count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT COUNT(1) AS count FROM company_contract_permission AS a WHERE a.company_contract_id=? AND a.chart_permission_id=? `
+	err = o.Raw(sql, companyContractId, permissionId).QueryRow(&count)
+	return
+}

+ 49 - 0
models/company_activity_trip.go

@@ -124,3 +124,52 @@ func GetCompanyPermissionNameCheck(companyId, productId int, permissionName stri
 	err = o.Raw(sql, companyId, productId, permissionName).QueryRow(&count)
 	return
 }
+
+
+// GetCompanyReportPermissionByCompanyIdAndProductId 获取权限类型
+func GetCompanyReportPermissionByCompanyIdAndProductId(companyId, productId int) (items []*CompanyReportPermission, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+	re.*
+FROM
+	company_report_permission  as re 
+	INNER JOIN chart_permission as  c ON c.chart_permission_id = re.chart_permission_id
+WHERE
+	re.company_id = ? 
+	AND re.product_id = ? 
+	AND STATUS = '正式' `
+	_, err = o.Raw(sql, companyId, productId).QueryRows(&items)
+	return
+}
+
+// GetCompanyReportPermissionByCompanyIdAndProductIdForInit 获取权限类型-初始化用,去掉正式的判断
+func GetCompanyReportPermissionByCompanyIdAndProductIdForInit(companyId, productId int) (items []*CompanyReportPermission, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+	re.*
+FROM
+	company_report_permission  as re 
+	INNER JOIN chart_permission as  c ON c.chart_permission_id = re.chart_permission_id
+WHERE
+	re.company_id = ? 
+	AND re.product_id = ? 
+	AND STATUS NOT IN ('正式','永续') GROUP BY re.chart_permission_id `
+	_, err = o.Raw(sql, companyId, productId).QueryRows(&items)
+	return
+}
+
+// GetCompanyReportPermissionByCompanyIdAndProductIdForInit 获取权限类型-初始化total用,去掉权限的判断
+func GetCompanyReportPermissionByCompanyIdAndProductIdForInit2(companyId, productId int) (items []*CompanyReportPermission, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+	re.*
+FROM
+	company_report_permission  as re 
+	INNER JOIN chart_permission as  c ON c.chart_permission_id = re.chart_permission_id
+WHERE
+	re.company_id = ? 
+	AND re.product_id = ? 
+	 `
+	_, err = o.Raw(sql, companyId, productId).QueryRows(&items)
+	return
+}

+ 6 - 4
models/company_interaction_num.go

@@ -22,18 +22,19 @@ type CygxCompanyInteractionNum struct {
 	ActivityVideoNum    int       `description:"活动视频播放量"`
 	ActivityVoiceNum    int       `description:"活动音频播放量"`
 	RoadshowNum         int       `description:"路演播放总数量"`
+	TagNum              int       `description:"标签点击次数"`
 	CreateTime          time.Time `description:"创建时间"`
 	ModifyTime          time.Time `description:"更新时间"`
 }
 
-//添加
+// 添加
 func AddCygxCompanyInteractionNum(item *CygxCompanyInteractionNum) (lastId int64, err error) {
 	o := orm.NewOrm()
 	lastId, err = o.Insert(item)
 	return
 }
 
-//修改
+// 修改
 func UpdateCygxCompanyInteractionNum(item *CygxCompanyInteractionNum) (err error) {
 	updateParams := make(map[string]interface{})
 	updateParams["CompanyId"] = item.CompanyId
@@ -51,6 +52,7 @@ func UpdateCygxCompanyInteractionNum(item *CygxCompanyInteractionNum) (err error
 	updateParams["ActivityVideoNum"] = item.ActivityVideoNum
 	updateParams["ActivityVoiceNum"] = item.ActivityVoiceNum
 	updateParams["RoadshowNum"] = item.RoadshowNum
+	updateParams["TagNum"] = item.TagNum
 	updateParams["CreateTime"] = time.Now()
 	updateParams["ModifyTime"] = time.Now()
 	whereParam := map[string]interface{}{"company_id": item.CompanyId}
@@ -58,7 +60,7 @@ func UpdateCygxCompanyInteractionNum(item *CygxCompanyInteractionNum) (err error
 	return
 }
 
-//获取列表
+// 获取列表
 func GetCygxCompanyInteractionNumList() (items []*CygxCompanyInteractionNum, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT * FROM cygx_company_interaction_num   `
@@ -66,7 +68,7 @@ func GetCygxCompanyInteractionNumList() (items []*CygxCompanyInteractionNum, err
 	return
 }
 
-//批量添加用户互动信息
+// 批量添加用户互动信息
 func AddCygxCompanyInteractionNumList(items []*CygxCompanyInteractionNum) (lastId int64, err error) {
 	o := orm.NewOrm()
 	_, err = o.InsertMulti(1, items)

+ 45 - 0
models/cygx_activity_special_points_company.go

@@ -0,0 +1,45 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxActivitySpecialInheritPointsCompany struct {
+	Id                  int       `orm:"column(id);pk"`
+	CompanyId           int       // 公司ID
+	CompanyName         string    // 公司名称
+	Points              int   // 公司剩余点数
+	CreateTime          time.Time // 创建时间
+	ModifyTime          time.Time // 更新时间
+	ChartPermissionId   int       // 品种ID
+	ChartPermissionName string    // 品种名称
+}
+
+func AddCygxActivitySpecialPointsCompany(item *CygxActivitySpecialInheritPointsCompany) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Insert(item)
+	if err != nil {
+		return
+	}
+	return
+}
+
+func AddCygxActivitySpecialInheritPointsCompanyMulti(items []*CygxActivitySpecialInheritPointsCompany) (err error) {
+	o := orm.NewOrm()
+	_, err = o.InsertMulti(1, items)
+	return
+}
+
+func GetCygxActivitySpecialInheritPointsByCompanyId(companyId int) (list []*CygxActivitySpecialInheritPointsCompany, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * FROM cygx_activity_special_inherit_points_company WHERE company_id = ?  `
+	_, err = o.Raw(sql,companyId).QueryRows(&list)
+	return
+}
+func DelCygxActivitySpecialInheritPointsByCompanyId(companyId int) (err error) {
+	o := orm.NewOrm()
+	sql := ` DELETE FROM cygx_activity_special_inherit_points_company WHERE company_id = ?  `
+	_, err = o.Raw(sql,companyId).Exec()
+	return
+}

+ 3 - 0
models/db.go

@@ -157,6 +157,9 @@ func init() {
 		new(CygxActivityPointsCompany),
 		new(CygxTagHistory),
 		new(CygxReportMappingCategoryGroup),
+		new(CygxActivitySpecialInheritPointsCompany),
+		new(CygxArticleApplyAppointmentExpert),
+		new(CygxBannerYxSurvey),
 	)
 	// 记录ORM查询日志
 	orm.Debug = true

+ 56 - 13
models/report.go

@@ -1031,6 +1031,7 @@ type ArticleReportBillboardResp struct {
 	Source         int    `description:"来源 1:弘则资源包(报告)、2:研选主题(报告)"`
 	IsRoadShow     bool   `description:"是否是路演精华"`
 	CategoryId     int    `description:"分类ID"`
+	IsResearch     bool   `description:"是否属于研选"`
 	List           []*IndustrialManagementIdInt
 }
 
@@ -1126,17 +1127,19 @@ WHERE
 }
 
 type TimeLineReportItem struct {
-	Id              int    `description:"文章或晨报点评id"`
-	Title           string `description:"标题"`
-	PublishTime     string `description:"发布时间"`
-	Content         string `description:"内容"`
-	VideoUrl        string `description:"视频链接"`
-	IsHaveVideo     bool   `description:"是否包含视频"`
-	ImgUrlPc        string `description:"pc图片"`
-	SubCategoryName string `description:"二级分类"`
-	IsRed           bool   `description:"是否标红"`
-	Readnum         int    `description:"阅读数量"`
-	Resource        int    `description:"来源类型,1:文章、2:产品内测、3:晨报点评"`
+	Id               int    `description:"文章或晨报点评id"`
+	Title            string `description:"标题"`
+	PublishTime      string `description:"发布时间"`
+	Content          string `description:"内容"`
+	VideoUrl         string `description:"视频链接"`
+	VoiceUrl         string `description:"音频链接"`
+	VoicePlaySeconds string `description:"音频时长"`
+	IsHaveVideo      bool   `description:"是否包含视频"`
+	ImgUrlPc         string `description:"pc图片"`
+	SubCategoryName  string `description:"二级分类"`
+	IsRed            bool   `description:"是否标红"`
+	Readnum          int    `description:"阅读数量"`
+	Resource         int    `description:"来源类型,1:文章、2:产品内测、3:晨报点评 4:活动回放视频 5:活动回放音频 "`
 }
 
 // 获取产业报告+晨会点评列表
@@ -1151,9 +1154,11 @@ FROM
 		a.title,
 		a.publish_date AS publish_time,
 		a.video_url,
+		'' AS voice_url,
 		a.sub_category_name,
 		'' AS content,
 		1 AS resource,
+		'' AS voice_play_seconds,
 		( SELECT COUNT( 1 ) FROM cygx_article_history_record AS rec WHERE rec.user_id = ` + strconv.Itoa(userId) + ` AND rec.article_id = a.article_id ) AS readnum 
 	FROM
 		cygx_article AS a
@@ -1167,9 +1172,11 @@ FROM
 		'' AS title,
 		mm.publish_time AS publish_time,
 		'' AS video_url,
+		'' AS voice_url,
 		'时间线' AS sub_category_name,
 		mmc.content,
 		3 AS resource,
+	'' AS voice_play_seconds,
 		0  AS readnum 
 	FROM
 		cygx_morning_meeting_review_chapter AS mmc
@@ -1183,9 +1190,11 @@ FROM
 		p.title,
 		p.publish_time,
 		'' AS video_url,
+		'' AS voice_url,
 		'' AS sub_category_name,
 		'' AS content,
 		2 AS resource,
+		'' AS voice_play_seconds,
 		0 AS readnum 
 	FROM
 		cygx_product_interior AS p
@@ -1193,12 +1202,46 @@ FROM
 	WHERE
 		p.product_interior_id = pm.product_interior_id 
 		AND p.visible_range = 1 
-	AND pm.industrial_management_id = ? 
+	AND pm.industrial_management_id = ? UNION ALL
+ 	SELECT 
+		ca.activity_id AS id,
+		cav.video_name AS title,
+		ca.activity_time AS publish_time,
+		cav.video_url AS video_url,
+		'' AS voice_url,
+		'' AS sub_category_name,
+		'' AS content,
+		4 AS resource,
+		'' AS voice_play_seconds,
+		( SELECT COUNT( 1 ) FROM cygx_activity_video_history AS rec WHERE rec.user_id = ` + strconv.Itoa(userId) + ` AND rec.activity_id = ca.activity_id ) AS readnum 
+	FROM 
+		cygx_activity AS ca 
+		INNER JOIN cygx_activity_video AS cav ON ca.activity_id = cav.activity_id 
+		INNER JOIN cygx_industrial_activity_group_management AS cam ON ca.activity_id=cam.activity_id
+	WHERE 
+		cam.industrial_management_id = ? AND cam.source = 1  UNION ALL
+ 	SELECT 
+		ca.activity_id AS id,
+		cavo.voice_name AS title,
+		ca.activity_time AS publish_time,
+		'' AS video_url,
+		cavo.voice_url AS voice_url,
+		'' AS sub_category_name,
+		'' AS content,
+		5 AS resource,
+		cavo.voice_play_seconds AS voice_play_seconds,
+		( SELECT COUNT( 1 ) FROM cygx_activity_voice_history AS rec WHERE rec.user_id = ` + strconv.Itoa(userId) + ` AND rec.activity_id = ca.activity_id ) AS readnum 
+	FROM 
+		cygx_activity AS ca 
+		INNER JOIN cygx_activity_voice AS cavo ON ca.activity_id = cavo.activity_id 
+		INNER JOIN cygx_industrial_activity_group_management AS cam ON ca.activity_id=cam.activity_id
+	WHERE 
+		cam.industrial_management_id = ? AND cam.source = 1 
 	) AS t 
 `
 	sql += ` ORDER BY 
 	t.publish_time DESC LIMIT ?,? `
-	_, err = o.Raw(sql, industrialManagementId, industrialManagementId, industrialManagementId, startSize, pageSize).QueryRows(&items)
+	_, err = o.Raw(sql, industrialManagementId, industrialManagementId, industrialManagementId, industrialManagementId, industrialManagementId, startSize, pageSize).QueryRows(&items)
 	return
 }
 

+ 1 - 0
models/search.go

@@ -15,6 +15,7 @@ type SearchItem struct {
 	CategoryId       string   `description:"文章分类"`
 	Source           int      `description:"来源  1:文章, 2:图表"`
 	IsNeedJump       bool     `description:"是否需要跳转链接地址"`
+	IsResearch       bool     `description:"是否属于研选"`
 }
 
 type CategoryItem struct {

+ 6 - 4
models/user_interaction_num.go

@@ -22,18 +22,19 @@ type CygxUserInteractionNum struct {
 	ActivityVideoNum    int       `description:"活动视频播放量"`
 	ActivityVoiceNum    int       `description:"活动音频播放量"`
 	RoadshowNum         int       `description:"路演播放总数量"`
+	TagNum              int       `description:"标签点击次数"`
 	CreateTime          time.Time `description:"创建时间"`
 	ModifyTime          time.Time `description:"更新时间"`
 }
 
-//添加
+// 添加
 func AddCygxUserInteractionNum(item *CygxUserInteractionNum) (lastId int64, err error) {
 	o := orm.NewOrm()
 	lastId, err = o.Insert(item)
 	return
 }
 
-//修改
+// 修改
 func UpdateCygxUserInteractionNum(item *CygxUserInteractionNum) (err error) {
 	updateParams := make(map[string]interface{})
 	updateParams["UserId"] = item.UserId
@@ -51,6 +52,7 @@ func UpdateCygxUserInteractionNum(item *CygxUserInteractionNum) (err error) {
 	updateParams["ActivityVideoNum"] = item.ActivityVideoNum
 	updateParams["ActivityVoiceNum"] = item.ActivityVoiceNum
 	updateParams["RoadshowNum"] = item.RoadshowNum
+	updateParams["TagNum"] = item.TagNum
 	updateParams["CreateTime"] = time.Now()
 	updateParams["ModifyTime"] = time.Now()
 	whereParam := map[string]interface{}{"user_id": item.UserId}
@@ -58,7 +60,7 @@ func UpdateCygxUserInteractionNum(item *CygxUserInteractionNum) (err error) {
 	return
 }
 
-//获取列表
+// 获取列表
 func GetCygxUserInteractionNumList() (items []*CygxUserInteractionNum, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT * FROM cygx_user_interaction_num   `
@@ -66,7 +68,7 @@ func GetCygxUserInteractionNumList() (items []*CygxUserInteractionNum, err error
 	return
 }
 
-//批量添加用户互动信息
+// 批量添加用户互动信息
 func AddCygxUserInteractionNumList(items []*CygxUserInteractionNum) (lastId int64, err error) {
 	o := orm.NewOrm()
 	_, err = o.InsertMulti(1, items)

+ 2 - 0
models/wx_user.go

@@ -517,6 +517,7 @@ type CygxUserInteractionNumDetail struct {
 	RoadshowVideoNum    int    `description:"产业视频播放量"`
 	ActivityVideoNum    int    `description:"活动视频播放量"`
 	ActivityVoiceNum    int    `description:"活动音频播放量"`
+	TagNum              int    `description:"标签点击次数"`
 	PackageType         int    `description:"套餐类型,0:无,1:大套餐,2:小套餐"`
 	TryStage            int    `description:"试用客户子标签:0全部、1未分类、2 推进、3 跟踪、4 预备"`
 }
@@ -549,6 +550,7 @@ func GetCygxCompanyUserUserInteraction(userIds string) (items []*CygxUserInterac
 			WHERE
 				man.industrial_management_id IN ( SELECT industrial_management_id FROM cygx_industry_fllow AS f WHERE f.user_id = u.user_id  AND f.type = 1 ) 
 			) AS labels,
+			( SELECT COUNT( 1 ) FROM cygx_tag_history AS h WHERE h.user_id = u.user_id  ) AS tag_num,
 			(
 			SELECT
 				GROUP_CONCAT( DISTINCT man.label SEPARATOR ',' ) 

+ 37 - 1
routers/commentsRouter.go

@@ -109,7 +109,7 @@ func init() {
     beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ActivityCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ActivityCoAntroller"],
         beego.ControllerComments{
             Method: "LabelTypeListV6Pc",
-            Router: `/labelTypeListV6Pc`,
+            Router: `/labelTypeListV6Pc_del`,
             AllowHTTPMethods: []string{"get"},
             MethodParams: param.Make(),
             Filters: nil,
@@ -349,6 +349,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ArticleController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ArticleController"],
+        beego.ControllerComments{
+            Method: "ApplyAppointmentExpert",
+            Router: `/applyAppointmentExpert`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ArticleController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ArticleController"],
         beego.ControllerComments{
             Method: "AskAdd",
@@ -412,6 +421,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:BannerController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:BannerController"],
+        beego.ControllerComments{
+            Method: "YxSurvey",
+            Router: `/add/yxSurvey`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:BannerController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:BannerController"],
         beego.ControllerComments{
             Method: "List",
@@ -421,6 +439,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:BannerController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:BannerController"],
+        beego.ControllerComments{
+            Method: "ListYx",
+            Router: `/listYx`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:BannerController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:BannerController"],
+        beego.ControllerComments{
+            Method: "YxSurveyDetail",
+            Router: `/yxSurvey/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:BaseChartController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:BaseChartController"],
         beego.ControllerComments{
             Method: "Patg",

+ 1 - 0
routers/router.go

@@ -96,6 +96,7 @@ func init() {
 			web.NSInclude(
 				&controllers.ActivityCoAntroller{},
 				&controllers.ActivityABaseController{},
+				&controllers.ActivityNoLoginController{},
 			),
 		),
 		web.NSNamespace("/research",

+ 216 - 33
services/activity.go

@@ -197,9 +197,17 @@ func SendEmailFileToExpert(cont context.Context) (err error) {
 		msg = "发送附件模版消息失败 Err:" + err.Error()
 		return
 	}
+	var activityIds []int
+	for _, v := range listActivity {
+		activityIds = append(activityIds, v.ActivityId)
+	}
+
+	//{
+	//	utils.SendAlarmMsg("预约外呼名单,会前1小时自动发送邮件给专家组 监控日志,监控使用无需处理,活动ID:"+fmt.Sprint(activityIds), 2)
+	//}
 
 	for _, v := range listActivity {
-		time.Sleep(5 * time.Second) //延时五秒,避免邮件发送不成功
+		time.Sleep(30 * time.Second) //延时30秒,避免邮件发送不成功
 		activityInfo, _ := models.GetAddActivityInfoById(v.ActivityId)
 		if activityInfo == nil {
 			msg = "活动不存在,Err:activityId:" + strconv.Itoa(v.ActivityId)
@@ -295,7 +303,7 @@ func SendEmailFileToExpert(cont context.Context) (err error) {
 			}
 			os.Remove(downLoadnFilePath)
 		} else {
-			go utils.SendEmail("发送附件模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), msg+";Err:"+activityInfo.ActivityName, utils.EmailSendToUsers)
+			go utils.SendAlarmMsg("发送附件模版消息失败"+activityInfo.ActivityName, 2)
 			utils.FileLog.Info("发送附件模版消息失败,Err:%s", activityInfo.ActivityName)
 		}
 	}
@@ -535,21 +543,36 @@ func GetUserTypeZhengShi(companyId int) (userType int, permissionStrnew, permiss
 func GetActivityDetailUserPower(user *models.WxUserItem, activityInfo *models.ActivityDetail) (havePower, isResearchSpecial bool, err error) {
 	var companyDetailStatus string
 	var userTypeStr string
-
+	activityPointsByUserAllMap := GetActivityPointsByUserAllMap() // 获取对用户进行研选扣点的活动
+	//勾选【研选扣点】且扣点对象为参会人的活动,需要有买方研选的正式权限
+	if strings.Contains(activityInfo.ChartPermissionName, utils.CHART_PERMISSION_NAME_YANXUAN) && activityPointsByUserAllMap[activityInfo.ActivityId] {
+		isResearchSpecial = true
+	}
 	//如果是弘则的用户或者宏观的权限不做校验
 	if (GetBelongingRai(user.Mobile) && user.CompanyId == utils.HZ_COMPANY_ID) || activityInfo.ChartPermissionName == utils.HONG_GUAN_NAME {
 		havePower = true
 		return
 	}
+
 	userType, permissionStr, permissionStrZhengShi, e := GetUserTypeZhengShi(user.CompanyId)
 	if e != nil {
 		err = errors.New("GetCompanyPermissionUpgrade, Err: " + e.Error())
 		return
 	}
-	//如果是 公司调研电话会:3,或 专家线下沙龙:5  而且  除易董同步过来的以外的研选类型活动,必须要有研选的正式权限
-	if (activityInfo.ActivityTypeId == 3 || activityInfo.ActivityTypeId == 5) && activityInfo.YidongActivityId == "" && strings.Contains(activityInfo.ChartPermissionName, utils.CHART_PERMISSION_NAME_YANXUAN) {
-		isResearchSpecial = true
+
+	//如果是易董的活动,主、副权限有一个满足即可
+	if activityInfo.YidongActivityId != "" {
+		if strings.Contains(permissionStr, activityInfo.ChartPermissionName) || strings.Contains(permissionStr, activityInfo.ChartPermissionNameDeputy) {
+			havePower = true
+			return
+		}
 	}
+
+	//如果权限不包含那么直接返回
+	if !strings.Contains(permissionStr, activityInfo.ChartPermissionName) {
+		return
+	}
+
 	//如果是 对用户的研选扣点的必须要有研选的正式权限
 	if activityInfo.IsResearchPoints {
 		//获取活动对用户要扣的点
@@ -559,10 +582,10 @@ func GetActivityDetailUserPower(user *models.WxUserItem, activityInfo *models.Ac
 			return
 		}
 		if userPointsNum > 0 {
-			if !strings.Contains(permissionStr, utils.CHART_PERMISSION_NAME_YANXUAN) {
-				//如果连试用权限都没有,那么久按照普通的研选样式展示
-				isResearchSpecial = false
-			}
+			//if !strings.Contains(permissionStr, utils.CHART_PERMISSION_NAME_YANXUAN) {
+			//	//如果连试用权限都没有,那么久按照普通的研选样式展示
+			//	isResearchSpecial = false
+			//}
 			if !strings.Contains(permissionStrZhengShi, activityInfo.ChartPermissionName) {
 				havePower = false
 				return
@@ -1149,6 +1172,11 @@ func GetActivityonditionList(user *models.WxUserItem, activityTypeId, chartPermi
 
 // 根据用户身份处理活动可见
 func ActivityConditioninitSql(user *models.WxUserItem, condition string, isPower int) (conditionActivity string, err error) {
+	// cygx_10.9 未绑定联系方式的客户可以看到部分活动
+	if user.UserId == 0 || user.CompanyId == 1 {
+		conditionActivity = ` AND art.publish_status = 1  AND art.visible_range != 1 AND (art.is_limit_people = 0 OR (art.is_limit_people=1 AND art.is_all_customer_type=1))   ` + condition
+		return
+	}
 	condition += `   AND art.publish_status = 1 `
 	conditionActivity = condition
 	//弘则可以查看所有活动
@@ -2144,16 +2172,37 @@ func ArticleUserRemind(user *models.WxUserItem, articleDetail *models.ArticleDet
 func ActivityUserRemind(user *models.WxUserItem, activityDetail *models.ActivityDetail, source int) (err error) {
 	defer func() {
 		if err != nil {
-			go utils.SendAlarmMsg("同步策略平台阅读数据失败", 2)
-			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "GetCeLueArticlePv ErrMsg:"+err.Error(), utils.EmailSendToUsers)
+			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "ActivityUserRemind ErrMsg:"+err.Error(), utils.EmailSendToUsers)
 		}
 	}()
-	countUser, err := models.GetUserRemind(user.UserId)
-	if err != nil {
-		return err
+
+	//获取销售手机号
+
+	countUser, e := models.GetUserRemind(user.UserId)
+	if e != nil {
+		err = errors.New("GetUserRemind, Err: " + e.Error())
+		return
 	}
-	if countUser == 0 {
-		return err
+	//获取销售手机号
+	sellerItemQy, e := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetSellerByCompanyIdCheckFicc, Err: " + e.Error())
+		return
+	}
+	if sellerItemQy == nil {
+		err = nil
+		return
+	}
+	//某销售下的所有客户活动报名/预约外呼时,模板消息提醒该销售(可设置销售范围,随时增减销售)
+	conf, e := models.GetConfigByCode("tpl_msg_seller_mobile")
+	if e != nil {
+		err = errors.New("GetConfigByCode, Err: " + e.Error())
+		return
+	}
+	//如果用户没有设置消息提醒,而且销售的手机号也没有添加到配置中,那么就不推送模版消息
+	if countUser == 0 && !strings.Contains(conf.ConfigValue, sellerItemQy.Mobile) {
+		err = nil
+		return
 	}
 	var sourceMsg string
 	if source == 1 {
@@ -2165,24 +2214,16 @@ func ActivityUserRemind(user *models.WxUserItem, activityDetail *models.Activity
 	} else if source == 4 {
 		sourceMsg = "活动报名"
 	}
-
-	//获取销售手机号
-	sellerItemQy, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
-	if err != nil && err.Error() != utils.ErrNoRow() {
+	openIdList, e := models.GetUserRecordListByMobile(4, sellerItemQy.Mobile)
+	if e != nil {
+		err = errors.New("GetUserRecordListByMobile, Err: " + e.Error())
 		return err
 	}
-	if sellerItemQy != nil {
-		openIdList, err := models.GetUserRecordListByMobile(4, sellerItemQy.Mobile)
-		if err != nil {
-			fmt.Println(err)
-			return err
-		}
-		var keyword1 string
-		var keyword2 string
-		keyword1 = activityDetail.ActivityName
-		keyword2 = fmt.Sprint("互动:", sourceMsg, ",", user.RealName, "--", user.CompanyName)
-		SendWxMsgWithActivityUserRemind(keyword1, keyword2, openIdList, activityDetail.ActivityId)
-	}
+	var keyword1 string
+	var keyword2 string
+	keyword1 = activityDetail.ActivityName
+	keyword2 = fmt.Sprint("互动:", sourceMsg, ",", user.RealName, "--", user.CompanyName)
+	SendWxMsgWithActivityUserRemind(keyword1, keyword2, openIdList, activityDetail.ActivityId)
 	return
 }
 
@@ -2258,6 +2299,9 @@ func DoActivityOnenIdWxTemplateMsg(cont context.Context) (err error) {
 }
 
 func ActivityButtonShow(item *models.ActivityDetail) (activityDetail *models.ActivityDetail) {
+	if item.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+		item.IsResearch = true
+	}
 	activityDetail = item
 	//IsShowAppointment       bool                       `description:"是否展示预约纪要"`
 	//IsShowOutboundCall      bool                       `description:"是否展示预约外呼"`
@@ -2287,6 +2331,10 @@ func ActivityButtonShow(item *models.ActivityDetail) (activityDetail *models.Act
 		activityDetail.SourceType = 1
 		activityDetail.IsShowSignup = false
 		activityDetail.IsShowDetails = true
+
+		activityDetail.IsExternalLabel = true
+		activityDetail.IsResearch = false
+		activityDetail.IsResearchSpecial = false
 		return
 	}
 
@@ -2357,6 +2405,11 @@ func ActivityButtonShow(item *models.ActivityDetail) (activityDetail *models.Act
 			activityDetail.IsShowMeetingReminder = true
 			activityDetail.ActivityTypeName = "分析师电话会"
 		}
+
+		//买方线下交流 8 // 查研观向 11.0
+		if activityDetail.ActivityTypeId == 8 {
+			activityDetail.IsShowSignup = true
+		}
 	}
 
 	//如果是易董创建的活动,展示我要报名,不展示预约外呼
@@ -2368,6 +2421,136 @@ func ActivityButtonShow(item *models.ActivityDetail) (activityDetail *models.Act
 	return
 }
 
+func ActivityArrButtonShow(items []*models.ActivityDetail) (activityDetails []*models.ActivityDetail) {
+	activityPointsByUserAllMap := GetActivityPointsByUserAllMap() // 获取对用户进行研选扣点的活动
+	for _, activityDetail := range items {
+		if activityDetail.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+			activityDetail.IsResearch = true
+		}
+		//勾选【研选扣点】且扣点对象为参会人的活动,需要有买方研选的正式权限
+		if strings.Contains(activityDetail.ChartPermissionName, utils.CHART_PERMISSION_NAME_YANXUAN) && activityPointsByUserAllMap[activityDetail.ActivityId] {
+			activityDetail.IsResearchSpecial = true
+		}
+		//IsShowAppointment       bool                       `description:"是否展示预约纪要"`
+		//IsShowOutboundCall      bool                       `description:"是否展示预约外呼"`
+		//IsShowMeetingReminder   bool                       `description:"是否展示会议提醒"`
+		//IsShowHelpSsk           bool                       `description:"是否展示帮我带问"`
+		//IsShowSignup            bool                       `description:"是否展示我要报名"`
+
+		activityDetail.IsResearchPoints = activityPointsByUserAllMap[activityDetail.ActivityId]
+		if activityDetail.SiginupDeadline == utils.FormatDateTimeInit { //报名截止时间处理
+			activityDetail.SiginupDeadline = ""
+		}
+		//如果报名截止时间不规范,或者是非研选扣点活动就把截止时间设置为空
+		if activityDetail.CancelDeadline == utils.FormatDateTimeInit || !activityDetail.IsResearchPoints {
+			activityDetail.CancelDeadline = ""
+		}
+		activityTimeText := activityDetail.ActivityTimeText
+		activityTimeText = strings.Replace(activityTimeText, "(", "(", -1)
+		activityTimeText = strings.Replace(activityTimeText, ")", ")", -1)
+		activityDetail.ActivityTimeText = activityTimeText
+		if activityDetail.SourceType != 2 {
+			activityDetail.SourceType = 1
+		}
+		activityDetail.IsShowAppointment = false
+		//易董的操作按钮都隐藏
+		if activityDetail.YidongActivityId != "" {
+			activityDetail.SourceType = 1
+			activityDetail.IsShowSignup = false
+			activityDetail.IsShowDetails = true
+
+		} else {
+			//专家电话会 1
+			if activityDetail.ActivityTypeId == 1 && activityDetail.IsLimitPeople == 0 && (activityDetail.ActiveState == "1" || activityDetail.ActiveState == "2") {
+				activityDetail.IsShowHelpSsk = true
+			}
+			//新的是否展示规则
+			if activityDetail.IsCanAppointmentMinutes == 1 {
+				activityDetail.IsShowAppointment = true
+			} else {
+				activityDetail.IsShowAppointment = false
+			}
+			if activityDetail.ActiveState == "1" {
+				//专家电话会 1
+				//专家电话会限制人数的展示我要报名,不限制的展示预约外外呼
+				if activityDetail.ActivityTypeId == 1 {
+					//articleDetail.IsShowOutboundCall = true
+					if activityDetail.LimitPeopleNum == 0 {
+						activityDetail.IsShowOutboundCall = true
+						//articleDetail.IsShowHelpSsk = true
+					} else {
+						activityDetail.IsShowSignup = true
+					}
+					activityDetail.IsShowMeetingReminder = true
+					activityDetail.IsShowHelpSsk = true
+				}
+
+				//分析师电话会 2
+				if activityDetail.ActivityTypeId == 2 {
+					if activityDetail.LimitPeopleNum == 0 {
+						activityDetail.IsShowOutboundCall = true
+						//articleDetail.IsShowHelpSsk = true
+					} else {
+						activityDetail.IsShowSignup = true
+					}
+					activityDetail.IsShowMeetingReminder = true
+				}
+
+				//公司调研电话会 3
+				if activityDetail.ActivityTypeId == 3 {
+					if activityDetail.IsResearchPoints || activityDetail.LimitPeopleNum > 0 {
+						activityDetail.IsShowSignup = true
+					} else {
+						activityDetail.IsShowMeetingReminder = true
+						activityDetail.IsShowOutboundCall = true
+					}
+				}
+
+				//公司线下调研 4
+				if activityDetail.ActivityTypeId == 4 {
+					activityDetail.IsShowSignup = true
+				}
+
+				//专家线下沙龙 5
+				if activityDetail.ActivityTypeId == 5 {
+					activityDetail.IsShowSignup = true
+				}
+
+				//分析师线下沙龙 6
+				if activityDetail.ActivityTypeId == 6 {
+					activityDetail.IsShowSignup = true
+				}
+
+				//分析师电话会(C类) 7
+				if activityDetail.ActivityTypeId == 7 {
+					activityDetail.IsShowSignup = true
+					activityDetail.IsShowMeetingReminder = true
+					activityDetail.ActivityTypeName = "分析师电话会"
+				}
+
+				//买方线下交流 8 // 查研观向 11.0
+				if activityDetail.ActivityTypeId == 8 {
+					activityDetail.IsShowSignup = true
+				}
+			}
+
+			//如果是易董创建的活动,展示我要报名,不展示预约外呼
+			if activityDetail.IsYidongConduct {
+				activityDetail.IsShowSignup = true
+				activityDetail.IsShowOutboundCall = false
+			}
+		}
+		//如果是易董同步过来的,只展示外部资源标签
+		if activityDetail.YidongActivityId != "" {
+			activityDetail.IsExternalLabel = true
+			activityDetail.IsResearch = false
+			activityDetail.IsResearchSpecial = false
+		}
+		activityDetails = append(activityDetails, activityDetail)
+	}
+	return
+}
+
 // GetActivityNewLabelMap 获取活动【新】标签Map
 func GetActivityNewLabelMap(activityIds []int) (labelMap map[int]bool, industryNewMap map[int]bool, err error) {
 	labelMap = make(map[int]bool, 0)

+ 28 - 5
services/activity_points.go

@@ -5,6 +5,7 @@ import (
 	"errors"
 	"fmt"
 	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/models/company"
 	"hongze/hongze_cygx/utils"
 	"strconv"
 	"time"
@@ -889,7 +890,7 @@ func YanXuanCompanyApprovalReduce(log models.YanXuanActivityPointsRedis) (err er
 	}()
 	comapnyId := log.ComapnyId
 
-	comapny, e := models.GetCompanyById(comapnyId)
+	comapnyDetail, e := models.GetCompanyById(comapnyId)
 	if e != nil {
 		err = errors.New("GetCompanyById" + e.Error())
 		return
@@ -913,6 +914,28 @@ func YanXuanCompanyApprovalReduce(log models.YanXuanActivityPointsRedis) (err er
 	if companyReportPermissionDetail == nil {
 		return // 如果不存在就不做研选扣点处理
 	}
+
+	//获取最近的一条审批合同信息
+	newCompanyApprovalDetail, e := company.GetCompanyApprovalById(comapnyId)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCompanyApprovalById, Err: " + e.Error())
+		return
+	}
+	if newCompanyApprovalDetail == nil {
+		return
+	}
+	companyContractId := newCompanyApprovalDetail.CompanyContractId
+
+	totalYxPerminssion, e := company.GetCompanyContractPermissionCheck(companyContractId, utils.CHART_PERMISSION_ID_YANXUAN)
+	if e != nil {
+		err = errors.New("GetCompanyContractPermissionCheck, Err: " + e.Error())
+		return
+	}
+	// 如果最新的审批合同里没有研选的权限,那么就不做处理
+	if totalYxPerminssion == 0 {
+		return
+	}
+
 	var billDetailed float64
 	var content string
 	//ExpensiveYx               int       `description:"权益研选: 0->3w; 1->5w"` 3W3次、5W 15次
@@ -932,8 +955,8 @@ func YanXuanCompanyApprovalReduce(log models.YanXuanActivityPointsRedis) (err er
 	item.CreateTime = time.Now()
 	//item.Mobile = user.Mobile
 	//item.Email = user.Email
-	item.CompanyId = comapny.CompanyId
-	item.CompanyName = comapny.CompanyName
+	item.CompanyId = comapnyDetail.CompanyId
+	item.CompanyName = comapnyDetail.CompanyName
 	//item.RealName = user.RealName
 	item.BillDetailed = billDetailed
 	item.RegisterPlatform = log.RegisterPlatform
@@ -948,8 +971,8 @@ func YanXuanCompanyApprovalReduce(log models.YanXuanActivityPointsRedis) (err er
 	//更新对应机构的剩余点数
 	var itemCompanys []*models.CygxActivityPointsCompany
 	itemCompany := new(models.CygxActivityPointsCompany)
-	itemCompany.CompanyId = comapny.CompanyId
-	itemCompany.CompanyName = comapny.CompanyName
+	itemCompany.CompanyId = comapnyDetail.CompanyId
+	itemCompany.CompanyName = comapnyDetail.CompanyName
 	itemCompany.Points = item.Points
 	itemCompany.CreateTime = time.Now()
 	itemCompany.ModifyTime = time.Now()

+ 1 - 1
services/activity_signup.go

@@ -77,7 +77,7 @@ func CheckActivitySignUpLimit(user *models.WxUserItem, activityInfo *models.Acti
 // 校验报名截止时间
 func CheckSiginupDeadline(activityInfo *models.ActivityDetail) (checkTime bool, popupMsg string) {
 	checkTime = true
-	if activityInfo.SiginupDeadline != utils.FormatDateTimeInit {
+	if activityInfo.SiginupDeadline != utils.FormatDateTimeInit && activityInfo.SiginupDeadline != "" {
 		timeResp := utils.StrTimeToTime(activityInfo.SiginupDeadline)
 		if timeResp.Before(time.Now()) {
 			checkTime = false

+ 378 - 3
services/activity_special.go

@@ -645,9 +645,6 @@ func GetActivitySpecialList(user *models.WxUserItem, currentIndex, pageSize int,
 		if startSizePrepare == 0 {
 			listPrepare[0].Explain = utils.ACtIVITY_SPECIAL_EXPLAIN
 		}
-	} else {
-		err = nil
-		return
 	}
 	total = totalConfirm + totalPrepare
 	//处理封面图片
@@ -1259,3 +1256,381 @@ func SendWxMsgActivitySpecialCancel(cont context.Context) (err error) {
 	}
 	return
 }
+
+func GetChartPermissionSpecialSurplusByCompany(companyId int) (userType int, tripRemaining int, mapChartName map[string]int, err error) {
+	companyDetail, e := models.GetCompanyDetailByIdGroup(companyId)
+	if e != nil {
+		err = errors.New("GetCompanyDetailByIdGroup, Err: " + e.Error())
+	}
+	if companyDetail == nil {
+		return
+	}
+	if companyDetail.Status != "永续" && companyDetail.Status != "正式" {
+		return
+	}
+	var specialSurplus string
+	if companyDetail.Status == "永续" {
+		specialSurplus = "不限次数"
+	}
+	//chartMap := map[int]string{utils.YI_YAO_ID:utils.YI_YAO_NAME, utils.XIAO_FEI_ID:utils.XIAO_FEI_NAME, utils.KE_JI_ID:utils.KE_JI_NAME, utils.ZHI_ZAO_ID:utils.ZHI_ZAO_NAME}
+	//chartNumMap := map[int]int{utils.YI_YAO_ID:0, utils.XIAO_FEI_ID:0, utils.KE_JI_ID:0, utils.ZHI_ZAO_ID:0}
+	chartNameMap := map[string]int{utils.YI_YAO_NAME: 0, utils.XIAO_FEI_NAME: 0, utils.KE_JI_NAME: 0, utils.ZHI_ZAO_NAME: 0}
+	if companyDetail.Status == "正式" {
+		//var packageType int
+		userType, _, _ = GetUserType(companyId)
+		var condition string
+		var pars []interface{}
+
+		condition += ` AND company_id = ? `
+		pars = append(pars, companyId)
+
+		//查询当年的数据
+		condition += ` AND b.create_time >= ?  `
+		pars = append(pars, time.Now().Format(utils.FormatYearDate)+"-01-01")
+		listTripBill, e := models.GetCygxActivitySpecialTripBillList(condition, pars)
+		if e != nil {
+			err = errors.New("GetActivitySpecialTripCountByActivitySpecial, Err: " + e.Error())
+			return
+		}
+		// 获取继承点数
+		inheritList, e := models.GetCygxActivitySpecialInheritPointsByCompanyId(companyId)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			err = errors.New("GetCygxActivitySpecialInheritPointsByCompanyId, Err: " + e.Error())
+		}
+		if userType == 2 {
+
+			var tripBillNum int
+			for _, v := range listTripBill {
+				//if v.ActivityId == 0 {
+				//	continue
+				//}
+				tripBillNum += v.BillDetailed
+			}
+			if len(inheritList) > 0 {
+				for _, v := range inheritList {
+					if v.ChartPermissionId == 0 {
+						tripBillNum += v.Points
+					}
+				}
+			}
+
+			tripRemaining = tripBillNum
+			if tripRemaining < 0 {
+				tripRemaining = 0
+			}
+
+		} else {
+			list, e := models.GetCompanyReportPermissionByCompanyIdAndProductId(companyId, 2)
+			if e != nil && e.Error() != utils.ErrNoRow() {
+				err = errors.New("GetCompanyReportPermissionUpgrade, Err: " + e.Error())
+			}
+			if len(list) == 0 {
+				return
+			}
+			var chartPermissionIdSlice []string
+			mapChartName = make(map[string]int)
+			mapUpgradeId := make(map[int]int)
+			mapPermissionNameTrip := make(map[string]int)
+			mapInheritChartName := make(map[string]int)
+			//mapPermissionName := make(map[int]string)
+			for _, v := range list {
+				chartPermissionIdSlice = append(chartPermissionIdSlice, strconv.Itoa(v.ChartPermissionId))
+				//是升级套餐才有点数
+				if v.IsUpgrade == 1 {
+					mapUpgradeId[v.ChartPermissionId] = 1
+				}
+			}
+			chartList := make([]*models.ChartPermission, 0)
+			if len(chartPermissionIdSlice) > 0 {
+				chartList, e = models.GetChartPermissionByIds(chartPermissionIdSlice)
+				if e != nil {
+					err = errors.New("获取品种信息失败, Err:" + e.Error())
+					return
+				}
+			}
+
+			if len(chartList) == 0 {
+				return
+			}
+
+			for _, v := range listTripBill {
+				if v.ActivityId == 0 {
+					continue
+				}
+				mapPermissionNameTrip[v.ChartPermissionName] += v.BillDetailed
+			}
+			for _, v := range chartList {
+				//如果是升级则加点
+				if _, ok := mapUpgradeId[v.ChartPermissionId]; ok {
+					mapChartName[v.PermissionName] = 5 + mapPermissionNameTrip[v.PermissionName]
+				} else {
+					mapChartName[v.PermissionName] = mapPermissionNameTrip[v.PermissionName]
+				}
+			}
+			// 通过继承获得的加点
+			for _, v := range inheritList {
+				mapInheritChartName[v.ChartPermissionName] = v.Points
+			}
+			for k, _ := range chartNameMap {
+				if _, ok := mapChartName[k]; ok {
+					if inherit, ok2 := mapInheritChartName[k]; ok2 {
+						mapChartName[k] += inherit
+					}
+				}
+			}
+
+			for k, v := range mapChartName {
+				if v > 0 {
+					specialSurplus += k + strconv.Itoa(v) + "次+"
+				}
+			}
+			specialSurplus = strings.TrimRight(specialSurplus, "+")
+		}
+	}
+	return
+}
+
+
+// 清零初始化用-去掉了正式用户的判断
+func GetChartPermissionSpecialSurplusByCompanyForInit(companyId int) (userType int, tripRemaining int, mapChartName map[string]int, err error) {
+	companyDetail, e := models.GetCompanyDetailByIdGroup(companyId)
+	if e != nil {
+		err = errors.New("GetCompanyDetailByIdGroup, Err: " + e.Error())
+	}
+	if companyDetail == nil {
+		return
+	}
+	//if companyDetail.Status != "永续" && companyDetail.Status != "正式" {
+	//	return
+	//}
+
+	//chartMap := map[int]string{utils.YI_YAO_ID:utils.YI_YAO_NAME, utils.XIAO_FEI_ID:utils.XIAO_FEI_NAME, utils.KE_JI_ID:utils.KE_JI_NAME, utils.ZHI_ZAO_ID:utils.ZHI_ZAO_NAME}
+	chartNumMap := map[int]int{utils.YI_YAO_ID:0, utils.XIAO_FEI_ID:0, utils.KE_JI_ID:0, utils.ZHI_ZAO_ID:0}
+	//var packageType int
+	userType, _, _ = GetUserType(companyId)
+	var condition string
+	var pars []interface{}
+
+	condition += ` AND company_id = ? `
+	pars = append(pars, companyId)
+
+	//查询当年的数据
+	condition += ` AND b.create_time >= ?  `
+	pars = append(pars, time.Now().Format(utils.FormatYearDate)+"-01-01")
+	listTripBill, e := models.GetCygxActivitySpecialTripBillList(condition, pars)
+	if e != nil {
+		err = errors.New("GetActivitySpecialTripCountByActivitySpecial, Err: " + e.Error())
+		return
+	}
+	// 获取继承点数
+	inheritList, e := models.GetCygxActivitySpecialInheritPointsByCompanyId(companyId)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCygxActivitySpecialInheritPointsByCompanyId, Err: " + e.Error())
+	}
+	if userType == 2 {
+
+		var tripBillNum int
+		for _, v := range listTripBill {
+			//if v.ActivityId == 0 {
+			//	continue
+			//}
+			tripBillNum += v.BillDetailed
+		}
+		if len(inheritList) > 0 {
+			for _, v := range inheritList {
+				if v.ChartPermissionId == 0 {
+					tripBillNum += v.Points
+				}
+			}
+		}
+
+		tripRemaining = tripBillNum
+		if tripRemaining < 0 {
+			tripRemaining = 0
+		}
+
+	} else {
+		list, e := models.GetCompanyReportPermissionByCompanyIdAndProductIdForInit(companyId, 2)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			err = errors.New("GetCompanyReportPermissionByCompanyIdAndProductIdForInit, Err: " + e.Error())
+		}
+		if len(list) == 0 {
+			return
+		}
+		var chartPermissionIdSlice []string
+		mapChartName = make(map[string]int)
+		mapUpgradeId := make(map[int]int)
+		mapPermissionNameTrip := make(map[string]int)
+		mapInheritChartName := make(map[string]int)
+		//mapPermissionName := make(map[int]string)
+		for _, v := range list {
+			chartPermissionIdSlice = append(chartPermissionIdSlice, strconv.Itoa(v.ChartPermissionId))
+			//是升级套餐才有点数
+			if v.IsUpgrade == 1 {
+				mapUpgradeId[v.ChartPermissionId] = 1
+			}
+		}
+		chartList := make([]*models.ChartPermission, 0)
+		if len(chartPermissionIdSlice) > 0 {
+			chartList, e = models.GetChartPermissionByIds(chartPermissionIdSlice)
+			if e != nil {
+				err = errors.New("获取品种信息失败, Err:" + e.Error())
+				return
+			}
+		}
+
+		if len(chartList) == 0 {
+			return
+		}
+
+		for _, v := range listTripBill {
+			if v.ActivityId == 0 {
+				continue
+			}
+			mapPermissionNameTrip[v.ChartPermissionName] += v.BillDetailed
+		}
+		for _, v := range chartList {
+			if _, ok := chartNumMap[v.ChartPermissionId]; ok{
+				//如果是升级则加点
+				if _, ok := mapUpgradeId[v.ChartPermissionId]; ok {
+					mapChartName[v.PermissionName] = 5 + mapPermissionNameTrip[v.PermissionName]
+				} else {
+					mapChartName[v.PermissionName] = mapPermissionNameTrip[v.PermissionName]
+				}
+			}
+		}
+		// 通过继承获得的加点
+		for _, v := range inheritList {
+			mapInheritChartName[v.ChartPermissionName] = v.Points
+		}
+		for _, v := range mapChartName {
+			if v > 0 {
+				tripRemaining += v
+			}
+		}
+	}
+
+	return
+}
+
+// total初始化用-去掉了正式用户的判断
+func GetChartPermissionSpecialSurplusByCompanyForInitTotal(companyId int) (userType int, tripRemaining int, mapChartName map[string]int, err error) {
+	companyDetail, e := models.GetCompanyDetailByIdGroup(companyId)
+	if e != nil {
+		err = errors.New("GetCompanyDetailByIdGroup, Err: " + e.Error())
+	}
+	if companyDetail == nil {
+		return
+	}
+	//if companyDetail.Status != "永续" && companyDetail.Status != "正式" {
+	//	return
+	//}
+
+	//chartMap := map[int]string{utils.YI_YAO_ID:utils.YI_YAO_NAME, utils.XIAO_FEI_ID:utils.XIAO_FEI_NAME, utils.KE_JI_ID:utils.KE_JI_NAME, utils.ZHI_ZAO_ID:utils.ZHI_ZAO_NAME}
+	chartNumMap := map[int]int{utils.YI_YAO_ID:0, utils.XIAO_FEI_ID:0, utils.KE_JI_ID:0, utils.ZHI_ZAO_ID:0}
+	//var packageType int
+	userType, _, _ = GetUserType(companyId)
+	var condition string
+	var pars []interface{}
+
+	condition += ` AND company_id = ? `
+	pars = append(pars, companyId)
+
+	//查询当年的数据
+	condition += ` AND b.create_time >= ?  `
+	pars = append(pars, time.Now().Format(utils.FormatYearDate)+"-01-01")
+	listTripBill, e := models.GetCygxActivitySpecialTripBillList(condition, pars)
+	if e != nil {
+		err = errors.New("GetActivitySpecialTripCountByActivitySpecial, Err: " + e.Error())
+		return
+	}
+	// 获取继承点数
+	inheritList, e := models.GetCygxActivitySpecialInheritPointsByCompanyId(companyId)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCygxActivitySpecialInheritPointsByCompanyId, Err: " + e.Error())
+	}
+	if userType == 2 {
+
+		var tripBillNum int
+		for _, v := range listTripBill {
+			//if v.ActivityId == 0 {
+			//	continue
+			//}
+			tripBillNum += v.BillDetailed
+		}
+		if len(inheritList) > 0 {
+			for _, v := range inheritList {
+				if v.ChartPermissionId == 0 {
+					tripBillNum += v.Points
+				}
+			}
+		}
+
+		tripRemaining = tripBillNum
+		if tripRemaining < 0 {
+			tripRemaining = 0
+		}
+
+	} else {
+		list, e := models.GetCompanyReportPermissionByCompanyIdAndProductIdForInit2(companyId, 2)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			err = errors.New("GetCompanyReportPermissionByCompanyIdAndProductIdForInit, Err: " + e.Error())
+		}
+		if len(list) == 0 {
+			return
+		}
+		var chartPermissionIdSlice []string
+		mapChartName = make(map[string]int)
+		mapUpgradeId := make(map[int]int)
+		mapPermissionNameTrip := make(map[string]int)
+		mapInheritChartName := make(map[string]int)
+		//mapPermissionName := make(map[int]string)
+		for _, v := range list {
+			chartPermissionIdSlice = append(chartPermissionIdSlice, strconv.Itoa(v.ChartPermissionId))
+			//是升级套餐才有点数
+			if v.IsUpgrade == 1 {
+				mapUpgradeId[v.ChartPermissionId] = 1
+			}
+		}
+		chartList := make([]*models.ChartPermission, 0)
+		if len(chartPermissionIdSlice) > 0 {
+			chartList, e = models.GetChartPermissionByIds(chartPermissionIdSlice)
+			if e != nil {
+				err = errors.New("获取品种信息失败, Err:" + e.Error())
+				return
+			}
+		}
+
+		if len(chartList) == 0 {
+			return
+		}
+
+		for _, v := range listTripBill {
+			if v.ActivityId == 0 {
+				continue
+			}
+			mapPermissionNameTrip[v.ChartPermissionName] += v.BillDetailed
+		}
+		for _, v := range chartList {
+			if _, ok := chartNumMap[v.ChartPermissionId]; ok{
+				//如果是升级则加点
+				if _, ok := mapUpgradeId[v.ChartPermissionId]; ok {
+					mapChartName[v.PermissionName] = 5 + mapPermissionNameTrip[v.PermissionName]
+				} else {
+					mapChartName[v.PermissionName] = mapPermissionNameTrip[v.PermissionName]
+				}
+			}
+		}
+		// 通过继承获得的加点
+		for _, v := range inheritList {
+			mapInheritChartName[v.ChartPermissionName] = v.Points
+		}
+		for _, v := range mapChartName {
+			if v > 0 {
+				tripRemaining += v
+			}
+		}
+	}
+
+	return
+}

+ 90 - 0
services/activity_wx_template_msg.go

@@ -150,3 +150,93 @@ func SendActivitieSignTemplateMsg(user *models.WxUserItem, activityDetail *model
 	}
 	return
 }
+
+// SendActivitieCancelSignTemplateMsg 取消活动给销售和内容组四人发模版消息
+func SendActivitieCancelSignTemplateMsg(user *models.WxUserItem, activityDetail *models.ActivityDetail) (err error) {
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg(fmt.Sprint("取消活动给销售和内容组四人发模版消息Err:", err.Error(), "活动ID:", activityDetail.ActivityId, "手机号:", user.Mobile), 2)
+		}
+	}()
+	//获取销售手机号
+	sellerItemQy, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	configCode := utils.TPL_MSG_NEI_RONG_ZU
+	cnf, e := models.GetConfigByCode(configCode)
+	if e != nil {
+		err = errors.New("GetConfigByCode, Err: " + e.Error() + configCode)
+		return
+	}
+	openIdList, e := models.GetUserRecordListByMobile(4, cnf.ConfigValue+","+sellerItemQy.Mobile)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetUserRecordListByMobile, Err: " + e.Error() + cnf.ConfigValue)
+		return
+	}
+	keyword1 := user.RealName + "--" + user.CompanyName + "(" + sellerItemQy.RealName +")"
+	keyword2 := user.Mobile
+	keyword3 := time.Now().Format(utils.FormatDateTime)
+	keyword4 := "取消报名" + "【" +activityDetail.ActivityName+"】"
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+	sendInfo := new(SendWxTemplate)
+	sendInfo.Keyword1 = keyword1
+	sendInfo.Keyword2 = keyword2
+	sendInfo.Keyword3 = keyword3
+	sendInfo.Keyword4 = keyword4
+	sendInfo.TemplateId = utils.WxMsgTemplateIdApplyXzs
+	sendInfo.RedirectTarget = 3
+	sendInfo.Resource = user.Mobile
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_APPLY
+	sendInfo.OpenIdArr = openIdArr
+	err = PublicSendTemplateMsg(sendInfo)
+	return
+}
+
+// SendNeiRongZuActivitieSignTemplateMsg 报名活动给销售和内容组四人发模版消息
+func SendNeiRongZuActivitieSignTemplateMsg(user *models.WxUserItem, activityDetail *models.ActivityDetail) (err error) {
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg(fmt.Sprint("取消活动给销售和内容组四人发模版消息Err:", err.Error(), "活动ID:", activityDetail.ActivityId, "手机号:", user.Mobile), 2)
+		}
+	}()
+	//获取销售手机号
+	sellerItemQy, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	configCode := utils.TPL_MSG_NEI_RONG_ZU
+	cnf, e := models.GetConfigByCode(configCode)
+	if e != nil {
+		err = errors.New("GetConfigByCode, Err: " + e.Error() + configCode)
+		return
+	}
+	openIdList, e := models.GetUserRecordListByMobile(4, cnf.ConfigValue+","+sellerItemQy.Mobile)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetUserRecordListByMobile, Err: " + e.Error() + cnf.ConfigValue)
+		return
+	}
+	keyword1 := user.RealName + "--" + user.CompanyName + "(" + sellerItemQy.RealName +")"
+	keyword2 := user.Mobile
+	keyword3 := time.Now().Format(utils.FormatDateTime)
+	keyword4 := "报名"  + "【" +activityDetail.ActivityName+"】"
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+	sendInfo := new(SendWxTemplate)
+	sendInfo.Keyword1 = keyword1
+	sendInfo.Keyword2 = keyword2
+	sendInfo.Keyword3 = keyword3
+	sendInfo.Keyword4 = keyword4
+	sendInfo.TemplateId = utils.WxMsgTemplateIdApplyXzs
+	sendInfo.RedirectTarget = 3
+	sendInfo.Resource = user.Mobile
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_APPLY
+	sendInfo.OpenIdArr = openIdArr
+	err = PublicSendTemplateMsg(sendInfo)
+	return
+}

+ 32 - 0
services/article.go

@@ -1756,6 +1756,11 @@ func HandleArticleCategoryImg(list []*models.HomeArticle) (items []*models.HomeA
 			}
 		}
 
+		//是不是研选报告
+		if v.ArticleTypeId > 0 {
+			list[k].IsResearch = true
+		}
+
 	}
 
 	articleIds := make([]int, 0)
@@ -2155,3 +2160,30 @@ func GetArticleCoverByChartFirst(body string) (cover string) {
 	}
 	return
 }
+
+// GetYxArticleIdMap 获取研选文章ID
+func GetYxArticleIdMap(articleIds []int) (mapResp map[int]bool) {
+	var err error
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg("获取研选文章ID失败,GetYxArticleIdMap"+err.Error(), 2)
+		}
+	}()
+	var condition string
+	var pars []interface{}
+	condition = ` AND  article_type_id > 0 `
+	if len(articleIds) > 0 {
+		condition += ` AND article_id IN (` + utils.GetOrmInReplace(len(articleIds)) + `)`
+		pars = append(pars, articleIds)
+	}
+	articleList, e := models.GetArticleList(condition, pars)
+	if e != nil {
+		err = errors.New("GetArticleList, Err: " + e.Error())
+		return
+	}
+	mapResp = make(map[int]bool, 0)
+	for _, v := range articleList {
+		mapResp[v.ArticleId] = true
+	}
+	return
+}

+ 157 - 0
services/article_apply_appointment_expert.go

@@ -0,0 +1,157 @@
+package services
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/utils"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// 约访专家的请求
+func AddArticleApplyAppointmentExpert(user *models.WxUserItem, articleId int) (err error) {
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg("约访专家的请求失败"+err.Error(), 2)
+		}
+	}()
+	item := new(models.CygxArticleApplyAppointmentExpert)
+	item.UserId = user.UserId
+	item.ArticleId = articleId
+	item.CreateTime = time.Now()
+	item.ModifyTime = time.Now()
+	item.Mobile = user.Mobile
+	item.Email = user.Email
+	item.CompanyId = user.CompanyId
+	item.CompanyName = user.CompanyName
+	item.RegisterPlatform = utils.REGISTER_PLATFORM
+	sellerItem, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	item.RealName = user.RealName
+	if sellerItem != nil {
+		item.SellerName = sellerItem.RealName
+	}
+	_, e := models.AddCygxArticleApplyAppointmentExpert(item)
+	if e != nil {
+		err = errors.New("AddCygxArticleApplyAppointmentExpert, Err: " + e.Error())
+		return
+	}
+
+	return
+}
+
+// 用户约访专家的请求,向对应销售发送模版消息
+func SendArticleApplyAppointmentExpertTemplateMsg(user *models.WxUserItem, articleId int) (err error) {
+	var msg string
+	msg = fmt.Sprint(user, articleId)
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg("活动带问提醒发送模版消息失败"+msg, 2)
+		}
+	}()
+	//文章详情
+	detailArticle, e := models.GetArticleDetailById(articleId)
+	if e != nil {
+		err = errors.New("GetArticleDetailById, Err: " + e.Error())
+		return
+	}
+
+	var mobiles []string
+	//获取权益销售
+	sellerItem, e := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+	if e != nil {
+		err = errors.New("GetAdminByRoleName, Err: " + e.Error())
+		return
+	}
+	//内容组全员手机号
+	configCode := utils.TPL_MSG_NEI_RONG_ZU
+	cnf, e := models.GetConfigByCode(configCode)
+	if e != nil {
+		err = errors.New("GetConfigByCode, Err: " + e.Error() + configCode)
+		return
+	}
+
+	//汪洋手机号
+	cnfWangYang, e := models.GetConfigByCode(utils.TPL_MSG_WANG_YANG)
+	if e != nil {
+		err = errors.New("GetConfigByCode, Err: " + e.Error() + configCode)
+		return
+	}
+
+	mobiles = append(mobiles, sellerItem.Mobile)
+	mobiles = append(mobiles, cnfWangYang.ConfigValue)
+	listMobile := strings.Split(cnf.ConfigValue, ",")
+	for _, v := range listMobile {
+		mobiles = append(mobiles, v)
+	}
+
+	openIdList, e := models.GetWxOpenIdByMobileSliceList(mobiles)
+	if e != nil {
+		err = errors.New("GetWxOpenIdByMobileSliceList, Err: " + e.Error() + configCode)
+		return
+	}
+	if len(openIdList) == 0 {
+		return
+	}
+
+	if len(openIdList) == 0 {
+		return
+	}
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+	var keyword1 string
+	var keyword2 string
+	var keyword3 string
+	var keyword4 string
+	keyword1 = fmt.Sprint(user.RealName, "--", user.CompanyName, "(", sellerItem.RealName, ")")
+	if user.Mobile == "" {
+		user.Mobile = user.Email
+	}
+	keyword2 = user.Mobile
+	keyword3 = time.Now().Format(utils.FormatDateTime)
+	keyword4 = fmt.Sprint("约访专家(", detailArticle.Title, ")")
+	var redirectUrl string
+	redirectUrl = utils.WX_MSG_PATH_ARTICLE_DETAIL + strconv.Itoa(articleId)
+	sendInfo := new(SendWxTemplate)
+	sendInfo.Keyword1 = keyword1
+	sendInfo.Keyword2 = keyword2
+	sendInfo.Keyword3 = keyword3
+	sendInfo.Keyword4 = keyword4
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD
+	sendInfo.TemplateId = utils.WxMsgTemplateIdApplyXzs
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	sendInfo.Resource = strconv.Itoa(articleId)
+	sendInfo.OpenIdArr = openIdArr
+	err = PublicSendTemplateMsg(sendInfo)
+	return
+}
+
+// 获取用户数是否约访专家的请求
+func GetIsApplyAppointmentExpert(user *models.WxUserItem, articleId int) (isApplyAppointmentExpert bool) {
+	var err error
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg("获取用户数是否约访专家的请求失败"+err.Error(), 2)
+		}
+	}()
+	var condition string
+	var pars []interface{}
+	condition += ` AND article_id =? AND user_id = ?  `
+	pars = append(pars, articleId, user.UserId)
+	total, e := models.GetCygxArticleApplyAppointmentExpertCount(condition, pars)
+	if e != nil {
+		err = errors.New("GetCygxArticleApplyAppointmentExpertCount, Err: " + e.Error())
+		return
+	}
+	if total > 0 {
+		isApplyAppointmentExpert = true
+	}
+	return
+}

+ 126 - 0
services/banner_yx_survey.go

@@ -0,0 +1,126 @@
+package services
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/utils"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// 约访专家的请求
+func AddCygxBannerYxSurvey(user *models.WxUserItem, content string) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg("约访专家的请求失败"+err.Error(), 2)
+		}
+	}()
+	item := new(models.CygxBannerYxSurvey)
+	item.UserId = user.UserId
+	item.CreateTime = time.Now()
+	item.ModifyTime = time.Now()
+	item.Mobile = user.Mobile
+	item.Email = user.Email
+	item.CompanyId = user.CompanyId
+	item.CompanyName = user.CompanyName
+	item.Content = content
+	item.RegisterPlatform = utils.REGISTER_PLATFORM
+	sellerItem, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	item.RealName = user.RealName
+	if sellerItem != nil {
+		item.SellerName = sellerItem.RealName
+	}
+	_, e := models.AddCygxBannerYxSurvey(item)
+	if e != nil {
+		err = errors.New("AddCygxBannerYxSurvey, Err: " + e.Error())
+		return
+	}
+	return
+}
+
+// 用户提交研选调研需求,给汪洋、对口销售、内容组全员发模板消息
+func SendCygxBannerYxSurveyTemplateMsg(user *models.WxUserItem, content string, articleId int) (err error) {
+	var msg string
+	msg = fmt.Sprint(user, articleId)
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg("SendCygxBannerYxSurveyTemplateMsg Err"+msg+err.Error(), 2)
+		}
+	}()
+
+	var mobiles []string
+	//获取权益销售
+	sellerItem, e := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+	if e != nil {
+		err = errors.New("GetAdminByRoleName, Err: " + e.Error())
+		return
+	}
+	//内容组全员手机号
+	configCode := utils.TPL_MSG_NEI_RONG_ZU
+	cnf, e := models.GetConfigByCode(configCode)
+	if e != nil {
+		err = errors.New("GetConfigByCode, Err: " + e.Error() + configCode)
+		return
+	}
+
+	//汪洋手机号
+	cnfWangYang, e := models.GetConfigByCode(utils.TPL_MSG_WANG_YANG)
+	if e != nil {
+		err = errors.New("GetConfigByCode, Err: " + e.Error() + configCode)
+		return
+	}
+
+	mobiles = append(mobiles, sellerItem.Mobile)
+	mobiles = append(mobiles, cnfWangYang.ConfigValue)
+	listMobile := strings.Split(cnf.ConfigValue, ",")
+	for _, v := range listMobile {
+		mobiles = append(mobiles, v)
+	}
+	mobiles = append(mobiles, utils.MobileShenTao, utils.MobileZhangChuanXin, utils.MobileWangFang) // 添加沈涛、张传星、王芳手机号
+	openIdList, e := models.GetWxOpenIdByMobileSliceList(mobiles)
+	if e != nil {
+		err = errors.New("GetWxOpenIdByMobileSliceList, Err: " + e.Error() + configCode)
+		return
+	}
+	if len(openIdList) == 0 {
+		return
+	}
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+
+	fmt.Println(openIdArr)
+	var keyword1 string
+	var keyword2 string
+	var keyword3 string
+	var keyword4 string
+	keyword1 = fmt.Sprint(user.RealName, "--", user.CompanyName, "(", sellerItem.RealName, ")")
+	if user.Mobile == "" {
+		user.Mobile = user.Email
+	}
+	keyword2 = user.Mobile
+	keyword3 = time.Now().Format(utils.FormatDateTime)
+	keyword4 = fmt.Sprint("研选调研需求:", content)
+	var redirectUrl string
+	redirectUrl = utils.WX_MSG_PATH_YX_SURVEY_DETAIL + strconv.Itoa(articleId)
+	sendInfo := new(SendWxTemplate)
+	sendInfo.Keyword1 = keyword1
+	sendInfo.Keyword2 = keyword2
+	sendInfo.Keyword3 = keyword3
+	sendInfo.Keyword4 = keyword4
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD
+	sendInfo.TemplateId = utils.WxMsgTemplateIdApplyXzs
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	sendInfo.Resource = strconv.Itoa(articleId)
+	sendInfo.OpenIdArr = openIdArr
+	err = PublicSendTemplateMsg(sendInfo)
+	return
+}

+ 6 - 1
services/company_permission.go

@@ -150,9 +150,14 @@ func GetUserHasPermissionActivity(user *models.WxUserItem, activityInfo *models.
 		err = errors.New("GetApplyRecordCount, Err: " + e.Error())
 		return
 	}
+	activityPointsByUserAllMap := GetActivityPointsByUserAllMap() // 获取对用户进行研选扣点的活动
 
 	if strings.Contains(activityInfo.ChartPermissionName, utils.CHART_PERMISSION_NAME_YANXUAN) {
-		popupMsg = "暂无<b>买方研选</b>权限<br/>您可申请开通试用"
+		if activityPointsByUserAllMap[activityInfo.ActivityId] {
+			popupMsg = "签约买方研选套餐才可参与此活动,请联系对口销售"
+		} else {
+			popupMsg = "暂无<b>买方研选</b>权限<br/>您可申请开通试用"
+		}
 	} else {
 		popupMsg = "您暂无权限参加此活动,若想参加可以申请开通对应的试用权限"
 	}

+ 281 - 0
services/init_10.9.1.go

@@ -0,0 +1,281 @@
+package services
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/utils"
+	"strconv"
+	"strings"
+)
+
+// 大套餐的
+func InitActivitySpecialTripBillBig() (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+		}
+	}()
+	// 70w 16次
+	list70, err := models.GetActivitySecialTirpBillForInit(1)
+	if err != nil {
+		return
+	}
+	items70 := make([]*models.CygxActivitySpecialTripBill, 0)
+	for _, v := range list70 {
+		itemBill := new(models.CygxActivitySpecialTripBill)
+		itemBill.CreateTime = v.ApprovalTime
+		itemBill.CompanyId = v.CompanyId
+		itemBill.CompanyName = v.CompanyName
+		itemBill.Source = 2
+		itemBill.DoType = 2
+		itemBill.Way = 3
+		itemBill.Content = "70w大套餐转正"
+		itemBill.BillDetailed = 16
+		itemBill.Total = strconv.Itoa(itemBill.BillDetailed) + "次"
+		items70 = append(items70, itemBill)
+		fmt.Println("CompanyId: ", v.CompanyId)
+		fmt.Println("CompanyName: ", v.CompanyName)
+	}
+	err = models.AddCygxActivitySpecialTripBillMulti(items70)
+	if err != nil {
+		return
+	}
+
+	// 45w 10次
+	list45, err := models.GetActivitySecialTirpBillForInit(2)
+	if err != nil {
+		return
+	}
+	items45 := make([]*models.CygxActivitySpecialTripBill, 0)
+	for _, v := range list45 {
+		itemBill := new(models.CygxActivitySpecialTripBill)
+		itemBill.CreateTime = v.ApprovalTime
+		itemBill.CompanyId = v.CompanyId
+		itemBill.CompanyName = v.CompanyName
+		itemBill.Source = 2
+		itemBill.DoType = 2
+		itemBill.Way = 3
+		itemBill.Content = "45w大套餐转正"
+		itemBill.BillDetailed = 10
+		itemBill.Total = strconv.Itoa(itemBill.BillDetailed) + "次"
+		items45 = append(items45, itemBill)
+		fmt.Println("CompanyId: ", v.CompanyId)
+		fmt.Println("CompanyName: ", v.CompanyName)
+	}
+	err = models.AddCygxActivitySpecialTripBillMulti(items45)
+	if err != nil {
+		return
+	}
+	return
+}
+
+// 非大套餐的,根据行业权限添加
+func InitActivitySpecialTripBillNotBig() (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+		}
+	}()
+	list, err := models.GetActivitySecialTirpBillForInitNotBig()
+	if err != nil {
+		return
+	}
+	items := make([]*models.CygxActivitySpecialTripBill, 0)
+	for _, item := range list {
+		chartPermissionIdSlice := strings.Split(item.ChartPermissionIds, ",")
+
+		mapChartName := make(map[string]int)
+		mapPermissionNameTrip := make(map[string]int)
+
+		chartList, e := models.GetChartPermissionByIds(chartPermissionIdSlice)
+		if e != nil {
+			err = errors.New("获取品种信息失败, Err:" + e.Error())
+			return
+		}
+
+		for _, v := range chartList {
+			mapChartName[v.PermissionName] = 5 + mapPermissionNameTrip[v.PermissionName]
+		}
+		itemBill := new(models.CygxActivitySpecialTripBill)
+		itemBill.CreateTime = item.ApprovalTime
+		itemBill.CompanyId = item.CompanyId
+		itemBill.CompanyName = item.CompanyName
+		itemBill.Source = 2
+		itemBill.DoType = 2
+		itemBill.Way = 3
+		for k, v := range mapChartName {
+			if v > 0 {
+				itemBill.BillDetailed += v
+				itemBill.Total += k + strconv.Itoa(v) + "次+"
+			}
+		}
+		itemBill.Content = "行业升级套餐转正"
+		itemBill.Total = strings.TrimRight(itemBill.Total, "+")
+		items = append(items, itemBill)
+		fmt.Println("CompanyId: ", item.CompanyId)
+		fmt.Println("CompanyName: ", item.CompanyName)
+	}
+	err = models.AddCygxActivitySpecialTripBillMulti(items)
+	if err != nil {
+		return
+	}
+	return
+}
+
+// 到期清零和加入继承表
+func ActivitySpecialCompanyTryOutReduce() (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+		}
+	}()
+
+	list, err := models.GetActivitySecialTirpBillForReduce()
+	if err != nil {
+		return
+	}
+	for _, v := range list {
+		userType, tripRemaining, mapChartName, e := GetChartPermissionSpecialSurplusByCompanyForInit(v.CompanyId)
+		if e != nil {
+			err = e
+			fmt.Println("err :", err)
+			continue
+		}
+
+		itemBill := new(models.CygxActivitySpecialTripBill)
+		itemBill.CreateTime = v.CreateTime
+		itemBill.Source = 2
+		itemBill.DoType = 1
+		itemBill.Way = 3
+		itemBill.BillDetailed = -tripRemaining
+		itemBill.CompanyId = v.CompanyId
+		itemBill.CompanyName = v.CompanyName
+		itemBill.Content = "到期清零"
+		itemBill.Total = "0"
+		if tripRemaining == 0 {
+			continue
+		}
+		err = models.AddCygxActivitySpecialTripBill(itemBill)
+		if err != nil {
+			return
+		}
+		fmt.Println("CompanyId: ", v.CompanyId)
+		fmt.Println("CompanyName: ", v.CompanyName)
+		// 删除公司之前的继承表
+		err = models.DelCygxActivitySpecialInheritPointsByCompanyId(v.CompanyId)
+		if err != nil {
+			return
+		}
+		chartMap := map[string]int{utils.YI_YAO_NAME: utils.YI_YAO_ID, utils.XIAO_FEI_NAME: utils.XIAO_FEI_ID, utils.KE_JI_NAME: utils.KE_JI_ID, utils.ZHI_ZAO_NAME: utils.ZHI_ZAO_ID}
+		//添加继承点数表
+		inheritItems := make([]*models.CygxActivitySpecialInheritPointsCompany, 0)
+		if userType == 2 {
+			inheritItem := new(models.CygxActivitySpecialInheritPointsCompany)
+			inheritItem.CompanyId = v.CompanyId
+			inheritItem.CompanyName = v.CompanyName
+			inheritItem.CreateTime = v.CreateTime
+			inheritItem.ModifyTime = v.CreateTime
+			inheritItem.Points = tripRemaining
+			if tripRemaining > 0 {
+				inheritItems = append(inheritItems, inheritItem)
+			}
+		} else {
+			for k, num := range mapChartName {
+				inheritItem := new(models.CygxActivitySpecialInheritPointsCompany)
+				inheritItem.CompanyId = v.CompanyId
+				inheritItem.CompanyName = v.CompanyName
+				inheritItem.CreateTime = v.CreateTime
+				inheritItem.ModifyTime = v.CreateTime
+				inheritItem.Points = num
+				inheritItem.ChartPermissionName = k
+				if _, ok := chartMap[k]; ok {
+					inheritItem.ChartPermissionId = chartMap[k]
+				}
+				if num > 0 {
+					inheritItems = append(inheritItems, inheritItem)
+				}
+			}
+		}
+		if len(inheritItems) > 0 {
+			err = models.AddCygxActivitySpecialInheritPointsCompanyMulti(inheritItems)
+			if err != nil {
+				return
+			}
+		}
+	}
+
+	return
+}
+
+// 补充total
+func ActivitySpecialBillTotalInit() (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+		}
+	}()
+
+	billList, err := models.GetCygxActivitySpecialTripBillForInit()
+	if err != nil {
+		return
+	}
+	chartMap := map[int]string{utils.YI_YAO_ID: utils.YI_YAO_NAME, utils.XIAO_FEI_ID: utils.XIAO_FEI_NAME, utils.KE_JI_ID: utils.KE_JI_NAME, utils.ZHI_ZAO_ID: utils.ZHI_ZAO_NAME}
+
+	for _, billItem := range billList {
+		userType, tripRemaining, mapChartName, e := GetChartPermissionSpecialSurplusByCompanyForInitTotal(billItem.CompanyId)
+		if e != nil {
+			err = e
+			continue
+		}
+		fmt.Println("CompanyId: ", billItem.CompanyId)
+		fmt.Println("CompanyName: ", billItem.CompanyName)
+		list, e := models.GetCygxActivitySpecialTripBillByCompanyIdForInit(billItem.CompanyId)
+		if e != nil {
+			err = e
+			return
+		}
+
+		if userType == 2 {
+			for i, v := range list {
+				if v.ActivityId == 0 {
+					continue
+				}
+				if i == 0 {
+					v.Total = strconv.Itoa(tripRemaining) + "次"
+				} else {
+					v.Total = strconv.Itoa(tripRemaining+v.BillDetailed) + "次"
+				}
+
+				fmt.Println("v.Total:",v.Total)
+				err = models.UpdateCygxActivitySpecialTripBillByCompanyIdForInit(v.Total, v.Id)
+				if err != nil {
+					return
+				}
+			}
+		} else {
+			for i, v := range list {
+				if chart, ok := chartMap[v.ChartPermissionId]; ok {
+					v.Total = ``
+					for k, num := range mapChartName {
+						if k == chart {
+							if i > 0 {
+								num += v.BillDetailed
+							}
+						}
+						v.Total += k + strconv.Itoa(num) + "次+"
+					}
+					v.Total = strings.TrimRight(v.Total, "+")
+					fmt.Println("v.Total:",v.Total)
+					err = models.UpdateCygxActivitySpecialTripBillByCompanyIdForInit(v.Total, v.Id)
+					if err != nil {
+						return
+					}
+				}
+			}
+		}
+
+	}
+
+	return
+}

+ 3 - 3
services/task.go

@@ -35,9 +35,6 @@ func Task() {
 		getChartListByApi := task.NewTask("getChartListByApi", "0 */10 * * * *", GetChartDetailByChartId) //同步图表
 		task.AddTask("getChartListByApi", getChartListByApi)
 
-		getYiDongActivity := task.NewTask("getYiDongActivity", "0 */10 * * * *", GetYiDongActivity) //同步易董的活动信息
-		task.AddTask("getYiDongActivity", getYiDongActivity)
-
 		getYiDongActivityMeeting := task.NewTask("getYiDongActivityMeeting", "0 */60 * * * *", GetYiDongActivityMeeting) //同步易董的活动信息
 		task.AddTask("getYiDongActivityMeeting", getYiDongActivityMeeting)
 
@@ -47,6 +44,9 @@ func Task() {
 
 	if utils.IsTask {
 
+		getYiDongActivity := task.NewTask("getYiDongActivity", "0 */10 * * * *", GetYiDongActivity) //同步易董的活动信息
+		task.AddTask("getYiDongActivity", getYiDongActivity)
+
 		//会议提醒模板消息推送
 		sendActivityBeginMsg := task.NewTask("sendActivityBeginMsg", "0 */10 6-23 * * *", SendActivityBeginMsg) //会议前60分钟的提醒
 		task.AddTask("sendActivityBeginMsg", sendActivityBeginMsg)

+ 8 - 2
services/wx_user.go

@@ -537,7 +537,7 @@ func UpdateWxUserLabel(cont context.Context) (err error) {
 				//处理用户的互动量
 				if len(userUserInteractionList) > 0 {
 					for _, vsplit := range userUserInteractionList {
-						interactionNum = vsplit.HistoryNum + vsplit.CountNum + vsplit.IndustryFllowNum + vsplit.DepartmentFollowNum + vsplit.KeyWordNum + vsplit.OnLineNum + vsplit.OfficeNum + vsplit.ChartCountNum + vsplit.TripNum + vsplit.RoadshowVideoNum + vsplit.ActivityVideoNum + vsplit.ActivityVoiceNum
+						interactionNum = vsplit.HistoryNum + vsplit.CountNum + vsplit.IndustryFllowNum + vsplit.DepartmentFollowNum + vsplit.KeyWordNum + vsplit.OnLineNum + vsplit.OfficeNum + vsplit.ChartCountNum + vsplit.TripNum + vsplit.RoadshowVideoNum + vsplit.ActivityVideoNum + vsplit.ActivityVoiceNum + vsplit.TagNum
 						if interactionNum > 0 {
 							//更改用户的互动量
 							err = models.UpdateUserInteractionNum(interactionNum, int(vsplit.UserId))
@@ -562,6 +562,7 @@ func UpdateWxUserLabel(cont context.Context) (err error) {
 							itemInteraction.RoadshowVideoNum = vsplit.RoadshowVideoNum
 							itemInteraction.ActivityVideoNum = vsplit.ActivityVideoNum
 							itemInteraction.ActivityVoiceNum = vsplit.ActivityVoiceNum
+							itemInteraction.TagNum = vsplit.TagNum
 							itemInteraction.RoadshowNum = vsplit.RoadshowVideoNum + vsplit.ActivityVideoNum + vsplit.ActivityVoiceNum
 							itemInteraction.CreateTime = time.Now()
 							itemInteraction.ModifyTime = time.Now()
@@ -583,6 +584,7 @@ func UpdateWxUserLabel(cont context.Context) (err error) {
 								itemCompanyInteraction.RoadshowVideoNum = vsplit.RoadshowVideoNum
 								itemCompanyInteraction.ActivityVideoNum = vsplit.ActivityVideoNum
 								itemCompanyInteraction.ActivityVoiceNum = vsplit.ActivityVoiceNum
+								itemCompanyInteraction.TagNum = vsplit.TagNum
 								itemCompanyInteraction.RoadshowNum = vsplit.RoadshowVideoNum + vsplit.ActivityVideoNum + vsplit.ActivityVoiceNum
 								mapCompanyInteractionItem[vsplit.CompanyId] = itemCompanyInteraction
 								mapCompanyInteractionItem[vsplit.CompanyId].CreateTime = time.Now()
@@ -603,6 +605,7 @@ func UpdateWxUserLabel(cont context.Context) (err error) {
 								mapCompanyInteractionItem[vsplit.CompanyId].RoadshowVideoNum += vsplit.RoadshowVideoNum
 								mapCompanyInteractionItem[vsplit.CompanyId].ActivityVideoNum += vsplit.ActivityVideoNum
 								mapCompanyInteractionItem[vsplit.CompanyId].ActivityVoiceNum += vsplit.ActivityVoiceNum
+								mapCompanyInteractionItem[vsplit.CompanyId].TagNum += vsplit.TagNum
 								mapCompanyInteractionItem[vsplit.CompanyId].RoadshowNum += vsplit.RoadshowVideoNum + vsplit.ActivityVideoNum + vsplit.ActivityVoiceNum
 
 							}
@@ -636,7 +639,7 @@ func UpdateWxUserLabel(cont context.Context) (err error) {
 			//处理用户的互动量
 			if len(userUserInteractionList) > 0 {
 				for _, vsplit := range userUserInteractionList {
-					interactionNum = vsplit.HistoryNum + vsplit.CountNum + vsplit.IndustryFllowNum + vsplit.DepartmentFollowNum + vsplit.KeyWordNum + vsplit.OnLineNum + vsplit.OfficeNum + vsplit.ChartCountNum + vsplit.TripNum + vsplit.RoadshowVideoNum + vsplit.ActivityVideoNum + vsplit.ActivityVoiceNum
+					interactionNum = vsplit.HistoryNum + vsplit.CountNum + vsplit.IndustryFllowNum + vsplit.DepartmentFollowNum + vsplit.KeyWordNum + vsplit.OnLineNum + vsplit.OfficeNum + vsplit.ChartCountNum + vsplit.TripNum + vsplit.RoadshowVideoNum + vsplit.ActivityVideoNum + vsplit.ActivityVoiceNum + vsplit.TagNum
 					if interactionNum > 0 {
 						err = models.UpdateUserInteractionNum(interactionNum, int(vsplit.UserId))
 						if err != nil {
@@ -660,6 +663,7 @@ func UpdateWxUserLabel(cont context.Context) (err error) {
 						itemInteraction.RoadshowVideoNum = vsplit.RoadshowVideoNum
 						itemInteraction.ActivityVideoNum = vsplit.ActivityVideoNum
 						itemInteraction.ActivityVoiceNum = vsplit.ActivityVoiceNum
+						itemInteraction.TagNum = vsplit.TagNum
 						itemInteraction.RoadshowNum = vsplit.RoadshowVideoNum + vsplit.ActivityVideoNum + vsplit.ActivityVoiceNum
 
 						//如果这个切片下的结构体没有值就给他初始值,如果有就跟后面的相加
@@ -679,6 +683,7 @@ func UpdateWxUserLabel(cont context.Context) (err error) {
 							itemCompanyInteraction.RoadshowVideoNum = vsplit.RoadshowVideoNum
 							itemCompanyInteraction.ActivityVideoNum = vsplit.ActivityVideoNum
 							itemCompanyInteraction.ActivityVoiceNum = vsplit.ActivityVoiceNum
+							itemCompanyInteraction.TagNum = vsplit.TagNum
 							itemCompanyInteraction.RoadshowNum = vsplit.RoadshowVideoNum + vsplit.ActivityVideoNum + vsplit.ActivityVoiceNum
 							mapCompanyInteractionItem[vsplit.CompanyId] = itemCompanyInteraction
 							mapCompanyInteractionItem[vsplit.CompanyId].CreateTime = time.Now()
@@ -698,6 +703,7 @@ func UpdateWxUserLabel(cont context.Context) (err error) {
 							mapCompanyInteractionItem[vsplit.CompanyId].RoadshowVideoNum += vsplit.RoadshowVideoNum
 							mapCompanyInteractionItem[vsplit.CompanyId].ActivityVideoNum += vsplit.ActivityVideoNum
 							mapCompanyInteractionItem[vsplit.CompanyId].ActivityVoiceNum += vsplit.ActivityVoiceNum
+							mapCompanyInteractionItem[vsplit.CompanyId].TagNum += vsplit.TagNum
 							mapCompanyInteractionItem[vsplit.CompanyId].RoadshowNum += vsplit.RoadshowVideoNum + vsplit.ActivityVideoNum + vsplit.ActivityVoiceNum
 						}
 

+ 34 - 3
services/yidong.go

@@ -288,9 +288,15 @@ func GetYiDongActivity(cont context.Context) (err error) {
 			item.LastUpdatedTime = time.Now()
 			item.Label = companyInfo
 			item.TemporaryLabel = companyInfo
-			item.ChartPermissionId = GetActivityTypeIdWithYiDong(v.IndustrySwName)
-			item.ChartPermissionName = GetActivityTypeNameWithYiDong(v.IndustrySwName)
-			item.ChartPermissionNames = GetActivityTypeNameWithYiDong(v.IndustrySwName)
+			item.ChartPermissionId = utils.CHART_PERMISSION_ID_YANXUAN
+			item.ChartPermissionName = utils.CHART_PERMISSION_NAME_MF_YANXUAN
+			item.ChartPermissionIdDeputy = GetActivityTypeIdWithYiDong(v.IndustrySwName)
+			item.ChartPermissionNameDeputy = GetActivityTypeNameWithYiDong(v.IndustrySwName)
+			item.ChartPermissionNames = item.ChartPermissionName
+			//if item.ChartPermissionId != item.ChartPermissionIdDeputy {
+
+			item.IsShowHz = 1 //默认弘则活动也展示 11.0
+			//}
 			item.ActivityTime = v.Start
 			item.YidongActivityEndTime = v.End
 			item.YidongSignUpStart = v.SignUpStart
@@ -342,6 +348,9 @@ func GetYiDongActivity(cont context.Context) (err error) {
 					updateParams["ActivityJoinType"] = item.ActivityJoinType
 					updateParams["YidongSignUpStart"] = item.YidongSignUpStart
 					updateParams["YidongSignUpEnd"] = item.YidongSignUpEnd
+					updateParams["ChartPermissionIdDeputy"] = item.ChartPermissionIdDeputy
+					updateParams["ChartPermissionNameDeputy"] = item.ChartPermissionNameDeputy
+					updateParams["IsShowHz"] = item.IsShowHz
 					updateParams["IsExternalLabel"] = 1
 					updateParams["LastUpdatedTime"] = time.Now()
 					whereParam := map[string]interface{}{"yidong_activity_id": item.YidongActivityId}
@@ -837,6 +846,25 @@ func YiDongSignAppointmentsForThird(cont context.Context) (err error) {
 	if err != nil {
 		return
 	}
+	if len(activityList) == 0 {
+		return
+	}
+	listEmail, e := models.GetAskEmail()
+	if e != nil {
+		err = errors.New("GetAskEmail, Err: " + e.Error())
+		return
+	}
+
+	//获取某一个活动下面不需要推送的主讲人手机号
+	idAndMobileNoSendMap := make(map[string]bool)
+	for _, v := range activityList {
+		for _, vName := range listEmail {
+			if strings.Contains(v.Speaker, vName.Name) {
+				idAndMobileNoSendMap[fmt.Sprint("Id_", v.ActivityId, "Mobile_", vName.Mobile)] = true
+			}
+		}
+	}
+
 	url := utils.YiDongHuaWeiYunUrl + "app/hz/signAppointmentsForThird"
 	var outCallStatus string
 	for _, v := range activityList {
@@ -860,6 +888,9 @@ func YiDongSignAppointmentsForThird(cont context.Context) (err error) {
 		}
 		sellNameMap := GetSellNameMapByCompanyIds(companyIds)
 		for _, vS := range listSignUp {
+			if idAndMobileNoSendMap[fmt.Sprint("Id_", vS.ActivityId, "Mobile_", vS.Mobile)] {
+				continue //如果这个活动对应的是主讲人的手机号,那么就不做推送
+			}
 			if vS.SignupType == 1 {
 				outCallStatus = "1"
 			} else {

+ 1 - 1
utils/config.go

@@ -170,7 +170,7 @@ func init() {
 		EmailTechnology = "mlluo@hzinsights.com;jxu@hzinsights.com;tshen@hzinsights.com;cxzhang@hzinsights.com;jhwang@hzinsights.com;hwang@hzinsights.com;rli@hzinsights.com"       //科技行业专家邮箱
 		EmailMedicine = "xlzheng@hzinsights.com;tshen@hzinsights.com;cxzhang@hzinsights.com;jhwang@hzinsights.com;yxyan@hzinsights.com;ppwang@hzinsights.com"                       //医药行业专家邮箱
 		EmailConsumption = "yrhuang@hzinsights.com;tshen@hzinsights.com;cxzhang@hzinsights.com;jhwang@hzinsights.com;jxu@hzinsights.com;hychen@hzinsights.com;lwang@hzinsights.com" //消费行业专家邮箱
-		EmailZhizao = "xfma@hzinsights.com;agne@hzinsights.com;tshen@hzinsights.com;cxzhang@hzinsights.com;jhwang@hzinsights.com;kfyu@hzinsights.com"                               //智造行业专家邮箱
+		EmailZhizao = "xfma@hzinsights.com;agne@hzinsights.com;tshen@hzinsights.com;cxzhang@hzinsights.com;jhwang@hzinsights.com"                                                   //智造行业专家邮箱
 		EmailStrategy = "experts@hzinsights.com;tshen@hzinsights.com;cxzhang@hzinsights.com;jhwang@hzinsights.com"                                                                  //策略行业专家邮箱
 		EmailExpert = "experts@hzinsights.com;tshen@hzinsights.com;cxzhang@hzinsights.com;jhwang@hzinsights.com"                                                                    //研选行业专家邮箱
 		EmaiWhiteUserList = "tshen@hzinsights.com;cxzhang@hzinsights.com;yyli@hzinsights.com"                                                                                       //白名单邮箱

+ 8 - 0
utils/constants.go

@@ -180,6 +180,7 @@ const (
 	WX_MSG_PATH_RESEARCHTHEME_DETAIL     = "reportPages/researchTheme/researchTheme?id="                  //主题详情模板消息地址
 	WX_MSG_PATH_ACTIVITY_SIGN            = "pages-message/activityTemplate/activityTemplate?id="          //活动模板消息地址
 	WX_MSG_PATH_APPLY_DETAIL             = "pages-message/applyFor/applyFor?id="                          //潜在用户试用权限申请
+	WX_MSG_PATH_YX_SURVEY_DETAIL         = "pages-purchaser/survey/surveyDetail?surveyId="                //用户提交研选调研需求
 )
 
 //2:文章详情  https://web.hzinsights.com/material/info/8436  小程序路径:/pageMy/reportDetail/reportDetail?id=
@@ -213,4 +214,11 @@ const (
 	TPL_MSG_WANG_YANG           = "tpl_msg_wang_yang"           //汪洋手机号地址参数
 	TPL_MSG_WANG_FANG_WANG_YANG = "tpl_msg_wang_fang_wang_yang" //权限模板消息接收人,王芳,汪洋
 	TPL_MSG                     = "tpl_msg"                     //王芳手机号地址参数
+	TPL_MSG_NEI_RONG_ZU         = "tpl_msg_nei_rong_zu"         //内容组四人
+)
+
+const (
+	MobileShenTao       = "18767183922" //沈涛手机号
+	MobileZhangChuanXin = "15557270714" // 张传星手机号
+	MobileWangFang      = "18621268829" // 王芳手机号
 )