Kaynağa Gözat

拆分eta定时服务

tuoling805 1 yıl önce
ebeveyn
işleme
dde52945b8

+ 47 - 0
models/admin.go

@@ -0,0 +1,47 @@
+package models
+
+import "github.com/beego/beego/v2/client/orm"
+
+type Admin struct {
+	AdminId      int
+	AdminName    string `description:"系统用户名称"`
+	RealName     string `description:"系统用户姓名"`
+	Password     string `description:"密码"`
+	Mobile       string `description:"手机号"`
+	RoleId       int    `description:"角色id"`
+	RoleName     string `description:"角色名称"`
+	RoleTypeCode string `description:"角色编码"`
+	DepartmentId int    `description:"部门id"`
+	GroupId      int    `description:"分组id"`
+	Authority    int    `description:"管理权限,0:无,1:部门负责人,2:小组负责人"`
+	Position     string `description:"职位"`
+	OpenId       string `description:"弘则部门公众号的openid"`
+}
+
+func GetAdminByAdminId(adminId int) (item *Admin, err error) {
+	sql := `SELECT * FROM admin WHERE admin_id=? `
+	err = orm.NewOrm().Raw(sql, adminId).QueryRow(&item)
+	return
+}
+
+type AdminView struct {
+	AdminId      int
+	AdminName    string `description:"系统用户名称"`
+	RealName     string `description:"系统用户姓名"`
+	Password     string `description:"密码"`
+	Mobile       string `description:"手机号"`
+	RoleId       int    `description:"角色id"`
+	RoleName     string `description:"角色名称"`
+	RoleTypeCode string `description:"角色编码"`
+	DepartmentId int    `description:"部门id"`
+	GroupId      int    `description:"分组id"`
+	GroupName    string `description:"分组名称"`
+	Authority    int    `description:"管理权限,0:无,1:部门负责人,2:小组负责人"`
+	Position     string `description:"职位"`
+}
+
+func GetAdminList() (list []*AdminView, err error) {
+	sql := `SELECT * FROM admin `
+	_, err = orm.NewOrm().Raw(sql).QueryRows(&list)
+	return
+}

+ 26 - 0
models/edbinfo_send_msg_record.go

@@ -0,0 +1,26 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type EdbinfoSendMsgRecord struct {
+	Id         int `orm:"column(id);pk"`
+	UserId     int
+	TradeCode  string
+	CreateTime time.Time
+}
+
+func AddEdbinfoSendMsgRecord(item *EdbinfoSendMsgRecord) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	_, err = o.Insert(item)
+	return err
+}
+
+func GetEdbinfoSendMsgCount(userId int, tradeCode string) (count int, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT COUNT(1) AS count FROM edbinfo_send_msg_record WHERE user_id=? AND trade_code=? AND create_time=DATE(NOW()) `
+	err = o.Raw(sql, userId, tradeCode).QueryRow(&count)
+	return
+}

+ 39 - 0
models/index_notice.go

@@ -0,0 +1,39 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+//数据录入
+
+type EdbInfo struct {
+	UserId     int
+	SecName    string `orm:"column(SEC_NAME);" description:"指标名称"`
+	NoticeTime string
+	Frequency  string
+	TradeCode  string `orm:"column(TRADE_CODE);" description:"指标编码"`
+}
+
+// GetEdbInfoByFrequencyNotDay 获取频度非日度 且 提醒时间不为空 的指标数据
+func GetEdbInfoByFrequencyNotDay() (items []*EdbInfo, err error) {
+	sql := `SELECT * FROM edbinfo WHERE frequency!="日度" AND notice_time<>'' and user_id>0 `
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+type Edbdata struct {
+	TradeCode  string    `orm:"column(TRADE_CODE);pk" description:"指标编码"`
+	Dt         string    `orm:"column(DT)" description:"日期"`
+	Close      string    `orm:"column(CLOSE)" description:"值"`
+	ModifyTime time.Time `orm:"column(modify_time)" description:"修改时间"`
+}
+
+// GetLastEdbdataInfo 根据指标编号获取指标最近的一条数据
+func GetLastEdbdataInfo(tradeCode string) (item *Edbdata, err error) {
+	sql := `SELECT * FROM edbdata WHERE TRADE_CODE=? order by DT desc `
+	o := orm.NewOrmUsingDB("edb")
+	err = o.Raw(sql, tradeCode).QueryRow(&item)
+	return
+}

+ 36 - 0
models/wx_template_msg.go

@@ -0,0 +1,36 @@
+package models
+
+import "github.com/beego/beego/v2/client/orm"
+
+type SendTemplateResponse struct {
+	Errcode int    `json:"errcode"`
+	Errmsg  string `json:"errmsg"`
+	MsgID   int    `json:"msgid"`
+}
+
+type OpenIdList struct {
+	OpenId string
+}
+
+func DeleteTemplateRecordByDate(date string) (err error) {
+	sql := `DELETE FROM user_template_record WHERE create_time<? `
+	o := orm.NewOrm()
+	_, err = o.Raw(sql, date).Exec()
+	return
+}
+
+// GetOpenIdListV2 2022-08-18从hongze_admin复制过来的最新的代码
+func GetOpenIdListV2() (items []*OpenIdList, err error) {
+	sql := `SELECT DISTINCT
+				ur.open_id,
+				wu.user_id
+			FROM
+				wx_user AS wu
+			INNER JOIN company AS c ON c.company_id = wu.company_id
+			INNER JOIN company_product AS d ON c.company_id = d.company_id
+			INNER JOIN user_record AS ur ON wu.user_id = ur.user_id
+			WHERE
+				ur.open_id != "" AND ur.subscribe = 1 AND ur.create_platform = 1 AND d. STATUS IN ('正式', '试用', '永续') `
+	_, err = orm.NewOrm().Raw(sql).QueryRows(&items)
+	return
+}

+ 610 - 0
services/data/edb_info.go

@@ -417,3 +417,613 @@ func RefreshDataFromEiaSteo(wg *sync.WaitGroup) (err error) {
 	}
 	return err
 }
+
+// RefreshDataFromZz 刷新郑商所数据
+func RefreshDataFromZz(wg *sync.WaitGroup) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("RefreshDataFromZz Err:" + err.Error())
+			go alarm_msg.SendAlarmMsg("RefreshDataFromZz ErrMsg:"+err.Error(), 3)
+		}
+		wg.Done()
+	}()
+	var condition string
+	var pars []interface{}
+	condition += " AND source=? "
+	pars = append(pars, utils.DATA_SOURCE_ZZ)
+	items, err := data_manage.GetEdbInfoByCondition(condition, pars, 0)
+	if err != nil {
+		return errors.New("GetEdbInfoByCondition:" + err.Error())
+	}
+
+	for _, v := range items {
+		startDate := ""
+		if v.Frequency == "日度" {
+			startDate = v.EndDate.AddDate(0, 0, -utils.DATA_REFRESH).Format(utils.FormatDate)
+		} else if v.Frequency == "周度" {
+			startDate = v.EndDate.AddDate(0, 0, -(utils.DATA_REFRESH * 7)).Format(utils.FormatDate)
+		} else if v.Frequency == "月度" {
+			startDate = v.EndDate.AddDate(0, -utils.DATA_REFRESH, 0).Format(utils.FormatDate)
+		} else if v.Frequency == "季度" {
+			startDate = v.EndDate.AddDate(0, -utils.DATA_REFRESH*3, 0).Format(utils.FormatDate)
+		} else if v.Frequency == "年度" {
+			startDate = v.EndDate.AddDate(-utils.DATA_REFRESH, 0, 0).Format(utils.FormatDate)
+		} else {
+			startDate = v.EndDate.AddDate(0, 0, -utils.DATA_REFRESH).Format(utils.FormatDate)
+		}
+		resp, err := RefreshEdbData(v.EdbInfoId, v.Source, v.EdbCode, startDate)
+		if err != nil {
+			return errors.New("RefreshEdbData Err:" + err.Error())
+		}
+		if resp.Ret != 200 {
+			return errors.New("RefreshEdbData Err:" + resp.Msg + ";ErrMsg:" + resp.ErrMsg)
+		}
+	}
+	return err
+}
+
+// RefreshDataFromSh 刷新上期所数据
+func RefreshDataFromSh(wg *sync.WaitGroup) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("RefreshDataFromSh Err:" + err.Error())
+			go alarm_msg.SendAlarmMsg("RefreshDataFromSh ErrMsg:"+err.Error(), 3)
+		}
+		wg.Done()
+	}()
+	var condition string
+	var pars []interface{}
+	condition += " AND source=? "
+	pars = append(pars, utils.DATA_SOURCE_SH)
+	items, err := data_manage.GetEdbInfoByCondition(condition, pars, 0)
+	if err != nil {
+		return errors.New("GetEdbInfoByCondition:" + err.Error())
+	}
+	for _, v := range items {
+		startDate := ""
+		if v.Frequency == "日度" {
+			startDate = v.EndDate.AddDate(0, 0, -utils.DATA_REFRESH).Format(utils.FormatDate)
+		} else if v.Frequency == "周度" {
+			startDate = v.EndDate.AddDate(0, 0, -(utils.DATA_REFRESH * 7)).Format(utils.FormatDate)
+		} else if v.Frequency == "月度" {
+			startDate = v.EndDate.AddDate(0, -utils.DATA_REFRESH, 0).Format(utils.FormatDate)
+		} else if v.Frequency == "季度" {
+			startDate = v.EndDate.AddDate(0, -utils.DATA_REFRESH*3, 0).Format(utils.FormatDate)
+		} else if v.Frequency == "年度" {
+			startDate = v.EndDate.AddDate(-utils.DATA_REFRESH, 0, 0).Format(utils.FormatDate)
+		} else {
+			startDate = v.EndDate.AddDate(0, 0, -utils.DATA_REFRESH).Format(utils.FormatDate)
+		}
+		resp, err := RefreshEdbData(v.EdbInfoId, v.Source, v.EdbCode, startDate)
+		if err != nil {
+			return errors.New("RefreshEdbData Err:" + err.Error())
+		}
+		if resp.Ret != 200 {
+			return errors.New("RefreshEdbData Err:" + resp.Msg + ";ErrMsg:" + resp.ErrMsg)
+		}
+	}
+	return err
+}
+
+// RefreshDataFromShfe 刷新上期能源数据
+func RefreshDataFromShfe(wg *sync.WaitGroup) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("RefreshDataFromShfe Err:" + err.Error())
+			go alarm_msg.SendAlarmMsg("RefreshDataFromShfe ErrMsg:"+err.Error(), 3)
+		}
+		wg.Done()
+	}()
+	var condition string
+	var pars []interface{}
+	condition += " AND source=? "
+	pars = append(pars, utils.DATA_SOURCE_SHFE)
+	items, err := data_manage.GetEdbInfoByCondition(condition, pars, 0)
+	if err != nil {
+		return errors.New("GetEdbInfoByCondition:" + err.Error())
+	}
+
+	for _, v := range items {
+		startDate := ""
+		if v.Frequency == "日度" {
+			startDate = v.EndDate.AddDate(0, 0, -utils.DATA_REFRESH).Format(utils.FormatDate)
+		} else if v.Frequency == "周度" {
+			startDate = v.EndDate.AddDate(0, 0, -(utils.DATA_REFRESH * 7)).Format(utils.FormatDate)
+		} else if v.Frequency == "月度" {
+			startDate = v.EndDate.AddDate(0, -utils.DATA_REFRESH, 0).Format(utils.FormatDate)
+		} else if v.Frequency == "季度" {
+			startDate = v.EndDate.AddDate(0, -utils.DATA_REFRESH*3, 0).Format(utils.FormatDate)
+		} else if v.Frequency == "年度" {
+			startDate = v.EndDate.AddDate(-utils.DATA_REFRESH, 0, 0).Format(utils.FormatDate)
+		} else {
+			startDate = v.EndDate.AddDate(0, 0, -utils.DATA_REFRESH).Format(utils.FormatDate)
+		}
+		resp, err := RefreshEdbData(v.EdbInfoId, v.Source, v.EdbCode, startDate)
+		if err != nil {
+			return errors.New("RefreshEdbData Err:" + err.Error())
+		}
+		if resp.Ret != 200 {
+			return errors.New("RefreshEdbData Err:" + resp.Msg + ";ErrMsg:" + resp.ErrMsg)
+		}
+	}
+	return err
+}
+
+// RefreshDataFromCffex 刷新中金所数据
+func RefreshDataFromCffex(wg *sync.WaitGroup) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("RefreshDataFromCffex Err:" + err.Error())
+			go alarm_msg.SendAlarmMsg("RefreshDataFromCffex ErrMsg:"+err.Error(), 3)
+		}
+		wg.Done()
+	}()
+	var condition string
+	var pars []interface{}
+	condition += " AND source=? "
+	pars = append(pars, utils.DATA_SOURCE_CFFEX)
+	items, err := data_manage.GetEdbInfoByCondition(condition, pars, 0)
+	if err != nil {
+		return errors.New("GetEdbInfoByCondition:" + err.Error())
+	}
+
+	for _, v := range items {
+		startDate := ""
+		if v.Frequency == "日度" {
+			startDate = v.EndDate.AddDate(0, 0, -utils.DATA_REFRESH).Format(utils.FormatDate)
+		} else if v.Frequency == "周度" {
+			startDate = v.EndDate.AddDate(0, 0, -(utils.DATA_REFRESH * 7)).Format(utils.FormatDate)
+		} else if v.Frequency == "月度" {
+			startDate = v.EndDate.AddDate(0, -utils.DATA_REFRESH, 0).Format(utils.FormatDate)
+		} else if v.Frequency == "季度" {
+			startDate = v.EndDate.AddDate(0, -utils.DATA_REFRESH*3, 0).Format(utils.FormatDate)
+		} else if v.Frequency == "年度" {
+			startDate = v.EndDate.AddDate(-utils.DATA_REFRESH, 0, 0).Format(utils.FormatDate)
+		} else {
+			startDate = v.EndDate.AddDate(0, 0, -utils.DATA_REFRESH).Format(utils.FormatDate)
+		}
+		resp, err := RefreshEdbData(v.EdbInfoId, v.Source, v.EdbCode, startDate)
+		if err != nil {
+			return errors.New("RefreshEdbData Err:" + err.Error())
+		}
+		if resp.Ret != 200 {
+			return errors.New("RefreshEdbData Err:" + resp.Msg + ";ErrMsg:" + resp.ErrMsg)
+		}
+	}
+	return err
+}
+
+// RefreshDataFromDl 刷新大商所数据
+func RefreshDataFromDl(wg *sync.WaitGroup) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("RefreshDataFromDl Err:" + err.Error())
+			go alarm_msg.SendAlarmMsg("RefreshDataFromDl ErrMsg:"+err.Error(), 3)
+		}
+		wg.Done()
+	}()
+	var condition string
+	var pars []interface{}
+	condition += " AND source=? "
+	pars = append(pars, utils.DATA_SOURCE_DL)
+	items, err := data_manage.GetEdbInfoByCondition(condition, pars, 0)
+	if err != nil {
+		return errors.New("GetEdbInfoByCondition:" + err.Error())
+	}
+
+	for _, v := range items {
+		startDate := ""
+		if v.Frequency == "日度" {
+			startDate = v.EndDate.AddDate(0, 0, -utils.DATA_REFRESH).Format(utils.FormatDate)
+		} else if v.Frequency == "周度" {
+			startDate = v.EndDate.AddDate(0, 0, -(utils.DATA_REFRESH * 7)).Format(utils.FormatDate)
+		} else if v.Frequency == "月度" {
+			startDate = v.EndDate.AddDate(0, -utils.DATA_REFRESH, 0).Format(utils.FormatDate)
+		} else if v.Frequency == "季度" {
+			startDate = v.EndDate.AddDate(0, -utils.DATA_REFRESH*3, 0).Format(utils.FormatDate)
+		} else if v.Frequency == "年度" {
+			startDate = v.EndDate.AddDate(-utils.DATA_REFRESH, 0, 0).Format(utils.FormatDate)
+		} else {
+			startDate = v.EndDate.AddDate(0, 0, -utils.DATA_REFRESH).Format(utils.FormatDate)
+		}
+		resp, err := RefreshEdbData(v.EdbInfoId, v.Source, v.EdbCode, startDate)
+		if err != nil {
+			return errors.New("RefreshEdbData Err:" + err.Error())
+		}
+		if resp.Ret != 200 {
+			return errors.New("RefreshEdbData Err:" + resp.Msg + ";ErrMsg:" + resp.ErrMsg)
+		}
+	}
+	return err
+}
+
+// 刷新有色数据
+func RefreshDataFromYs(wg *sync.WaitGroup) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("RefreshDataFromYs Err:" + err.Error())
+			//go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "RefreshDataFromYs ErrMsg:"+err.Error(), utils.EmailSendToUsers)
+			go alarm_msg.SendAlarmMsg("RefreshDataFromYs ErrMsg:"+err.Error(), 3)
+		}
+		wg.Done()
+	}()
+	var condition string
+	var pars []interface{}
+	condition += " AND source=? "
+	pars = append(pars, utils.DATA_SOURCE_YS)
+
+	items, err := data_manage.GetEdbInfoByCondition(condition, pars, 0)
+	if err != nil {
+		return errors.New("GetEdbInfoByCondition:" + err.Error())
+	}
+	for _, v := range items {
+		startDate := ""
+		if v.Frequency == "日度" {
+			startDate = v.EndDate.AddDate(0, 0, -utils.DATA_REFRESH).Format(utils.FormatDate)
+		} else if v.Frequency == "周度" {
+			startDate = v.EndDate.AddDate(0, 0, -(utils.DATA_REFRESH * 7)).Format(utils.FormatDate)
+		} else if v.Frequency == "月度" {
+			startDate = v.EndDate.AddDate(0, -utils.DATA_REFRESH, 0).Format(utils.FormatDate)
+		} else if v.Frequency == "季度" {
+			startDate = v.EndDate.AddDate(0, -utils.DATA_REFRESH*3, 0).Format(utils.FormatDate)
+		} else if v.Frequency == "年度" {
+			startDate = v.EndDate.AddDate(-utils.DATA_REFRESH, 0, 0).Format(utils.FormatDate)
+		} else {
+			startDate = v.EndDate.AddDate(0, 0, -utils.DATA_REFRESH).Format(utils.FormatDate)
+		}
+		resp, err := RefreshEdbData(v.EdbInfoId, v.Source, v.EdbCode, startDate)
+		if err != nil {
+			return errors.New("RefreshEdbData Err:" + err.Error())
+		}
+		if resp.Ret != 200 {
+			return errors.New("RefreshEdbData Err:" + resp.Msg + ";ErrMsg:" + resp.ErrMsg)
+		}
+	}
+	return err
+}
+
+// 刷新钢联数据
+func RefreshDataFromGl(wg *sync.WaitGroup) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("RefreshDataFromGl Err:" + err.Error())
+			go alarm_msg.SendAlarmMsg("RefreshDataFromGl ErrMsg:"+err.Error(), 3)
+		}
+		wg.Done()
+	}()
+	var condition string
+	var pars []interface{}
+	condition += " AND source=? "
+	pars = append(pars, utils.DATA_SOURCE_GL)
+	items, err := data_manage.GetEdbInfoByCondition(condition, pars, 0)
+	if err != nil {
+		return errors.New("GetEdbInfoByCondition:" + err.Error())
+	}
+
+	for _, v := range items {
+		startDate := ""
+		if v.Frequency == "日度" {
+			startDate = v.EndDate.AddDate(0, 0, -utils.DATA_REFRESH).Format(utils.FormatDate)
+		} else if v.Frequency == "周度" {
+			startDate = v.EndDate.AddDate(0, 0, -(utils.DATA_REFRESH * 7)).Format(utils.FormatDate)
+		} else if v.Frequency == "月度" {
+			startDate = v.EndDate.AddDate(0, -utils.DATA_REFRESH, 0).Format(utils.FormatDate)
+		} else if v.Frequency == "季度" {
+			startDate = v.EndDate.AddDate(0, -utils.DATA_REFRESH*3, 0).Format(utils.FormatDate)
+		} else if v.Frequency == "年度" {
+			startDate = v.EndDate.AddDate(-utils.DATA_REFRESH, 0, 0).Format(utils.FormatDate)
+		} else {
+			startDate = v.EndDate.AddDate(0, 0, -utils.DATA_REFRESH).Format(utils.FormatDate)
+		}
+		resp, err := RefreshEdbData(v.EdbInfoId, v.Source, v.EdbCode, startDate)
+		if err != nil {
+			return errors.New("RefreshEdbData Err:" + err.Error())
+		}
+		if resp.Ret != 200 {
+			return errors.New("RefreshEdbData Err:" + resp.Msg + ";ErrMsg:" + resp.ErrMsg)
+		}
+	}
+	return err
+}
+
+// RefreshDataFromLt 刷新路透数据
+func RefreshDataFromLt(wg *sync.WaitGroup) (err error) {
+	errMsgList := make([]string, 0)
+	defer func() {
+		if len(errMsgList) > 0 {
+			fmt.Println("RefreshDataFromLt Err:", errMsgList)
+			go alarm_msg.SendAlarmMsg("RefreshDataFromLt ErrMsg:"+strings.Join(errMsgList, `<br/>`), 3)
+		}
+		wg.Done()
+	}()
+	var condition string
+	var pars []interface{}
+	condition += " AND source=? "
+	pars = append(pars, utils.DATA_SOURCE_LT)
+	items, err := data_manage.GetEdbInfoByCondition(condition, pars, 0)
+	if err != nil {
+		errMsgList = append(errMsgList, "GetEdbInfoByCondition:"+err.Error())
+		return errors.New("GetEdbInfoByCondition:" + err.Error())
+	}
+
+	for _, v := range items {
+		startDate := v.StartDate.Format(utils.FormatDate)
+		resp, err := RefreshEdbData(v.EdbInfoId, v.Source, v.EdbCode, startDate)
+		if err != nil {
+			errMsgList = append(errMsgList, "RefreshEdbData Err:"+err.Error())
+			continue
+		}
+		if resp.Ret != 200 {
+			errMsgList = append(errMsgList, "RefreshEdbData Err:"+resp.Msg+";ErrMsg:"+resp.ErrMsg)
+			continue
+		}
+	}
+	return err
+}
+
+// RefreshDataFromCoal 刷新煤炭网数据
+func RefreshDataFromCoal(wg *sync.WaitGroup) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("RefreshDataFromCoal Err:" + err.Error())
+			go alarm_msg.SendAlarmMsg("RefreshDataFromCoal ErrMsg:"+err.Error(), 3)
+		}
+		wg.Done()
+	}()
+	var condition string
+	var pars []interface{}
+	condition += " AND source=? "
+	pars = append(pars, utils.DATA_SOURCE_COAL)
+	items, err := data_manage.GetEdbInfoByCondition(condition, pars, 0)
+	if err != nil {
+		return errors.New("GetEdbInfoByCondition:" + err.Error())
+	}
+
+	for _, v := range items {
+		startDate := ""
+		if v.Frequency == "日度" {
+			startDate = v.EndDate.AddDate(0, 0, -utils.DATA_REFRESH).Format(utils.FormatDate)
+		} else if v.Frequency == "周度" {
+			startDate = v.EndDate.AddDate(0, 0, -(utils.DATA_REFRESH * 7)).Format(utils.FormatDate)
+		} else if v.Frequency == "月度" {
+			startDate = v.EndDate.AddDate(0, -utils.DATA_REFRESH, 0).Format(utils.FormatDate)
+		} else if v.Frequency == "季度" {
+			startDate = v.EndDate.AddDate(0, -utils.DATA_REFRESH*3, 0).Format(utils.FormatDate)
+		} else if v.Frequency == "年度" {
+			startDate = v.EndDate.AddDate(-utils.DATA_REFRESH, 0, 0).Format(utils.FormatDate)
+		} else {
+			startDate = v.EndDate.AddDate(0, 0, -utils.DATA_REFRESH).Format(utils.FormatDate)
+		}
+		resp, err := RefreshEdbData(v.EdbInfoId, v.Source, v.EdbCode, startDate)
+		if err != nil {
+			return errors.New("RefreshEdbData Err:" + err.Error())
+		}
+		if resp.Ret != 200 {
+			return errors.New("RefreshEdbData Err:" + resp.Msg + ";ErrMsg:" + resp.ErrMsg)
+		}
+	}
+	return err
+}
+
+// RefreshDataFromMysteelChemical 刷新钢联化工数据
+func RefreshDataFromMysteelChemical(wg *sync.WaitGroup) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("RefreshDataFromMysteelChemical Err:" + err.Error())
+			go alarm_msg.SendAlarmMsg("RefreshDataFromMysteelChemical ErrMsg:"+err.Error(), 3)
+		}
+		wg.Done()
+	}()
+	var condition string
+	var pars []interface{}
+	condition += " AND source=? "
+	pars = append(pars, utils.DATA_SOURCE_MYSTEEL_CHEMICAL)
+	items, err := data_manage.GetEdbInfoByCondition(condition, pars, 0)
+	if err != nil {
+		return errors.New("GetEdbInfoByCondition:" + err.Error())
+	}
+
+	for _, v := range items {
+		startDate := ""
+		if v.Frequency == "日度" {
+			startDate = v.EndDate.AddDate(0, 0, -utils.DATA_REFRESH).Format(utils.FormatDate)
+		} else if v.Frequency == "周度" {
+			startDate = v.EndDate.AddDate(0, 0, -(utils.DATA_REFRESH * 7)).Format(utils.FormatDate)
+		} else if v.Frequency == "月度" {
+			startDate = v.EndDate.AddDate(0, -utils.DATA_REFRESH, 0).Format(utils.FormatDate)
+		} else if v.Frequency == "季度" {
+			startDate = v.EndDate.AddDate(0, -utils.DATA_REFRESH*3, 0).Format(utils.FormatDate)
+		} else if v.Frequency == "年度" {
+			startDate = v.EndDate.AddDate(-utils.DATA_REFRESH, 0, 0).Format(utils.FormatDate)
+		} else {
+			startDate = v.EndDate.AddDate(0, 0, -utils.DATA_REFRESH).Format(utils.FormatDate)
+		}
+		resp, err := RefreshEdbData(v.EdbInfoId, v.Source, v.EdbCode, startDate)
+		if err != nil {
+			return errors.New("RefreshEdbData Err:" + err.Error())
+		}
+		if resp.Ret != 200 {
+			return errors.New("RefreshEdbData Err:" + resp.Msg + ";ErrMsg:" + resp.ErrMsg)
+		}
+	}
+	return err
+}
+
+// RefreshDataFromComTrade 刷新 UN 数据
+func RefreshDataFromComTrade(wg *sync.WaitGroup) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("RefreshDataFromComTrade Err:" + err.Error())
+			go alarm_msg.SendAlarmMsg("RefreshDataFromComTrade ErrMsg:"+err.Error(), 3)
+		}
+		wg.Done()
+	}()
+	var condition string
+	var pars []interface{}
+	condition += " AND source=? "
+	pars = append(pars, utils.DATA_SOURCE_COM_TRADE)
+	items, err := data_manage.GetEdbInfoByCondition(condition, pars, 0)
+	if err != nil {
+		return errors.New("GetEdbInfoByCondition:" + err.Error())
+	}
+
+	for _, v := range items {
+		startDate := ""
+		if v.Frequency == "日度" {
+			startDate = v.EndDate.AddDate(0, 0, -utils.DATA_REFRESH).Format(utils.FormatDate)
+		} else if v.Frequency == "周度" {
+			startDate = v.EndDate.AddDate(0, 0, -(utils.DATA_REFRESH * 7)).Format(utils.FormatDate)
+		} else if v.Frequency == "月度" {
+			startDate = v.EndDate.AddDate(0, -utils.DATA_REFRESH, 0).Format(utils.FormatDate)
+		} else if v.Frequency == "季度" {
+			startDate = v.EndDate.AddDate(0, -utils.DATA_REFRESH*3, 0).Format(utils.FormatDate)
+		} else if v.Frequency == "年度" {
+			startDate = v.EndDate.AddDate(-utils.DATA_REFRESH, 0, 0).Format(utils.FormatDate)
+		} else {
+			startDate = v.EndDate.AddDate(0, 0, -utils.DATA_REFRESH).Format(utils.FormatDate)
+		}
+
+		resp, err := RefreshEdbData(v.EdbInfoId, v.Source, v.EdbCode, startDate)
+		if err != nil {
+			return errors.New("RefreshDataFromComTrade Err:" + err.Error())
+		}
+		if resp.Ret != 200 {
+			return errors.New("RefreshDataFromComTrade Err:" + resp.Msg + ";ErrMsg:" + resp.ErrMsg)
+		}
+	}
+	return err
+}
+
+// RefreshDataFromSci 刷新 卓创 数据
+func RefreshDataFromSci(wg *sync.WaitGroup) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("RefreshDataFromSci Err:" + err.Error())
+			go alarm_msg.SendAlarmMsg("RefreshDataFromSci ErrMsg:"+err.Error(), 3)
+		}
+		wg.Done()
+	}()
+	var condition string
+	var pars []interface{}
+	condition += " AND source=? "
+	pars = append(pars, utils.DATA_SOURCE_SCI)
+	items, err := data_manage.GetEdbInfoByCondition(condition, pars, 0)
+	if err != nil {
+		return errors.New("GetEdbInfoByCondition:" + err.Error())
+	}
+
+	for _, v := range items {
+		startDate := ""
+		if v.Frequency == "日度" {
+			startDate = v.EndDate.AddDate(0, 0, -utils.DATA_REFRESH).Format(utils.FormatDate)
+		} else if v.Frequency == "周度" {
+			startDate = v.EndDate.AddDate(0, 0, -(utils.DATA_REFRESH * 7)).Format(utils.FormatDate)
+		} else if v.Frequency == "月度" {
+			startDate = v.EndDate.AddDate(0, -utils.DATA_REFRESH, 0).Format(utils.FormatDate)
+		} else if v.Frequency == "季度" {
+			startDate = v.EndDate.AddDate(0, -utils.DATA_REFRESH*3, 0).Format(utils.FormatDate)
+		} else if v.Frequency == "年度" {
+			startDate = v.EndDate.AddDate(-utils.DATA_REFRESH, 0, 0).Format(utils.FormatDate)
+		} else {
+			startDate = v.EndDate.AddDate(0, 0, -utils.DATA_REFRESH).Format(utils.FormatDate)
+		}
+
+		resp, err := RefreshEdbData(v.EdbInfoId, v.Source, v.EdbCode, startDate)
+		if err != nil {
+			return errors.New("RefreshDataFromSci Err:" + err.Error())
+		}
+		if resp.Ret != 200 {
+			return errors.New("RefreshDataFromSci Err:" + resp.Msg + ";ErrMsg:" + resp.ErrMsg)
+		}
+	}
+	return err
+}
+
+// RefreshDataFromNationalStatistics 刷新统计局数据
+func RefreshDataFromNationalStatistics(wg *sync.WaitGroup) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("RefreshDataFromNationalStatistics Err:" + err.Error())
+			go alarm_msg.SendAlarmMsg("RefreshDataFromNationalStatistics ErrMsg:"+err.Error(), 3)
+		}
+		wg.Done()
+	}()
+	var condition string
+	var pars []interface{}
+	condition += ` AND source = ? `
+	pars = append(pars, utils.DATA_SOURCE_NATIONAL_STATISTICS)
+	items, err := data_manage.GetEdbInfoByCondition(condition, pars, 0)
+	if err != nil {
+		return errors.New("GetEdbInfoByCondition:" + err.Error())
+	}
+
+	for _, v := range items {
+		startDate := ""
+		if v.Frequency == "日度" {
+			startDate = v.EndDate.AddDate(0, 0, -utils.DATA_REFRESH).Format(utils.FormatDate)
+		} else if v.Frequency == "周度" {
+			startDate = v.EndDate.AddDate(0, 0, -(utils.DATA_REFRESH * 7)).Format(utils.FormatDate)
+		} else if v.Frequency == "月度" {
+			startDate = v.EndDate.AddDate(0, -utils.DATA_REFRESH, 0).Format(utils.FormatDate)
+		} else if v.Frequency == "季度" {
+			startDate = v.EndDate.AddDate(0, -utils.DATA_REFRESH*3, 0).Format(utils.FormatDate)
+		} else if v.Frequency == "年度" {
+			startDate = v.EndDate.AddDate(-utils.DATA_REFRESH, 0, 0).Format(utils.FormatDate)
+		} else {
+			startDate = v.EndDate.AddDate(0, 0, -utils.DATA_REFRESH).Format(utils.FormatDate)
+		}
+
+		resp, err := RefreshEdbData(v.EdbInfoId, v.Source, v.EdbCode, startDate)
+		if err != nil {
+			return errors.New("RefreshDataFromNationalStatistics Err:" + err.Error())
+		}
+		if resp.Ret != 200 {
+			return errors.New("RefreshDataFromNationalStatistics Err:" + resp.Msg + ";ErrMsg:" + resp.ErrMsg)
+		}
+	}
+	return err
+}
+
+// RefreshDataFromEic 刷欧洲天然气数据
+func RefreshDataFromEic(wg *sync.WaitGroup) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("RefreshDataFromEic Err:" + err.Error())
+			go alarm_msg.SendAlarmMsg("RefreshDataFromEic ErrMsg:"+err.Error(), 3)
+		}
+		wg.Done()
+	}()
+	var condition string
+	var pars []interface{}
+	condition += " AND source=? "
+	pars = append(pars, utils.DATA_SOURCE_GIE)
+	items, err := data_manage.GetEdbInfoByCondition(condition, pars, 0)
+	if err != nil {
+		return errors.New("GetEdbInfoByCondition:" + err.Error())
+	}
+
+	for _, v := range items {
+		startDate := ""
+		if v.Frequency == "日度" {
+			startDate = v.EndDate.AddDate(0, 0, -utils.DATA_REFRESH).Format(utils.FormatDate)
+		} else if v.Frequency == "周度" {
+			startDate = v.EndDate.AddDate(0, 0, -(utils.DATA_REFRESH * 7)).Format(utils.FormatDate)
+		} else if v.Frequency == "月度" {
+			startDate = v.EndDate.AddDate(0, -utils.DATA_REFRESH, 0).Format(utils.FormatDate)
+		} else if v.Frequency == "季度" {
+			startDate = v.EndDate.AddDate(0, -utils.DATA_REFRESH*3, 0).Format(utils.FormatDate)
+		} else if v.Frequency == "年度" {
+			startDate = v.EndDate.AddDate(-utils.DATA_REFRESH, 0, 0).Format(utils.FormatDate)
+		} else {
+			startDate = v.EndDate.AddDate(0, 0, -utils.DATA_REFRESH).Format(utils.FormatDate)
+		}
+		resp, err := RefreshEdbData(v.EdbInfoId, v.Source, v.EdbCode, startDate)
+		if err != nil {
+			return errors.New("RefreshEdbData Err:" + err.Error())
+		}
+		if resp.Ret != 200 {
+			return errors.New("RefreshEdbData Err:" + resp.Msg + ";ErrMsg:" + resp.ErrMsg)
+		}
+	}
+	return err
+}

+ 77 - 0
services/data/server_check.go

@@ -0,0 +1,77 @@
+package data
+
+import (
+	"context"
+	"eta/eta_task/services/alarm_msg"
+	"eta/eta_task/utils"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/http"
+	"strings"
+)
+
+//服务检测
+
+// CheckWindDataInterface 检测wind数据服务器
+func CheckWindDataInterface(cont context.Context) (err error) {
+	if utils.WindServerUrl != "" {
+		windServerUrlArr := strings.Split(utils.WindServerUrl, ",")
+		for _, hzDataWindUrl := range windServerUrlArr {
+			go func(urlStr string) {
+				checkUrl := urlStr + `hz_server`
+				body, err := http.Get(checkUrl)
+				if err != nil {
+					msg := fmt.Sprintf("检测:%s ;失败:CheckWindDataInterface ErrMsg:%s", checkUrl, err.Error())
+					go alarm_msg.SendAlarmMsg(msg, 3)
+				} else {
+					result := string(body)
+					if result != `1` {
+						msg := fmt.Sprintf("检测%s ;失败:CheckWindDataInterface ErrMsg:%s", checkUrl, string(body))
+						go alarm_msg.SendAlarmMsg(msg, 3)
+					}
+				}
+			}(hzDataWindUrl)
+		}
+	}
+	return
+}
+
+// CheckLtDataInterface 检测路透数据服务器
+func CheckLtDataInterface(cont context.Context) (err error) {
+	if utils.LtServerUrl != "" {
+		go func() {
+			checkUrl := utils.LtServerUrl + `hz_server`
+			body, err := http.Get(checkUrl)
+			if err != nil {
+				msg := "检测路透数据服务器失败:CheckLtDataInterface ErrMsg:" + err.Error()
+				go alarm_msg.SendAlarmMsg(msg, 3)
+			} else {
+				result := string(body)
+				if result != `"ek true"` {
+					msg := "检测路透数据服务器失败:CheckLtDataInterface ErrMsg:" + string(body)
+					go alarm_msg.SendAlarmMsg(msg, 3)
+				}
+			}
+		}()
+	}
+	return
+}
+
+func CheckPbDataInterface(cont context.Context) (err error) {
+	if utils.PbServerUrl != "" {
+		go func() {
+			checkUrl := utils.PbServerUrl + `hz_server`
+			body, err := http.Get(checkUrl)
+			if err != nil {
+				msg := "检测彭博数据服务器失败:CheckPbDataInterface ErrMsg:" + err.Error()
+				go alarm_msg.SendAlarmMsg(msg, 3)
+			} else {
+				result := string(body)
+				if result != "1" {
+					msg := "检测彭博数据服务器失败:CheckPbDataInterface ErrMsg:" + string(body)
+					go alarm_msg.SendAlarmMsg(msg, 3)
+				}
+			}
+		}()
+	}
+	return
+}

+ 440 - 0
services/index_notice.go

@@ -0,0 +1,440 @@
+package services
+
+import (
+	"context"
+	"errors"
+	"eta/eta_task/models"
+	"eta/eta_task/utils"
+	"fmt"
+	"github.com/beego/beego/v2/task"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// EdbTaskNameMap 手工指标定时任务名称map集合
+var EdbTaskNameMap map[string]map[string]bool
+
+// EdbTaskNameChannel 手工指标定时任务名称channel
+var EdbTaskNameChannel chan string
+
+// EdbTaskStopChannel 手工指标定时任务停止channel
+var EdbTaskStopChannel chan string
+
+// EdbTaskRunNum 手工指标定时任务开始次数
+var EdbTaskRunNum int
+
+// AddEdbTask 新增手工指标数据录入提醒
+func AddEdbTask(cont context.Context) (err error) {
+	//失败列表
+	failList := make([]string, 0)
+
+	defer func() {
+		if len(failList) > 0 {
+			fmt.Println("提醒失败:")
+			for _, v := range failList {
+				fmt.Println(v)
+			}
+
+		}
+	}()
+	list, err := models.GetEdbInfoByFrequencyNotDay()
+	if err != nil {
+		fmt.Println("查询获取频度非日度 且 提醒时间不为空 的指标数据失败,Err:", err.Error())
+	}
+	//如果还没有初始化map,那么先初始
+	if EdbTaskNameMap == nil {
+		EdbTaskNameMap = make(map[string]map[string]bool)
+	}
+	tmpEdbTaskNameMap := make(map[string]bool)
+
+	// 今天的日期字符串(格式:2021-10-25)
+	todayStr := time.Now().Format(utils.FormatDate)
+
+	//当前周的周一与周日
+	nowWeekFirstDay := utils.GetNowWeekMonday()
+	nowWeekLastDay := utils.GetNowWeekLastDay()
+
+	//当前月的一号与最后一天
+	nowMonthFirstDay := utils.GetNowMonthFirstDay()
+	nowMonthLastDay := utils.GetNowMonthLastDay()
+
+	//当前季度的第一天与最后一天
+	nowQuarterFirstDay := utils.GetNowQuarterFirstDay()
+	nowQuarterLastDay := utils.GetNowQuarterLastDay()
+
+	//当前半年的第一天与最后一天
+	nowHalfYearFirstDay := utils.GetNowHalfYearFirstDay()
+	nowHalfYearLastDay := utils.GetNowHalfYearLastDay()
+
+	// 当前年的第一天与最后一天
+	nowYearFirstDay := utils.GetNowYearFirstDay()
+	nowYearLastDay := utils.GetNowYearLastDay()
+
+	debugNoticeUserId := 0 //测试环境,需要发送消息的用户
+	//测试环境也不发了
+	//if utils.RunMode == "debug" {
+	//	tmpWxUser, tmpErr := models.GetWxUserByMobile("17634786714")
+	//	if tmpErr == nil && tmpWxUser != nil {
+	//		//debugNoticeUserId = 44078 //测试环境的话,发送邮箱给颜鹏
+	//		debugNoticeUserId = int(tmpWxUser.UserId) //测试环境的话,发送邮箱给嘉豪
+	//	}
+	//}
+
+	//task.globalTaskManager.adminTaskList
+	for _, edb := range list {
+		if edb.UserId <= 0 {
+			continue //没有配置user_id的话,那么不需要提醒
+		}
+		tmpEdb := edb            //指标信息
+		isNotice := false        //是否需要提醒
+		noticeTime := "12:00:00" //提醒时间
+
+		var dataDtTime time.Time
+		edbData, tmpErr := models.GetLastEdbdataInfo(tmpEdb.TradeCode)
+		if tmpErr != nil {
+			if tmpErr.Error() != utils.ErrNoRow() {
+				failList = append(failList, fmt.Sprint(tmpEdb.TradeCode, "失败,Err:", tmpErr.Error()))
+				continue
+			}
+		}
+
+		//如果确实是有数据的
+		if edbData != nil {
+			tmpDataDtTime, _ := time.ParseInLocation(utils.FormatDate, edbData.Dt, time.Now().Location())
+			dataDtTime = tmpDataDtTime
+		}
+
+		switch tmpEdb.Frequency {
+		case "周度":
+			modifyDate := nowWeekLastDay //下次更新日期
+			if tmpEdb.NoticeTime != "" {
+				addDay := 7
+				noticeArr := strings.Split(tmpEdb.NoticeTime, " ")
+				if len(noticeArr) >= 2 {
+					noticeTime = noticeArr[1]
+				}
+				noticeWeek := noticeArr[0]
+				switch noticeWeek {
+				case "周一":
+					addDay = 1
+				case "周二":
+					addDay = 2
+				case "周三":
+					addDay = 3
+				case "周四":
+					addDay = 4
+				case "周五":
+					addDay = 5
+				case "周六":
+					addDay = 6
+				case "周日":
+					addDay = 7
+				}
+				modifyDate = modifyDate.AddDate(0, 0, addDay-7)
+			}
+
+			//如果正好是提醒日,同时本周没有过记录,那么需要提醒
+			if todayStr == modifyDate.Format(utils.FormatDate) && !nowWeekFirstDay.Before(dataDtTime) {
+				isNotice = true
+			}
+		case "月度":
+			addDay := 0
+			modifyDate := nowMonthLastDay //下次更新日期
+			if tmpEdb.NoticeTime != "" {
+				strArr := strings.Split(tmpEdb.NoticeTime, "日")
+				if len(strArr) >= 2 {
+					noticeTime = strArr[1]
+				}
+				tmpAddDay, tmpErr := strconv.Atoi(strArr[0])
+				if tmpErr != nil {
+					continue
+				}
+				addDay = tmpAddDay - 1
+				modifyDate = nowMonthFirstDay.AddDate(0, 0, addDay)
+			}
+
+			//如果正好是提醒日,同时本月没有过记录,那么需要提醒
+			if todayStr == modifyDate.Format(utils.FormatDate) && !nowMonthFirstDay.Before(dataDtTime) {
+				isNotice = true
+			}
+		case "季度":
+			//提醒时间
+			if tmpEdb.NoticeTime != "" {
+				noticeArr := strings.Split(tmpEdb.NoticeTime, " ")
+				if len(noticeArr) >= 2 {
+					noticeTime = noticeArr[1]
+				}
+			}
+			//每季度更新数据时间
+			//如果正好是提醒日(每季度最后一天),同时本季度没有过记录,那么需要提醒
+			if todayStr == nowQuarterLastDay.Format(utils.FormatDate) && !nowQuarterFirstDay.Before(dataDtTime) {
+				isNotice = true
+			}
+		case "半年度":
+			//提醒时间
+			if tmpEdb.NoticeTime != "" {
+				noticeArr := strings.Split(tmpEdb.NoticeTime, " ")
+				if len(noticeArr) >= 2 {
+					noticeTime = noticeArr[1]
+				}
+			}
+			//每半年度更新数据时间
+			//如果正好是提醒日(每半年度最后一天),同时本半年度没有过记录,那么需要提醒
+			if todayStr == nowHalfYearLastDay.Format(utils.FormatDate) && !nowHalfYearFirstDay.Before(dataDtTime) {
+				isNotice = true
+			}
+		case "年度":
+			//提醒时间
+			if tmpEdb.NoticeTime != "" {
+				noticeArr := strings.Split(tmpEdb.NoticeTime, " ")
+				if len(noticeArr) >= 2 {
+					noticeTime = noticeArr[1]
+				}
+			}
+			//每年度更新数据时间
+			//如果正好是提醒日(每年度最后一天),同时半年度没有过记录,那么需要提醒
+			if todayStr == nowYearLastDay.Format(utils.FormatDate) && !nowYearFirstDay.Before(dataDtTime) {
+				isNotice = true
+			}
+		}
+
+		if isNotice {
+			taskName := "edb_task_" + todayStr + ":" + fmt.Sprint(tmpEdb.TradeCode)
+			//fmt.Println(taskName, ";", tmpEdb.SecName)
+
+			//定时任务
+			tmpTaskFunc := func(ctx context.Context) (funcErr error) {
+				//方法执行结束后,移除定时任务
+				defer func() {
+					EdbTaskNameChannel <- taskName
+				}()
+				// 匿名方法内判断是否发送提醒,因为可能时间到的时候,发现
+				funcIsNotice := false
+				// 再次获取指标数据详情
+				edbData, tmpErr := models.GetLastEdbdataInfo(tmpEdb.TradeCode)
+				if tmpErr != nil {
+					if tmpErr.Error() != utils.ErrNoRow() {
+						funcErr = tmpErr
+						return
+					}
+				}
+				if utils.RunMode == "debug" && debugNoticeUserId > 0 {
+					tmpEdb.UserId = debugNoticeUserId //测试环境的话,发送邮箱给嘉豪
+				}
+
+				//数据过期时间
+				var funcDataDtTime time.Time
+				//如果确实是有数据的
+				if edbData != nil {
+					tmpDataDtTime, _ := time.ParseInLocation(utils.FormatDate, edbData.Dt, time.Now().Location())
+					funcDataDtTime = tmpDataDtTime
+				}
+
+				//提示频度文案
+				notifyFrequency := "每日"
+
+				switch tmpEdb.Frequency {
+				case "周度":
+					notifyFrequency = "每周"
+					modifyDate := nowWeekLastDay //下次更新日期
+					if tmpEdb.NoticeTime != "" {
+						addDay := 7
+						noticeArr := strings.Split(tmpEdb.NoticeTime, " ")
+						if len(noticeArr) >= 2 {
+							noticeTime = noticeArr[1]
+						}
+						noticeWeek := noticeArr[0]
+						switch noticeWeek {
+						case "周一":
+							addDay = 1
+						case "周二":
+							addDay = 2
+						case "周三":
+							addDay = 3
+						case "周四":
+							addDay = 4
+						case "周五":
+							addDay = 5
+						case "周六":
+							addDay = 6
+						case "周日":
+							addDay = 7
+						}
+						modifyDate = modifyDate.AddDate(0, 0, addDay-7)
+					}
+
+					//如果正好是提醒日,同时本周没有过记录,那么需要提醒
+					if todayStr == modifyDate.Format(utils.FormatDate) && !nowWeekFirstDay.Before(funcDataDtTime) {
+						funcIsNotice = true
+					}
+				case "月度":
+					notifyFrequency = "每月"
+					addDay := 0
+					modifyDate := nowMonthLastDay //下次更新日期
+					if tmpEdb.NoticeTime != "" {
+						strArr := strings.Split(tmpEdb.NoticeTime, "日")
+						if len(strArr) >= 2 {
+							noticeTime = strArr[1]
+						}
+						tmpAddDay, tmpErr := strconv.Atoi(strArr[0])
+						if tmpErr != nil {
+							funcErr = tmpErr
+						}
+						addDay = tmpAddDay - 1
+						modifyDate = nowMonthFirstDay.AddDate(0, 0, addDay)
+					}
+
+					//如果正好是提醒日,同时本月没有过记录,那么需要提醒
+					if todayStr == modifyDate.Format(utils.FormatDate) && !nowMonthFirstDay.Before(funcDataDtTime) {
+						funcIsNotice = true
+					}
+				case "季度":
+					notifyFrequency = "每季度"
+					//提醒时间
+					if tmpEdb.NoticeTime != "" {
+						noticeArr := strings.Split(tmpEdb.NoticeTime, " ")
+						if len(noticeArr) >= 2 {
+							noticeTime = noticeArr[1]
+						}
+					}
+					//每季度更新数据时间
+					//如果正好是提醒日(每季度最后一天),同时本季度没有过记录,那么需要提醒
+					if todayStr == nowQuarterLastDay.Format(utils.FormatDate) && !nowQuarterFirstDay.Before(funcDataDtTime) {
+						funcIsNotice = true
+					}
+				case "半年度":
+					notifyFrequency = "每半年度"
+					//提醒时间
+					if tmpEdb.NoticeTime != "" {
+						noticeArr := strings.Split(tmpEdb.NoticeTime, " ")
+						if len(noticeArr) >= 2 {
+							noticeTime = noticeArr[1]
+						}
+					}
+					//每半年度更新数据时间
+					//如果正好是提醒日(每半年度最后一天),同时本半年度没有过记录,那么需要提醒
+					if todayStr == nowHalfYearLastDay.Format(utils.FormatDate) && !nowHalfYearFirstDay.Before(funcDataDtTime) {
+						funcIsNotice = true
+					}
+				case "年度":
+					notifyFrequency = "每年"
+					//提醒时间
+					if tmpEdb.NoticeTime != "" {
+						noticeArr := strings.Split(tmpEdb.NoticeTime, " ")
+						if len(noticeArr) >= 2 {
+							noticeTime = noticeArr[1]
+						}
+					}
+					//每年度更新数据时间
+					//如果正好是提醒日(每年度最后一天),同时半年度没有过记录,那么需要提醒
+					if todayStr == nowYearLastDay.Format(utils.FormatDate) && !nowYearFirstDay.Before(funcDataDtTime) {
+						funcIsNotice = true
+					}
+				}
+
+				//fmt.Println(tmpEdb.TradeCode, " funcIsNotice:", funcIsNotice)
+				//如果还是要提醒
+				if funcIsNotice {
+					//用户微信openid列表数据
+					openIdList := make([]*models.OpenIdList, 0)
+
+					//获取用户信息
+					admin, err := models.GetAdminByAdminId(tmpEdb.UserId)
+					if err != nil {
+						if err.Error() == utils.ErrNoRow() {
+							funcErr = errors.New("openId 列表为空" + strconv.Itoa(tmpEdb.UserId))
+							return
+						} else {
+							return err
+						}
+					}
+					if admin == nil {
+						funcErr = errors.New("openId 列表为空" + strconv.Itoa(tmpEdb.UserId))
+						return
+					}
+					//发送消息
+					if admin.OpenId == "" {
+						funcErr = errors.New("openId 列表为空" + strconv.Itoa(tmpEdb.UserId))
+						return
+					}
+					openIdTemp := new(models.OpenIdList)
+					openIdTemp.OpenId = admin.OpenId
+					openIdList = append(openIdList, openIdTemp)
+
+					first := "数据录入提醒"
+					keyword1 := tmpEdb.SecName + "该更新了"
+					keyword2 := notifyFrequency + " " + tmpEdb.NoticeTime
+					remark := tmpEdb.SecName + "该更新了"
+
+					err = SendWxMsgWithFrequency(first, keyword1, keyword2, remark, openIdList)
+					if err != nil {
+						return err
+					}
+					//发送成功,记录发送日志
+					{
+						sendRecord := new(models.EdbinfoSendMsgRecord)
+						sendRecord.UserId = tmpEdb.UserId
+						sendRecord.TradeCode = tmpEdb.TradeCode
+						sendRecord.CreateTime = time.Now()
+						err = models.AddEdbinfoSendMsgRecord(sendRecord)
+						if err != nil {
+							return err
+						}
+					}
+				}
+				return
+			}
+
+			//添加定时任务(没有设置通知时间就不进行定时任务通知了)
+			spec := ``
+			if noticeTime != "" {
+				noticeArr := strings.Split(noticeTime, ":")
+				if len(noticeArr) == 3 {
+					//spec = ` */20 * * * * * `
+					spec = fmt.Sprintf(` %s %s %s * * * `, noticeArr[2], noticeArr[1], noticeArr[0])
+
+					//定时任务开始的时间
+					tmpTask := task.NewTask(taskName, spec, tmpTaskFunc)
+
+					task.AddTask(taskName, tmpTask)
+					tmpEdbTaskNameMap[taskName] = true
+				}
+			}
+
+		}
+	}
+
+	//将当天的手工指标加入到手工指标池去
+	EdbTaskNameMap[todayStr] = tmpEdbTaskNameMap
+	//开启协程,用来清除定时任务
+	go deleteTask()
+
+	//如果当前定时任务执行次数大于0次,那么需要往手工指标定时任务停止channel写入数据,用来关闭昨天没有执行的的定时任务
+	if EdbTaskRunNum > 0 {
+		//清除昨天的数据
+		EdbTaskStopChannel <- time.Now().AddDate(0, 0, -1).Format(utils.FormatDate)
+	}
+	//手工指标定时任务开始次数累加
+	EdbTaskRunNum++
+	return
+	//fmt.Println(task.NewMapSorter())
+}
+
+// deleteTask 清除已通知的任务
+func deleteTask() {
+	for {
+		select {
+		case taskName := <-EdbTaskNameChannel:
+			task.DeleteTask(taskName)
+			delete(EdbTaskNameMap, taskName)
+
+		case dayStr := <-EdbTaskStopChannel: //收到停止信号,先清除掉那一天的定时任务,
+			for taskName := range EdbTaskNameMap[dayStr] {
+				task.DeleteTask(taskName)
+				delete(EdbTaskNameMap, taskName)
+			}
+			break
+		}
+	}
+}

+ 122 - 11
services/task.go

@@ -3,6 +3,7 @@ package services
 import (
 	"context"
 	"eta/eta_task/services/data"
+	"eta/eta_task/services/data/future_good"
 	"eta/eta_task/utils"
 	"fmt"
 	"github.com/beego/beego/v2/task"
@@ -35,47 +36,96 @@ func releaseTask() {
 	refreshData := task.NewTask("refreshData", "0 30 0,19 * * *", RefreshData)
 	task.AddTask("refreshData", refreshData)
 
+	//同步弘则数据库中来自,钢联,隆众,有色,人工等基础数据--每隔五分钟,同步一次最新数据
+	syncBaseData := task.NewTask("syncBaseData", "0 */5 * * * * ", SyncBaseData)
+	task.AddTask("syncBaseData", syncBaseData)
+
 	syncBaseDataExt := task.NewTask("syncBaseDataExt", "0 */30 * * * * ", SyncBaseDataExt)
 	task.AddTask("syncBaseDataExt", syncBaseDataExt)
 
 	//初始化指标更新状态
 	resetEdbInfoIsUpdate := task.NewTask("resetEdbInfoIsUpdate", "0 0 0 * * *", data.ResetEdbInfoIsUpdate)
 	task.AddTask("resetEdbInfoIsUpdate", resetEdbInfoIsUpdate)
+
+	// 刷新商品数据
+	refreshFutureGoodData := task.NewTask("refreshFutureGoodData", "0 30 0,19 * * *", RefreshFutureGoodData)
+	task.AddTask("refreshFutureGoodData", refreshFutureGoodData)
+
+	//刷新交易所指标数据
+	refreshTradeData := task.NewTask("refreshData", "0 1 4 * * *", RefreshTradeData)
+	task.AddTask("refreshTradeData", refreshTradeData)
+
+	//刷新欧洲天然气指标数据
+	refreshEicData := task.NewTask("refreshData", "0 1 3,7 * * *", RefreshEicData)
+	task.AddTask("refreshEicData", refreshEicData)
+
+	//检测数据服务器
+	checkDataServer := task.NewTask("checkDataServer", "0 */2 * * * * ", checkDataServer)
+	task.AddTask("checkDataServer", checkDataServer)
 }
 
 func RefreshData(cont context.Context) (err error) {
-	fmt.Println("Refresh Start")
 	wg := sync.WaitGroup{}
-	wg.Add(7)
+	wg.Add(16)
+	//hour := time.Now().Hour()
+	//if hour != 0 {
+	//}
+	go data.RefreshDataFromWind(&wg)
 	//同花顺
 	go data.RefreshDataFromThs(&wg)
-	// wind
-	go data.RefreshDataFromWind(&wg)
 	//彭博
 	go data.RefreshDataFromPb(&wg)
 	//彭博财务
 	go data.RefreshDataFromPbFinance(&wg)
 	//手工数据
 	go data.RefreshDataFromManual(&wg)
+	//隆众数据
+	//go data.RefreshDataFromLz(&wg)
+	//有色
+	go data.RefreshDataFromYs(&wg)
+	//钢联
+	go data.RefreshDataFromGl(&wg)
+	//路透
+	go data.RefreshDataFromLt(&wg)
+	//煤炭
+	go data.RefreshDataFromCoal(&wg)
 	//谷歌出行数据
 	go data.RefreshDataFromGoogleTravel(&wg)
+	//钢联化工
+	go data.RefreshDataFromMysteelChemical(&wg)
 	//eia steo报告指标
 	go data.RefreshDataFromEiaSteo(&wg)
+	//UN报告指标
+	go data.RefreshDataFromComTrade(&wg)
+	//卓创报告指标
+	go data.RefreshDataFromSci(&wg)
+	//国家统计局指标
+	go data.RefreshDataFromNationalStatistics(&wg)
+
 	wg.Wait()
-	//计算指标
+	////计算指标
 	data.RefreshDataFromCalculateAll()
+
 	// 预测计算指标
 	data.RefreshPredictDataFromCalculateAll()
-	//time.Sleep(5 * time.Second)
-	//
-	//// 刷新商品期货数据
-	//{
-	//	future_good.RefreshFutureGoodDataFromThs()
-	//}
+	time.Sleep(5 * time.Second)
+	data.RefreshNotice()
+
 	fmt.Println("Refresh End")
 	return
 }
 
+// 刷新基础数据
+func SyncBaseData(cont context.Context) (err error) {
+	now := time.Now()
+	if now.Hour() == 0 || now.Hour() == 19 {
+		return nil
+	}
+	//同步钢联基础数据
+	go data.SyncGlDataBase()
+	return
+}
+
 // SyncBaseDataExt 刷新基础数据
 func SyncBaseDataExt(cont context.Context) (err error) {
 	now := time.Now()
@@ -88,3 +138,64 @@ func SyncBaseDataExt(cont context.Context) (err error) {
 	go data.SetChartEdbEndDate()
 	return
 }
+
+// RefreshFutureGoodData 刷新商品数据
+func RefreshFutureGoodData(cont context.Context) (err error) {
+	future_good.RefreshFutureGoodDataFromThs()
+	fmt.Println("Refresh End")
+	return
+}
+
+// RefreshTradeData 刷新交易所数据
+func RefreshTradeData(cont context.Context) (err error) {
+	wg := sync.WaitGroup{}
+	wg.Add(5)
+
+	//郑商所
+	go data.RefreshDataFromZz(&wg)
+	//上期所
+	go data.RefreshDataFromSh(&wg)
+	//上期能源
+	go data.RefreshDataFromShfe(&wg)
+	//中金所
+	go data.RefreshDataFromCffex(&wg)
+	//大商所
+	go data.RefreshDataFromDl(&wg)
+	wg.Wait()
+	//计算指标
+	data.RefreshDataFromCalculateAll()
+	// 计算预测指标
+	data.RefreshPredictDataFromCalculateAll()
+
+	return
+}
+
+// RefreshEicData 刷新欧洲天然气数据
+func RefreshEicData(cont context.Context) (err error) {
+	wg := sync.WaitGroup{}
+	wg.Add(1)
+
+	//欧洲天然气
+	go data.RefreshDataFromEic(&wg)
+	wg.Wait()
+	//计算指标
+	data.RefreshDataFromCalculateAll()
+	// 计算预测指标
+	data.RefreshPredictDataFromCalculateAll()
+
+	return
+}
+
+// 检测数据服务
+func checkDataServer(cont context.Context) (err error) {
+	//检测wind新服务器
+	go data.CheckWindDataInterface(cont)
+	//检测同花顺数据服务器
+	//go data.CheckThsDataInterface(cont)
+
+	//检测路透数据服务器
+	go data.CheckLtDataInterface(cont)
+	//检测彭博
+	go data.CheckPbDataInterface(cont)
+	return
+}

+ 128 - 0
services/wx_template_msg.go

@@ -0,0 +1,128 @@
+package services
+
+import (
+	"encoding/json"
+	"errors"
+	"eta/eta_task/models"
+	"eta/eta_task/services/alarm_msg"
+	"eta/eta_task/utils"
+	"fmt"
+	"io/ioutil"
+	"net/http"
+	"strings"
+	"time"
+)
+
+func SendWxMsgWithFrequency(first, keyword1, keyword2, remark string, openIdList []*models.OpenIdList) (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)
+	}()
+	utils.FileLog.Info("services SendMsg")
+	/*accessToken, err := models.GetWxAccessToken()
+	if err != nil {
+		msg = "GetWxAccessToken Err:" + err.Error()
+		return
+	}
+	if accessToken == "" {
+		msg = "accessToken is empty"
+		return
+	}
+
+	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
+	templateId := utils.TemplateId
+	//if true{
+	sendMap := make(map[string]interface{})
+	sendData := make(map[string]interface{})
+
+	sendMap["template_id"] = templateId
+
+	//redirectUrl:="report.hzinsights.com/#/allindex/"+strconv.Itoa(v.ResearchReportId)+"/"+v.ReportType;
+
+	//sendMap["url"]=redirectUrl
+	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["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
+	sendMap["data"] = sendData
+	WxSendTemplateMsg(sendUrl, sendMap, openIdList)*/
+	wxAppPath := ""
+	openIdArr := make([]string, len(openIdList))
+	for i, v := range openIdList {
+		openIdArr[i] = v.OpenId
+	}
+	sendInfo := new(SendWxTemplate)
+	sendInfo.WxAppId = utils.AdminWxAppId
+	sendInfo.First = first
+	sendInfo.Keyword1 = keyword1
+	sendInfo.Keyword2 = keyword2
+	sendInfo.RedirectUrl = wxAppPath
+	sendInfo.RedirectTarget = 0
+	sendInfo.TemplateId = utils.TemplateId
+	sendInfo.Resource = wxAppPath
+	sendInfo.OpenIdArr = openIdArr
+	sendInfo.Remark = remark
+	err = SendTemplateMsgV2(sendInfo)
+	return
+}
+
+type SendWxTemplate struct {
+	WxAppId        string   `description:"公众号appId"`
+	First          string   `description:"模板消息first字段"`
+	Keyword1       string   `description:"模板消息keyword1字段"`
+	Keyword2       string   `description:"模板消息keyword2字段"`
+	Keyword3       string   `description:"模板消息keyword3字段"`
+	Keyword4       string   `description:"模板消息keyword4字段"`
+	Productname    string   `description:"模板消息productname字段"`
+	Date           string   `description:"模板消息date字段"`
+	Remark         string   `description:"模板消息remark字段"`
+	TemplateId     string   `description:"模板id"`
+	RedirectUrl    string   `description:"跳转地址"`
+	RedirectTarget int      `description:"小程序跳转目标:1:弘则研报小程序,2:随手办公小程序"`
+	Resource       string   `description:"资源唯一标识"`
+	SendType       int      `description:"发送的消息类型:1:报告,2:指标更新提醒,3:审批通知,4:销售领取客户通知,5:活动取消通知,6活动更改时间通知,7:关注的作者发布报告通知,8:发送日报(周报、双周报、月报)模板消息,9:活动预约/报名时间通知"`
+	OpenIdArr      []string `description:"消息接收者openid"`
+}
+
+// 推送模板消息
+func SendTemplateMsgV2(sendInfo *SendWxTemplate) (err error) {
+	postData, err := json.Marshal(sendInfo)
+	if err != nil {
+		alarm_msg.SendAlarmMsg("SendTemplateMsg json.Marshal Err:"+err.Error(), 1)
+		return err
+	}
+	body := ioutil.NopCloser(strings.NewReader(string(postData)))
+	client := &http.Client{}
+	req, err := http.NewRequest("POST", utils.SendWxTemplateMsgUrl, body)
+	if err != nil {
+		alarm_msg.SendAlarmMsg("SendTemplateMsg http.NewRequest Err:"+err.Error(), 1)
+		return err
+	}
+	contentType := "application/json;charset=utf-8"
+	req.Header.Set("Content-Type", contentType)
+	req.Header.Set("Authorization", utils.SendTemplateMsgAuthorization)
+	resp, err := client.Do(req)
+	if err != nil {
+		fmt.Println("http client.Do Err:" + err.Error())
+		return err
+	}
+	defer resp.Body.Close()
+	b, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return err
+	}
+	result := new(models.BaseResponse)
+	err = json.Unmarshal(b, &result)
+	if err != nil {
+		return err
+	}
+	if result.Ret != 200 {
+		err = errors.New(string(b))
+		return err
+	}
+	return
+}

+ 33 - 3
utils/config.go

@@ -34,8 +34,34 @@ var (
 	SECRET string
 )
 
+var (
+	WxAppId                     string
+	WxAppSecret                 string
+	TemplateId                  string
+	RemindTemplateId            string
+	AppointmentRemindTemplateId string //活动预约通知模板id
+	YbCommonTemplateId          string //研报小程序消息模板ID
+
+	WxYbAppId string //微信研报小程序
+
+	//内部员工公众号(弘则部门)
+	AdminWxAppId     string
+	AdminWxAppSecret string
+)
+
+// 模板消息推送
+var (
+	SendWxTemplateMsgUrl string
+)
+
 // BusinessCode 商家编码
-var BusinessCode string
+
+var (
+	BusinessCode  string //商户号
+	WindServerUrl string //wind api 接口服务器地址
+	LtServerUrl   string //路透 api 接口服务器地址
+	PbServerUrl   string //彭博 api 接口服务器地址
+)
 
 func init() {
 	tmpRunMode, err := web.AppConfig.String("run_mode")
@@ -65,8 +91,6 @@ func init() {
 	}
 	beego.Info(RunMode + " 模式")
 	MYSQL_URL = config["mysql_url"]
-	// 商家编码
-	BusinessCode = config["business_code"]
 	// 系统类型
 	systemType, err := web.AppConfig.String("system_type")
 	if err != nil {
@@ -99,4 +123,10 @@ func init() {
 
 	APPID = config["appid"]
 	SECRET = config["secret"]
+
+	// 商家编码
+	BusinessCode = config["business_code"]
+	WindServerUrl = config["wind_server_url"]
+	LtServerUrl = config["lt_server_url"]
+	PbServerUrl = config["pb_server_url"]
 }

+ 17 - 7
utils/constants.go

@@ -75,18 +75,28 @@ const (
 	DATA_SOURCE_PREDICT_CALCULATE_CJJX                  //预测指标 - 超季节性->49
 	DATA_SOURCE_PREDICT_CALCULATE_NHCC                  //预测指标 - 计算指标(拟合残差)->50
 	DATA_SOURCE_CALCULATE_JP                            //变频->51
+	DATA_SOURCE_CALCULATE_NH                            //年化->52
+	DATA_SOURCE_CALCULATE_KSZS                          //扩散指数->53
+	DATA_SOURCE_PREDICT_CALCULATE_JP                    //预测指标 - 计算指标(降频)->54
+	DATA_SOURCE_PREDICT_CALCULATE_NH                    //预测指标 - 计算指标(年化)->55
+	DATA_SOURCE_PREDICT_CALCULATE_KSZS                  //预测指标 - 计算指标(扩散指数)->56
+	DATA_SOURCE_BAIINFO                                 //百川盈孚 ->57
+	DATA_SOURCE_STOCK_PLANT                             //存量装置 ->58
+	DATA_SOURCE_CALCULATE_CORRELATION                   //相关性计算->59
+	DATA_SOURCE_NATIONAL_STATISTICS                     //国家统计局->60
 )
 
-//http://datawind.hzinsights.com:8040/hz_server
+// 数据刷新频率
+const (
+	DATA_REFRESH        = 7 //7个单位,日/周/月/季度/年
+	DATA_END_DATE_LIMIT = 4 //数据结束日期为,当前日期,加上4年时间
+)
 
 const (
-	Hz_Data_Url    = "http://datawind.hzinsights.com:8040/" //同花顺,万得接口服务地址
-	Hz_Data_PB_Url = "http://datapb.hzinsights.com:8040/"   //彭博接口地址
-	Hz_Data_LT_Url = "http://dataek.hzinsights.com:8040/"   //路透社接口地址
+	SendTemplateMsgAuthorization = "dc855fce962a639faa779cbdd4cd332f"
 )
 
-// 数据刷新频率
+// 模板消息推送类型
 const (
-	DATA_REFRESH        = 7 //7个单位,日/周/月/季度/年
-	DATA_END_DATE_LIMIT = 4 //数据结束日期为,当前日期,加上4年时间
+	TEMPLATE_MSG_YB_VOICE_BROADCAST = 20 //研报语音播报
 )