zhangchuanxing hai 1 semana
pai
achega
ac665e503d

+ 8 - 2
controllers/morning_meeting.go

@@ -350,7 +350,10 @@ func (this *MorningMeetingController) LogApprove() {
 		br.ErrMsg = "审核失败,Err:" + err.Error()
 		return
 	}
-	go services.AddCygxMorningMeetingReviewLog(logDetail, operate, user.RealName, user.UserId) //添加晨会精华日志信息,并发送模版消息
+	go services.AddCygxMorningMeetingReviewLog(logDetail, operate, user.RealName, user.UserId, status) //添加晨会精华日志信息,并发送模版消息
+	if status == 1 {
+		go services.HandleMorningMeetingReviewPush(meetingId)
+	}
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"
@@ -413,7 +416,10 @@ func (this *MorningMeetingController) LogApproveEdit() {
 		br.ErrMsg = "审核失败,Err:" + err.Error()
 		return
 	}
-	go services.AddCygxMorningMeetingReviewLog(logDetail, operate, user.RealName, user.UserId) //添加晨会精华日志信息,并发送模版消息
+	go services.AddCygxMorningMeetingReviewLog(logDetail, operate, user.RealName, user.UserId, status) //添加晨会精华日志信息,并发送模版消息
+	if status == 1 {
+		go services.HandleMorningMeetingReviewPush(meetingId)
+	}
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"

+ 31 - 0
models/cygx_morning_meeting_review_chapter.go

@@ -20,6 +20,14 @@ type CygxMorningMeetingReviewChapter struct {
 	Content              string    `json:"content"`             // 内容
 }
 
+// 列表
+func GetCygxMorningMeetingReviewsListById(meetingId int) (items []*CygxMorningMeetingReviewChapter, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_morning_meeting_review_chapter WHERE meeting_id = ? `
+	_, err = o.Raw(sql, meetingId).QueryRows(&items)
+	return
+}
+
 // 通过ID获取详情
 func GetCygxMorningMeetingReviewChapterDetail(id int) (item *CygxMorningMeetingReviewChapter, err error) {
 	o := orm.NewOrm()
@@ -93,3 +101,26 @@ func GetCygxMorningMeetingReviewsListByIndustrialIds(industrialIds string) (item
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
+
+func GetCygxMorningMeetingReviewsListByIdAndIndustryId(meetingId, industryId int) (item *CygxMorningMeetingReviewChapter, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_morning_meeting_review_chapter WHERE meeting_id = ? AND industry_id = ? `
+	err = o.Raw(sql, meetingId, industryId).QueryRow(&item)
+	return
+}
+
+// 获取数量
+func GetCygxMorningMeetingReviewChapterCount(cid int) (count int, err error) {
+	o := orm.NewOrm()
+	sqlCount := ` SELECT
+				COUNT( 1 ) AS count 
+			FROM
+				cygx_morning_meeting_review_chapter AS c
+				INNER JOIN cygx_morning_meeting_reviews AS a ON a.id = c.meeting_id 
+			WHERE
+				1 = 1 
+				AND c.id = ?
+				AND a.STATUS = 1`
+	err = o.Raw(sqlCount, cid).QueryRow(&count)
+	return
+}

+ 2 - 2
models/cygx_morning_meeting_review_log.go

@@ -27,9 +27,9 @@ type CygxMorningMeetingReviewLog struct {
 }
 
 // 添加晨报点评章节日志信息
-func AddCygxMorningMeetingReviewLog(item *CygxMorningMeetingReviewLog) (err error) {
+func AddCygxMorningMeetingReviewLog(item *CygxMorningMeetingReviewLog) (newId int64, err error) {
 	o := orm.NewOrm()
-	_, err = o.Insert(item)
+	newId, err = o.Insert(item)
 	return
 }
 

+ 2 - 0
models/cygx_morning_meeting_reviews.go

@@ -17,6 +17,8 @@ type CygxMorningMeetingReviews struct {
 	Status        int       `json:"status"`       // 0:未发布,1:已发布
 	PartNums      int       `json:"partNums"`     // 段落数
 	IndustryNames string    `json:"industryName"` // 产业名称
+	OpUserId      int       `description:"操作人编号"`
+	OpUserName    string    `description:"操作人名称"`
 }
 
 // 添加晨报点评

+ 16 - 0
models/cygx_user_record.go

@@ -34,3 +34,19 @@ func GetCygxUserRecordSubscribe(unionId string) (item *CygxUserRecord, err error
 	err = orm.NewOrm().Raw(sql, unionId).QueryRow(&item)
 	return
 }
+
+// 获取所有关注了该产业用户的openid
+func GetCygxUserIndustryFllowOpneid(IndustrialManagementId int) (items []*OpenIdList, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+			cr.open_id,
+			cr.cygx_user_id AS user_id 
+		FROM
+			cygx_user_record AS cr
+			INNER JOIN cygx_industry_fllow AS cf ON cr.cygx_user_id = cf.user_id 
+		WHERE
+			1 = 1 
+			AND cf.industrial_management_id = ? `
+	_, err = o.Raw(sql, IndustrialManagementId).QueryRows(&items)
+	return
+}

+ 32 - 1
services/es_comprehensive.go

@@ -237,7 +237,7 @@ func AddComprehensiveIndustrialSource(sourceType string, articleId int) {
 }
 
 // 添加晨会精华
-func AddComprehensiveMeetingreviewchapt() {
+func AddComprehensiveMeetingreviewchaptOld() {
 	var condition string
 	var pars []interface{}
 	IndustrialManagementRespMap, _ := GetIndustrialManagementRespMap()
@@ -268,6 +268,37 @@ func AddComprehensiveMeetingreviewchapt() {
 	}
 }
 
+func AddComprehensiveMeetingreviewchapt(sourceId int) {
+	time.Sleep(3 * time.Second) // 延迟三秒处理
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println("err:", err)
+			go utils.SendAlarmMsg("AddComprehensiveMeetingreviewchapt,Err:"+err.Error(), 3)
+		}
+	}()
+	v, e := models.GetCygxMorningMeetingReviewChapterDetail(sourceId)
+	if e != nil {
+		err = errors.New("GetCygxMorningMeetingReviewChapterDetail" + e.Error())
+		return
+	}
+	content := html.UnescapeString(v.Content)
+	doc, e := goquery.NewDocumentFromReader(strings.NewReader(content))
+	if e != nil {
+		err = errors.New("goquery.NewDocumentFromReader" + e.Error())
+		return
+	}
+	bodyText := doc.Text()
+	item := new(ElasticComprehensiveDetail)
+	item.SourceId = sourceId
+	item.Source = utils.CYGX_OBJ_MEETINGREVIEWCHAPT
+	item.IndustryName = v.IndustryName
+	item.PublishDate = v.MeetingTime.Format(utils.FormatDateTime)
+	item.Abstract = bodyText
+	EsAddOrEditComprehensiveData(item) //如果发布了就新增
+	return
+}
+
 // 添加活动
 func AddComprehensiveActivity() {
 	var condition string

+ 20 - 0
services/industrial_management.go

@@ -1277,6 +1277,26 @@ func UpdateIndustrialManagementTimeLineDateList3ByRedis() (err error) {
 	}
 }
 
+// 处理产业管理时间线相关内容的数据
+func UpdateIndustrialManagementTimeLineDateList3ByRedisAdd(industrialManagementId int) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			msg := fmt.Sprint("industrialManagementId:", industrialManagementId)
+			go utils.SendAlarmMsg("处理产业管理时间线相关内容的数据,写入Redis队列消息失败: UpdateIndustrialManagementTimeLineDateList3ByRedis"+err.Error()+msg, 2)
+		}
+	}()
+	//SourceType int       `description:"1:报名、 2:取消报名、3:活动编辑、4:活动发布,取消发布、5:活动到会。"`
+	log := &models.IndustrialManagementCount{IndustrialManagementId: industrialManagementId}
+	if utils.Re == nil {
+		err := utils.Rc.LPush(utils.CYGX_ARTICLE_TIME_LINE_KEY, log)
+		if err != nil {
+			fmt.Println("UpdateIndustrialManagementTimeLineDateList3ByRedis LPush Err:" + err.Error())
+		}
+	}
+	return
+}
+
 //func init_14_2() {
 //SELECT  * FROM cygx_resource_data WHERE  source_id  IN (SELECT article_id  FROM   cygx_article WHERE series_name IN ('行业深度','季度策略') )   AND source = 'article'
 //}

+ 209 - 2
services/morning_meeting.go

@@ -251,7 +251,7 @@ func GetCygxMorningMeetingReviewChapterListByIds2(meetingreviewchaptIds []int) (
 }
 
 // 添加晨会精华操作日志
-func AddCygxMorningMeetingReviewLog(itemReq *models.CygxMorningMeetingReviewLog, operate, opUserName string, opUserId int) (mapPvResp, mapUvResp map[int]int) {
+func AddCygxMorningMeetingReviewLog(itemReq *models.CygxMorningMeetingReviewLog, operate, opUserName string, opUserId, status int) (mapPvResp, mapUvResp map[int]int) {
 
 	var err error
 	defer func() {
@@ -280,6 +280,213 @@ func AddCygxMorningMeetingReviewLog(itemReq *models.CygxMorningMeetingReviewLog,
 	itemReq.OpUserName = opUserName
 	itemReq.OpUserId = opUserId
 
-	err = models.AddCygxMorningMeetingReviewLog(itemReq)
+	logId, e := models.AddCygxMorningMeetingReviewLog(itemReq)
+	if e != nil {
+		err = errors.New("AddCygxMorningMeetingReviewLog, Err: " + e.Error())
+		return
+	}
+	if status == 2 {
+		go SendWxMsgMorningMeetingApproveSubmit(int(logId)) ///晨会点评提交新内容审核时,给合规(指定手机号15721524062、15221002612)发送模板消息
+	} else {
+		go SendWxMsgMorningMeetingApproveResult(int(logId), status) //晨会点评内容完成审核时,给提交人发送模板消息
+	}
+	return
+}
+
+//func init() {
+//	HandleMorningMeetingReviewPush(145)
+//}
+
+// 处理晨会精华发布之后的逻辑
+func HandleMorningMeetingReviewPush(meetingId int) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg("处理晨会精华发布之后的逻辑 失败,AddCygxMorningMeetingReviewLog Err:"+err.Error(), 3)
+		}
+	}()
+	listchapter, e := models.GetCygxMorningMeetingReviewsListById(meetingId)
+	if e != nil {
+		err = errors.New("GetCygxMorningMeetingReviewsListById, Err: " + e.Error())
+		return
+	}
+	for _, item := range listchapter {
+		go SendWxMsgWithCygxMorningMeeting(int(meetingId), item.IndustryId, item.IndustryName)
+		go UpdateIndustrialManagementTimeLineDateList3ByRedisAdd(item.IndustryId) //处理产业管理时间线相关内容的数据
+		go UpdateMeetingreviewchaptResourceData(item.Id)                          //写入首页最新  cygx_resource_data 表
+		go AddComprehensiveMeetingreviewchapt(item.Id)                            //Es添加晨会精华
+	}
+	return
+}
+
+//func init() {
+//	//SendWxMsgMorningMeetingApproveResult(1, 1)
+//	SendWxMsgMorningMeetingApproveSubmit(1)
+//}
+
+// 晨会点评内容完成审核时,给提交人发送模板消息(服务销售openID取销售原账号对应的openID,根据姓名匹配查询)
+func SendWxMsgMorningMeetingApproveResult(logId, status int) (err error) {
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg(fmt.Sprint("晨会点评内容完成审核时,给提交人发送模板消息失败 logId ", logId, err.Error()), 2)
+		}
+	}()
+	var first string
+	var keyword1 string
+	var keyword2 string
+	var keyword3 string
+	var keyword4 string
+	var remark string
+
+	logDetail, e := models.GetCygxMorningMeetingReviewLogByLogId(logId)
+	if e != nil {
+		err = errors.New("GetCygxMorningMeetingReviewLogByLogId, Err: " + e.Error())
+		return
+	}
+	meetingId := logDetail.MeetingId
+	reviewDetail, e := models.GetMorningMeetingReviewById(meetingId)
+	if e != nil {
+		err = errors.New("GetMorningMeetingReviewById, Err: " + e.Error())
+		return
+	}
+
+	//获取建会人员信息
+	admin, e := models.GetSysAdminById(reviewDetail.OpUserId)
+	if e != nil {
+		err = errors.New("GetMorningMeetingReviewById, Err: " + e.Error())
+		return
+	}
+	mobile := admin.Mobile
+	openIdList, e := models.GetWxOpenIdByMobileList(mobile)
+	if e != nil {
+		err = errors.New("GetWxOpenIdByMobileList, Err: " + e.Error())
+		return
+	}
+	if len(openIdList) == 0 {
+		return
+	}
+
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+	redirectUrl := ""
+
+	keyword1 = "晨会点评内容审核"
+	if status == 1 {
+		meetDetail, e := models.GetCygxMorningMeetingReviewChapterDetailByMeetingId(meetingId)
+		if e != nil {
+			err = errors.New("GetCygxMorningMeetingReviewChapterDetailByMeetingId, Err: " + e.Error())
+			return
+		}
+		keyword2 = "已通过审核,点击查看详情"
+		redirectUrl = utils.WX_MSG_PATH_INDUSTRY_DETAIL + strconv.Itoa(meetDetail.IndustryId) + "&IsSendWx=1&ChapterId=" + strconv.Itoa(meetDetail.Id)
+	} else {
+		keyword2 = "未通过审核,点击查看驳回原因"
+		redirectUrl = utils.WX_MSG_PATH_MORNING_MEETING_LOG_DETAIL + strconv.Itoa(logId)
+		if utils.RunMode != "release" {
+			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(meetingId)
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
+	sendInfo.OpenIdArr = openIdArr
+	err = PublicSendTemplateMsg(sendInfo)
+	if err != nil {
+		return
+	}
+	return
+}
+
+// 晨会点评提交新内容审核时,给合规(指定手机号15721524062、15221002612)发送模板消息
+func SendWxMsgMorningMeetingApproveSubmit(logId int) (err error) {
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg(fmt.Sprint("晨会点评内容完成审核时,给提交人发送模板消息失败 logId ", logId, err.Error()), 2)
+		}
+	}()
+	var first string
+	var keyword1 string
+	var keyword2 string
+	var keyword3 string
+	var keyword4 string
+	var remark string
+
+	logDetail, e := models.GetCygxMorningMeetingReviewLogByLogId(logId)
+	if e != nil {
+		err = errors.New("GetCygxMorningMeetingReviewLogByLogId, Err: " + e.Error())
+		return
+	}
+	meetingId := logDetail.MeetingId
+
+	//获取建会人员信息
+	admin, e := models.GetSysAdminById(logDetail.OpUserId)
+	if e != nil {
+		err = errors.New("GetMorningMeetingReviewById, Err: " + e.Error())
+		return
+	}
+
+	keyword1 = admin.RealName
+	keyword2 = "--"
+	keyword3 = time.Now().Format(utils.FormatDateTime)
+	keyword4 = "提交了晨会点评待审核"
+
+	configCode := "cygx_morning_meeting_mobile"
+	detailConfig, e := models.GetConfigByCode(configCode)
+	if e != nil {
+		err = errors.New("GetConfigByCode, Err: " + e.Error())
+		return
+	}
+
+	mobile := detailConfig.ConfigValue
+	openIdList, e := models.GetWxOpenIdByMobileList(mobile)
+	if e != nil {
+		err = errors.New("GetWxOpenIdByMobileList, Err: " + e.Error())
+		return
+	}
+	if len(openIdList) == 0 {
+		return
+	}
+
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+	redirectUrl := ""
+
+	redirectUrl = utils.WX_MSG_PATH_MORNING_MEETING_LOG_DETAIL + strconv.Itoa(logId)
+	if utils.RunMode != "release" {
+		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.WxMsgTemplateIdAskMsgXzs
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	sendInfo.Resource = strconv.Itoa(meetingId)
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
+	sendInfo.OpenIdArr = openIdArr
+	err = PublicSendTemplateMsg(sendInfo)
+	if err != nil {
+		return
+	}
 	return
 }

+ 158 - 0
services/resource_data.go

@@ -1122,3 +1122,161 @@ func UpdateFICCReportResourceData(sourceId int, listFiccSet *ficc_report.GetRepo
 	}
 	return
 }
+
+// 更新晨会精华 (跟踪点评)
+func UpdateMeetingreviewchaptResourceData(sourceId int) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println("err:", err)
+			go utils.SendAlarmMsg("更新产品内测 失败,UpdateMeetingreviewchaptResourceData Err:"+err.Error()+"资源ID"+strconv.Itoa(sourceId), 3)
+		}
+	}()
+	var source = utils.CYGX_OBJ_MEETINGREVIEWCHAPT
+	total, e := models.GetCygxMorningMeetingReviewChapterCount(sourceId)
+	if e != nil {
+		err = errors.New("GetCygxReportSelection, Err: " + e.Error())
+		return
+	}
+
+	//如果取消发布了就做删除处理
+	if total == 0 {
+		e = models.DeleteResourceData(sourceId, source)
+		if e != nil {
+			err = errors.New("DeleteResourceData, Err: " + e.Error())
+			return
+		}
+		//删除 cygx_resource_data 表关联的产业ID,标的ID
+		e = models.DeleteCygxResourceDataGroup(sourceId, source)
+		if e != nil {
+			err = errors.New("DeleteCygxResourceDataGroup, Err: " + e.Error())
+			return
+		}
+	} else {
+		//判断是否存在,如果不存在就新增,存在就更新
+		totalData, e := models.GetCygxReportSelectionBySourceAndId(sourceId, source)
+		if e != nil {
+			err = errors.New("GetCygxReportSelectionBySourceAndId, Err: " + e.Error())
+			return
+		}
+		detail, e := models.GetCygxMorningMeetingReviewChapterDetail(sourceId)
+		if e != nil {
+			err = errors.New("GetCygxMorningMeetingReviewChapterDetail" + e.Error())
+			return
+		}
+		var resourceDataId int
+		publishDate := time.Now().Format(utils.FormatDateTime)
+		item := new(models.CygxResourceData)
+
+		var industrialName string
+		var subjectName string
+		//建立首页资源表,与产业的关系
+		var condition string
+		var pars []interface{}
+		condition = " AND industrial_management_id = ? "
+		pars = append(pars, detail.IndustryId)
+		//建立首页资源表,与产业的关系
+		industrialList, e := models.GetTopOneMonthArtReadNumIndustryAll(condition, pars)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			err = errors.New("GetTopOneMonthArtReadNumIndustryAll, Err: " + e.Error() + "sourceId:" + strconv.Itoa(sourceId))
+			return
+		}
+
+		for _, v := range industrialList {
+			industrialName += v.IndustryName
+		}
+
+		if detail.IndustrialSubjectIds != "" {
+			condition = ""
+			pars = make([]interface{}, 0)
+			condition = " AND industrial_subject_id  IN (" + detail.IndustrialSubjectIds + ") "
+			//建立首页资源表,与标的 的关系
+			subjectList, e := models.GetCygxIndustrialSubjectListCondition(condition, pars)
+			if e != nil && e.Error() != utils.ErrNoRow() {
+				err = errors.New("GetCygxIndustrialSubjectListCondition, Err: " + e.Error() + "sourceId:" + strconv.Itoa(sourceId))
+				return
+			}
+			for _, v := range subjectList {
+				subjectName += v.SubjectName
+			}
+		}
+
+		item.SourceId = sourceId
+		item.Source = source
+		item.SearchTag = "晨会精华"
+		item.PublishDate = publishDate
+		item.ChartPermissionId = detail.ChartPermissionId
+		item.CreateTime = time.Now()
+		item.SearchTitle = industrialName + subjectName + "晨会精华"
+		content, e := utils.GetHtmlContentText(detail.Content)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			err = errors.New("GetHtmlContentText, Err: " + e.Error() + "sourceId:" + strconv.Itoa(sourceId))
+			return
+		}
+		item.SearchContent = content
+		item.SearchOrderTime = detail.MeetingTime.Format(utils.FormatDateTime)
+		if totalData == 0 {
+			newId, e := models.AddCygxResourceData(item)
+			if e != nil {
+				err = errors.New("AddCygxResourceData, Err: " + e.Error())
+				return
+			}
+			resourceDataId = int(newId)
+		} else {
+			e = models.UpdateResourceDataByItem(item)
+			if e != nil {
+				err = errors.New("UpdateResourceData, Err: " + e.Error())
+				return
+			}
+			sourceDetail, e := models.GetCygxResourceDataByIdAndSource(sourceId, source)
+			if e != nil {
+				err = errors.New("UpdateResourceData, Err: " + e.Error())
+				return
+			}
+			resourceDataId = sourceDetail.Id
+		}
+
+		var industrialItems []*models.CygxResourceDataIndustrialGroupManagement
+		for _, v := range industrialList {
+			var industrialItem = new(models.CygxResourceDataIndustrialGroupManagement)
+			industrialItem.SourceId = sourceId
+			industrialItem.Source = source
+			industrialItem.IndustrialManagementId = v.IndustrialManagementId
+			industrialItem.ResourceDataId = resourceDataId
+			industrialItem.CreateTime = time.Now()
+			industrialItems = append(industrialItems, industrialItem)
+		}
+		//return
+		var subjectItems []*models.CygxResourceDataIndustrialGroupSubject
+		//晨会精华如果关联的标的就做查询
+		if detail.IndustrialSubjectIds != "" {
+			condition = ""
+			pars = make([]interface{}, 0)
+			condition = " AND industrial_subject_id  IN (" + detail.IndustrialSubjectIds + ") "
+			//建立首页资源表,与标的 的关系
+			subjectList, e := models.GetCygxIndustrialSubjectListCondition(condition, pars)
+			if e != nil && e.Error() != utils.ErrNoRow() {
+				err = errors.New("GetCygxIndustrialSubjectListCondition, Err: " + e.Error() + "sourceId:" + strconv.Itoa(sourceId))
+				return
+			}
+			for _, v := range subjectList {
+				var subjectItem = new(models.CygxResourceDataIndustrialGroupSubject)
+				subjectItem.SourceId = sourceId
+				subjectItem.Source = source
+				subjectItem.IndustrialSubjectId = v.IndustrialSubjectId
+				subjectItem.ResourceDataId = resourceDataId
+				subjectItem.CreateTime = time.Now()
+				subjectItems = append(subjectItems, subjectItem)
+			}
+		}
+
+		//插入关联信息
+		e = models.AddCygxResourceDataGroup(sourceId, source, industrialItems, subjectItems)
+		if e != nil {
+			err = errors.New("AddCygxResourceDataGroup, Err: " + e.Error())
+			return
+		}
+
+	}
+	return
+}

+ 86 - 0
services/wx_template_msg.go

@@ -10,6 +10,7 @@ import (
 	"io/ioutil"
 	"net/http"
 	"strconv"
+	"strings"
 	"time"
 )
 
@@ -757,3 +758,88 @@ func SendWxMsgWithMicroRoadshowAsk(req models.AddVideoCommnetReq, user *models.W
 	}
 	return
 }
+
+func SendWxMsgWithCygxMorningMeeting(meetingId, industryId int, industryName string) (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			fmt.Println("err:", err)
+			go utils.SendAlarmMsg("查研观向推送晨会点评模板消息失败,Err:"+err.Error()+";msg:"+msg, 3)
+			utils.FileLog.Info(fmt.Sprintf("发送模版消息失败,Err:%s,%s", err.Error(), msg))
+		}
+		if msg != "" {
+			utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
+		}
+	}()
+
+	reviewInfo, e := models.GetMorningMeetingReviewById(meetingId)
+	if e != nil {
+		err = errors.New("GetMorningMeetingReviewById Err: " + e.Error())
+		return
+	}
+
+	chapter, e := models.GetCygxMorningMeetingReviewsListByIdAndIndustryId(meetingId, industryId)
+	if e != nil {
+		err = errors.New("GetCygxMorningMeetingReviewsListByIdAndIndustryId Err: " + e.Error())
+		return
+	}
+
+	meetingTime := reviewInfo.MeetingTime.Format(utils.FormatDate)
+	openIdList, e := models.GetCygxUserIndustryFllowOpneid(industryId)
+	if e != nil {
+		err = errors.New("GetCygxUserIndustryFllowOpneid Err: " + e.Error())
+		return
+	}
+
+	listUser, e := models.GetWxUserListByCompanyId(utils.JMCJ_COMPANY_ID)
+	if e != nil {
+		err = errors.New("GetWxUserListByCompanyId Err: " + e.Error())
+		return
+	}
+
+	var mobileArr []string
+	for _, v := range listUser {
+		mobileArr = append(mobileArr, v.Mobile)
+	}
+	openIdListJmcj, e := models.GetUserRecordListByMobileArr(mobileArr)
+	if e != nil {
+		err = errors.New("GetUserRecordListByMobileArr" + e.Error())
+		return
+	}
+	mapOpneiIdJmcj := make(map[string]bool)
+	for _, v := range openIdListJmcj {
+		mapOpneiIdJmcj[v.OpenId] = true
+	}
+	var openIdArr []string
+	for _, v := range openIdList {
+		if !mapOpneiIdJmcj[v.OpenId] {
+			openIdArr = append(openIdArr, v.OpenId)
+		}
+	}
+
+	//保留回撤,去掉空行
+	content := strings.Replace(chapter.Content, "<br></p>", "", -1)
+	content = strings.Replace(content, "</p>", "\n", -1)
+	content, err = utils.GetReportContentTextSub(content)
+	if err != nil {
+		err = errors.New("获取晨会点评章节文本失败, Err: " + err.Error())
+		return
+	}
+	sendInfo := new(SendWxTemplate)
+	sendInfo.Keyword1 = "【" + industryName + "】产业,有新的跟踪点评"
+	sendInfo.Keyword2 = content
+	sendInfo.Keyword3 = meetingTime
+	sendInfo.Remark = "点击进入小程序对应的产业资源包页面"
+	if utils.RunMode == "release" {
+		sendInfo.TemplateId = utils.TemplateIdByProductXzs
+	} else {
+		sendInfo.TemplateId = utils.TemplateIdByProductXzs
+	}
+	sendInfo.RedirectUrl = utils.WX_MSG_PATH_INDUSTRY_DETAIL + strconv.Itoa(industryId) + "&IsSendWx=1&ChapterId=" + strconv.Itoa(chapter.Id)
+	sendInfo.RedirectTarget = 3
+	sendInfo.Resource = strconv.Itoa(industryId)
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_MORNING_MEETING
+	sendInfo.OpenIdArr = openIdArr
+	err = PublicSendTemplateMsg(sendInfo)
+	return
+}

+ 15 - 0
utils/common.go

@@ -1083,3 +1083,18 @@ func GetSignFiccYbEtaHub(nonce, timestamp string) (sign string) {
 	sign = HmacSha256ToBase64(FiccYbEtaHubSecret, signStr)
 	return
 }
+
+func GetReportContentTextSub(content string) (contentSub string, err error) {
+	content = html.UnescapeString(content)
+	doc, err := goquery.NewDocumentFromReader(strings.NewReader(content))
+	docText := doc.Text()
+	bodyRune := []rune(docText)
+	bodyRuneLen := len(bodyRune)
+	if bodyRuneLen > 200 {
+		bodyRuneLen = 200
+	}
+	body := string(bodyRune[:bodyRuneLen])
+	contentSub = body
+	contentSub = strings.Replace(body, "Powered by Froala Editor", "", -1)
+	return
+}

+ 30 - 28
utils/constants.go

@@ -72,10 +72,11 @@ const (
 
 // 模板消息推送类型
 const (
-	TEMPLATE_MSG_CYGX_ACTIVITY_ADD = 12 //查研观向小程序活动更新推送 12
-	TEMPLATE_MSG_CYGX_ARTICLE_ADD  = 13 //查研观向报告更新推送  13
-	TEMPLATE_MSG_CYGX_APPLY        = 14 //查研观向审批通知
-	TEMPLATE_MSG_CYGX_COMMENT      = 15 //查研观向留言通知
+	TEMPLATE_MSG_CYGX_ACTIVITY_ADD    = 12 //查研观向小程序活动更新推送 12
+	TEMPLATE_MSG_CYGX_ARTICLE_ADD     = 13 //查研观向报告更新推送  13
+	TEMPLATE_MSG_CYGX_APPLY           = 14 //查研观向审批通知
+	TEMPLATE_MSG_CYGX_COMMENT         = 15 //查研观向留言通知
+	TEMPLATE_MSG_CYGX_MORNING_MEETING = 19 //查研观向晨会点评 19
 )
 
 const (
@@ -182,30 +183,31 @@ const (
 
 // 模板消息地址路由
 const (
-	WX_MSG_PATH_ARTICLE_DETAIL           = "pageMy/reportDetail/reportDetail?id="                         //文章详情模板消息地址
-	WX_MSG_PATH_ACTIVITY_DETAIL          = "activityPages/activityDetail/activityDetail?id="              //活动模板消息地址
-	WX_MSG_PATH_ACTIVITY_SPECIAL_DETAIL  = "activityPages/specialDetail/specialDetail?id="                //专项调研活动模板消息地址
-	WX_MSG_PATH_ACTIVITY_INDUSTRYR_EPORT = "reportPages/IndustryReport/IndustryReport?id="                //产业文章列表模板消息地址
-	WX_MSG_PATH_ABOUT_US                 = "pageMy/followUs/followUs"                                     //关于我们页面路径
-	WX_MSG_PATH_AUTHOR_DETAIL            = "reportPages/authorPages/authorPages?id="                      //作者详情模板消息地址
-	WX_MSG_PATH_INDUSTRY_DETAIL          = "reportPages/IndustryReport/IndustryReport?id="                //产业详情模板消息地址
-	WX_MSG_PATH_PRODUCTINTERIOR_DETAIL   = "reportPages/internalDetials/internalDetials?id="              //产品内测详情模板消息地址
-	WX_MSG_PATH_THIS_WEEK_DETAIL         = "reportPages/reportSecretDetail/reportSecretDetail?type=2&id=" //本周研究汇总详情模板消息地址
-	WX_MSG_PATH_LAST_WEEK_DETAIL         = "reportPages/reportSecretDetail/reportSecretDetail?type=3&id=" //上周纪要汇总详情模板消息地址
-	WX_MSG_PATH_KEY_COMPANY_DETAIL       = "reportPages/keyCompany/keyCompany?id="                        //重点公司详情模板消息地址
-	WX_MSG_PATH_RESEARCHTHEME_DETAIL     = "reportPages/researchTheme/researchTheme?id="                  //主题详情模板消息地址
-	WX_MSG_PATH_ACTIVITY_SIGN            = "pages-message/activityTemplate/activityTemplate?id="          //活动模板消息地址
-	WX_MSG_PATH_APPLY_DETAIL             = "pages-message/applyFor/applyFor?id="                          //潜在用户试用权限申请
-	WX_MSG_PATH_YX_SURVEY_DETAIL         = "pages-purchaser/survey/surveyDetail?surveyId="                //用户提交研选调研需求
-	WX_MSG_PATH_APPLY_COLLECTION_DETAIL  = "reportPages/bulletinDetail/bulletinDetail?id="                //精选看板申请详情页
-	WX_MSG_PATH_YX_SPECIAL_DETAIL        = "pages-purchaser/noteAndViewpoint/noteAndViewpoint?id="        //研选专栏详情
-	WX_MSG_PATH_YX_SPECIAL_ENABLE_DETAIL = "pages-purchaser/toExamine/toExamine?isMessage=模板&id="         //研选专栏审核详情页面
-	WX_MSG_PATH_YX_SPECIAL_CENTER        = "pages-purchaser/contentAllPage/contentAllPage?Status=4"       //研选专栏内容中心
-	WX_MSG_PATH_YX_COMMENT_DETAIL        = "pages-activity/generationAsk/generationAsk?id="               //研选报告留言详情
-	WX_MSG_PATH_YX_ACTIVITY_DETAIL       = "pages-activity/activityDetail/activityDetail?IsSendWx=1&id="  //研选活动详情
-	WX_MSG_PATH_YX_SIGNUP_DETAIL         = "pages-message/activityTemplate/activityTemplate?id="          //研选报名详情
-	WX_MSG_PATH_YX_ARTICLE_DETAIL        = "pages-user/reportDetail/reportDetail?IsSendWx=1&id="          //研选纪要详情
-	WX_MSG_PATH_FICC_REPORT_DETAIL       = "pages-ficc/reportDetail/reportDetail?id="                     //FICC研报详情
+	WX_MSG_PATH_ARTICLE_DETAIL             = "pageMy/reportDetail/reportDetail?id="                         //文章详情模板消息地址
+	WX_MSG_PATH_ACTIVITY_DETAIL            = "activityPages/activityDetail/activityDetail?id="              //活动模板消息地址
+	WX_MSG_PATH_ACTIVITY_SPECIAL_DETAIL    = "activityPages/specialDetail/specialDetail?id="                //专项调研活动模板消息地址
+	WX_MSG_PATH_ACTIVITY_INDUSTRYR_EPORT   = "reportPages/IndustryReport/IndustryReport?id="                //产业文章列表模板消息地址
+	WX_MSG_PATH_ABOUT_US                   = "pageMy/followUs/followUs"                                     //关于我们页面路径
+	WX_MSG_PATH_AUTHOR_DETAIL              = "reportPages/authorPages/authorPages?id="                      //作者详情模板消息地址
+	WX_MSG_PATH_INDUSTRY_DETAIL            = "reportPages/IndustryReport/IndustryReport?id="                //产业详情模板消息地址
+	WX_MSG_PATH_PRODUCTINTERIOR_DETAIL     = "reportPages/internalDetials/internalDetials?id="              //产品内测详情模板消息地址
+	WX_MSG_PATH_THIS_WEEK_DETAIL           = "reportPages/reportSecretDetail/reportSecretDetail?type=2&id=" //本周研究汇总详情模板消息地址
+	WX_MSG_PATH_LAST_WEEK_DETAIL           = "reportPages/reportSecretDetail/reportSecretDetail?type=3&id=" //上周纪要汇总详情模板消息地址
+	WX_MSG_PATH_KEY_COMPANY_DETAIL         = "reportPages/keyCompany/keyCompany?id="                        //重点公司详情模板消息地址
+	WX_MSG_PATH_RESEARCHTHEME_DETAIL       = "reportPages/researchTheme/researchTheme?id="                  //主题详情模板消息地址
+	WX_MSG_PATH_ACTIVITY_SIGN              = "pages-message/activityTemplate/activityTemplate?id="          //活动模板消息地址
+	WX_MSG_PATH_APPLY_DETAIL               = "pages-message/applyFor/applyFor?id="                          //潜在用户试用权限申请
+	WX_MSG_PATH_YX_SURVEY_DETAIL           = "pages-purchaser/survey/surveyDetail?surveyId="                //用户提交研选调研需求
+	WX_MSG_PATH_APPLY_COLLECTION_DETAIL    = "reportPages/bulletinDetail/bulletinDetail?id="                //精选看板申请详情页
+	WX_MSG_PATH_YX_SPECIAL_DETAIL          = "pages-purchaser/noteAndViewpoint/noteAndViewpoint?id="        //研选专栏详情
+	WX_MSG_PATH_YX_SPECIAL_ENABLE_DETAIL   = "pages-purchaser/toExamine/toExamine?isMessage=模板&id="         //研选专栏审核详情页面
+	WX_MSG_PATH_YX_SPECIAL_CENTER          = "pages-purchaser/contentAllPage/contentAllPage?Status=4"       //研选专栏内容中心
+	WX_MSG_PATH_YX_COMMENT_DETAIL          = "pages-activity/generationAsk/generationAsk?id="               //研选报告留言详情
+	WX_MSG_PATH_YX_ACTIVITY_DETAIL         = "pages-activity/activityDetail/activityDetail?IsSendWx=1&id="  //研选活动详情
+	WX_MSG_PATH_YX_SIGNUP_DETAIL           = "pages-message/activityTemplate/activityTemplate?id="          //研选报名详情
+	WX_MSG_PATH_YX_ARTICLE_DETAIL          = "pages-user/reportDetail/reportDetail?IsSendWx=1&id="          //研选纪要详情
+	WX_MSG_PATH_FICC_REPORT_DETAIL         = "pages-ficc/reportDetail/reportDetail?id="                     //FICC研报详情
+	WX_MSG_PATH_MORNING_MEETING_LOG_DETAIL = "pages-meeting/toExamine/toExamine?LogId="                     //晨会精华模板消息日志跳转详情
 )
 
 //2:文章详情  https://web.hzinsights.com/material/info/8436  小程序路径:/pageMy/reportDetail/reportDetail?id=