Browse Source

Merge branch 'master' into cygx_10.9

# Conflicts:
#	controllers/activity.go
#	models/db.go
ziwen 1 year ago
parent
commit
0da4db8845

+ 345 - 211
controllers/activity.go

@@ -532,10 +532,6 @@ func (this *ActivityCoAntroller) Detail() {
 		}
 		//处理按钮是否展示问题
 		resp.Detail = services.ActivityButtonShow(activityInfo)
-		// 暂时写死,客户需要 5.16
-		if activityInfo.ActivityId == 2992 {
-			activityInfo.ActivityTypeName = "分析师线下沙龙"
-		}
 	} else {
 		hasPermission, sellerName, sellerMobile, popupMsg, err := services.GetUserHasPermissionActivity(user, activityInfo)
 		if err != nil {
@@ -677,6 +673,18 @@ func (this *ActivityCoAntroller) SignupAdd() {
 			br.ErrMsg = "获取对应销售失败,Err:" + err.Error()
 			return
 		}
+
+		popupMsg, err := services.CheckActivityUserAll(activityInfo, user)
+		if err != nil {
+			br.Msg = "报名失败!"
+			br.ErrMsg = "CheckActivityUserAll,Err:" + err.Error()
+			return
+		}
+		if popupMsg != "" {
+			br.Msg = "报名失败!"
+			br.ErrMsg = fmt.Sprint("userId:", uid, "Activity:id", popupMsg)
+			return
+		}
 		//人数已满:FullStarffed、单机构超过两人:TwoPeople、爽约次数过多:BreakPromise、超时:Overtime 、成功:Success"`
 		//如果是下面几种情况则对报名信息做判断限制 (公司调研电话会(限制人数)、公司线下调研、专家/分析师线下沙龙)
 		//if (activityInfo.ActivityTypeId == 3 && activityInfo.IsLimitPeople == 1) || activityInfo.ActivityTypeId > 3 {
@@ -836,6 +844,7 @@ func (this *ActivityCoAntroller) SignupAdd() {
 				go services.ActivityUserRemind(user, activityInfo, 4)
 				resp.PopupMsg = "<b>报名成功,已加入您的活动日程</b><br/>想要及时获取活动信息变更通知,请关注【查研观向小助手】公众号"
 			}
+			go services.YanXuanActivityPointsBillSignupAdd(activityId, uid) // 用户报名添加到处理研选扣点
 		}
 	} else {
 		hasPermission, sellerName, sellerMobile, popupMsg, err := services.GetUserHasPermissionActivity(user, activityInfo)
@@ -986,47 +995,7 @@ func (this *ActivityCoAntroller) SignupCancel() {
 		br.ErrMsg = "操作失败,Err:" + errSignup.Error()
 		return
 	}
-
-	// 如果是买方研选下的专家沙龙,同时推给内容组四人
-	if activityInfo.ActivityTypeId == 5 {
-		//获取销售手机号
-		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)
-		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 := "取消报名" + activityInfo.ActivityName
-		openIdArr := make([]string, 0)
-		for _, v := range openIdList {
-			openIdArr = append(openIdArr, v.OpenId)
-		}
-		sendInfo := new(services.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 = services.PublicSendTemplateMsg(sendInfo)
-		return
-	}
-
+	go services.YanXuanActivityPointsBillSignupCancel(activityId, uid) // 用户取消报名添加到处理研选扣点
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"
@@ -1714,6 +1683,8 @@ func (this *ActivityCoAntroller) LabelMoreList() {
 // @Param   ActivityId   query   int  false       "活动列表传过来的活动ID"
 // @Param   Filter			query	int		false	"筛选条件 0:全部 1:视频 2:音频"
 // @Param   TypeName   query   string  false       "电话会类型 ,1专家电话会 2分析师电话会"
+// @Param   IsExternalLabel   query   int  false       "是否仅展示外部资源 1:是、0:否 默认0"
+// @Param   IsResearchPoints   query   string  false       "是否仅展示研选扣点 1:展示研选扣点、2:展示外部资源 ,1,2两者都展示" //兼容前端
 // @Success 200 {object} models.GetCygxActivityListRep
 // @router /listNew [get]
 func (this *ActivityCoAntroller) ActivityListNew() {
@@ -1728,20 +1699,24 @@ func (this *ActivityCoAntroller) ActivityListNew() {
 		br.ErrMsg = "请登录,SysUser Is Empty"
 		return
 	}
+
 	uid := user.UserId
 	pageSize, _ := this.GetInt("PageSize")
 	currentIndex, _ := this.GetInt("CurrentIndex")
-	source, _ := this.GetInt("Source")
+	//source, _ := this.GetInt("Source")
 	label := this.GetString("Label")
 	chartPermissionIds := this.GetString("ChartPermissionIds")
 	whichDay := this.GetString("WhichDay")
+	//whichTime := this.GetString("WhichTime")
 	activeState := this.GetString("ActiveState")
 	activityTypeId := this.GetString("ActivityTypeId")
 	keyWord := this.GetString("KeyWord")
 	playBack, _ := this.GetInt("PlayBack")
 	filter, _ := this.GetInt("Filter")
-	typeName := this.GetString("TypeName")
+	isPower, _ := this.GetInt("IsPower")
 	activityId, _ := this.GetInt("ActivityId") // 仅用于判断【新】标签
+	//isExternalLabel, _ := this.GetInt("IsExternalLabel")   //
+	isResearchPoints := this.GetString("IsResearchPoints") //
 
 	if label == "undefined" {
 		label = ""
@@ -1773,63 +1748,144 @@ func (this *ActivityCoAntroller) ActivityListNew() {
 	startSize = utils.StartIndex(currentIndex, pageSize)
 	//userType, permissionStr, err := services.GetUserType(user.CompanyId)
 	var condition string
+	var conditioninit string //初始化搜索条件
 	var pars []interface{}
 	var activityList []*models.ActivityDetail
 	mapDingActivityId := make(map[int]int)
-	//进行中的活动拍在最上面
-	//if keyWord != "" {
-	//	conditionActivity, err := services.GetActivityonditionList(user, activityTypeId, chartPermissionIds, whichDay, strconv.Itoa(2), label, 0, source, keyWord)
-	//	if err != nil && err.Error() != utils.ErrNoRow() {
-	//		br.Msg = "获取失败"
-	//		br.ErrMsg = "获取活动权限数据失败,Err:" + err.Error()
-	//		return
-	//	}
-	//	if source == 1 {
-	//		condition += ` AND art.yidong_activity_id = '' `
-	//	}
-	//	condition += ` AND art.is_limit_people = 1 AND art.publish_status = 1 ` + conditionActivity
-	//	condition += ` ORDER BY art.activity_time ASC   `
-	//	listDing, err := models.GetActivityListAll(condition, pars, uid, startSize, pageSize, playBack)
-	//	if err != nil && err.Error() != utils.ErrNoRow() {
-	//		br.Msg = "获取失败"
-	//		br.ErrMsg = "获取活动权限数据失败,Err:" + err.Error()
-	//		return
-	//	}
-	//	if len(listDing) > 0 {
-	//		for _, v := range listDing {
-	//			activityList = append(activityList, v)
-	//			mapDingActivityId[v.ActivityId] = v.ActivityId
-	//		}
-	//	}
-	//	return
-	//	fmt.Println("len", len(listDing))
-	//}
-	//condition = " AND art.is_limit_people = 1 AND art.publish_status = 1  "
+
+	//主题
+	if label != "" {
+		conditioninit += ` AND art.label  LIKE "%` + label + `%" `
+	}
+	//行业名称
+	if len(chartPermissionIds) > 0 {
+		conditioninit += ` AND art.chart_permission_id  IN (` + chartPermissionIds + `)`
+	}
+	//哪一天
+	if whichDay != "" {
+		var startDate string
+		var endDate string
+		if whichDay == "1" {
+			startDate = time.Now().Format(utils.FormatDate)
+			endDate = startDate
+		} else if whichDay == "2" {
+			startDate = time.Now().AddDate(0, 0, +1).Format(utils.FormatDate)
+			endDate = startDate
+		} else if whichDay == "3" {
+			startDate = utils.GetNowWeekMonday().Format(utils.FormatDate)
+			endDate = utils.GetNowWeekSunday().Format(utils.FormatDate)
+		} else if whichDay == "4" {
+			startDate = utils.GetLastWeekMonday().Format(utils.FormatDate)
+			endDate = utils.GetLastWeekSunday().Format(utils.FormatDate)
+		} else if whichDay == "5" {
+			startDate = utils.GetNowMonthFirstDay().Format(utils.FormatDate)
+			endDate = utils.GetNowMonthLastDay().Format(utils.FormatDate)
+		} else if whichDay == "6" {
+			startDate = utils.GetLastMonthFirstDay().Format(utils.FormatDate)
+			endDate = utils.GetLastMonthLastDay().Format(utils.FormatDate)
+		} else if whichDay == "1,2" {
+			startDate = time.Now().Format(utils.FormatDate)
+			endDate = time.Now().AddDate(0, 0, +1).Format(utils.FormatDate)
+		} else if whichDay == "3,4" {
+			startDate = utils.GetLastWeekMonday().Format(utils.FormatDate)
+			endDate = utils.GetNowWeekSunday().Format(utils.FormatDate)
+		} else if whichDay == "5,6" {
+			startDate = utils.GetLastMonthFirstDay().Format(utils.FormatDate)
+			endDate = utils.GetNowMonthLastDay().Format(utils.FormatDate)
+		} else {
+			startDate = time.Now().Format(utils.FormatDate)
+			endDate = time.Now().AddDate(0, 0, +1).Format(utils.FormatDate)
+		}
+		conditioninit += ` AND art.activity_time >= ` + "'" + startDate + " 00:00:00'"
+		conditioninit += ` AND art.activity_time <= ` + "'" + endDate + " 23:59:59'"
+	}
+
+	//活动状态搜索
+	if activeState != "" {
+		// 默认查看未开始跟进行中
+		if activeState == "1" {
+			conditioninit += ` AND art.active_state  IN (1,2)`
+		} else {
+			conditioninit += ` AND art.active_state  IN (` + activeState + `)`
+		}
+	} else {
+		conditioninit += ` AND art.active_state  IN (1,2)`
+	}
+
+	// 如果是分析师电话会,那么可以连同C类一起查看
+	if activityTypeId != "" {
+		if activityTypeId == strconv.Itoa(utils.ANALYST_TELL_ACTIVITY_TYPE_ID) {
+			conditioninit += `  AND art.activity_type_id IN (` + activityTypeId + "," + strconv.Itoa(utils.C_CLASS_ACTIVITY_TYPE_ID) + `)`
+		} else {
+			conditioninit += `  AND art.activity_type_id IN (` + activityTypeId + `)`
+		}
+	}
+
+	//关键词搜索
+	if keyWord != "" {
+		conditioninit += ` AND (art.label   REGEXP '` + keyWord + `' OR art.activity_name  REGEXP '` + keyWord + `' ) `
+	}
+
+	//回放
+	if playBack == 1 {
+		//获取所有带回放的活动ID
+		playBackActivityIds, err := services.GetActivityPlayBackActivityIds()
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		conditioninit += ` AND art.activity_id IN ( ` + playBackActivityIds + `) `
+	}
+
+	//音频视频  1:视频 2:音频
+	if filter > 0 {
+		videoOrVoiceActivityIds, err := services.GetActivityVideoOrVoiceActivityIds(filter)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		conditioninit += ` AND art.activity_id IN ( ` + videoOrVoiceActivityIds + `) `
+	}
+	//外部资源,研选扣点的并集搜索
+	if isResearchPoints == "1,2" || isResearchPoints == "2,1" {
+		conditioninit += ` AND ( art.is_external_label = 1  OR art.is_research_points = 1 )`
+	} else {
+		// 是否为研选扣点
+		if isResearchPoints == "1" {
+			conditioninit += ` AND art.is_research_points = 1 `
+		}
+		//是否为外部资源
+		if isResearchPoints == "2" {
+			conditioninit += ` AND art.is_external_label = 1 `
+		}
+	}
+
 	//活动可见限制
-	conditionActivityAll, err := services.GetActivityonditionList(user, activityTypeId, chartPermissionIds, whichDay, activeState, label, 0, source, keyWord, playBack, 3)
+	//conditionActivityAll, err := services.GetActivityonditionList(user, activityTypeId, chartPermissionIds, whichDay, activeState, label, 0, source, keyWord, playBack, 3)
+	conditionActivity, err := services.ActivityConditioninitSql(user, conditioninit, isPower)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取活动权限数据失败,Err:" + err.Error()
 		return
 	}
-	if source == 1 {
-		condition += ` AND art.yidong_activity_id = '' `
-	}
-	var conditionCount string
-	conditionCount = condition + conditionActivityAll
-	total, err := models.GetActivityCount(conditionCount, playBack, pars, filter)
+	condition += `  AND art.publish_status = 1 ` + conditionActivity
+	//var conditionCount string
+	//conditionCount = condition + conditionActivityAll
+	total, err := models.GetActivityCount(condition, playBack, pars, filter)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
 	//搜索关键词初始化
-	conditionActivityKey, err := services.GetActivityonditionList(user, activityTypeId, chartPermissionIds, whichDay, activeState, label, 0, source, keyWord, playBack, 1)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取失败,Err:" + err.Error()
-		return
-	}
+	//conditionActivityKey, err := services.GetActivityonditionList(user, activityTypeId, chartPermissionIds, whichDay, activeState, label, 0, source, keyWord, playBack, 1)
+	//if err != nil && err.Error() != utils.ErrNoRow() {
+	//	br.Msg = "获取失败"
+	//	br.ErrMsg = "获取失败,Err:" + err.Error()
+	//	return
+	//}
 	var conditionOrder string
 	if activeState == "2" || activeState == "3" {
 		conditionOrder = ` ORDER BY art.activity_time DESC  `
@@ -1845,52 +1901,16 @@ func (this *ActivityCoAntroller) ActivityListNew() {
 	if activeState == "1" {
 		conditionOrder = ` ORDER BY art.activity_time ASC  `
 	}
-	conditionActivityKey += condition + conditionOrder
+	//conditionActivityKey += condition + conditionOrder
+	condition += conditionOrder
 	//fmt.Println(conditionOrder)
 
-	list, errList := models.GetActivityListNew(conditionActivityKey, pars, uid, startSize, pageSize, playBack, filter, typeName)
+	list, errList := models.GetActivityListNew(condition, pars, uid, startSize, pageSize, playBack, filter, "")
 	if errList != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + errList.Error()
 		return
 	}
-	if keyWord != "" {
-		keyWordArr, err := services.GetIndustryMapNameSliceV3(keyWord)
-		if err != nil {
-			br.Msg = "获取失败"
-			br.ErrMsg = "获取分词失败,GetIndustryMapNameSliceV3 Err: " + err.Error()
-			return
-		}
-		keyWordArr = services.RemoveDuplicatesAndEmpty(keyWordArr)
-
-		startSizeIk := utils.StartIndex(currentIndex, pageSize)
-		startSizeIk = startSizeIk - total
-		if startSizeIk < 0 {
-			startSizeIk = 0
-		}
-		var pageSizeIk int
-		pageSizeIk = pageSize - len(list)
-		if pageSizeIk > 0 {
-			//搜索关键词联想
-			conditionActivityIk, err := services.GetActivityonditionList(user, activityTypeId, chartPermissionIds, whichDay, activeState, label, 0, source, keyWord, playBack, 2)
-			if err != nil {
-				br.Msg = "获取失败"
-				br.ErrMsg = "获取失败,Err:" + err.Error()
-				return
-			}
-			conditionActivityIk += condition + conditionOrder
-			listIk, errList := models.GetActivityListNew(conditionActivityIk, pars, uid, startSizeIk, pageSizeIk, playBack, filter, typeName)
-			if errList != nil {
-				br.Msg = "获取失败"
-				br.ErrMsg = "获取失败,Err:" + errList.Error()
-				return
-			}
-
-			for _, item := range listIk {
-				list = append(list, item)
-			}
-		}
-	}
 
 	var isShow bool
 	isShow = services.GetShowSustainable()
@@ -2061,10 +2081,13 @@ func (this *ActivityCoAntroller) ActivityListNew() {
 	}
 
 	//添加活动搜索记录
-	if keyWord != "" {
-		go services.AddActivitykeyWordSearch(keyWord, user)
-	}
+	//if keyWord != "" {
+	//	go services.AddActivitykeyWordSearch(keyWord, user)
+	//}
 
+	if activityTypeId == "3" || activityTypeId == "5" {
+		resp.IsShowResearchPoints = true
+	}
 	resp.Paging = page
 	br.Ret = 200
 	br.Success = true
@@ -2192,6 +2215,7 @@ func (this *ActivityCoAntroller) LabelTypeListV5() {
 	if chartPermissionIds != "" {
 		chartPermissionIds += ",1"
 	}
+
 	userType, _, err := services.GetUserType(user.CompanyId)
 	if err != nil {
 		br.Msg = "获取失败"
@@ -2201,6 +2225,7 @@ func (this *ActivityCoAntroller) LabelTypeListV5() {
 	var startSize int
 	pageSize = 1000
 	var sortTime string
+	var conditioninit string
 	var pars []interface{}
 	//活动可见限制
 
@@ -2226,22 +2251,80 @@ 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 += `, '宏观'`
+	//}
 
-	// 查研观向7.4-始终查询宏观的权限(无论是否有权限)
-	if permissionNameStr == `` {
-		permissionNameStr = `'宏观'`
+	//行业名称
+	if len(chartPermissionIds) > 0 {
+		conditioninit += ` AND art.chart_permission_id  IN (` + chartPermissionIds + `)`
+	}
+	//哪一天
+	if whichDay != "" {
+		var startDate string
+		var endDate string
+		if whichDay == "1" {
+			startDate = time.Now().Format(utils.FormatDate)
+			endDate = startDate
+		} else if whichDay == "2" {
+			startDate = time.Now().AddDate(0, 0, +1).Format(utils.FormatDate)
+			endDate = startDate
+		} else if whichDay == "3" {
+			startDate = utils.GetNowWeekMonday().Format(utils.FormatDate)
+			endDate = utils.GetNowWeekSunday().Format(utils.FormatDate)
+		} else if whichDay == "4" {
+			startDate = utils.GetLastWeekMonday().Format(utils.FormatDate)
+			endDate = utils.GetLastWeekSunday().Format(utils.FormatDate)
+		} else if whichDay == "5" {
+			startDate = utils.GetNowMonthFirstDay().Format(utils.FormatDate)
+			endDate = utils.GetNowMonthLastDay().Format(utils.FormatDate)
+		} else if whichDay == "6" {
+			startDate = utils.GetLastMonthFirstDay().Format(utils.FormatDate)
+			endDate = utils.GetLastMonthLastDay().Format(utils.FormatDate)
+		} else if whichDay == "1,2" {
+			startDate = time.Now().Format(utils.FormatDate)
+			endDate = time.Now().AddDate(0, 0, +1).Format(utils.FormatDate)
+		} else if whichDay == "3,4" {
+			startDate = utils.GetLastWeekMonday().Format(utils.FormatDate)
+			endDate = utils.GetNowWeekSunday().Format(utils.FormatDate)
+		} else if whichDay == "5,6" {
+			startDate = utils.GetLastMonthFirstDay().Format(utils.FormatDate)
+			endDate = utils.GetNowMonthLastDay().Format(utils.FormatDate)
+		} else {
+			startDate = time.Now().Format(utils.FormatDate)
+			endDate = time.Now().AddDate(0, 0, +1).Format(utils.FormatDate)
+		}
+		conditioninit += ` AND art.activity_time >= ` + "'" + startDate + " 00:00:00'"
+		conditioninit += ` AND art.activity_time <= ` + "'" + endDate + " 23:59:59'"
+	}
+
+	//活动状态搜索
+	if activeState != "" {
+		// 默认查看未开始跟进行中
+		if activeState == "1" {
+			conditioninit += ` AND art.active_state  IN (1,2)`
+		} else {
+			conditioninit += ` AND art.active_state  IN (` + activeState + `)`
+		}
 	} else {
-		permissionNameStr += `, '宏观'`
+		conditioninit += ` AND art.active_state  IN (1,2)`
 	}
 
 	var condition string
-	conditionActivity, err := services.GetActivityonditionList(user, "", chartPermissionIds, whichDay, activeState, "", isPower, 0, "", 0, 1)
+	//conditionActivity, err := services.GetActivityonditionList(user, "", chartPermissionIds, whichDay, activeState, "", isPower, 0, "", 0, 1)
+
+	conditionActivity, err := services.ActivityConditioninitSql(user, conditioninit, isPower)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取活动权限数据失败,Err:" + err.Error()
 		return
 	}
-	condition += `AND art.is_limit_people = 1 ` + conditionActivity
+	//condition += `AND art.is_limit_people = 1 ` + conditionActivity
+	condition += conditionActivity
 	sortTime = ` mintimesort ASC `
 	listActivity, err := models.GetActivityLabelListAll(condition, sortTime, pars, startSize, pageSize)
 	if err != nil {
@@ -2273,9 +2356,10 @@ func (this *ActivityCoAntroller) LabelTypeListV5() {
 		}
 		item.Resource = 1
 		item.ActivityId = v.ActivityId
-		//if v.YidongActivityId > 0 {
+
 		item.IsExternalLabel = v.IsExternalLabel
-		//}
+		item.IsResearchPoints = v.IsResearchPoints
+
 		mapActivity[v.ActivityTypeId] = append(mapActivity[v.ActivityTypeId], item)
 		mapkeyWord[fmt.Sprint(v.ActivityTypeId, "-", item.KeyWord)] = item.KeyWord
 	}
@@ -2286,16 +2370,7 @@ func (this *ActivityCoAntroller) LabelTypeListV5() {
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
 		return
 	}
-	//判断客户规模是否属于可见范围的活动
-	//companyProduct, err := models.GetCompanyProductDetail(user.CompanyId, 2)
-	//if err != nil && err.Error() != utils.ErrNoRow() {
-	//	br.Msg = "获取信息失败"
-	//	br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
-	//	return
-	//}
-	//isMaker := user.IsMaker
 
-	//var sqlExport string
 	resp := new(models.ActivityTypeListHomeResp)
 	for k, v := range list {
 		if len(mapActivity[v.ActivityTypeId]) > 0 {
@@ -2336,12 +2411,12 @@ func (this *ActivityCoAntroller) LabelTypeListV5() {
 		br.ErrMsg = "获取活动【新】标签Map失败, Err: " + e.Error()
 		return
 	}
-	for k, v := range list {
-		if v.ActivityTypeId == 1 {
-			for k2 := range list[k].List {
-				list[k].List[k2].IsNew = newLabelMap[list[k].List[k2].ActivityId]
-			}
+	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
@@ -3729,7 +3804,6 @@ func (this *ActivityCoAntroller) OverActivityList() {
 	isPower, _ := this.GetInt("IsPower")
 	chartPermissionIds := this.GetString("ChartPermissionIds")
 	whichDay := this.GetString("WhichDay")
-	fmt.Println("whichDay:", whichDay)
 	typeName := this.GetString("TypeName")
 
 	//入参为 undefined 时的处理
@@ -3748,54 +3822,13 @@ func (this *ActivityCoAntroller) OverActivityList() {
 		br.Data = resp
 		return
 	}
-	userType, permissionStr, err := services.GetUserType(user.CompanyId)
-	if err != nil {
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取失败,Err:" + err.Error()
-		return
-	}
-	//var startSize, pageSize int
-	//pageSize = 24
 	var condition string
+	var conditionSpecialinit string
 	var conditionSpecial string
 	var sortTime string
-	//var conditionStatus string
 	var pars []interface{}
-	//活动可见限制
-	var sqlExport string
-
-	slicePer := strings.Split(permissionStr, ",")
-	var permissionSqlStr string
-	for _, v := range slicePer {
-		if userType == 1 {
-			//if v != "研选" {
-			if !strings.Contains(v, "研选") {
-				permissionSqlStr += "'" + v + "',"
-			}
-		} else {
-			permissionSqlStr += "'" + v + "',"
-		}
-	}
-	permissionSqlStr = strings.TrimRight(permissionSqlStr, ",")
-	permissionSqlStr = strings.Replace(permissionSqlStr, "(主观)", "", -1)
-	permissionSqlStr = strings.Replace(permissionSqlStr, "(客观)", "", -1)
-	permissionSqlStr = ` AND art.chart_permission_name  IN (` + permissionSqlStr + `)`
-	sqlExport = ` AND (art.customer_type_ids LIKE '%` + strconv.Itoa(userType) + `%' `
-	if userType == 2 {
-		sqlExport += ` OR  art.customer_type_ids LIKE '%3%' `
-	}
-	if (userType == 2 || userType == 3) && strings.Contains(permissionStr, "专家") {
-		sqlExport += ` OR  art.customer_type_ids LIKE '%4%' `
-	}
-	sqlExport += `) `
-
 	//已结束的活动
-	var conditionOr string
-	conditionOr = ""
 	condition = ` AND art.publish_status = 1  AND art.label != ''  AND art.active_state = 3 `
-	if isPower == 1 {
-		condition += permissionSqlStr + sqlExport + conditionOr
-	}
 	if whichDay != "" {
 		var startDate string
 		var endDate string
@@ -3824,23 +3857,31 @@ func (this *ActivityCoAntroller) OverActivityList() {
 		condition += ` AND art.activity_time >= ` + "'" + startDate + " 00:00:00'"
 		condition += ` AND art.activity_time <= ` + "'" + endDate + " 23:59:59'"
 
-		conditionSpecial += ` AND art.activity_time >= ` + "'" + startDate + " 00:00:00'"
-		conditionSpecial += ` AND art.activity_time <= ` + "'" + endDate + " 23:59:59'"
+		conditionSpecialinit += ` AND art.activity_time >= ` + "'" + startDate + " 00:00:00'"
+		conditionSpecialinit += ` AND art.activity_time <= ` + "'" + endDate + " 23:59:59'"
 
 	}
 	if len(chartPermissionIds) > 0 {
 		condition += ` AND art.chart_permission_id  IN (` + chartPermissionIds + `)`
 	}
 
-	conditionActivity, err := services.GetActivityonditionList(user, typeName, chartPermissionIds, whichDay, "3", "", 0, 0, "", 0, 1)
+	// 如果是C类电话会就不展示内容,且合并到分析师电话会
+	if typeName == "1" || typeName == "2" {
+		if typeName == strconv.Itoa(utils.ANALYST_TELL_ACTIVITY_TYPE_ID) {
+			condition += ` AND art.publish_status = 1  AND art.label != ''  AND art.activity_type_id IN (` + typeName + "," + strconv.Itoa(utils.C_CLASS_ACTIVITY_TYPE_ID) + `)`
+		} else {
+			condition += ` AND art.publish_status = 1  AND art.label != ''  AND art.activity_type_id IN (` + typeName + `)`
+		}
+		conditionSpecialinit += ` AND  art.activity_id = 0 `
+	}
+
+	conditionActivity, err := services.ActivityConditioninitSql(user, condition, isPower)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取活动权限数据失败,Err:" + err.Error()
 		return
 	}
-	//已结束的活动
 	sortTime = ` activity_time DESC `
-
 	//如果是永续的就按照普通的权限逻辑来查,如果不是就按照升级的逻辑来查
 
 	companyDetail, err := models.GetCompanyDetailByIdGroupTrip(user.CompanyId)
@@ -3862,7 +3903,7 @@ func (this *ActivityCoAntroller) OverActivityList() {
 	conditionSpecial += ` AND art.days >0  AND art.publish_status =1   AND art.is_offline = 0  `
 	conditionSpecial += ` AND art.activity_time_end <  ` + "'" + time.Now().Format(utils.FormatDateTime) + "'"
 	condition += conditionActivity
-	list, err := models.GetActivityLabelListAllNoLimit(condition, sortTime, pars, conditionSpecial)
+	list, err := models.GetActivityLabelListAllNoLimit(condition, sortTime, pars, conditionSpecialinit+conditionSpecial)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
@@ -3882,18 +3923,111 @@ func (this *ActivityCoAntroller) OverActivityList() {
 		resp.List = append(resp.List, v)
 		mapKeyWord[keyWord] = keyWord
 	}
+	if len(list) == 0 {
+		resp.List = make([]*models.CygxActivityLabelList, 0)
+	}
 	//添加更多主题访问记录
-	item := new(models.CygxPageHistoryRecord)
-	item.UserId = user.UserId
-	item.CreateTime = time.Now()
-	item.Mobile = user.Mobile
-	item.Email = user.Email
-	item.CompanyId = user.CompanyId
-	item.CompanyName = user.CompanyName
-	item.PageType = "OverActivity"
-	go models.AddCygxPageHistoryRecord(item)
+	//item := new(models.CygxPageHistoryRecord)
+	//item.UserId = user.UserId
+	//item.CreateTime = time.Now()
+	//item.Mobile = user.Mobile
+	//item.Email = user.Email
+	//item.CompanyId = user.CompanyId
+	//item.CompanyName = user.CompanyName
+	//item.PageType = "OverActivity"
+	//go models.AddCygxPageHistoryRecord(item)
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// @Title 活动报名之前的校验(权限、时间、点数、邮箱)
+// @Description 活动报名之前的校验(权限、时间、点数、邮箱)接口
+// @Param	request	body models.ActivityIdRep true "type json string"
+// @Success Ret=200 {object} models.SignupStatus
+// @router /check [post]
+func (this *ActivityCoAntroller) Check() {
+	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.ActivityIdRep
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	activityId := req.ActivityId
+	activityInfo, errInfo := models.GetAddActivityInfoById(activityId)
+	if activityInfo == nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "活动ID错误,不存在activityId:" + strconv.Itoa(activityId)
+		return
+	}
+	if errInfo != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "操作失败,Err:" + errInfo.Error()
+		return
+	}
+	//这里的文案顺序提示 权限>时间>研选扣点>邮箱绑定。
+	resp := new(models.ActivityCheck)
+	hasPermission := 0
+	havePower, isResearchSpecial, err := services.GetActivityDetailUserPower(user, activityInfo)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "校验用户权限失败,Err:" + err.Error()
+		return
+	}
+	resp.IsResearchSpecial = isResearchSpecial
+	if havePower {
+		hasPermission = 1
+		resp.CheckPermission = true
+		resp.HasPermission = hasPermission
+	} else {
+		hasPermission, sellerName, sellerMobile, popupMsg, err := services.GetUserHasPermissionActivity(user, activityInfo)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "判断是否已申请过试用失败,Err:" + err.Error()
+			return
+		}
+		resp.PopupMsg = popupMsg
+		resp.HasPermission = hasPermission
+		resp.SellerName = sellerName
+		resp.SellerMobile = sellerMobile
+	}
+	if resp.CheckPermission {
+		//如果权限通过了校验,那么就来校验时间
+		resp.CheckTime, resp.PopupMsg = services.CheckSiginupDeadline(activityInfo)
+	}
+	if resp.CheckTime {
+		// 如果时间通过校验就校验点数
+		resp.CheckPoints, resp.PopupMsg, resp.CompanyPoints, resp.ActivityPoints, err = services.CheckActivityPoints(activityInfo, user)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "CheckActivityPoints,Err:" + err.Error()
+			return
+		}
+	}
+
+	if resp.CheckPoints {
+		//如果通过点数的校验,就来校验邮箱
+		resp.CheckEmail, resp.PopupMsg = services.CheckActivityUserEmail(activityInfo, user)
+	}
+	// 判断是否属于研选类型的活动
+	if strings.Contains(activityInfo.ChartPermissionName, utils.CHART_PERMISSION_NAME_YANXUAN) {
+		resp.IsResearch = true
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Data = resp
+}

+ 15 - 0
controllers/activity_special.go

@@ -269,6 +269,21 @@ func (this *ActivitySpecialCoAntroller) SpecialTripAdd() {
 				if sellerItem != nil {
 					item.SellerName = sellerItem.RealName
 				}
+				if user.OutboundMobile != "" {
+					item.OutboundMobile = user.OutboundMobile
+					if user.OutboundCountryCode == "" {
+						item.CountryCode = "86"
+					} else {
+						item.CountryCode = user.OutboundCountryCode
+					}
+				} else {
+					item.OutboundMobile = user.Mobile
+					if user.CountryCode == "" {
+						item.CountryCode = "86"
+					} else {
+						item.CountryCode = user.CountryCode
+					}
+				}
 				err = models.AddCygxActivitySpecialTrip(item)
 				if err != nil {
 					br.Msg = "操作失败"

+ 1 - 1
controllers/banner.go

@@ -31,7 +31,7 @@ func (this *BannerController) List() {
 	resp := new(models.CygxBannerListResp)
 	var condition string
 	var pars []interface{}
-	condition += "	 AND art.status = 1 ORDER BY art. list_type ASC   , art.sort ASC  "
+	condition += " AND art.show_type IN (0,1)	 AND art.status = 1 ORDER BY art.list_type ASC   , art.sort ASC  "
 	list, err := models.GetCygxBannerList(condition, pars, 0, 99999)
 	if err != nil {
 		br.Msg = "获取失败"

+ 7 - 2
controllers/config.go

@@ -48,8 +48,13 @@ func (this *ConfigController) BrowseHistoryList() {
 		item.KeyWord = v.Title
 		resp.List = append(resp.List, item)
 	}
-
-	hotList, err := models.GetSearchKeyWordTop()
+	var condition string
+	var pars []interface{}
+	currentTime := time.Now()
+	starTime := currentTime.AddDate(0, 0, -8).Format("2006-01-02") + " 00:00:00"
+	endTime := currentTime.AddDate(0, 0, -1).Format("2006-01-02") + " 23:59:59"
+	condition += ` AND create_time < ` + "'" + endTime + "'" + `AND create_time > ` + "'" + starTime + "'"
+	hotList, err := models.GetSearchKeyWordTop(condition, pars)
 	if err != nil {
 		br.Msg = "获取信息失败"
 		br.ErrMsg = "获取用户信息失败,Err:" + err.Error()

+ 221 - 22
controllers/home.go

@@ -682,8 +682,13 @@ func (this *HomeController) NewList() {
 		br.ErrMsg = "GetCountCompanyProductCompanyId,Err:" + err.Error()
 		return
 	}
-	var articleTypes, activityTypes, industries, subjectNames string
 
+	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)
 	if tagIds != "" {
 		tags := strings.Split(tagIds, ",")
 		for _, tagIdStr := range tags {
@@ -699,43 +704,196 @@ func (this *HomeController) NewList() {
 				br.ErrMsg = "GetCygxTagByTagId,Err:" + err.Error()
 				return
 			}
-			activityTypes += tagInfo.ActivityTypes + ","
-			articleTypes += tagInfo.ArticleTypes + ","
-			industries += tagInfo.Industries + ","
-			subjectNames += tagInfo.SubjectNames + ","
+			// 只有AB或CD的情况
+			if (tagInfo.ActivityTypes == "" && tagInfo.ArticleTypes == "") || (tagInfo.Industries == "" && tagInfo.SubjectNames == "") {
+				if tagInfo.ActivityTypes != "" {
+					activityTypes += tagInfo.ActivityTypes + ","
+				}
+				if tagInfo.ArticleTypes != "" {
+					articleTypes += tagInfo.ArticleTypes + ","
+				}
+				if tagInfo.Industries != "" {
+					industries += tagInfo.Industries + ","
+				}
+				if tagInfo.SubjectNames != "" {
+					subjectNames += tagInfo.SubjectNames + ","
+				}
+			} else {
+				// ABCD都有的情况
+				// 每一个tag都单独处理
+				var articleType, activityType, industry, subjectName string
+
+				if tagInfo.ActivityTypes != "" {
+					activityType = tagInfo.ActivityTypes
+				}
+				if tagInfo.ArticleTypes != "" {
+					articleType = tagInfo.ArticleTypes
+				}
+				if tagInfo.Industries != "" {
+					industry = tagInfo.Industries
+				}
+				if tagInfo.SubjectNames != "" {
+					subjectName = tagInfo.SubjectNames
+				}
+				articleTypeCond := ``
+				var articleTypeStr string
+				if articleType != "" {
+					articleTypeSlice := strings.Split(articleType, ",")
+					newArticleTypeSlice := make([]string,0)
+					for _, s := range articleTypeSlice {
+						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 ) ) `
+				}
+				activityTypesCond := ``
+				if activityType != "" {
+					activityTypeSlice := strings.Split(activityType, ",")
+					newActivityTypeSlice := make([]string,0)
+					for _, s := range activityTypeSlice {
+						newActivityTypeSlice = append(newActivityTypeSlice, "'"+ s + "'")
+					}
+					activityTypeStr := strings.Join(newActivityTypeSlice, ",")
+					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)
+					for _, s := range industrieSlice {
+						newIndustrieSlice = append(newIndustrieSlice, "'"+ s + "'")
+					}
+					industryStr = strings.Join(newIndustrieSlice, ",")
+					industryStr = strings.TrimRight(industryStr, ",")
+					industriesCond += ` AND im.industry_name In (`+ industryStr +`) `
+				}
+				subjectNamesCond := ``
+				var subjectNameStr string
+				if subjectName != "" {
+					subjectNameSlice := strings.Split(subjectName, ",")
+					newSubjectNameSlice := make([]string,0)
+					for _, s := range subjectNameSlice {
+						newSubjectNameSlice = append(newSubjectNameSlice, "'"+ s + "'")
+					}
+					subjectNameStr = strings.Join(newSubjectNameSlice, ",")
+					subjectNameStr = strings.TrimRight(subjectNameStr, ",")
+					subjectNamesCond += ` AND cis.subject_name In (`+ subjectNameStr +`) `
+				}
+				articleTypeCondSlice = append(articleTypeCondSlice, articleTypeCond)
+				activityTypesCondSlice = append(activityTypesCondSlice, activityTypesCond)
+				industriesCondSlice = append(industriesCondSlice, industryStr)
+				subjectNamesSlice = append(subjectNamesSlice, subjectNameStr)
+				articleTypeSlice = append(articleTypeSlice, articleType)
+			}
+
 		}
 	}
-	activityTypes = strings.TrimRight(activityTypes,",")
+
+	// 先拿abdc都有的tag取合集的ids。。。
+	soloTagArticleIds, soloTagActivityIds, soloMmIds, err := models.GetCygxCygxArticleListByConditionSoloTag(articleTypeCondSlice, activityTypesCondSlice, industriesCondSlice, subjectNamesSlice, articleTypeSlice)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取活动权限数据失败,Err:" + err.Error()
+		return
+	}
+
 	articleTypes = strings.TrimRight(articleTypes,",")
+	activityTypes = strings.TrimRight(activityTypes,",")
 	industries = strings.TrimRight(industries,",")
 	subjectNames = strings.TrimRight(subjectNames,",")
 
 	articleTypesCond := ``
+	var articleTypeStr string
 	if articleTypes != "" {
-		articleTypesCond += ` AND sub_category_name In (`+ activityTypes +`) `
+		articleTypeSlice := strings.Split(articleTypes, ",")
+		newArticleTypeSlice := make([]string,0)
+		for _, s := range articleTypeSlice {
+			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 ) ) `
 	}
 	activityTypesCond := ``
 	if activityTypes != "" {
-		activityTypesCond += ` AND sub_category_name In (`+ activityTypes +`) `
+		activityTypeSlice := strings.Split(activityTypes, ",")
+		newActivityTypeSlice := make([]string,0)
+		for _, s := range activityTypeSlice {
+			newActivityTypeSlice = append(newActivityTypeSlice, "'"+ s + "'")
+		}
+		activityTypeStr := strings.Join(newActivityTypeSlice, ",")
+		activityTypeStr = strings.TrimRight(activityTypeStr,",")
+		activityTypesCond += ` AND act.activity_type_name In (`+ activityTypeStr +`) `
 	}
 	industriesCond := ``
+	var industryStr string
 	if industries != "" {
-		industriesCond += ` AND sub_category_name In (`+ activityTypes +`) `
+		industrieSlice := strings.Split(industries, ",")
+		newIndustrieSlice := make([]string,0)
+		for _, s := range industrieSlice {
+			newIndustrieSlice = append(newIndustrieSlice, "'"+ s + "'")
+		}
+		industryStr = strings.Join(newIndustrieSlice, ",")
+		industryStr = strings.TrimRight(industryStr, ",")
+		industriesCond += ` AND im.industry_name In (`+ industryStr +`) `
 	}
 	subjectNamesCond := ``
+	var subjectNameStr string
 	if subjectNames != "" {
-		subjectNamesCond += ` AND sub_category_name In (`+ activityTypes +`) `
+		subjectNameSlice := strings.Split(subjectNames, ",")
+		newSubjectNameSlice := make([]string,0)
+		for _, s := range subjectNameSlice {
+			newSubjectNameSlice = append(newSubjectNameSlice, "'"+ s + "'")
+		}
+		subjectNameStr = strings.Join(newSubjectNameSlice, ",")
+		subjectNameStr = strings.TrimRight(subjectNameStr, ",")
+		subjectNamesCond += ` AND cis.subject_name In (`+ subjectNameStr +`) `
 	}
 
-	//condition += " AND source = 'article' "
+	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 = "获取失败"
+			br.ErrMsg = "获取单个标签ids失败,Err:" + err.Error()
+			return
+		}
+	}
+
+	if soloTagArticleIds != "" {
+		if tagArticleIds != "" {
+			tagArticleIds += "," + soloTagArticleIds
+		} else {
+			tagArticleIds = soloTagArticleIds
+		}
+	}
+	if soloTagActivityIds != "" {
+		if tagActivityIds != "" {
+			tagActivityIds += "," + soloTagActivityIds
+		} else {
+			tagActivityIds = soloTagActivityIds
+		}
+	}
+	if soloMmIds != "" {
+		if mmIds != "" {
+			mmIds += "," + soloMmIds
+		} else {
+			mmIds = soloMmIds
+		}
+	}
+
+	//fmt.Println("condition:",condition)
+
 	//查询近一个月的数据
 	conditionInit = " AND publish_date  >   '" + time.Now().AddDate(0, 0, -30).Format(utils.FormatDateTime) + "'"
+	//conditionInit += `  AND source IN ('newchart')`
 	if user.CompanyId <= 1 || totalRai == 0 {
-		condition += " AND source IN ('roadshow','article','activityvideo','activityvoice') " + conditionInit
-		if user.Mobile == "" && user.Email == "" {
-			startSize = 0
-			pageSize = 4
-		}
+		condition += " AND source IN ('roadshow','article') "
+		startSize = 0
+		pageSize = 4
 	} else {
 		condition += ` AND source NOT IN ('activity','activityspecial','newchart') ` + conditionInit
 		conditionActivity, err := services.GetActivityonditionList(user, "", "", "", "1,2,3", "", 0, 0, "", 0, 1)
@@ -748,7 +906,11 @@ func (this *HomeController) NewList() {
 		var conditionOrder string
 		conditionOrder = ` ORDER BY art.activity_time DESC ,  art.active_state ASC   `
 		conditionActivity += conditionOrder
-		listActivity, err := models.GetActivityListHomeNew(conditionActivity, 0, 200)
+		actPageSize := 200
+		if tagIds != "" {
+			actPageSize = 2000
+		}
+		listActivity, err := models.GetActivityListHomeNew(conditionActivity, 0, actPageSize)
 		if err != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取可见活动数据失败,Err:" + err.Error()
@@ -760,10 +922,7 @@ func (this *HomeController) NewList() {
 			activityIds = append(activityIds, v.ActivityId)
 		}
 		lenActivityIds := len(activityIds)
-		if lenActivityIds > 0 {
-			condition += ` OR ( source = 'activity' AND source_id IN (` + utils.GetOrmInReplace(lenActivityIds) + `) ` + conditionInit + ` )    `
-			pars = append(pars, activityIds)
-		}
+
 
 		listActivitySpecial, _, err := services.GetActivitySpecialList(user, 1, 200, "")
 		if err != nil {
@@ -777,11 +936,51 @@ func (this *HomeController) NewList() {
 			activityspecialIds = append(activityspecialIds, v.ActivityId)
 		}
 		lenActivityspecialIds := len(activityspecialIds)
-		if lenActivityspecialIds > 0 {
+
+
+		if tagIds != "" {
+			if tagArticleIds != "" {
+				condition = ` AND ((source = 'article' AND source_id IN (` + tagArticleIds + `) ) `
+				if 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) + `) )) `
+					pars = append(pars, activityIds)
+				} else {
+					// 无可见活动
+					condition += ` OR (source = 'activity' AND source_id IN (0))) `
+				}
+			} else if tagActivityIds != "" {
+				condition = ` AND ((source = 'article' AND source_id IN (0))  `
+				if 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) + `))) `
+					pars = append(pars, activityIds)
+				} else {
+					// 无可见活动
+					condition += ` OR (source = 'activity' AND source_id IN (0))) `
+				}
+			} else if mmIds != "" {
+				condition = ` AND ( source = 'meetingreviewchapt' AND source_id IN (` + mmIds + `) )   `
+			} else {
+				condition += ` AND ((source = 'article' AND source_id IN (0)) OR (source = 'activity' AND source_id IN (0))) `
+			}
+		}
+
+		if lenActivityIds > 0 && tagIds == "" {
+			condition += ` OR ( source = 'activity' AND source_id IN (` + utils.GetOrmInReplace(lenActivityIds) + `) ` + conditionInit + ` )    `
+			pars = append(pars, activityIds)
+		}
+
+		if lenActivityspecialIds > 0  && tagIds == "" {
 			condition += ` OR ( source = 'activityspecial' AND source_id IN (` + utils.GetOrmInReplace(lenActivityspecialIds) + `) ` + conditionInit + ` )   `
 			pars = append(pars, activityspecialIds)
 		}
 	}
+	//fmt.Println("condition:",condition)
 	total, err := models.GetResourceDataCount(condition, pars)
 	if err != nil {
 		br.Msg = "获取失败"

+ 7 - 1
controllers/htgj.go

@@ -200,7 +200,13 @@ func (this *BaseHtgjController) BrowseHistoryList() {
 		resp.List = append(resp.List, item)
 	}
 
-	hotList, err := models.GetSearchKeyWordTop()
+	var condition string
+	var pars []interface{}
+	currentTime := time.Now()
+	starTime := currentTime.AddDate(0, 0, -8).Format("2006-01-02") + " 00:00:00"
+	endTime := currentTime.AddDate(0, 0, -1).Format("2006-01-02") + " 23:59:59"
+	condition += ` AND create_time < ` + "'" + endTime + "'" + `AND create_time > ` + "'" + starTime + "'"
+	hotList, err := models.GetSearchKeyWordTop(condition, pars)
 	if err != nil {
 		br.Msg = "获取信息失败"
 		br.ErrMsg = "获取用户信息失败,Err:" + err.Error()

+ 1 - 0
controllers/report.go

@@ -1420,6 +1420,7 @@ func (this *ReportController) IsShow() {
 	//resp.YanXuan_Explain = true
 	resp.IsShowFreeButton = IsShowFreeButton
 	resp.IsBelongRai = services.GetBelongingRai(user.Mobile)
+	resp.IsShowResearchPoints = true
 	//mobile := user.Mobile
 	//if mobile == "" {
 	//	br.Ret = 200

+ 1 - 1
controllers/tactics.go

@@ -65,7 +65,7 @@ func (this *TacticsController) List() {
 	var total int
 	var err error
 	if categoryId == utils.ACTEGORY_ID_AI_QY {
-		list, total, err = services.GetAiQianYanArtilceList(0, pageSize)
+		list, total, err = services.GetAiQianYanArtilceList(startSize, pageSize)
 	} else {
 		list, total, err = models.GetReportAndproductIndustrylList(categoryId, startSize, pageSize)
 	}

+ 17 - 0
controllers/tag.go

@@ -31,6 +31,23 @@ func (this *TagController) TagCustomizeList() {
 	}
 
 	var condition string
+
+	hasPermission, err := services.GetUserHasPermissionSimple(sysUser)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "判断是否已申请过试用失败,Err:" + err.Error()
+		return
+	}
+	if hasPermission > 1 {
+		list := make([]*models.CygxTagList, 0)
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		br.Data = list
+		return
+	}
+
+
 	list, err := models.GetCygxTagList(condition)
 	if err != nil {
 		br.Msg = "获取标签失败"

+ 47 - 0
controllers/user.go

@@ -1835,3 +1835,50 @@ func (this *UserController) ApplyDetail() {
 	br.Success = true
 	br.Data = resp
 }
+
+// @Title 更改绑定邮箱
+// @Description 更改绑定邮箱接口
+// @Param	request	body models.Headimgurl true "type json string"
+// @Success 200 {object} models.ArticleDetailFileLink
+// @router /email/binding [post]
+func (this *UserController) EmailBinding() {
+	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.UserEmail
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	uid := user.UserId
+	if user.Email != "" {
+		br.Msg = "邮箱号已存在,请勿重复绑定"
+		br.ErrMsg = "邮箱格式错误,请重新输入 Email:" + user.Email
+		return
+	}
+	email := req.Email
+	if !utils.ValidateEmailFormatat(req.Email) {
+		br.Msg = "邮箱格式错误,请重新输入"
+		br.ErrMsg = "邮箱格式错误,请重新输入"
+		return
+	}
+	err = models.UpdateUserEmail(email, uid)
+	if err != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "头像信息不能为空"
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 47 - 4
models/activity.go

@@ -70,6 +70,22 @@ type CygxActivity struct {
 	JmcjActivityId          string    `description:"进门财经的活动ID"`
 }
 
+type ActivityCheck struct {
+	CheckPermission   bool   `description:"权限是否通过校验"`
+	HasPermission     int    `description:"操作方式,1:有该行业权限,正常展示,2:无该行业权限,3:潜在客户,未提交过申请,4:潜在客户,已提交过申请"`
+	PopupMsg          string `description:"权限弹窗信息"`
+	SellerMobile      string `description:"销售电话"`
+	SellerName        string `description:"销售姓名"`
+	Mobile            string `description:"手机号"`
+	IsResearch        bool   `description:"是否属于研选"`
+	IsResearchSpecial bool   `description:"是否属于特殊的研选"`
+	CheckTime         bool   `description:"时间是否通过校验"`
+	CheckEmail        bool   `description:"邮箱是否通过校验"`
+	CheckPoints       bool   `description:"扣点是否通过校验"`
+	CompanyPoints     string `description:"公司剩余点数"`
+	ActivityPoints    string `description:"本场活动要扣除的点数"`
+}
+
 type Activity struct {
 	ActivityTypeId   int    `description:"活动类型id"`
 	ActivityTypeName string `description:"活动名称"`
@@ -126,6 +142,7 @@ 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:"行业名称"`
@@ -210,6 +227,10 @@ type ActivityDetail struct {
 	IsShowSigninButton      bool                       `description:"是否展示签到码按钮"`
 	IsShowSignUpDetail      bool                       `description:"是否展示报名详情按钮"`
 	SigninImg               string                     `description:"签到码图片"`
+	IsNeedEmail             int                        `description:"是否需要提供邮箱 1是,0否"`
+	SiginupDeadline         string                     `description:"报名截止时间"`
+	IsExternalLabel         bool                       `description:"是否为外部资源"`
+	IsResearchPoints        bool                       `description:"是否为研选扣点"`
 }
 type ListArticleActivity struct {
 	Title   string `description:"文章标题"`
@@ -237,6 +258,14 @@ func GetAddActivityInfoById(ActivityId int) (item *ActivityDetail, err error) {
 	return
 }
 
+// 通过纪要ID获取活动详情
+func GetAddActivityInfoByActivityId(ActivityId int) (item *ActivityDetail, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_activity  WHERE activity_id=?  `
+	err = o.Raw(sql, ActivityId).QueryRow(&item)
+	return
+}
+
 // 通过活动名称获取活动详情
 func GetAddActivityInfoByTitle(title, startDate, endDate string) (item *ActivityDetail, err error) {
 	o := orm.NewOrm()
@@ -301,6 +330,7 @@ type GetCygxActivityListRep struct {
 	IsJump                 bool   `description:"是否跳转"`
 	IndustrialManagementId int    `description:"产业ID"`
 	IndustryNewLabel       bool   `description:"产业是否新标签"`
+	IsShowResearchPoints   bool   `description:"是否展示研选扣点搜索"`
 }
 
 // 列表
@@ -432,7 +462,10 @@ func GetScheduleAndSpecilList(condition string, pars []interface{}, conditionSpe
 			art.is_limit_people,
 			1 AS source_type,
 			art.activity_time, 
-			art.city
+			art.city,
+			art.is_external_label,
+			art.siginup_deadline,
+			art.is_research_points
 		FROM
 			cygx_activity AS art
 			INNER JOIN cygx_my_schedule AS my ON my.activity_id = art.activity_id
@@ -464,6 +497,9 @@ func GetScheduleAndSpecilList(condition string, pars []interface{}, conditionSpe
 			"",
 			2 AS source_type,
 			art.activity_time,
+			"",
+			"",
+			"",
 			""
 		FROM
 			cygx_activity_special AS art
@@ -744,6 +780,7 @@ type CygxActivityLabelList struct {
 	IsNew             bool   `description:"是否为新:活动存在关联的的产业所关联的报告均在3个月内/无报告则标记新"`
 	YidongActivityId  int    `description:"易董活动ID"`
 	IsExternalLabel   bool   `description:"是否为外部资源"`
+	IsResearchPoints  bool   `description:"是否为研选扣点"`
 	TripStatus        int    `description:"行程进行状态 1:预报名,2:确定行程"`
 	City              string `description:"城市"`
 	Days              int    `description:"天数"`
@@ -753,7 +790,7 @@ type CygxActivityLabelList struct {
 // 主题列表
 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
+	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
 		FROM cygx_activity as art WHERE 1= 1 `
 	if condition != "" {
 		sql += condition
@@ -1081,7 +1118,10 @@ func GetActivitySpecialSearcheList(condition string, pars []interface{}, conditi
 			art.city,
 			1 AS source_type,
 			art.is_yidong_conduct,
-			art.activity_time 
+			art.activity_time,
+			art.is_external_label,
+			art.siginup_deadline,
+			art.is_research_points
 		FROM
 			cygx_activity AS art
 			INNER JOIN cygx_activity_type AS t ON t.activity_type_id = art.activity_type_id
@@ -1113,7 +1153,10 @@ func GetActivitySpecialSearcheList(condition string, pars []interface{}, conditi
 			"",
 			2 AS source_type,
 			"",
-			art.activity_time 
+			art.activity_time,
+			"",
+			"",
+			""
 		FROM
 			cygx_activity_special AS art
 		WHERE

+ 179 - 0
models/activity_points_bill.go

@@ -0,0 +1,179 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// CygxActivityPointsBill 活动扣点流水表
+type CygxActivityPointsBill struct {
+	Id                int       `gorm:"column:id;primary_key;AUTO_INCREMENT" json:""`
+	UserId            int       `gorm:"column:user_id;NOT NULL" json:""`                     // 用户ID
+	ActivityId        int       `gorm:"column:activity_id;default:0;NOT NULL" json:""`       // 活动ID
+	CreateTime        time.Time `gorm:"column:create_time" json:""`                          // 创建时间
+	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:""`                            // 用户实际名称
+	AdminId           int       `gorm:"column:admin_id;NOT NULL" json:""`                    // 管理员、销售ID
+	Source            int       `gorm:"column:source;default:1;NOT NULL" json:""`            // 来源,1客户端,2后台添加, 3开发人员手动添加、4定时任务
+	BillDetailed      float64   `gorm:"column:bill_detailed;default:0;NOT NULL" json:""`     // 流水明细,判断是进账还是出账
+	RegisterPlatform  int       `gorm:"column:register_platform;default:0;NOT NULL" json:""` // 来源 1小程序,2:网页
+	ChartPermissionId int       `gorm:"column:chart_permission_id;default:0" json:""`        // 表chart_permission中id
+	DoType            int       `gorm:"column:do_type;default:1;NOT NULL" json:""`           // 操作方式,1减少,2增加
+	Content           string    `gorm:"column:content" json:""`                              // 内容说明
+	Points            float64   `gorm:"column:points;default:0;NOT NULL" json:""`            // 公司剩余点数
+}
+
+// 获取列表
+func GetCygxActivityPointsBillList(condition string, pars []interface{}) (list []*CygxActivityPointsBill, err error) {
+	sql := `SELECT * FROM cygx_activity_points_bill  WHERE  1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	_, err = orm.NewOrm().Raw(sql, pars).QueryRows(&list)
+	return
+}
+
+// CompanyTryOutDayListResp 客户累计试用天数
+type CygxActivityPointsBillListResp struct {
+	List []*CygxActivityPointsBillResp
+}
+
+type CygxActivityPointsBillResp struct {
+	Id           int     `gorm:"column:id;primary_key;AUTO_INCREMENT"`
+	Content      string  `gorm:"column:content" `                                 // 内容说明
+	Points       float64 `gorm:"column:points;default:0;NOT NULL" `               // 公司剩余点数
+	CreateTime   string  `gorm:"column:create_time" `                             // 创建时间
+	CompanyId    int     `gorm:"column:company_id;default:0" `                    // 公司ID
+	CompanyName  string  `gorm:"column:company_name" `                            // 公司名称
+	RealName     string  `gorm:"column:real_name"`                                // 用户实际名称
+	BillDetailed float64 `gorm:"column:bill_detailed;default:0;NOT NULL" json:""` // 流水明细,判断是进账还是出账
+}
+
+// 获取数量
+func GetCygxActivityPointsBillCount(condition string, pars []interface{}) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_activity_points_bill as art WHERE 1= 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	o := orm.NewOrm()
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+// 通过查询条件获取详情
+func GetCygxActivityPointsBillDetailByCondition(condition string, pars []interface{}) (item *CygxActivityPointsBill, err error) {
+	if condition == "" {
+		return
+	}
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_activity_points_bill  WHERE 1 = 1  ` + condition
+	err = o.Raw(sql, pars).QueryRow(&item)
+	return
+}
+
+// AddCygxActivityPointsBillMulti 批量添加
+func AddCygxActivityPointsBillMulti(items []*CygxActivityPointsBill, itemsUpdate []*CygxActivityPointsCompany) (err error) {
+	o, err := orm.NewOrm().Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err == nil {
+			o.Commit()
+		} else {
+			o.Rollback()
+		}
+	}()
+	if len(items) > 0 {
+		//批量添加流水信息
+		_, err = o.InsertMulti(len(items), items)
+	}
+	//批量修改公司剩余点数
+	p, err := o.Raw("UPDATE cygx_activity_points_company SET points = ?, modify_time = ? WHERE company_id = ?").Prepare()
+	if err != nil {
+		return
+	}
+	defer func() {
+		_ = p.Close() // 别忘记关闭 statement
+	}()
+	for _, v := range itemsUpdate {
+		_, err = p.Exec(v.Points, v.ModifyTime, v.CompanyId)
+		if err != nil {
+			return
+		}
+	}
+	return
+}
+
+// AddCygxActivityPointsBillAndCompanyMulti 批量添加
+func AddCygxActivityPointsBillAndCompanyMulti(items []*CygxActivityPointsBill, itemsCompany []*CygxActivityPointsCompany) (err error) {
+	o, err := orm.NewOrm().Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err == nil {
+			o.Commit()
+		} else {
+			o.Rollback()
+		}
+	}()
+	if len(items) > 0 {
+		//批量添加流水信息
+		_, err = o.InsertMulti(len(items), items)
+	}
+	if len(itemsCompany) > 0 {
+		//批量添加流水信息
+		_, err = o.InsertMulti(len(itemsCompany), itemsCompany)
+	}
+	return
+}
+
+// UpdateCygxActivityPointsBillMulti 批量修改
+func UpdateCygxActivityPointsBillMulti(items []*CygxActivityPointsBill, itemsUpdate []*CygxActivityPointsCompany) (err error) {
+	o, err := orm.NewOrm().Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err == nil {
+			o.Commit()
+		} else {
+			o.Rollback()
+		}
+	}()
+
+	//批量修改公司剩余点数
+	p, err := o.Raw("UPDATE cygx_activity_points_bill SET points = ?, bill_detailed = ? WHERE id = ?").Prepare()
+	if err != nil {
+		return
+	}
+	defer func() {
+		_ = p.Close() // 别忘记关闭 statement
+	}()
+	for _, v := range items {
+		_, err = p.Exec(v.Points, v.BillDetailed, v.Id)
+		if err != nil {
+			return
+		}
+	}
+
+	//批量修改公司剩余点数
+	p, err = o.Raw("UPDATE cygx_activity_points_company SET points = ?, modify_time = ? WHERE company_id = ?").Prepare()
+	if err != nil {
+		return
+	}
+	defer func() {
+		_ = p.Close() // 别忘记关闭 statement
+	}()
+	for _, v := range itemsUpdate {
+		_, err = p.Exec(v.Points, v.ModifyTime, v.CompanyId)
+		if err != nil {
+			return
+		}
+	}
+	return
+}

+ 42 - 0
models/activity_points_company.go

@@ -0,0 +1,42 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxActivityPointsCompany struct {
+	Id          int       `gorm:"column:id;primary_key;AUTO_INCREMENT" json:"id"`
+	CompanyId   int       `gorm:"column:company_id;default:0" json:"company_id"`  // 公司ID
+	CompanyName string    `gorm:"column:company_name" json:"company_name"`        // 公司名称
+	Points      float64   `gorm:"column:points;default:0;NOT NULL" json:"points"` // 公司剩余点数
+	CreateTime  time.Time `gorm:"column:create_time;NOT NULL" json:"create_time"` // 创建时间
+	ModifyTime  time.Time `gorm:"column:modify_time;NOT NULL" json:"modify_time"` // 更新时间
+}
+
+// 获取公司剩余点数
+func GetCompanyPoints(companyId int) (comapnyPointsNum float64, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT points FROM cygx_activity_points_company  WHERE company_id=? `
+	err = o.Raw(sql, companyId).QueryRow(&comapnyPointsNum)
+	return
+}
+
+// 列表
+func GetCygxActivityPointsCompanyList(condition string, pars []interface{}) (items []*CygxActivityPointsCompany, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_activity_points_company as art WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// 获取数量
+func GetCygxActivityPointsCompanyCountByCompanyId(companyId int) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_activity_points_company WHERE company_id=?  `
+	o := orm.NewOrm()
+	err = o.Raw(sqlCount, companyId).QueryRow(&count)
+	return
+}

+ 89 - 0
models/activity_points_set.go

@@ -0,0 +1,89 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type YanXuanActivityPointsRedis struct {
+	UserId           int       `description:"用户ID"`
+	ComapnyId        int       `description:"公司ID"`
+	ActivityId       int       `description:"活动ID"`
+	PublishStatus    int       `description:"发布状态 1已发布,0未发布"`
+	SourceType       int       `description:"1:报名、 2:取消报名、3:活动编辑、4:活动发布,取消发布、5:活动到会。"`
+	AdminId          int       `description:"管理员、销售ID"`
+	Source           int       `description:" 来源,1客户端,2后台添加, 3开发人员手动添加、4定时任务"`
+	RegisterPlatform int       `description:"来源 1小程序,2:网页"`
+	CreateTime       time.Time `description:"创建时间"`
+}
+
+type CygxActivityPointsSet struct {
+	Id               int       `gorm:"column:id;primary_key;AUTO_INCREMENT" json:"id"`
+	ActivityId       int       `gorm:"column:activity_id;NOT NULL" json:"activity_id"`                         // 活动ID
+	PointsObject     int       `gorm:"column:points_object;default:1;NOT NULL" json:"points_object"`           // 扣点对象,1:参会人、2:办会人、3:办会人和参会人
+	CompanyId        int       `gorm:"column:company_id;default:0;NOT NULL" json:"company_id"`                 // 公司ID
+	CompanyName      float64   `gorm:"column:company_name;NOT NULL" json:"company_name"`                       // 公司名称
+	UserPointsNum    float64   `gorm:"column:user_points_num;default:0;NOT NULL" json:"user_points_num"`       // 参会人扣点数量
+	PointsType       int       `gorm:"column:points_type;default:0;NOT NULL" json:"points_type"`               // 扣点形式,1:报名即扣点,2:到会即扣点
+	CompanyPointsNum float64   `gorm:"column:company_points_num;default:0;NOT NULL" json:"company_points_num"` // 办会人扣点数量
+	CreateTime       time.Time `gorm:"column:create_time;NOT NULL" json:"create_time"`                         // 创建时间
+	ModifyTime       time.Time `gorm:"column:modify_time;NOT NULL" json:"modify_time"`                         // 更新时间
+}
+
+type CygxActivityPointsSetRsq struct {
+	ActivityId       int    `gorm:"column:activity_id;NOT NULL" json:"ActivityId"`                        // 活动ID
+	PointsObject     int    `gorm:"column:points_object;default:1;NOT NULL" json:"PointsObject"`          // 扣点对象,1:参会人、2:办会人、3:办会人和参会人
+	CompanyId        int    `gorm:"column:company_id;default:0;NOT NULL" json:"CompanyId"`                // 公司ID
+	CompanyName      string `gorm:"column:company_name;NOT NULL" json:"CompanyName"`                      // 公司名称
+	UserPointsNum    string `gorm:"column:user_points_num;default:0;NOT NULL" json:"UserPointsNum"`       // 参会人扣点数量
+	PointsType       int    `gorm:"column:points_type;default:0;NOT NULL" json:"PointsType"`              // 扣点形式,1:报名即扣点,2:到会即扣点
+	CompanyPointsNum string `gorm:"column:company_points_num;default:0;NOT NULL" json:"CompanyPointsNum"` // 办会人扣点数量
+}
+
+type CygxActivityPointsSetConfigListResp struct {
+	List []*CygxActivityPointsSetConfigResp
+}
+
+type CygxActivityPointsSetConfigResp struct {
+	PointsNum string `gorm:"column:user_points_num;default:0;NOT NULL" json:"PointsNum"` // 扣点数量
+}
+
+// 通过活动ID获取详情
+func GetCygxActivityPointsSetDetail(activityId int) (item *CygxActivityPointsSet, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_activity_points_set  WHERE activity_id=? `
+	err = o.Raw(sql, activityId).QueryRow(&item)
+	return
+}
+
+// 通过活动ID获取详情
+func GetCygxActivityPointsSetUserNum(activityId int) (userPointsNum float64, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT user_points_num FROM cygx_activity_points_set  WHERE activity_id=? `
+	err = o.Raw(sql, activityId).QueryRow(&userPointsNum)
+	return
+}
+
+// 通过互动ID获取数量
+func GetCygxActivityPointsSetCountByActivityId(ActivityId int) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_activity_points_set  WHERE activity_id=?   `
+	o := orm.NewOrm()
+	err = o.Raw(sqlCount, ActivityId).QueryRow(&count)
+	return
+}
+
+// 列表
+func GetCygxActivityPointsSetList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxActivityPointsSet, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_activity_points_set as art WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	if startSize+pageSize == 0 {
+		_, err = o.Raw(sql, pars).QueryRows(&items)
+	} else {
+		sql += ` LIMIT ?,?  `
+		_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	}
+	return
+}

+ 15 - 4
models/activity_video.go

@@ -34,8 +34,8 @@ type CygxActivityVideoReq struct {
 	VideoUrl      string `description:"视频地址"`
 }
 
-//string `orm:"column(label)";description:"主题"`
-//活动详情
+// string `orm:"column(label)";description:"主题"`
+// 活动详情
 type CygxActivityVideoListResp struct {
 	ActivityId    int    `description:"活动ID 等于0新增活动,大于0修改活动"`
 	Id            int    `orm:"column(video_id)";description:"视频id"`
@@ -49,7 +49,7 @@ type CygxActivityVideoListRep struct {
 	List   []*CygxActivityVideoListResp
 }
 
-//列表
+// 列表
 func GetActivityVideoListAll(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxActivityVideoListResp, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT art.*,v.video_id,v.video_name,v.video_url,video_duration FROM cygx_activity as art  INNER JOIN cygx_activity_video AS v ON v.activity_id = art.activity_id   WHERE 1= 1  `
@@ -82,7 +82,7 @@ func GetCygxActivityVideoById(activityId int) (item *CygxActivityVideo, err erro
 	return
 }
 
-//列表
+// 列表
 func GetActivityVideoList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxActivityVideoResp, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT
@@ -97,3 +97,14 @@ FROM
 	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
 	return
 }
+
+// 获取所有活动视频ID
+func GetActivityVideoActivityIds() (activityIds string, err error) {
+	sql := `SELECT
+				GROUP_CONCAT( DISTINCT a.activity_id SEPARATOR ',' ) AS activityids 
+			FROM
+				cygx_activity_video AS a `
+	o := orm.NewOrm()
+	err = o.Raw(sql).QueryRow(&activityIds)
+	return
+}

+ 13 - 2
models/activity_voice.go

@@ -79,7 +79,7 @@ func GetCygxActivityVoiceById(videoId int) (item *CygxActivityVoice, err error)
 	return
 }
 
-//列表
+// 列表
 func GetActivityVoiceListAll(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxActivityVideoListResp, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT art.*  FROM cygx_activity as art  INNER JOIN cygx_activity_voice AS v ON v.activity_id = art.activity_id   WHERE 1= 1  `
@@ -98,7 +98,7 @@ func GetCygxActivityVoiceByActivityId(activityId int) (item *CygxActivityVoice,
 	return
 }
 
-//列表
+// 列表
 func GetActivityVoiceList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxActivityVoiceResp, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT
@@ -113,3 +113,14 @@ FROM
 	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
 	return
 }
+
+// 获取所有活动音频ID
+func GetActivityVoiceActivityIds() (activityIds string, err error) {
+	sql := `SELECT
+				GROUP_CONCAT( DISTINCT a.activity_id SEPARATOR ',' ) AS activityids 
+			FROM
+				cygx_activity_voice AS a `
+	o := orm.NewOrm()
+	err = o.Raw(sql).QueryRow(&activityIds)
+	return
+}

+ 201 - 0
models/article.go

@@ -2,6 +2,7 @@ package models
 
 import (
 	"github.com/beego/beego/v2/client/orm"
+	"strings"
 	"time"
 )
 
@@ -753,3 +754,203 @@ func GetCygxArticleCount(condition string, pars []interface{}) (count int, err e
 	err = o.Raw(sqlCount, pars).QueryRow(&count)
 	return
 }
+
+// 列表
+func GetCygxCygxArticleListByCondition(articleTypesCond, activityTypesCond, industryStr, subjectNameStr, articleTypeStr string) (artIds, actIds, mmIds string, err error) {
+	o := orm.NewOrm()
+	artSql := `SELECT GROUP_CONCAT(DISTINCT art.article_id SEPARATOR ',') AS art_ids FROM cygx_article as art `
+
+	actSql := ` SELECT GROUP_CONCAT(DISTINCT act.activity_id SEPARATOR ',') AS act_ids FROM cygx_activity as act `
+
+	mmSql := ` SELECT GROUP_CONCAT(DISTINCT mmc.id SEPARATOR ',') AS mm_ids FROM cygx_morning_meeting_review_chapter as mmc `
+
+	if industryStr != "" {
+		artSql += ` INNER JOIN cygx_industrial_article_group_management  AS iam ON iam.article_id = art.article_id 
+				INNER JOIN cygx_industrial_management AS im ON im.industrial_management_id=iam.industrial_management_id  `
+		actSql += ` INNER JOIN cygx_industrial_activity_group_management  AS iam ON iam.activity_id = act.activity_id 
+				INNER JOIN cygx_industrial_management AS im ON im.industrial_management_id=iam.industrial_management_id  `
+		mmSql += ` INNER JOIN cygx_morning_meeting_reviews  AS mm ON mmc.meeting_id = mm.id 
+				INNER JOIN cygx_industrial_management AS im ON im.industrial_management_id=mmc.industry_id  `
+	}
+	if subjectNameStr != "" {
+		artSql += ` INNER JOIN cygx_industrial_article_group_subject  AS ias ON ias.article_id = art.article_id 
+				INNER JOIN cygx_industrial_subject AS cis ON cis.industrial_subject_id=ias.industrial_subject_id  `
+		actSql += ` INNER JOIN cygx_industrial_activity_group_subject  AS ias ON ias.activity_id = act.activity_id 
+				INNER JOIN cygx_industrial_subject AS cis ON cis.industrial_subject_id=ias.industrial_subject_id  `
+		mmSql += ` IINNER JOIN cygx_morning_meeting_reviews  AS mm ON mmc.meeting_id = mm.id 
+				INNER JOIN cygx_industrial_subject AS cis ON cis.industrial_subject_id=mmc.industrial_subject_ids  `
+	}
+	artSql += ` WHERE 1=1 `
+	if articleTypesCond != "" || (articleTypesCond == "" && activityTypesCond == "") {
+		if industryStr != "" && subjectNameStr != "" {
+			artSql += articleTypesCond + ` AND (im.industry_name In (` + industryStr + `) OR cis.subject_name In (` + subjectNameStr + `) )`
+		} else if industryStr == "" && subjectNameStr != "" {
+			artSql += articleTypesCond + ` AND  cis.subject_name In (` + subjectNameStr + `) `
+		} else if industryStr != "" && subjectNameStr == "" {
+			artSql += articleTypesCond + ` AND im.industry_name In (` + industryStr + `) `
+		} else {
+			artSql += articleTypesCond
+		}
+		err = o.Raw(artSql).QueryRow(&artIds)
+	}
+
+
+	actSql += ` WHERE 1=1 `
+	if activityTypesCond != "" || (articleTypesCond == "" && activityTypesCond == "") {
+		if industryStr != "" && subjectNameStr != "" {
+			actSql += activityTypesCond + ` AND (im.industry_name In (` + industryStr + `) OR cis.subject_name In (` + subjectNameStr + `) )`
+		} else if industryStr == "" && subjectNameStr != "" {
+			actSql += activityTypesCond + ` AND  cis.subject_name In (` + subjectNameStr + `) `
+		} else if industryStr != "" && subjectNameStr == "" {
+			actSql += activityTypesCond + ` AND im.industry_name In (` + industryStr + `) `
+		} else {
+			actSql += activityTypesCond
+		}
+		err = o.Raw(actSql).QueryRow(&actIds)
+	}
+
+	if strings.Contains(articleTypeStr, "晨会精华") {
+		mmSql += ` WHERE 1=1 `
+		if industryStr != "" && subjectNameStr != "" {
+			mmSql +=  ` AND (im.industry_name In (` + industryStr + `) OR cis.subject_name In (` + subjectNameStr + `) )`
+		} else if industryStr == "" && subjectNameStr != "" {
+			mmSql += ` AND  cis.subject_name In (` + subjectNameStr + `) `
+		} else if industryStr != "" && subjectNameStr == "" {
+			mmSql += ` AND im.industry_name In (` + industryStr + `) `
+		}
+		err = o.Raw(mmSql).QueryRow(&mmIds)
+	}
+
+	return
+}
+
+
+
+// 单个tag时用,取合集
+func GetCygxCygxArticleListByConditionSoloTag(articleTypeCondSlice, activityTypesCondSlice, industriesCondSlice, subjectNamesSlice, articleTypeSlice []string) (artIds, actIds, mmIds string, err error) {
+	o := orm.NewOrm()
+	artSql := `SELECT GROUP_CONCAT(DISTINCT art.article_id SEPARATOR ',') AS art_ids FROM cygx_article as art `
+
+	actSql := ` SELECT GROUP_CONCAT(DISTINCT act.activity_id SEPARATOR ',') AS act_ids FROM cygx_activity as act `
+
+	mmSql := ` SELECT GROUP_CONCAT(DISTINCT mmc.id SEPARATOR ',') AS mm_ids FROM cygx_morning_meeting_review_chapter as mmc `
+
+	for _, s := range industriesCondSlice {
+		if s != ""{
+			artSql += ` INNER JOIN cygx_industrial_article_group_management  AS iam ON iam.article_id = art.article_id 
+				INNER JOIN cygx_industrial_management AS im ON im.industrial_management_id=iam.industrial_management_id  `
+			actSql += ` INNER JOIN cygx_industrial_activity_group_management  AS iam ON iam.activity_id = act.activity_id 
+				INNER JOIN cygx_industrial_management AS im ON im.industrial_management_id=iam.industrial_management_id  `
+			mmSql += ` INNER JOIN cygx_morning_meeting_reviews  AS mm ON mmc.meeting_id = mm.id 
+				INNER JOIN cygx_industrial_management AS im ON im.industrial_management_id=mmc.industry_id  `
+
+			break
+		}
+	}
+	for _, s := range subjectNamesSlice {
+		if s != ""{
+			artSql += ` INNER JOIN cygx_industrial_article_group_subject  AS ias ON ias.article_id = art.article_id 
+				INNER JOIN cygx_industrial_subject AS cis ON cis.industrial_subject_id=ias.industrial_subject_id  `
+			actSql += ` INNER JOIN cygx_industrial_activity_group_subject  AS ias ON ias.activity_id = act.activity_id 
+				INNER JOIN cygx_industrial_subject AS cis ON cis.industrial_subject_id=ias.industrial_subject_id  `
+			mmSql += ` IINNER JOIN cygx_morning_meeting_reviews  AS mm ON mmc.meeting_id = mm.id 
+				INNER JOIN cygx_industrial_subject AS cis ON cis.industrial_subject_id=mmc.industrial_subject_ids  `
+
+			break
+		}
+	}
+	artSql += ` WHERE 1=1 AND ((1=1 `
+	actSql += ` WHERE 1=1 AND ((1=1 `
+	mmSql += ` WHERE 1=1 AND ((1=1 `
+	var isNeedArt, isNeedAct, isNeedMm bool
+	for i, _ := range articleTypeCondSlice {
+		articleTypesCond := articleTypeCondSlice[i]
+		activityTypesCond := activityTypesCondSlice[i]
+		industryStr := industriesCondSlice[i]
+		subjectNameStr := subjectNamesSlice[i]
+		articleTypeStr := articleTypeSlice[i]
+
+
+		if articleTypesCond != "" || (articleTypesCond == "" && activityTypesCond == "") {
+			if industryStr != "" && subjectNameStr != "" {
+				artSql += articleTypesCond + ` AND (im.industry_name In (` + industryStr + `) OR cis.subject_name In (` + subjectNameStr + `) )`
+			} else if industryStr == "" && subjectNameStr != "" {
+				artSql += articleTypesCond + ` AND  cis.subject_name In (` + subjectNameStr + `) `
+			} else if industryStr != "" && subjectNameStr == "" {
+				artSql += articleTypesCond + ` AND im.industry_name In (` + industryStr + `) `
+			} else {
+				artSql += articleTypesCond
+			}
+
+			if i == len(articleTypeCondSlice) -1 {
+				artSql += `)) `
+			} else {
+				artSql += `) OR (1=1 `
+			}
+
+			isNeedArt = true
+		}
+
+
+
+		if activityTypesCond != "" || (articleTypesCond == "" && activityTypesCond == "") {
+			if industryStr != "" && subjectNameStr != "" {
+				actSql += activityTypesCond + ` AND (im.industry_name In (` + industryStr + `) OR cis.subject_name In (` + subjectNameStr + `) )`
+			} else if industryStr == "" && subjectNameStr != "" {
+				actSql += activityTypesCond + ` AND  cis.subject_name In (` + subjectNameStr + `) `
+			} else if industryStr != "" && subjectNameStr == "" {
+				actSql += activityTypesCond + ` AND im.industry_name In (` + industryStr + `) `
+			} else {
+				actSql += activityTypesCond
+			}
+
+			if i == len(articleTypeCondSlice) -1 {
+				actSql += `)) `
+			} else {
+				actSql += `) OR (1=1 `
+			}
+
+			isNeedAct = true
+		}
+
+		if strings.Contains(articleTypeStr, "晨会精华") {
+			if industryStr != "" && subjectNameStr != "" {
+				mmSql +=  ` AND (im.industry_name In (` + industryStr + `) OR cis.subject_name In (` + subjectNameStr + `) )`
+			} else if industryStr == "" && subjectNameStr != "" {
+				mmSql += ` AND  cis.subject_name In (` + subjectNameStr + `) `
+			} else if industryStr != "" && subjectNameStr == "" {
+				mmSql += ` AND im.industry_name In (` + industryStr + `) `
+			}
+
+			if i == len(articleTypeCondSlice) -1 {
+				mmSql += `)) `
+			} else {
+				mmSql += `) OR (1=1 `
+			}
+
+			isNeedMm = true
+		}
+	}
+
+	if isNeedArt {
+		err = o.Raw(artSql).QueryRow(&artIds)
+		if err != nil{
+			return
+		}
+	}
+	if isNeedAct{
+		err = o.Raw(actSql).QueryRow(&actIds)
+		if err != nil{
+			return
+		}
+	}
+	if isNeedMm {
+		err = o.Raw(mmSql).QueryRow(&mmIds)
+		if err != nil{
+			return
+		}
+	}
+
+
+	return
+}

+ 3 - 20
models/chart_permission.go

@@ -3,7 +3,6 @@ package models
 import (
 	"github.com/beego/beego/v2/client/orm"
 	"strings"
-	"time"
 )
 
 type ChartPermission struct {
@@ -60,7 +59,7 @@ func GetChartPermissionActivity() (items []*ActivityChartPermission, err error)
 	return
 }
 
-//处理添加主观客观之后的分类ID错误
+// 处理添加主观客观之后的分类ID错误
 func GetUserCompanyPermission(companyId int) (items []*ActivityChartPermission, err error) {
 	list, err := GetUserCompanyPermissionSandO(companyId)
 	if err != nil {
@@ -112,23 +111,7 @@ func GetUserCompanyPermissionSandO(companyId int) (items []*ActivityChartPermiss
 	return
 }
 
-type CompanyReportPermission struct {
-	CompanyReportPermissionId int `orm:"column(company_report_permission_id);pk"`
-	CompanyId                 int `description:"客户id"`
-	ReportPermissionId        int `description:"报告权限id"`
-	CreatedTime               time.Time
-	LastUpdatedTime           time.Time
-	ChartPermissionId         int    `description:"权限id"`
-	StartDate                 string `description:"权限开始日期"`
-	EndDate                   string `description:"权限结束日期"`
-	ProductId                 int    `description:"产品id"`
-	ProductName               string `description:"产品名称"`
-	ModifyTime                string `description:"修改时间"`
-	CompanyContractId         string `description:"合同id"`
-	Status                    string `description:"状态  '正式','试用','关闭','永续','潜在' "`
-}
-
-//获取策略下面的所有分类
+// 获取策略下面的所有分类
 func GetCompanyReportPermissionAll() (items []*CompanyReportPermission, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT * FROM company_report_permission WHERE chart_permission_id IN (19,20,21,22) AND status IN ('正式','试用','永续')  AND created_time <= '2021-12-28 15:05:43'`
@@ -142,7 +125,7 @@ func AddChartPersion(item *CompanyReportPermission) (newId int64, err error) {
 	return
 }
 
-//获取海通国际开通的默认权限
+// 获取海通国际开通的默认权限
 func GetCompanyPermissionIdWithHtgj() (chartpermissionids string, err error) {
 	sql := ` SELECT GROUP_CONCAT(DISTINCT chart_permission_id  ORDER BY b.sort ASC  SEPARATOR ',') AS chartpermissionids
 			FROM chart_permission as  b 

+ 8 - 0
models/company.go

@@ -252,6 +252,14 @@ func GetCompanyByName(companyName string) (item *Company, err error) {
 	return
 }
 
+// 获取公司详情详情
+func GetCompanyById(companyId int) (item *Company, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT *  FROM company WHERE company_id = ? LIMIT 1`
+	err = o.Raw(sql, companyId).QueryRow(&item)
+	return
+}
+
 // 获取公司详情详情
 func GetCompanyByThirdName(tripartiteCompanyCode string) (item *Company, err error) {
 	o := orm.NewOrm()

+ 11 - 0
models/company_product.go

@@ -10,3 +10,14 @@ func GetCountCompanyProductCompanyId(companyId, productId int) (count int, err e
 	err = orm.NewOrm().Raw(sql, companyId, productId).QueryRow(&count)
 	return
 }
+
+// 获取列表
+func GetCompanyProductList(condition string, pars []interface{}) (items []*CompanyProduct, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT *  FROM company_product WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}

+ 35 - 0
models/company_report_permission.go

@@ -0,0 +1,35 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CompanyReportPermission struct {
+	CompanyReportPermissionId int64 `orm:"column(company_report_permission_id);pk"`
+	CompanyId                 int
+	ReportPermissionId        int
+	CreatedTime               time.Time
+	LastUpdatedTime           time.Time
+	ChartPermissionId         int
+	StartDate                 string `description:"权限开始日期"`
+	EndDate                   string `description:"权限结束日期"`
+	ProductId                 int    `description:"产品id"`
+	ProductName               string `description:"产品名称"`
+	CompanyContractId         int    `description:"合同id"`
+	Status                    string `description:"'正式','试用','关闭'"`
+	ModifyTime                string `description:"修改时间"`
+	IsUpgrade                 int    `description:"是否升级,1是,0否"`
+	ExpensiveYx               int    `description:"权益研选: 0-3w; 1-5w"`
+}
+
+// 通过查询条件获取详情
+func GetCompanyReportPermissionDetailByCondition(condition string, pars []interface{}) (item *CompanyReportPermission, err error) {
+	if condition == "" {
+		return
+	}
+	o := orm.NewOrm()
+	sql := `SELECT * FROM company_report_permission  WHERE 1 = 1  ` + condition
+	err = o.Raw(sql, pars).QueryRow(&item)
+	return
+}

+ 5 - 0
models/db.go

@@ -152,6 +152,11 @@ func init() {
 		new(CygxUserLabelArticle),
 		new(CygxUserLabelActivitySpecial),
 		new(CygxInviteCompany),
+<<<<<<< HEAD
+=======
+		new(CygxActivityPointsBill),
+		new(CygxActivityPointsCompany),
+>>>>>>> master
 		new(CygxTagHistory),
 	)
 	// 记录ORM查询日志

+ 1 - 1
models/industrial_activity_group_management.go

@@ -76,7 +76,7 @@ func GetActivityIndustryRelationList(condition string, pars []interface{}) (list
 				cygx_activity AS a
 			JOIN cygx_industrial_activity_group_management AS b ON a.activity_id = b.activity_id
 			WHERE
-				1 = 1 `
+				1 = 1   AND b.source = 1  `
 	if condition != `` {
 		sql += condition
 	}

+ 1 - 0
models/report.go

@@ -379,6 +379,7 @@ type IsShow struct {
 	ActivitySpecialExplain string    `description:"专项调研活动"`
 	SearchTxtList          SearchTxt `description:"搜索栏回显内容说明"`
 	IsBelongRai            bool      `description:"是否属于权益内部人员"`
+	IsShowResearchPoints   bool      `description:"是否展示研选扣点搜索"`
 }
 
 type SearchTxt struct {

+ 7 - 7
models/search_key_word.go

@@ -17,14 +17,14 @@ type CygxSearchKeyWord struct {
 	RealName    string `description:"用户实际名称"`
 }
 
-//新增搜索
+// 新增搜索
 func AddSearchKeyWord(item *CygxSearchKeyWord) (lastId int64, err error) {
 	o := orm.NewOrm()
 	lastId, err = o.Insert(item)
 	return
 }
 
-//获取用户搜索这个关键词的最新时间
+// 获取用户搜索这个关键词的最新时间
 func GetNewSearchKeyWordByThisUser(uid int, keyWord string) (item *CygxSearchKeyWord, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT * FROM cygx_search_key_word WHERE user_id = ? AND key_word = ? ORDER BY id DESC LIMIT 1 `
@@ -32,11 +32,11 @@ func GetNewSearchKeyWordByThisUser(uid int, keyWord string) (item *CygxSearchKey
 	return
 }
 
-//获取用户搜索词汇频率较高的词
-func GetSearchKeyWordTop() (items []*CygxSearchKeyWord, err error) {
+// 获取用户搜索词汇频率较高的词
+func GetSearchKeyWordTop(condition string, pars []interface{}) (items []*CygxSearchKeyWord, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT key_word, COUNT(*) AS num FROM cygx_search_key_word GROUP BY key_word ORDER BY num DESC LIMIT 8 `
-	_, err = o.Raw(sql).QueryRows(&items)
+	sql := `SELECT key_word, MAX(create_time) as create_time, COUNT(*) AS num FROM cygx_search_key_word  WHERE 1=1  ` + condition + ` GROUP BY key_word ORDER BY num DESC,create_time DESC LIMIT 12 `
+	_, err = o.Raw(sql, pars).QueryRows(&items)
 	return
 }
 
@@ -47,7 +47,7 @@ func GetCygxSearchKeyWordList(condition string) (items []*CygxSearchKeyWord, err
 	return
 }
 
-//修改用户搜索的相关信息
+// 修改用户搜索的相关信息
 func UpdateCygxSearchKeyWord(wxUser *WxUserItem) (err error) {
 	o := orm.NewOrm()
 	var sql string

+ 11 - 0
models/user.go

@@ -439,6 +439,9 @@ func GetSendEmailAllUserWithCompany() (items []*GetSendEmailAllUserWithCompanyRe
 type Headimgurl struct {
 	Headimgurl string `description:"用户头像"`
 }
+type UserEmail struct {
+	Email string `description:"邮箱号"`
+}
 
 // 更改用户手机号
 func UpdateUserHeadimgurl(headimgurl string, userId int) (err error) {
@@ -448,6 +451,14 @@ func UpdateUserHeadimgurl(headimgurl string, userId int) (err error) {
 	return
 }
 
+// 更改用户邮箱号
+func UpdateUserEmail(email string, userId int) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE wx_user SET email = ? WHERE user_id=? `
+	_, err = o.Raw(sql, email, userId).Exec()
+	return
+}
+
 // 更新用户标签
 func UpdateUserLabel(userLabel string, userId int) (err error) {
 	o := orm.NewOrm()

+ 18 - 0
routers/commentsRouter.go

@@ -52,6 +52,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ActivityCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ActivityCoAntroller"],
+        beego.ControllerComments{
+            Method: "Check",
+            Router: `/check`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ActivityCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ActivityCoAntroller"],
         beego.ControllerComments{
             Method: "CheckAsk",
@@ -1429,6 +1438,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:UserController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:UserController"],
+        beego.ControllerComments{
+            Method: "EmailBinding",
+            Router: `/email/binding`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:UserController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:UserController"],
         beego.ControllerComments{
             Method: "FreeButtonUpdate",

+ 180 - 69
services/activity.go

@@ -500,7 +500,7 @@ func GetActivityDetailUserPower(user *models.WxUserItem, activityInfo *models.Ac
 	var userTypeStr string
 
 	//如果是弘则的用户或者宏观的权限不做校验
-	if GetBelongingRai(user.Mobile) || activityInfo.ChartPermissionName == utils.HONG_GUAN_NAME {
+	if (GetBelongingRai(user.Mobile) && user.CompanyId == utils.HZ_COMPANY_ID) || activityInfo.ChartPermissionName == utils.HONG_GUAN_NAME {
 		havePower = true
 		return
 	}
@@ -513,17 +513,26 @@ func GetActivityDetailUserPower(user *models.WxUserItem, activityInfo *models.Ac
 	if (activityInfo.ActivityTypeId == 3 || activityInfo.ActivityTypeId == 5) && activityInfo.YidongActivityId == "" && strings.Contains(activityInfo.ChartPermissionName, utils.CHART_PERMISSION_NAME_YANXUAN) {
 		isResearchSpecial = true
 	}
-	//如果是 公司调研电话会:3,或 专家线下沙龙:5  而且  除易董同步过来的以外的研选类型活动,必须要有研选的正式权限
-	if isResearchSpecial {
-		if !strings.Contains(permissionStr, utils.CHART_PERMISSION_NAME_YANXUAN) {
-			//如果连试用权限都没有,那么久按照普通的研选样式展示
-			isResearchSpecial = false
-		}
-		if !strings.Contains(permissionStrZhengShi, activityInfo.ChartPermissionName) {
-			havePower = false
+	//如果是 对用户的研选扣点的必须要有研选的正式权限
+	if activityInfo.IsResearchPoints {
+		//获取活动对用户要扣的点
+		userPointsNum, e := models.GetCygxActivityPointsSetUserNum(activityInfo.ActivityId)
+		if e != nil {
+			err = errors.New("GetActivitySignupSuccessByUserCountNoHz, Err: " + e.Error())
 			return
 		}
+		if userPointsNum > 0 {
+			if !strings.Contains(permissionStr, utils.CHART_PERMISSION_NAME_YANXUAN) {
+				//如果连试用权限都没有,那么久按照普通的研选样式展示
+				isResearchSpecial = false
+			}
+			if !strings.Contains(permissionStrZhengShi, activityInfo.ChartPermissionName) {
+				havePower = false
+				return
+			}
+		}
 	}
+
 	//处理决策人可见权限
 	if user.IsMaker == 0 && activityInfo.IsMakerShow == 1 {
 		havePower = false
@@ -1101,6 +1110,145 @@ func GetActivityonditionList(user *models.WxUserItem, activityTypeId, chartPermi
 	return
 }
 
+// 根据用户身份处理活动可见
+func ActivityConditioninitSql(user *models.WxUserItem, condition string, isPower int) (conditionActivity string, err error) {
+	condition += `   AND art.publish_status = 1 `
+	conditionActivity = condition
+	//弘则可以查看所有活动
+	if GetBelongingRai(user.Mobile) && user.CompanyId == utils.HZ_COMPANY_ID {
+		return
+	}
+	adminIds, err := models.GetSelleridWhichGroup(user.CompanyId, 2)
+	if err != nil {
+		return
+	}
+	userType, permissionStr, permissionStrZhengShi, err := GetUserTypeZhengShi(user.CompanyId)
+	if err != nil {
+		return
+	}
+	//判断客户规模是否属于可见范围的活动
+	companyProduct, err := models.GetCompanyProductDetail(user.CompanyId, 2)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	isMaker := user.IsMaker
+	slicePer := strings.Split(permissionStr, ",")
+	var permissionSqlStr string
+	var permissionNameStr string
+	for _, v := range slicePer {
+		if userType == 1 {
+			//研选权限处理
+			if !strings.Contains(v, utils.CHART_PERMISSION_NAME_YANXUAN) {
+				permissionNameStr += "'" + v + "',"
+			}
+		} else {
+			permissionNameStr += "'" + v + "',"
+		}
+	}
+	permissionNameStr = strings.Replace(permissionNameStr, "(主观)", "", -1)
+	permissionNameStr = strings.Replace(permissionNameStr, "(客观)", "", -1)
+	permissionNameStr = strings.TrimRight(permissionNameStr, ",")
+	slicePerZhengShi := strings.Split(permissionStrZhengShi, ",")
+	var permissionNameStrZhengShi string
+	for _, v := range slicePerZhengShi {
+		if userType == 1 {
+			//研选权限处理
+			if !strings.Contains(v, utils.CHART_PERMISSION_NAME_YANXUAN) {
+				permissionNameStrZhengShi += "'" + v + "',"
+			}
+		} else {
+			permissionNameStrZhengShi += "'" + v + "',"
+		}
+	}
+	permissionNameStrZhengShi = strings.Replace(permissionNameStrZhengShi, "(主观)", "", -1)
+	permissionNameStrZhengShi = strings.Replace(permissionNameStrZhengShi, "(客观)", "", -1)
+	permissionNameStrZhengShi = strings.TrimRight(permissionNameStrZhengShi, ",")
+
+	mapUserType, e := GetActivityCcustomerTypeList()
+	if e != nil {
+		err = e
+		return
+	}
+	var userTypeStr string
+	userTypeStr = mapUserType[userType]
+
+	// 查研观向7.4-始终查询宏观的权限(无论是否有权限)
+	if permissionNameStr == `` {
+		permissionNameStr = `'宏观'`
+	} else {
+		permissionNameStr += `, '宏观'`
+	}
+	var sqlExport string // 专家权限处理
+	sqlExport = ` AND (art.customer_type_ids LIKE '%` + userTypeStr + `%' `
+	if (userType == 2 || userType == 3) && strings.Contains(permissionStr, "专家") {
+		sqlExport += ` OR  art.customer_type_ids LIKE '%4%' `
+	}
+	sqlExport += `) `
+
+	if isPower == 1 {
+		permissionSqlStr = `  AND art.chart_permission_name  IN (` + permissionNameStr + `)`
+		condition += permissionSqlStr
+	}
+
+	var conditionOr string
+
+	//查询全部可见的数据(是否全部客户可见)
+	if adminIds != "" {
+		condition += ` 	AND ( art.visible_range != 1  OR  (	 art.admin_id IN ( ` + adminIds + ` )  AND art.visible_range = 1 ))  `
+	}
+
+	//活动仅决策人可见
+	if isMaker == 0 {
+		condition += ` AND art.is_maker_show = 0  `
+	}
+
+	//condition += `  AND art.visible_range != 1 `
+	if (userType == 2 || userType == 3 || userType == 4) && strings.Contains(permissionStr, "专家") {
+		conditionOr += ` OR (  art.is_limit_people = 1 AND art.customer_type_ids LIKE '%4%'	 ` + condition + `) `
+	}
+	if (userType == 5) && strings.Contains(permissionStr, "专家") {
+		conditionOr += ` OR (  art.is_limit_people = 1 AND art.customer_type_ids LIKE '%5%'	 ` + condition + `) `
+	}
+	if userType == 1 {
+		conditionOr += ` OR ( art.is_limit_people = 0 ` + condition + permissionSqlStr + `) `
+	} else {
+		conditionOr += ` OR ( art.is_limit_people = 0 ` + condition + `) `
+	}
+	if userType == 6 || userType == 7 {
+		conditionOr += ` OR (   art.customer_type_ids LIKE '%` + strconv.Itoa(userType) + `%'	 ` + condition + `) `
+	}
+	if companyProduct != nil {
+		if companyProduct.Scale != "" {
+			conditionOr += ` OR (  art.scale LIKE '%` + companyProduct.Scale + `%'	 ` + condition + `) `
+		}
+	}
+
+	conditionShengji, conditionZhengshi, conditionHangYe, e := ActivityLabelSpecialUserSql(user)
+	if e != nil {
+		err = errors.New("ActivityLabelSpecialUserSql, Err: " + e.Error())
+		return
+	}
+	// 升级客户可查看范围
+	if conditionShengji != "" {
+		conditionOr += ` OR (  art.is_limit_people = 1 AND ` + conditionShengji + condition + ` ) `
+	}
+	// 正式客户可查看范围
+	if conditionZhengshi != "" {
+		conditionOr += ` OR (  art.is_limit_people = 1 AND ` + conditionZhengshi + condition + ` ) `
+	}
+	// 行业客户可查看范围
+	if conditionHangYe != "" {
+		conditionOr += ` OR (  art.is_limit_people = 1 AND ` + conditionHangYe + condition + ` ) `
+	}
+
+	if userType == 3 {
+		condition += `  AND art.chart_permission_name  IN (` + permissionNameStrZhengShi + `) `
+	}
+	condition += `    AND  art.is_limit_people = 1  `
+	conditionActivity = condition + permissionSqlStr + sqlExport + conditionOr
+	return
+}
+
 // 研选系列专家电话会,会前1小时将问题列表发送给邮箱
 func SendEmailFileForAskMsgResearch(cont context.Context) (err error) {
 	var msg string
@@ -2113,11 +2261,16 @@ func ActivityButtonShow(item *models.ActivityDetail) (articleDetail *models.Acti
 	//IsShowMeetingReminder   bool                       `description:"是否展示会议提醒"`
 	//IsShowHelpSsk           bool                       `description:"是否展示帮我带问"`
 	//IsShowSignup            bool                       `description:"是否展示我要报名"`
-
-	//如果后台在添加活的时候,关联的报告类型不隐藏预约纪要按钮,而且满足以下展示预约纪要按钮类型就展示
-	//if articleDetail.IsHideAppointment == 0 {
-	//	articleDetail.IsShowAppointment = IsShowAppointmentByactivityInfo(articleDetail, articleDetail.ChartPermissionName)
-	//}
+	if articleDetail.SiginupDeadline == utils.FormatDateTimeInit { //报名截止时间处理
+		articleDetail.SiginupDeadline = ""
+	}
+	activityTimeText := articleDetail.ActivityTimeText
+	activityTimeText = strings.Replace(activityTimeText, "(", "(", -1)
+	activityTimeText = strings.Replace(activityTimeText, ")", ")", -1)
+	articleDetail.ActivityTimeText = activityTimeText
+	if articleDetail.SourceType != 2 {
+		articleDetail.SourceType = 1
+	}
 	articleDetail.IsShowAppointment = false
 	//易董的操作按钮都隐藏
 	if articleDetail.YidongActivityId != "" {
@@ -2127,8 +2280,6 @@ func ActivityButtonShow(item *models.ActivityDetail) (articleDetail *models.Acti
 		return
 	}
 
-	//articleDetail.Expert, _ = GetReportContentTextSub(item.Expert)
-
 	//专家电话会 1
 	if articleDetail.ActivityTypeId == 1 && articleDetail.IsLimitPeople == 0 && (articleDetail.ActiveState == "1" || articleDetail.ActiveState == "2") {
 		articleDetail.IsShowHelpSsk = true
@@ -2150,41 +2301,12 @@ func ActivityButtonShow(item *models.ActivityDetail) (articleDetail *models.Acti
 			} else {
 				articleDetail.IsShowSignup = true
 			}
-
-			//if articleDetail.SignupType == 0 {
-			//	if articleDetail.LimitPeopleNum == 0 {
-			//		articleDetail.IsShowOutboundCall = true
-			//		//articleDetail.IsShowHelpSsk = true
-			//	} else {
-			//		articleDetail.IsShowSignup = true
-			//	}
-			//} else {
-			//	if articleDetail.SignupType == 2 {
-			//		articleDetail.IsShowSignup = true
-			//	} else {
-			//		articleDetail.IsShowOutboundCall = true
-			//	}
-			//}
 			articleDetail.IsShowMeetingReminder = true
 			articleDetail.IsShowHelpSsk = true
 		}
 
 		//分析师电话会 2
 		if articleDetail.ActivityTypeId == 2 {
-			//if articleDetail.SignupType == 0 {
-			//	if articleDetail.LimitPeopleNum == 0 {
-			//		articleDetail.IsShowOutboundCall = true
-			//		//articleDetail.IsShowHelpSsk = true
-			//	} else {
-			//		articleDetail.IsShowSignup = true
-			//	}
-			//} else {
-			//	if articleDetail.SignupType == 2 {
-			//		articleDetail.IsShowSignup = true
-			//	} else {
-			//		articleDetail.IsShowOutboundCall = true
-			//	}
-			//}
 			if articleDetail.LimitPeopleNum == 0 {
 				articleDetail.IsShowOutboundCall = true
 				//articleDetail.IsShowHelpSsk = true
@@ -2196,11 +2318,11 @@ func ActivityButtonShow(item *models.ActivityDetail) (articleDetail *models.Acti
 
 		//公司调研电话会 3
 		if articleDetail.ActivityTypeId == 3 {
-			if articleDetail.LimitPeopleNum == 0 {
+			if articleDetail.IsResearchPoints || articleDetail.LimitPeopleNum > 0 {
+				articleDetail.IsShowSignup = true
+			} else {
 				articleDetail.IsShowMeetingReminder = true
 				articleDetail.IsShowOutboundCall = true
-			} else {
-				articleDetail.IsShowSignup = true
 			}
 		}
 
@@ -2226,18 +2348,13 @@ func ActivityButtonShow(item *models.ActivityDetail) (articleDetail *models.Acti
 			articleDetail.ActivityTypeName = "分析师电话会"
 		}
 	}
-	if articleDetail.SourceType != 2 {
-		articleDetail.SourceType = 1
-	}
+
 	//如果是易董创建的活动,展示我要报名,不展示预约外呼
 	if articleDetail.IsYidongConduct {
 		articleDetail.IsShowSignup = true
 		articleDetail.IsShowOutboundCall = false
 	}
-	activityTimeText := articleDetail.ActivityTimeText
-	activityTimeText = strings.Replace(activityTimeText, "(", "(", -1)
-	activityTimeText = strings.Replace(activityTimeText, ")", ")", -1)
-	articleDetail.ActivityTimeText = activityTimeText
+
 	return
 }
 
@@ -2285,21 +2402,15 @@ func GetActivityNewLabelMap(activityIds []int) (labelMap map[int]bool, industryN
 			}
 		}
 	}
-
-	//for _, v := range activityIds {
-	//	labelMap[v] = true
-	//}
-	//fmt.Println(labelMap)
 	////产业关联的弘则报告发布日期在三个月以内的活动、产业显示 NEW标签
-	articNewLabel, e := GetArticNewLabelWhithActivity3Month()
-	if e != nil {
-		err = errors.New("获取产业新标签Map失败, Err: " + e.Error())
-		return
-	}
-	for k := range articNewLabel {
-		labelMap[k] = false
-	}
-
+	//articNewLabel, e := GetArticNewLabelWhithActivity3Month()
+	//if e != nil {
+	//	err = errors.New("获取产业新标签Map失败, Err: " + e.Error())
+	//	return
+	//}
+	//for k := range articNewLabel {
+	//	labelMap[k] = true
+	//}
 	return
 }
 

+ 3 - 2
services/activity_meeting.go

@@ -44,7 +44,8 @@ func GroupingActivityToJmcj(cont context.Context) (err error) {
 	}
 	textLen := 15
 	pars = make([]interface{}, 0)
-	condition = " AND activity_time BETWEEN ? AND ? AND publish_status = 1  AND jmcj_activity_id = '' "
+	//进门财经的不匹配的易董办会的
+	condition = " AND activity_time BETWEEN ? AND ? AND publish_status = 1  AND jmcj_activity_id = '' AND yidong_activity_id_by_cygx = '' AND yidong_activity_id = '' "
 	//condition += " AND activity_id = 1339   "
 	pars = append(pars, startDate, endDate)
 	listHz, e := models.GetActivityListByCondition(condition, pars)
@@ -195,7 +196,7 @@ func GetActivityMeetingByJmcj(cont context.Context) (err error) {
 	var condition string
 	var pars []interface{}
 	//获取弘则要同步到会信息的活动
-	condition = ` AND activity_time BETWEEN ? AND ? AND publish_status = 1  AND  jmcj_activity_id != '' OR (  activity_id IN (` + detail.ConfigValue + `) AND publish_status = 1 AND  jmcj_activity_id != '' ) `
+	condition = ` AND activity_time BETWEEN ? AND ? AND publish_status = 1  AND  jmcj_activity_id != '' AND yidong_activity_id_by_cygx = '' AND yidong_activity_id = ''  OR (  activity_id IN (` + detail.ConfigValue + `) AND publish_status = 1 AND  jmcj_activity_id != '' ) `
 	pars = append(pars, startDate, endDate)
 	listHz, e := models.GetActivityListByCondition(condition, pars)
 	if e != nil && e.Error() != utils.ErrNoRow() {

+ 983 - 0
services/activity_points.go

@@ -0,0 +1,983 @@
+package services
+
+import (
+	"encoding/json"
+	"errors"
+	"fmt"
+	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/utils"
+	"time"
+)
+
+//func init() {
+//	GetActivityPointsAll()
+//}
+
+// GetActivityPointsAll 获取所有带有扣点的活动
+func GetActivityPointsAll() (mapResp map[int]bool, err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg("获取所有带有扣点的活动失败"+err.Error(), 2)
+		}
+	}()
+	var condition string
+	var pars []interface{}
+	mapResp = make(map[int]bool, 0)
+	list, e := models.GetCygxActivityPointsSetList(condition, pars, 0, 0)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCygxActivityPointsSetList,Err: " + e.Error())
+		return
+	}
+	for _, v := range list {
+		mapResp[v.ActivityId] = true
+	}
+	return
+}
+
+// 用户报名添加到处理研选扣点
+func YanXuanActivityPointsBillSignupAdd(activityId, uid int) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			msg := fmt.Sprint("activityId:", activityId, "userId:", uid)
+			go utils.SendAlarmMsg("用户报名添加到处理研选扣点,写入Redis队列消息失败:"+err.Error()+msg, 2)
+		}
+	}()
+	//SourceType int       `description:"1:报名、 2:取消报名、3:活动编辑、4:活动发布,取消发布、5:活动到会。"`
+	log := &models.YanXuanActivityPointsRedis{UserId: uid, ActivityId: activityId, SourceType: 1, RegisterPlatform: utils.REGISTER_PLATFORM, Source: 1, CreateTime: time.Now()}
+	if utils.Re == nil {
+		err := utils.Rc.LPush(utils.CYGX_YANXUAN_POINTS_KEY, log)
+		if err != nil {
+			fmt.Println("YanXuanActivityPointsRedis LPush Err:" + err.Error())
+		}
+	}
+	return
+}
+
+// 用户取消报名添加到处理研选扣点
+func YanXuanActivityPointsBillSignupCancel(activityId, uid int) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			msg := fmt.Sprint("activityId:", activityId, "userId:", uid)
+			go utils.SendAlarmMsg("用户取消报名添加到处理研选扣点,写入Redis队列消息失败:"+err.Error()+msg, 2)
+		}
+	}()
+	//SourceType int       `description:"1:报名、 2:取消报名、3:活动编辑、4:活动发布,取消发布、5:活动到会。"`
+	log := &models.YanXuanActivityPointsRedis{UserId: uid, ActivityId: activityId, SourceType: 2, RegisterPlatform: utils.REGISTER_PLATFORM, Source: 1, CreateTime: time.Now()}
+	if utils.Re == nil {
+		err := utils.Rc.LPush(utils.CYGX_YANXUAN_POINTS_KEY, log)
+		if err != nil {
+			fmt.Println("YanXuanActivityPointsRedis LPush Err:" + err.Error())
+		}
+	}
+	return
+}
+
+// 5 活动到会研选扣点处理
+func YanXuanActivityPointsBillSubmitMeeting(activityId, adminId int) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			msg := fmt.Sprint("activityId:", activityId)
+			go utils.SendAlarmMsg("活动到会研选扣点处理,写入Redis队列消息失败:"+err.Error()+msg, 2)
+		}
+	}()
+	//SourceType int       `description:"1:报名、 2:取消报名、3:活动编辑、4:活动发布,取消发布、5:活动到会。6:研选审批通过的时候研选扣点更新、 7:正式专试用定时任务更新研选扣点"`
+	log := &models.YanXuanActivityPointsRedis{ActivityId: activityId, SourceType: 5, AdminId: adminId, Source: 2, CreateTime: time.Now()}
+	if utils.Re == nil {
+		err := utils.Rc.LPush(utils.CYGX_YANXUAN_POINTS_KEY, log)
+		if err != nil {
+			fmt.Println("YanXuanActivityPointsRedis LPush Err:" + err.Error())
+		}
+	}
+	return
+}
+
+// YanXuanActivityPointsBillReduce 处理研选活动扣点
+func YanXuanActivityPointsBillReduce() (err error) {
+	for {
+		//SourceType int       `description:"1:报名、 2:取消报名、3:活动编辑、4:活动发布,取消发布、5:活动到会。"`
+		utils.Rc.Brpop(utils.CYGX_YANXUAN_POINTS_KEY, func(b []byte) {
+			var log models.YanXuanActivityPointsRedis
+			if err := json.Unmarshal(b, &log); err != nil {
+				fmt.Println("json unmarshal wrong!")
+				go utils.SendAlarmMsg("处理研选活动扣点处理Redis队列消息失败:"+err.Error()+string(b), 2)
+			}
+			switch log.SourceType {
+			case 1:
+				go YanXuanActivityPointsBillSignupAddReduce(log)
+				fmt.Println("1:报名")
+				break
+			case 2:
+				go YanXuanActivityPointsBillSignupCancelReduce(log)
+				fmt.Println(" 2:取消报名")
+				break
+			case 3:
+				go YanXuanActivityPointsBillActivityEditReduce(log)
+				fmt.Println("3:活动编辑")
+				break
+			case 4:
+				go YanXuanActivityPointsBillActivityPublishAndCancelReduce(log)
+				fmt.Println("4:活动发布、取消发布")
+				break
+			case 5:
+				go YanXuanActivityPointsBillSubmitMeetingReduce(log)
+				fmt.Println("5:活动到会研选扣点处理。")
+			case 6:
+				go YanXuanCompanyApprovalReduce(log)
+				fmt.Println("6:研选审批通过的时候研选扣点更新。")
+				break
+			case 7:
+				go YanXuanCompanyCompanyTryOutReduce(log)
+				fmt.Println("7:正式专试用定时任务更新研选扣点。")
+				break
+			default:
+				fmt.Println(string(b))
+				go utils.SendAlarmMsg("处理研选活动扣点处理Redis队列消息失败:"+string(b), 2)
+			}
+		})
+	}
+}
+
+// 1:用户报名
+func YanXuanActivityPointsBillSignupAddReduce(log models.YanXuanActivityPointsRedis) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg("用户报名活动扣点,处理Redis队列消息失败:"+err.Error()+fmt.Sprint("ActivityId", log.ActivityId, "userId", log.UserId), 2)
+		}
+	}()
+	//加500毫秒的延迟
+	time.Sleep(500 * time.Millisecond)
+	activityId := log.ActivityId
+	userId := log.UserId
+
+	//获取活动是否扣点以及扣点规则明细
+	activityPointsSetDetail, e := models.GetCygxActivityPointsSetDetail(activityId)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCygxActivityPointsSetDetail" + e.Error())
+		return
+	}
+	if activityPointsSetDetail == nil {
+		return
+	}
+	if activityPointsSetDetail.UserPointsNum == 0 || activityPointsSetDetail.PointsType != 1 {
+		return // 如果不是报名即扣点的这种形式,那么就不做任何处理
+	}
+
+	activityInfo, e := models.GetAddActivityInfoById(activityId)
+	if e != nil {
+		err = errors.New("GetAddActivityInfoById" + e.Error())
+		return
+	}
+	user, e := models.GetWxUserItemByUserId(userId)
+	if e != nil {
+		err = errors.New("GetWxUserItemByUserId" + e.Error())
+		return
+	}
+
+	// 获取用户所在公司剩余的点
+	companyPointsNum, e := models.GetCompanyPoints(user.CompanyId)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCompanyPoints, Err: " + e.Error())
+		return
+	}
+	//获取需要添加的流水信息
+	var items []*models.CygxActivityPointsBill
+	item := new(models.CygxActivityPointsBill)
+	item.UserId = user.UserId
+	item.ActivityId = activityId
+	item.CreateTime = time.Now()
+	item.Mobile = user.Mobile
+	item.Email = user.Email
+	item.CompanyId = user.CompanyId
+	item.CompanyName = user.CompanyName
+	item.RealName = user.RealName
+	item.BillDetailed = -activityPointsSetDetail.UserPointsNum
+	item.RegisterPlatform = log.RegisterPlatform
+	item.AdminId = log.AdminId
+	item.Source = log.Source
+	item.ChartPermissionId = activityInfo.ChartPermissionId
+	item.DoType = 1
+	item.Content = activityInfo.ActivityName + "--报名"
+	item.Points = companyPointsNum - activityPointsSetDetail.UserPointsNum
+	items = append(items, item)
+
+	//更新对应机构的剩余点数
+	var itemCompanys []*models.CygxActivityPointsCompany
+	itemCompany := new(models.CygxActivityPointsCompany)
+	itemCompany.CompanyId = user.CompanyId
+	itemCompany.Points = item.Points
+	itemCompany.ModifyTime = time.Now()
+	itemCompanys = append(itemCompanys, itemCompany)
+
+	err = models.AddCygxActivityPointsBillMulti(items, itemCompanys)
+	return
+}
+
+// 2:用户取消报名
+func YanXuanActivityPointsBillSignupCancelReduce(log models.YanXuanActivityPointsRedis) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg("用户取消报名扣点,处理Redis队列消息失败:"+err.Error()+fmt.Sprint("ActivityId", log.ActivityId, "userId", log.UserId), 2)
+		}
+	}()
+
+	activityId := log.ActivityId
+	userId := log.UserId
+
+	//获取活动是否扣点以及扣点规则明细
+	activityPointsSetDetail, e := models.GetCygxActivityPointsSetDetail(activityId)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCygxActivityPointsSetDetail" + e.Error())
+		return
+	}
+	if activityPointsSetDetail == nil {
+		return
+	}
+	if activityPointsSetDetail.UserPointsNum == 0 || activityPointsSetDetail.PointsType != 1 {
+		return // 如果不是报名即扣点的这种形式,那么就不做任何处理
+	}
+
+	activityInfo, e := models.GetAddActivityInfoById(activityId)
+	if e != nil {
+		err = errors.New("GetAddActivityInfoById" + e.Error())
+		return
+	}
+	user, e := models.GetWxUserItemByUserId(userId)
+	if e != nil {
+		err = errors.New("GetWxUserItemByUserId" + e.Error())
+		return
+	}
+
+	// 获取用户所在公司剩余的点
+	companyPointsNum, e := models.GetCompanyPoints(user.CompanyId)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCompanyPoints, Err: " + e.Error())
+		return
+	}
+
+	//查询最新的一条针对这个用户的扣点记录
+	var condition string
+	var pars []interface{}
+	condition += ` AND activity_id = ? AND user_id = ?  AND bill_detailed < 0   ORDER BY id DESC LIMIT 1  `
+	pars = append(pars, activityId, userId)
+	activityPointsBillDetail, e := models.GetCygxActivityPointsBillDetailByCondition(condition, pars)
+	if e != nil {
+		err = errors.New("activityPointsBillDetail" + e.Error())
+		return
+	}
+
+	//获取需要添加的流水信息
+	var items []*models.CygxActivityPointsBill
+	item := new(models.CygxActivityPointsBill)
+	item.UserId = user.UserId
+	item.ActivityId = activityId
+	item.CreateTime = time.Now()
+	item.Mobile = user.Mobile
+	item.Email = user.Email
+	item.CompanyId = user.CompanyId
+	item.CompanyName = user.CompanyName
+	item.RealName = user.RealName
+	item.BillDetailed = -activityPointsBillDetail.BillDetailed
+	item.RegisterPlatform = log.RegisterPlatform
+	item.AdminId = log.AdminId
+	item.Source = log.Source
+	item.ChartPermissionId = activityInfo.ChartPermissionId
+	item.DoType = 2
+	item.Content = activityInfo.ActivityName + "--取消报名"
+	item.Points = companyPointsNum - activityPointsBillDetail.BillDetailed
+	items = append(items, item)
+
+	//更新对应机构的剩余点数
+	var itemCompanys []*models.CygxActivityPointsCompany
+	itemCompany := new(models.CygxActivityPointsCompany)
+	itemCompany.CompanyId = user.CompanyId
+	itemCompany.Points = item.Points
+	itemCompany.ModifyTime = time.Now()
+	itemCompanys = append(itemCompanys, itemCompany)
+
+	err = models.AddCygxActivityPointsBillMulti(items, itemCompanys)
+	return
+}
+
+// 3:活动编辑
+func YanXuanActivityPointsBillActivityEditReduce(log models.YanXuanActivityPointsRedis) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg("用户报名活动扣点,处理Redis队列消息失败:"+err.Error()+fmt.Sprint("ActivityId", log.ActivityId, "userId", log.UserId), 2)
+		}
+	}()
+
+	activityId := log.ActivityId
+
+	//获取活动是否扣点以及扣点规则明细
+	activityPointsSetDetail, e := models.GetCygxActivityPointsSetDetail(activityId)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCygxActivityPointsSetDetail" + e.Error())
+		return
+	}
+	if activityPointsSetDetail == nil {
+		return
+	}
+	if activityPointsSetDetail.CompanyPointsNum == 0 {
+		return // 如果不是办会人,即扣点的这种形式,那么就不做任何处理
+	}
+	comapnyId := activityPointsSetDetail.CompanyId
+	activityInfo, e := models.GetAddActivityInfoByActivityId(activityId)
+	if e != nil {
+		err = errors.New("GetAddActivityInfoByActivityId" + e.Error())
+		return
+	}
+	if activityInfo.PublishStatus == 0 {
+		return // 未发布的活动不做处理
+	}
+	comapny, e := models.GetCompanyById(comapnyId)
+	if e != nil {
+		err = errors.New("GetCompanyById" + e.Error())
+		return
+	}
+
+	// 获取用户所在公司剩余的点
+	companyPointsNum, e := models.GetCompanyPoints(comapny.CompanyId)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCompanyPoints, Err: " + e.Error())
+		return
+	}
+
+	//查询最新的一条针对这个公司的扣点记录
+	var condition string
+	var pars []interface{}
+	condition += ` AND activity_id = ? AND company_id = ? AND mobile = '' AND bill_detailed < 0   ORDER BY id DESC LIMIT 1  `
+	pars = append(pars, activityId, comapnyId)
+	activityPointsBillDetail, e := models.GetCygxActivityPointsBillDetailByCondition(condition, pars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCompanyPoints, Err: " + e.Error())
+		return
+	}
+	var items []*models.CygxActivityPointsBill
+	item := new(models.CygxActivityPointsBill)
+	var itemCompanys []*models.CygxActivityPointsCompany
+	itemCompany := new(models.CygxActivityPointsCompany)
+
+	if activityPointsBillDetail == nil { //如果是空的就添加
+		//获取需要添加的流水信息
+		//item.UserId = user.UserId
+		item.ActivityId = activityId
+		item.CreateTime = time.Now()
+		//item.Mobile = user.Mobile
+		//item.Email = user.Email
+		item.CompanyId = comapny.CompanyId
+		item.CompanyName = comapny.CompanyName
+		//item.RealName = user.RealName
+		item.BillDetailed = -activityPointsSetDetail.CompanyPointsNum
+		item.RegisterPlatform = log.RegisterPlatform
+		item.AdminId = log.AdminId
+		item.Source = log.Source
+		item.ChartPermissionId = activityInfo.ChartPermissionId
+		item.DoType = 1
+		item.Content = activityInfo.ActivityName + "--办会"
+		item.Points = companyPointsNum - activityPointsSetDetail.CompanyPointsNum
+		items = append(items, item)
+
+		//更新对应机构的剩余点数
+		itemCompany.CompanyId = comapny.CompanyId
+		itemCompany.Points = item.Points
+		itemCompany.ModifyTime = time.Now()
+		itemCompanys = append(itemCompanys, itemCompany)
+		e = models.AddCygxActivityPointsBillMulti(items, itemCompanys)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			err = errors.New("AddCygxActivityPointsBillMulti, Err: " + e.Error())
+			return
+		}
+	} else {
+		//如果存在就进行对比修改
+		if activityPointsSetDetail.CompanyPointsNum != -activityPointsBillDetail.BillDetailed {
+			item.Id = activityPointsBillDetail.Id
+			item.BillDetailed = -activityPointsSetDetail.CompanyPointsNum
+			item.Points = companyPointsNum - activityPointsBillDetail.BillDetailed - activityPointsSetDetail.CompanyPointsNum
+			items = append(items, item)
+
+			//更新对应机构的剩余点数
+			itemCompany.CompanyId = comapny.CompanyId
+			itemCompany.Points = item.Points
+			itemCompany.ModifyTime = time.Now()
+			itemCompanys = append(itemCompanys, itemCompany)
+			e = models.UpdateCygxActivityPointsBillMulti(items, itemCompanys)
+			if e != nil && e.Error() != utils.ErrNoRow() {
+				err = errors.New("UpdateCygxActivityPointsBillMulti, Err: " + e.Error())
+				return
+			}
+		}
+	}
+	return
+}
+
+// 4:活动发布取消发布
+func YanXuanActivityPointsBillActivityPublishAndCancelReduce(log models.YanXuanActivityPointsRedis) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg("活动发布扣点,处理Redis队列消息失败:"+err.Error()+fmt.Sprint("ActivityId", log.ActivityId, "userId", log.UserId), 2)
+		}
+	}()
+
+	activityId := log.ActivityId
+	publishStatus := log.PublishStatus
+	//comapnyId := log.ComapnyId
+
+	//获取活动是否扣点以及扣点规则明细
+	activityPointsSetDetail, e := models.GetCygxActivityPointsSetDetail(activityId)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCygxActivityPointsSetDetail" + e.Error())
+		return
+	}
+	if activityPointsSetDetail == nil {
+		return
+	}
+	if activityPointsSetDetail.CompanyPointsNum == 0 && activityPointsSetDetail.PointsType == 2 {
+		//if activityPointsSetDetail.CompanyPointsNum == 0 {
+		return // 如果不是办会人扣点,且对用户是到会扣点的这种形式,那么就不做任何处理
+	}
+
+	activityInfo, e := models.GetAddActivityInfoByActivityId(activityId)
+	if e != nil {
+		err = errors.New("GetAddActivityInfoByActivityId" + e.Error())
+		return
+	}
+
+	comapnyId := activityPointsSetDetail.CompanyId
+	var items []*models.CygxActivityPointsBill
+
+	var itemCompanys []*models.CygxActivityPointsCompany
+	mapCompanyPoints := make(map[int]float64) //一组公司的剩余点数
+	if publishStatus == 1 {
+		fmt.Println("//活动发布")
+		if comapnyId > 0 {
+			comapny, e := models.GetCompanyById(comapnyId)
+			if e != nil {
+				err = errors.New("GetCompanyById" + e.Error())
+				return
+			}
+			// 获取用户所在公司剩余的点
+			companyPointsNum, e := models.GetCompanyPoints(comapny.CompanyId)
+			if e != nil && e.Error() != utils.ErrNoRow() {
+				err = errors.New("GetCompanyPoints, Err: " + e.Error())
+				return
+			}
+			item := new(models.CygxActivityPointsBill)
+			item.ActivityId = activityId
+			item.CreateTime = time.Now()
+			//item.Mobile = user.Mobile
+			//item.Email = user.Email
+			item.CompanyId = comapny.CompanyId
+			item.CompanyName = comapny.CompanyName
+			//item.RealName = user.RealName
+			item.BillDetailed = -activityPointsSetDetail.CompanyPointsNum
+			item.RegisterPlatform = log.RegisterPlatform
+			item.AdminId = log.AdminId
+			item.Source = log.Source
+			item.ChartPermissionId = activityInfo.ChartPermissionId
+			item.DoType = 1
+			item.Content = activityInfo.ActivityName + "--办会"
+			item.Points = companyPointsNum - activityPointsSetDetail.CompanyPointsNum
+			items = append(items, item)
+
+			//更新对应机构的剩余点数
+			itemCompany := new(models.CygxActivityPointsCompany)
+			itemCompany.CompanyId = comapny.CompanyId
+			itemCompany.Points = item.Points
+			itemCompany.ModifyTime = time.Now()
+			itemCompanys = append(itemCompanys, itemCompany)
+			mapCompanyPoints[comapnyId] = item.Points
+		}
+
+		if activityPointsSetDetail.UserPointsNum > 0 && activityPointsSetDetail.PointsType == 1 {
+			//如果扣点形式选的是报名即扣点,那么就对已经报名的用户所在机构进行扣点
+			var condition string
+			var pars []interface{}
+			condition = ` AND do_fail_type = 0 AND activity_id  = ?`
+			pars = append(pars, activityId)
+
+			listSignup, e := models.GetActivitySignupList(condition, pars)
+			if e != nil && e.Error() != utils.ErrNoRow() {
+				err = errors.New("GetActivitySignupList, Err: " + e.Error())
+				return
+			}
+			var companyIds []int
+			if len(listSignup) > 0 {
+				for _, v := range listSignup {
+					companyIds = append(companyIds, v.CompanyId)
+				}
+				pars = make([]interface{}, 0)
+				condition = ` AND company_id IN (` + utils.GetOrmInReplace(len(companyIds)) + `)`
+				pars = append(pars, companyIds)
+
+				//获取这些公司剩余的点数
+				conpanyList, e := models.GetCygxActivityPointsCompanyList(condition, pars)
+				if e != nil && e.Error() != utils.ErrNoRow() {
+					err = errors.New("GetCygxActivityPointsCompanyList, Err: " + e.Error())
+					return
+				}
+
+				for _, v := range conpanyList {
+					if mapCompanyPoints[v.CompanyId] == 0 {
+						mapCompanyPoints[v.CompanyId] = v.Points
+					}
+				}
+
+				for _, user := range listSignup {
+					item := new(models.CygxActivityPointsBill)
+					item.ActivityId = activityId
+					item.CreateTime = time.Now()
+					item.Mobile = user.Mobile
+					item.UserId = user.UserId
+					item.Email = user.Email
+					item.CompanyId = user.CompanyId
+					item.CompanyName = user.CompanyName
+					item.RealName = user.RealName
+					item.BillDetailed = -activityPointsSetDetail.UserPointsNum
+					item.RegisterPlatform = log.RegisterPlatform
+					item.AdminId = log.AdminId
+					item.Source = log.Source
+					item.ChartPermissionId = activityInfo.ChartPermissionId
+					item.DoType = 1
+					item.Content = activityInfo.ActivityName + "--发布活动"
+					mapCompanyPoints[user.CompanyId] -= activityPointsSetDetail.UserPointsNum //通过map处理机构剩余点数
+					item.Points = mapCompanyPoints[user.CompanyId]
+					items = append(items, item)
+
+					//更新对应机构的剩余点数
+					itemCompany := new(models.CygxActivityPointsCompany)
+					itemCompany.CompanyId = user.CompanyId
+					itemCompany.Points = item.Points
+					itemCompany.ModifyTime = time.Now()
+					itemCompanys = append(itemCompanys, itemCompany)
+					mapCompanyPoints[user.CompanyId] = item.Points
+				}
+			}
+		}
+
+	} else {
+		fmt.Println("//活动取消发布")
+		//活动取消发布
+
+		if comapnyId > 0 {
+			comapny, e := models.GetCompanyById(comapnyId)
+			if e != nil {
+				err = errors.New("GetCompanyById" + e.Error())
+				return
+			}
+			// 获取用户所在公司剩余的点
+			companyPointsNum, e := models.GetCompanyPoints(comapny.CompanyId)
+			if e != nil && e.Error() != utils.ErrNoRow() {
+				err = errors.New("GetCompanyPoints, Err: " + e.Error())
+				return
+			}
+			item := new(models.CygxActivityPointsBill)
+			item.ActivityId = activityId
+			item.CreateTime = time.Now()
+			//item.Mobile = user.Mobile
+			//item.Email = user.Email
+			item.CompanyId = comapny.CompanyId
+			item.CompanyName = comapny.CompanyName
+			//item.RealName = user.RealName
+			item.BillDetailed = activityPointsSetDetail.CompanyPointsNum
+			item.RegisterPlatform = log.RegisterPlatform
+			item.AdminId = log.AdminId
+			item.Source = log.Source
+			item.ChartPermissionId = activityInfo.ChartPermissionId
+			item.DoType = 2
+			item.Content = activityInfo.ActivityName + "--取消办会"
+			item.Points = companyPointsNum + activityPointsSetDetail.CompanyPointsNum
+			items = append(items, item)
+			//更新对应机构的剩余点数
+			itemCompany := new(models.CygxActivityPointsCompany)
+			itemCompany.CompanyId = comapny.CompanyId
+			itemCompany.Points = item.Points
+			itemCompany.ModifyTime = time.Now()
+			itemCompanys = append(itemCompanys, itemCompany)
+			mapCompanyPoints[comapnyId] = item.Points
+		}
+
+		if activityPointsSetDetail.UserPointsNum > 0 && activityPointsSetDetail.PointsType == 1 {
+			//如果扣点形式选的是报名即扣点,那么就对已经报名的用户所在机构进行返点
+			var condition string
+			var pars []interface{}
+			condition = ` AND do_fail_type = 0 AND activity_id  = ?`
+			pars = append(pars, activityId)
+
+			listSignup, e := models.GetActivitySignupList(condition, pars)
+			if e != nil && e.Error() != utils.ErrNoRow() {
+				err = errors.New("GetActivitySignupList, Err: " + e.Error())
+				return
+			}
+			var companyIds []int
+			if len(listSignup) > 0 {
+				for _, v := range listSignup {
+					companyIds = append(companyIds, v.CompanyId)
+				}
+				pars = make([]interface{}, 0)
+				condition = ` AND company_id IN (` + utils.GetOrmInReplace(len(companyIds)) + `)`
+				pars = append(pars, companyIds)
+
+				//获取这些公司剩余的点数
+				conpanyList, e := models.GetCygxActivityPointsCompanyList(condition, pars)
+				if e != nil && e.Error() != utils.ErrNoRow() {
+					err = errors.New("GetCygxActivityPointsCompanyList, Err: " + e.Error())
+					return
+				}
+
+				for _, v := range conpanyList {
+					if mapCompanyPoints[v.CompanyId] == 0 {
+						mapCompanyPoints[v.CompanyId] = v.Points
+					}
+				}
+
+				pars = make([]interface{}, 0)
+				condition = ` AND activity_id = ?   `
+				pars = append(pars, activityId)
+				//获取扣点的流水记录
+				activityPointsBillList, e := models.GetCygxActivityPointsBillList(condition, pars)
+				if e != nil && e.Error() != utils.ErrNoRow() {
+					err = errors.New("GetCygxActivityPointsBillList" + e.Error())
+					return
+				}
+				mapUserBill := make(map[int]bool)
+				for _, v := range activityPointsBillList {
+					mapUserBill[v.UserId] = true
+				}
+
+				for _, user := range listSignup {
+					if !mapUserBill[user.UserId] {
+						continue // 如果用户的扣点记录不存在,那么就不进行返点处理
+					}
+					item := new(models.CygxActivityPointsBill)
+					item.ActivityId = activityId
+					item.CreateTime = time.Now()
+					item.Mobile = user.Mobile
+					item.UserId = user.UserId
+					item.Email = user.Email
+					item.CompanyId = user.CompanyId
+					item.CompanyName = user.CompanyName
+					item.RealName = user.RealName
+					item.BillDetailed = activityPointsSetDetail.UserPointsNum
+					item.RegisterPlatform = log.RegisterPlatform
+					item.AdminId = log.AdminId
+					item.Source = log.Source
+					item.ChartPermissionId = activityInfo.ChartPermissionId
+					item.DoType = 2
+					item.Content = activityInfo.ActivityName + "--取消活动"
+					mapCompanyPoints[user.CompanyId] += activityPointsSetDetail.UserPointsNum //通过map处理机构剩余点数
+					item.Points = mapCompanyPoints[user.CompanyId]
+					items = append(items, item)
+
+					//更新对应机构的剩余点数
+					itemCompany := new(models.CygxActivityPointsCompany)
+					itemCompany.CompanyId = user.CompanyId
+					itemCompany.Points = item.Points
+					itemCompany.ModifyTime = time.Now()
+					itemCompanys = append(itemCompanys, itemCompany)
+					mapCompanyPoints[user.CompanyId] = item.Points
+				}
+			}
+		}
+	}
+	e = models.AddCygxActivityPointsBillMulti(items, itemCompanys)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("AddCygxActivityPointsBillMulti, Err: " + e.Error())
+		return
+	}
+	return
+}
+
+//func init() {
+//	log := models.YanXuanActivityPointsRedis{ActivityId: 2385, SourceType: 5, RegisterPlatform: utils.REGISTER_PLATFORM, Source: 4, CreateTime: time.Now()}
+//	YanXuanActivityPointsBillSubmitMeetingReduce(log)
+//}
+
+// 5:活动到会研选扣点处理
+func YanXuanActivityPointsBillSubmitMeetingReduce(log models.YanXuanActivityPointsRedis) (err error) {
+	//func YanXuanActivityPointsBillSubmitMeetingReduce(activityId int) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg("活动到会研选扣点,处理Redis队列消息失败:"+err.Error()+fmt.Sprint("ActivityId", log.ActivityId, "adminId", log.AdminId), 2)
+		}
+	}()
+
+	activityId := log.ActivityId
+	//获取活动是否扣点以及扣点规则明细
+	activityPointsSetDetail, e := models.GetCygxActivityPointsSetDetail(activityId)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCygxActivityPointsSetDetail" + e.Error())
+		return
+	}
+	if activityPointsSetDetail == nil {
+		return
+	}
+	if activityPointsSetDetail.PointsType != 2 {
+		return // 如果不是到会即扣点,的这种形式,那么就不做任何处理
+	}
+
+	activityInfo, e := models.GetAddActivityInfoByActivityId(activityId)
+	if e != nil {
+		err = errors.New("GetAddActivityInfoByActivityId" + e.Error())
+		return
+	}
+	var companyIds []int
+	mapCompanyPoints := make(map[int]float64) //一组公司的剩余点数
+	var condition string
+	var pars []interface{}
+	condition += ` AND activity_id = ? AND  is_meeting = 1 `
+	pars = append(pars, activityId)
+
+	//获取提交到会的人员信息
+	signUpDetailList, e := models.GetSignupDetailList(condition, pars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetSignupDetailList" + e.Error())
+		return
+	}
+	if len(signUpDetailList) == 0 {
+		return
+	}
+	for _, v := range signUpDetailList {
+		companyIds = append(companyIds, v.CompanyId)
+	}
+
+	//return
+	pars = make([]interface{}, 0)
+	condition = ` AND company_id IN (` + utils.GetOrmInReplace(len(companyIds)) + `)`
+	pars = append(pars, companyIds)
+	//获取这些公司剩余的点数
+	conpanyList, e := models.GetCygxActivityPointsCompanyList(condition, pars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCygxActivityPointsCompanyList, Err: " + e.Error())
+		return
+	}
+
+	pars = make([]interface{}, 0)
+	condition = ` AND activity_id = ? AND  mobile  != ''  `
+	pars = append(pars, activityId)
+	//获取扣点的流水记录
+	activityPointsBillList, e := models.GetCygxActivityPointsBillList(condition, pars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCygxActivityPointsBillList" + e.Error())
+		return
+	}
+	mapActivityPointsBill := make(map[string]*models.CygxActivityPointsBill)
+	for _, v := range activityPointsBillList {
+		mapActivityPointsBill[v.Mobile] = v
+	}
+	//return
+	for _, v := range conpanyList {
+		if v.CompanyId != 0 {
+			mapCompanyPoints[v.CompanyId] = v.Points
+		}
+	}
+
+	//return
+	var items []*models.CygxActivityPointsBill
+	var itemCompanys []*models.CygxActivityPointsCompany
+	for _, user := range signUpDetailList {
+		item := new(models.CygxActivityPointsBill)
+		item.ActivityId = activityId
+		item.CreateTime = time.Now()
+		item.UserId = user.UserId
+		item.Mobile = user.Mobile
+		item.Email = user.Email
+		item.CompanyId = user.CompanyId
+		item.CompanyName = user.CompanyName
+		item.RealName = user.RealName
+		item.RegisterPlatform = log.RegisterPlatform
+		item.AdminId = log.AdminId
+		item.Source = log.Source
+		item.ChartPermissionId = activityInfo.ChartPermissionId
+		//如果没有扣点记录就对他们进行扣点处理
+		if mapActivityPointsBill[user.Mobile] == nil {
+			item.BillDetailed = -activityPointsSetDetail.UserPointsNum
+			item.DoType = 1
+			item.Content = activityInfo.ActivityName + "--活动到会"
+			item.Points = mapCompanyPoints[user.CompanyId] - activityPointsSetDetail.UserPointsNum
+			items = append(items, item)
+			//更新对应机构的剩余点数
+			itemCompany := new(models.CygxActivityPointsCompany)
+			itemCompany.CompanyId = user.CompanyId
+			itemCompany.Points = item.Points
+			itemCompany.ModifyTime = time.Now()
+			itemCompanys = append(itemCompanys, itemCompany)
+			mapCompanyPoints[user.CompanyId] = item.Points
+		} else {
+			//第二次提交改成未到会的,对其进行返点处理
+			if mapActivityPointsBill[user.Mobile].BillDetailed < 0 {
+				item.BillDetailed = activityPointsSetDetail.UserPointsNum
+				item.DoType = 2
+				item.Content = activityInfo.ActivityName + "--活动取消到会"
+				item.Points = mapCompanyPoints[user.CompanyId] + activityPointsSetDetail.UserPointsNum
+				items = append(items, item)
+
+				//更新对应机构的剩余点数
+				itemCompany := new(models.CygxActivityPointsCompany)
+				itemCompany.CompanyId = user.CompanyId
+				itemCompany.Points = item.Points
+				itemCompany.ModifyTime = time.Now()
+				itemCompanys = append(itemCompanys, itemCompany)
+				mapCompanyPoints[user.CompanyId] = item.Points
+			}
+		}
+	}
+	e = models.AddCygxActivityPointsBillMulti(items, itemCompanys)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("AddCygxActivityPointsBillMulti, Err: " + e.Error())
+		return
+	}
+	return
+}
+
+// 6:研选审批通过的时候研选扣点更新
+func YanXuanCompanyApprovalReduce(log models.YanXuanActivityPointsRedis) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg("研选审批通过的时候研选扣点更新,处理Redis队列消息失败:"+err.Error()+fmt.Sprint(log), 2)
+		}
+	}()
+	comapnyId := log.ComapnyId
+
+	comapny, e := models.GetCompanyById(comapnyId)
+	if e != nil {
+		err = errors.New("GetCompanyById" + e.Error())
+		return
+	}
+	total, e := models.GetCygxActivityPointsCompanyCountByCompanyId(comapnyId)
+	if e != nil {
+		err = errors.New("GetCygxActivityPointsCompanyCountByCompanyId, Err: " + e.Error())
+		return
+	}
+
+	//查询研选的权限状态
+	var condition string
+	var pars []interface{}
+	condition += " AND company_id = ? AND status = ? AND chart_permission_id = ?   ORDER BY company_report_permission_id DESC LIMIT 1  "
+	pars = append(pars, comapnyId, "正式", utils.CHART_PERMISSION_ID_YANXUAN)
+	companyReportPermissionDetail, e := models.GetCompanyReportPermissionDetailByCondition(condition, pars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCompanyPoints, Err: " + e.Error())
+		return
+	}
+	if companyReportPermissionDetail == nil {
+		return // 如果不存在就不做研选扣点处理
+	}
+	var billDetailed float64
+	var content string
+	//ExpensiveYx               int       `description:"权益研选: 0->3w; 1->5w"` 3W3次、5W 15次
+	if companyReportPermissionDetail.ExpensiveYx == 1 {
+		billDetailed = 15
+		content = "买方研选(5W)转正"
+	} else {
+		billDetailed = 3
+		content = "买方研选(3W)转正"
+	}
+
+	//获取需要添加的流水信息
+	var items []*models.CygxActivityPointsBill
+	item := new(models.CygxActivityPointsBill)
+	//item.UserId = user.UserId
+	//item.ActivityId = activityId
+	item.CreateTime = time.Now()
+	//item.Mobile = user.Mobile
+	//item.Email = user.Email
+	item.CompanyId = comapny.CompanyId
+	item.CompanyName = comapny.CompanyName
+	//item.RealName = user.RealName
+	item.BillDetailed = billDetailed
+	item.RegisterPlatform = log.RegisterPlatform
+	item.AdminId = log.AdminId
+	item.Source = log.Source
+	//item.ChartPermissionId = activityInfo.ChartPermissionId
+	item.DoType = 2
+	item.Content = content
+	item.Points = billDetailed
+	items = append(items, item)
+
+	//更新对应机构的剩余点数
+	var itemCompanys []*models.CygxActivityPointsCompany
+	itemCompany := new(models.CygxActivityPointsCompany)
+	itemCompany.CompanyId = comapny.CompanyId
+	itemCompany.CompanyName = comapny.CompanyName
+	itemCompany.Points = item.Points
+	itemCompany.CreateTime = time.Now()
+	itemCompany.ModifyTime = time.Now()
+	itemCompanys = append(itemCompanys, itemCompany)
+	//判断是否存在记录,如果有就一个新增一个修改,如果没有就同时新增
+	if total == 0 {
+		err = models.AddCygxActivityPointsBillAndCompanyMulti(items, itemCompanys)
+	} else {
+		err = models.AddCygxActivityPointsBillMulti(items, itemCompanys)
+	}
+
+	return
+}
+
+// 7:正式专试用定时任务更新研选扣点
+func YanXuanCompanyCompanyTryOutReduce(log models.YanXuanActivityPointsRedis) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg("正式专试用定时任务更新研选扣点更新,处理Redis队列消息失败:"+err.Error()+fmt.Sprint(log), 2)
+		}
+	}()
+	comapnyId := log.ComapnyId
+
+	comapny, e := models.GetCompanyById(comapnyId)
+	if e != nil {
+		err = errors.New("GetCompanyById" + e.Error())
+		return
+	}
+	// 获取用户所在公司剩余的点
+	companyPointsNum, e := models.GetCompanyPoints(comapnyId)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCompanyPoints, Err: " + e.Error())
+		return
+	}
+	if companyPointsNum <= 0 {
+		return
+	}
+	//获取需要添加的流水信息
+	var items []*models.CygxActivityPointsBill
+	item := new(models.CygxActivityPointsBill)
+	//item.UserId = user.UserId
+	//item.ActivityId = activityId
+	item.CreateTime = time.Now()
+	//item.Mobile = user.Mobile
+	//item.Email = user.Email
+	item.CompanyId = comapny.CompanyId
+	item.CompanyName = comapny.CompanyName
+	//item.RealName = user.RealName
+	item.BillDetailed = -companyPointsNum
+	item.RegisterPlatform = log.RegisterPlatform
+	item.AdminId = log.AdminId
+	item.Source = log.Source
+	//item.ChartPermissionId = activityInfo.ChartPermissionId
+	item.DoType = 2
+	item.Content = "到期清零"
+	item.Points = 0
+	items = append(items, item)
+
+	//更新对应机构的剩余点数
+	var itemCompanys []*models.CygxActivityPointsCompany
+	itemCompany := new(models.CygxActivityPointsCompany)
+	itemCompany.CompanyId = comapny.CompanyId
+	itemCompany.Points = 0
+	itemCompany.CreateTime = time.Now()
+	itemCompany.ModifyTime = time.Now()
+	itemCompanys = append(itemCompanys, itemCompany)
+
+	err = models.AddCygxActivityPointsBillMulti(items, itemCompanys)
+
+	return
+}

+ 69 - 0
services/activity_signup.go

@@ -2,8 +2,10 @@ package services
 
 import (
 	"errors"
+	"fmt"
 	"hongze/hongze_cygx/models"
 	"hongze/hongze_cygx/utils"
+	"time"
 )
 
 // GetActivitySignupResp 处理用户的报名方式
@@ -70,5 +72,72 @@ func CheckActivitySignUpLimit(user *models.WxUserItem, activityInfo *models.Acti
 	//	return
 	//}
 	return
+}
+
+// 校验报名截止时间
+func CheckSiginupDeadline(activityInfo *models.ActivityDetail) (checkTime bool, popupMsg string) {
+	checkTime = true
+	if activityInfo.SiginupDeadline != utils.FormatDateTimeInit {
+		timeResp := utils.StrTimeToTime(activityInfo.SiginupDeadline)
+		if timeResp.Before(time.Now()) {
+			checkTime = false
+			popupMsg = "该活动已截止报名\n\n若想参加,请联系对口销售"
+		}
+	}
+	return
+}
+
+// 校验报名点数
+func CheckActivityPoints(activityInfo *models.ActivityDetail, wxUser *models.WxUserItem) (checkPoints bool, popupMsg, companyPoints, activityPoints string, err error) {
+	checkPoints = true
+	if activityInfo.IsResearchPoints {
+		//获取活动对用户要扣的点
+		userPointsNum, e := models.GetCygxActivityPointsSetUserNum(activityInfo.ActivityId)
+		if e != nil {
+			err = errors.New("GetCygxActivityPointsSetUserNum, Err: " + e.Error())
+			return
+		}
+		// 获取用户所在公司剩余的点
+		companyPointsNum, e := models.GetCompanyPoints(wxUser.CompanyId)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			err = errors.New("GetCompanyPoints, Err: " + e.Error())
+			return
+		}
+		if companyPointsNum-userPointsNum < 0 {
+			checkPoints = false
+			popupMsg = "点数不足,若想报名,\n请联系对口销售充值"
+		}
+		companyPoints = fmt.Sprint(companyPointsNum)
+		activityPoints = fmt.Sprint(userPointsNum)
+	}
+	return
+}
+
+// 校验报名是否需要绑定邮箱
+func CheckActivityUserEmail(activityInfo *models.ActivityDetail, wxUser *models.WxUserItem) (checkEmail bool, popupMsg string) {
+	checkEmail = true
+	if activityInfo.IsNeedEmail == 1 {
+		if wxUser.Email == "" {
+			checkEmail = false
+			popupMsg = "应上市公司要求,该会议报名需\n提供邮箱,请填写您的工作邮箱"
+		}
+	}
+	return
+}
 
+// // 校验报名顺序 截止时间>点数>邮箱
+func CheckActivityUserAll(activityInfo *models.ActivityDetail, wxUser *models.WxUserItem) (popupMsg string, err error) {
+	_, popupMsg = CheckSiginupDeadline(activityInfo)
+	if popupMsg != "" {
+		return
+	}
+	_, popupMsg, _, _, err = CheckActivityPoints(activityInfo, wxUser)
+	if popupMsg != "" {
+		return
+	}
+	_, popupMsg = CheckActivityUserEmail(activityInfo, wxUser)
+	if popupMsg != "" {
+		return
+	}
+	return
 }

+ 25 - 17
services/activity_signup_detail.go

@@ -187,26 +187,27 @@ func AddctivitySignupDetailByJmcj(itemsDetail []*models.CygxActivityAttendanceDe
 			return
 		}
 	}
-
+	//处理研选扣点信息
+	YanXuanActivityPointsBillSubmitMeeting(activityId, 0)
 	return err
 }
 
-func GetCygxActivityAttendanceDetail() {
-	listAll, err := models.GetActivityAttendanceDetailListAll()
-	if err != nil {
-		fmt.Println(err)
-	}
-	mapDetal := make(map[int][]*models.CygxActivityAttendanceDetail)
-
-	for _, v := range listAll {
-		mapDetal[v.ActivityId] = append(mapDetal[v.ActivityId], v)
-	}
-
-	for k, v := range mapDetal {
-		AddctivitySignupDetailByJmcj(v, k)
-	}
-	//fmt.Println(mapDetal)
-}
+//func GetCygxActivityAttendanceDetail() {
+//	listAll, err := models.GetActivityAttendanceDetailListAll()
+//	if err != nil {
+//		fmt.Println(err)
+//	}
+//	mapDetal := make(map[int][]*models.CygxActivityAttendanceDetail)
+//
+//	for _, v := range listAll {
+//		mapDetal[v.ActivityId] = append(mapDetal[v.ActivityId], v)
+//	}
+//
+//	for k, v := range mapDetal {
+//		AddctivitySignupDetailByJmcj(v, k)
+//	}
+//	//fmt.Println(mapDetal)
+//}
 
 // AddctivitySignupDetailByJmcj 通过进门财经添加用户参数信息
 func AddctivitySignupDetailByJmcjNew(itemsDetail []*models.CygxActivityAttendanceDetail, activityIds []int) (err error) {
@@ -298,5 +299,12 @@ func AddctivitySignupDetailByJmcjNew(itemsDetail []*models.CygxActivityAttendanc
 		}
 	}
 
+	//获取所有研选扣点的活动,如果是就行扣点流水处理
+	mapActivityPoints, _ := GetActivityPointsAll()
+	for _, v := range activityIds {
+		if mapActivityPoints[v] {
+			YanXuanActivityPointsBillSubmitMeeting(v, 0)
+		}
+	}
 	return err
 }

+ 73 - 0
services/activity_video.go

@@ -0,0 +1,73 @@
+package services
+
+import (
+	"errors"
+	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/utils"
+)
+
+// GetActivityPlayBackActivityIds 获取带有回放的所有的活动ID
+func GetActivityPlayBackActivityIds() (activityIds string, err error) {
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg("GetActivityPlayBackActivityIds,获取带有回放的所有的活动ID失败"+err.Error(), 2)
+		}
+	}()
+	//获取所有活动视频ID
+	vidoeActivityIds, e := models.GetActivityVideoActivityIds()
+	if e != nil {
+		err = errors.New("GetActivityVideoActivityIds, Err: " + e.Error())
+		return
+	}
+	//如果没有就赋值为0,避免空查询报错
+	if vidoeActivityIds == "" {
+		vidoeActivityIds = "0"
+	}
+
+	//获取所有活动视频ID
+	voiceActivityIds, e := models.GetActivityVoiceActivityIds()
+	if e != nil {
+		err = errors.New("GetActivityVoiceActivityIds, Err: " + e.Error())
+		return
+	}
+	if voiceActivityIds == "" {
+		voiceActivityIds = "0"
+	}
+	activityIds = vidoeActivityIds + "," + voiceActivityIds
+	return
+}
+
+// GetActivityVideoOrVoiceActivityIds 获取音频或者视频的活动ID
+func GetActivityVideoOrVoiceActivityIds(filter int) (activityIds string, err error) {
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg("GetActivityPlayBackActivityIds,获取带有回放的所有的活动ID失败"+err.Error(), 2)
+		}
+	}()
+
+	if filter == 1 {
+		//获取所有活动视频ID
+		vidoeActivityIds, e := models.GetActivityVideoActivityIds()
+		if e != nil {
+			err = errors.New("GetActivityVideoActivityIds, Err: " + e.Error())
+			return
+		}
+		//如果没有就赋值为0,避免空查询报错
+		if vidoeActivityIds == "" {
+			vidoeActivityIds = "0"
+		}
+		activityIds = vidoeActivityIds
+	} else {
+		//获取所有活动视频ID
+		voiceActivityIds, e := models.GetActivityVoiceActivityIds()
+		if e != nil {
+			err = errors.New("GetActivityVoiceActivityIds, Err: " + e.Error())
+			return
+		}
+		if voiceActivityIds == "" {
+			voiceActivityIds = "0"
+		}
+		activityIds = voiceActivityIds
+	}
+	return
+}

+ 34 - 23
services/article.go

@@ -504,36 +504,48 @@ func StatisticalReport() {
 
 // UserViewRedisData 阅读数据
 type UserViewRedisData struct {
-	Mobile      string `json:"mobile"`
-	Email       string `json:"email"`
-	RealName    string `json:"real_name"`
-	CompanyName string `json:"company_name"`
-	ViewTime    string `json:"view_time" description:"阅读时间,格式:2022-02-17 13:06:13"`
-	ProductId   int    `json:"product_id" description:"报告所属产品,ficc:1,权益:2"`
-	CompanyId   int    `json:"company_id" description:"客户id"`
+	Mobile          string `json:"mobile"`
+	Email           string `json:"email"`
+	RealName        string `json:"real_name"`
+	CompanyName     string `json:"company_name"`
+	ViewTime        string `json:"view_time" description:"阅读时间,格式:2022-02-17 13:06:13"`
+	ProductId       int    `json:"product_id" description:"报告所属产品,ficc:1,权益:2"`
+	CompanyId       int    `json:"company_id" description:"客户id"`
+	UserId          int    `json:"user_id" description:"用户id"`
+	ReportId        int    `json:"report_id" description:"报告id"`
+	StopTime        int    `json:"stop_time" description:"停留时间"`
+	ReportChapterId int    `json:"report_chapter_id" description:"章节ID"`
+	OutId           int    `json:"out_id" description:"记录ID"`
 }
 
 type ReportViewRecord struct {
-	Id          int       `orm:"column(id);pk"`
-	UserId      int       `description:"用户id"`
-	ReportId    int       `description:"报告id"`
-	Mobile      string    `description:"手机号"`
-	Email       string    `description:"邮箱"`
-	RealName    string    `description:"用户实际姓名"`
-	CompanyName string    `description:"公司名称"`
-	CreateTime  time.Time `description:"创建时间"`
+	Id              int       `orm:"column(id);pk"`
+	UserId          int       `description:"用户id"`
+	ReportId        int       `description:"报告id"`
+	Mobile          string    `description:"手机号"`
+	Email           string    `description:"邮箱"`
+	RealName        string    `description:"用户实际姓名"`
+	CompanyName     string    `description:"公司名称"`
+	CreateTime      time.Time `description:"创建时间"`
+	StopTime        int       `json:"stop_time" description:"停留时间"`
+	ReportChapterId int       `json:"report_chapter_id" description:"章节ID"`
+	OutId           int       `json:"out_id" description:"记录ID"`
 }
 
 // PushViewRecordNewRedisData 阅读数据加入到redis
 func PushViewRecordNewRedisData(reportViewRecord *ReportViewRecord, companyId int) bool {
 	data := &UserViewRedisData{
-		Mobile:      reportViewRecord.Mobile,
-		Email:       reportViewRecord.Email,
-		RealName:    reportViewRecord.RealName,
-		CompanyName: reportViewRecord.CompanyName,
-		ViewTime:    reportViewRecord.CreateTime.Format(utils.FormatDateTime),
-		ProductId:   2,
-		CompanyId:   companyId,
+		Mobile:          reportViewRecord.Mobile,
+		Email:           reportViewRecord.Email,
+		RealName:        reportViewRecord.RealName,
+		CompanyName:     reportViewRecord.CompanyName,
+		ViewTime:        reportViewRecord.CreateTime.Format(utils.FormatDateTime),
+		ProductId:       2,
+		CompanyId:       companyId,
+		ReportId:        reportViewRecord.ReportId,
+		StopTime:        reportViewRecord.StopTime,
+		ReportChapterId: reportViewRecord.ReportChapterId,
+		OutId:           reportViewRecord.OutId,
 	}
 	if utils.Re == nil {
 		err := utils.Rc.LPush(utils.CACHE_KEY_USER_VIEW, data)
@@ -1627,7 +1639,6 @@ func GetArticNewLabelWhithActivity3Month() (labelMap map[int]bool, err error) {
 	for _, v := range industrialList {
 		industrialIds = append(industrialIds, v.IndustrialManagementId)
 	}
-
 	// 获取活动关联的产业
 	var groupCond string
 	var groupPars []interface{}

+ 14 - 11
services/article_history.go

@@ -43,15 +43,7 @@ func ArticleHistory(articleId int, user *models.WxUserItem) (err error) {
 			go utils.SendAlarmMsg("记录用户文章浏览记录,失败"+err.Error(), 2)
 		}
 	}()
-	recordRedis := new(ReportViewRecord)
-	recordRedis.UserId = user.UserId
-	recordRedis.ReportId = articleId
-	recordRedis.Mobile = user.Mobile
-	recordRedis.Email = user.Email
-	recordRedis.RealName = user.RealName
-	recordRedis.CompanyName = user.CompanyName
-	recordRedis.CreateTime = time.Now()
-	go PushViewRecordNewRedisData(recordRedis, user.CompanyId)
+
 	uid := user.UserId
 	key := "CYGX_ARTICLE_" + strconv.Itoa(articleId) + "_" + strconv.Itoa(uid)
 	if !utils.Rc.IsExist(key) {
@@ -106,12 +98,23 @@ func ArticleHistoryStopTime(articleId, stopTime, outType int, user *models.WxUse
 		record.CompanyName = user.CompanyName
 		record.StopTime = stopTime
 		record.OutType = outType
-		record.Source = "WEB"
-		_, e := models.AddCygxArticleViewRecordNewpv(record)
+		record.Source = "MOBILE"
+		newId, e := models.AddCygxArticleViewRecordNewpv(record)
 		if e != nil {
 			err = errors.New("AddCygxArticleViewRecordNewpv, Err: " + e.Error())
 			return
 		}
+		recordRedis := new(ReportViewRecord)
+		recordRedis.UserId = user.UserId
+		recordRedis.ReportId = articleId
+		recordRedis.Mobile = user.Mobile
+		recordRedis.Email = user.Email
+		recordRedis.RealName = user.RealName
+		recordRedis.CompanyName = user.CompanyName
+		recordRedis.StopTime = stopTime
+		recordRedis.OutId = int(newId)
+		recordRedis.CreateTime = time.Now()
+		go PushViewRecordNewRedisData(recordRedis, user.CompanyId)
 		utils.Rc.Put(key, 1, 2*time.Second)
 	}
 	go ArticleHistoryUserLabelLogAdd(articleId, uid)

+ 2 - 0
services/banner.go

@@ -26,6 +26,7 @@ func GetBannerUrlBody(url string) (itemResp *models.BannerUrlResp) {
 	mapPath[2] = utils.WX_MSG_PATH_ARTICLE_DETAIL          //文章详情
 	mapPath[3] = utils.WX_MSG_PATH_ACTIVITY_DETAIL         //活动详情
 	mapPath[4] = utils.WX_MSG_PATH_INDUSTRY_DETAIL         //产业详情
+	mapPath[5] = utils.WX_MSG_PATH_ABOUT_US                //关于我们视频
 	mapPath[6] = utils.WX_MSG_PATH_PRODUCTINTERIOR_DETAIL  //产品内测
 	mapPath[7] = utils.WX_MSG_PATH_THIS_WEEK_DETAIL        //本周研究汇总
 	mapPath[8] = utils.WX_MSG_PATH_LAST_WEEK_DETAIL        //上周研究汇总
@@ -79,6 +80,7 @@ func GetBannerUrlBody(url string) (itemResp *models.BannerUrlResp) {
 		item.Type = 4
 	} else if strings.Contains(url, about) {
 		item.Type = 5
+		sourceId = 1 // 强制设置为正数前端跳转使用
 	} else if strings.Contains(url, internal) {
 		item.Type = 6
 	} else if strings.Contains(url, thisWeek) {

+ 59 - 0
services/company_permission.go

@@ -2,6 +2,7 @@ package services
 
 import (
 	"errors"
+	"fmt"
 	"hongze/hongze_cygx/models"
 	"hongze/hongze_cygx/utils"
 	"strings"
@@ -222,3 +223,61 @@ func GetUserHasPermissionActivity(user *models.WxUserItem, activityInfo *models.
 	}
 	return
 }
+
+// 根据公司ID获取权益销售名称
+func GetSellNameMapByCompanyIds(companyIds []int) (respMap map[int]string) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg("根据公司ID获取权益销售名称,失败:"+err.Error()+fmt.Sprint(companyIds), 2)
+		}
+	}()
+	lenarr := len(companyIds)
+	if lenarr == 0 {
+		return
+	}
+	var pars []interface{}
+	var condition string
+	respMap = make(map[int]string, 0)
+	condition = "  AND product_id = 2 "
+	list, e := models.GetCompanyProductList(condition, pars)
+	if e != nil {
+		err = errors.New("GetCompanyProductList, Err: " + e.Error())
+		return
+	}
+	for _, v := range list {
+		respMap[v.CompanyId] = v.SellerName
+	}
+	return
+}
+
+// 获取用户对应的权限简单版
+func GetUserHasPermissionSimple(user *models.WxUserItem) (hasPermission int, err error) {
+	//HasPermission int `description:"1:有该行业权限,正常展示,2:无该行业权限,不存在权益客户下(ficc),3:无该品类权限,已提交过申请,4:无该品类权限,未提交过申请,5:潜在客户,未提交过申请,6:潜在客户,已提交过申请"`
+	uid := user.UserId
+	applyCount, e := models.GetApplyRecordCount(uid)
+	if e != nil {
+		err = errors.New("GetCompanyPermissionUpgrade, Err: " + e.Error())
+		return
+	}
+	if user.CompanyId <= 1 {
+		if applyCount == 0 {
+			hasPermission = 5
+		} else {
+			hasPermission = 6
+		}
+	} else {
+		companyPermission, e := models.GetCompanyPermission(user.CompanyId)
+		if e != nil {
+			err = errors.New("GetCompanyPermission, Err: " + e.Error())
+			return
+		}
+		if companyPermission != "" {
+			hasPermission = 1
+		} else {
+			hasPermission = 3
+		}
+	}
+	return
+}

+ 4 - 4
services/industrial_management.go

@@ -299,10 +299,10 @@ func IndustryFllowWithTrack(industrialManagementId, count, uid int) (err error)
 	return err
 }
 
-func init() {
-	//IndustryFllowUserLabel(136, 16, 5660)
-	//UserLabelLogReduce()
-}
+//func init() {
+//IndustryFllowUserLabel(136, 16, 5660)
+//UserLabelLogReduce()
+//}
 
 // GetIndustryNewLabelMap 获取产业【新】标签Map
 func GetIndustryNewLabelMap(industryIds []int) (labelMap map[int]bool, err error) {

+ 2 - 1
services/task.go

@@ -126,7 +126,8 @@ func Task() {
 		task.AddTask("getArticleListByApi", getArticleListByApi)
 	}
 
-	go UserLabelLogReduce() // 处理用户标签的队列消息
+	go UserLabelLogReduce()              // 处理用户标签的队列消息
+	go YanXuanActivityPointsBillReduce() // 处理研选活动扣点
 	//GetCygxActivityAttendanceDetail()
 	//CreateIndexNameArticleHistory()
 	//AddAllArticleHistory()

+ 6 - 7
services/user_label.go

@@ -556,7 +556,7 @@ func CategoryFllowUserLabelLogReduce(log models.CygxUserLabelLogRedis) (err erro
 	defer func() {
 		if err != nil {
 			fmt.Println(err)
-			go utils.SendAlarmMsg("用户关注系列更新相关标签,处理Redis队列消息失败:"+err.Error(), 2)
+			go utils.SendAlarmMsg("用户关注系列更新相关标签,处理Redis队列消息失败:"+err.Error()+fmt.Sprint(log), 2)
 		}
 	}()
 	isFllow := log.IsFllow
@@ -735,7 +735,8 @@ func updateUserLabelByUserId(userId int) (err error) {
 			go utils.SendAlarmMsg("更新用户标签失败:"+err.Error()+"userId:"+strconv.Itoa(userId), 2)
 		}
 	}()
-	time.Sleep(1 * time.Second)
+	//加200毫秒的延迟
+	time.Sleep(200 * time.Millisecond)
 	var condition string
 	var pars []interface{}
 	condition = ` AND is_follow=1  AND  user_id = ?  `
@@ -909,7 +910,7 @@ func UpdateUserLabelWeight() (err error) {
 			items = append(items, item)
 			userLabel[fmt.Sprint("user_id{|}", user.UserId, "{|}source_id{|}", user.SourceId, "{|}source{|}", user.Source)] = true
 		}
-		userLabelWeight[fmt.Sprint("user_id{|}", user.UserId, "{|}label{|}", user.Label)]++
+		userLabelWeight[fmt.Sprint("user_id{|}", user.UserId, "{|}source_id{|}", user.SourceId, "{|}source{|}", user.Source)]++
 	}
 
 	//处理活动标签
@@ -929,7 +930,7 @@ func UpdateUserLabelWeight() (err error) {
 			items = append(items, item)
 			userLabel[fmt.Sprint("user_id{|}", user.UserId, "{|}source_id{|}", user.IndustrialManagementId, "{|}source{|}", 1)] = true
 		}
-		userLabelWeight[fmt.Sprint("user_id{|}", user.UserId, "{|}label{|}", user.Label)]++
+		userLabelWeight[fmt.Sprint("user_id{|}", user.UserId, "{|}source_id{|}", user.IndustrialManagementId, "{|}source{|}", 1)]++
 	}
 
 	//处理专项调研活动标签
@@ -949,10 +950,9 @@ func UpdateUserLabelWeight() (err error) {
 			items = append(items, item)
 			userLabel[fmt.Sprint("user_id{|}", user.UserId, "{|}source_id{|}", user.IndustrialManagementId, "{|}source{|}", 1)] = true
 		}
-		userLabelWeight[fmt.Sprint("user_id{|}", user.UserId, "{|}label{|}", user.Label)]++
+		userLabelWeight[fmt.Sprint("user_id{|}", user.UserId, "{|}source_id{|}", user.IndustrialManagementId, "{|}source{|}", 1)]++
 	}
 	var itemLimt []*models.CygxUserLabel
-	fmt.Println(len(items))
 	if len(items) > 0 {
 		for _, v := range items {
 			itemLimt = append(itemLimt, v)
@@ -984,7 +984,6 @@ func UpdateUserLabelWeight() (err error) {
 		err = errors.New("UpdateCygxUserLabelWeightAll" + e.Error())
 		return
 	}
-	fmt.Println(len(itemsUpdate))
 	e = models.UpdateCygxUserLabelMulti(itemsUpdate)
 	if e != nil {
 		err = errors.New("UpdateCygxUserLabelMulti" + e.Error())

+ 7 - 0
services/yidong.go

@@ -854,6 +854,11 @@ func YiDongSignAppointmentsForThird(cont context.Context) (err error) {
 		if len(listSignUp) == 0 {
 			continue
 		}
+		var companyIds []int
+		for _, vS := range listSignUp {
+			companyIds = append(companyIds, vS.CompanyId)
+		}
+		sellNameMap := GetSellNameMapByCompanyIds(companyIds)
 		for _, vS := range listSignUp {
 			if vS.SignupType == 1 {
 				outCallStatus = "1"
@@ -869,6 +874,7 @@ func YiDongSignAppointmentsForThird(cont context.Context) (err error) {
 				PersonName:        vS.RealName,
 				JoinRole:          "2",
 				CompanyName:       vS.CompanyName,
+				Extend1:           sellNameMap[vS.CompanyId],
 				OutCallStatus:     outCallStatus,
 			}
 			postData, e := json.Marshal(params)
@@ -929,6 +935,7 @@ type SignAppointmentsForThirdParam struct {
 	CompanyName       string `description:"公司名" json:"companyName"`
 	JoinRole          string `description:"1:嘉宾, 2:普通参会人员, 3:会议助理。不传默认取值2" json:"joinRole"`
 	OutCallStatus     string `description:"1:需要,0:不需要。不传取默认值0" json:"outCallStatus"`
+	Extend1           string `description:"对口销售" json:"extend1"`
 }
 
 type YiDongSignAppointmentsForThirdResp struct {

+ 16 - 14
utils/constants.go

@@ -12,6 +12,7 @@ const (
 	HlbFormatDateTime      = "2006-01-02_15:04:05.999" //完整时间格式
 	FormatDateTimeNoSecond = "2006-01-02 15:04"        //完整时间格式
 	FormatDateTimeUnSpace  = "20060102150405"          //完整时间格式
+	FormatDateTimeInit     = "0000-00-00 00:00:00"     //为空的初始化时间格式
 	PageSize15             = 15                        //列表页每页数据量
 	FormatYearDate         = "2006"                    //日期格式
 	PageSize5              = 5
@@ -123,6 +124,7 @@ const (
 const (
 	YI_DONG_ZHENG_TONG_YUN_TOKEN_KEY = "YI_DONG_ZHENG_TONG_YUN_TOKEN_KEY" //易董证通云的token,存Redis使用
 	CYGX_USER_KEY_LABEL              = "CYGX_USER_KEY_LABEL"              //查研观向用户标签
+	CYGX_YANXUAN_POINTS_KEY          = "CYGX_YANXUAN_POINTS_KEY"          //查研观向研选活动扣点KEY
 )
 
 const (
@@ -164,20 +166,20 @@ const (
 
 // 模板消息地址路由
 const (
-	WX_MSG_PATH_ARTICLE_DETAIL           = "pageMy/reportDetail/reportDetail?id="            //文章详情模板消息地址
-	WX_MSG_PATH_ACTIVITY_DETAIL          = "activityPages/activityDetail/activityDetail?id=" //活动模板消息地址
-	WX_MSG_PATH_ACTIVITY_SPECIAL_DETAIL  = "activityPages/specialDetail/specialDetail?id="   //专项调研活动模板消息地址
-	WX_MSG_PATH_ACTIVITY_INDUSTRYR_EPORT = "reportPages/IndustryReport/IndustryReport?id="   //产业文章列表模板消息地址
-
-	WX_MSG_PATH_AUTHOR_DETAIL          = "reportPages/authorPages/authorPages?id="                      //作者详情模板消息地址
-	WX_MSG_PATH_INDUSTRY_DETAIL        = "reportPages/IndustryReport/IndustryReport?id="                //产业详情模板消息地址
-	WX_MSG_PATH_PRODUCTINTERIOR_DETAIL = "reportPages/internalDetials/internalDetials?id="              //产品内测详情模板消息地址
-	WX_MSG_PATH_THIS_WEEK_DETAIL       = "reportPages/reportSecretDetail/reportSecretDetail?type=2&id=" //本周研究汇总详情模板消息地址
-	WX_MSG_PATH_LAST_WEEK_DETAIL       = "reportPages/reportSecretDetail/reportSecretDetail?type=3&id=" //上周纪要汇总详情模板消息地址
-	WX_MSG_PATH_KEY_COMPANY_DETAIL     = "reportPages/keyCompany/keyCompany"                            //重点公司详情模板消息地址
-	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_ARTICLE_DETAIL           = "pageMy/reportDetail/reportDetail?id="                         //文章详情模板消息地址
+	WX_MSG_PATH_ACTIVITY_DETAIL          = "activityPages/activityDetail/activityDetail?id="              //活动模板消息地址
+	WX_MSG_PATH_ACTIVITY_SPECIAL_DETAIL  = "activityPages/specialDetail/specialDetail?id="                //专项调研活动模板消息地址
+	WX_MSG_PATH_ACTIVITY_INDUSTRYR_EPORT = "reportPages/IndustryReport/IndustryReport?id="                //产业文章列表模板消息地址
+	WX_MSG_PATH_ABOUT_US                 = "pageMy/followUs/followUs"                                     //关于我们页面路径
+	WX_MSG_PATH_AUTHOR_DETAIL            = "reportPages/authorPages/authorPages?id="                      //作者详情模板消息地址
+	WX_MSG_PATH_INDUSTRY_DETAIL          = "reportPages/IndustryReport/IndustryReport?id="                //产业详情模板消息地址
+	WX_MSG_PATH_PRODUCTINTERIOR_DETAIL   = "reportPages/internalDetials/internalDetials?id="              //产品内测详情模板消息地址
+	WX_MSG_PATH_THIS_WEEK_DETAIL         = "reportPages/reportSecretDetail/reportSecretDetail?type=2&id=" //本周研究汇总详情模板消息地址
+	WX_MSG_PATH_LAST_WEEK_DETAIL         = "reportPages/reportSecretDetail/reportSecretDetail?type=3&id=" //上周纪要汇总详情模板消息地址
+	WX_MSG_PATH_KEY_COMPANY_DETAIL       = "reportPages/keyCompany/keyCompany"                            //重点公司详情模板消息地址
+	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="                          //潜在用户试用权限申请
 )
 
 //2:文章详情  https://web.hzinsights.com/material/info/8436  小程序路径:/pageMy/reportDetail/reportDetail?id=