浏览代码

Merge branch 'master' of http://8.136.199.33:3000/hongze/hongze_cygx into cygx_8.7

xingzai 2 年之前
父节点
当前提交
9f5e37208f

+ 143 - 193
controllers/activity.go

@@ -492,7 +492,8 @@ func (this *ActivityCoAntroller) ScheduleList() {
 		if source == 1 {
 			condition += ` AND art.yidong_activity_id = '' `
 		}
-		listOther, errList := models.GetScheduleList(condition, pars, uid, startSize, pageSize)
+		//listOther, errList := models.GetScheduleList(condition, pars, uid, startSize, pageSize)
+		listOther, errList := services.GetScheduleAndSpecilList(user, condition, startSize, pageSize)
 		if errList != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取失败,Err:" + errList.Error()
@@ -505,7 +506,8 @@ func (this *ActivityCoAntroller) ScheduleList() {
 		}
 	} else {
 		condition += ` AND art.active_state IN(1,3)` //全部都不是进行中的活动
-		listOther, errList := models.GetScheduleList(condition, pars, uid, startSize, pageSize)
+		//listOther, errList := models.GetScheduleList(condition, pars, uid, startSize, pageSize)
+		listOther, errList := services.GetScheduleAndSpecilList(user, condition, startSize, pageSize)
 		list = listOther
 		if errList != nil {
 			br.Msg = "获取失败"
@@ -1049,7 +1051,7 @@ func (this *ActivityCoAntroller) Detail() {
 			}
 		}
 		//8.5 买方研选的活动去掉限免标签
-		if strings.Contains(activityInfo.ChartPermissionName, "研选"){
+		if strings.Contains(activityInfo.ChartPermissionName, "研选") {
 			activityInfo.IsShowSustainable = false
 		}
 		//处理按钮是否展示问题
@@ -1279,6 +1281,7 @@ func (this *ActivityCoAntroller) SignupAdd() {
 				resp.SignupType = signupType
 				resp.SignupStatus = signupStatus
 				resp.HasPermission = hasPermission
+				resp.PopupMsg = "活动开始前1小时内无法预约,请联系对口销售处理"
 				br.Ret = 200
 				br.Success = true
 				br.Msg = ""
@@ -1305,6 +1308,7 @@ func (this *ActivityCoAntroller) SignupAdd() {
 				}
 				if totalRestrict >= 1 {
 					signupStatus = "BreakPromise"
+					resp.PopupMsg = "由于爽约次数过多,您暂时被限制报名资格"
 					item.FailType = 3
 				}
 				totalSignupCompany, err := models.GetActivitySignupCompanyCount(activityId, user.CompanyId)
@@ -1315,6 +1319,7 @@ func (this *ActivityCoAntroller) SignupAdd() {
 				}
 				if totalSignupCompany >= 2 {
 					signupStatus = "TwoPeople"
+					resp.PopupMsg = "单机构最多2人报名同一活动,您所在机构报名人数已满"
 					item.FailType = 2
 				}
 				totaSignupPeopleNum, err := models.GetActivitySignupSuccessCount(activityId)
@@ -1325,6 +1330,7 @@ func (this *ActivityCoAntroller) SignupAdd() {
 				}
 				if totaSignupPeopleNum >= activityInfo.LimitPeopleNum {
 					signupStatus = "FullStarffed"
+					resp.PopupMsg = "此活动报名人数已满,请留意下期活动"
 					item.FailType = 1
 				}
 				totalUserRestrictCount, err := models.GetActivitySignupByUserRestrictCount(uid, activityId)
@@ -1465,10 +1471,11 @@ func (this *ActivityCoAntroller) SignupAdd() {
 				//1:预约外呼 、2:设置会议提醒 、 3:预约纪要 、4:活动报名
 				if signupType == 1 {
 					go services.ActivityUserRemind(user, activityInfo, 1)
+					resp.PopupMsg = item.CountryCode + "-" + item.Mobile + "<br/>预约成功,已加入您的活动日程<br/><br/>想要及时获取活动时间变更通知,请关注【查研观向小助手】公众号"
 				} else {
 					go services.ActivityUserRemind(user, activityInfo, 4)
+					resp.PopupMsg = "报名成功,已加入您的活动日程<br/><br/>想要及时获取活动时间变更通知,请关注【查研观向小助手】公众号"
 				}
-
 			}
 		} else {
 			if companyItem.ProductId == 2 {
@@ -2024,6 +2031,7 @@ func (this *ActivityCoAntroller) MeetingReminderAdd() {
 	br.Success = true
 	if hasPermission == 1 {
 		br.Msg = "设置成功,会前15分钟会为您推送微信消息提醒"
+		resp.PopupMsg = "设置成功,会前15分钟会为您推送微信消息提醒<br/><br/>请关注【查研观向小助手】公众号,以获取微信消息提醒"
 	}
 	br.Data = resp
 }
@@ -2571,8 +2579,6 @@ func (this *ActivityCoAntroller) ActivityListNew() {
 		return
 	}
 
-
-
 	var conditionOrder string
 	if activeState == "2" || activeState == "3" {
 		conditionOrder = ` ORDER BY art.activity_time DESC  `
@@ -2999,6 +3005,9 @@ func (this *ActivityCoAntroller) CheckAsk() {
 // @Param   ActivityTypeIds   query   string  false     "活动类型id 多个用 , 隔开"
 // @Param   ActiveState   query   string  false       "活动进行状态 未开始:1、进行中2、已结束3"
 // @Param   WhichDay   query   string  false       "哪一天 今天:1、明天:2,多个用 , 隔开"
+// @Param   WhichWeek   query   string  false       "哪一周 本周:1 上周:2"
+// @Param   WhichMonth   query   string  false       "哪一月 本月:1 上月:2"
+// @Param   WhichMonth   query   string  false       "哪一月 本月:1 上月:2"
 // @Param   IsPower   query   int  false       "是否选择有权限行业 ,1是 0 否 默认0"
 // @Success 200 {object} models.ActivityTypeListHomeResp
 // @router /labelTypeListV5 [get]
@@ -3076,12 +3085,12 @@ func (this *ActivityCoAntroller) LabelTypeListV5() {
 		return
 	}
 	//判断客户规模是否属于可见范围的活动
-	companyProduct, err := models.GetCompanyProductDetail(user.CompanyId, 2)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		br.Msg = "获取信息失败"
-		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
@@ -3120,11 +3129,7 @@ func (this *ActivityCoAntroller) LabelTypeListV5() {
 
 	//查询专项产业调研展示权限 仅对大套餐客户跟永续客户展示
 	if whichDay == "" {
-		var scale string
-		if companyProduct != nil {
-			scale = companyProduct.Scale
-		}
-		speciaItem, err := services.GetActivityLabelSpecialList(userType, isPower, chartPermissionIds, scale, permissionNameStr)
+		speciaItem, err := services.GetActivityLabelSpecialList(user, isPower, chartPermissionIds, permissionNameStr)
 		if err != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取失败,Err:" + err.Error()
@@ -3670,22 +3675,6 @@ func (this *ActivityCoAntroller) SpecialSignupAdd() {
 		return
 	}
 	activityId := req.ActivityId
-	hasPermission := 0
-	//判断是否已经申请过
-	applyCount, err := models.GetApplyRecordCount(uid)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		br.Msg = "获取信息失败"
-		br.ErrMsg = "判断是否已申请过试用失败,Err:" + err.Error()
-		return
-	}
-	//获取FICC销售信息
-	sellerItem, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 1)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		br.Msg = "申请失败"
-		br.ErrMsg = "获取销售信息失败,Err:" + err.Error()
-		return
-	}
-
 	activityInfo, errInfo := models.GetCygxActivitySpecialDetail(activityId)
 	if activityInfo == nil {
 		br.Msg = "操作失败"
@@ -3697,143 +3686,22 @@ func (this *ActivityCoAntroller) SpecialSignupAdd() {
 		br.ErrMsg = "操作失败,Err:" + errInfo.Error()
 		return
 	}
-	//HasPermission "1:有该行业权限,正常展示,2:无该行业权限,3:潜在客户,未提交过申请,4:潜在客户,已提交过申请"`
-	//var companyDetailStatus string
-	if user.CompanyId > 1 {
-		companyPermission, err := models.GetCompanyPermission(user.CompanyId)
-		if err != nil {
-			br.Msg = "获取信息失败"
-			br.ErrMsg = "获取客户详情失败,Err:" + err.Error()
-			return
-		}
-		if companyPermission == "" {
-			if applyCount > 0 {
-				hasPermission = 4
-			} else {
-				if sellerItem != nil {
-					hasPermission = 5
-				} else {
-					//获取权益销售信息 如果是FICC的客户类型,则默认他申请过
-					sellerItemQy, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
-					if err != nil && err.Error() != utils.ErrNoRow() {
-						br.Msg = "获取信息失败"
-						br.ErrMsg = "获取销售信息失败,Err:" + err.Error()
-						return
-					}
-					if sellerItemQy != nil {
-						hasPermission = 2
-						resp.SellerMobile = sellerItemQy.Mobile
-						resp.SellerName = sellerItemQy.RealName
-					} else {
-						hasPermission = 3
-					}
-				}
-			}
-			resp.HasPermission = hasPermission
-			resp.ActivityId = activityId
-			resp.PopupMsg = "您暂无权限参加此活动,若想参加可以申请开通对应的试用权限"
-			br.Ret = 200
-			br.Success = true
-			br.Msg = "获取成功"
-			br.Data = resp
-			return
-		}
-		companyDetail, err := models.GetCompanyDetailById(user.CompanyId)
-		if err != nil {
-			br.Msg = "获取信息失败!"
-			br.ErrMsg = "获取客户详情失败,Err:" + err.Error()
-			return
-		}
-		if companyDetail == nil {
-			br.Msg = "获取信息失败!"
-			br.ErrMsg = "客户不存在,uid:" + strconv.Itoa(user.UserId) + "CompanyId:" + strconv.Itoa(user.CompanyId)
-			return
-		}
-	}
-	var userType int
-	var permissionStr string
-	userType, permissionStr, err = services.GetUserType(user.CompanyId)
+	havePower, err := services.GetSpecialDetailUserPower(user, activityInfo)
 	if err != nil {
-		br.Msg = "获取信息失败!"
-		br.ErrMsg = "获取失败,Err:" + err.Error()
-		return
-	}
-	if userType == 1 && strings.Contains(activityInfo.ChartPermissionName, "研选") {
-		br.Msg = "您暂无查看该活动权限"
-		br.ErrMsg = "被分享客户不可见,永续客户无法查看研选行业"
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "判断是否已申请过试用失败,Err:" + err.Error()
 		return
 	}
-
-	if user.CompanyId > 1 {
-		companyItem, err := models.GetCompanyDetailById(user.CompanyId)
-		//冻结客户
-		if err != nil {
-			if err.Error() == utils.ErrNoRow() {
-				if applyCount > 0 {
-					hasPermission = 4
-				} else {
-					if sellerItem != nil {
-						hasPermission = 5
-					} else {
-						hasPermission = 3
-					}
-				}
-				resp.ActivityId = activityId
-				resp.HasPermission = hasPermission
-				resp.PopupMsg = "您暂无权限参加此活动,若想参加可以申请开通对应的试用权限"
-				br.Ret = 200
-				br.Success = true
-				br.Msg = "获取成功"
-				br.Data = resp
-				return
-			} else {
-				br.Msg = "获取信息失败"
-				br.ErrMsg = "获取客户公司信息失败,Err:" + err.Error()
-				return
-			}
-		}
-		//判断是否有权限
-		var havePower bool
-		if strings.Contains(permissionStr, activityInfo.ActivityTypeName) {
-			havePower = true
-		}
-		if havePower {
-			hasPermission = 1
-		} else {
-			if companyItem.ProductId == 2 {
-				hasPermission = 2
-				resp.SellerMobile = companyItem.Mobile
-				resp.SellerName = companyItem.SellerName
-				if permissionStr == "专家" {
-					resp.PopupMsg = "您暂无权限参加【" + activityInfo.ActivityTypeName + "】类型活动,若想参加请联系对口销售--" + companyItem.SellerName + ":" + companyItem.Mobile
-				} else {
-					resp.PopupMsg = "您暂无权限参加【" + activityInfo.ChartPermissionName + "】行业活动,若想参加请联系对口销售--" + companyItem.SellerName + ":" + companyItem.Mobile
-				}
-			} else {
-				hasPermission = 5
-			}
-		}
-	} else { //潜在客户
-		if applyCount > 0 {
-			hasPermission = 4
-		} else {
-			if sellerItem != nil {
-				hasPermission = 5
-			} else {
-				hasPermission = 3
-			}
-		}
-		resp.PopupMsg = "您暂无权限参加此活动,若想参加可以申请开通对应的试用权限"
-	}
-	resp.HasPermission = hasPermission
-	resp.ActivityId = activityId
-	if hasPermission == 1 {
+	//判断有没有对应的权限,如果没有则给出对应的状态码
+	if havePower {
+		resp.HasPermission = 1
 		total, err := models.GetUserCygxActivitySpecialSignup(user.UserId, activityId)
 		if err != nil {
 			br.Msg = "获取信息失败"
 			br.ErrMsg = "获取日程数量信息失败,Err:" + err.Error()
 			return
 		}
+		resp.SignupStatus = 1
 		//判断是删除还是添加
 		if total == 0 {
 			//获取销售信息
@@ -3862,8 +3730,9 @@ func (this *ActivityCoAntroller) SpecialSignupAdd() {
 				return
 			}
 			resp.Status = 1
-
-			////给所属销售发送消息
+			resp.PopupMsg = "感谢反馈"
+			resp.PopupMsg2 = "此调研具体行程尚未确认,待预报名人数满10人后弘则会确定行程并推送给您活动日期,只有在确认行程中再次报名才完成占位。"
+			//给所属销售发送消息
 			if sellerItem.Mobile != "" {
 				openIpItem, _ := models.GetUserRecordByMobile(4, sellerItem.Mobile)
 				if openIpItem != nil && openIpItem.OpenId != "" {
@@ -3873,20 +3742,25 @@ func (this *ActivityCoAntroller) SpecialSignupAdd() {
 				}
 			}
 			// 给芳姐发消息
-			cnf, _ := models.GetConfigByCode("tpl_msg")
-			if cnf != nil {
-				openIpItem, _ := models.GetUserRecordByMobile(4, cnf.ConfigValue)
-				if openIpItem != nil && openIpItem.OpenId != "" {
-					actList, _ := models.GetActivityListSpecialAll(activityId)
-					if len(actList) == 5 {
-						var companyName string
-						for _, v := range actList {
-							companyName += "【" + v.CompanyName + "】"
-						}
-						go services.SendSpecialTemplateMsg(companyName, "", "", activityInfo.ResearchTheme, "", openIpItem)
-					}
-				}
+			//cnf, _ := models.GetConfigByCode("tpl_msg")
+			actList, _ := models.GetActivityListSpecialByActivityId(activityId)
+			//if cnf != nil {
+			//	openIpItem, _ := models.GetUserRecordByMobile(4, cnf.ConfigValue)
+			//	if openIpItem != nil && openIpItem.OpenId != "" {
+			//		if len(actList) == 5 {
+			//			var companyName string
+			//			for _, v := range actList {
+			//				companyName += "【" + v.CompanyName + "】"
+			//			}
+			//			go services.SendSpecialTemplateMsg(companyName, "", "", activityInfo.ResearchTheme, "", openIpItem)
+			//		}
+			//	}
+			//}
+			//感兴趣人数到达10人时,模板消息发送给活动负责人
+			if len(actList) == 10 {
+				go services.SendWxMsgActivitySpecial10(activityInfo)
 			}
+
 			//用户专项调研操作行为,模板消息推送
 			go services.SpecialActivityUserRemind(user, activityInfo, 1)
 		} else {
@@ -3898,7 +3772,19 @@ func (this *ActivityCoAntroller) SpecialSignupAdd() {
 			}
 			resp.Status = 2
 		}
+	} else {
+		hasPermission, sellerName, sellerMobile, popupMsg, err := services.GetUserHasPermission(user)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "判断是否已申请过试用失败,Err:" + err.Error()
+			return
+		}
+		resp.PopupMsg = popupMsg
+		resp.HasPermission = hasPermission
+		resp.SellerName = sellerName
+		resp.SellerMobile = sellerMobile
 	}
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"
@@ -4054,12 +3940,12 @@ func (this *ActivityCoAntroller) LabelTypeListV6Pc() {
 		return
 	}
 	//判断客户规模是否属于可见范围的活动
-	companyProduct, err := models.GetCompanyProductDetail(user.CompanyId, 2)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		br.Msg = "获取信息失败"
-		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
+	//}
 	var sqlExport string
 	//处理专家权限的查询
 	sqlExport = ` AND (art.customer_type_ids LIKE '%` + strconv.Itoa(userType) + `%' `
@@ -4104,11 +3990,11 @@ func (this *ActivityCoAntroller) LabelTypeListV6Pc() {
 
 	if whichDay == "" {
 		//查询专项产业调研展示权限
-		var scale string
-		if companyProduct != nil {
-			scale = companyProduct.Scale
-		}
-		speciaItem, err := services.GetActivityLabelSpecialList(userType, isPower, chartPermissionIds, scale, permissionNameStr)
+		//var scale string
+		//if companyProduct != nil {
+		//	scale = companyProduct.Scale
+		//}
+		speciaItem, err := services.GetActivityLabelSpecialList(user, isPower, chartPermissionIds, permissionNameStr)
 		if err != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取失败,Err:" + err.Error()
@@ -4450,6 +4336,7 @@ func (this *ActivityCoAntroller) ActivityAppointmentAdd() {
 	br.Success = true
 	if hasPermission == 1 {
 		br.Msg = "请关注【查研观向小助手】公众号,若有调研纪要发布/更新,将及时为您推送微信消息"
+		resp.PopupMsg = "会议纪要预约成功<br/><br/>请关注【查研观向小助手】公众号,若有调研纪要发布/更新,将及时为您推送微信消息"
 	}
 	br.Data = resp
 }
@@ -4700,6 +4587,70 @@ func (this *ActivityCoAntroller) ActivityVideoHistoryAdd() {
 	return
 }
 
+// @Title 活动、专项调研搜索
+// @Description 活动、专项调研搜索接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   KeyWord   query   string  false       "搜索关键词 多个用 , 隔开"
+// @Success 200 {object} models.GetCygxActivityListRep
+// @router /listSearch [get]
+func (this *ActivityCoAntroller) ActivityListSearch() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	user := this.User
+	if user == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		return
+	}
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	source, _ := this.GetInt("Source")
+	keyWord := this.GetString("KeyWord")
+	playBack, _ := this.GetInt("PlayBack")
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+	var condition string
+	//活动可见限制
+	conditionActivity, err := services.GetActivityonditionList(user, "", "", "", "", "", 0, 1, keyWord, playBack)
+	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
+	list, total, err := services.GetActivitySpecialSearcheList(user, condition, startSize, pageSize, keyWord)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp := new(models.GetCygxActivityListRep)
+	//添加活动搜索记录
+	if keyWord != "" {
+		go services.AddActivitykeyWordSearch(keyWord, user)
+	}
+	resp.Paging = page
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
 // @Title 已结束的活动
 // @Description 获取已结束的活动接口
 // @Param   ChartPermissionIds   query   string  false     "行业id 多个用 , 隔开"
@@ -4724,7 +4675,7 @@ func (this *ActivityCoAntroller) OverActivityList() {
 	isPower, _ := this.GetInt("IsPower")
 	chartPermissionIds := this.GetString("ChartPermissionIds")
 	whichDay := this.GetString("WhichDay")
-	fmt.Println("whichDay:",whichDay)
+	fmt.Println("whichDay:", whichDay)
 	typeName := this.GetString("TypeName")
 
 	//入参为 undefined 时的处理
@@ -4735,7 +4686,6 @@ func (this *ActivityCoAntroller) OverActivityList() {
 		whichDay = ""
 	}
 
-
 	userType, permissionStr, err := services.GetUserType(user.CompanyId)
 	if err != nil {
 		br.Msg = "获取失败"
@@ -4843,7 +4793,7 @@ func (this *ActivityCoAntroller) OverActivityList() {
 		} else if whichDay == "4" {
 			startDate = utils.GetLastWeekMonday().Format(utils.FormatDate)
 			endDate = utils.GetLastWeekSunday().Format(utils.FormatDate)
-		}  else if whichDay == "5" {
+		} else if whichDay == "5" {
 			startDate = utils.GetNowMonthFirstDay().Format(utils.FormatDate)
 			endDate = utils.GetNowMonthLastDay().Format(utils.FormatDate)
 		} else if whichDay == "6" {
@@ -4865,11 +4815,11 @@ func (this *ActivityCoAntroller) OverActivityList() {
 	if len(chartPermissionIds) > 0 {
 		condition += ` AND art.chart_permission_id  IN (` + chartPermissionIds + `)`
 	}
-	if typeName != ""{
+	if typeName != "" {
 		typeSlice := strings.Split(typeName, ",")
 		tempCondition := ""
 		for _, s := range typeSlice {
-			if s == "1"{
+			if s == "1" {
 				tempCondition += "'专家电话会',"
 			} else if s == "2" {
 				tempCondition += "'分析师电话会',"
@@ -4913,4 +4863,4 @@ func (this *ActivityCoAntroller) OverActivityList() {
 	br.Success = true
 	br.Msg = "获取成功"
 	br.Data = resp
-}
+}

+ 348 - 0
controllers/activity_special.go

@@ -0,0 +1,348 @@
+package controllers
+
+import (
+	"encoding/json"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/services"
+	"hongze/hongze_cygx/utils"
+	"strconv"
+	"time"
+)
+
+//专项调研活动
+type ActivitySpecialCoAntroller struct {
+	BaseAuthController
+}
+
+// @Title 专项产业调研列表
+// @Description 获取专项产业调研列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Success 200 {object} models.GetCygxActivitySpecialDetailListResp
+// @router /list [get]
+func (this *ActivitySpecialCoAntroller) SpecialList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	user := this.User
+	if user == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		return
+	}
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	list, total, errList := services.GetActivitySpecialList(user, currentIndex, pageSize, "")
+	if errList != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + errList.Error()
+		return
+	}
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp := new(models.GetCygxActivitySpecialDetailListResp)
+	count, err := models.GetCygxUserFollowSpecial(user.UserId)
+	if err != nil {
+		br.Msg = "获取数据失败!"
+		br.ErrMsg = "获取客户详情失败,Err:" + err.Error()
+		return
+	}
+	if count == 1 && user.UserId > 0 {
+		resp.IsFollow = true
+	}
+	if user.Mobile != "" {
+		resp.IsBindingMobile = true
+	}
+	resp.List = list
+	resp.Paging = page
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title  专项产业调研详情
+// @Description 获取专项产业调研详情接口
+// @Param   ActivityId   query   int  true       "活动ID"
+// @Success Ret=200 {object} models.CygxActivitySpecialResp
+// @router /detail [get]
+func (this *ActivitySpecialCoAntroller) SpecialDetail() {
+	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
+	}
+	uid := user.UserId
+	activityId, _ := this.GetInt("ActivityId")
+	if activityId < 1 {
+		br.Msg = "请输入活动ID"
+		return
+	}
+	resp := new(models.CygxActivitySpecialResp)
+	activityInfo, err := models.GetCygxActivitySpecialDetailById(uid, activityId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "活动ID错误,Err:" + "activityId:" + strconv.Itoa(activityId)
+		return
+	}
+	if activityInfo == nil {
+		br.Msg = "活动不存在"
+		br.ErrMsg = "活动ID错误,Err:" + "activityId:" + strconv.Itoa(activityId)
+		return
+	}
+	havePower, err := services.GetSpecialDetailUserPower(user, activityInfo)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "判断是否已申请过试用失败,Err:" + err.Error()
+		return
+	}
+	//判断有没有对应的权限,如果没有则给出对应的状态码
+	if havePower {
+		resp.HasPermission = 1
+		count, err := models.GetCygxUserFollowSpecial(user.UserId)
+		if err != nil {
+			br.Msg = "获取数据失败!"
+			br.ErrMsg = "获取客户详情失败,Err:" + err.Error()
+			return
+		}
+		if count == 1 {
+			resp.IsFollow = true
+		}
+		activityInfo, err := services.HandleActivitySpecialShow(activityInfo, user)
+		if err != nil {
+			br.Msg = "获取数据失败!"
+			br.ErrMsg = "HandleActivitySpecialShow,Err:" + err.Error()
+			return
+		}
+		var condition string
+		var pars []interface{}
+
+		condition += ` AND t.activity_id =  ? AND t.is_cancel = 0 `
+		pars = append(pars, activityInfo.ActivityId)
+
+		tripTota, err := models.GetActivitySpecialTripCountByActivityId(condition, pars)
+		if err != nil {
+			br.Msg = "获取数据失败!"
+			br.ErrMsg = "GetActivitySpecialTripCountByActivityId,Err:" + err.Error()
+			return
+		}
+		activityInfo.TripNum = tripTota
+		activityInfo.ActivityTypeName = "专项调研"
+		resp.Detail = activityInfo
+		resp.Detail = activityInfo
+	} else {
+		hasPermission, sellerName, sellerMobile, popupMsg, err := services.GetUserHasPermission(user)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "判断是否已申请过试用失败,Err:" + err.Error()
+			return
+		}
+		resp.PopupMsg = popupMsg
+		resp.HasPermission = hasPermission
+		resp.SellerName = sellerName
+		resp.SellerMobile = sellerMobile
+	}
+	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.SignupSpecialStatus
+// @router /add [post]
+func (this *ActivitySpecialCoAntroller) SpecialTripAdd() {
+	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
+	}
+	uid := user.UserId
+	var req models.ActivityIdRep
+	resp := new(models.SignupSpecialStatus)
+	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.GetCygxActivitySpecialDetail(activityId)
+	if activityInfo == nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "活动ID错误,不存在activityId:" + strconv.Itoa(activityId)
+		return
+	}
+	if errInfo != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "操作失败,Err:" + errInfo.Error()
+		return
+	}
+
+	havePower, err := services.GetSpecialDetailUserPower(user, activityInfo)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "判断是否已申请过试用失败,Err:" + err.Error()
+		return
+	}
+
+	//判断有没有对应的权限,如果没有则给出对应的状态码
+	if havePower {
+		resp.HasPermission = 1
+		signupStatus, popupMsg, popupMsg2, err := services.SpecialTripPopupMsg(activityInfo, user)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "SpecialTripPopupMsg,Err:" + err.Error()
+			return
+		}
+		resp.PopupMsg = popupMsg
+		resp.PopupMsg2 = popupMsg2
+		resp.SignupStatus = signupStatus
+
+		if signupStatus == 1 {
+			total, err := models.GetUserActivitySpecialTripCount(user.UserId, activityId)
+			if err != nil {
+				br.Msg = "获取信息失败"
+				br.ErrMsg = "获取日程数量信息失败,Err:" + err.Error()
+				return
+			}
+			//判断是删除还是添加
+			if total == 0 {
+				//获取销售信息
+				sellerItem, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+				if err != nil {
+					br.Msg = "操作失败"
+					br.ErrMsg = "获取销售信息失败,Err:" + err.Error()
+					return
+				}
+				item := new(models.CygxActivitySpecialTrip)
+				item.UserId = uid
+				item.RealName = user.RealName
+				item.ActivityId = activityId
+				item.CreateTime = time.Now()
+				item.Mobile = user.Mobile
+				item.Email = user.Email
+				item.CompanyId = user.CompanyId
+				item.CompanyName = user.CompanyName
+				item.IsValid = 1
+				if sellerItem != nil {
+					item.SellerName = sellerItem.RealName
+				}
+				err = models.AddCygxActivitySpecialTrip(item)
+				if err != nil {
+					br.Msg = "操作失败"
+					br.ErrMsg = "操作失败,Err:" + err.Error()
+					return
+				}
+				//SignupStatus  int    `description:"返回状态:1:成功 、2 :人数已满 、3:调研次数已用完、 4:超时"`
+			} else {
+				updateParams := make(map[string]interface{})
+				updateParams["IsValid"] = 1
+				updateParams["CreateTime"] = time.Now()
+				updateParams["IsCancel"] = 0
+				whereParam := map[string]interface{}{"user_id": user.UserId, "activity_id": activityId}
+				err = models.UpdateByExpr(models.CygxActivitySpecialTrip{}, whereParam, updateParams)
+				if err != nil {
+					br.Msg = "报名失败,"
+					br.ErrMsg = "二次报名,更改报名是否有效状态失败,Err:" + err.Error()
+					return
+				}
+			}
+		}
+	} else {
+		hasPermission, sellerName, sellerMobile, popupMsg, err := services.GetUserHasPermission(user)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "判断是否已申请过试用失败,Err:" + err.Error()
+			return
+		}
+		resp.PopupMsg = popupMsg
+		resp.HasPermission = hasPermission
+		resp.SellerName = sellerName
+		resp.SellerMobile = sellerMobile
+	}
+	resp.ActivityId = activityId
+	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 /trip/cancel [post]
+func (this *ActivitySpecialCoAntroller) Tripcancel() {
+	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
+	}
+	uid := user.UserId
+	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.GetCygxActivitySpecialDetailById(uid, 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
+	}
+	resultTime := utils.StrTimeToTime(activityInfo.ActivityTime)
+	//48小时之内的取消也扣除一次参会记录
+	var isValid int
+	if time.Now().Add(+time.Hour * 48).After(resultTime) {
+		isValid = 1
+	}
+	err = models.CancelActivitySpecialTripIsValid(isValid, activityInfo.ActivityId, uid)
+	if err != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "CancelActivitySpecialTrip,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "已取消"
+}

+ 43 - 23
controllers/article.go

@@ -65,7 +65,6 @@ func (this *ArticleController) Detail() {
 	}
 	detail := new(models.ArticleDetail)
 	hasPermission := 0
-	hasFree := 0
 	var haveResearch bool
 	//判断是否已经申请过
 	applyCount, err := models.GetApplyRecordCount(uid)
@@ -74,20 +73,57 @@ func (this *ArticleController) Detail() {
 		br.ErrMsg = "判断是否已申请过试用失败,Err:" + err.Error()
 		return
 	}
-	//`description:"1:有该行业权限,正常展示,2:无该行业权限,不存在权益客户下,3:无该品类权限,4:潜在客户,未提交过申请,5:潜在客户,已提交过申请"`
-	if user.CompanyId > 1 {
-		companyPermission, err := models.GetCompanyPermission(user.CompanyId)
+	resp := new(models.ArticleDetailResp)
+	detail, err = models.GetArticleDetailById(articleId)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取信息失败,Err:" + err.Error()
+		return
+	}
+	//是否属于专项调研报告
+	if detail.SubCategoryName == "专项调研" {
+		detail.IsSpecialArticle = true
+		havePower, err := services.GetSpecialArticleDetailUserPower(user, detail)
 		if err != nil {
 			br.Msg = "获取信息失败"
-			br.ErrMsg = "判断是否已申请访谈失败,Err:" + strconv.Itoa(uid) + ";articleId" + strconv.Itoa(articleId)
+			br.ErrMsg = "判断是否已申请过试用失败,Err:" + err.Error()
 			return
 		}
-		detail, err = models.GetArticleDetailById(articleId)
+		resp.IsSpecialArticle = true
+		if !havePower {
+			hasPermission, sellerName, sellerMobile, popupMsg, err := services.GetUserHasPermissionArticle(user)
+			if err != nil {
+				br.Msg = "获取信息失败"
+				br.ErrMsg = "判断是否已申请过试用失败,Err:" + err.Error()
+				return
+			}
+			resp.PopupMsg = popupMsg
+			resp.HasPermission = hasPermission
+			resp.SellerName = sellerName
+			resp.SellerMobile = sellerMobile
+			detail.Body = ""
+			detail.Abstract = ""
+			detail.BodyText = ""
+			detail.SellerName = sellerName
+			detail.SellerMobile = sellerMobile
+			resp.Detail = detail
+			br.Ret = 200
+			br.Success = true
+			br.Msg = "获取成功"
+			br.Data = resp
+			return
+		}
+	}
+	//`description:"1:有该行业权限,正常展示,2:无该行业权限,不存在权益客户下,3:无该品类权限,4:潜在客户,未提交过申请,5:潜在客户,已提交过申请"`
+	if user.CompanyId > 1 {
+		companyPermission, err := models.GetCompanyPermission(user.CompanyId)
 		if err != nil {
 			br.Msg = "获取信息失败"
-			br.ErrMsg = "获取信息失败,Err:" + err.Error()
+			br.ErrMsg = "判断是否已申请访谈失败,Err:" + strconv.Itoa(uid) + ";articleId" + strconv.Itoa(articleId)
 			return
 		}
+
+		detail.PublishDate = utils.TimeRemoveHms(detail.PublishDate)
 		detail.Body = html.UnescapeString(detail.Body)
 		detail.Body = strings.Replace(detail.Body, "<p data-f-id=\"pbf\" style=\"text-align: center; font-size: 14px; margin-top: 30px; opacity: 0.65; font-family: sans-serif;\">Powered by <a href=\"https://www.froala.com/wysiwyg-editor?pb=1\" title=\"Froala Editor\">Froala Editor</a></p>", "", -1)
 		detail.Body = strings.Replace(detail.Body, "pre", "div", -1)
@@ -99,10 +135,8 @@ func (this *ArticleController) Detail() {
 			} else {
 				hasPermission = 2
 			}
-			hasFree = 2
 			goto Loop
 		} else {
-			hasFree = 1
 			var articlePermissionPermissionName string
 			if detail.CategoryId > 0 {
 				articlePermission, err := models.GetArticlePermission(detail.CategoryId)
@@ -140,16 +174,13 @@ func (this *ArticleController) Detail() {
 			if userType == 1 && strings.Contains(detail.CategoryName, "研选") {
 				hasPersion = false
 			}
-
 			if detail.IsReport == 1 {
-				fmt.Println("报告权限")
 				detailCategory, err := models.GetdetailByCategoryIdSando(detail.CategoryId)
 				if err != nil && err.Error() != utils.ErrNoRow() {
 					br.Msg = "获取信息失败"
 					br.ErrMsg = "获取信息失败,Err:" + err.Error() + "categoryID 不存在:" + strconv.Itoa(detail.CategoryId)
 					return
 				}
-				fmt.Println(detailCategory)
 				permissionStr, err := models.GetCompanyPermissionByUser(user.CompanyId)
 				if err != nil {
 					br.Msg = "获取信息失败"
@@ -361,25 +392,14 @@ Loop:
 
 	// 处理研选下面的路演精华 的报告链接是否跳转
 	if hasPermission == 1 && detail.ArticleId > utils.SummaryArticleId && detail.ArticleTypeId > 0 {
-		//articleTYpeDetail, err := models.GetArticleTypeInfo(detail.ArticleTypeId)
-		//if err != nil && err.Error() != utils.ErrNoRow() {
-		//	br.Msg = "获取信息失败"
-		//	br.ErrMsg = "获取销售信息失败,Err:" + err.Error()
-		//	return
-		//}
-		//if articleTYpeDetail != nil {
-		//	detail.IsShowLinkButton = articleTYpeDetail.IsShowLinkButton
-		//}
 		detail.PublishDate = utils.TimeRemoveHms2(detail.PublishDate)
 		if detail.ReportLink != "" {
 			chartUserTokenByMobile, _ := services.GetUserTokenByMobile(user.Mobile)
 			detail.ReportLink += "?token=" + chartUserTokenByMobile
 		}
 	}
-	resp := new(models.ArticleDetailResp)
 	resp.HasPermission = hasPermission
 	resp.HaveResearch = haveResearch
-	resp.HasFree = hasFree
 	resp.Detail = detail
 	if user.Mobile != "" {
 		resp.Mobile = user.Mobile

+ 32 - 3
controllers/report.go

@@ -268,6 +268,7 @@ func (this *ReportController) IndustryList() {
 		br.ErrMsg = "获取用户权限失败, Err: " + e.Error()
 		return
 	}
+	mapUPdateTime := make(map[int]string)
 
 	if len(industrialManagementIds) > 0 {
 		// 获取默认图配置
@@ -299,6 +300,28 @@ func (this *ReportController) IndustryList() {
 			}
 			industrialVideoMap[v.IndustryId] = tmp
 		}
+		//获取这些产业下最新更新的文章
+		listUpdateTime, err := models.GetNewArticleDetailByIndustrialIds(industrialManagementIds)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			return
+		}
+		for _, v := range listUpdateTime {
+			mapUPdateTime[v.IndustrialManagementId] = v.PublishDate
+		}
+
+		//时间线的更新时间
+		//	maptimelineUPdateTime := make(map[int]string)
+		listtimelinePublishdate, err := models.GetTimeLineReportIndustrialPublishdateList(industrialManagementIds)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			return
+		}
+		for _, v := range listtimelinePublishdate {
+			if mapUPdateTime[v.IndustrialManagementId] != "" {
+				if utils.StrTimeToTime(v.PublishDate).After(utils.StrTimeToTime(mapUPdateTime[v.IndustrialManagementId])) {
+					mapUPdateTime[v.IndustrialManagementId] = v.PublishDate
+				}
+			}
+		}
 	}
 
 	nowTime := time.Now().Local()
@@ -318,7 +341,7 @@ func (this *ReportController) IndustryList() {
 			br.ErrMsg = "获取品种信息失败,Err:" + err.Error()
 			return
 		}
-		list[k].UpdateTime = utils.TimeRemoveHms(newArtinfo.PublishDate)
+		list[k].UpdateTime = utils.TimeRemoveHms(mapUPdateTime[v.IndustrialManagementId])
 		recordCount, err := models.GetUserToArticleCount(uid, newArtinfo.ArticleId)
 		if err != nil && err.Error() != utils.ErrNoRow() {
 			br.Msg = "获取信息失败"
@@ -1487,6 +1510,7 @@ func (this *ReportController) IsShow() {
 	resp.IsShowChart = true
 	//resp.IsShowResearch = true
 	resp.LinkWxExplain = utils.LINK_WX_EXPLAIN
+	resp.ActivitySpecialExplain = utils.ACTIVITY_SPECIAL_EXPLAIN
 	//resp.YanXuan_Explain = true
 	resp.IsShowFreeButton = IsShowFreeButton
 	//mobile := user.Mobile
@@ -2823,6 +2847,8 @@ func (this *ReportController) SearchReportAndResource() {
 	sqlGroup = ` GROUP BY  a.article_id  ORDER BY a.publish_date DESC  `
 	if pageSize > 0 {
 		sqlGroup += ` LIMIT 5 `
+	} else {
+		sqlGroup += ` LIMIT 100 `
 	}
 	ListYxReport, err := models.GetArticleCollectionList(` AND a.article_id >= 1000000 `+condition+sqlGroup, user.UserId)
 	if err != nil {
@@ -3063,6 +3089,7 @@ func (this *ReportController) StockNameList() {
 		br.ErrMsg = "获取综述报告公司名称失败,Err:" + err.Error()
 		return
 	}
+	var respList []*models.SummaryArticleStock
 	for _, item := range list {
 		sliceSubjects := strings.Split(item.Stock, "/")
 		if len(sliceSubjects) > 0 {
@@ -3076,9 +3103,11 @@ func (this *ReportController) StockNameList() {
 						ArticleId: item.ArticleId,
 						Stock:     subject,
 					}
-					list = append(list, &newItem)
+
+					respList = append(respList, &newItem)
 				} else {
 					item.Stock = subject
+					respList = append(respList, item)
 				}
 			}
 		}
@@ -3093,7 +3122,7 @@ func (this *ReportController) StockNameList() {
 		//}
 	}
 	resp := new(models.SummaryArticleStockResp)
-	resp.List = list
+	resp.List = respList
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"

+ 1 - 0
controllers/search.go

@@ -620,6 +620,7 @@ func (this *SearchController) ListHomeArtAndChartPage() {
 				result[k].ImgUrlPc = mapCategoryUrl[v.CategoryId]
 			}
 			result[k].Source = 1
+			v.PublishDate = utils.TimeRemoveHms(v.PublishDate)
 		}
 	}
 	//记录用户搜索关键词

+ 14 - 0
controllers/user.go

@@ -227,6 +227,11 @@ func (this *UserController) Detail() {
 			br.ErrMsg = "获取信息失败,Err:" + err.Error()
 			return
 		}
+		if detail == nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取信息失败,Err:用户不存在"
+			return
+		}
 
 		userRecord, _ := models.GetUserRecordByUserId(uid, utils.WxPlatform)
 		if userRecord != nil {
@@ -314,6 +319,15 @@ func (this *UserController) Detail() {
 				//}
 				detail.SellerName = companyItem.SellerName
 				detail.SellerMobile = companyItem.Mobile
+
+				tatolSpecil, err := services.GetSpecialTripUserSchedule(user.UserId)
+				if err != nil {
+					br.Msg = "获取信息失败"
+					br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
+					return
+				}
+				detail.ScheduleNum += tatolSpecil
+
 			} else {
 				hasPermission = 1
 			}

+ 142 - 47
models/activity.go

@@ -192,6 +192,9 @@ type ActivityDetail struct {
 	VideoDetail             *CygxActivityVideoListResp `description:"视频数据"`
 	FileType                int                        `description:"类型: 1-音频; 2-视频"`
 	IsCollect               bool                       `description:"是否收藏"`
+	SourceType              int                        `description:"活动来源。 1:活动 、2:专项产业调研"`
+	TripImgLink             string                     `description:"专项产业调研行程链接"`
+	ActivityTimeEnd         string                     `description:"专项产业调研活动预期结束时间"`
 }
 
 type CygxActivityResp struct {
@@ -366,6 +369,71 @@ func GetScheduleList(condition string, pars []interface{}, uid, startSize, pageS
 	return
 }
 
+//我的日程列表 活动以及专项调研一起
+func GetScheduleAndSpecilList(condition string, pars []interface{}, conditionSpecil string, parsSpecil []interface{}, startSize, pageSize int) (items []*ActivityDetail, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+			art.activity_id,
+			art.activity_time_text,
+			art.activity_name,
+			art.chart_permission_id,
+			art.active_state,
+			t.activity_type,
+			art.chart_permission_name,
+			art.distinguished_guest,
+			art.expert,
+			art.speaker,
+			"" AS trip_img_link,
+			"" AS activity_time_end,
+			art.yidong_activity_id,
+			art.is_can_appointment_minutes,
+			art.activity_type_id,
+			art.limit_people_num,
+			1 AS source_type,
+			art.activity_time 
+		FROM
+			cygx_activity AS art
+			INNER JOIN cygx_my_schedule AS my ON my.activity_id = art.activity_id
+			INNER JOIN cygx_activity_type AS t ON t.activity_type_id = art.activity_type_id
+			INNER JOIN chart_permission AS c ON c.chart_permission_id = art.chart_permission_id 
+		WHERE
+			1 = 1 `
+	if condition != `` {
+		sql += condition
+	}
+	sql += ` UNION ALL
+		SELECT
+			art.activity_id,
+			art.activity_time_text_by_day AS activity_time_text,
+			art.research_theme AS activity_name,
+			art.chart_permission_id,
+			"",
+			art.special_type AS activity_type,
+			art.chart_permission_name,
+			"",
+			"",
+			"",
+			art.trip_img_link_fix AS trip_img_link,
+			art.activity_time_end,
+			"",
+			"",
+			"",
+			"",
+			2 AS source_type,
+			art.activity_time 
+		FROM
+			cygx_activity_special AS art
+			INNER JOIN cygx_activity_special_trip AS my ON my.activity_id = art.activity_id 
+		WHERE
+			1 = 1`
+	if conditionSpecil != "" {
+		sql += conditionSpecil
+	}
+	sql += ` ORDER BY activity_time DESC   LIMIT ?,?`
+	_, err = o.Raw(sql, pars, parsSpecil, startSize, pageSize).QueryRows(&items)
+	return
+}
+
 //获取数量
 func GetActivityCountById(activityId int) (count int, err error) {
 	o := orm.NewOrm()
@@ -402,7 +470,6 @@ func UpdateActivitySattusToHaveInHand() (err error) {
 	condition += ` OR(activity_type_id IN ( 4, 5, 6 ) AND  activity_time > ` + "'" + resultTime_60 + "'" + sqlOr + ")"
 	msql := " UPDATE cygx_activity SET active_state = 2 WHERE 1 = 1 " + condition
 	_, err = o.Raw(msql).Exec()
-
 	return
 }
 
@@ -727,31 +794,11 @@ func GetActivityLabelSpecialListAll(condition string, pars []interface{}, startS
 	if condition != "" {
 		sql += condition
 	}
-	sql += ` ORDER BY art.last_updated_time DESC  LIMIT ?,? `
+	sql += `  LIMIT ?,? `
 	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
 	return
 }
 
-//专项调研活动列表
-type CygxActivitySpecialDetail struct {
-	ActivityId            int    `description:"活动ID "`
-	ActivityTypeName      string `description:"活动名称"`
-	SpecialType           int    `description:"调研形式、 1 线上 , 2 线下"`
-	City                  string `description:"调研城市"`
-	ChartPermissionName   string `description:"行业名称"`
-	ResearchTheme         string `description:"调研主题"`
-	ActivityTimeText      string `description:"活动预期时间带文字"`
-	TripImgLink           string `description:"行程图片链接"`
-	IsSignup              int    `description:"是否感兴趣 1是 ,0 否"`
-	Label                 string `description:"主题标签"`
-	ImgUrl                string `description:"图片链接"`
-	ImgUrlText            string `description:"图片链接文字"`
-	IndustrialName        string `description:"产业名称"`
-	IndustrialSubjectName string `description:"标的名称(相关公司)"`
-	Scale                 string `description:"管理规模,空不填,1::50亿以下,2:50~100亿,3:100亿以上。多个用, 隔开"`
-	CustomerTypeIds       string `description:"活动可见的客户类型,多个ID用 , 隔开"`
-}
-
 type GetCygxActivitySpecialDetailListResp struct {
 	IsFollow        bool               `description:"是否关注新调研通知"`
 	IsBindingMobile bool               `description:"是否绑定了手机号"`
@@ -771,17 +818,6 @@ type CygxActivitySpecialResp struct {
 	Detail            *CygxActivitySpecialDetail
 }
 
-//获取数量
-func GetActivitySpecialCount(condition string, pars []interface{}) (count int, err error) {
-	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_activity_special as art WHERE 1= 1  `
-	if condition != "" {
-		sqlCount += condition
-	}
-	o := orm.NewOrm()
-	err = o.Raw(sqlCount, pars).QueryRow(&count)
-	return
-}
-
 //获取专项调研活动列表
 func GetCygxActivitySpecialDetailList(condition string, pars []interface{}, uid, startSize, pageSize int) (items []*CygxActivitySpecialDetail, err error) {
 	o := orm.NewOrm()
@@ -805,8 +841,8 @@ WHERE
 	if condition != "" {
 		sql += condition
 	}
-	sql += ` ORDER BY art.last_updated_time DESC  LIMIT ?,? `
-	_, err = o.Raw(sql, pars, uid, startSize, pageSize).QueryRows(&items)
+	sql += `  LIMIT ?,? `
+	_, err = o.Raw(sql, uid, pars, startSize, pageSize).QueryRows(&items)
 	return
 }
 
@@ -818,7 +854,7 @@ FROM
 	cygx_activity_special AS a 
 WHERE
 	activity_id = ?
-	AND publish_status = 1`
+	AND publish_status = 1 	AND is_offline = 0  `
 	err = o.Raw(sql, uid, ActivityId).QueryRow(&item)
 	return
 }
@@ -831,14 +867,6 @@ func GetCygxActivitySpecialDetail(ActivityId int) (item *CygxActivitySpecialDeta
 	return
 }
 
-//列表
-func GetActivityList() (items []*CygxActivityList, err error) {
-	o := orm.NewOrm()
-	sql := `SELECT  *  FROM cygx_activity`
-	_, err = o.Raw(sql).QueryRows(&items)
-	return
-}
-
 func UpdateCygxActivityName(activityId int, Name string) (err error) {
 	o := orm.NewOrm()
 	sql := `UPDATE cygx_activity SET activity_name_task = ? WHERE activity_id=?  `
@@ -919,6 +947,73 @@ func UpdateActivityshowSubject(activityId int) (err error) {
 	return
 }
 
+//GetActivitySpecialSearcheList 活动与专项调研的搜索
+func GetActivitySpecialSearcheList(condition string, pars []interface{}, conditionSpecil string, parsSpecil []interface{}, startSize, pageSize int) (items []*ActivityDetail, total int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+			art.activity_id,
+			art.activity_time_text,
+			art.activity_name,
+			art.chart_permission_id,
+			art.active_state,
+			t.activity_type,
+			art.chart_permission_name,
+			art.distinguished_guest,
+			art.expert,
+			art.speaker,
+			"" AS trip_img_link,
+			"" AS activity_time_end,
+			art.yidong_activity_id,
+			art.is_can_appointment_minutes,
+			art.activity_type_id,
+			art.limit_people_num,
+			1 AS source_type,
+			art.activity_time 
+		FROM
+			cygx_activity AS art
+			INNER JOIN cygx_activity_type AS t ON t.activity_type_id = art.activity_type_id
+		WHERE
+			1 = 1 `
+	if condition != `` {
+		sql += condition
+	}
+	sql += ` UNION ALL
+		SELECT
+			art.activity_id,
+			art.activity_time_text_by_day AS activity_time_text,
+			art.research_theme AS activity_name,
+			art.chart_permission_id,
+			"",
+			art.special_type AS activity_type,
+			art.chart_permission_name,
+			"",
+			"",
+			"",
+			art.trip_img_link_fix AS trip_img_link,
+			art.activity_time_end,
+			"",
+			"",
+			"",
+			"",
+			2 AS source_type,
+			art.activity_time 
+		FROM
+			cygx_activity_special AS art
+		WHERE
+			1 = 1 `
+	if conditionSpecil != "" {
+		sql += conditionSpecil
+	}
+	totalSql := `SELECT COUNT(1) total FROM (` + sql + `) z `
+	err = o.Raw(totalSql, pars, parsSpecil).QueryRow(&total)
+	if err != nil {
+		return
+	}
+	sql += ` ORDER BY activity_time DESC   LIMIT ?,?`
+	_, err = o.Raw(sql, pars, parsSpecil, startSize, pageSize).QueryRows(&items)
+	return
+}
+
 //列表
 func GetActivityListNew(condition string, pars []interface{}, uid, startSize, pageSize, playBack, filter int, typeName string) (items []*ActivityDetail, err error) {
 	var sqlJiontable string
@@ -945,11 +1040,11 @@ func GetActivityListNew(condition string, pars []interface{}, uid, startSize, pa
 	}
 	sql += ` LIMIT ?,?`
 
-	if typeName != ""{
+	if typeName != "" {
 		typeSlice := strings.Split(typeName, ",")
 		tempCondition := ""
 		for _, s := range typeSlice {
-			if s == "1"{
+			if s == "1" {
 				tempCondition += "'专家电话会',"
 			} else if s == "2" {
 				tempCondition += "'分析师电话会',"
@@ -976,4 +1071,4 @@ func GetActivityLabelListAllNoLimit(condition, sortTime string, pars []interface
 
 	_, err = o.Raw(sql, pars).QueryRows(&items)
 	return
-}
+}

+ 13 - 2
models/activity_appointment.go

@@ -198,7 +198,7 @@ func GetCygxAppointmentSummaryListBySubjectId(subjectIds string) (item []*CygxAp
 
 type CygxAppointment struct {
 	Mobile         string `description:"手机号"`
-	UserId         int `description:"userId"`
+	UserId         int    `description:"userId"`
 	ActivityName   string `description:"所属销售"`
 	ActivityTypeId int    `description:"活动类型"`
 }
@@ -223,4 +223,15 @@ func GetCygxAppointmentSummaryBySubjectId(subjectIds string) (item []*CygxAppoin
 			ap.activity_id `
 	_, err = o.Raw(sql).QueryRows(&item)
 	return
-}
+}
+
+//GetCygxAppointmentListByUser 获取预约纪要的人
+func GetCygxAppointmentListByUser(condition string, pars []interface{}) (item []*CygxActivityAppointment, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT *
+			FROM
+			cygx_activity_appointment  
+			WHERE 1 = 1 ` + condition
+	_, err = o.Raw(sql, pars).QueryRows(&item)
+	return
+}

+ 11 - 0
models/activity_meeting_reminder.go

@@ -154,3 +154,14 @@ func GetUserActivityMeetingReminderCount(uid int) (count int, err error) {
 	err = o.Raw(sqlCount, uid).QueryRow(&count)
 	return
 }
+
+//GetCygxReminderListByUser 获取设置会议提醒的人
+func GetCygxReminderListByUser(condition string, pars []interface{}) (item []*CygxActivityMeetingReminder, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT *
+			FROM
+			cygx_activity_meeting_reminder  
+			WHERE 1 = 1 ` + condition
+	_, err = o.Raw(sql, pars).QueryRows(&item)
+	return
+}

+ 10 - 0
models/activity_signup.go

@@ -349,6 +349,16 @@ func GetActivitySignupDetail(activityId, uid int) (item *CygxActivitySignup, err
 	return
 }
 
+func GetActivitySignuListByUser(condition string, pars []interface{}) (item []*CygxActivitySignup, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT *
+			FROM
+			cygx_activity_signup  
+			WHERE 1 = 1 ` + condition
+	_, err = o.Raw(sql, pars).QueryRows(&item)
+	return
+}
+
 //解除报名限制之后二次报名
 func AddActivitySignupByRestrict(item *CygxActivitySignup) (lastId int64, err error) {
 	o, err := orm.NewOrm().Begin()

+ 73 - 0
models/activity_special.go

@@ -0,0 +1,73 @@
+package models
+
+import (
+	//"fmt"
+	"github.com/beego/beego/v2/client/orm"
+)
+
+//专项调研活动列表
+type CygxActivitySpecialDetail struct {
+	ActivityId            int    `description:"活动ID "`
+	ActivityTypeName      string `description:"活动名称"`
+	SpecialType           int    `description:"调研形式、 1 线上 , 2 线下"`
+	City                  string `description:"调研城市"`
+	ChartPermissionName   string `description:"行业名称"`
+	ChartPermissionId     string `description:"行业Id"`
+	ResearchTheme         string `description:"调研主题"`
+	ActivityTimeText      string `description:"活动预期时间带文字"`
+	TripImgLink           string `description:"行程图片链接"`
+	IsSignup              int    `description:"是否感兴趣 1是 ,0 否"`
+	Label                 string `description:"主题标签"`
+	ImgUrl                string `description:"图片链接"`
+	ImgUrlText            string `description:"图片链接文字"`
+	IndustrialName        string `description:"产业名称"`
+	IndustrialSubjectName string `description:"标的名称(相关公司)"`
+	Scale                 string `description:"管理规模,空不填,1::50亿以下,2:50~100亿,3:100亿以上。多个用, 隔开"`
+	CustomerTypeIds       string `description:"活动可见的客户类型,多个ID用 , 隔开"`
+	IsTrip                int    `description:"是否报名 1是 ,0 否"`
+	TripNum               int    `description:"已报名人数"`
+	Days                  int    `description:"调研天数"`
+	Host                  string `description:"主持人"`
+	PersonInCharge        string `description:"纪要负责人"`
+	LimitPeopleNum        int    `description:"限制人数数量"`
+	TripImgLinkFix        string `description:"确定行程之后的图片链接"`
+	ActivityTimeTextByDay string `description:"活动预期时间带周日"`
+	ActivityTime          string `description:"活动预期时间"`
+	ActivityTimeEnd       string `description:"活动预期结束时间"`
+	ActiveState           int    `description:"活动进行状态 未开始:1、进行中2、已结束3"`
+	TripStatus            int    `description:"行程进行状态 1:预报名,2:确定行程"`
+	Explain               string `description:"说明"`
+	AdminId               int    `description:"管理员ID"`
+}
+
+//获取数量
+func GetActivitySpecialCount(condition string, pars []interface{}) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_activity_special as art WHERE 1= 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	o := orm.NewOrm()
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+//主题列表
+func GetActivitySpecialListAll(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxActivitySpecialDetail, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT	*
+		FROM cygx_activity_special as art WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY art.last_updated_time DESC  LIMIT ?,? `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+//修改发布状态
+func UpdateActivitySpecialPublishStatus(publishStatus, activityId int) (err error) {
+	sql := ` UPDATE cygx_activity_special SET  publish_status= ?  WHERE activity_id = ?`
+	o := orm.NewOrm()
+	_, err = o.Raw(sql, publishStatus, activityId).Exec()
+	return
+}

+ 10 - 0
models/activity_special_signup.go

@@ -22,9 +22,11 @@ type SignupSpecialStatus struct {
 	ActivityId    int    `description:"活动ID"`
 	HasPermission int    `description:"操作方式,1:有该行业权限,正常展示,2:无该行业权限,3:潜在客户,未提交过申请,4:潜在客户,已提交过申请"`
 	PopupMsg      string `description:"权限弹窗信息"`
+	PopupMsg2     string `description:"权限弹窗信息"`
 	Status        int    `description:"返回类型,1:添加,2:取消"`
 	SellerMobile  string `description:"销售电话"`
 	SellerName    string `description:"销售姓名"`
+	SignupStatus  int    `description:"返回状态:1:成功 、2 :人数已满 、3:调研次数已用完、 4:超时"`
 }
 
 //添加
@@ -58,6 +60,14 @@ func GetActivityListSpecialAll(activityId int) (items []*CygxActivitySpecialSign
 	return
 }
 
+//列表
+func GetActivityListSpecialByActivityId(activityId int) (items []*CygxActivitySpecialSignup, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT art.*  FROM cygx_activity_special_signup as art WHERE 1= 1 AND  activity_id = ? `
+	_, err = o.Raw(sql, activityId).QueryRows(&items)
+	return
+}
+
 type CygxActivitySpecialSignupResp struct {
 	Id          int       `orm:"column(id);pk"`
 	ActivityId  int       `description:"活动ID"`

+ 116 - 0
models/activity_special_trip.go

@@ -0,0 +1,116 @@
+package models
+
+import (
+	//"hongze/hongze_admin/models"
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxActivitySpecialTrip struct {
+	Id             int       `orm:"column(id);pk"`
+	UserId         int       `description:"用户id,多个用,隔开"`
+	ActivityId     int       `description:"活动ID"`
+	CreateTime     time.Time `description:"创建时间"`
+	Mobile         string    `description:"手机号"`
+	Email          string    `description:"邮箱号"`
+	CompanyId      int       `description:"公司ID"`
+	CompanyName    string    `description:"公司名称"`
+	RealName       string    `description:"用户实际名称"`
+	SellerName     string    `description:"所属销售"`
+	AdminId        int       `description:"销售/管理员ID"`
+	Source         int       `description:"来源,1小程序,2后台添加"`
+	OutboundMobile string    `description:"外呼手机号"`
+	CountryCode    string    `description:"手机国家区号"`
+	IsCancel       string    `description:"是否取消,1是,0否"`
+	IsValid        int       `description:"参会报名是否有效 1:是,0"`
+}
+
+type CygxActivitySpecialTripResp struct {
+	Id             int    `description:"ID"`
+	UserId         int    `description:"用户id"`
+	ActivityId     int    `description:"活动ID"`
+	CreateTime     string `description:"创建时间"`
+	Mobile         string `description:"手机号"`
+	Email          string `description:"邮箱号"`
+	CompanyId      int    `description:"公司ID"`
+	CompanyName    string `description:"公司名称"`
+	RealName       string `description:"用户实际名称"`
+	SellerName     string `description:"所属销售"`
+	OutboundMobile string `description:"外呼手机号"`
+	CountryCode    string `description:"手机国家区号"`
+}
+
+func GetCygxActivitySpecialTripList(condition string, pars []interface{}) (item []*CygxActivitySpecialTripResp, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT *
+			FROM
+			cygx_activity_special_trip  
+			WHERE 1 = 1 ` + condition
+	_, err = o.Raw(sql, pars).QueryRows(&item)
+	return
+}
+
+//获取某一用户的报名的数量
+func GetUserActivitySpecialTripCount(uid, activityId int) (count int, err error) {
+	sqlCount := `SELECT COUNT(1) AS count FROM cygx_activity_special_trip  WHERE  user_id=?  AND   activity_id =? `
+	o := orm.NewOrm()
+	err = o.Raw(sqlCount, uid, activityId).QueryRow(&count)
+	return
+}
+
+//获取某一活动的报名的数量
+func GetActivitySpecialTripCountByActivityId(condition string, pars []interface{}) (count int, err error) {
+	sqlCount := `SELECT COUNT(1) AS count FROM cygx_activity_special_trip as t   INNER JOIN wx_user as  u on u.user_id = t.user_id WHERE    1 = 1 ` + condition
+	o := orm.NewOrm()
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+//获取某一活动的报名的数量 (同时关联活动类型进行获取)
+func GetActivitySpecialTripCountByActivitySpecial(condition string, pars []interface{}) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count
+		FROM
+			cygx_activity_special_trip AS t
+			INNER JOIN cygx_activity_special AS a ON a.activity_id = t.activity_id 
+		WHERE
+			 1= 1 ` + condition
+	o := orm.NewOrm()
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+//获取空降的公司报名的记录
+func GetActivitySpecialTripAirborneCountByActivitySpecial(condition string, pars []interface{}) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count
+		FROM
+			cygx_activity_special_meeting_detail AS t
+			INNER JOIN cygx_activity_special AS a ON a.activity_id = t.activity_id 
+		WHERE
+			 1= 1 ` + condition
+	o := orm.NewOrm()
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+//添加
+func AddCygxActivitySpecialTrip(item *CygxActivitySpecialTrip) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Insert(item)
+	return
+}
+
+//取消
+func CancelActivitySpecialTrip(uid int, item *CygxActivitySpecialDetail) (err error) {
+	o := orm.NewOrm()
+	sql := `DELETE  FROM cygx_activity_special_trip   WHERE user_id=?  AND activity_id=? `
+	_, err = o.Raw(sql, uid, item.ActivityId).Exec()
+	return
+}
+
+//CancelActivitySpecialTripIsValid  处理活动报名是否有效
+func CancelActivitySpecialTripIsValid(isValid, activityId, userId int) (err error) {
+	sql := ` UPDATE cygx_activity_special_trip SET  is_valid= ?,is_cancel = 1  WHERE activity_id = ? AND  user_id = ? `
+	o := orm.NewOrm()
+	_, err = o.Raw(sql, isValid, activityId, userId).Exec()
+	return
+}

+ 12 - 6
models/article.go

@@ -154,6 +154,7 @@ type ArticleDetail struct {
 	ReportLink              string `description:"报告链接"`
 	IsShowLinkButton        int    `description:"这种报告类型是否展示查看报告链接"`
 	ArticleTypeId           int    `description:"文章类型ID"`
+	IsSpecialArticle        bool   `description:"是否属于专项调研报告"`
 }
 
 type ArticleDetailFileLink struct {
@@ -215,11 +216,15 @@ func GetArticlePermission(companyId int) (item *ChartPermission, err error) {
 }
 
 type ArticleDetailResp struct {
-	Detail        *ArticleDetail
-	HasPermission int    `description:"1:有该行业权限,正常展示,2:无该行业权限,不存在权益客户下,3:无该品类权限,已提交过申请,4:无该行业权限,未提交过申请,5:潜在客户,未提交过申请,6:潜在客户,已提交过申请"`
-	HasFree       int    `description:"1:已付费(至少包含一个品类的权限),2:未付费(没有任何品类权限)"`
-	HaveResearch  bool   `description:"是否有研选权限"`
-	Mobile        string `description:"用户手机号"`
+	Detail           *ArticleDetail
+	HasPermission    int    `description:"1:有该行业权限,正常展示,2:无该行业权限,不存在权益客户下,3:无该品类权限,已提交过申请,4:无该行业权限,未提交过申请,5:潜在客户,未提交过申请,6:潜在客户,已提交过申请"`
+	HasFree          int    `description:"1:已付费(至少包含一个品类的权限),2:未付费(没有任何品类权限)"`
+	HaveResearch     bool   `description:"是否有研选权限"`
+	Mobile           string `description:"用户手机号"`
+	PopupMsg         string `description:"权限弹窗信息"`
+	SellerMobile     string `description:"销售电话"`
+	SellerName       string `description:"销售姓名"`
+	IsSpecialArticle bool   `description:"是否属于专项调研报告"`
 }
 
 type ArticleDetailHtgjResp struct {
@@ -536,6 +541,7 @@ type ArticleResultApidate struct {
 	Field         ArticleField             `json:"field"`
 	Corpus        Corpus                   `json:"corpus"`
 	Cover         string                   `json:"cover"`
+	TypeId        int                      `json:"type_id"`
 }
 
 type ArticleField struct {
@@ -678,4 +684,4 @@ WHERE
 
 type SummaryArticleStockResp struct {
 	List []*SummaryArticleStock
-}
+}

+ 1 - 1
models/chart_permission.go

@@ -33,7 +33,7 @@ func GetCategoryId(chartPermissionId int) (category_id string, err error) {
 	o := orm.NewOrm()
 	sql := ` SELECT GROUP_CONCAT(a.category_id) AS category_id 
 			FROM cygx_report_mapping AS a
-			WHERE a.chart_permission_id=? 
+			WHERE a.chart_permission_id=? AND a.is_summary = 1
 			GROUP BY a.chart_permission_id `
 	err = o.Raw(sql, chartPermissionId).QueryRow(&category_id)
 	return

+ 127 - 0
models/company_activity_trip.go

@@ -0,0 +1,127 @@
+package models
+
+import "github.com/beego/beego/v2/client/orm"
+
+func GetCountCompanyDetailByIdGroupTrip(companyId int) (count int, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT
+	COUNT( 1 ) AS count 
+FROM
+	company AS a
+	INNER JOIN company_product AS b ON a.company_id = b.company_id
+	INNER JOIN company_report_permission AS p ON p.company_id = a.company_id
+	INNER JOIN chart_permission AS cp ON cp.chart_permission_id = p.chart_permission_id
+	LEFT JOIN admin AS c ON b.seller_id = c.admin_id 
+WHERE
+	a.company_id = ? 
+	AND b.product_id = 2 
+	AND b.status = '正式' 
+	AND p.is_upgrade =  1
+	OR (
+		a.company_id = ? 
+	AND b.product_id = 2 
+	AND b.status = '永续') `
+	err = o.Raw(sql, companyId, companyId).QueryRow(&count)
+	return
+}
+
+func GetCompanyDetailByIdGroupTrip(companyId int) (item *CompanyDetail, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT a.company_id,a.company_name,b.status,b.seller_id,b.seller_name,c.mobile ,b.is_suspend
+            FROM company AS a
+			INNER JOIN company_product AS b ON a.company_id=b.company_id
+			INNER JOIN company_report_permission AS p ON p.company_id = a.company_id
+			INNER JOIN chart_permission AS cp ON cp.chart_permission_id = p.chart_permission_id
+			LEFT JOIN admin AS c ON b.seller_id=c.admin_id
+			WHERE a.company_id=? AND b.product_id = 2  
+			ORDER BY b.product_id DESC  LIMIT 0,1  `
+	err = o.Raw(sql, companyId).QueryRow(&item)
+	return
+}
+
+func GetCompanyPermissionByUserTrip(companyId int) (permission string, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT
+			GROUP_CONCAT( DISTINCT b.remark ORDER BY b.sort ASC SEPARATOR ',' ) AS permission 
+		FROM
+			company_report_permission AS a
+			INNER JOIN chart_permission AS b ON a.chart_permission_id = b.chart_permission_id
+			INNER JOIN company_product AS c ON a.company_id = c.company_id 
+			AND a.product_id = c.product_id 
+		WHERE
+			a.company_id = ? 
+			AND c.is_suspend = 0 
+			AND b.cygx_auth = 1 
+			AND a.is_upgrade = 1 
+			AND c.STATUS IN ( '正式' ) 
+			OR ( a.company_id = ? AND c.is_suspend = 0 AND b.cygx_auth = 1 AND c.STATUS IN ( '永续' ) ) 
+			OR ( a.company_id = ? AND c.is_suspend = 0 AND b.cygx_auth = 1 AND b.chart_permission_name = '策略' AND c.STATUS IN ( '正式' ) )`
+	err = o.Raw(sql, companyId, companyId, companyId).QueryRow(&permission)
+	return
+}
+
+//获取正式权限
+func GetCompanyPermissionByUserZhengShiTrip(companyId int) (permission string, err error) {
+	sql := ` SELECT GROUP_CONCAT(DISTINCT b.remark  ORDER BY b.sort ASC  SEPARATOR ',') AS permission
+			FROM company_report_permission AS a
+			INNER JOIN chart_permission AS b ON a.chart_permission_id=b.chart_permission_id
+			INNER JOIN company_product AS c ON a.company_id=c.company_id AND a.product_id=c.product_id
+			WHERE  a.company_id=?
+			AND c.is_suspend=0
+            AND b.cygx_auth=1
+			AND a.is_upgrade = 1 
+			AND c.status IN('正式')  `
+	o := orm.NewOrm()
+	err = o.Raw(sql, companyId).QueryRow(&permission)
+	return
+}
+
+//GetCompanyReportPermissionUpgrade 获取升级的权限类型
+func GetCompanyReportPermissionUpgrade(companyId, productId int) (items []*CompanyReportPermission, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+	re.*
+FROM
+	company_report_permission  as re 
+	INNER JOIN chart_permission as  c ON c.chart_permission_id = re.chart_permission_id
+WHERE
+	re.company_id = ? 
+	AND re.product_id = ? 
+	AND re.is_upgrade = 1 
+	AND c.permission_type = 1
+	AND STATUS = '正式' `
+	_, err = o.Raw(sql, companyId, productId).QueryRows(&items)
+	return
+}
+
+// GetChartPermissionByIds 主键获取权限
+func GetChartPermissionByIds(permissionIds []string) (list []*ChartPermission, err error) {
+	qb, _ := orm.NewQueryBuilder("mysql")
+	// 构建查询对象
+	qb.Select("*").From("chart_permission").
+		Where("chart_permission_id").In(permissionIds...)
+	// 导出 SQL 语句
+	sql := qb.String()
+
+	// 执行 SQL 语句
+	o := orm.NewOrm()
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+//GetCompanyPermissionNameCheck 通过名称判断客户是否开了某一类型的权限
+func GetCompanyPermissionNameCheck(companyId, productId int, permissionName string) (count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+			COUNT( 1 ) AS count 
+		FROM
+			company_report_permission AS a 
+			INNER JOIN chart_permission as  c  ON c.chart_permission_id = a.chart_permission_id
+		WHERE
+			a.company_id = ?
+			AND a.STATUS = '正式'
+			AND a.product_id = ? 
+			AND c.chart_permission_name = ? `
+	err = o.Raw(sql, companyId, productId, permissionName).QueryRow(&count)
+	return
+}

+ 1 - 0
models/db.go

@@ -125,6 +125,7 @@ func init() {
 		new(CygxMicroRoadshowVideoHistory),
 		new(MicroRoadshowVideo),
 		new(CygxActivityVideoHistory),
+		new(CygxActivitySpecialTrip),
 		new(CygxArticleData),
 		new(CygxArticleComment),
 	)

+ 55 - 0
models/industrial_management.go

@@ -628,3 +628,58 @@ func GetIndustryByName(industryName string) (item *IndustrialManagement, err err
 	err = orm.NewOrm().Raw(sql, industryName).QueryRow(&item)
 	return
 }
+
+type IndustrialManagementArticle struct {
+	IndustrialManagementId int    `description:"产业Id"`
+	IndustryName           string `description:"产业名称"`
+	ArticleId              int    `description:"文章ID"`
+	PublishDate            string `description:"发布时间"`
+}
+
+//时间线的更新时间
+func GetTimeLineReportIndustrialPublishdateList(industrialIdArr []int) (items []*IndustrialManagementArticle, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT	
+			mmc.id,
+			0,
+			mmc.industry_id AS industrial_management_id,			
+			mmc.content AS title,
+			MAX( mm.meeting_time ) AS publish_date 
+		FROM
+			cygx_morning_meeting_review_chapter AS mmc
+			INNER JOIN cygx_morning_meeting_reviews AS mm 
+		WHERE
+			mm.id = mmc.meeting_id 
+			AND mm.STATUS = 1 
+			AND mmc.industry_id IN (` + utils.GetOrmInReplace(len(industrialIdArr)) + `)
+		GROUP BY industrial_management_id ORDER BY publish_date DESC  `
+	_, err = o.Raw(sql, industrialIdArr).QueryRows(&items)
+	return
+}
+
+//获取该产业下最新的文章详情
+func GetNewArticleDetailByIndustrialIds(industrialIdArr []int) (items []*IndustrialManagementArticle, err error) {
+	arrLen := len(industrialIdArr)
+	if arrLen == 0 {
+		return
+	}
+	o := orm.NewOrm()
+	sql := `SELECT
+			mg.industrial_management_id,
+			MAX( a.article_id ) AS article_id,
+			a.title,
+			MAX( a.publish_date ) AS publish_date 
+		FROM
+			cygx_industrial_article_group_management AS mg
+			INNER JOIN cygx_article AS a ON mg.article_id = a.article_id 
+		WHERE
+			1 = 1 
+			AND a.article_id < ?
+			AND a.is_report = 1
+			AND a.is_class = 1
+			AND mg.industrial_management_id IN(` + utils.GetOrmInReplace(len(industrialIdArr)) + `)   
+		GROUP BY
+			mg.industrial_management_id `
+	_, err = o.Raw(sql, utils.SummaryArticleId, industrialIdArr).QueryRows(&items)
+	return
+}

+ 9 - 8
models/report.go

@@ -240,14 +240,15 @@ func GetWhichDepartmentCount(condition string) (count int, err error) {
 }
 
 type IsShow struct {
-	IsShow           bool      `description:"绝密内参按钮是否展示"`
-	IsShowFreeButton bool      `description:"免费送月卡按钮是否展示"`
-	IsShowResearch   bool      `description:"研选是否展示限免"`
-	IsShowChart      bool      `description:"图表是否展示限免"`
-	IsShowList       bool      `description:"榜单是否展示"`
-	LinkWxExplain    string    `description:"关注微信公众号链接说明地址"`
-	YanXuan_Explain  bool      `description:"研选说明"`
-	SearchTxtList    SearchTxt `description:"搜索栏回显内容说明"`
+	IsShow                 bool      `description:"绝密内参按钮是否展示"`
+	IsShowFreeButton       bool      `description:"免费送月卡按钮是否展示"`
+	IsShowResearch         bool      `description:"研选是否展示限免"`
+	IsShowChart            bool      `description:"图表是否展示限免"`
+	IsShowList             bool      `description:"榜单是否展示"`
+	LinkWxExplain          string    `description:"关注微信公众号链接说明地址"`
+	YanXuan_Explain        bool      `description:"研选说明"`
+	ActivitySpecialExplain string    `description:"专项调研活动"`
+	SearchTxtList          SearchTxt `description:"搜索栏回显内容说明"`
 }
 
 type SearchTxt struct {

+ 7 - 0
models/seller.go

@@ -47,6 +47,13 @@ func GetSellerByName(userName string) (item *AdminItem, err error) {
 	return
 }
 
+func GetSellerByAdminId(adminId int) (item *AdminItem, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * FROM admin WHERE admin_id=?  `
+	err = o.Raw(sql, adminId).QueryRow(&item)
+	return
+}
+
 //获取本组的销售ID
 func GetSelleridWhichGroup(companyId, productId int) (adminId string, err error) {
 	o := orm.NewOrm()

+ 24 - 0
models/wx_template_msg.go

@@ -44,3 +44,27 @@ func GetWxOpenIdByMobileList(mobile string) (items []*OpenIdList, err error) {
 	_, err = orm.NewOrm().Raw(sql).QueryRows(&items)
 	return
 }
+
+type AdminOpenIdList struct {
+	OpenId    string `description:"OpenId"`
+	UserId    int    `description:"UserId"`
+	Mobile    string `description:"手机号"`
+	CompanyId int    `description:"手机号"`
+}
+
+// GetAdminOpendidByCompany 通过用户公司ID获取对应销售的openid
+func GetAdminOpendidByCompany(condition string, pars []interface{}) (list []*AdminOpenIdList, err error) {
+	sql := `SELECT
+			cr.open_id,a.mobile,p.company_id,cr.union_id
+		FROM
+			company_product AS p
+			INNER JOIN admin AS a ON a.admin_id = p.seller_id 
+			INNER JOIN user_record  as c ON c.bind_account = a.mobile
+			INNER JOIN cygx_user_record AS cr ON cr.union_id = c.union_id
+		WHERE
+			1 = 1 
+			AND p.product_id = 2
+			AND create_platform = 4 ` + condition
+	_, err = orm.NewOrm().Raw(sql, pars).QueryRows(&list)
+	return
+}

+ 45 - 0
routers/commentsRouter.go

@@ -124,6 +124,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: "ActivityListSearch",
+            Router: `/listSearch`,
+            AllowHTTPMethods: []string{"get"},
+            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: "MeetingReminderAdd",
@@ -232,6 +241,42 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ActivitySpecialCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ActivitySpecialCoAntroller"],
+        beego.ControllerComments{
+            Method: "SpecialTripAdd",
+            Router: `/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ActivitySpecialCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ActivitySpecialCoAntroller"],
+        beego.ControllerComments{
+            Method: "SpecialDetail",
+            Router: `/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ActivitySpecialCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ActivitySpecialCoAntroller"],
+        beego.ControllerComments{
+            Method: "SpecialList",
+            Router: `/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ActivitySpecialCoAntroller"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ActivitySpecialCoAntroller"],
+        beego.ControllerComments{
+            Method: "Tripcancel",
+            Router: `/trip/cancel`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:AdviceController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:AdviceController"],
         beego.ControllerComments{
             Method: "ApplyApprove",

+ 5 - 0
routers/router.go

@@ -129,6 +129,11 @@ func init() {
 				&controllers.MicroRoadShowController{},
 			),
 		),
+		web.NSNamespace("/activity_special",
+			web.NSInclude(
+				&controllers.ActivitySpecialCoAntroller{},
+			),
+		),
 	)
 	web.AddNamespace(ns)
 }

+ 6 - 4
services/activity.go

@@ -1500,10 +1500,12 @@ func ActivityButtonShow(item *models.ActivityDetail) (articleDetail *models.Acti
 	//专家电话会 1
 	if articleDetail.ActivityTypeId == 1 {
 		articleDetail.IsShowOutboundCall = true
-		if articleDetail.LimitPeopleNum == 0 {
-			articleDetail.IsShowMeetingReminder = true
-			articleDetail.IsShowHelpSsk = true
-		}
+		//if articleDetail.LimitPeopleNum == 0 {
+		//	articleDetail.IsShowMeetingReminder = true
+		//	articleDetail.IsShowHelpSsk = true
+		//}
+		articleDetail.IsShowMeetingReminder = true
+		articleDetail.IsShowHelpSsk = true
 	}
 
 	//分析师电话会 2

+ 277 - 0
services/activity_button.go

@@ -0,0 +1,277 @@
+package services
+
+import (
+	"errors"
+	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/utils"
+	"strconv"
+	"strings"
+	"time"
+)
+
+//获取用户已经报名的活动
+func GetActivitySignUpUserMap(activityIds []int, user *models.WxUserItem) (mapUserId map[int]int, err error) {
+	userId := user.UserId
+	var condition string
+	var pars []interface{}
+	activityIdsLen := len(activityIds)
+	if activityIdsLen > 0 {
+		condition += ` AND activity_id IN (` + utils.GetOrmInReplace(activityIdsLen) + `)`
+		pars = append(pars, activityIds)
+	}
+	condition += ` AND user_id = ?  AND do_fail_type = 0 `
+	pars = append(pars, userId)
+	list, e := models.GetActivitySignuListByUser(condition, pars)
+	if e != nil {
+		err = errors.New("GetCygxActivitySpecialTripList, Err: " + e.Error())
+		return
+	}
+	mapUid := make(map[int]int)
+	for _, v := range list {
+		mapUid[v.ActivityId] = v.UserId
+	}
+	mapUserId = mapUid
+	return
+}
+
+//获取用户已经设置会议提醒的活动  cygx_activity_meeting_reminder
+func GetActivityReminderUserMasp(activityIds []int, user *models.WxUserItem) (mapUserId map[int]int, err error) {
+	userId := user.UserId
+	var condition string
+	var pars []interface{}
+	activityIdsLen := len(activityIds)
+	if activityIdsLen > 0 {
+		condition += ` AND activity_id IN (` + utils.GetOrmInReplace(activityIdsLen) + `)`
+		pars = append(pars, activityIds)
+	}
+	condition += ` AND user_id = ?  `
+	pars = append(pars, userId)
+	list, e := models.GetCygxReminderListByUser(condition, pars)
+	if e != nil {
+		err = errors.New("GetCygxReminderListByUser, Err: " + e.Error())
+		return
+	}
+	mapUid := make(map[int]int)
+	for _, v := range list {
+		mapUid[v.ActivityId] = v.UserId
+	}
+	mapUserId = mapUid
+	return
+}
+
+//获取用户已经预约纪要的活动
+func GetActivityAppointmentUserMap(activityIds []int, user *models.WxUserItem) (mapUserId map[int]int, err error) {
+	userId := user.UserId
+	var condition string
+	var pars []interface{}
+	activityIdsLen := len(activityIds)
+	if activityIdsLen > 0 {
+		condition += ` AND activity_id IN (` + utils.GetOrmInReplace(activityIdsLen) + `)`
+		pars = append(pars, activityIds)
+	}
+	condition += ` AND user_id = ?  `
+	pars = append(pars, userId)
+	list, e := models.GetCygxAppointmentListByUser(condition, pars)
+	if e != nil {
+		err = errors.New("GetCygxActivitySpecialTripList, Err: " + e.Error())
+		return
+	}
+	mapUid := make(map[int]int)
+	for _, v := range list {
+		mapUid[v.ActivityId] = v.UserId
+	}
+	mapUserId = mapUid
+	return
+}
+
+//活动列表的展示  HandleActivityListButton
+func HandleActivityListButton(list []*models.ActivityDetail, user *models.WxUserItem) (items []*models.ActivityDetail, err error) {
+	var activityIds []int
+	var activitySpecilalIds []int
+	for k, v := range list {
+		if v.SourceType == 2 {
+			activitySpecilalIds = append(activitySpecilalIds, v.ActivityId)
+			//把专项调研的线下改为活动的线下类型
+			if v.ActivityType == 2 {
+				list[k].ActivityType = 0
+			}
+			list[k].IsShowSignup = true
+		} else {
+			activityIds = append(activityIds, v.ActivityId)
+		}
+	}
+	//处理活动
+	if len(activityIds) > 0 {
+		//处理用户是否报名
+		mapSignUp, e := GetActivitySignUpUserMap(activityIds, user)
+		if e != nil {
+			err = errors.New("GetActivitySignUpUserMap, Err: " + e.Error())
+			return
+		}
+		for k, v := range list {
+			if v.SourceType != 2 {
+				if _, ok := mapSignUp[v.ActivityId]; ok {
+					list[k].IsSignup = 1
+				}
+			}
+		}
+		//处理用户是否预约纪要
+		mapAppointment, e := GetActivityAppointmentUserMap(activityIds, user)
+		if e != nil {
+			err = errors.New("GetActivityAppointmentUserMap, Err: " + e.Error())
+			return
+		}
+		for k, v := range list {
+			if v.SourceType != 2 {
+				if _, ok := mapAppointment[v.ActivityId]; ok {
+					list[k].IsAppointment = 1
+				}
+			}
+		}
+		//处理用户是否预约会议提醒
+		mapReminder, e := GetActivityReminderUserMasp(activityIds, user)
+		if e != nil {
+			err = errors.New("GetActivityReminderUserMasp, Err: " + e.Error())
+			return
+		}
+		for k, v := range list {
+			if v.SourceType != 2 {
+				if _, ok := mapReminder[v.ActivityId]; ok {
+					list[k].IsCancelMeetingReminder = 1
+				}
+			}
+		}
+	}
+
+	//处理专项产业调研
+	if len(activitySpecilalIds) > 0 {
+		//处理用户是否报名
+		UserMap, e := GetSpecialTripUserMap(activitySpecilalIds, user.UserId)
+		if e != nil {
+			err = errors.New("GetSpecialTripUserMap, Err: " + e.Error())
+			return
+		}
+		for k, v := range list {
+			if v.SourceType == 2 {
+				if _, ok := UserMap[v.ActivityId]; ok {
+					list[k].IsSignup = 1
+				}
+			}
+		}
+
+		for k, v := range list {
+			if v.SourceType == 2 {
+				resultTimeStart := utils.StrTimeToTime(v.ActivityTime)  //时间字符串格式转时间格式
+				resultTimeEnd := utils.StrTimeToTime(v.ActivityTimeEnd) //时间字符串格式转时间格式
+				if resultTimeStart.After(time.Now()) {
+					list[k].ActiveState = strconv.Itoa(1)
+				} else if time.Now().After(resultTimeEnd) {
+					list[k].ActiveState = strconv.Itoa(3)
+				} else {
+					list[k].ActiveState = strconv.Itoa(2)
+				}
+			}
+		}
+	}
+
+	//var isShow bool
+	isShow, e := GetShowSustainableNew()
+	if e != nil {
+		err = errors.New("GetShowSustainableNew, Err: " + e.Error())
+		return
+	}
+	detail, e := models.GetConfigByCode("city_img_url")
+	if e != nil {
+		err = errors.New("GetConfigByCode, Err: " + e.Error())
+		return
+	}
+	detailChart, e := models.GetConfigByCode("chart_img_url")
+	if e != nil {
+		err = errors.New("GetConfigByCode, Err: " + e.Error())
+		return
+	}
+	addressList := strings.Split(detail.ConfigValue, "{|}")
+	mapAddress := make(map[string]string)
+	chartList := strings.Split(detailChart.ConfigValue, "{|}")
+	mapChart := make(map[string]string)
+	var cityName string
+	var chartName string
+	var imgUrl string
+	var imgUrlChart string
+	var mapActivityId []int
+	for _, v := range addressList {
+		vslice := strings.Split(v, "_")
+		cityName = vslice[0]
+		imgUrl = vslice[len(vslice)-1]
+		mapAddress[cityName] = imgUrl
+	}
+	for _, v := range chartList {
+		vslice := strings.Split(v, "_")
+		chartName = vslice[0]
+		imgUrlChart = vslice[len(vslice)-1]
+		mapChart[chartName] = imgUrlChart
+	}
+	for k, v := range list {
+		if strings.Contains(v.ActivityName, "【") {
+			list[k].IsBrackets = 1
+		}
+		if v.SignupNum > v.LimitPeopleNum {
+			list[k].SignupNum = v.LimitPeopleNum
+		}
+		if isShow && strings.Contains(v.ChartPermissionName, "研选") {
+			list[k].IsShowSustainable = true
+		}
+		if strings.Contains(v.ChartPermissionName, "研选") && v.ActivityTypeId == 1 {
+			list[k].ActivityTypeName = "买方研选电话会"
+			list[k].ImgUrlText = utils.YAN_XUAN_IMG
+		}
+		if v.ActivityType == 0 {
+			if mapAddress[v.City] != "" {
+				list[k].ImgUrl = mapAddress[v.City]
+			} else {
+				list[k].ImgUrl = mapAddress["其它"]
+			}
+		} else {
+			if mapChart[v.ChartPermissionName] != "" {
+				list[k].ImgUrl = mapChart[v.ChartPermissionName]
+			}
+		}
+		expertTxt, _ := GetReportContentTextSub(v.Expert)
+		list[k].Expert = expertTxt
+		if v.IsHideAppointment == 0 {
+			list[k].IsShowAppointment = IsShowAppointment(v.ActivityTypeId, v.ChartPermissionName)
+		}
+		if v.ActivityTypeId == utils.C_CLASS_ACTIVITY_TYPE_ID {
+			list[k].IsCClassMeeting = true
+		}
+		mapActivityId = append(mapActivityId, v.ActivityId)
+	}
+
+	//处理音频回放
+	mapActivityVoice, e := GetActivityVoiceResp(mapActivityId)
+	if e != nil {
+		err = errors.New("GetActivityVoiceResp, Err: " + e.Error())
+		return
+	}
+
+	//处理视频回放
+	mapActivityVideo, e := GetActivityVideoResp(mapActivityId)
+	if e != nil {
+		err = errors.New("GetActivityVoiceResp, Err: " + e.Error())
+		return
+	}
+	for k, v := range list {
+		if mapActivityVoice[v.ActivityId] != nil {
+			list[k].FileType = 1
+			list[k].AudioLink = true
+			list[k].VoiceList = mapActivityVoice[v.ActivityId]
+		}
+		if mapActivityVideo[v.ActivityId] != nil {
+			list[k].FileType = 2
+			list[k].AudioLink = true
+			list[k].VideoDetail = mapActivityVideo[v.ActivityId]
+		}
+		items = append(items, ActivityButtonShow(v))
+	}
+	return
+}

+ 113 - 0
services/activity_my_schedule.go

@@ -0,0 +1,113 @@
+package services
+
+import (
+	"errors"
+	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/utils"
+	"strconv"
+	"time"
+)
+
+//我的日程 GetScheduleAndSpecilList
+func GetScheduleAndSpecilList(user *models.WxUserItem, condition string, startSize, pageSize int) (items []*models.ActivityDetail, err error) {
+	var conditionSpecil string
+	var pars, parsSpecil []interface{}
+	condition += ` AND my.user_id = ?`
+	pars = append(pars, user.UserId)
+	conditionSpecil += ` AND my.user_id = ? AND my.is_cancel = 0 `
+	parsSpecil = append(parsSpecil, user.UserId)
+	list, e := models.GetScheduleAndSpecilList(condition, pars, conditionSpecil, parsSpecil, startSize, pageSize)
+	if e != nil {
+		err = errors.New("GetScheduleAndSpecilList, Err: " + e.Error())
+		return
+	}
+	var activityIds []int
+	var activitySpecilalIds []int
+	for k, v := range list {
+		if v.SourceType == 2 {
+			activitySpecilalIds = append(activitySpecilalIds, v.ActivityId)
+			//把专项调研的线下改为活动的线下类型
+			if v.ActivityType == 2 {
+				list[k].ActivityType = 0
+			}
+			list[k].IsShowSignup = true
+		} else {
+			activityIds = append(activityIds, v.ActivityId)
+		}
+	}
+	//处理活动
+	if len(activityIds) > 0 {
+		//处理用户是否报名
+		mapSignUp, e := GetActivitySignUpUserMap(activityIds, user)
+		if e != nil {
+			err = errors.New("GetActivitySignUpUserMap, Err: " + e.Error())
+			return
+		}
+		for k, v := range list {
+			if v.SourceType != 2 {
+				if _, ok := mapSignUp[v.ActivityId]; ok {
+					list[k].IsSignup = 1
+				}
+			}
+		}
+		//处理用户是否预约纪要
+		mapAppointment, e := GetActivityAppointmentUserMap(activityIds, user)
+		if e != nil {
+			err = errors.New("GetActivityAppointmentUserMap, Err: " + e.Error())
+			return
+		}
+		for k, v := range list {
+			if v.SourceType != 2 {
+				if _, ok := mapAppointment[v.ActivityId]; ok {
+					list[k].IsAppointment = 1
+				}
+			}
+		}
+		//处理用户是否预约会议提醒
+		mapReminder, e := GetActivityReminderUserMasp(activityIds, user)
+		if e != nil {
+			err = errors.New("GetActivityReminderUserMasp, Err: " + e.Error())
+			return
+		}
+		for k, v := range list {
+			if v.SourceType != 2 {
+				if _, ok := mapReminder[v.ActivityId]; ok {
+					list[k].IsCancelMeetingReminder = 1
+				}
+			}
+		}
+	}
+
+	//处理专项产业调研
+	if len(activitySpecilalIds) > 0 {
+		//处理用户是否报名
+		UserMap, e := GetSpecialTripUserMap(activitySpecilalIds, user.UserId)
+		if e != nil {
+			err = errors.New("GetSpecialTripUserMap, Err: " + e.Error())
+			return
+		}
+		for k, v := range list {
+			if v.SourceType == 2 {
+				if _, ok := UserMap[v.ActivityId]; ok {
+					list[k].IsSignup = 1
+				}
+			}
+		}
+
+		for k, v := range list {
+			if v.SourceType == 2 {
+				resultTimeStart := utils.StrTimeToTime(v.ActivityTime)  //时间字符串格式转时间格式
+				resultTimeEnd := utils.StrTimeToTime(v.ActivityTimeEnd) //时间字符串格式转时间格式
+				if resultTimeStart.After(time.Now()) {
+					list[k].ActiveState = strconv.Itoa(1)
+				} else if time.Now().After(resultTimeEnd) {
+					list[k].ActiveState = strconv.Itoa(3)
+				} else {
+					list[k].ActiveState = strconv.Itoa(2)
+				}
+			}
+		}
+	}
+	items = list
+	return
+}

+ 881 - 9
services/activity_special.go

@@ -2,10 +2,12 @@ package services
 
 import (
 	"context"
+	"errors"
 	"fmt"
 	"hongze/hongze_cygx/models"
 	"hongze/hongze_cygx/utils"
 	"strconv"
+	"strings"
 	"time"
 )
 
@@ -70,10 +72,45 @@ func UpdateCygxActivitySpecialSignupNum(cont context.Context) (err error) {
 }
 
 //处理专项调研的展示
-func GetActivityLabelSpecialList(userType, isPower int, chartPermissionIds, scale, permissionNameStr string) (item *models.ActivityTypeHome, err error) {
+func GetActivityLabelSpecialList(user *models.WxUserItem, isPower int, chartPermissionIds, permissionNameStr string) (item *models.ActivityTypeHome, err error) {
+	itemList := new(models.ActivityTypeHome)
+	if user.CompanyId <= 1 {
+		itemList.List = make([]*models.CygxActivityLabelList, 0)
+		item = itemList
+		return
+	}
+	userType, e := GetSpecialUserType(user)
+	if e != nil {
+		err = errors.New("GetSpecialUserType, Err: " + e.Error())
+		return
+	}
+	if userType == 0 {
+		itemList.List = make([]*models.CygxActivityLabelList, 0)
+		item = itemList
+		return
+	}
+	companyDetail, e := models.GetCompanyDetailByIdGroupTrip(user.CompanyId)
+	if e != nil {
+		err = errors.New("GetCompanyDetailByIdGroupTrip, Err: " + e.Error())
+		return
+	}
+	//如果是永续的就按照普通的权限逻辑来查,如果不是就按照升级的逻辑来查
 	var condition string
+	if companyDetail.Status == "永续" {
+		condition, e = HandleActivityLabelSpecialPermission(user)
+		if e != nil {
+			err = errors.New("HandleActivityLabelSpecialPermission, Err: " + e.Error())
+			return
+		}
+	} else {
+		condition, e = HandleActivityLabelSpecialTripPermission(user)
+		if e != nil {
+			err = errors.New("HandleActivityLabelSpecialPermission, Err: " + e.Error())
+			return
+		}
+	}
 	var pars []interface{}
-	condition = ` AND art.publish_status = 1  AND art.label != '' `
+	condition += ` AND art.publish_status = 1  AND art.label != ''  AND art.is_offline = 0 `
 
 	//行业名称
 	if isPower == 1 {
@@ -82,21 +119,28 @@ func GetActivityLabelSpecialList(userType, isPower int, chartPermissionIds, scal
 	if chartPermissionIds != "" {
 		condition += ` AND art.chart_permission_id  IN (` + chartPermissionIds + `) `
 	}
-	var conditionOr string
-	if scale != "" {
-		conditionOr += ` OR (  art.scale LIKE '%` + scale + `%'	 ` + condition + `) `
-	}
-	condition += ` AND  art.customer_type_ids LIKE '%` + strconv.Itoa(userType) + `%'` + conditionOr
-	specialList, err := models.GetActivityLabelSpecialListAll(condition, pars, 0, 8)
+	conditionTrip := condition
+	conditionTrip += ` AND art.days > 0  ORDER BY art.activity_time ASC `
+	specialList, err := models.GetActivityLabelSpecialListAll(conditionTrip, pars, 0, 8)
 	if err != nil {
 		return
 	}
+	if len(specialList) < 8 {
+		conditionTrip += ` AND art.days = 0  ORDER BY art.last_updated_time DESC`
+		specialListNotrip, e := models.GetActivityLabelSpecialListAll(condition, pars, 0, 8-len(specialList))
+		if e != nil {
+			err = e
+			return
+		}
+		for _, v := range specialListNotrip {
+			specialList = append(specialList, v)
+		}
+	}
 	for k2, v2 := range specialList {
 		specialList[k2].KeyWord = LabelStrV5(v2.KeyWord, v2.IsShowSubjectName, v2.TemporaryLabel)
 		specialList[k2].ImgUrlBg = "https://hzstatic.hzinsights.com/static/temp/20220426202204/20220426/XDLLsjC9XAAy8LIzQr7GsjrBbtX6.png"
 		specialList[k2].ImgUrlBg = utils.ACTIVITY_ZXDY_ImgUrl3
 	}
-	itemList := new(models.ActivityTypeHome)
 	itemList.ActivityTypeName = "专项产业调研"
 	itemList.Resource = 2
 	itemList.List = specialList
@@ -106,3 +150,831 @@ func GetActivityLabelSpecialList(userType, isPower int, chartPermissionIds, scal
 	item = itemList
 	return
 }
+
+//HandleActivityLabelSpecialPermission 处理专项产业调研的查询权限sql 永续
+func HandleActivityLabelSpecialPermission(user *models.WxUserItem) (condition string, err error) {
+	permissionStr, e := GetCompanyPermission(user.CompanyId)
+	if e != nil {
+		err = errors.New("GetCompanyPermission, Err: " + e.Error())
+		return
+	}
+	userType, e := GetSpecialUserType(user)
+	if e != nil {
+		err = errors.New("GetSpecialUserType, Err: " + e.Error())
+		return
+	}
+	slicePer := strings.Split(permissionStr, ",")
+	var permissionSqlStr string
+	for _, v := range slicePer {
+		if userType == 1 {
+			if !strings.Contains(v, "研选") {
+				permissionSqlStr += "'" + v + "',"
+			}
+		} else {
+			permissionSqlStr += "'" + v + "',"
+		}
+	}
+	permissionSqlStr = strings.TrimRight(permissionSqlStr, ",")
+	condition = ` AND art.publish_status = 1  AND art.label != ''  AND art.is_offline = 0  `
+	if permissionSqlStr != "" {
+		condition += ` AND art.chart_permission_name  IN (` + permissionSqlStr + `) `
+	}
+	condition += ` AND  art.customer_type_ids LIKE '%` + strconv.Itoa(userType) + `%' `
+	return
+}
+
+//HandleActivityLabelSpecialPermisseion 处理专项产业调研的查询权限sql
+func HandleActivityLabelSpecialTripPermission(user *models.WxUserItem) (condition string, err error) {
+	permissionStr, e := GetCompanyPermission(user.CompanyId)
+	if e != nil {
+		err = errors.New("GetCompanyPermission, Err: " + e.Error())
+		return
+	}
+	userType, e := GetSpecialUserType(user)
+	if e != nil {
+		err = errors.New("GetSpecialUserType, Err: " + e.Error())
+		return
+	}
+	slicePer := strings.Split(permissionStr, ",")
+	var permissionSqlStr string
+	for _, v := range slicePer {
+		if userType == 1 {
+			if !strings.Contains(v, "研选") {
+				permissionSqlStr += "'" + v + "',"
+			}
+		} else {
+			permissionSqlStr += "'" + v + "',"
+		}
+	}
+	permissionSqlStr = strings.TrimRight(permissionSqlStr, ",")
+	condition = ` AND art.publish_status = 1  AND art.label != ''  AND art.is_offline = 0  `
+	if permissionSqlStr != "" {
+		condition += ` AND art.chart_permission_name  IN (` + permissionSqlStr + `) `
+	}
+	condition += ` AND  art.customer_type_ids LIKE '%` + strconv.Itoa(userType) + `%' `
+	return
+}
+
+//获取预报名列表
+func GetActivitySpecialPrepareList(user *models.WxUserItem, startSize, pageSize int, keywords string) (list []*models.CygxActivitySpecialDetail, totalPrepare int, err error) {
+	companyDetail, e := models.GetCompanyDetailByIdGroupTrip(user.CompanyId)
+	if e != nil {
+		err = errors.New("GetCompanyDetailByIdGroupTrip, Err: " + e.Error())
+		return
+	}
+	//如果是永续的就按照普通的权限逻辑来查,如果不是就按照升级的逻辑来查
+	var condition string
+	if companyDetail.Status == "永续" {
+		condition, e = HandleActivityLabelSpecialPermission(user)
+		if e != nil {
+			err = errors.New("HandleActivityLabelSpecialPermission, Err: " + e.Error())
+			return
+		}
+	} else {
+		condition, e = HandleActivityLabelSpecialTripPermission(user)
+		if e != nil {
+			err = errors.New("HandleActivityLabelSpecialPermission, Err: " + e.Error())
+			return
+		}
+	}
+	var pars []interface{}
+	condition += ` AND art.days = 0  AND art.publish_status = 1 AND art.is_offline = 0   `
+	if keywords != "" {
+		keywords = "%" + keywords + "%"
+		condition += ` AND art.research_theme LIKE ? `
+		pars = append(pars, keywords)
+	}
+	totalPrepare, e = models.GetActivitySpecialCount(condition, pars)
+	if e != nil {
+		err = errors.New("GetActivitySpecialCount, Err: " + e.Error())
+		return
+	}
+	condition += `  ORDER BY art.last_updated_time DESC `
+	list, e = models.GetCygxActivitySpecialDetailList(condition, pars, user.UserId, startSize, pageSize)
+	if e != nil {
+		err = errors.New("GetCygxActivitySpecialDetailList, Err: " + e.Error())
+		return
+	}
+	return
+}
+
+/*
+确定行程的查询  GetActivityLabelSpecialConfirmList
+state 进行状态 1:未开始,2:进行中,3:已结束,4:未开始、进行中 不传默认查询全部items []*CygxActivitySpecialDetail
+*/
+func GetActivityLabelSpecialConfirmList(user *models.WxUserItem, startSize, pageSize, state int, keywords string) (list []*models.CygxActivitySpecialDetail, totalConfirm int, err error) {
+	//var condition string
+	companyDetail, e := models.GetCompanyDetailByIdGroupTrip(user.CompanyId)
+	if e != nil {
+		err = errors.New("GetCompanyDetailByIdGroupTrip, Err: " + e.Error())
+		return
+	}
+	//如果是永续的就按照普通的权限逻辑来查,如果不是就按照升级的逻辑来查
+	var condition string
+	if companyDetail.Status == "永续" {
+		condition, e = HandleActivityLabelSpecialPermission(user)
+		if e != nil {
+			err = errors.New("HandleActivityLabelSpecialPermission, Err: " + e.Error())
+			return
+		}
+	} else {
+		condition, e = HandleActivityLabelSpecialTripPermission(user)
+		if e != nil {
+			err = errors.New("HandleActivityLabelSpecialPermission, Err: " + e.Error())
+			return
+		}
+	}
+	var pars []interface{}
+	condition += ` AND art.days >0  AND art.publish_status =1   AND art.is_offline = 0  `
+	if state == 1 {
+		condition += ` AND art.activity_time > ? `
+		pars = append(pars, time.Now())
+	}
+	if state == 2 {
+		condition += ` AND art.activity_time < ? `
+		pars = append(pars, time.Now())
+		condition += ` AND art.activity_time_end > ? `
+		pars = append(pars, time.Now())
+	}
+	if state == 3 {
+		condition += ` AND art.activity_time_end < ? `
+		pars = append(pars, time.Now())
+	}
+	if state == 4 {
+		condition += ` AND art.activity_time_end > ? `
+		pars = append(pars, time.Now())
+	}
+	if keywords != "" {
+		keywords = "%" + keywords + "%"
+		condition += ` AND art.research_theme LIKE ? `
+		pars = append(pars, keywords)
+	}
+	totalConfirm, e = models.GetActivitySpecialCount(condition, pars)
+	if e != nil {
+		err = errors.New("GetActivitySpecialCount, Err: " + e.Error())
+		return
+	}
+	condition += `  ORDER BY art.activity_time ASC `
+	list, e = models.GetCygxActivitySpecialDetailList(condition, pars, user.UserId, startSize, pageSize)
+	if e != nil {
+		err = errors.New("GetCygxActivitySpecialDetailList, Err: " + e.Error())
+		return
+	}
+	var activityIds []int
+	for k, v := range list {
+		resultTimeStart := utils.StrTimeToTime(v.ActivityTime)  //时间字符串格式转时间格式
+		resultTimeEnd := utils.StrTimeToTime(v.ActivityTimeEnd) //时间字符串格式转时间格式
+		if resultTimeStart.After(time.Now()) {
+			list[k].ActiveState = 1
+		} else if time.Now().After(resultTimeEnd) {
+			list[k].ActiveState = 3
+		} else {
+			list[k].ActiveState = 2
+		}
+		if list[k].Days == 0 {
+			list[k].TripStatus = 1
+		} else {
+			list[k].TripStatus = 2
+		}
+		activityIds = append(activityIds, v.ActivityId)
+	}
+
+	//处理用户已经报名了的行程
+	UserMap, e := GetSpecialTripUserMap(activityIds, user.UserId)
+	if e != nil {
+		err = errors.New("GetSpecialTripUserMap, Err: " + e.Error())
+		return
+	}
+	for k, v := range list {
+		if _, ok := UserMap[v.ActivityId]; ok {
+			list[k].IsTrip = 1
+		}
+	}
+	return
+}
+
+//获取用户已经报名的活动
+func GetSpecialTripUserMap(activityIds []int, userId int) (mapUserId map[int]int, err error) {
+	var condition string
+	var pars []interface{}
+	activityIdsLen := len(activityIds)
+	if activityIdsLen > 0 {
+		condition += ` AND activity_id IN (` + utils.GetOrmInReplace(activityIdsLen) + `)`
+		pars = append(pars, activityIds)
+	}
+	condition += ` AND user_id = ?  AND is_cancel = 0 `
+	pars = append(pars, userId)
+	list, e := models.GetCygxActivitySpecialTripList(condition, pars)
+	if e != nil {
+		err = errors.New("GetCygxActivitySpecialTripList, Err: " + e.Error())
+		return
+	}
+	mapUid := make(map[int]int)
+	for _, v := range list {
+		mapUid[v.ActivityId] = v.UserId
+	}
+	mapUserId = mapUid
+	return
+}
+
+//获取用户已经报名的活动数量
+func GetSpecialTripUserSchedule(userId int) (total int, err error) {
+	var condition string
+	var pars []interface{}
+
+	condition += ` AND t.user_id = ? AND t.is_cancel = 0 `
+	pars = append(pars, userId)
+	condition += ` AND a.activity_time_end >= ? `
+	pars = append(pars, time.Now())
+	condition += ` AND is_valid = 1 `
+	total, err = models.GetActivitySpecialTripCountByActivitySpecial(condition, pars)
+	return
+}
+
+//GetActivitySpecialList 获取专项调研列表
+func GetActivitySpecialList(user *models.WxUserItem, currentIndex, pageSize int, keywords string) (list []*models.CygxActivitySpecialDetail, total int, err error) {
+	listConfirm, totalConfirm, e := GetActivityLabelSpecialConfirmList(user, (currentIndex-1)*pageSize, pageSize, 4, keywords)
+	if e != nil {
+		err = errors.New("GetActivityLabelSpecialConfirmList, Err: " + e.Error())
+		return
+	}
+	if currentIndex == 1 && len(listConfirm) > 0 {
+		listConfirm[0].Explain = utils.ACtIVITY_SPECIAL_TRIP_EXPLAIN
+	}
+	list = listConfirm
+	total = totalConfirm
+	var startSizePrepare, pageSizePrepare int
+	//全是确定行程的查询数据
+	if totalConfirm >= currentIndex*pageSize {
+		startSizePrepare = 0
+		pageSizePrepare = 0
+	} else if totalConfirm > (currentIndex-1)*pageSize && totalConfirm < currentIndex*pageSize {
+		//一半确认行程一半预报名
+		startSizePrepare = 0
+		pageSizePrepare = pageSize - len(listConfirm)
+	} else {
+		//全是预报名
+		startSizePrepare = (currentIndex-1)*pageSize - totalConfirm
+		pageSizePrepare = pageSize - len(listConfirm)
+	}
+	listPrepare, totalPrepare, e := GetActivitySpecialPrepareList(user, startSizePrepare, pageSizePrepare, keywords)
+	if e != nil {
+		err = errors.New("GetActivityLabelSpecialConfirmList, Err: " + e.Error())
+		return
+	}
+	if len(listPrepare) > 0 {
+		for _, v := range listPrepare {
+			list = append(list, v)
+		}
+		if startSizePrepare == 0 {
+			listPrepare[0].Explain = utils.ACtIVITY_SPECIAL_EXPLAIN
+		}
+	}
+	total = totalConfirm + totalPrepare
+
+	//处理封面图片
+	detail, e := models.GetConfigByCode("city_img_url")
+	if e != nil {
+		err = errors.New("GetConfigByCode, Err: " + e.Error())
+		return
+	}
+	detailChart, e := models.GetConfigByCode("chart_img_url")
+	if e != nil {
+		err = errors.New("GetConfigByCode, Err: " + e.Error())
+		return
+	}
+	addressList := strings.Split(detail.ConfigValue, "{|}")
+	mapAddress := make(map[string]string)
+	chartList := strings.Split(detailChart.ConfigValue, "{|}")
+	mapChart := make(map[string]string)
+	var cityName string
+	var chartName string
+	var imgUrl string
+	var imgUrlChart string
+	for _, v := range addressList {
+		vslice := strings.Split(v, "_")
+		cityName = vslice[0]
+		imgUrl = vslice[len(vslice)-1]
+		mapAddress[cityName] = imgUrl
+	}
+	for _, v := range chartList {
+		vslice := strings.Split(v, "_")
+		chartName = vslice[0]
+		imgUrlChart = vslice[len(vslice)-1]
+		mapChart[chartName] = imgUrlChart
+	}
+	for k, v := range list {
+		//list[k].ImgUrlText = "https://hongze.oss-cn-shanghai.aliyuncs.com/static/images/202112/20211221/bIdfv8t86xrFRpDOeGGHXOmKEuKl.png"
+		if mapChart[v.ChartPermissionName] != "" {
+			list[k].ImgUrl = mapChart[v.ChartPermissionName]
+		}
+		list[k].ActivityTypeName = "专项调研"
+		if list[k].Days == 0 {
+			list[k].TripStatus = 1
+		} else {
+			list[k].TripStatus = 2
+			list[k].TripImgLink = list[k].TripImgLinkFix
+		}
+	}
+	return
+}
+
+//HandleActivitySpecialShow 处理活动的状态
+func HandleActivitySpecialShow(activityDetail *models.CygxActivitySpecialDetail, user *models.WxUserItem) (item *models.CygxActivitySpecialDetail, err error) {
+	var activityIds []int
+	resultTimeStart := utils.StrTimeToTime(activityDetail.ActivityTime)  //时间字符串格式转时间格式
+	resultTimeEnd := utils.StrTimeToTime(activityDetail.ActivityTimeEnd) //时间字符串格式转时间格式
+	if resultTimeStart.After(time.Now()) {
+		activityDetail.ActiveState = 1
+	} else if time.Now().After(resultTimeEnd) {
+		activityDetail.ActiveState = 3
+	} else {
+		activityDetail.ActiveState = 2
+	}
+	activityIds = append(activityIds, activityDetail.ActivityId)
+	//处理用户已经报名了的行程
+	UserMap, e := GetSpecialTripUserMap(activityIds, user.UserId)
+	if e != nil {
+		err = errors.New("GetSpecialTripUserMap, Err: " + e.Error())
+		return
+	}
+	if activityDetail.Days == 0 {
+		activityDetail.TripStatus = 1
+		activityDetail.Explain = utils.ACtIVITY_SPECIAL_EXPLAIN
+	} else {
+		activityDetail.TripStatus = 2
+		activityDetail.TripImgLink = activityDetail.TripImgLinkFix
+		activityDetail.Explain = utils.ACtIVITY_SPECIAL_TRIP_EXPLAIN
+	}
+	if _, ok := UserMap[activityDetail.ActivityId]; ok {
+		activityDetail.IsTrip = 1
+	}
+	item = activityDetail
+	return
+}
+
+//活动与专项调研搜索 GetActivitySpecialSearcheList
+func GetActivitySpecialSearcheList(user *models.WxUserItem, condition string, startSize, pageSize int, keywords string) (items []*models.ActivityDetail, total int, err error) {
+	var conditionSpecil string
+	var pars, parsSpecil []interface{}
+	if keywords != "" {
+		keywords = "%" + keywords + "%"
+		conditionSpecil += ` AND art.days > 0 AND (art.research_theme LIKE ? OR art.label LIKE ? OR art.industrial_name LIKE ? OR art.industrial_subject_name LIKE ? ) `
+		parsSpecil = append(parsSpecil, keywords, keywords, keywords, keywords)
+	}
+	list, totalSearche, e := models.GetActivitySpecialSearcheList(condition, pars, conditionSpecil, parsSpecil, startSize, pageSize)
+	if e != nil {
+		err = errors.New("GetActivitySpecialSearcheList, Err: " + e.Error())
+		return
+	}
+	items, e = HandleActivityListButton(list, user)
+	if e != nil {
+		err = errors.New("HandleActivityListButton, Err: " + e.Error())
+		return
+	}
+	total = totalSearche
+	return
+}
+
+//获取 专项调研客户类型   //1、永续客户 //2、大套餐客户(4个行业全开通的正式客户) //8、行业升级套餐客户 //9、其余正式客户;5、试用客户
+func GetActivitySpecialUserType(companyId int) (userType int, permissionStrnew string, err error) {
+	var permissionStr string
+	if companyId <= 1 {
+		userType = 0
+	} else {
+		total, e := models.GetCountCompanyDetailByIdGroupTrip(companyId)
+		if e != nil {
+			err = errors.New("GetCountCompanyDetailByIdGroupTrip, Err: " + e.Error())
+			return
+		}
+		if total == 0 {
+			userType = 0
+		} else {
+			companyDetail, e := models.GetCompanyDetailByIdGroupTrip(companyId)
+			if e != nil {
+				err = errors.New("GetCompanyDetailByIdGroupTrip, Err: " + e.Error())
+				return
+			}
+			permissionStr, e = models.GetCompanyPermissionByUserTrip(companyId)
+			if e != nil {
+				err = errors.New("GetCompanyPermissionByUserTrip, Err: " + e.Error())
+				return
+			}
+			//permissionZhengShiStr, e = models.GetCompanyPermissionByUserZhengShiTrip(companyId)
+			//if e != nil {
+			//	err = errors.New("GetCompanyPermissionByUserZhengShiTrip, Err: " + e.Error())
+			//	return
+			//}
+			//大套餐客户定义:医药、消费、科技、智造。4个行业中为升级,策略是正式,属于大套餐客户
+			if companyDetail.Status == "永续" {
+				userType = 1
+			} else if companyDetail.Status == "试用" {
+				userType = 5
+			} else if companyDetail.Status == "正式" {
+				if permissionStr == "专家" {
+					userType = 4
+				} else if strings.Count(permissionStr, "医药") == 2 && strings.Count(permissionStr, "消费") == 2 && strings.Count(permissionStr, "科技") == 2 && strings.Count(permissionStr, "智造") == 2 && strings.Count(permissionStr, "策略") == 1 {
+					userType = 2
+				} else {
+					userType = 3
+				}
+				if userType == 3 {
+					if !strings.Contains(permissionStr, "医药") && !strings.Contains(permissionStr, "消费") && !strings.Contains(permissionStr, "科技") && !strings.Contains(permissionStr, "智造") {
+						userType = 4
+					}
+				}
+			} else if companyDetail.Status == "冻结" {
+				userType = 6
+			} else if companyDetail.Status == "流失" {
+				userType = 7
+			}
+		}
+	}
+	permissionStrnew = permissionStr
+	return
+}
+
+//GetSpecialUserType 获取专项产业调研的用户身份类型
+//获取 专项调研客户类型   //1、永续客户 //2、大套餐客户(4个行业全开通的正式客户) //8、行业升级套餐客户 //9、其余正式客户;5、试用客户
+func GetSpecialUserType(user *models.WxUserItem) (userType int, err error) {
+	companyId := user.CompanyId
+	companyDetail, e := models.GetCompanyDetailByIdGroupTrip(companyId)
+	if e != nil {
+		err = errors.New("GetCompanyDetailByIdGroupTrip, Err: " + e.Error())
+		return
+	}
+	if companyId <= 1 {
+		userType = 0
+	} else {
+		if companyDetail.Status == "永续" {
+			userType = 1
+		} else {
+			if companyDetail.Status == "正式" {
+				list, e := models.GetCompanyReportPermissionUpgrade(companyId, 2)
+				if e != nil && e.Error() != utils.ErrNoRow() {
+					err = errors.New("GetCompanyReportPermissionUpgrade, Err: " + e.Error())
+				}
+				if len(list) == 0 {
+					userType = 9
+				}
+				if len(list) == 4 {
+					totalName, e := models.GetCompanyPermissionNameCheck(companyId, 2, "策略")
+					if e != nil {
+						err = errors.New("获取品种信息失败, Err:" + e.Error())
+						return
+					}
+					if totalName > 0 {
+						userType = 2
+					} else {
+						userType = 8
+					}
+				} else {
+					userType = 8
+				}
+			} else if companyDetail.Status == "试用" {
+				userType = 5
+			}
+		}
+	}
+	return
+}
+
+//GetSpecialDetailUserPower 处理用户查看专项调研详情的权限
+func GetSpecialDetailUserPower(user *models.WxUserItem, activityInfo *models.CygxActivitySpecialDetail) (havePower bool, err error) {
+	permissionStr, e := GetCompanyPermissionUpgrade(user.CompanyId)
+	if e != nil {
+		err = errors.New("GetCompanyPermissionUpgrade, Err: " + e.Error())
+		return
+	}
+	fmt.Println(permissionStr)
+	//如果没有对应的升级权限,则返回
+	if !strings.Contains(permissionStr, activityInfo.ChartPermissionName) {
+		return
+	}
+	userType, e := GetSpecialUserType(user)
+	if e != nil {
+		err = errors.New("GetSpecialUserType, Err: " + e.Error())
+		return
+	}
+	if userType == 0 {
+		return
+	}
+	var pars []interface{}
+	var condition string
+	var userTypes string
+	condition += `  AND art.publish_status = 1 AND art.is_offline = 0   `
+	userTypes = "%" + strconv.Itoa(userType) + "%"
+	condition += ` AND art.customer_type_ids LIKE ? `
+	pars = append(pars, userTypes)
+
+	condition += ` AND art.activity_id = ? `
+	pars = append(pars, activityInfo.ActivityId)
+
+	total, e := models.GetActivitySpecialCount(condition, pars)
+	if e != nil {
+		err = errors.New("GetSpecialUserType, Err: " + e.Error())
+		return
+	}
+	if total == 1 {
+		havePower = true
+	}
+	return
+}
+
+//预报名活动,感兴趣人数满10人时,推送给活动负责人和王芳
+func SendWxMsgActivitySpecial10(activityInfo *models.CygxActivitySpecialDetail) (err error) {
+	activityId := activityInfo.ActivityId
+	var msg string
+	defer func() {
+		if err != nil {
+			go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
+			go utils.SendAlarmMsg(fmt.Sprint("预报名活动,感兴趣人数满10人时,推送给活动负责人和王芳消息发送失败", activityInfo.ResearchTheme, ", activityId"), 2)
+			utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
+		}
+	}()
+	var first string
+	var keyword1 string
+	var keyword2 string
+	var keyword3 string
+	var keyword4 string
+	var remark string
+
+	adminUser, e := models.GetSellerByAdminId(activityInfo.AdminId)
+	if e != nil {
+		err = errors.New("GetSellerByAdminId, Err: " + e.Error())
+		return
+	}
+	cnf, _ := models.GetConfigByCode("tpl_msg")
+	mobile := adminUser.Mobile + "," + cnf.ConfigValue
+
+	specialSignupList, e := models.GetActivityListSpecialByActivityId(activityId)
+	if e != nil {
+		err = errors.New("GetActivityListSpecialAll, Err: " + e.Error())
+		return
+	}
+	for _, v := range specialSignupList {
+		keyword1 += "【" + v.RealName + "--" + v.CompanyName + "】"
+	}
+	openIdList, e := models.GetWxOpenIdByMobileList(mobile)
+	if e != nil {
+		err = errors.New("GetSellerByAdminId, Err: " + e.Error())
+		return
+	}
+	first = "【" + activityInfo.ResearchTheme + "】已有10人预报名"
+	keyword3 = "-"
+	keyword2 = "-"
+	keyword4 = activityInfo.ResearchTheme
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+	redirectUrl := utils.WX_MSG_PATH_ACTIVITY_SPECIAL_DETAIL + strconv.Itoa(activityId)
+	sendInfo := new(SendWxTemplate)
+	sendInfo.First = first
+	sendInfo.Keyword1 = keyword1
+	sendInfo.Keyword2 = keyword2
+	sendInfo.Keyword3 = keyword3
+	sendInfo.Keyword4 = keyword4
+	sendInfo.Remark = remark
+	sendInfo.TemplateId = utils.WxMsgTemplateIdAskMsgXzs
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	sendInfo.Resource = strconv.Itoa(activityId)
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
+	sendInfo.OpenIdArr = openIdArr
+	err = PublicSendTemplateMsg(sendInfo)
+	if err != nil {
+		return
+	}
+	return
+}
+
+//SendWxMsgActivitySpecialTwoDays  活动开始前两天08:00,提醒报名客户 \提醒报名客户的对口销售
+func SendWxMsgActivitySpecialTwoDays(cont context.Context) (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
+			go utils.SendAlarmMsg(fmt.Sprint(" 活动开始前两天08:00,提醒报名客户、提醒报名客户的对口销售消息发送失败"), 2)
+			utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
+		}
+	}()
+	twoDayTime := time.Now().AddDate(0, 0, 2)
+	startTime := twoDayTime.Format(utils.FormatDate) + " 00:00:00"
+	endTime := twoDayTime.Format(utils.FormatDate) + " 23:59:59"
+	var condition string
+	var pars []interface{}
+	condition = ` AND  days >0  AND activity_time BETWEEN ? AND  ? `
+	pars = append(pars, startTime, endTime)
+	listActivitySpecial, e := models.GetActivitySpecialListAll(condition, pars, 0, 1000)
+	if e != nil {
+		err = errors.New("GetSellerByAdminId, Err: " + e.Error())
+		return
+	}
+	if len(listActivitySpecial) == 0 {
+		return
+	}
+
+	var activityIds []int
+
+	for _, v := range listActivitySpecial {
+		activityIds = append(activityIds, v.ActivityId)
+		condition = `  AND is_cancel = 0 AND activity_id = ` + strconv.Itoa(v.ActivityId)
+		pars = make([]interface{}, 0)
+		listSpecialTrip, e := models.GetCygxActivitySpecialTripList(condition, pars)
+		if e != nil {
+			err = errors.New("GetCygxActivitySpecialTripList, Err: " + e.Error())
+			return
+		}
+		if len(listSpecialTrip) == 0 {
+			return
+		}
+		var mobile string
+		var companyIds []int
+		for _, vT := range listSpecialTrip {
+			mobile += "'" + vT.Mobile + "',"
+			companyIds = append(companyIds, vT.CompanyId)
+		}
+		mobile = strings.TrimRight(mobile, ",")
+		openIdList, e := models.GetWxOpenIdByMobileList(mobile)
+		if e != nil {
+			err = errors.New("GetSellerByAdminId, Err: " + e.Error())
+			return
+		}
+		first := "【" + v.ResearchTheme + "】专项调研将在两天后进行,如不能参加,请及时取消报名"
+		keyword1 := v.ResearchTheme
+		keyword2 := "已报名"
+		keyword3 := v.ActivityTimeTextByDay
+		keyword4 := "线上"
+		if v.SpecialType == 2 {
+			keyword4 = v.City
+		}
+		remark := "点击查看活动详情"
+		SendWxMsgWithFrequency(first, keyword1, keyword2, keyword3, keyword4, remark, openIdList, v.ActivityId)
+
+		//活动开始前两天08:00,提醒报名客户的对口销售
+		companyIdsLen := len(companyIds)
+		if companyIdsLen == 0 {
+			continue
+		} else {
+			pars = make([]interface{}, 0)
+			condition = ` AND p.company_id IN (` + utils.GetOrmInReplace(companyIdsLen) + `)  GROUP BY  p.company_id  `
+			pars = append(pars, companyIds)
+
+			listSeller, e := models.GetAdminOpendidByCompany(condition, pars)
+			if e != nil && e.Error() != utils.ErrNoRow() {
+				err = errors.New("GetAdminOpendidByCompany, Err: " + e.Error())
+				return
+			}
+			if len(listSeller) == 0 {
+				continue
+			}
+			type SllerData struct {
+				Openid  string `description:"Openid"`
+				Keyword string `description:"Keyword "`
+			}
+			mapSller := make(map[string]string)
+			mapSllerOpenid := make(map[string]string)
+			for _, vS := range listSeller {
+				for _, vT := range listSpecialTrip {
+					if vT.CompanyId == vS.CompanyId {
+						mapSller[vS.Mobile] += "【" + vT.RealName + "--" + vT.CompanyName + "】"
+						mapSllerOpenid[vS.Mobile] = vS.OpenId
+					}
+				}
+			}
+			for k, vM := range mapSller {
+				first = "【" + v.ResearchTheme + "】专项调研将在两天后进行,请及时提醒您的报名客户"
+				keyword2 = vM
+				openIdList = make([]*models.OpenIdList, 0)
+				openIdList = append(openIdList, &models.OpenIdList{OpenId: mapSllerOpenid[k]})
+				SendWxMsgWithFrequency(first, keyword1, keyword2, keyword3, keyword4, remark, openIdList, v.ActivityId)
+			}
+		}
+	}
+	return
+}
+
+//SendWxMsgActivitySpecialCancel  线下活动前4天08:00报名人数不足7人,线上活动前3天08:00报名人数不足10人,活动自动取消发布,并推送模板消息至报名客户及对口销售
+func SendWxMsgActivitySpecialCancel(cont context.Context) (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
+			go utils.SendAlarmMsg(fmt.Sprint(" 活动开始前两天08:00,提醒报名客户、提醒报名客户的对口销售消息发送失败"), 2)
+			utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
+		}
+	}()
+	dayTime3 := time.Now().AddDate(0, 0, 3)
+	startTime := dayTime3.Format(utils.FormatDate) + " 00:00:00"
+	endTime := dayTime3.Format(utils.FormatDate) + " 23:59:59"
+
+	dayTime4 := time.Now().AddDate(0, 0, 4)
+	startTime4 := dayTime4.Format(utils.FormatDate) + " 00:00:00"
+	endTime4 := dayTime4.Format(utils.FormatDate) + " 23:59:59"
+	var condition string
+	var pars []interface{}
+	condition = ` AND days >0  AND activity_time BETWEEN ? AND  ? AND special_type= 1 `
+	pars = append(pars, startTime, endTime)
+
+	condition += ` OR ( days >0  AND activity_time BETWEEN ? AND  ? AND special_type= 2 ) `
+	pars = append(pars, startTime4, endTime4)
+
+	listActivitySpecial, e := models.GetActivitySpecialListAll(condition, pars, 0, 1000)
+	if e != nil {
+		err = errors.New("GetSellerByAdminId, Err: " + e.Error())
+		return
+	}
+	if len(listActivitySpecial) == 0 {
+		return
+	}
+
+	var activityIds []int
+
+	for _, v := range listActivitySpecial {
+		activityIds = append(activityIds, v.ActivityId)
+		condition = ` AND is_cancel = 0  AND activity_id = ` + strconv.Itoa(v.ActivityId)
+		pars = make([]interface{}, 0)
+		listSpecialTrip, e := models.GetCygxActivitySpecialTripList(condition, pars)
+		if e != nil {
+			err = errors.New("GetCygxActivitySpecialTripList, Err: " + e.Error())
+			return
+		}
+		if v.SpecialType == 1 {
+			if len(listSpecialTrip) >= 10 {
+				continue
+			}
+		}
+		if v.SpecialType == 2 {
+			if len(listSpecialTrip) >= 7 {
+				continue
+			}
+		}
+		e = models.UpdateActivitySpecialPublishStatus(0, v.ActivityId)
+		if e != nil {
+			err = errors.New("UpdateActivitySpecialPublishStatus,自动取消专项调研日程失败 Err: " + e.Error() + strconv.Itoa(v.ActivityId))
+			return
+		}
+		if len(listSpecialTrip) < 0 {
+			return
+		}
+		var mobile string
+		var companyIds []int
+		for _, vT := range listSpecialTrip {
+			mobile += "'" + vT.Mobile + "',"
+			companyIds = append(companyIds, vT.CompanyId)
+		}
+		mobile = strings.TrimRight(mobile, ",")
+		openIdList, e := models.GetWxOpenIdByMobileList(mobile)
+		if e != nil {
+			err = errors.New("GetSellerByAdminId, Err: " + e.Error())
+			return
+		}
+		first := "【" + v.ResearchTheme + "】专项调研因专家安排变动,本次调研活动延期举办,具体时间另行通知"
+		keyword1 := v.ResearchTheme
+		keyword2 := "已取消"
+		keyword3 := ""
+		keyword4 := ""
+		remark := ""
+
+		openIdArr := make([]string, 0)
+		for _, vOpenid := range openIdList {
+			openIdArr = append(openIdArr, vOpenid.OpenId)
+		}
+		companyIdsLen := len(companyIds)
+		if len(companyIds) > 0 {
+			pars = make([]interface{}, 0)
+			condition = ` AND p.company_id IN (` + utils.GetOrmInReplace(companyIdsLen) + `)  GROUP BY  p.company_id  `
+			pars = append(pars, companyIds)
+			listSeller, e := models.GetAdminOpendidByCompany(condition, pars)
+			if e != nil && e.Error() != utils.ErrNoRow() {
+				err = errors.New("GetAdminOpendidByCompany, Err: " + e.Error())
+				return
+			}
+			if len(listSeller) > 0 {
+				for _, vOpenid := range listSeller {
+					openIdArr = append(openIdArr, vOpenid.OpenId)
+				}
+			}
+		}
+		redirectUrl := ""
+		sendInfo := new(SendWxTemplate)
+		sendInfo.First = first
+		sendInfo.Keyword1 = keyword1
+		sendInfo.Keyword2 = keyword2
+		sendInfo.Keyword3 = keyword3
+		sendInfo.Keyword4 = keyword4
+		sendInfo.Remark = remark
+		sendInfo.TemplateId = utils.WxMsgTemplateIdArticleUserRemind
+		sendInfo.RedirectUrl = redirectUrl
+		sendInfo.RedirectTarget = 3
+		sendInfo.Resource = strconv.Itoa(v.ActivityId)
+		sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
+		sendInfo.OpenIdArr = openIdArr
+		fmt.Println(sendInfo)
+		err = PublicSendTemplateMsg(sendInfo)
+	}
+	return
+}

+ 127 - 0
services/activity_special_trip.go

@@ -0,0 +1,127 @@
+package services
+
+import (
+	"errors"
+	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/utils"
+	"time"
+)
+
+func SpecialTripPopupMsg(activityInfo *models.CygxActivitySpecialDetail, user *models.WxUserItem) (signupStatus int, popupMsg, popupMsg2 string, err error) {
+	//SignupStatus  int    `description:"返回状态:1:成功 、2 :人数已满 、3:调研次数已用完、 4:超时"`
+	signupStatus = 1
+	resultTime := utils.StrTimeToTime(activityInfo.ActivityTime) //时间字符串格式转时间格式
+	if time.Now().After(resultTime.Add(-time.Minute * 60)) {
+		signupStatus = 4
+		popupMsg = "活动开始前1小时内无法报名,请联系对口销售处理"
+		return
+	}
+
+	errMsg, _, e := GetTripRemainingtimesBycompany(user, activityInfo)
+	if e != nil {
+		err = errors.New("获取客户剩余报名次数失败 GetActivitySpecialUserType, Err: " + e.Error())
+		return
+	}
+	if errMsg != "" {
+		popupMsg = errMsg
+		signupStatus = 3
+		return
+	}
+	var condition string
+	var pars []interface{}
+
+	condition += ` AND activity_id =  ? AND  is_cancel = 0 `
+	pars = append(pars, activityInfo.ActivityId)
+
+	tripTota, e := models.GetActivitySpecialTripCountByActivityId(condition, pars)
+	if e != nil {
+		err = errors.New("GetCygxActivitySpecialDetailList, Err: " + e.Error())
+		return
+	}
+	if activityInfo.LimitPeopleNum-tripTota < 1 {
+		signupStatus = 2
+		popupMsg = "此活动报名人数已满,请留意下期活动"
+		return
+	}
+	//signupStatus = 4
+	popupMsg = "感谢参与,本次报名会扣除一次贵司在弘则的调研点数。"
+	popupMsg2 = "由于每场活动人数有限,如果不能参加请提前48小时取消,未及时取消导致影响其他客户报名将会维持扣点。"
+	return
+}
+
+//获取用户剩余报名次数
+func GetTripRemainingtimesBycompany(user *models.WxUserItem, activityInfo *models.CygxActivitySpecialDetail) (errMsg string, tripRemaining int, err error) {
+
+	//获取 专项调研客户类型   //1、永续客户 //2、大套餐客户(4个行业全开通的正式客户) //3、分行业套餐客户(开通对应行业的正式客户) //4、仅开通专家套餐的正式客户 //5、开通对应行业套餐或专家套餐的试用客户;6、冻结客户;7、流失客户 8:行业升级套餐客户
+	msgTemplate := "您的专项调研次数已用完,如仍想参加,请与您的对口销售商议"
+	var tripTota int
+	var airborneTota int
+	userType, _, e := GetActivitySpecialUserType(user.CompanyId)
+	if e != nil {
+		err = errors.New("获取客户身份信息失败 GetActivitySpecialUserType, Err: " + e.Error())
+		return
+	}
+	if userType == 0 {
+		errMsg = msgTemplate
+		return
+	} else if userType == 1 {
+		tripRemaining = 999
+		return
+	} else if userType == 2 {
+		var condition string
+		var pars []interface{}
+
+		condition += ` AND company_id = ? `
+		pars = append(pars, user.CompanyId)
+
+		airborneTota, e = models.GetActivitySpecialTripAirborneCountByActivitySpecial(condition, pars)
+		if e != nil {
+			err = errors.New("GetActivitySpecialTripAirborneCountByActivitySpecial, Err: " + e.Error())
+			return
+		}
+
+		condition += ` AND is_valid = 1 `
+
+		tripTota, e = models.GetActivitySpecialTripCountByActivitySpecial(condition, pars)
+		if e != nil {
+			err = errors.New("GetActivitySpecialTripCountByActivitySpecial, Err: " + e.Error())
+			return
+		}
+		tripTota += airborneTota
+		if tripTota >= 12 {
+			errMsg = msgTemplate
+			return
+		}
+		tripRemaining = 12 - tripTota
+	} else {
+		var condition string
+		var pars []interface{}
+
+		condition += ` AND company_id = ? `
+		pars = append(pars, user.CompanyId)
+
+		condition += ` AND chart_permission_id = ? `
+		pars = append(pars, activityInfo.ChartPermissionId)
+
+		airborneTota, e = models.GetActivitySpecialTripAirborneCountByActivitySpecial(condition, pars)
+		if e != nil {
+			err = errors.New("GetActivitySpecialTripAirborneCountByActivitySpecial, Err: " + e.Error())
+			return
+		}
+
+		condition += ` AND is_valid = 1 `
+
+		tripTota, e = models.GetActivitySpecialTripCountByActivitySpecial(condition, pars)
+		if e != nil {
+			err = errors.New("GetActivitySpecialTripCountByActivitySpecial, Err: " + e.Error())
+			return
+		}
+		tripTota += airborneTota
+		if tripTota >= 6 {
+			errMsg = msgTemplate
+			return
+		}
+		tripRemaining = 6 - tripTota
+	}
+	return
+}

+ 43 - 10
services/article.go

@@ -3,6 +3,7 @@ package services
 import (
 	"context"
 	"encoding/json"
+	"errors"
 	"fmt"
 	"github.com/PuerkitoBio/goquery"
 	"github.com/beego/beego/v2/client/orm"
@@ -672,7 +673,7 @@ func GetArticleListByApi(cont context.Context) (err error) {
 }
 
 //func init() {
-//	HandleArticleListByApi(5978)
+//	HandleArticleListByApi(6005)
 //}
 
 //处理同步过来的文章
@@ -738,6 +739,10 @@ func HandleArticleListByApi(artcleId int) (err error) {
 	var list []*models.Tactics2
 	var listArticleData []*models.CygxArticleData
 	var listAuthor []*models.CygxArticleAuthor
+	//如果是英文报告那么则不同步
+	if articleResult.TypeId == 9 {
+		return
+	}
 
 	//状态等于 2 跟 4 的进行同步
 	if exitMap[articleResult.SeriesId] > 0 && (articleResult.PublishStatus == 2 || articleResult.PublishStatus == 4) {
@@ -911,6 +916,7 @@ func HandleArticleListByApi(artcleId int) (err error) {
 				return err
 			}
 			v.CategoryId = detailCategory.CategoryId
+			v.IsSummary = 0
 		}
 
 		if count > 0 {
@@ -1107,16 +1113,17 @@ func HandleArticleListByApi(artcleId int) (err error) {
 					fmt.Println("AddCygxArticleData Err:", err.Error())
 					return err
 				}
-			} else {
-				updateParams := make(map[string]interface{})
-				updateParams["Cover"] = v.Cover
-				whereParam := map[string]interface{}{"article_id": v.ArticleId}
-				err = models.UpdateByExpr(models.CygxArticleData{}, whereParam, updateParams)
-				if err != nil {
-					fmt.Println("UpdateByExpr CygxArticleData Err:" + err.Error())
-					return err
-				}
 			}
+			//} else {
+			//	updateParams := make(map[string]interface{})
+			//	updateParams["Cover"] = v.Cover
+			//	whereParam := map[string]interface{}{"article_id": v.ArticleId}
+			//	err = models.UpdateByExpr(models.CygxArticleData{}, whereParam, updateParams)
+			//	if err != nil {
+			//		fmt.Println("UpdateByExpr CygxArticleData Err:" + err.Error())
+			//		return err
+			//	}
+			//}
 		}
 	}
 	return err
@@ -1555,3 +1562,29 @@ func DoArticleOnenIdWxTemplateMsg(articleId int) (err error) {
 	utils.Rc.Put(cacheKey, articleId, time.Hour*12)
 	return
 }
+
+//GetSpecialArticleDetailUserPower 处理用户查看专项调研文章详情的权限
+func GetSpecialArticleDetailUserPower(user *models.WxUserItem, articleInfo *models.ArticleDetail) (havePower bool, err error) {
+	permissionStr, e := GetCompanyPermissionUpgrade(user.CompanyId)
+	if e != nil {
+		err = errors.New("GetCompanyPermissionUpgrade, Err: " + e.Error())
+		return
+	}
+	reportMapDetail, e := models.GetdetailByCategoryIdPush(articleInfo.CategoryId)
+	if e != nil {
+		err = errors.New("GetdetailByCategoryIdPush, Err: " + e.Error())
+		return
+	}
+	if reportMapDetail == nil {
+		err = errors.New("GetdetailByCategoryIdP,获取详情失败, Err: " + e.Error())
+		return
+	}
+	fmt.Println(permissionStr)
+	//如果没有对应的升级权限,则返回
+	if !strings.Contains(permissionStr, reportMapDetail.ChartPermissionName) {
+		return
+	} else {
+		havePower = true
+	}
+	return
+}

+ 118 - 0
services/company_permission.go

@@ -0,0 +1,118 @@
+package services
+
+import (
+	"errors"
+	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/utils"
+	"strings"
+)
+
+//GetCompanyPermission 获取公司对应的权限名称
+func GetCompanyPermission(companyId int) (permissionStr string, err error) {
+	permissionStr, err = models.GetCompanyPermission(companyId)
+	if err != nil {
+		return
+	}
+	permissionStr = strings.Replace(permissionStr, "(主观)", "", -1)
+	permissionStr = strings.Replace(permissionStr, "(客观)", "", -1)
+	return
+}
+
+//GetCompanyPermissionUpgrade 获取公司对应的升级权限名称
+func GetCompanyPermissionUpgrade(companyId int) (permissionStr string, err error) {
+	permissionStr, err = models.GetCompanyPermissionByUserTrip(companyId)
+	if err != nil {
+		return
+	}
+	permissionStr = strings.Replace(permissionStr, "(主观)", "", -1)
+	permissionStr = strings.Replace(permissionStr, "(客观)", "", -1)
+	return
+}
+
+//获取用户对应的权限申请状态
+func GetUserHasPermission(user *models.WxUserItem) (hasPermission int, sellerName, sellerMobile, popupMsg string, err error) {
+	//HasPermission     int    `description:"操作方式,1:有该行业权限,正常展示,2:无该行业权限,3:潜在客户,未提交过申请,4:潜在客户,已提交过申请,5:有IFCC、无权益"`
+	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 = 3
+		} else {
+			hasPermission = 4
+		}
+	} else {
+		companyPermission, e := models.GetCompanyPermission(user.CompanyId)
+		if e != nil {
+			err = errors.New("GetCompanyPermission, Err: " + e.Error())
+			return
+		}
+		if companyPermission != "" {
+			if applyCount > 0 {
+				hasPermission = 4
+			} else {
+				//获取权益销售信息 如果是FICC的客户类型,则默认他申请过
+				sellerItemQy, e := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+				if e != nil && e.Error() != utils.ErrNoRow() {
+					err = errors.New("GetSellerByCompanyIdCheckFicc, Err: " + e.Error())
+					return
+				}
+				if sellerItemQy != nil {
+					hasPermission = 2
+					sellerName = sellerItemQy.Mobile
+					sellerMobile = sellerItemQy.RealName
+				} else {
+					hasPermission = 5
+				}
+			}
+		}
+	}
+	popupMsg = "需要升级行业套餐权限才可参与此活动,请联系对口销售"
+	return
+}
+
+//获取用户对应的权限申请状态 文章详情
+func GetUserHasPermissionArticle(user *models.WxUserItem) (hasPermission int, sellerName, sellerMobile, popupMsg string, err error) {
+	//`description:"1:有该行业权限,正常展示,2:无该行业权限,不存在权益客户下,3:无该品类权限,4:潜在客户,未提交过申请,5:潜在客户,已提交过申请"`
+	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 = 4
+		} else {
+			hasPermission = 5
+		}
+	} else {
+		companyPermission, e := models.GetCompanyPermission(user.CompanyId)
+		if e != nil {
+			err = errors.New("GetCompanyPermission, Err: " + e.Error())
+			return
+		}
+		if companyPermission != "" {
+			if applyCount > 0 {
+				hasPermission = 2
+			} else {
+				hasPermission = 3
+				//获取权益销售信息 如果是FICC的客户类型,则默认他申请过
+				sellerItemQy, e := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+				if e != nil && e.Error() != utils.ErrNoRow() {
+					err = errors.New("GetSellerByCompanyIdCheckFicc, Err: " + e.Error())
+					return
+				}
+				if sellerItemQy != nil {
+					sellerName = sellerItemQy.Mobile
+					sellerMobile = sellerItemQy.RealName
+				}
+			}
+		}
+	}
+	popupMsg = "需要升级行业套餐权限才可查看此报告,请联系对口销售"
+	return
+}

+ 12 - 0
services/config.go

@@ -17,3 +17,15 @@ func GetShowSustainable() (isShowSustainable bool) {
 	}
 	return
 }
+
+func GetShowSustainableNew() (isShowSustainable bool, err error) {
+	total, err := models.GetShowSustainable()
+	if err != nil {
+		fmt.Println("GetShowSustainable Err:", err.Error())
+		return
+	}
+	if total > 0 {
+		isShowSustainable = true
+	}
+	return
+}

+ 2 - 2
services/report_billboard.go

@@ -12,7 +12,7 @@ import (
 func UpdateDailyMonthReadBillboard(cont context.Context) (err error) {
 	defer func() {
 		if err != nil {
-			go utils.SendAlarmMsg("查研观向-每日更新月阅读飙升榜单失败, ErrMsg: " + err.Error(), 3)
+			go utils.SendAlarmMsg("查研观向-每日更新月阅读飙升榜单失败, ErrMsg: "+err.Error(), 3)
 		}
 	}()
 
@@ -38,4 +38,4 @@ func UpdateDailyMonthReadBillboard(cont context.Context) (err error) {
 		return
 	}
 	return
-}
+}

+ 6 - 0
services/task.go

@@ -96,6 +96,12 @@ func Task() {
 		addctivitySignupDetail := task.NewTask("addctivitySignupDetail", "0 0 23 * * *", AddctivitySignupDetail) // 获取当天已结束的活动的报名信息。添加到到会详情
 		task.AddTask("addctivitySignupDetail", addctivitySignupDetail)
 
+		sendWxMsgActivitySpecialTwoDays := task.NewTask("sendWxMsgActivitySpecialTwoDays", "0 0 8 * * *", SendWxMsgActivitySpecialTwoDays)
+		task.AddTask("sendWxMsgActivitySpecialTwoDays", sendWxMsgActivitySpecialTwoDays) //活动开始前两天08:00,提醒报名客户 \提醒报名客户的对口销售
+
+		sendWxMsgActivitySpecialCancel := task.NewTask("sendWxMsgActivitySpecialCancel", "0 0 8 * * *", SendWxMsgActivitySpecialCancel)
+		task.AddTask("sendWxMsgActivitySpecialCancel", sendWxMsgActivitySpecialCancel) // 线下活动前4天08:00报名人数不足7人,线上活动前3天08:00报名人数不足10人,活动自动取消发布,并推送模板消息至报名客户及对口销售
+
 	}
 	if utils.RunMode != "release" {
 		getArticleListByApi := task.NewTask("getArticleListByApi", "0 */60 * * * *", GetArticleListByApi) //通过三方接口获取策略平台上的文章

+ 3 - 3
utils/common.go

@@ -802,13 +802,13 @@ func GetNowMonthLastDay() time.Time {
 
 // GetNowMonthFirstDay 获取上月第一天的时间
 func GetLastMonthFirstDay() time.Time {
-	nowMonthFirstDay := time.Date(time.Now().Year(), time.Now().AddDate(0,-1,0).Month(), 1, 0, 0, 0, 0, time.Now().Location())
+	nowMonthFirstDay := time.Date(time.Now().Year(), time.Now().AddDate(0, -1, 0).Month(), 1, 0, 0, 0, 0, time.Now().Location())
 	return nowMonthFirstDay
 }
 
 // GetNowMonthLastDay 获取上月最后一天的时间
 func GetLastMonthLastDay() time.Time {
-	nowMonthLastDay := time.Date(time.Now().Year(), time.Now().AddDate(0,-1,0).Month(), 1, 0, 0, 0, 0, time.Now().Location()).AddDate(0, 1, -1)
+	nowMonthLastDay := time.Date(time.Now().Year(), time.Now().AddDate(0, -1, 0).Month(), 1, 0, 0, 0, 0, time.Now().Location()).AddDate(0, 1, -1)
 	nowMonthLastDay = time.Date(nowMonthLastDay.Year(), nowMonthLastDay.Month(), nowMonthLastDay.Day(), 23, 59, 59, 0, nowMonthLastDay.Location())
 	return nowMonthLastDay
-}
+}

+ 10 - 1
utils/constants.go

@@ -90,6 +90,7 @@ const (
 	ZHI_ZAO_NAME                     string = "智造"
 	ZHI_ZAO_ID                       int    = 19
 	LINK_WX_EXPLAIN                         = "https://mp.weixin.qq.com/s?__biz=Mzg2OTYzODk0Nw==&mid=2247483662&idx=1&sn=3752df99025189b9d77fe658bfc0edbd&chksm=ce98b742f9ef3e54b49986e647dd951a3aad74f323174b252174e0938c264c0562c8ec455106#rd" //用户阅读数据
+	ACTIVITY_SPECIAL_EXPLAIN                = "预报名专项调研行程持续更新中,满10家即开团,欢迎点击感兴趣预报名"                                                                                                                                                                //用户阅读数据
 	HZ_COMPANY_ID                    int    = 16                                                                                                                                                                                                 // 弘则公司的ID
 	HONG_GUAN_NAME                   string = "宏观"
 	HONG_GUAN_ID                     int    = 1
@@ -141,5 +142,13 @@ const (
 
 //模板消息地址路由
 const (
-	WX_MSG_PATH_ARTICLE_DETAIL = "pageMy/reportDetail/reportDetail?id="
+	WX_MSG_PATH_ARTICLE_DETAIL          = "pageMy/reportDetail/reportDetail?id="          //文章详情模板消息地址
+	WX_MSG_PATH_ACTIVITY_SPECIAL_DETAIL = "activityPages/specialDetail/specialDetail?id=" //专项调研活动模板消息地址
+)
+
+//模板消息地址路由
+const (
+	ACtIVITY_SPECIAL_EXPLAIN      = "此类调研具体行程尚未确定,待预报名人数满10人后弘则会确定行程并推送给您活动日期,只有在确定行程中再次报名才完成占位。"                        //专项调研说明
+	ACtIVITY_SPECIAL_TRIP_EXPLAIN = "此类调研时间安排已经确定,点击报名后按人次扣除对应机构的服务点数。由于每场活动人数有限,如果不能参加请提前48小时取消,未及时取消导致影响其他客户报名将会维持扣点。" //专项调研说明
+
 )