Ver código fonte

报告自动归类,并发送对应的模板消息

xingzai 2 anos atrás
pai
commit
2db477f980

+ 68 - 0
models/industrial_management.go

@@ -1,9 +1,11 @@
 package models
 
 import (
+	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 	"hongze/hongze_cygx/utils"
 	"strconv"
+	"strings"
 	"time"
 )
 
@@ -378,3 +380,69 @@ func GetIndustrialManagementNewList(permissionName string) (items []*IndustrialM
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
+
+//获取产业关联标的列表
+func GetIndustrialManagementForSubjecName(subjectName string) (items []*IndustrialSubject, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT s.subject_name,s.industrial_subject_id,m.industrial_management_id,m.industry_name
+			FROM cygx_industrial_subject as s 
+			INNER JOIN cygx_industrial_management as m ON m.industrial_management_id = s.industrial_management_id
+			WHERE subject_name IN (` + subjectName + `)`
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+//报告分类的新增与修改
+func ReportArticleClassificationEditNew(reportId int, industrialManagementIdStr string, articleId int, ndustrialSubjectIdStr string) (err error) {
+	to, err := orm.NewOrm().Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		fmt.Println(err)
+		if err == nil {
+			to.Commit()
+		} else {
+			to.Rollback()
+		}
+	}()
+	//修改文章是否过滤字段
+	sql := `UPDATE cygx_article SET is_filter=0,  is_class=1 WHERE id=? `
+	_, err = to.Raw(sql, reportId).Exec()
+	if err != nil {
+		return
+	}
+	//删除文章关联标的
+	sql = `	DELETE FROM cygx_industrial_article_group_subject WHERE cygx_article_id = ?`
+	_, err = to.Raw(sql, reportId).Exec()
+	if err != nil {
+		return
+	}
+	//添加文章关联标的
+	if ndustrialSubjectIdStr != "0" && ndustrialSubjectIdStr != "" {
+		strList := strings.Split(ndustrialSubjectIdStr, ",")
+		for _, v := range strList {
+			sql := `INSERT INTO cygx_industrial_article_group_subject ( cygx_article_id, article_id, industrial_subject_id, create_time ) VALUES ( ?, ?, ?, ? )`
+			_, err = to.Raw(sql, reportId, articleId, v, time.Now()).Exec()
+			if err != nil {
+				return
+			}
+		}
+	}
+	//删除文章关联行业 (避免截断表时产生的脏数据,故不用update而是先删除再增加)
+	sql = `	DELETE FROM cygx_industrial_article_group_management WHERE cygx_article_id = ?`
+	_, err = to.Raw(sql, reportId).Exec()
+	if err != nil {
+		return
+	}
+	//添加文章关联行业
+	industrialStrList := strings.Split(industrialManagementIdStr, ",")
+	for _, v := range industrialStrList {
+		sql = `	INSERT INTO cygx_industrial_article_group_management ( cygx_article_id, article_id, industrial_management_id, create_time ) VALUES ( ?, ?, ?, ? )`
+		_, err = to.Raw(sql, reportId, articleId, v, time.Now()).Exec()
+		if err != nil {
+			return
+		}
+	}
+	return
+}

+ 1 - 0
models/report.go

@@ -38,6 +38,7 @@ type IndustrialSubject struct {
 	IndustrialSubjectId    int    `orm:"column(industrial_subject_id);pk" description:"标的id"`
 	IndustrialManagementId int    `description:"产业id"`
 	SubjectName            string `description:"标的名称"`
+	IndustryName           string `description:"产业名称"`
 }
 
 //获取产业报告数量

+ 15 - 0
models/user_record.go

@@ -124,3 +124,18 @@ func GetUserThirdRecordByUserId(userId int) (item *UserRecord, err error) {
 	err = orm.NewOrm().Raw(sql, userId).QueryRow(&item)
 	return
 }
+
+//根据手机号获取用户的openid
+func GetUserRecordListByMobile(platform int, bindAccount string) (items []*OpenIdList, err error) {
+	var sql string
+	if utils.RunMode == "release" {
+		sql = `SELECT cr.open_id FROM user_record  as u 
+			INNER JOIN cygx_user_record AS cr ON cr.union_id = u.union_id 
+			WHERE create_platform=? AND bind_account IN (` + bindAccount + `)`
+	} else {
+		platform = 1
+		sql = `SELECT open_id FROM	user_record  WHERE create_platform =? AND bind_account IN (` + bindAccount + `)`
+	}
+	_, err = orm.NewOrm().Raw(sql, platform).QueryRows(&items)
+	return
+}

+ 76 - 3
services/article.go

@@ -308,10 +308,10 @@ func GetArticleListByApi(cont context.Context) (err error) {
 			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "GetArticleListByApi ErrMsg:"+err.Error(), utils.EmailSendToUsers)
 		}
 	}()
-	url := "https://vmp.hzinsights.com/v2api/articles/mp?take=100&skip=0&publish_status=2,4&order=publish_date&sort=DESC"
+	requestUrl := "https://vmp.hzinsights.com/v2api/articles/mp?take=100&skip=0&publish_status=2,4&order=publish_date&sort=DESC"
 	method := "GET"
 	client := &nhttp.Client{}
-	req, err := nhttp.NewRequest(method, url, nil)
+	req, err := nhttp.NewRequest(method, requestUrl, nil)
 	if err != nil {
 		fmt.Println("GetListApi Err:", err.Error())
 		return err
@@ -343,6 +343,12 @@ func GetArticleListByApi(cont context.Context) (err error) {
 		fmt.Println("GetlistMap Err:", err.Error())
 		return err
 	}
+	openIdList, err := models.GetUserRecordListByMobile(4, utils.ArticleTaskClassMobile)
+	if err != nil {
+		fmt.Println(err)
+		return err
+	}
+	fmt.Println(openIdList)
 	//新旧分类 反向隐射,是否归类,是否是报告,是否是纪要库
 	for _, v := range listMap {
 		exitMap[v.Id] = v.OldId
@@ -580,11 +586,78 @@ func GetArticleListByApi(cont context.Context) (err error) {
 			item.MatchTypeName = matchTypeName
 			item.Stock = v.Stock
 			item.FieldName = v.FieldName
-			_, err = models.AddCygxArticles(item)
+			newId, err := models.AddCygxArticles(item)
 			if err != nil {
 				fmt.Println("AddCygxArticle Err:", err.Error())
 				return err
 			}
+			if v.ReportType == 2 {
+				var subjectStr string
+				var industrialManagementIdStr string
+				var industrialSubjectIdStr string
+				var keyword1 string
+				var keyword2 string
+				var keyword3 string
+				var keyword4 string
+				sliceSubjects := strings.Split(v.Stock, "/")
+				mapManagementForSubject := make(map[string]string)
+				if len(sliceSubjects) > 0 {
+					for _, vSubject := range sliceSubjects {
+						sliceKuohao := strings.Split(vSubject, "(")           //过滤括号
+						sliceXiahuaxian := strings.Split(sliceKuohao[0], "-") //过滤下划线
+						subject := sliceXiahuaxian[0]
+						subjectStr += "'" + subject + "',"
+					}
+					subjectStr = strings.TrimRight(subjectStr, ",")
+					if subjectStr != "" {
+						listIndustrial, err := models.GetIndustrialManagementForSubjecName(subjectStr)
+						if err != nil {
+							fmt.Println("AddCygxArticle Err:", err.Error())
+							return err
+						}
+						subjectStr = strings.Replace(subjectStr, "','", "】【", -1)
+						subjectStr = strings.Replace(subjectStr, "'", "", -1)
+						subjectStr = "【" + subjectStr + "】"
+						if len(listIndustrial) > 0 {
+							for _, vIndustrial := range listIndustrial {
+								industrialManagementIdStr += strconv.Itoa(vIndustrial.IndustrialManagementId) + ","
+								industrialSubjectIdStr += strconv.Itoa(vIndustrial.IndustrialSubjectId) + ","
+								mapManagementForSubject[vIndustrial.IndustryName] += vIndustrial.SubjectName + "/"
+							}
+							industrialManagementIdStr = strings.TrimRight(industrialManagementIdStr, ",")
+							industrialSubjectIdStr = strings.TrimRight(industrialSubjectIdStr, ",")
+							if industrialManagementIdStr != "" {
+								err = models.ReportArticleClassificationEditNew(int(newId), industrialManagementIdStr, v.ArticleId, industrialSubjectIdStr)
+								if err != nil {
+									fmt.Println("ReportArticleClassificationEditNew Err:", err.Error())
+									//keyword1 = "新报告产业标签:【" + v.FieldName + "】,个股标签:" + subjectStr
+									//keyword2 = "归类失败"
+									//keyword3 = v.Title
+									//keyword4 = v.PublishDate.Format(utils.FormatDateTime)
+									//SendWxMsgWithArticleClassToAdmin(keyword1, keyword2, keyword3, keyword4, openIdList, articleIdInt)
+									return err
+								}
+							}
+
+							var peoductName string
+							for mk, mv := range mapManagementForSubject {
+								peoductName += "【" + mk + "--" + strings.TrimRight(mv, "/") + "】"
+							}
+							keyword1 = "新报告产业标签:【" + v.FieldName + "】,个股标签:" + subjectStr
+							keyword2 = "已自动关联至以下产业和标的:" + peoductName
+							keyword3 = v.Title
+							keyword4 = v.PublishDate.Format(utils.FormatDateTime)
+							SendWxMsgWithArticleClassToAdmin(keyword1, keyword2, keyword3, keyword4, openIdList, articleIdInt)
+						} else {
+							keyword1 = "新报告产业标签:【" + v.FieldName + "】,个股标签:" + subjectStr
+							keyword2 = "未归类"
+							keyword3 = v.Title
+							keyword4 = v.PublishDate.Format(utils.FormatDateTime)
+							SendWxMsgWithArticleClassToAdmin(keyword1, keyword2, keyword3, keyword4, openIdList, articleIdInt)
+						}
+					}
+				}
+			}
 		}
 	}
 	return

+ 0 - 15
services/send_company_user.go

@@ -54,8 +54,6 @@ func SendComapnyToShanghai(url, jsonCompany, postType string) (err error) {
 		}
 	}()
 	method := "POST"
-	//fmt.Println(string(jsonCompany))
-	//utils.FileLog.Info(string(jsonCompany))
 	payload := strings.NewReader(jsonCompany)
 	client := &http.Client{}
 	req, err := http.NewRequest(method, url, payload)
@@ -82,9 +80,6 @@ func SendComapnyToShanghai(url, jsonCompany, postType string) (err error) {
 		return err
 
 	}
-	//if result.Code != 1 {
-	//	go utils.SendEmail("同步策略平台信息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), url, utils.EmailSendToExpert)
-	//}
 	item := new(models.CygxShanghaiCompanyLog)
 	item.CreateTime = time.Now()
 	item.Url = url
@@ -92,10 +87,6 @@ func SendComapnyToShanghai(url, jsonCompany, postType string) (err error) {
 	item.Result = string(body)
 	go models.AddCygxShanghaiCompanyLog(item)
 
-	//if strings.Index(string(body), "必填") > 0 || strings.Index(string(body), "失败") > 0 || strings.Index(string(body), "社会信用代码格式错误") > 0 {
-	//	go utils.SendEmail("同步策略平台信息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), string(body), utils.EmailSendToExpert)
-	//}
-	//var companyCode string
 	for _, v := range result.Data.FailInfo {
 		if v.ErrMsg != "" {
 			//companyCode += "'" + v.ErrVal + "',"
@@ -108,12 +99,6 @@ func SendComapnyToShanghai(url, jsonCompany, postType string) (err error) {
 		}
 	}
 	return
-	//给产品导数据用,别删
-	//companyCode = postType + companyCode
-	////fmt.Println(result.Data.FailInfo)
-	//utils.FileLog.Info(string(companyCode))
-	//utils.FileLog.Info(string(body))
-	//fmt.Println(string(body))
 }
 
 func DotongbuShangHai(cont context.Context) (err error) {

+ 4 - 1
services/task.go

@@ -68,7 +68,10 @@ func Task() {
 
 		sendEmailFileForAskMsg := task.NewTask("sendEmailFileForAskMsg", "0 */5 8-22 * * *", SendEmailFileForAskMsg) //非研选系列专家电话会,根据主持人姓名,会前15分钟将问题列表发送给至该主持人对应邮箱
 		task.AddTask("sendEmailFileForAskMsg", sendEmailFileForAskMsg)
-
+	}
+	if utils.RunMode != "release" {
+		getArticleListByApi := task.NewTask("getArticleListByApi", "0 */60 * * * *", GetArticleListByApi) //通过三方接口获取策略平台上的文章
+		task.AddTask("getArticleListByApi", getArticleListByApi)
 	}
 
 	//ActivityAttendanceDetail()

+ 42 - 0
services/wx_template_msg.go

@@ -176,6 +176,48 @@ func SendWxMsgWithCompanyRemind(first, keyword1, keyword2, remark string, openId
 	return
 }
 
+//发送报告提问消息提醒
+func SendWxMsgWithArticleClassToAdmin(keyWord1, keyWord2, keyWord3, keyWord4 string, openIdList []*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)
+			utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
+		}
+		fmt.Println("line 21", err, msg)
+	}()
+	accessToken, err := models.GetWxAccessTokenByXzs()
+	if err != nil {
+		msg = "GetWxAccessToken Err:" + err.Error()
+		return
+	}
+	if accessToken == "" {
+		msg = "accessToken is empty"
+		return
+	}
+	var first string
+	first = keyWord1
+	keyword1 := keyWord2
+	keyword2 := keyWord3
+	keyword3 := keyWord4
+	keyword4 := ""
+
+	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"}
+	sendMap["data"] = sendData
+	WxSendTemplateMsg(sendUrl, sendMap, openIdList)
+	return
+}
+
 //弘则投资:
 //Y59n_AHg-RLCKaz293geW76KDHpGL1qOnE7eF_lxelY  活动预约通知
 //CB7bOl7f3viMG4s1uhRo7WM0Jbx3WvodKuIZ8A_z8fM  项目状态变更通知

+ 6 - 0
utils/config.go

@@ -39,6 +39,7 @@ var (
 	WxMsgTemplateIdAskMsgXzs        string //手机号用户【XXX】发送模板消息模板ID(小助手)
 	WxMsgTemplateIdAskMsgMobile     string //手机号用户【XXX】发送模板消息
 	WxMsgTemplateIdAskMsgMobileAll  string //手机号用户【XXX】发送模板消rm -
+	TemplateIdByProductXzs          string //产品运行报告通知-模板ID(小助手)
 )
 
 //微信公众号配置信息
@@ -68,6 +69,7 @@ var (
 	HtgjName                  string //海通国际名称
 	ActSendMsgMobile          string //活动带问发送模板消息接收者的手机号
 	StrategyPlatform          string //策略品台跳转链接地址
+	ArticleTaskClassMobile    string //策略平台报告自动归类消息通知对象
 )
 
 func init() {
@@ -142,6 +144,7 @@ func init() {
 		WxMsgTemplateIdAskMsg = "PaoDanHGlt1kFw5q-4_ipJSwO3FyZpxSSNg4rwB7YCk"
 		WxMsgTemplateIdAskMsgMobile = ""
 		ActSendMsgMobile = "15618524605"
+		ArticleTaskClassMobile = "15557270714,18767183922"
 
 	} else {
 		WxAppId = "wxcc32b61f96720d2f"
@@ -170,6 +173,7 @@ func init() {
 		WxMsgTemplateIdAskMsg = "qfNuops-sKrfIkbA7U97A7gSrX03mUpoEpJksRUdloo"
 		WxMsgTemplateIdAskMsgMobile = "15557270714,17634786714,18767183922,17516315016"
 		ActSendMsgMobile = "17634786714"
+		ArticleTaskClassMobile = "15557270714,18767183922,13253777798"
 	}
 
 	//查研观向小助手
@@ -181,6 +185,7 @@ func init() {
 		WxMsgTemplateIdAskMsgXzs = "qfNuops-sKrfIkbA7U97A7gSrX03mUpoEpJksRUdloo"        //手机号用户【XXX】发送模板消息模板ID(小助手)
 		WxMsgTemplateIdApplyXzs = "qfNuops-sKrfIkbA7U97A7gSrX03mUpoEpJksRUdloo"         //申请待处理(小助手)
 		WxMsgTemplateIdApplyCancelXzs = "UU_d7ks0XZBnWg2xFzxL9Heilm4kisX39K7dr4SDdO8"   ////预约取消提醒(小助手)
+		TemplateIdByProductXzs = "-YjuPOB7Fqd-S3ilabYa6wvjDY9aXmeEfPN6DCiy-EY"          //产品运行报告通知-模板ID(小助手)
 	} else {
 		//新的模板ID
 		WxPublicIdXzs = "wxb7cb8a15abad5b8e"                                            //查研观向小助手
@@ -189,6 +194,7 @@ func init() {
 		WxMsgTemplateIdAskMsgXzs = "IpS-yuNNQc8osCoy20jPHNkvBUyKRL1NGn7c0G9xmQA"        //手机号用户【XXX】发送模板消息模板ID(小助手)
 		WxMsgTemplateIdApplyXzs = "IpS-yuNNQc8osCoy20jPHNkvBUyKRL1NGn7c0G9xmQA"         //申请待处理(小助手)
 		WxMsgTemplateIdApplyCancelXzs = "gCSCAWNNhjkzE2V1cjbIV_Ex68R_8LM_u25qDlSKWyM"   ////预约取消提醒(小助手)
+		TemplateIdByProductXzs = "tNcCUiK_uUkuxaFF7M9NP2RwLkw8uHFjG-TDIxGUKxo"          //产品运行报告通知-模板ID(小助手)
 	}
 }