xingzai 2 роки тому
батько
коміт
563806ef25

+ 291 - 198
controllers/activity.go

@@ -528,6 +528,9 @@ func (this *ActivityCoAntroller) ScheduleList() {
 		if v.IsHideAppointment == 0 {
 			list[k].IsShowAppointment = services.IsShowAppointment(v.ActivityTypeId, v.ChartPermissionName)
 		}
+		if v.ActivityTypeId == utils.C_CLASS_ACTIVITY_TYPE_ID {
+			list[k].IsCClassMeeting = true
+		}
 	}
 	//添加我的日程访问记录
 	item := new(models.CygxPageHistoryRecord)
@@ -587,6 +590,9 @@ func (this *ActivityCoAntroller) Detail() {
 		br.ErrMsg = "活动ID错误,Err:" + "activityId:" + strconv.Itoa(activityId)
 		return
 	}
+	if activityInfo.ActivityTypeId == utils.C_CLASS_ACTIVITY_TYPE_ID {
+		activityInfo.IsCClassMeeting = true
+	}
 	applyCount, err := models.GetApplyRecordCount(uid)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "获取信息失败"
@@ -842,6 +848,7 @@ func (this *ActivityCoAntroller) Detail() {
 		} else {
 			activityInfo.ArticleList = make([]*models.ActivityArticleResp, 0)
 		}
+		activityInfo.ActivityTypeName = strings.Replace(activityInfo.ActivityTypeName, "(C类)", "", -1)
 		resp.Detail = activityInfo
 	}
 	resp.HasPermission = hasPermission
@@ -1045,10 +1052,10 @@ func (this *ActivityCoAntroller) SignupAdd() {
 				br.ErrMsg = "获取对应销售失败,Err:" + err.Error()
 				return
 			}
-
 			//人数已满:FullStarffed、单机构超过两人:TwoPeople、爽约次数过多:BreakPromise、超时:Overtime 、成功:Success"`
 			//如果是下面几种情况则对报名信息做判断限制 (公司调研电话会(限制人数)、公司线下调研、专家/分析师线下沙龙)
-			if (activityInfo.ActivityTypeId == 3 && activityInfo.IsLimitPeople == 1) || activityInfo.ActivityTypeId > 3 {
+			//if (activityInfo.ActivityTypeId == 3 && activityInfo.IsLimitPeople == 1) || activityInfo.ActivityTypeId > 3 {
+			if activityInfo.IsLimitPeople == 1 {
 				//判断优先级:总人数限制→单机构2人限制→爽约3次限制
 				totalRestrict, err := models.GetUserRestrictCount(user.Mobile)
 				if err != nil {
@@ -2636,101 +2643,109 @@ func (this *ActivityCoAntroller) ActivityListNew() {
 		currentIndex = 1
 	}
 	startSize = utils.StartIndex(currentIndex, pageSize)
-	userType, permissionStr, err := services.GetUserType(user.CompanyId)
+	//userType, permissionStr, err := services.GetUserType(user.CompanyId)
 	var condition string
 	var pars []interface{}
 	//活动可见限制
-	var sqlExport string
-	slicePer := strings.Split(permissionStr, ",")
-	var permissionSqlStr string
-	for _, v := range slicePer {
-		if userType == 1 {
-			//if v != "研选" {
-			if !strings.Contains(v, "研选") {
-				permissionSqlStr += "'" + v + "',"
-			}
-		} else {
-			permissionSqlStr += "'" + v + "',"
-		}
-	}
-	permissionSqlStr = strings.TrimRight(permissionSqlStr, ",")
-	permissionSqlStr = strings.Replace(permissionSqlStr, "(主观)", "", -1)
-	permissionSqlStr = strings.Replace(permissionSqlStr, "(客观)", "", -1)
-	permissionSqlStr = ` AND art.chart_permission_name  IN (` + permissionSqlStr + `)`
-	sqlExport = ` AND (art.customer_type_ids LIKE '%` + strconv.Itoa(userType) + `%' `
-	if userType == 2 {
-		sqlExport += ` OR  art.customer_type_ids LIKE '%3%' `
-	}
-	if (userType == 2 || userType == 3) && strings.Contains(permissionStr, "专家") {
-		sqlExport += ` OR  art.customer_type_ids LIKE '%4%' `
-	}
-	sqlExport += `) `
-
-	//主题
-	if label != "" {
-		condition = ` AND art.label  LIKE '%` + label + `%' `
-	}
-	if whichDay != "" {
-		var startDate string
-		var endDate string
-		if whichDay == "1" {
-			startDate = time.Now().Format(utils.FormatDate)
-			endDate = startDate
-		} else if whichDay == "2" {
-			startDate = time.Now().AddDate(0, 0, +1).Format(utils.FormatDate)
-			endDate = startDate
-		} else {
-			startDate = time.Now().Format(utils.FormatDate)
-			endDate = time.Now().AddDate(0, 0, +1).Format(utils.FormatDate)
-		}
-		condition += ` AND art.activity_time >= ` + "'" + startDate + " 00:00:00'"
-		condition += ` AND art.activity_time <= ` + "'" + endDate + " 23:59:59'"
-	}
-	//行业名称
-	if len(chartPermissionIds) > 0 {
-		condition += ` AND art.chart_permission_id  IN (` + chartPermissionIds + `)`
-	}
-	if activeState != "" {
-		if activeState == "1" {
-			condition += ` AND art.active_state  IN (1,2)`
-		} else {
-			condition += ` AND art.active_state  IN (` + activeState + `)`
-		}
-	} else {
-		condition += ` AND art.active_state  IN (1)`
-	}
-	if activityTypeId != "" {
-		condition += ` AND art.activity_type_id  IN (` + activityTypeId + `)`
-	}
+	//var sqlExport string
+	//slicePer := strings.Split(permissionStr, ",")
+	//var permissionSqlStr string
+	//for _, v := range slicePer {
+	//	if userType == 1 {
+	//		//if v != "研选" {
+	//		if !strings.Contains(v, "研选") {
+	//			permissionSqlStr += "'" + v + "',"
+	//		}
+	//	} else {
+	//		permissionSqlStr += "'" + v + "',"
+	//	}
+	//}
+	//permissionSqlStr = strings.TrimRight(permissionSqlStr, ",")
+	//permissionSqlStr = strings.Replace(permissionSqlStr, "(主观)", "", -1)
+	//permissionSqlStr = strings.Replace(permissionSqlStr, "(客观)", "", -1)
+	//permissionSqlStr = ` AND art.chart_permission_name  IN (` + permissionSqlStr + `)`
+	//sqlExport = ` AND (art.customer_type_ids LIKE '%` + strconv.Itoa(userType) + `%' `
+	//if userType == 2 {
+	//	sqlExport += ` OR  art.customer_type_ids LIKE '%3%' `
+	//}
+	//if (userType == 2 || userType == 3) && strings.Contains(permissionStr, "专家") {
+	//	sqlExport += ` OR  art.customer_type_ids LIKE '%4%' `
+	//}
+	//sqlExport += `) `
+	//
+	////主题
+	//if label != "" {
+	//	condition = ` AND art.label  LIKE '%` + label + `%' `
+	//}
+	//if whichDay != "" {
+	//	var startDate string
+	//	var endDate string
+	//	if whichDay == "1" {
+	//		startDate = time.Now().Format(utils.FormatDate)
+	//		endDate = startDate
+	//	} else if whichDay == "2" {
+	//		startDate = time.Now().AddDate(0, 0, +1).Format(utils.FormatDate)
+	//		endDate = startDate
+	//	} else {
+	//		startDate = time.Now().Format(utils.FormatDate)
+	//		endDate = time.Now().AddDate(0, 0, +1).Format(utils.FormatDate)
+	//	}
+	//	condition += ` AND art.activity_time >= ` + "'" + startDate + " 00:00:00'"
+	//	condition += ` AND art.activity_time <= ` + "'" + endDate + " 23:59:59'"
+	//}
+	////行业名称
+	//if len(chartPermissionIds) > 0 {
+	//	condition += ` AND art.chart_permission_id  IN (` + chartPermissionIds + `)`
+	//}
+	//if activeState != "" {
+	//	if activeState == "1" {
+	//		condition += ` AND art.active_state  IN (1,2)`
+	//	} else {
+	//		condition += ` AND art.active_state  IN (` + activeState + `)`
+	//	}
+	//} else {
+	//	condition += ` AND art.active_state  IN (1)`
+	//}
+	//if activityTypeId != "" {
+	//	condition += ` AND art.activity_type_id  IN (` + activityTypeId + `)`
+	//}
+	//
+	//condition += ` AND art.publish_status = 1 `
+	//var conditionOr string
+	//// 有专家权限的这几种用户,不做行业权限校验
+	//if (userType == 2 || userType == 3 || userType == 4) && strings.Contains(permissionStr, "专家") {
+	//	conditionOr += ` OR (  art.is_limit_people = 1 AND art.customer_type_ids LIKE '%4%'	 ` + condition + `) `
+	//}
+	//if (userType == 5) && strings.Contains(permissionStr, "专家") {
+	//	conditionOr += ` OR (  art.is_limit_people = 1 AND art.customer_type_ids LIKE '%5%'	 ` + condition + `) `
+	//}
+	//if userType == 1 {
+	//	conditionOr += `	OR ( art.is_limit_people = 0 	  ` + condition + permissionSqlStr + `) `
+	//} else {
+	//	conditionOr += `	OR ( art.is_limit_people = 0 	  ` + condition + `) `
+	//}
+	////判断客户规模是否属于可见范围的活动
+	//companyProduct, err := models.GetCompanyProductDetail(user.CompanyId, 2)
+	//if err != nil && err.Error() != utils.ErrNoRow() {
+	//	br.Msg = "获取信息失败"
+	//	br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
+	//	return
+	//}
+	//if companyProduct != nil {
+	//	if companyProduct.Scale != "" {
+	//		conditionOr += ` OR (  art.scale LIKE '%` + companyProduct.Scale + `%'	 ` + condition + `) `
+	//	}
+	//}
 
-	condition += ` AND art.publish_status = 1 `
-	var conditionOr string
-	// 有专家权限的这几种用户,不做行业权限校验
-	if (userType == 2 || userType == 3 || userType == 4) && strings.Contains(permissionStr, "专家") {
-		conditionOr += ` OR (  art.is_limit_people = 1 AND art.customer_type_ids LIKE '%4%'	 ` + condition + `) `
-	}
-	if (userType == 5) && strings.Contains(permissionStr, "专家") {
-		conditionOr += ` OR (  art.is_limit_people = 1 AND art.customer_type_ids LIKE '%5%'	 ` + condition + `) `
-	}
-	if userType == 1 {
-		conditionOr += `	OR ( art.is_limit_people = 0 	  ` + condition + permissionSqlStr + `) `
-	} else {
-		conditionOr += `	OR ( art.is_limit_people = 0 	  ` + condition + `) `
-	}
-	//判断客户规模是否属于可见范围的活动
-	companyProduct, err := models.GetCompanyProductDetail(user.CompanyId, 2)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		br.Msg = "获取信息失败"
-		br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
+	conditionActivity, err := services.GetActivityonditionList(user, activityTypeId, chartPermissionIds, whichDay, activeState, label, 0)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取活动权限数据失败,Err:" + err.Error()
 		return
 	}
-	if companyProduct != nil {
-		if companyProduct.Scale != "" {
-			conditionOr += ` OR (  art.scale LIKE '%` + companyProduct.Scale + `%'	 ` + condition + `) `
-		}
-	}
 
-	condition += ` AND art.is_limit_people = 1 ` + permissionSqlStr + sqlExport + conditionOr
+	//condition += ` AND art.is_limit_people = 1 ` + permissionSqlStr + sqlExport + conditionOr
+	condition += ` AND art.is_limit_people = 1 ` + conditionActivity
 	total, err := models.GetActivityCount(condition, pars)
 	if err != nil {
 		br.Msg = "获取失败"
@@ -2816,6 +2831,9 @@ func (this *ActivityCoAntroller) ActivityListNew() {
 		if v.IsHideAppointment == 0 {
 			list[k].IsShowAppointment = services.IsShowAppointment(v.ActivityTypeId, v.ChartPermissionName)
 		}
+		if v.ActivityTypeId == utils.C_CLASS_ACTIVITY_TYPE_ID {
+			list[k].IsCClassMeeting = true
+		}
 	}
 	page := paging.GetPaging(currentIndex, pageSize, total)
 	resp := new(models.GetCygxActivityListRep)
@@ -3256,6 +3274,12 @@ func (this *ActivityCoAntroller) LabelTypeListV5() {
 	if activeState == "undefined" || activeState == "" {
 		activeState = "1"
 	}
+	//adminIds, err := models.GetSelleridWhichGroup(user.CompanyId, 2)
+	//if err != nil {
+	//	br.Msg = "获取失败"
+	//	br.ErrMsg = "获取本组下的销售失败,Err:" + err.Error()
+	//	return
+	//}
 	userType, permissionStr, err := services.GetUserType(user.CompanyId)
 	if err != nil {
 		br.Msg = "获取失败"
@@ -3296,71 +3320,101 @@ func (this *ActivityCoAntroller) LabelTypeListV5() {
 		br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
 		return
 	}
+	//isMaker := user.IsMaker
+
 	var sqlExport string
 	resp := new(models.ActivityTypeListHomeResp)
 	for k, v := range list {
-		var condition string
-		permissionSqlStr = ` AND art.chart_permission_name  IN (` + permissionNameStr + `)`
-		sqlExport = ` AND (art.customer_type_ids LIKE '%` + strconv.Itoa(userType) + `%' `
-		if userType == 2 {
-			sqlExport += ` OR  art.customer_type_ids LIKE '%3%' `
-		}
-		if (userType == 2 || userType == 3) && strings.Contains(permissionStr, "专家") {
-			sqlExport += ` OR  art.customer_type_ids LIKE '%4%' `
-		}
-		sqlExport += `) `
-		condition = ` AND art.publish_status = 1  AND art.label != ''  AND art.activity_type_id = ` + strconv.Itoa(v.ActivityTypeId)
-		if isPower == 1 {
-			condition += permissionSqlStr
-		}
-		//行业名称
-		if len(chartPermissionIds) > 0 {
-			condition += ` AND art.chart_permission_id  IN (` + chartPermissionIds + `)`
-		}
-		var conditionOr string
-		if whichDay != "" {
-			var startDate string
-			var endDate string
-			if whichDay == "1" {
-				startDate = time.Now().Format(utils.FormatDate)
-				endDate = startDate
-			} else if whichDay == "2" {
-				startDate = time.Now().AddDate(0, 0, +1).Format(utils.FormatDate)
-				endDate = startDate
-			} else {
-				startDate = time.Now().Format(utils.FormatDate)
-				endDate = time.Now().AddDate(0, 0, +1).Format(utils.FormatDate)
-			}
-			condition += ` AND art.activity_time >= ` + "'" + startDate + " 00:00:00'"
-			condition += ` AND art.activity_time <= ` + "'" + endDate + " 23:59:59'"
-		}
-		if activeState != "" {
-			// 默认查看未开始跟进行中
-			if activeState == "1" {
-				condition += ` AND art.active_state  IN (1,2)`
-			} else {
-				condition += ` AND art.active_state  IN (` + activeState + `)`
-			}
-		} else {
-			condition += ` AND art.active_state  IN (1,2)`
+		// 如果是C类电话会就不展示内容,且合并到分析师电话会
+		if v.ActivityTypeId == utils.C_CLASS_ACTIVITY_TYPE_ID {
+			continue
 		}
-		if (userType == 2 || userType == 3 || userType == 4) && strings.Contains(permissionStr, "专家") {
-			conditionOr += ` OR (  art.is_limit_people = 1 AND art.customer_type_ids LIKE '%4%'	 ` + condition + `) `
-		}
-		if (userType == 5) && strings.Contains(permissionStr, "专家") {
-			conditionOr += ` OR (  art.is_limit_people = 1 AND art.customer_type_ids LIKE '%5%'	 ` + condition + `) `
-		}
-		if userType == 1 {
-			conditionOr += ` OR ( art.is_limit_people = 0 ` + condition + permissionSqlStr + `) `
-		} else {
-			conditionOr += ` OR ( art.is_limit_people = 0 ` + condition + `) `
-		}
-		if companyProduct != nil {
-			if companyProduct.Scale != "" {
-				conditionOr += ` OR (  art.scale LIKE '%` + companyProduct.Scale + `%'	 ` + condition + `) `
-			}
+		var condition string
+		//var conditionAdmin string
+		//permissionSqlStr = ` AND art.chart_permission_name  IN (` + permissionNameStr + `)`
+		//sqlExport = ` AND (art.customer_type_ids LIKE '%` + strconv.Itoa(userType) + `%' `
+		//if userType == 2 {
+		//	sqlExport += ` OR  art.customer_type_ids LIKE '%3%' `
+		//}
+		//if (userType == 2 || userType == 3) && strings.Contains(permissionStr, "专家") {
+		//	sqlExport += ` OR  art.customer_type_ids LIKE '%4%' `
+		//}
+		//sqlExport += `) `
+		//if v.ActivityTypeId == utils.ANALYST_TELL_ACTIVITY_TYPE_ID {
+		//	condition = ` AND art.publish_status = 1  AND art.label != ''  AND art.activity_type_id IN (` + strconv.Itoa(v.ActivityTypeId) + "," + strconv.Itoa(utils.C_CLASS_ACTIVITY_TYPE_ID) + `)`
+		//} else {
+		//	condition = ` AND art.publish_status = 1  AND art.label != ''  AND art.activity_type_id = ` + strconv.Itoa(v.ActivityTypeId)
+		//}
+		////活动仅决策人可见
+		//if isMaker == 0 {
+		//	condition += ` AND art.is_maker_show = 0  `
+		//}
+		//
+		//if isPower == 1 {
+		//	condition += permissionSqlStr
+		//}
+		////行业名称
+		//if len(chartPermissionIds) > 0 {
+		//	condition += ` AND art.chart_permission_id  IN (` + chartPermissionIds + `)`
+		//}
+		//var conditionOr string
+		//if whichDay != "" {
+		//	var startDate string
+		//	var endDate string
+		//	if whichDay == "1" {
+		//		startDate = time.Now().Format(utils.FormatDate)
+		//		endDate = startDate
+		//	} else if whichDay == "2" {
+		//		startDate = time.Now().AddDate(0, 0, +1).Format(utils.FormatDate)
+		//		endDate = startDate
+		//	} else {
+		//		startDate = time.Now().Format(utils.FormatDate)
+		//		endDate = time.Now().AddDate(0, 0, +1).Format(utils.FormatDate)
+		//	}
+		//	condition += ` AND art.activity_time >= ` + "'" + startDate + " 00:00:00'"
+		//	condition += ` AND art.activity_time <= ` + "'" + endDate + " 23:59:59'"
+		//}
+		//if activeState != "" {
+		//	// 默认查看未开始跟进行中
+		//	if activeState == "1" {
+		//		condition += ` AND art.active_state  IN (1,2)`
+		//	} else {
+		//		condition += ` AND art.active_state  IN (` + activeState + `)`
+		//	}
+		//} else {
+		//	condition += ` AND art.active_state  IN (1,2)`
+		//}
+		//conditionAdmin = condition
+		////查询全部可见的数据(是否全部客户可见)
+		//condition += ` AND art.visible_range != 1  `
+		//
+		//if (userType == 2 || userType == 3 || userType == 4) && strings.Contains(permissionStr, "专家") {
+		//	conditionOr += ` OR (  art.is_limit_people = 1 AND art.customer_type_ids LIKE '%4%'	 ` + condition + `) `
+		//}
+		//if (userType == 5) && strings.Contains(permissionStr, "专家") {
+		//	conditionOr += ` OR (  art.is_limit_people = 1 AND art.customer_type_ids LIKE '%5%'	 ` + condition + `) `
+		//}
+		//if userType == 1 {
+		//	conditionOr += ` OR ( art.is_limit_people = 0 ` + condition + permissionSqlStr + `) `
+		//} else {
+		//	conditionOr += ` OR ( art.is_limit_people = 0 ` + condition + `) `
+		//}
+		//if companyProduct != nil {
+		//	if companyProduct.Scale != "" {
+		//		conditionOr += ` OR (  art.scale LIKE '%` + companyProduct.Scale + `%'	 ` + condition + `) `
+		//	}
+		//}
+		//if adminIds != "" {
+		//	conditionOr += ` OR ( art.admin_id IN (` + adminIds + `) ` + conditionAdmin + `) `
+		//}
+
+		conditionActivity, err := services.GetActivityonditionList(user, strconv.Itoa(v.ActivityTypeId), chartPermissionIds, whichDay, activeState, "", isPower)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取活动权限数据失败,Err:" + err.Error()
+			return
 		}
-		condition += `AND art.is_limit_people = 1 ` + permissionSqlStr + sqlExport + conditionOr
+		condition += `AND art.is_limit_people = 1 ` + conditionActivity
 		sortTime = ` mintimesort ASC `
 		labelList, err := models.GetActivityLabelListAll(condition, sortTime, pars, startSize, pageSize)
 		if err != nil {
@@ -4273,12 +4327,19 @@ func (this *ActivityCoAntroller) LabelTypeListV6Pc() {
 	if activeState == "undefined" || activeState == "" || activeState == "1" {
 		activeState = "1,2"
 	}
+	//adminIds, err := models.GetSelleridWhichGroup(user.CompanyId, 2)
+	//if err != nil {
+	//	br.Msg = "获取失败"
+	//	br.ErrMsg = "获取本组下的销售失败,Err:" + err.Error()
+	//	return
+	//}
 	userType, permissionStr, err := services.GetUserType(user.CompanyId)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
+	//isMaker := user.IsMaker
 
 	var startSize int
 	pageSize = 8
@@ -4326,56 +4387,88 @@ func (this *ActivityCoAntroller) LabelTypeListV6Pc() {
 	sqlExport += `) `
 	resp := new(models.ActivityTypeListHomeRespPc)
 	for k, v := range list {
-		var condition string
-		permissionSqlStr = ` AND art.chart_permission_name  IN (` + permissionNameStr + `)`
-		condition = ` AND art.publish_status = 1  AND art.label != ''  AND art.activity_type_id = ` + strconv.Itoa(v.ActivityTypeId)
-		if isPower == 1 {
-			condition += permissionSqlStr
-		}
-		//行业名称
-		if len(chartPermissionIds) > 0 {
-			condition += ` AND art.chart_permission_id  IN (` + chartPermissionIds + `)`
-		}
-		var conditionOr string
-		if whichDay != "" {
-			var startDate string
-			var endDate string
-			if whichDay == "1" {
-				startDate = time.Now().Format(utils.FormatDate)
-				endDate = startDate
-			} else if whichDay == "2" {
-				startDate = time.Now().AddDate(0, 0, +1).Format(utils.FormatDate)
-				endDate = startDate
-			} else {
-				startDate = time.Now().Format(utils.FormatDate)
-				endDate = time.Now().AddDate(0, 0, +1).Format(utils.FormatDate)
-			}
-			condition += ` AND art.activity_time >= ` + "'" + startDate + " 00:00:00'"
-			condition += ` AND art.activity_time <= ` + "'" + endDate + " 23:59:59'"
-		}
-		if activeState != "" {
-			condition += ` AND art.active_state  IN (` + activeState + `)`
-		} else {
-			condition += ` AND art.active_state  IN (1,2)`
-		}
-		if (userType == 2 || userType == 3 || userType == 4) && strings.Contains(permissionStr, "专家") {
-			conditionOr += ` OR (  art.is_limit_people = 1 AND art.customer_type_ids LIKE '%4%'	 ` + condition + `) `
-		}
-		if (userType == 5) && strings.Contains(permissionStr, "专家") {
-			conditionOr += ` OR (  art.is_limit_people = 1 AND art.customer_type_ids LIKE '%5%'	 ` + condition + `) `
-		}
-		if userType == 1 {
-			conditionOr += ` OR ( art.is_limit_people = 0 ` + condition + permissionSqlStr + `) `
-		} else {
-			conditionOr += ` OR ( art.is_limit_people = 0 ` + condition + `) `
+		// 如果是C类电话会就不展示内容,且合并到分析师电话会
+		if v.ActivityTypeId == utils.C_CLASS_ACTIVITY_TYPE_ID {
+			continue
 		}
-
-		if companyProduct != nil {
-			if companyProduct.Scale != "" {
-				conditionOr += ` OR (  art.scale LIKE '%` + companyProduct.Scale + `%'	 ` + condition + `) `
-			}
+		var condition string
+		//var conditionAdmin string
+		//permissionSqlStr = ` AND art.chart_permission_name  IN (` + permissionNameStr + `)`
+		//if v.ActivityTypeId == utils.ANALYST_TELL_ACTIVITY_TYPE_ID {
+		//	condition = ` AND art.publish_status = 1  AND art.label != ''  AND art.activity_type_id IN (` + strconv.Itoa(v.ActivityTypeId) + "," + strconv.Itoa(utils.C_CLASS_ACTIVITY_TYPE_ID) + `)`
+		//} else {
+		//	condition = ` AND art.publish_status = 1  AND art.label != ''  AND art.activity_type_id = ` + strconv.Itoa(v.ActivityTypeId)
+		//}
+		////活动仅决策人可见
+		//if isMaker == 0 {
+		//	condition += ` AND art.is_maker_show = 0  `
+		//}
+		//
+		////condition = ` AND art.publish_status = 1  AND art.label != ''  AND art.activity_type_id = ` + strconv.Itoa(v.ActivityTypeId)
+		//if isPower == 1 {
+		//	condition += permissionSqlStr
+		//}
+		////行业名称
+		//if len(chartPermissionIds) > 0 {
+		//	condition += ` AND art.chart_permission_id  IN (` + chartPermissionIds + `)`
+		//}
+		//var conditionOr string
+		//if whichDay != "" {
+		//	var startDate string
+		//	var endDate string
+		//	if whichDay == "1" {
+		//		startDate = time.Now().Format(utils.FormatDate)
+		//		endDate = startDate
+		//	} else if whichDay == "2" {
+		//		startDate = time.Now().AddDate(0, 0, +1).Format(utils.FormatDate)
+		//		endDate = startDate
+		//	} else {
+		//		startDate = time.Now().Format(utils.FormatDate)
+		//		endDate = time.Now().AddDate(0, 0, +1).Format(utils.FormatDate)
+		//	}
+		//	condition += ` AND art.activity_time >= ` + "'" + startDate + " 00:00:00'"
+		//	condition += ` AND art.activity_time <= ` + "'" + endDate + " 23:59:59'"
+		//}
+		//
+		//if activeState != "" {
+		//	condition += ` AND art.active_state  IN (` + activeState + `)`
+		//} else {
+		//	condition += ` AND art.active_state  IN (1,2)`
+		//}
+		//
+		//conditionAdmin = condition
+		////查询全部可见的数据(是否全部客户可见)
+		//condition += ` AND art.visible_range != 1  `
+		//
+		//if (userType == 2 || userType == 3 || userType == 4) && strings.Contains(permissionStr, "专家") {
+		//	conditionOr += ` OR (  art.is_limit_people = 1 AND art.customer_type_ids LIKE '%4%'	 ` + condition + `) `
+		//}
+		//if (userType == 5) && strings.Contains(permissionStr, "专家") {
+		//	conditionOr += ` OR (  art.is_limit_people = 1 AND art.customer_type_ids LIKE '%5%'	 ` + condition + `) `
+		//}
+		//if userType == 1 {
+		//	conditionOr += ` OR ( art.is_limit_people = 0 ` + condition + permissionSqlStr + `) `
+		//} else {
+		//	conditionOr += ` OR ( art.is_limit_people = 0 ` + condition + `) `
+		//}
+		//
+		//if companyProduct != nil {
+		//	if companyProduct.Scale != "" {
+		//		conditionOr += ` OR (  art.scale LIKE '%` + companyProduct.Scale + `%'	 ` + condition + `) `
+		//	}
+		//}
+		//
+		//if adminIds != "" {
+		//	conditionOr += ` OR ( art.admin_id IN (` + adminIds + `) ` + conditionAdmin + `) `
+		//}
+		conditionActivity, err := services.GetActivityonditionList(user, strconv.Itoa(v.ActivityTypeId), chartPermissionIds, whichDay, activeState, "", isPower)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取活动权限数据失败,Err:" + err.Error()
+			return
 		}
-		condition += `AND art.is_limit_people = 1 ` + permissionSqlStr + sqlExport + conditionOr
+		//condition += `AND art.is_limit_people = 1 ` + permissionSqlStr + sqlExport + conditionOr
+		condition += `AND art.is_limit_people = 1 ` + conditionActivity
 		sortTime = ` mintimesort ASC `
 		labelList, err := models.GetActivityLabelListAll(condition, sortTime, pars, startSize, pageSize)
 		if err != nil {

+ 1 - 0
controllers/article.go

@@ -689,6 +689,7 @@ func (this *ArticleControllerMobile) DetailMd5() {
 			departmentDetail, err := models.GetArticleDepartmentDateilById(detail.DepartmentId)
 			if err == nil {
 				detail.DepartmentImgUrl = departmentDetail.ImgUrl
+				detail.NickName = departmentDetail.NickName
 			}
 		}
 	}

+ 1 - 1
controllers/chart_permission.go

@@ -138,7 +138,7 @@ func (this *ChartPermissionAuthController) ReportDetail() {
 		} else {
 			resp.List = append(resp.List, v)
 		}
-		if services.GetShowSustainable() && v.PermissionName == "研选" {
+		if services.GetShowSustainable() && v.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN {
 			resp.List[k].IsShowSustainable = true
 		}
 	}

+ 1 - 1
controllers/report.go

@@ -1151,7 +1151,7 @@ func (this *ReportController) IsShow() {
 	if total > 0 {
 		resp.IsShow = true
 	}
-
+	resp.LinkWxExplain = utils.LINK_WX_EXPLAIN
 	br.Ret = 200
 	br.Success = true
 	br.Data = resp

+ 1 - 0
controllers/user.go

@@ -1232,6 +1232,7 @@ func (this *UserController) ShareIsShow() {
 	if user.CompanyId != 16 && detail.ConfigValue == "1" {
 		resp.IsShow = true
 	}
+	resp.LinkWxExplain = utils.LINK_WX_EXPLAIN
 	br.Ret = 200
 	br.Success = true
 	br.Data = resp

+ 34 - 2
models/activity.go

@@ -1,8 +1,10 @@
 package models
 
 import (
+	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/rdlucklib/rdluck_tools/paging"
+	"hongze/hongze_cygx/utils"
 	"strings"
 	"time"
 )
@@ -106,6 +108,7 @@ type ActivityDetail struct {
 	Scale                   string `description:"管理规模,空不填,1::50亿以下,2:50~100亿,3:100亿以上。多个用, 隔开"`
 	IsShowAppointment       bool   `description:"是否展示预约纪要"`
 	IsHideAppointment       int    `description:"是否隐藏预约纪要按钮  1是,0 否"`
+	IsCClassMeeting         bool   `description:"是否是c类电话会"`
 	ArticleList             []*ActivityArticleResp
 }
 
@@ -180,6 +183,7 @@ type CygxActivityList struct {
 	ActivityType            int    `description:"活动线上线下类型 1线上,0 线下"`
 	IsHideAppointment       int    `description:"是否隐藏预约纪要按钮  1是,0 否"`
 	JmcjRoadshowTitle       string `description:"进门财经手动匹配的活动名称"`
+	IsCClassMeeting         bool   `description:"是否是c类电话会"`
 }
 
 type GetCygxActivityListRep struct {
@@ -287,6 +291,13 @@ func DeleteActivity(activityId int) (err error) {
 
 //修改活动状态至进行中
 func UpdateActivitySattusToHaveInHand() (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg("修改活动状态至进行中失败"+err.Error(), 2)
+			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "修改活动状态至进行中失败 ErrMsg:"+err.Error(), utils.EmailSendToUsers)
+		}
+	}()
 	o := orm.NewOrm()
 	resultTime_30 := time.Now().Add(-time.Minute * 30).Format("2006-01-02 15:04:05")
 	resultTime_60 := time.Now().Add(-time.Minute * 60).Format("2006-01-02 15:04:05")
@@ -294,15 +305,23 @@ func UpdateActivitySattusToHaveInHand() (err error) {
 	var condition string
 	condition += ` AND activity_time < NOW()`
 	sqlOr = condition
-	condition += ` AND (activity_type_id IN ( 1, 2, 3 ) AND  activity_time > ` + "'" + resultTime_30 + "'" + ")"
+	condition += ` AND (activity_type_id IN ( 1, 2, 3, 7 ) AND  activity_time > ` + "'" + resultTime_30 + "'" + ")"
 	condition += ` OR(activity_type_id IN ( 4, 5, 6 ) AND  activity_time > ` + "'" + resultTime_60 + "'" + sqlOr + ")"
 	msql := " UPDATE cygx_activity SET active_state = 2 WHERE 1 = 1 " + condition
 	_, err = o.Raw(msql).Exec()
+
 	return
 }
 
 //修改活动状态至已结束
 func UpdateActivitySattusToComplete() (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg("修改活动状态至已结束"+err.Error(), 2)
+			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "修改活动状态至已结束 ErrMsg:"+err.Error(), utils.EmailSendToUsers)
+		}
+	}()
 	o := orm.NewOrm()
 	resultTime_30 := time.Now().Add(-time.Minute * 30).Format("2006-01-02 15:04:05")
 	resultTime_60 := time.Now().Add(-time.Minute * 60).Format("2006-01-02 15:04:05")
@@ -310,7 +329,7 @@ func UpdateActivitySattusToComplete() (err error) {
 	var condition string
 	//condition += ` AND activity_time < NOW()`
 	//sqlOr = condition
-	condition += ` AND (activity_type_id IN ( 1, 2, 3 ) AND  activity_time < ` + "'" + resultTime_30 + "'" + ")"
+	condition += ` AND (activity_type_id IN ( 1, 2, 3, 7 ) AND  activity_time < ` + "'" + resultTime_30 + "'" + ")"
 	condition += ` OR(activity_type_id IN ( 4, 5, 6 ) AND  activity_time < ` + "'" + resultTime_60 + "'" + ")"
 	msql := " UPDATE cygx_activity SET active_state = 3 WHERE 1 = 1 " + condition
 	_, err = o.Raw(msql).Exec()
@@ -722,3 +741,16 @@ func UpdateCygxActivityName(activityId int, Name string) (err error) {
 	_, err = o.Raw(sql, Name, activityId).Exec()
 	return
 }
+
+//获取已发布但是为开始活动的权限
+func GetActivityWeekPermission() (permission string, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT
+			GROUP_CONCAT( DISTINCT chart_permission_name SEPARATOR ',' ) AS permission 
+		FROM
+			cygx_activity 
+		WHERE
+			active_state = 1`
+	err = o.Raw(sql).QueryRow(&permission)
+	return
+}

+ 53 - 0
models/activity_appointment.go

@@ -171,3 +171,56 @@ func GetAppointmentListByActivityIdAndMobile(activityIds, mobile string) (items
 	_, err = o.Raw(sql, mobile).QueryRows(&items)
 	return
 }
+
+//通过活动ID获取预约纪要的人数列表
+func GetCygxAppointmentSummaryListBySubjectId(subjectIds string) (item []*CygxAppointmentAndActivity, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+			ap.mobile,
+			ap.activity_id,
+			a.activity_name 
+		FROM
+			cygx_activity_appointment AS ap
+			INNER JOIN cygx_activity AS a ON a.activity_id = ap.activity_id
+			INNER JOIN cygx_industrial_activity_group_subject AS sg ON sg.activity_id = a.activity_id 
+		WHERE
+			a.active_state = 3 
+			AND a.chart_permission_id = 31 
+			AND DATE_SUB( CURDATE(), INTERVAL 14 DAY ) <= date( a.activity_time ) 
+			AND a.activity_type_id = 1 
+			AND sg.industrial_subject_id IN (` + subjectIds + `) 
+		GROUP BY
+			ap.mobile,
+			ap.activity_id `
+	_, err = o.Raw(sql).QueryRows(&item)
+	return
+}
+
+type CygxAppointment struct {
+	Mobile         string `description:"手机号"`
+	UserId         int `description:"userId"`
+	ActivityName   string `description:"所属销售"`
+	ActivityTypeId int    `description:"活动类型"`
+}
+
+//通过活动ID获取预约纪要的人数列表
+func GetCygxAppointmentSummaryBySubjectId(subjectIds string) (item []*CygxAppointment, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+			ap.user_id,
+			ap.mobile,
+			ap.activity_id,
+			a.activity_name 
+		FROM
+			cygx_activity_appointment AS ap
+			INNER JOIN cygx_activity AS a ON a.activity_id = ap.activity_id
+			INNER JOIN cygx_industrial_activity_group_subject AS sg ON sg.activity_id = a.activity_id 
+		WHERE
+			a.active_state = 3
+			AND sg.industrial_subject_id IN (` + subjectIds + `) 
+		GROUP BY
+			ap.mobile,
+			ap.activity_id `
+	_, err = o.Raw(sql).QueryRows(&item)
+	return
+}

+ 20 - 18
models/activity_attendance_detail.go

@@ -25,6 +25,7 @@ type CygxActivityAttendanceDetail struct {
 	IsMeetingStr          int       `description:"是否到会,1到会,0未到会"`
 	UseridEntity          int       `description:"参会者身份. 1:主讲人, 2:主持人, 3:嘉宾, 4:普通参会者, 5:联席主讲人, 6:会议助理"`
 	ActivityTime          string    `description:"活动时间"`
+	CrmCompanyMapStatusId int       `description:"转换后的对应状态信息:1=正式客户, 2=曾使用客户, 3=其他"`
 }
 
 //添加会议提醒信息
@@ -83,24 +84,25 @@ func AddCygxActivityAttendanceDetail(item *CygxActivityAttendanceDetail) (lastId
 }
 
 type RoadshowData struct {
-	Id                int    `orm:"column(id);pk;"description:"主键ID"`
-	Company           string `description:"公司名称"`
-	UserName          string `description:"用户名"`
-	UserPhone         string `description:"手机号"`
-	UserinfoUource    string `description:"用户来源"`
-	AuthInfo          string `description:"用户参会鉴权"`
-	GuestUsername     string `description:"嘉宾名称, 多个用,隔开"`
-	FirstWatchTime    string `description:"首次观看时间"`
-	LastWatchTime     string `description:"最后观看时间"`
-	RoadshowId        string `description:"路演ID"`
-	RoadshowTitle     string `description:"路演标题"`
-	RoadshowBeginTime string `description:"路演开始时间"`
-	RoadshowEndTime   string `description:"路演结束时间"`
-	JoinTime          int    `description:"参与时长"`
-	JoinType          int    `description:"参与方式, 1网络, 2电话"`
-	DataType          int    `description:"数据类型: 1直播, 2回放"`
-	Occupation        string `description:"职位"`
-	UseridEntity      int    `description:"参会者身份. 1:主讲人, 2:主持人, 3:嘉宾, 4:普通参会者, 5:联席主讲人, 6:会议助理"`
+	Id                    int    `orm:"column(id);pk;"description:"主键ID"`
+	Company               string `description:"公司名称"`
+	UserName              string `description:"用户名"`
+	UserPhone             string `description:"手机号"`
+	UserinfoUource        string `description:"用户来源"`
+	AuthInfo              string `description:"用户参会鉴权"`
+	GuestUsername         string `description:"嘉宾名称, 多个用,隔开"`
+	FirstWatchTime        string `description:"首次观看时间"`
+	LastWatchTime         string `description:"最后观看时间"`
+	RoadshowId            string `description:"路演ID"`
+	RoadshowTitle         string `description:"路演标题"`
+	RoadshowBeginTime     string `description:"路演开始时间"`
+	RoadshowEndTime       string `description:"路演结束时间"`
+	JoinTime              int    `description:"参与时长"`
+	JoinType              int    `description:"参与方式, 1网络, 2电话"`
+	DataType              int    `description:"数据类型: 1直播, 2回放"`
+	Occupation            string `description:"职位"`
+	UseridEntity          int    `description:"参会者身份. 1:主讲人, 2:主持人, 3:嘉宾, 4:普通参会者, 5:联席主讲人, 6:会议助理"`
+	CrmCompanyMapStatusId int    `description:"转换后的对应状态信息:1=正式客户, 2=曾使用客户, 3=其他"`
 }
 
 func AddAttendancDetail(items []*CygxActivityAttendanceDetail, activityId int, mobileStr string) (err error) {

+ 1 - 1
models/activity_type.go

@@ -72,7 +72,7 @@ func GetActivityTypeHomeList() (items []*ActivityTypeHome, err error) {
 //列表
 func GetActivityTypeHomeListPc() (items []*ActivityTypeHomePc, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT * FROM cygx_activity_type ORDER BY sort DESC`
+	sql := `SELECT * FROM cygx_activity_type WHERE activity_type_id != 7   ORDER BY sort DESC`
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }

+ 12 - 0
models/article.go

@@ -138,6 +138,7 @@ type ArticleDetail struct {
 	CollectionNum           int    `description:"收藏数量"`
 	DepartmentId            int    `description:"作者ID"`
 	DepartmentImgUrl        string `description:"作者头像"`
+	NickName                string `description:"作者昵称"`
 	SubjectIds              string `description:"文章关联标的的ID字符串"`
 	IndustrialAndSubjectIds string `description:"文章关联产业和标的的ID字符串"`
 	IndustrialManagementId  int    `description:"文章关联产业ID"`
@@ -632,3 +633,14 @@ func GetCygxArticleTypeList() (items []*CygxArticleType, err error) {
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
+
+//通过文章ID获取文章所关联的标的ID
+func GetSubjectIds(articleId int) (subjects string, err error) {
+	sql := ` SELECT
+			GROUP_CONCAT( DISTINCT industrial_subject_id ORDER BY id ASC SEPARATOR ',' ) AS subjects 
+			FROM
+			cygx_industrial_article_group_subject WHERE article_id = ?`
+	o := orm.NewOrm()
+	err = o.Raw(sql, articleId).QueryRow(&subjects)
+	return
+}

+ 4 - 4
models/article_celue_push.go

@@ -15,15 +15,15 @@ type CygxArticleCeluePush struct {
 
 func GetArticleCeluePushList() (item []*CygxArticleCeluePush, err error) {
 	o := orm.NewOrm()
-	sql := ` SELECT *  FROM	cygx_article_celue_push WHERE	is_handle = 0   `
+	sql := ` SELECT *  FROM	cygx_article_celue_push WHERE	is_handle = 0    GROUP BY article_id   `
 	_, err = o.Raw(sql).QueryRows(&item)
 	return
 }
 
 //更改推送内容是否处理状态
-func UpdateCygxArticleCeluePush(id int) (err error) {
+func UpdateCygxArticleCeluePush(articleId int) (err error) {
 	o := orm.NewOrm()
-	sql := `UPDATE cygx_article_celue_push SET is_handle=1 WHERE id=? `
-	_, err = o.Raw(sql, id).Exec()
+	sql := `UPDATE cygx_article_celue_push SET is_handle=1 WHERE article_id=? `
+	_, err = o.Raw(sql, articleId).Exec()
 	return
 }

+ 15 - 0
models/chart_permission.go

@@ -151,3 +151,18 @@ func GetCompanyPermissionIdWithHtgj() (chartpermissionids string, err error) {
 	err = o.Raw(sql).QueryRow(&chartpermissionids)
 	return
 }
+
+// GetChartPermissionById 主键获取权限
+func GetChartPermissionByRemark(remark string) (item *ChartPermission, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM chart_permission WHERE remark = ? LIMIT 1`
+	err = o.Raw(sql, remark).QueryRow(&item)
+	return
+}
+
+func GetChartPermissionIdByName(condition string, pars []interface{}) (chartpermissionids string, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT GROUP_CONCAT(DISTINCT chart_permission_id   SEPARATOR ',') AS chartpermissionids FROM chart_permission  WHERE product_id=2  ` + condition
+	err = o.Raw(sql, pars).QueryRow(&chartpermissionids)
+	return
+}

+ 14 - 0
models/company.go

@@ -106,6 +106,20 @@ func GetCompanyPermissionByUser(companyId int) (permission string, err error) {
 	return
 }
 
+//获取用户权限不限制状态
+func GetCompanyPermissionByUserNoStatus(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`
+	o := orm.NewOrm()
+	err = o.Raw(sql, companyId).QueryRow(&permission)
+	return
+}
+
 //获取正式权限
 func GetCompanyPermissionByUserZhengShi(companyId int) (permission string, err error) {
 	sql := ` SELECT GROUP_CONCAT(DISTINCT b.remark  ORDER BY b.sort ASC  SEPARATOR ',') AS permission

+ 15 - 0
models/industrial_management.go

@@ -516,3 +516,18 @@ func UpdateIndustrialManagementFllowNum(num, industrialManagementId int) (err er
 	_, err = o.Raw(sql, num, industrialManagementId).Exec()
 	return
 }
+
+//通过id 获取详情
+func GetIndustrialManagemenDetailByAaticleID(articleId int) (items []*IndustrialManagementRep, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+			article_id,
+			industry_name 
+		FROM
+			cygx_industrial_article_group_management AS mg
+			INNER JOIN cygx_industrial_management AS m ON mg.industrial_management_id = m.industrial_management_id 
+		WHERE
+			mg.article_id = ? `
+	_, err = o.Raw(sql, articleId).QueryRows(&items)
+	return
+}

+ 5 - 4
models/report.go

@@ -203,10 +203,11 @@ func GetWhichDepartmentCount(condition string) (count int, err error) {
 }
 
 type IsShow struct {
-	IsShow         bool `description:"是否展示"`
-	IsShowResearch bool `description:"研选是否展示限免"`
-	IsShowChart    bool `description:"图表是否展示限免"`
-	IsShowList     bool `description:"榜单是否展示"`
+	IsShow         bool   `description:"是否展示"`
+	IsShowResearch bool   `description:"研选是否展示限免"`
+	IsShowChart    bool   `description:"图表是否展示限免"`
+	IsShowList     bool   `description:"榜单是否展示"`
+	LinkWxExplain  string `description:"关注微信公众号链接说明地址"`
 }
 
 //获取用户是否有查看权限

+ 8 - 0
models/report_mapping.go

@@ -114,6 +114,14 @@ func GetdetailByCategoryId(categoryId int) (item *ReportMapping, err error) {
 	return
 }
 
+//通过分类ID获取详情
+func GetdetailByCategoryIdPush(categoryId int) (item *ReportMapping, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_report_mapping WHERE category_id=? `
+	err = o.Raw(sql, categoryId).QueryRow(&item)
+	return
+}
+
 //通过分类ID获取详情主观客观
 func GetdetailByCategoryIdSando(categoryId int) (item *ReportMapping, err error) {
 	o := orm.NewOrm()

+ 23 - 0
models/seller.go

@@ -46,3 +46,26 @@ func GetSellerByName(userName string) (item *AdminItem, err error) {
 	err = o.Raw(sql, userName).QueryRow(&item)
 	return
 }
+
+//获取本组的销售ID
+func GetSelleridWhichGroup(companyId, productId int) (adminId string, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT
+			GROUP_CONCAT( DISTINCT admin_id SEPARATOR ',' ) AS adminId
+			FROM
+			admin
+			WHERE
+			group_id IN (
+			SELECT
+			a.group_id
+			FROM
+			company_product AS a
+			INNER JOIN admin AS b ON a.seller_id = b.admin_id
+			INNER JOIN wx_user AS c ON b.mobile = c.mobile
+			WHERE
+			a.company_id = ?
+			AND a.product_id = ?
+)`
+	err = o.Raw(sql, companyId, productId).QueryRow(&adminId)
+	return
+}

+ 23 - 0
models/user_record.go

@@ -140,3 +140,26 @@ func GetUserRecordListByMobile(platform int, bindAccount string) (items []*OpenI
 	_, err = orm.NewOrm().Raw(sql, platform).QueryRows(&items)
 	return
 }
+
+//获取单个用户openid
+func GetOpenIdDetailByMobile(platform int, bindAccount string) (item *OpenIdList, err error) {
+	o := orm.NewOrm()
+	var sql string
+	sql = `SELECT cr.open_id,wu.user_id FROM user_record  as u 
+			INNER JOIN cygx_user_record AS cr ON cr.union_id = u.union_id 
+			INNER JOIN wx_user AS wu ON wu.mobile = u.bind_account 
+			WHERE create_platform=? AND u.bind_account = ?`
+	err = o.Raw(sql, platform, bindAccount).QueryRow(&item)
+	return
+}
+
+func GetOpenIdByUserIds(ids string) (item []*OpenIdList, err error) {
+	o := orm.NewOrm()
+	var sql string
+	sql = `SELECT cr.open_id,wu.user_id FROM user_record  as u 
+			INNER JOIN cygx_user_record AS cr ON cr.union_id = u.union_id 
+			INNER JOIN wx_user AS wu ON wu.mobile = u.bind_account 
+			WHERE create_platform=4 AND u.user_id IN (`+ids+`)`
+	_,err = o.Raw(sql).QueryRows(&item)
+	return
+}

+ 1 - 0
models/wx_user.go

@@ -82,6 +82,7 @@ type WxUserItem struct {
 	OutboundMobile      string    `description:"外呼手机号"`
 	OutboundCountryCode string    `description:"外呼手机号区号"`
 	IsMsgOutboundMobile int       `description:"是否弹窗过绑定外呼手机号区号"`
+	IsMaker             int       `description:"是否是决策人"`
 	Source              int
 }
 

+ 110 - 0
models/wx_user_code.go

@@ -29,3 +29,113 @@ func GetWxUserCode(wxCode string) (item *WxUserCode, err error) {
 	err = o.Raw(sql, wxCode).QueryRow(&item)
 	return
 }
+
+//获取所有有权限的用户的opid
+func GetCygxUserRecordPower(condition string, pars []interface{}) (items []*OpenIdList, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+			cr.open_id,
+			u.user_id,
+			u.company_id,
+			u.real_name,
+			u.mobile 
+		FROM
+			company_report_permission AS p
+			INNER JOIN wx_user AS u ON u.company_id = p.company_id
+			INNER JOIN user_record AS r ON r.user_id = u.user_id
+			INNER JOIN cygx_user_record AS cr ON cr.union_id = r.union_id 
+		WHERE
+			 r.create_platform = 4 ` + condition + ` AND p.STATUS IN ('正式','试用','永续')  GROUP BY cr.open_id`
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+//获取关注这个文章对应产业的用户的 openid
+func GetCygxUserFllowOpenid(articleId int) (items []*OpenIdList, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+			cr.open_id,
+			f.user_id 
+		FROM
+			cygx_xzs_choose_send AS s
+			INNER JOIN cygx_industry_fllow AS f ON f.user_id = s.user_id
+			INNER JOIN user_record AS r ON r.user_id = f.user_id
+			INNER JOIN cygx_user_record AS cr ON cr.union_id = r.union_id 
+			INNER JOIN cygx_industrial_article_group_management as mg  ON mg.industrial_management_id = f.industrial_management_id
+		WHERE
+			r.create_platform = 4 
+			AND mg.article_id  = ?`
+	_, err = o.Raw(sql, articleId).QueryRows(&items)
+	return
+}
+
+//获取拒绝接收推送的的用户的 openid
+func GetCygxUserRefusetOpenid() (items []*OpenIdList, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+			cr.open_id,
+			s.user_id
+			FROM
+			cygx_xzs_choose_send AS s
+			INNER JOIN user_record AS r ON r.user_id = s.user_id
+			INNER JOIN cygx_user_record AS cr ON cr.union_id = r.union_id
+			WHERE
+			r.create_platform = 4
+			AND s.is_refuse = 1`
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+//获取选择策略推送的用户的openid openid
+func GetCygxUserFllowCeLueOpenid(categoryId int) (items []*OpenIdList, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+			cr.open_id,
+			f.user_id 
+		FROM
+			cygx_xzs_choose_send AS s
+			INNER JOIN cygx_xzs_choose_category AS f ON f.user_id = s.user_id
+			INNER JOIN user_record AS r ON r.user_id = f.user_id
+			INNER JOIN cygx_user_record AS cr ON cr.union_id = r.union_id 
+		WHERE
+			r.create_platform = 4
+			AND s.is_refuse = 0
+			AND (s.is_subjective = 1 OR s.is_objective = 1)
+			AND f.category_id = ?`
+	_, err = o.Raw(sql, categoryId).QueryRows(&items)
+	return
+}
+
+type CygxXzsChooseSend struct {
+	Id           int       `orm:"column(id);pk"`
+	UserId       int       `description:"用户ID"`
+	Mobile       string    `description:"手机号"`
+	Email        string    `description:"邮箱"`
+	CompanyId    int       `description:"公司id"`
+	CompanyName  string    `description:"公司名称"`
+	RealName     string    `description:"用户实际名称"`
+	IsRefuse     int       `description:"是否拒绝推送,0否、1是  如果为1 则不做任何推送"`
+	IsSubjective int       `description:"是否选择主观推送, 1 是 、 0否"`
+	IsObjective  int       `description:"是否选择客观推送, 1 是 、 0否"`
+	CreateTime   time.Time `description:"创建时间"`
+	ModifyTime   time.Time `description:"更新时间"`
+}
+
+//获取提交过推送规则用户的userId
+func GetCygxXzsChooseSend() (items []*CygxXzsChooseSend, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_xzs_choose_send `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+
+//获取提交过推送规则用户的userId
+func GetCygxXzsChooseSendOpenIdByUserIds(idStr string) (items []*OpenIdList, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT ur.user_id, cr.open_id FROM user_record AS ur
+INNER JOIN cygx_user_record AS cr
+WHERE ur.user_id IN (` + idStr + `) AND create_platform=4 AND ur.union_id=cr.union_id `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}

+ 176 - 3
services/activity.go

@@ -308,7 +308,7 @@ func EditUserOutboundMobile(cont context.Context) (err error) {
 	return
 }
 
-//获取 用户类型   //1、永续客户 //2、大套餐客户(4个行业全开通的正式客户) //3、分行业套餐客户(开通对应行业的正式客户) //4、仅开通专家套餐的正式客户 //5、开通对应行业套餐或专家套餐的试用客户
+//获取 用户类型   //1、永续客户 //2、大套餐客户(4个行业全开通的正式客户) //3、分行业套餐客户(开通对应行业的正式客户) //4、仅开通专家套餐的正式客户 //5、开通对应行业套餐或专家套餐的试用客户;6、冻结客户;7、流失客户
 func GetUserType(companyId int) (userType int, permissionStrnew string, err error) {
 
 	var permissionStr, permissionZhegnshiStr string
@@ -328,7 +328,7 @@ func GetUserType(companyId int) (userType int, permissionStrnew string, err erro
 				err = errs
 				return
 			}
-			permissionStr, errs = models.GetCompanyPermissionByUser(companyId)
+			permissionStr, errs = models.GetCompanyPermissionByUserNoStatus(companyId)
 			if errs != nil {
 				err = errs
 				return
@@ -357,6 +357,10 @@ func GetUserType(companyId int) (userType int, permissionStrnew string, err erro
 						userType = 4
 					}
 				}
+			} else if companyDetail.Status == "冻结" {
+				userType = 6
+			} else if companyDetail.Status == "流失" {
+				userType = 7
 			}
 		}
 	}
@@ -401,7 +405,7 @@ func GetHavePower(activityInfo *models.ActivityDetail, permissionStr, companyDet
 	} else if (activityInfo.ActivityTypeId == 1 || activityInfo.ActivityTypeId == 3 || activityInfo.ActivityTypeId == 4 || activityInfo.ActivityTypeId == 5) && strings.Contains(permissionStr, "专家") {
 		havePower = true
 	}
-	if activityInfo.ActivityTypeId == 2 || activityInfo.ActivityTypeId == 6 {
+	if activityInfo.ActivityTypeId == 2 || activityInfo.ActivityTypeId == 6 || activityInfo.ActivityTypeId == 7 {
 		if strings.Contains(permissionStr, activityInfo.ChartPermissionName+"(主观)") {
 			havePower = true
 		}
@@ -416,6 +420,141 @@ func GetHavePower(activityInfo *models.ActivityDetail, permissionStr, companyDet
 	return
 }
 
+//获取活动列表查询权限的SQL
+// @Param   ChartPermissionIds   query   string  false     "行业id 多个用 , 隔开"
+// @Param   ActivityTypeIds   query   string  false     "活动类型id 多个用 , 隔开"
+// @Param   ActiveState   query   string  false       "活动进行状态 未开始:1、进行中2、已结束3"
+// @Param   WhichDay   query   string  false       "哪一天 今天:1、明天:2,多个用 , 隔开"
+// @Param   IsPower   query   int  false       "是否选择有权限行业 ,1是 0 否 默认0"
+// @Param   Label   query   string  false       "搜索主题 多个用 , 隔开"
+func GetActivityonditionList(user *models.WxUserItem, activityTypeId, chartPermissionIds, whichDay, activeState, label string, isPower int) (conditionActivity string, err error) {
+	adminIds, err := models.GetSelleridWhichGroup(user.CompanyId, 2)
+	if err != nil {
+		return
+	}
+	userType, permissionStr, err := GetUserType(user.CompanyId)
+	if err != nil {
+		return
+	}
+	//判断客户规模是否属于可见范围的活动
+	companyProduct, err := models.GetCompanyProductDetail(user.CompanyId, 2)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	isMaker := user.IsMaker
+	slicePer := strings.Split(permissionStr, ",")
+	var permissionSqlStr string
+	var permissionNameStr string
+	for _, v := range slicePer {
+		if userType == 1 {
+			//研选权限处理
+			if !strings.Contains(v, utils.CHART_PERMISSION_NAME_YANXUAN) {
+				permissionNameStr += "'" + v + "',"
+			}
+		} else {
+			permissionNameStr += "'" + v + "',"
+		}
+	}
+	permissionNameStr = strings.Replace(permissionNameStr, "(主观)", "", -1)
+	permissionNameStr = strings.Replace(permissionNameStr, "(客观)", "", -1)
+	permissionNameStr = strings.TrimRight(permissionNameStr, ",")
+	var condition string
+	var conditionAdmin string
+	var sqlExport string // 专家权限处理
+	permissionSqlStr = ` AND art.chart_permission_name  IN (` + permissionNameStr + `)`
+	sqlExport = ` AND (art.customer_type_ids LIKE '%` + strconv.Itoa(userType) + `%' `
+	if userType == 2 {
+		sqlExport += ` OR  art.customer_type_ids LIKE '%3%' `
+	}
+	if (userType == 2 || userType == 3) && strings.Contains(permissionStr, "专家") {
+		sqlExport += ` OR  art.customer_type_ids LIKE '%4%' `
+	}
+	sqlExport += `) `
+	// 如果是C类电话会就不展示内容,且合并到分析师电话会
+	if activityTypeId == strconv.Itoa(utils.ANALYST_TELL_ACTIVITY_TYPE_ID) {
+		condition = ` AND art.publish_status = 1  AND art.label != ''  AND art.activity_type_id IN (` + activityTypeId + "," + strconv.Itoa(utils.C_CLASS_ACTIVITY_TYPE_ID) + `)`
+	} else {
+		condition = ` AND art.publish_status = 1  AND art.label != ''  AND art.activity_type_id = ` + activityTypeId
+	}
+	//活动仅决策人可见
+	if isMaker == 0 {
+		condition += ` AND art.is_maker_show = 0  `
+	}
+	//主题
+	if label != "" {
+		condition = ` AND art.label  LIKE '%` + label + `%' `
+	}
+
+	if isPower == 1 {
+		condition += permissionSqlStr
+	}
+	//行业名称
+	if len(chartPermissionIds) > 0 {
+		condition += ` AND art.chart_permission_id  IN (` + chartPermissionIds + `)`
+	}
+	var conditionOr string
+	if whichDay != "" {
+		var startDate string
+		var endDate string
+		if whichDay == "1" {
+			startDate = time.Now().Format(utils.FormatDate)
+			endDate = startDate
+		} else if whichDay == "2" {
+			startDate = time.Now().AddDate(0, 0, +1).Format(utils.FormatDate)
+			endDate = startDate
+		} else {
+			startDate = time.Now().Format(utils.FormatDate)
+			endDate = time.Now().AddDate(0, 0, +1).Format(utils.FormatDate)
+		}
+		condition += ` AND art.activity_time >= ` + "'" + startDate + " 00:00:00'"
+		condition += ` AND art.activity_time <= ` + "'" + endDate + " 23:59:59'"
+	}
+	if activeState != "" {
+		// 默认查看未开始跟进行中
+		if activeState == "1" {
+			condition += ` AND art.active_state  IN (1,2)`
+		} else {
+			condition += ` AND art.active_state  IN (` + activeState + `)`
+		}
+	} else {
+		condition += ` AND art.active_state  IN (1,2)`
+	}
+	conditionAdmin = condition
+	//查询全部可见的数据(是否全部客户可见)
+	condition += ` AND art.visible_range != 1  `
+
+	if (userType == 2 || userType == 3 || userType == 4) && strings.Contains(permissionStr, "专家") {
+		conditionOr += ` OR (  art.is_limit_people = 1 AND art.customer_type_ids LIKE '%4%'	 ` + condition + `) `
+	}
+	if (userType == 5) && strings.Contains(permissionStr, "专家") {
+		conditionOr += ` OR (  art.is_limit_people = 1 AND art.customer_type_ids LIKE '%5%'	 ` + condition + `) `
+	}
+	if userType == 1 {
+		conditionOr += ` OR ( art.is_limit_people = 0 ` + condition + permissionSqlStr + `) `
+	} else {
+		conditionOr += ` OR ( art.is_limit_people = 0 ` + condition + `) `
+	}
+	if userType == 6 || userType == 7 {
+		conditionOr += ` OR (   art.customer_type_ids LIKE '%` + strconv.Itoa(userType) + `%'	 ` + condition + `) `
+	}
+	if companyProduct != nil {
+		if companyProduct.Scale != "" {
+			conditionOr += ` OR (  art.scale LIKE '%` + companyProduct.Scale + `%'	 ` + condition + `) `
+		}
+	}
+	if adminIds != "" {
+		conditionOr += ` OR (  art.customer_type_ids LIKE '%` + strconv.Itoa(userType) + `%' ` + ` AND  art.admin_id IN (` + adminIds + `) ` + conditionAdmin + `) `
+		if companyProduct != nil {
+			if companyProduct.Scale != "" {
+				conditionOr += ` OR (  art.scale LIKE '%` + companyProduct.Scale + `%'` + ` AND  art.admin_id IN (` + adminIds + `) ` + conditionAdmin + `) `
+			}
+		}
+	}
+
+	conditionActivity = condition + permissionSqlStr + sqlExport + conditionOr
+	return
+}
+
 //研选系列专家电话会,会前1小时将问题列表发送给邮箱
 func SendEmailFileForAskMsgResearch(cont context.Context) (err error) {
 	var msg string
@@ -707,6 +846,7 @@ func ActivityAttendanceDetail(cont context.Context) (err error) {
 							item.Position = v.Occupation
 							item.UseridEntity = v.UseridEntity
 							item.ActivityTime = activityDetail.ActivityTime
+							item.CrmCompanyMapStatusId = v.CrmCompanyMapStatusId
 							item.CreateTime = time.Now()
 							mobileStr += "'" + v.UserPhone + "'" + ","
 							needAddAttendanc = append(needAddAttendanc, item)
@@ -813,6 +953,7 @@ func ActivityAttendanceDetail(cont context.Context) (err error) {
 							item.Position = v.Occupation
 							item.UseridEntity = v.UseridEntity
 							item.ActivityTime = vAct.ActivityTime
+							item.CrmCompanyMapStatusId = v.CrmCompanyMapStatusId
 							item.CreateTime = time.Now()
 							mobileStr += "'" + v.UserPhone + "'" + ","
 							needAddAttendanc = append(needAddAttendanc, item)
@@ -1107,3 +1248,35 @@ func SpecialActivityUserRemind(user *models.WxUserItem, activityDetail *models.C
 	}
 	return
 }
+
+//func init() {
+//	DoActivityOnenIdWxTemplateMsg()
+//}
+
+//周日下午四点半推送全部活动
+func DoActivityOnenIdWxTemplateMsg(cont context.Context) (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg("周日下午四点半推送全部活动失败,DoActivityOnenIdWxTemplateMsg ErrMsg:"+err.Error(), 2)
+			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "DoActivityOnenIdWxTemplateMsg ErrMsg:"+err.Error(), utils.EmailSendToUsers)
+			fmt.Println(err)
+		}
+		if msg != "" {
+			utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
+		}
+	}()
+	var condition string
+	var pars []interface{}
+	openidPowerList, err := models.GetCygxUserRecordPower(condition, pars)
+	if err != nil {
+		return err
+	}
+	first := "近期所有行业活动预告,欢迎参与"
+	keyword1 := "--"
+	keyword2 := "--"
+	keyword3 := ""
+	keyword4 := "点击查看下周活动列表"
+	SendActivityOnenIdWxTemplateMsg(first, keyword1, keyword2, keyword3, keyword4, openidPowerList)
+	return
+}

+ 489 - 119
services/article.go

@@ -629,7 +629,7 @@ func GetArticleListByApi(cont context.Context) (err error) {
 	}
 	for _, v := range listUpdateArticle {
 		// 这里直接go出去会出现并发,导致文章md5ID唯一索引限制报错
-		err = HandleArticleListByApi(v.ArticleId, v.Id)
+		err = HandleArticleListByApi(v.ArticleId)
 		if err != nil {
 			utils.FileLog.Info("WxGetToken Result:%s ", err.Error())
 		}
@@ -638,7 +638,7 @@ func GetArticleListByApi(cont context.Context) (err error) {
 }
 
 //处理同步过来的文章
-func HandleArticleListByApi(artcleId, celuePushId int) (err error) {
+func HandleArticleListByApi(artcleId int) (err error) {
 	defer func() {
 		if err != nil {
 			go utils.SendAlarmMsg("处理同步策略平台数据失败"+"GetArticleListByApi ErrMsg:"+err.Error(), 2)
@@ -744,7 +744,7 @@ func HandleArticleListByApi(artcleId, celuePushId int) (err error) {
 			fmt.Println("UpdateArticlePublish Err:", err.Error())
 			return err
 		}
-		go models.UpdateCygxArticleCeluePush(celuePushId)
+		go models.UpdateCygxArticleCeluePush(artcleId)
 		return err
 
 	}
@@ -1002,142 +1002,512 @@ func HandleArticleListByApi(artcleId, celuePushId int) (err error) {
 
 		//类型ID 医药(医享会:28 、药调研:301)、消费【渠道新声:32】、科技【科技前言:79】、智造【匠心智造:84】或者是纪要做消息模板推送
 		fmt.Println(v.CategoryId)
-		if v.IsSummary == 1 || (v.CategoryId == 28 || v.CategoryId == 301 || v.CategoryId == 32 || v.CategoryId == 79 || v.CategoryId == 84) {
-			sliceSubjects := strings.Split(v.Stock, "/")
-			fmt.Println(sliceSubjects)
-			if len(sliceSubjects) > 0 {
-				var subjectStr string
-				for _, vSubject := range sliceSubjects {
-					sliceKuohao := strings.Split(vSubject, "(")           //过滤括号
-					sliceXiahuaxian := strings.Split(sliceKuohao[0], "-") //过滤下划线
-					subject := sliceXiahuaxian[0]
-					subjectStr += "'" + subject + "',"
-				}
-				if subjectStr != "" {
-					subjectStr = strings.TrimRight(subjectStr, ",")
-					activityIdList, err := models.GetActivityIdListBySubjecName(subjectStr)
+		//if v.IsSummary == 1 || (v.CategoryId == 28 || v.CategoryId == 301 || v.CategoryId == 32 || v.CategoryId == 79 || v.CategoryId == 84) {
+		//	sliceSubjects := strings.Split(v.Stock, "/")
+		//	fmt.Println(sliceSubjects)
+		//	if len(sliceSubjects) > 0 {
+		//		var subjectStr string
+		//		for _, vSubject := range sliceSubjects {
+		//			sliceKuohao := strings.Split(vSubject, "(")           //过滤括号
+		//			sliceXiahuaxian := strings.Split(sliceKuohao[0], "-") //过滤下划线
+		//			subject := sliceXiahuaxian[0]
+		//			subjectStr += "'" + subject + "',"
+		//		}
+		//		if subjectStr != "" {
+		//			subjectStr = strings.TrimRight(subjectStr, ",")
+		//			activityIdList, err := models.GetActivityIdListBySubjecName(subjectStr)
+		//			if err != nil {
+		//				fmt.Println("GetActivityIdListBySubjecName Err:", err.Error())
+		//				return err
+		//			}
+		//			if len(activityIdList) > 0 {
+		//				var activityIdStr string
+		//				for _, vAct := range activityIdList {
+		//					activityIdStr += strconv.Itoa(vAct.ActivityId) + ","
+		//				}
+		//				activityIdStr = strings.TrimRight(activityIdStr, ",")
+		//				if activityIdStr != "" {
+		//					appointmentList, err := models.GetAppointmentListByActivityId(activityIdStr, "1,2,5")
+		//					if err != nil {
+		//						fmt.Println("GetAppointmentListByActivityId Err:", err.Error())
+		//						return err
+		//					}
+		//					if len(appointmentList) > 0 {
+		//						for _, vApp := range appointmentList {
+		//
+		//							appointmentByMobileList, err := models.GetAppointmentListByActivityIdAndMobile(activityIdStr, vApp.Mobile)
+		//							if err != nil {
+		//								fmt.Println("GetAppointmentListByActivityId Err:", err.Error())
+		//								return err
+		//							}
+		//							var appointmentActivityName string
+		//							if len(appointmentByMobileList) > 0 {
+		//								for _, vAppM := range appointmentByMobileList {
+		//									appointmentActivityName += vAppM.ActivityName + ","
+		//								}
+		//							}
+		//							appointmentActivityName = strings.TrimRight(appointmentActivityName, ",")
+		//							if vApp.ActivityTypeId == 5 && v.CategoryId != 301 {
+		//								continue
+		//							}
+		//
+		//							if vApp.Mobile != "" {
+		//								openIdListByAppointment, err := models.GetUserRecordListByMobile(4, vApp.Mobile)
+		//								if err != nil {
+		//									fmt.Println(err)
+		//									return err
+		//								}
+		//								keyword1 := "您预约的调研,有关联的纪要发布/更新了"
+		//								keyword2 := appointmentActivityName
+		//								keyword3 := v.Title
+		//								keyword4 := v.PublishDate.Format(utils.FormatDateTime)
+		//								SendWxMsgWithArticleClassToAdmin(keyword1, keyword2, keyword3, keyword4, openIdListByAppointment, artcleId)
+		//							}
+		//						}
+		//					}
+		//				}
+		//			}
+		//		}
+		//	}
+		//}
+		//
+		////【公司调研】系列纪要发布/更新后
+		//if v.CategoryId == 45 || v.CategoryId == 74 || v.CategoryId == 86 || v.CategoryId == 88 {
+		//	fmt.Println("处理预约纪要")
+		//	sliceSubjects := strings.Split(v.Stock, "/")
+		//	if len(sliceSubjects) > 0 {
+		//		var subjectStr string
+		//		for _, vSubject := range sliceSubjects {
+		//			sliceKuohao := strings.Split(vSubject, "(")           //过滤括号
+		//			sliceXiahuaxian := strings.Split(sliceKuohao[0], "-") //过滤下划线
+		//			subject := sliceXiahuaxian[0]
+		//			subjectStr += "'" + subject + "',"
+		//		}
+		//		if subjectStr != "" {
+		//			subjectStr = strings.TrimRight(subjectStr, ",")
+		//			activityIdList, err := models.GetActivityIdListBySubjecName(subjectStr)
+		//			if err != nil {
+		//				fmt.Println("GetActivityIdListBySubjecName Err:", err.Error())
+		//				return err
+		//			}
+		//			if len(activityIdList) > 0 {
+		//				var activityIdStr string
+		//				for _, vAct := range activityIdList {
+		//					activityIdStr += strconv.Itoa(vAct.ActivityId) + ","
+		//				}
+		//				activityIdStr = strings.TrimRight(activityIdStr, ",")
+		//				if activityIdStr != "" {
+		//					appointmentList, err := models.GetAppointmentListByActivityId(activityIdStr, "3,4")
+		//					if err != nil {
+		//						fmt.Println("GetAppointmentListByActivityId Err:", err.Error())
+		//						return err
+		//					}
+		//					if len(appointmentList) > 0 {
+		//						for _, vApp := range appointmentList {
+		//							appointmentByMobileList, err := models.GetAppointmentListByActivityIdAndMobile(activityIdStr, vApp.Mobile)
+		//							if err != nil {
+		//								fmt.Println("GetAppointmentListByActivityId Err:", err.Error())
+		//								return err
+		//							}
+		//							var appointmentActivityName string
+		//							if len(appointmentByMobileList) > 0 {
+		//								for _, vAppM := range appointmentByMobileList {
+		//									appointmentActivityName += vAppM.ActivityName + ","
+		//								}
+		//							}
+		//							appointmentActivityName = strings.TrimRight(appointmentActivityName, ",")
+		//							if vApp.Mobile != "" {
+		//								openIdListByAppointment, err := models.GetUserRecordListByMobile(4, vApp.Mobile)
+		//								if err != nil {
+		//									fmt.Println(err)
+		//									return err
+		//								}
+		//								keyword1 := "您预约的调研,有关联的纪要发布/更新了"
+		//								keyword2 := appointmentActivityName
+		//								keyword3 := v.Title
+		//								keyword4 := v.PublishDate.Format(utils.FormatDateTime)
+		//								SendWxMsgWithArticleClassToAdmin(keyword1, keyword2, keyword3, keyword4, openIdListByAppointment, artcleId)
+		//
+		//							}
+		//						}
+		//					}
+		//				}
+		//			}
+		//		}
+		//	}
+		//}
+
+		//【公司调研】系列纪要发布/更新后 end
+
+		//查研观向6.9模板消息推送规则
+		go DoArticleOnenIdWxTemplateMsg(v.ArticleId)
+	}
+	go models.UpdateCygxArticleCeluePush(artcleId)
+
+	return err
+}
+
+//func init() {
+//	DoArticleOnenIdWxTemplateMsg(6940)
+//}
+
+//过滤策略平台报告,研选报告重复推送,以及权限勾选的推送
+func DoArticleOnenIdWxTemplateMsg(articleId int) (err error) {
+	//策略平台同步过来的文章ID,做微信模板消息推送,同一篇报告12小时只推送一次
+	cacheKey := fmt.Sprint(utils.CACHE_KEY_ARTICLE_ID_TEMPLATE, ":ArticleId", articleId)
+	ttlTime := utils.Rc.GetRedisTTL(cacheKey)
+	if ttlTime > 0 {
+		return err
+	}
+	var msg string
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg("处理同步策略平台数据失败"+"GetArticleListByApi ErrMsg:"+err.Error(), 2)
+			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "GetArticleListByApi ErrMsg:"+err.Error(), utils.EmailSendToUsers)
+			fmt.Println(err)
+		}
+		if msg != "" {
+			utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
+		}
+	}()
+
+	//获取文章详情
+	articleInfo, err := models.GetArticleDetailById(articleId)
+	if err != nil {
+		return
+	}
+	articleInfo.Abstract, _ = GetReportContentTextSub(articleInfo.Abstract)
+	var chartPermissionId int
+
+	var chartPermissionName string
+	reportMapDetail, err := models.GetdetailByCategoryIdPush(articleInfo.CategoryId)
+	if err != nil {
+		return err
+	}
+	if reportMapDetail.ChartPermissionId == utils.CE_LUE_ID {
+		chartPermissionId = utils.CE_LUE_ID
+	} else {
+		if reportMapDetail.PermissionType == 1 {
+			chartPermissionName = reportMapDetail.ChartPermissionName + "(主观)"
+		} else {
+			chartPermissionName = reportMapDetail.ChartPermissionName + "(客观)"
+		}
+		chartPermissionDetail, err := models.GetChartPermissionByRemark(chartPermissionName)
+		if err != nil {
+			return err
+		}
+		chartPermissionId = chartPermissionDetail.ChartPermissionId
+	}
+	// 获取所有有权的用户的 openid
+	mapOpenidPower := make(map[int]string)
+	permissionIdList := make([]string, 0)
+	var condition string
+	var pars []interface{}
+	slicepermissionId := strings.Split(strconv.Itoa(chartPermissionId), ",")
+	if len(slicepermissionId) > 0 {
+		for _, v := range slicepermissionId {
+			permissionIdList = append(permissionIdList, v)
+		}
+		condition += ` AND p.chart_permission_id  IN (` + utils.GetOrmInReplace(len(slicepermissionId)) + ` )  `
+		pars = append(pars, permissionIdList)
+	}
+	openidPowerList, err := models.GetCygxUserRecordPower(condition, pars)
+	if err != nil {
+		return err
+	}
+	for _, v := range openidPowerList {
+		mapOpenidPower[v.UserId] = v.OpenId
+	}
+	//获取关注这个文章对应产业的用户的 openid
+	mapOpenidFllow := make(map[int]string)
+	if chartPermissionId != utils.CE_LUE_ID {
+		openidFllowList, err := models.GetCygxUserFllowOpenid(articleId)
+		if err != nil {
+			return err
+		}
+		for _, v := range openidFllowList {
+			mapOpenidFllow[v.UserId] = v.OpenId
+		}
+	}
+
+	//获取拒绝接收推送的的用户的 openid
+	mapOpenidRefuset := make(map[int]string)
+	openidRefusetList, err := models.GetCygxUserRefusetOpenid()
+	if err != nil {
+		return err
+	}
+	for _, v := range openidRefusetList {
+		mapOpenidRefuset[v.UserId] = v.OpenId
+	}
+	//获取提交过推送规则的用户的 openid
+	mapUserIdChooseSend := make(map[int]int)
+	mapUserIdChooseSendTypeNoPermission := make(map[int]int)
+	chooseSendtList, err := models.GetCygxXzsChooseSend()
+	for _, v := range chooseSendtList {
+		mapUserIdChooseSend[v.UserId] = v.UserId
+		if v.IsRefuse == 1 {
+			continue
+		}
+		//获取选择主客观赛道的用户
+		if reportMapDetail.PermissionType == 1 {
+			if v.IsSubjective == 1 {
+				mapUserIdChooseSendTypeNoPermission[v.UserId] = v.UserId
+			}
+		} else {
+			if v.IsObjective == 1 {
+				mapUserIdChooseSendTypeNoPermission[v.UserId] = v.UserId
+			}
+		}
+	}
+	//已经推送了的openid
+	mapOpenidPushed := make(map[int]string)
+	//文章关联的产业
+	var industryName string
+	if chartPermissionId != utils.CE_LUE_ID {
+		detailIndustryNameList, err := models.GetIndustrialManagemenDetailByAaticleID(articleId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			return err
+		}
+		for _, v := range detailIndustryNameList {
+			industryName += v.IndustryName + ","
+		}
+		industryName = strings.TrimRight(industryName, ",")
+	} else {
+		industryName = reportMapDetail.SubCategoryName
+	}
+	keyword2 := articleInfo.Title
+	keyword3 := articleInfo.PublishDate
+	keyword4 := articleInfo.Abstract
+	mapAlreadySend := make(map[int]int)
+	//如果是策略就按照策略的推送方式来写
+	if reportMapDetail.ChartPermissionName == utils.CE_LUE_NAME {
+		//获取提交过推送规则的用户的 openid
+		mapUserFllowCeLue := make(map[int]string)
+		userFllowCeLueList, err := models.GetCygxUserFllowCeLueOpenid(articleInfo.CategoryId)
+		if err != nil {
+			return err
+		}
+		for _, v := range userFllowCeLueList {
+			mapUserFllowCeLue[v.UserId] = v.OpenId
+		}
+		for k, v := range mapOpenidPower {
+			if mapOpenidPushed[k] != "" {
+				continue
+			}
+			openIditem := new(models.OpenIdList)
+			openIditem.UserId = k
+			openIditem.OpenId = v
+			first := "您关注的赛道,有新的报告发布/更新,欢迎查看"
+			keyword1 := "所属赛道:" + industryName
+			mapActivityUserId := make(map[int]string)
+			if articleInfo.IsSummary == 1 {
+				sliceSubjectId, _ := models.GetSubjectIds(articleId)
+				if sliceSubjectId != "" {
+					appointmentList, err := models.GetCygxAppointmentSummaryBySubjectId(sliceSubjectId)
 					if err != nil {
-						fmt.Println("GetActivityIdListBySubjecName Err:", err.Error())
+						fmt.Println("GetCygxAppointmentSummaryListBySubjectId Err:", err.Error())
 						return err
 					}
-					if len(activityIdList) > 0 {
-						var activityIdStr string
-						for _, vAct := range activityIdList {
-							activityIdStr += strconv.Itoa(vAct.ActivityId) + ","
+					var userIds []string
+					if len(appointmentList) > 0 {
+						for _, v := range appointmentList {
+							//fmt.Println("mapActivityUserId:", v.UserId)
+							userIds = append(userIds, strconv.Itoa(v.UserId))
+							mapActivityUserId[v.UserId] += v.ActivityName + ","
 						}
-						activityIdStr = strings.TrimRight(activityIdStr, ",")
-						if activityIdStr != "" {
-							appointmentList, err := models.GetAppointmentListByActivityId(activityIdStr, "1,2,5")
-							if err != nil {
-								fmt.Println("GetAppointmentListByActivityId Err:", err.Error())
-								return err
-							}
-							if len(appointmentList) > 0 {
-								for _, vApp := range appointmentList {
-
-									appointmentByMobileList, err := models.GetAppointmentListByActivityIdAndMobile(activityIdStr, vApp.Mobile)
-									if err != nil {
-										fmt.Println("GetAppointmentListByActivityId Err:", err.Error())
-										return err
-									}
-									var appointmentActivityName string
-									if len(appointmentByMobileList) > 0 {
-										for _, vAppM := range appointmentByMobileList {
-											appointmentActivityName += vAppM.ActivityName + ","
-										}
-									}
-									appointmentActivityName = strings.TrimRight(appointmentActivityName, ",")
-									if vApp.ActivityTypeId == 5 && v.CategoryId != 301 {
-										continue
-									}
-
-									if vApp.Mobile != "" {
-										openIdListByAppointment, err := models.GetUserRecordListByMobile(4, vApp.Mobile)
-										if err != nil {
-											fmt.Println(err)
-											return err
-										}
-										keyword1 := "您预约的调研,有关联的纪要发布/更新了"
-										keyword2 := appointmentActivityName
-										keyword3 := v.Title
-										keyword4 := v.PublishDate.Format(utils.FormatDateTime)
-										SendWxMsgWithArticleClassToAdmin(keyword1, keyword2, keyword3, keyword4, openIdListByAppointment, artcleId)
-									}
-								}
+						userIdstr := strings.Join(userIds, ",")
+						openIdLists, err := models.GetOpenIdByUserIds(userIdstr)
+						if err != nil {
+							fmt.Println("GetOpenIdByUserIds Err:", err.Error())
+							return err
+						}
+						for _, item := range openIdLists {
+							first := "您预约的调研,有关联的纪要发布/更新了1"
+							keyword1 := industryName
+							openIditem := new(models.OpenIdList)
+							openIditem.OpenId = item.OpenId
+							openIditem.UserId = item.UserId
+							if _, ok := mapAlreadySend[openIditem.UserId]; !ok {
+								SendWxMsgWithArticleUpdate(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
+								delete(mapUserIdChooseSendTypeNoPermission, openIditem.UserId)
+								fmt.Println("AlreadySend:", openIditem.UserId)
+								mapAlreadySend[openIditem.UserId] = openIditem.UserId
 							}
 						}
 					}
 				}
+				//fmt.Println("openIditem.UserId:", openIditem.UserId)
+				//if _,ok := mapActivityUserId[openIditem.UserId]; ok{
+				//	first = "您预约的调研,有关联的纪要发布/更新了"
+				//	keyword1 = industryName
+				//	SendWxMsgWithArticleUpdate(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
+				//	delete(mapUserIdChooseSendTypeNoPermission, openIditem.UserId)
+				//	mapAlreadySend[openIditem.UserId] = openIditem.UserId
+				//}
+			}
+			_, ok := mapAlreadySend[openIditem.UserId]
+			//如果有权限而且小助手没有提交过信息的 就做正常推送
+			if mapUserIdChooseSend[openIditem.UserId] == 0 && !ok {
+				fmt.Println("1:", articleId)
+				SendWxMsgWithArticleUpdate(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
+			}
+			//如果小助手勾选了对应的权限信息 就做正常推送
+			if mapUserIdChooseSend[openIditem.UserId] != 0 && mapUserFllowCeLue[openIditem.UserId] != "" && !ok {
+				fmt.Println("2:", articleId)
+				SendWxMsgWithArticleUpdate(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
 			}
 		}
-
-		//【公司调研】系列纪要发布/更新后
-		if v.CategoryId == 45 || v.CategoryId == 74 || v.CategoryId == 86 || v.CategoryId == 88 {
-			fmt.Println("处理预约纪要")
-			sliceSubjects := strings.Split(v.Stock, "/")
-			if len(sliceSubjects) > 0 {
-				var subjectStr string
-				for _, vSubject := range sliceSubjects {
-					sliceKuohao := strings.Split(vSubject, "(")           //过滤括号
-					sliceXiahuaxian := strings.Split(sliceKuohao[0], "-") //过滤下划线
-					subject := sliceXiahuaxian[0]
-					subjectStr += "'" + subject + "',"
+	} else {
+		for k, v := range mapOpenidPower {
+			if mapOpenidPushed[k] != "" {
+				continue
+			}
+			chooseSendtList, err := models.GetCygxXzsChooseSend()
+			if err != nil {
+				return err
+			}
+			mapUserIdChooseSendType := make(map[int]int)
+			for _, v := range chooseSendtList {
+				if v.IsRefuse == 1 {
+					continue
 				}
-				if subjectStr != "" {
-					subjectStr = strings.TrimRight(subjectStr, ",")
-					activityIdList, err := models.GetActivityIdListBySubjecName(subjectStr)
+				//获取选择主客观赛道的用户
+				if reportMapDetail.PermissionType == 1 {
+					if v.IsSubjective == 1 {
+						mapUserIdChooseSendType[v.UserId] = v.UserId
+					}
+				} else if reportMapDetail.PermissionType == 2 {
+					if v.IsObjective == 1 {
+						mapUserIdChooseSendType[v.UserId] = v.UserId
+					}
+				} else {
+					if v.IsSubjective == 1 || v.IsObjective == 1 {
+						mapUserIdChooseSendType[v.UserId] = v.UserId
+					}
+				}
+			}
+			openIditem := new(models.OpenIdList)
+			openIditem.UserId = k
+			openIditem.OpenId = v
+			first := "您关注的赛道,有新的报告发布/更新,欢迎查看"
+			keyword1 := "所属赛道:" + industryName
+			mapActivityUserId := make(map[int]string)
+			if articleInfo.IsSummary == 1 {
+				sliceSubjectId, _ := models.GetSubjectIds(articleId)
+				if sliceSubjectId != "" {
+					appointmentList, err := models.GetCygxAppointmentSummaryBySubjectId(sliceSubjectId)
 					if err != nil {
-						fmt.Println("GetActivityIdListBySubjecName Err:", err.Error())
+						fmt.Println("GetCygxAppointmentSummaryListBySubjectId Err:", err.Error())
 						return err
 					}
-					if len(activityIdList) > 0 {
-						var activityIdStr string
-						for _, vAct := range activityIdList {
-							activityIdStr += strconv.Itoa(vAct.ActivityId) + ","
+					var userIds []string
+					if len(appointmentList) > 0 {
+						for _, v := range appointmentList {
+							//fmt.Println("mapActivityUserId:", v.UserId)
+							userIds = append(userIds, strconv.Itoa(v.UserId))
+							mapActivityUserId[v.UserId] += v.ActivityName + ","
 						}
-						activityIdStr = strings.TrimRight(activityIdStr, ",")
-						if activityIdStr != "" {
-							appointmentList, err := models.GetAppointmentListByActivityId(activityIdStr, "3,4")
-							if err != nil {
-								fmt.Println("GetAppointmentListByActivityId Err:", err.Error())
-								return err
-							}
-							if len(appointmentList) > 0 {
-								for _, vApp := range appointmentList {
-									appointmentByMobileList, err := models.GetAppointmentListByActivityIdAndMobile(activityIdStr, vApp.Mobile)
-									if err != nil {
-										fmt.Println("GetAppointmentListByActivityId Err:", err.Error())
-										return err
-									}
-									var appointmentActivityName string
-									if len(appointmentByMobileList) > 0 {
-										for _, vAppM := range appointmentByMobileList {
-											appointmentActivityName += vAppM.ActivityName + ","
-										}
-									}
-									appointmentActivityName = strings.TrimRight(appointmentActivityName, ",")
-									if vApp.Mobile != "" {
-										openIdListByAppointment, err := models.GetUserRecordListByMobile(4, vApp.Mobile)
-										if err != nil {
-											fmt.Println(err)
-											return err
-										}
-										keyword1 := "您预约的调研,有关联的纪要发布/更新了"
-										keyword2 := appointmentActivityName
-										keyword3 := v.Title
-										keyword4 := v.PublishDate.Format(utils.FormatDateTime)
-										SendWxMsgWithArticleClassToAdmin(keyword1, keyword2, keyword3, keyword4, openIdListByAppointment, artcleId)
-
-									}
-								}
+						userIdstr := strings.Join(userIds, ",")
+						openIdLists, err := models.GetOpenIdByUserIds(userIdstr)
+						if err != nil {
+							fmt.Println("GetOpenIdByUserIds Err:", err.Error())
+							return err
+						}
+						for _, item := range openIdLists {
+							first := "您预约的调研,有关联的纪要发布/更新了1"
+							keyword1 := industryName
+							openIditem := new(models.OpenIdList)
+							openIditem.OpenId = item.OpenId
+							openIditem.UserId = item.UserId
+							if _, ok := mapAlreadySend[openIditem.UserId]; !ok {
+								SendWxMsgWithArticleUpdate(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
+								delete(mapUserIdChooseSendTypeNoPermission, openIditem.UserId)
+								fmt.Println("AlreadySend:", openIditem.UserId)
+								mapAlreadySend[openIditem.UserId] = openIditem.UserId
 							}
 						}
 					}
 				}
+				//fmt.Println("openIditem.UserId:", openIditem.UserId)
+				//if _,ok := mapActivityUserId[openIditem.UserId]; ok{
+				//	first = "您预约的调研,有关联的纪要发布/更新了"
+				//	keyword1 = industryName
+				//	SendWxMsgWithArticleUpdate(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
+				//	delete(mapUserIdChooseSendTypeNoPermission, openIditem.UserId)
+				//	mapAlreadySend[openIditem.UserId] = openIditem.UserId
+				//}
+			}
+
+			//如果有权限而且小助手没有提交过信息的 就做正常推送
+			_, ok := mapAlreadySend[openIditem.UserId]
+			if mapUserIdChooseSend[openIditem.UserId] == 0 && !ok {
+				SendWxMsgWithArticleUpdate(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
+				delete(mapUserIdChooseSendTypeNoPermission, openIditem.UserId)
+				mapAlreadySend[openIditem.UserId] = openIditem.UserId
+			}
+			//如果小助手勾选了对应的权限信息 就做正常推送
+			if mapUserIdChooseSend[openIditem.UserId] != 0 && mapOpenidFllow[openIditem.UserId] != "" && mapUserIdChooseSendType[openIditem.UserId] > 0 && !ok {
+				SendWxMsgWithArticleUpdate(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
+				delete(mapUserIdChooseSendTypeNoPermission, openIditem.UserId)
+				mapAlreadySend[openIditem.UserId] = openIditem.UserId
+			}
+		}
+
+		//获取提交过推送规则的用户的 openid 并推送模版消息
+		openIditem := new(models.OpenIdList)
+		first := "您关注的赛道,有新的报告发布/更新,欢迎查看"
+		keyword1 := "所属赛道:" + industryName
+		//mapActivityUserId := make(map[int]string)
+		//if articleInfo.IsSummary == 1 {
+		//	sliceSubjectId, _ := models.GetSubjectIds(articleId)
+		//	if sliceSubjectId != ""{
+		//		appointmentList, err := models.GetCygxAppointmentSummaryBySubjectId(sliceSubjectId)
+		//		if err != nil {
+		//			fmt.Println("GetCygxAppointmentSummaryListBySubjectId Err:", err.Error())
+		//			return err
+		//		}
+		//		if len(appointmentList) > 0 {
+		//			for _, v := range appointmentList {
+		//				fmt.Println("mapActivityUserId:", v.UserId)
+		//				mapActivityUserId[v.UserId] += v.ActivityName + ","
+		//				first = "您预约的调研,有关联的纪要发布/更新了"
+		//				keyword1 = industryName
+		//				if _, ok := mapAlreadySend[openIditem.UserId]; !ok{
+		//					SendWxMsgWithArticleUpdate(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
+		//					delete(mapUserIdChooseSendTypeNoPermission, openIditem.UserId)
+		//					mapAlreadySend[openIditem.UserId] = openIditem.UserId
+		//				}
+		//			}
+		//		}
+		//	}
+		//	//fmt.Println("openIditem.UserId:", openIditem.UserId)
+		//	//if _,ok := mapActivityUserId[openIditem.UserId]; ok{
+		//	//	first = "您预约的调研,有关联的纪要发布/更新了"
+		//	//	keyword1 = industryName
+		//	//	SendWxMsgWithArticleUpdate(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
+		//	//	delete(mapUserIdChooseSendTypeNoPermission, openIditem.UserId)
+		//	//	mapAlreadySend[openIditem.UserId] = openIditem.UserId
+		//	//}
+		//}
+		var ids []string
+		for k, _ := range mapUserIdChooseSendTypeNoPermission {
+			ids = append(ids, strconv.Itoa(k))
+		}
+		if len(ids) > 0 {
+			idStr := strings.Join(ids, ",")
+			openidIlist, err := models.GetCygxXzsChooseSendOpenIdByUserIds(idStr)
+			if err != nil {
+				return err
+			}
+			for _, item := range openidIlist {
+				openIditem.OpenId = item.OpenId
+				openIditem.UserId = item.UserId
+				if _, ok := mapAlreadySend[openIditem.UserId]; !ok {
+					SendWxMsgWithArticleUpdate(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
+				}
 			}
 		}
-		//【公司调研】系列纪要发布/更新后 end
 	}
-	go models.UpdateCygxArticleCeluePush(celuePushId)
-	return err
+	utils.Rc.Put(cacheKey, articleId, time.Hour*12)
+	return
 }

+ 3 - 0
services/task.go

@@ -78,6 +78,9 @@ func Task() {
 		reportBillboardUpdate := task.NewTask("reportBillboardUpdate", "0 10 0 * * *", ReportBillboardUpdate) //报告榜单更新
 		task.AddTask("reportBillboardUpdate", reportBillboardUpdate)
 
+		doActivityOnenIdWxTemplateMsg := task.NewTask("doActivityOnenIdWxTemplateMsg", "0 0 16 * * 0", DoActivityOnenIdWxTemplateMsg) ////周日下午四点半推送全部活动
+		task.AddTask("doActivityOnenIdWxTemplateMsg", doActivityOnenIdWxTemplateMsg)
+
 	}
 	if utils.RunMode != "release" {
 		getArticleListByApi := task.NewTask("getArticleListByApi", "0 */60 * * * *", GetArticleListByApi) //通过三方接口获取策略平台上的文章

+ 77 - 0
services/wx_template_msg.go

@@ -487,3 +487,80 @@ func SendTemplateMsg(sendUrl string, data []byte, resource string, sendType int,
 	}
 	return
 }
+
+//发送报告更新的消息给预约的用户
+func SendWxMsgWithArticleUpdate(first, keyWord1, keyWord2, keyWord3, keyWord4 string, item *models.OpenIdList, articleId int) (err error) {
+	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("发送报告提问消息提醒模版消息失败,文章ID:", articleId), 2)
+			utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
+		}
+	}()
+	accessToken, err := models.GetWxAccessTokenByXzs()
+	if err != nil {
+		msg = "GetWxAccessToken Err:" + err.Error()
+		return
+	}
+	if accessToken == "" {
+		msg = "accessToken is empty"
+		return
+	}
+	var openIdList []*models.OpenIdList
+	openIdList = append(openIdList, item)
+	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
+	templateId := utils.TemplateIdByProductXzs
+	sendMap := make(map[string]interface{})
+	sendData := make(map[string]interface{})
+	sendMap["template_id"] = templateId
+	sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "pageMy/reportDetail/reportDetail?id=" + strconv.Itoa(articleId)}
+	sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
+	sendData["keyword1"] = map[string]interface{}{"value": keyWord1, "color": "#173177"}
+	sendData["keyword2"] = map[string]interface{}{"value": keyWord2, "color": "#173177"}
+	sendData["keyword3"] = map[string]interface{}{"value": keyWord3, "color": "#173177"}
+	sendData["keyword4"] = map[string]interface{}{"value": keyWord4, "color": "#173177"}
+	sendData["remark"] = map[string]interface{}{"value": "点击查看活动详情", "color": "#173177"}
+	sendMap["data"] = sendData
+	WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(articleId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
+	return
+}
+
+//周日下午4点半,推送全部活动
+func SendActivityOnenIdWxTemplateMsg(first, keyWord1, keyWord2, keyWord3, keyWord4 string, openIdList []*models.OpenIdList) (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			go utils.SendEmail("周日下午4点半,推送全部活"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
+			go utils.SendAlarmMsg(fmt.Sprint("发送周日下午4点半,推送全部活模版消息失败,"), 2)
+			utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
+		}
+	}()
+	accessToken, err := models.GetWxAccessTokenByXzs()
+	if err != nil {
+		msg = "GetWxAccessToken Err:" + err.Error()
+		return
+	}
+	if accessToken == "" {
+		msg = "accessToken is empty"
+		return
+	}
+	//var openIdList []*models.OpenIdList
+	//openIdList = append(openIdList, item)
+	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
+	templateId := utils.WxMsgTemplateIdArticleUserRemind
+	sendMap := make(map[string]interface{})
+	sendData := make(map[string]interface{})
+	sendMap["template_id"] = templateId
+	sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "pages/activity/activity"}
+	//sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId}
+	sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
+	sendData["keyword1"] = map[string]interface{}{"value": keyWord1, "color": "#173177"}
+	sendData["keyword2"] = map[string]interface{}{"value": keyWord2, "color": "#173177"}
+	sendData["keyword3"] = map[string]interface{}{"value": keyWord3, "color": "#173177"}
+	sendData["keyword4"] = map[string]interface{}{"value": keyWord4, "color": "#173177"}
+	sendData["remark"] = map[string]interface{}{"value": "点击查看下周活动列表", "color": "#173177"}
+	sendMap["data"] = sendData
+	WxSendTemplateMsg(sendUrl, sendMap, openIdList, "", utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
+	return
+}

+ 9 - 9
utils/common.go

@@ -677,6 +677,15 @@ func GetAttendanceDetailSeconds(secondNum int) string {
 	return timeStr
 }
 
+// GetOrmInReplace 获取orm的in查询替换?的方法
+func GetOrmInReplace(num int) string {
+	template := make([]string, num)
+	for i := 0; i < num; i++ {
+		template[i] = "?"
+	}
+	return strings.Join(template, ",")
+}
+
 func GetLocalIP() (ip string, err error) {
 	addrs, err := net.InterfaceAddrs()
 	if err != nil {
@@ -697,12 +706,3 @@ func GetLocalIP() (ip string, err error) {
 	}
 	return
 }
-
-// GetOrmInReplace 获取orm的in查询替换?的方法
-func GetOrmInReplace(num int) string {
-	template := make([]string, num)
-	for i := 0; i < num; i++ {
-		template[i] = "?"
-	}
-	return strings.Join(template, ",")
-}

+ 3 - 1
utils/constants.go

@@ -61,7 +61,8 @@ var (
 
 //缓存key
 const (
-	CACHE_KEY_USER_VIEW = "user_view_record" //用户阅读数据
+	CACHE_KEY_USER_VIEW           = "user_view_record"           //用户阅读数据
+	CACHE_KEY_ARTICLE_ID_TEMPLATE = "ce_lue_article_id_template" //策略平台同步过来的文章ID,做微信模板消息推送,同一篇报告12小时只推送一次
 )
 
 //模板消息推送类型
@@ -87,6 +88,7 @@ const (
 	KE_JI_ID                         int    = 20
 	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" //用户阅读数据
 )
 
 const (