|
@@ -0,0 +1,229 @@
|
|
|
+package services
|
|
|
+
|
|
|
+import (
|
|
|
+ "context"
|
|
|
+ "encoding/json"
|
|
|
+ "errors"
|
|
|
+ "fmt"
|
|
|
+ "github.com/wenzhenxi/gorsa"
|
|
|
+ "hongze/hongze_task/models"
|
|
|
+ "hongze/hongze_task/utils"
|
|
|
+ "io/ioutil"
|
|
|
+ "net/http"
|
|
|
+ "net/url"
|
|
|
+ "time"
|
|
|
+)
|
|
|
+
|
|
|
+//func init() {
|
|
|
+// report, _ := models.GetReportById(836)
|
|
|
+// SendReportToThs(report)
|
|
|
+//}
|
|
|
+
|
|
|
+// SendWaitReport 定时向同花顺推送报告
|
|
|
+func SendWaitReport(cont context.Context) (err error) {
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ //fmt.Println(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "发送消息至同花顺失败 ErrMsg:"+err.Error(), utils.EmailSendToUsers)
|
|
|
+ go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "延时任务发送报告至同花顺失败 ErrMsg:"+err.Error(), utils.EmailSendToUsers)
|
|
|
+ }
|
|
|
+ }()
|
|
|
+ fmt.Println("进来了", time.Now().Format(utils.FormatDateTime))
|
|
|
+ list, err := models.GetWaitReportSendThsDetailList()
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ for _, detail := range list {
|
|
|
+ //先标记为
|
|
|
+ _ = models.ModifyReportSendThsDetailStatus(detail.SendId, 0, "")
|
|
|
+ go SendToThs(detail.SendId, detail.ReportId, detail.ReportType)
|
|
|
+
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+var permissionMap map[string]string = map[string]string{
|
|
|
+ "化里化外日评": "原油,PTA,MEG,织造终端,甲醇,聚烯烃,沥青,橡胶,苯乙烯,玻璃纯碱",
|
|
|
+ "股债日评": "宏观,利率债,原油,PTA,MEG,织造终端,甲醇,聚烯烃,沥青,橡胶,苯乙烯,玻璃纯碱,钢材,铁矿,双焦(焦煤、焦炭),有色(铜、铝),有色(锌、铅),镍+不锈钢",
|
|
|
+ "贵金属复盘": "宏观,利率债,原油,PTA,MEG,织造终端,甲醇,聚烯烃,沥青,橡胶,苯乙烯,玻璃纯碱,钢材,铁矿,双焦(焦煤、焦炭),有色(铜、铝),有色(锌、铅),镍+不锈钢",
|
|
|
+ "每日经济数据备忘录": "宏观,利率债,原油,PTA,MEG,织造终端,甲醇,聚烯烃,沥青,橡胶,苯乙烯,玻璃纯碱,钢材,铁矿,双焦(焦煤、焦炭),有色(铜、铝),有色(锌、铅),镍+不锈钢",
|
|
|
+ "宏观商品复盘": "宏观,利率债,原油,PTA,MEG,织造终端,甲醇,聚烯烃,沥青,橡胶,苯乙烯,玻璃纯碱,钢材,铁矿,双焦(焦煤、焦炭),有色(铜、铝),有色(锌、铅),镍+不锈钢",
|
|
|
+ "知白守黑日评": "钢材,铁矿,双焦(焦煤、焦炭)",
|
|
|
+ "有声有色日度闲篇": "有色(铜、铝),有色(锌、铅),镍+不锈钢",
|
|
|
+ "EIA原油库存点评": "原油",
|
|
|
+ "苯乙烯数据点评": "苯乙烯",
|
|
|
+ "API原油库存点评": "原油",
|
|
|
+ "铁矿航运数据点评": "铁矿",
|
|
|
+ "中观需求点评": "宏观,利率债,原油,PTA,MEG,织造终端,甲醇,聚烯烃,沥青,橡胶,苯乙烯,玻璃纯碱,钢材,铁矿,双焦(焦煤、焦炭),有色(铜、铝),有色(锌、铅),镍+不锈钢",
|
|
|
+ "聚酯数据点评": "PTA,MEG",
|
|
|
+ "钢材周度数据点评": "钢材",
|
|
|
+ "寻根知本": "宏观,利率债,原油,PTA,MEG,织造终端,甲醇,聚烯烃,沥青,橡胶,苯乙烯,玻璃纯碱,钢材,铁矿,双焦(焦煤、焦炭),有色(铜、铝),有色(锌、铅),镍+不锈钢",
|
|
|
+ "国际宏观": "宏观,利率债,原油,PTA,MEG,织造终端,甲醇,聚烯烃,沥青,橡胶,苯乙烯,玻璃纯碱,钢材,铁矿,双焦(焦煤、焦炭),有色(铜、铝),有色(锌、铅),镍+不锈钢",
|
|
|
+ "能化百家谈": "原油,PTA,MEG,织造终端,甲醇,聚烯烃,沥青,橡胶,苯乙烯,玻璃纯碱",
|
|
|
+ "有色百家谈": "有色(铜、铝),有色(锌、铅),镍+不锈钢",
|
|
|
+ "黑色百家谈": "钢材,铁矿,双焦(焦煤、焦炭)",
|
|
|
+}
|
|
|
+
|
|
|
+//同花顺返回信息
|
|
|
+type TshResult struct {
|
|
|
+ ErrorCode int `json:"error" description:"错误状态码"`
|
|
|
+ Message string `json:"message" description:"提示信息"`
|
|
|
+}
|
|
|
+
|
|
|
+func SendToThs(sendDetailId, reportId int, reportType string) (err error) {
|
|
|
+ switch reportType {
|
|
|
+ case "日度点评":
|
|
|
+ tmpErr := SendReportToThs(reportId)
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = tmpErr
|
|
|
+ }
|
|
|
+ default:
|
|
|
+ err = errors.New("异常类型")
|
|
|
+ }
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ _ = models.ModifyReportSendThsDetailStatus(sendDetailId, -1, err.Error())
|
|
|
+ err = nil
|
|
|
+ return
|
|
|
+ }
|
|
|
+ _ = models.ModifyReportSendThsDetailStatus(sendDetailId, 1, "")
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// SendReportToThs 发送报告到同花顺
|
|
|
+func SendReportToThs(reportId int) (err error) {
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ //fmt.Println(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "发送消息至同花顺失败 ErrMsg:"+err.Error(), utils.EmailSendToUsers)
|
|
|
+ go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "发送报告至同花顺失败 ErrMsg:"+err.Error(), utils.EmailSendToUsers)
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ report, tmpErr := models.GetReportById(reportId)
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = tmpErr
|
|
|
+ return
|
|
|
+ }
|
|
|
+ //获取分类信息(标签)
|
|
|
+ permissionName := report.ClassifyNameSecond
|
|
|
+ classifyItem, err := models.GetClassifyById(report.ClassifyIdSecond)
|
|
|
+ if err != nil {
|
|
|
+ err = errors.New(fmt.Sprint("获取分类失败:", permissionName))
|
|
|
+ }
|
|
|
+
|
|
|
+ //获取权限标签名称
|
|
|
+ var permissionStr string
|
|
|
+ if classifyItem != nil {
|
|
|
+ permissionStr = classifyItem.ClassifyLabel
|
|
|
+ if permissionStr == "" {
|
|
|
+ var isOk bool
|
|
|
+ permissionStr, isOk = permissionMap[permissionName]
|
|
|
+ if !isOk {
|
|
|
+ err = errors.New(fmt.Sprint("没有该权限的标签,权限名:", permissionName))
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ var isOk bool
|
|
|
+ permissionStr, isOk = permissionMap[permissionName]
|
|
|
+ if !isOk {
|
|
|
+ err = errors.New(fmt.Sprint("没有该权限的标签,权限名:", permissionName))
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if permissionStr == "" {
|
|
|
+ err = errors.New(fmt.Sprint("没有该权限的标签,权限名:", permissionName))
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ //fmt.Println("sendDetailId:", sendDetailId)
|
|
|
+ stageStr := fmt.Sprintf("%v", report.Stage)
|
|
|
+ createDate, err := time.Parse(utils.FormatDateTime, report.CreateTime)
|
|
|
+ createDateFrom := createDate.Format("0102")
|
|
|
+ title := `【第` + stageStr + `期|FICC】` + report.Title + `(` + createDateFrom + ")"
|
|
|
+
|
|
|
+ // 跳转地址
|
|
|
+ jumpBaseUrl := `http://rddpweb.brilliantstart.cn/reportdtl?id=`
|
|
|
+ //生产环境地址
|
|
|
+ if utils.RunMode == "release" {
|
|
|
+ jumpBaseUrl = `https://ficc.hzinsights.com/reportdtl?id=`
|
|
|
+ }
|
|
|
+ jumpUrl := fmt.Sprint(jumpBaseUrl, report.Id)
|
|
|
+
|
|
|
+ // logo 地址
|
|
|
+ logoUrl := `https://hongze.oss-cn-shanghai.aliyuncs.com/hzyj.png`
|
|
|
+
|
|
|
+ // 简介
|
|
|
+ abstract := report.Abstract
|
|
|
+
|
|
|
+ // 实际推送到同花顺
|
|
|
+ err = SendThs(title, permissionStr, abstract, jumpUrl, logoUrl)
|
|
|
+
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// SendThs 发送消息到同花顺
|
|
|
+func SendThs(title, labelStr, abstract, jumpBaseUrl, logoUrl string) (err error) {
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ //fmt.Println(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "发送消息至同花顺失败 ErrMsg:"+err.Error(), utils.EmailSendToUsers)
|
|
|
+ go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "发送报告至同花顺失败 ErrMsg:"+err.Error(), utils.EmailSendToUsers)
|
|
|
+ }
|
|
|
+ }()
|
|
|
+ pubKey := utils.THS_PubKey
|
|
|
+ sendUrl := utils.THS_SendUrl
|
|
|
+ //fmt.Println("sendUrl:", sendUrl)
|
|
|
+
|
|
|
+ utils.FileLog.Info("title:%s", title)
|
|
|
+ title, err = gorsa.PublicEncrypt(title, pubKey)
|
|
|
+ utils.FileLog.Info("labelStr:%s", labelStr)
|
|
|
+ abstract, err = gorsa.PublicEncrypt(abstract, pubKey)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ label, err := gorsa.PublicEncrypt(labelStr, pubKey)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ jumpUrl, err := gorsa.PublicEncrypt(jumpBaseUrl, pubKey)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ picUrl, err := gorsa.PublicEncrypt(logoUrl, pubKey)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ //开始发送
|
|
|
+ client := http.Client{}
|
|
|
+ form := url.Values{}
|
|
|
+ form.Add("title", title)
|
|
|
+ form.Add("description", abstract)
|
|
|
+ form.Add("label", label)
|
|
|
+ form.Add("url", jumpUrl)
|
|
|
+ form.Add("icon", picUrl)
|
|
|
+
|
|
|
+ utils.FileLog.Info("SendThs parms:%s", form.Encode())
|
|
|
+ resp, err := client.PostForm(sendUrl, form)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ defer resp.Body.Close()
|
|
|
+
|
|
|
+ body, _ := ioutil.ReadAll(resp.Body)
|
|
|
+
|
|
|
+ //fmt.Println(string(body))
|
|
|
+ utils.FileLog.Info("ThsResult parms:%s", string(body))
|
|
|
+
|
|
|
+ //同花顺接口返回数据
|
|
|
+ var tshResult TshResult
|
|
|
+ err = json.Unmarshal(body, &tshResult)
|
|
|
+ if err != nil {
|
|
|
+ err = errors.New(fmt.Sprint("同花顺接口返回数据转换成结构体异常,Err:", err))
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if tshResult.ErrorCode != 1 {
|
|
|
+ err = errors.New(fmt.Sprint("发送数据到同花顺接口异常,result:", string(body)))
|
|
|
+ return
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|