Browse Source

Merge branch 'edb/frequency_notice' into debug

Roc 3 years ago
parent
commit
20104c2ca2

+ 23 - 2
go.sum

@@ -3,6 +3,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03
 github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
 github.com/PuerkitoBio/goquery v1.6.1 h1:FgjbQZKl5HTmcn4sKBgvx8vv63nhyhIpv7lJpFGCWpk=
 github.com/PuerkitoBio/goquery v1.6.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc=
+github.com/PuerkitoBio/goquery v1.7.1 h1:oE+T06D+1T7LNrn91B4aERsRIeCLJ/oPSa6xB9FPnz4=
+github.com/PuerkitoBio/goquery v1.7.1/go.mod h1:XY0pP4kfraEmmV1O7Uf6XyjoslwsneBbgeDjLYuN8xY=
 github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
@@ -11,10 +13,16 @@ github.com/alicebob/gopher-json v0.0.0-20180125190556-5a6b3ba71ee6/go.mod h1:SGn
 github.com/alicebob/miniredis v2.5.0+incompatible/go.mod h1:8HZjEj4yU0dwhYHky+DxYx+6BMjkBbe5ONFIF1MXffk=
 github.com/aliyun/aliyun-oss-go-sdk v2.1.8+incompatible h1:hLUNPbx10wawWW7DeNExvTrlb90db3UnnNTFKHZEFhE=
 github.com/aliyun/aliyun-oss-go-sdk v2.1.8+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
+github.com/aliyun/aliyun-oss-go-sdk v2.1.10+incompatible h1:D3gwOr9qUUmyyBRDbpnATqu+EkqqmigFd3Od6xO1QUU=
+github.com/aliyun/aliyun-oss-go-sdk v2.1.10+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
 github.com/andybalholm/cascadia v1.1.0 h1:BuuO6sSfQNFRu1LppgbD25Hr2vLYW25JvxHs5zzsLTo=
 github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
+github.com/andybalholm/cascadia v1.2.0 h1:vuRCkM5Ozh/BfmsaTm26kbjm0mIOM3yS5Ek/F5h18aE=
+github.com/andybalholm/cascadia v1.2.0/go.mod h1:YCyR8vOZT9aZ1CHEd8ap0gMVm2aFgxBp0T0eFw1RUQY=
 github.com/antlr/antlr4 v0.0.0-20190325153624-837aa60e2c47 h1:Lp5nUoQzppfVmfZadpzAytNyb5IMtxyOJLzoQS5dExg=
 github.com/antlr/antlr4 v0.0.0-20190325153624-837aa60e2c47/go.mod h1:T7PbCXFs94rrTttyxjbyT5+/1V8T2TYDejxUfHJjw1Y=
+github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e h1:GCzyKMDDjSGnlpl3clrdAK7I1AaVoaiKDOYkUzChZzg=
+github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY=
 github.com/astaxie/beego v1.12.3 h1:SAQkdD2ePye+v8Gn1r4X6IKZM1wd28EyUOVQ3PDSOOQ=
 github.com/astaxie/beego v1.12.3/go.mod h1:p3qIm0Ryx7zeBHLljmd7omloyca1s4yu1a8kM1FkpIA=
 github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f h1:ZNv7On9kyUzm7fvRZumSyy/IUiSC7AzL0I1jKKtwooA=
@@ -54,6 +62,7 @@ github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo
 github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+github.com/garyburd/redigo v1.6.2/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
 github.com/glendc/gopher-json v0.0.0-20170414221815-dc4743023d0c/go.mod h1:Gja1A+xZ9BoviGJNA2E9vFkPjjsl+CoJxSXiQM1UXtw=
 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
@@ -107,9 +116,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/ledisdb/ledisdb v0.0.0-20200510135210-d35789ec47e6/go.mod h1:n931TsDuKuq+uX4v1fulaMbA/7ZLLhjc85h7chZGBCQ=
-github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A=
 github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
-github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U=
+github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
 github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
 github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
@@ -183,6 +191,9 @@ github.com/wenzhenxi/gorsa v0.0.0-20210524035706-528c7050d703 h1:Tiqr9EWpYopXZf6
 github.com/wenzhenxi/gorsa v0.0.0-20210524035706-528c7050d703/go.mod h1:nfhBTKji6rC8lrjyikx8NJ85JHg6ZQam0a9Je+2RVOg=
 github.com/yidane/formula v0.0.0-20200220154705-ec0e6bc4831b h1:e9CwJGPvgp5/7wHQcQg0ImESNHOTQfyrrPj6QYloA6A=
 github.com/yidane/formula v0.0.0-20200220154705-ec0e6bc4831b/go.mod h1:vUhtXwXDSh8NKHxIGRY1HvLhoC4Hba1RL62whvmtPUk=
+github.com/yidane/formula v0.0.0-20210902154546-0782e1736717 h1:9CTJJpdISGxMAELfVlprj5kZEsJEaNAWiobv8ZAd72U=
+github.com/yidane/formula v0.0.0-20210902154546-0782e1736717/go.mod h1:9/dQiKiN04yPMdgsuFmKGuI2Hdp6OmFV9gSWS1col6g=
+github.com/ylywyn/jpush-api-go-client v0.0.0-20190906031852-8c4466c6e369/go.mod h1:Nv7wKD2/bCdKUFNKcJRa99a+1+aSLlCRJFriFYdjz/I=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/gopher-lua v0.0.0-20171031051903-609c9cd26973/go.mod h1:aEV29XrmTYFr3CiRxZeGHpkvbwq+prZduBqMaascyCU=
 go.etcd.io/etcd v3.3.25+incompatible/go.mod h1:yaeTdrJi5lOmYerz05bd8+V7KubZs8YSFZfzsF9A6aI=
@@ -220,6 +231,8 @@ golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLL
 golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20201021035429-f5854403a974 h1:IX6qOQeG5uLjB/hjjwjedwfjND0hgjPMMyO1RoIXQNI=
 golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210614182718-04defd469f4e h1:XpT3nA5TvE525Ne3hInMh6+GETgn27Zfm9dxsThnX2Q=
+golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -240,12 +253,20 @@ golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA=
 golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da h1:b3NXsE2LusjYGGjL5bxEVZZORm/YEFFrWFjR8eFrw/c=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE=
 golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs=
+golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=

+ 32 - 0
index.html

@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+</head>
+<body>
+<div>
+    日度指标,超过三天未更新:
+</div>
+<table border="1" style="border-collapse: collapse;">
+    <thead>
+    <tr>
+        <td>指标编码</td>
+        <td>指标名称</td>
+        <td>指标来源</td>
+        <td>指标数据最后日期</td>
+        <td>指标数据更新日期</td>
+    </tr>
+    </thead>
+    <tbody>
+    <tr>
+        <td></td>
+        <td></td>
+        <td></td>
+        <td></td>
+        <td></td>
+    </tr>
+    </tbody>
+</table>
+</body>
+</html>

+ 39 - 0
models/company_end_date.go

@@ -0,0 +1,39 @@
+package models
+
+import (
+	"rdluck_tools/orm"
+	"time"
+)
+
+// CompanyEndDate 客户产品结束日期表(临时表,只是用来做同步同花顺的截止日期使用)
+type CompanyEndDate struct {
+	Id         int       `description:"自增id"`
+	CompanyId  int       `description:"客户id"`
+	ProductId  int       `description:"产品id"`
+	Status     string    `description:"客户状态:试用,永续,冻结,流失,正式,潜在"`
+	EndDate    time.Time `description:"结束日期"`
+	CreateTime time.Time `description:"记录生成时间"`
+}
+
+// GetAllCompanyProductEndDate 根据获取客户结束日期表列表(临时表,只是用来做同步同花顺的截止日期使用)
+func GetAllCompanyProductEndDate(startDate, endDate string) (list []*CompanyEndDate, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * from company_end_date WHERE create_time >= ? and create_time < ? `
+	_, err = o.Raw(sql, startDate, endDate).QueryRows(&list)
+	return
+}
+
+// GetCompanyEndDate 查询客户产品结束日期记录
+func GetCompanyEndDate(createTime string) (item *CompanyEndDate, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * from company_end_date WHERE create_time > ? limit 1`
+	err = o.Raw(sql, createTime).QueryRow(&item)
+	return
+}
+
+// AddCompanyEndDate 添加客户产品结束日期记录
+func AddCompanyEndDate(companyEndDate *CompanyEndDate) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Insert(companyEndDate)
+	return
+}

+ 9 - 0
models/company_product.go

@@ -163,6 +163,7 @@ type CompanyProduct struct {
 	LoseReason       string    `description:"流失原因"`
 	LossTime         time.Time `description:"流失时间"`
 	CompanyType      string    `description:"客户类型"`
+	OpenCode         string    `description:"开放给第三方的编码,不让第三方定位我们的客户信息"`
 }
 
 //获取产品详情
@@ -215,3 +216,11 @@ WHERE
 	_, err = o.Raw(sql, sellerId, endDate, endDate).QueryRows(&items)
 	return
 }
+
+// GetAllCompanyProduct 获取所有客户产品列表(永续、正式、试用、冻结)
+func GetAllCompanyProduct() (items []*CompanyProduct, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * from company_product WHERE status in ("永续","正式","试用","冻结") `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}

+ 9 - 0
models/data_entry.go

@@ -37,3 +37,12 @@ func GetEdbdataCount(tradeCode, nowDate string) (count int, err error) {
 	err = o.Raw(sql, tradeCode, nowDate).QueryRow(&count)
 	return
 }
+
+// GetEdbInfoByFrequencyNotDay 获取频度非日度 且 提醒时间不为空 的指标数据
+func GetEdbInfoByFrequencyNotDay() (items []*EdbInfo, err error) {
+	sql := `SELECT * FROM edbinfo WHERE frequency!="日度" AND notice_time<>''  `
+	o := orm.NewOrm()
+	o.Using("edb")
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}

+ 42 - 0
models/data_manage/edb_data_table.go → models/data_manage/edb_data_base.go

@@ -2,7 +2,9 @@ package data_manage
 
 import (
 	"errors"
+	"fmt"
 	"hongze/hongze_task/utils"
+	"rdluck_tools/orm"
 	"strconv"
 	"time"
 )
@@ -27,6 +29,18 @@ func GetEdbDataTableName(source int) (tableName string) {
 		tableName = "edb_data_calculate_nszydpjjs"
 	case utils.DATA_SOURCE_MANUAL:
 		tableName = "edb_data_manual"
+	case utils.DATA_SOURCE_LZ:
+		tableName = "edb_data_lz"
+	case utils.DATA_SOURCE_YS:
+		tableName = "edb_data_ys"
+	case utils.DATA_SOURCE_CALCULATE_HBZ:
+		tableName = "edb_data_calculate_hbz"
+	case utils.DATA_SOURCE_CALCULATE_HCZ:
+		tableName = "edb_data_calculate_hcz"
+	case utils.DATA_SOURCE_CALCULATE_BP:
+		tableName = "edb_data_calculate_bp"
+	case utils.DATA_SOURCE_GL:
+		tableName = "edb_data_gl"
 	default:
 		tableName = ""
 		errors.New("无效的渠道:" + strconv.Itoa(source))
@@ -47,6 +61,12 @@ func GetEdbInfoCalculateTableName(source int) (tableName string) {
 		tableName = "edb_info_calculate_tcz"
 	case utils.DATA_SOURCE_CALCULATE_NSZYDPJJS:
 		tableName = "edb_info_calculate_nszydpjjs"
+	case utils.DATA_SOURCE_CALCULATE_HBZ:
+		tableName = "edb_info_calculate_hbz"
+	case utils.DATA_SOURCE_CALCULATE_HCZ:
+		tableName = "edb_info_calculate_hcz"
+	case utils.DATA_SOURCE_CALCULATE_BP:
+		tableName = "edb_info_calculate_bp"
 	default:
 		tableName = ""
 		errors.New("无效的渠道:" + strconv.Itoa(source))
@@ -63,4 +83,26 @@ func GetAddSql(edbInfoId, edbCode, dataTime, timestampStr,value string) (addSql
 	addSql += "," + "'" + timestampStr + "'"
 	addSql += "),"
 	return
+}
+
+func GetEdbDataBaseByCodeAndDate(source int, edbCode string, startDate string) (count int, err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	tableName := GetEdbDataTableName(source)
+	sql := ` SELECT COUNT(1) AS count FROM %s WHERE edb_code=? AND data_time=? `
+	sql = fmt.Sprintf(sql, tableName)
+	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
+	return
+}
+
+type EdbDataBase struct {
+	EdbDataId     int `orm:"column(edb_data_id);pk"`
+	EdbInfoId     int
+	EdbCode       string
+	DataTime      string
+	Value         string
+	Status        int
+	CreateTime    time.Time
+	ModifyTime    time.Time
+	DataTimestamp int64
 }

+ 14 - 0
models/data_manage/edb_data_calculate.go

@@ -1,6 +1,7 @@
 package data_manage
 
 import (
+	"fmt"
 	"rdluck_tools/orm"
 	"time"
 )
@@ -55,4 +56,17 @@ func GetEdbInfoCalculateDetail(edbInfoId int) (list []*EdbInfoCalculateDetail, e
 			WHERE a.edb_info_id=? ORDER BY sort ASC `
 	_, err = o.Raw(sql, edbInfoId).QueryRows(&list)
 	return
+}
+
+func GetEdbInfoCalculateMap(edbInfoId, source int) (list []*EdbInfoCalculateDetail, err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+
+	calculateTableName := GetEdbInfoCalculateTableName(source)
+	sql := ` SELECT a.*,b.start_date,b.end_date,b.edb_type FROM %s AS a
+			INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
+			WHERE a.edb_info_id=? ORDER BY sort ASC `
+	sql = fmt.Sprintf(sql, calculateTableName)
+	_, err = o.Raw(sql, edbInfoId).QueryRows(&list)
+	return
 }

+ 132 - 0
models/data_manage/edb_data_gl.go

@@ -0,0 +1,132 @@
+package data_manage
+
+import (
+	"fmt"
+	"hongze/hongze_task/utils"
+	"rdluck_tools/orm"
+	"strconv"
+	"strings"
+	"time"
+)
+
+func AddEdbDataGlBySql(sqlStr string) (err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	_, err = o.Raw(sqlStr).Exec()
+	return
+}
+
+
+type GlData struct {
+	InputValue string `orm:"column(DATA_VALUE)" description:"日期"`
+	DataTime   string `orm:"column(DATA_DATE)" description:"值"`
+}
+
+func GetGlDataByTradeCode(condition string, pars []interface{}) (item []*GlData, err error) {
+	sql := ` SELECT * FROM mb_index_main_data WHERE 1=1 `
+	o := orm.NewOrm()
+	o.Using("gl")
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY PUBLISH_TIME DESC `
+	_, err = o.Raw(sql, pars).QueryRows(&item)
+	return
+}
+
+func GetEdbDataGlByCodeAndDate(edbCode string, startDate string) (count int, err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	sql := ` SELECT COUNT(1) AS count FROM edb_data_gl WHERE edb_code=? AND data_time=? `
+	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
+	return
+}
+
+func ModifyEdbDataGl(edbInfoId int64, dataTime, value string) (err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	sql := ` UPDATE edb_data_gl SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
+	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
+	return
+}
+
+//刷新钢联指标数据
+func RefreshEdbDataByGl(edbInfoId int, edbCode, startDate, endDate string) (err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	o.Begin()
+	defer func() {
+		if err != nil {
+			o.Rollback()
+		} else {
+			o.Commit()
+		}
+	}()
+
+	if err != nil {
+		return
+	}
+	edbInfoIdStr := strconv.Itoa(edbInfoId)
+	//计算数据
+	var condition string
+	var pars []interface{}
+
+	if edbCode != "" {
+		condition += " AND INDEX_CODE=? "
+		pars = append(pars, edbCode)
+	}
+
+	if startDate != "" {
+		condition += " AND DATA_DATE>=? "
+		pars = append(pars, startDate)
+	}
+
+	if endDate != "" {
+		condition += " AND DATA_DATE<=? "
+		pars = append(pars, endDate)
+	}
+
+	glDataList, err := GetGlDataByTradeCode(condition, pars)
+
+	addSql := ` INSERT INTO edb_data_gl(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
+	var isAdd bool
+	existMap := make(map[string]string)
+	for _, v := range glDataList {
+		item := v
+		if _, ok := existMap[v.DataTime]; !ok {
+			count, err := GetEdbDataGlByCodeAndDate(edbCode, v.DataTime)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				return err
+			}
+			if count <= 0 {
+				eDate := item.DataTime
+				sValue := item.InputValue
+				if sValue != "" {
+					dataTime, err := time.Parse(utils.FormatDate, eDate)
+					if err != nil {
+						return err
+					}
+					timestamp := dataTime.UnixNano() / 1e6
+					timeStr := fmt.Sprintf("%d", timestamp)
+					addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
+					isAdd = true
+				}
+			} else {
+				err = ModifyEdbDataGl(int64(edbInfoId), v.DataTime, v.InputValue)
+				if err != nil {
+					return err
+				}
+			}
+		}
+		existMap[v.DataTime] = v.InputValue
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = o.Raw(addSql).Exec()
+		if err != nil {
+			return err
+		}
+	}
+
+	return
+}

+ 176 - 0
models/data_manage/edb_data_lz.go

@@ -0,0 +1,176 @@
+package data_manage
+
+import (
+	"fmt"
+	"hongze/hongze_task/utils"
+	"rdluck_tools/orm"
+	"strconv"
+	"strings"
+	"time"
+)
+
+type lzSurveyData struct {
+	DataTime   string `orm:"column(data_time)" description:"日期"`
+	InputValue string `orm:"column(input_value)" description:"值"`
+}
+
+type LongzhongSurveyData struct {
+	SurveyDataId         int `orm:"column(survey_data_id);pk"`
+	SurveyProductId      int
+	ProjectQuotaId       int64
+	BreedId              string
+	BreedName            string
+	QuotaId              string
+	QuotaName            string
+	UnitId               string
+	UnitName             string
+	SampleType           int64
+	SampleId             string
+	SampleName           string
+	DeviceId             string
+	Device               string
+	ProductCraftId       string
+	ProductCraft         string
+	ProductLine          string
+	InputMode            int64
+	Frequency            int64
+	InputValue           string
+	TaskShouldFinishTime int64
+	CustomId             string
+	CustomType           int64
+	Custom               string
+	QuotaSampleId        int64
+	TaskActualFinishTime int64
+	AreaName             string
+	ProvinceName         string
+	ResearchStartData    int64
+	ResearchStopData     int64
+	DataTime             string
+}
+
+func GetLzSurveyDataByTradeCode(condition string, pars []interface{}) (item []*lzSurveyData, err error) {
+	sql := ` SELECT  a.* FROM longzhong_survey_data AS a
+				INNER JOIN longzhong_survey_product AS b ON a.survey_product_id=b.survey_product_id
+				WHERE 1=1 `
+	o := orm.NewOrm()
+	o.Using("edb")
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY a.data_time DESC `
+	_, err = o.Raw(sql, pars).QueryRows(&item)
+	return
+}
+
+func GetLzSurveyDataExistByTradeCode(surveyProductId int) (items []*LongzhongSurveyData, err error) {
+	sql := ` SELECT  * FROM longzhong_survey_data WHERE 1=1 AND survey_product_id=? `
+	o := orm.NewOrm()
+	o.Using("edb")
+	_, err = o.Raw(sql, surveyProductId).QueryRows(&items)
+	return
+}
+
+func GetEdbDataLzByCodeAndDate(edbCode string, startDate string) (count int, err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	sql := ` SELECT COUNT(1) AS count FROM edb_data_lz WHERE edb_code=? AND data_time=? `
+	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
+	return
+}
+
+func ModifyEdbDataLz(edbInfoId int64, dataTime, value string) (err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	sql := ` UPDATE edb_data_lz SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
+	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
+	return
+}
+
+//刷新隆众指标数据
+func RefreshEdbDataByLz(edbInfoId int, edbCode, startDate, endDate string) (err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	o.Begin()
+	defer func() {
+		if err != nil {
+			o.Rollback()
+		} else {
+			o.Commit()
+		}
+	}()
+
+	if err != nil {
+		return
+	}
+	edbInfoIdStr := strconv.Itoa(edbInfoId)
+	//计算数据
+	var condition string
+	var pars []interface{}
+
+	if edbCode != "" {
+		condition += " AND b.lz_code=? "
+		pars = append(pars, edbCode)
+	}
+
+	if startDate != "" {
+		condition += " AND a.data_time>=? "
+		pars = append(pars, startDate)
+	}
+
+	if endDate != "" {
+		condition += " AND a.data_time<=? "
+		pars = append(pars, endDate)
+	}
+
+	lzDataList, err := GetLzSurveyDataByTradeCode(condition, pars)
+
+	addSql := ` INSERT INTO edb_data_lz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
+	var isAdd bool
+	for _, v := range lzDataList {
+		item := v
+		count, err := GetEdbDataLzByCodeAndDate(edbCode, v.DataTime)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			return err
+		}
+		if count <= 0 {
+			nowStr := time.Now().Format(utils.FormatDateTime)
+			eDate := item.DataTime
+			sValue := item.InputValue
+			dataTime, err := time.Parse(utils.FormatDate, eDate)
+			if err != nil {
+				return err
+			}
+			timestamp := dataTime.UnixNano() / 1e6
+			timeStr := fmt.Sprintf("%d", timestamp)
+			addSql += "("
+			addSql += edbInfoIdStr + "," + "'" + edbCode + "'" + "," + "'" + eDate + "'" + "," + sValue + "," + "'" + nowStr + "'" +
+				"," + "'" + nowStr + "'" + "," + "1" + "," + "'" + timeStr + "'"
+			addSql += "),"
+			isAdd = true
+		} else {
+			err = ModifyEdbDataLz(int64(edbInfoId), v.DataTime, v.InputValue)
+			if err != nil {
+				return err
+			}
+		}
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = o.Raw(addSql).Exec()
+		if err != nil {
+			return err
+		}
+	}
+
+	maxAndMinItem, err := GetEdbInfoMaxAndMinInfo(utils.DATA_SOURCE_LZ, edbCode)
+	if err != nil {
+		return err
+	}
+	if maxAndMinItem != nil {
+		err = ModifyEdbInfoMaxAndMinInfo(edbInfoId, maxAndMinItem)
+		if err != nil {
+			return err
+		}
+	}
+	return
+}

+ 258 - 0
models/data_manage/edb_data_ys.go

@@ -0,0 +1,258 @@
+/**
+* @Author: jgl
+* @Date: 2021/9/15 10:15
+ */
+
+package data_manage
+
+import (
+	"crypto/md5"
+	"encoding/hex"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"hongze/hongze_task/utils"
+	"io/ioutil"
+	"net/http"
+	"net/url"
+	"rdluck_tools/orm"
+	"strconv"
+	"strings"
+	"time"
+)
+
+//刷新有色指标数据
+func RefreshEdbDataByYs(edbInfoId int, edbCode, startDate, endDate string) (err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	o.Begin()
+	defer func() {
+		if err != nil {
+			o.Rollback()
+		} else {
+			o.Commit()
+		}
+	}()
+
+	token, err := getToken("pqian@hzinsights.com", "hz123456")
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+
+	ysResult, err := getApiData(token, edbCode, startDate, endDate)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+	edbInfoIdStr := strconv.Itoa(edbInfoId)
+	if ysResult != nil && len(ysResult.Data.Content) > 0 {
+		var isAdd bool
+		addSql := ` INSERT INTO edb_data_ys(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
+		existMap := make(map[string]string)
+		frequency := ysResult.Data.Frequency
+		for _, rv := range ysResult.Data.Content {
+			var eDate, sValue string
+			for ck, cv := range rv {
+				if ck == 0 {
+					eDate = cv
+				}
+				if ck == 1 {
+					sValue = strings.Replace(cv, ",", "", -1)
+				}
+			}
+			if sValue=="" {
+				continue
+			}
+			if frequency == "月" {
+				monthDate, err := time.Parse("2006-01", eDate)
+				if err != nil {
+					fmt.Println("time.Parse:" + err.Error())
+				}
+				lastTime := monthDate.AddDate(0, 1, -1)
+				lastYear, lastMonth, lastDay := lastTime.Date()
+				var lastDate string
+				if int(lastMonth) < 10 {
+					lastDate = strconv.Itoa(lastYear) + "-" + "0" + strconv.Itoa(int(lastMonth)) + "-" + strconv.Itoa(lastDay)
+				} else {
+					lastDate = strconv.Itoa(lastYear) + "-" + strconv.Itoa(int(lastMonth)) + "-" + strconv.Itoa(lastDay)
+				}
+				eDate = lastDate
+			}
+			count, err := GetEdbDataBaseByCodeAndDate(utils.DATA_SOURCE_YS, edbCode, eDate)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				return err
+			}
+			if count <= 0 {
+				dataTime, err := time.Parse(utils.FormatDate, eDate)
+				if err != nil {
+					return err
+				}
+				timestamp := dataTime.UnixNano() / 1e6
+				timeStr := fmt.Sprintf("%d", timestamp)
+				if _, ok := existMap[eDate]; !ok {
+					addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
+					isAdd = true
+				}
+			} else {
+				sql := ` UPDATE edb_data_ys SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
+				_, err = o.Raw(sql, sValue, edbInfoId, eDate).Exec()
+			}
+			existMap[eDate] = sValue
+		}
+		if isAdd {
+			addSql = strings.TrimRight(addSql, ",")
+			_, err = o.Raw(addSql).Exec()
+			if err != nil {
+				return err
+			}
+		}
+	}
+
+	maxAndMinItem, err := GetEdbInfoMaxAndMinInfo(utils.DATA_SOURCE_LZ, edbCode)
+	if err != nil {
+		return err
+	}
+	if maxAndMinItem != nil {
+		err = ModifyEdbInfoMaxAndMinInfo(edbInfoId, maxAndMinItem)
+		if err != nil {
+			return err
+		}
+	}
+	return
+}
+
+
+
+const (
+	dataUrl = "https://dataapi.smm.cn/GetData/" //data url (中文)
+	//dataUrl = "https://dataapi.smm.cn/GetDataEn/" //data url (english edition)
+	authUrl = "https://platform.smm.cn/usercenter/auth" // auth url (for all)
+)
+
+type TokenResp struct {
+	Code int       `json:"Code"`
+	Msg  string    `json:"Msg"`
+	Data TokenData `json:"Data"`
+}
+
+type TokenData struct {
+	Token string `json:"Token"`
+}
+
+//获取token
+func getToken(userName string, password string) (string, error) {
+	encryptAuth := md5.New()
+	encryptAuth.Write([]byte(password)) //encrypt password with md5
+	newPassword := hex.EncodeToString(encryptAuth.Sum(nil))
+
+	resp, err := http.PostForm(authUrl, url.Values{"user_name": {userName}, "password": {newPassword}})
+	if err != nil {
+		return "", err
+	}
+
+	defer resp.Body.Close()
+
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		fmt.Println("reponse error", err)
+		return "", err
+	}
+
+	var bodyJsonContent TokenResp
+
+	if err = json.Unmarshal([]byte(body), &bodyJsonContent); err != nil {
+		fmt.Println(err, "unmarsal failure")
+		return "", err
+	}
+
+	var token string
+	if bodyJsonContent.Code == 0 {
+		token = bodyJsonContent.Data.Token
+	}
+
+	//print(token)
+	return token, nil
+}
+
+//request response
+type DataResp struct {
+	Code int      `json:"Code"`
+	Msg  string   `json:"Msg"`
+	Data *ApiData `json:"Data"`
+}
+
+//api data response
+type ApiData struct {
+	Status  int        `json:"Status"` //0 no permission,1 ok
+	Field   []ApiField `json:"Field"`
+	Content [][]string `json:"Content"`
+}
+
+//api title
+type ApiField struct {
+	Unit       string `json:"Unit"`
+	Info       string `json:"Info"`
+	Name       string `json:"Name"`
+	ColumnType string `json:"ColumnType"`
+	ColIndex   uint   `json:"ColIndex"`
+	IsDate     string `json:"IsDate"`
+}
+
+type YsResult struct {
+	Code int64 `json:"Code"`
+	Data struct {
+		CompanyList []interface{} `json:"CompanyList"`
+		Content     [][]string    `json:"Content"`
+		Field       []struct {
+			ColIndex   int64  `json:"ColIndex"`
+			ColumnType string `json:"ColumnType"`
+			Info       string `json:"Info"`
+			IsDate     string `json:"IsDate"`
+			Name       string `json:"Name"`
+			Unit       string `json:"Unit"`
+			DBColName  string `json:"db_col_name"`
+		} `json:"Field"`
+		CountPage   int64  `json:"count_page"`
+		CurrentPage int64  `json:"current_page"`
+		Frequency   string `json:"frequency"`
+		Mindate     string `json:"mindate"`
+		PageNum     int64  `json:"page_num"`
+		Status      int64  `json:"status"`
+		TotalNum    int64  `json:"total_num"`
+	} `json:"Data"`
+	Msg string `json:"Msg"`
+}
+
+/*
+ * request data
+ * sdatetime,edatetime ==>format:yyyy-mm-dd,
+ * apiName ==> data.metal.com(for english)/data.smm.cn (for chinese)
+ */
+func getApiData(token string, apiName string, sdatetime string, edatetime string) (item *YsResult, err error) {
+	reqUrl := dataUrl + apiName
+	resp, err := http.PostForm(reqUrl, url.Values{"token": {token}, "sdatetime": {sdatetime}, "edatetime": {edatetime}})
+	if err != nil {
+		return nil, err
+	}
+
+	defer resp.Body.Close()
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		fmt.Println("response error")
+		return nil, err
+	}
+	utils.FileLog.Info("ys result:" + string(body))
+	dataJsonContent := new(YsResult)
+	if err = json.Unmarshal([]byte(body), &dataJsonContent); err != nil {
+		fmt.Println(err, "data unmarshal failure")
+		return nil, err
+	}
+
+	if dataJsonContent.Code == 200 && len(dataJsonContent.Data.Content) > 0 {
+		return dataJsonContent, nil
+	} else {
+		err = errors.New("code:" + strconv.Itoa(int(dataJsonContent.Code)) + "msg:" + dataJsonContent.Msg)
+	}
+	return nil, nil
+}

+ 9 - 4
models/data_manage/edb_info.go

@@ -41,6 +41,7 @@ type EdbInfoList struct {
 	ClassifyId       int       `description:"分类id"`
 	UniqueCode       string    `description:"指标唯一编码"`
 	CalculateFormula string    `description:"计算公式"`
+	ModifyTime       string    `description:"更新时间"`
 }
 
 type EdbInfoSearchData struct {
@@ -48,14 +49,18 @@ type EdbInfoSearchData struct {
 	Value    float64 `description:"数据"`
 }
 
-func GetEdbInfoByCondition(condition string, pars []interface{}) (item []*EdbInfoList, err error) {
+func GetEdbInfoByCondition(condition string, pars []interface{}, order int) (item []*EdbInfoList, err error) {
 	o := orm.NewOrm()
 	o.Using("data")
 	sql := ` SELECT * FROM edb_info WHERE 1=1 `
 	if condition != "" {
 		sql += condition
 	}
-	sql += ` ORDER BY edb_info_id ASC `
+	if order == 1 {
+		sql += ` ORDER BY end_date ASC `
+	} else {
+		sql += ` ORDER BY edb_info_id ASC `
+	}
 	_, err = o.Raw(sql, pars).QueryRows(&item)
 	return
 }
@@ -89,7 +94,7 @@ func GetEdbInfoMaxAndMinInfo(source int, edbCode string) (item *EdbInfoMaxAndMin
 func ModifyEdbInfoMaxAndMinInfo(edbInfoId int, item *EdbInfoMaxAndMinInfo) (err error) {
 	o := orm.NewOrm()
 	o.Using("data")
-	sql := ` UPDATE edb_info SET start_date=?,end_date=?,min_value=?,max_value=?,modify_time=NOW() WHERE edb_info_id=? `
+	sql := ` UPDATE edb_info SET start_date=?,end_date=?,min_value=?,max_value=?,is_update=2,modify_time=NOW() WHERE edb_info_id=? `
 	_, err = o.Raw(sql, item.MinDate, item.MaxDate, item.MinValue, item.MaxValue, edbInfoId).Exec()
 	return
 }
@@ -134,4 +139,4 @@ func GetQuarterEdbInfo() (item []*EdbInfo, err error) {
 			ORDER BY b.edb_info_id ASC  `
 	_, err = o.Raw(sql).QueryRows(&item)
 	return
-}
+}

+ 142 - 0
models/data_manage/edb_info_calculate_bp.go

@@ -0,0 +1,142 @@
+package data_manage
+
+import (
+	"fmt"
+	"github.com/shopspring/decimal"
+	"hongze/hongze_task/utils"
+	"rdluck_tools/orm"
+	"strconv"
+	"strings"
+	"time"
+)
+
+type EdbInfoCalculateBp struct {
+	EdbInfoCalculateBpId int       `orm:"column(edb_info_calculate_bp_id);pk"`
+	EdbInfoId            int       `description:"指标id"`
+	EdbCode              string    `description:"指标编码"`
+	FromEdbInfoId        int       `description:"计算指标id"`
+	FromEdbCode          string    `description:"计算指标编码"`
+	FromEdbName          string    `description:"计算指标名称"`
+	FromSource           int       `description:"计算指标来源"`
+	FromSourceName       string    `description:"计算指标来源名称"`
+	FromTag              string    `description:"来源指标标签"`
+	Sort                 int       `description:"计算指标名称排序"`
+	CreateTime           time.Time `description:"创建时间"`
+	ModifyTime           time.Time `description:"修改时间"`
+}
+
+//变频
+func RefreshCalculateBp(edbInfoId int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate string) (err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	o.Begin()
+	defer func() {
+		if err != nil {
+			o.Rollback()
+		} else {
+			o.Commit()
+		}
+	}()
+
+	if err != nil {
+		return
+	}
+	edbInfoIdStr := strconv.Itoa(edbInfoId)
+	//计算数据
+
+	//计算数据
+	var condition string
+	var pars []interface{}
+	condition += " AND edb_info_id=? "
+	pars = append(pars, fromEdbInfo.EdbInfoId)
+
+	if startDate != "" {
+		condition += " AND data_time>=? "
+		pars = append(pars, startDate)
+	}
+	if endDate != "" {
+		condition += " AND data_time<=? "
+		pars = append(pars, endDate)
+	}
+
+	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
+	if err != nil {
+		return err
+	}
+	existMap := make(map[string]string)
+	dataLen := len(dataList)
+	addSql := ` INSERT INTO edb_data_calculate_bp(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
+	var isAdd bool
+	for i := 0; i < dataLen; i++ {
+		//当期
+		currentItem := dataList[i]
+		currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
+		var day int
+		if i == 0 {
+			day = int(time.Now().Sub(currentDate).Hours() / float64(24))
+		} else {
+			j := i + 1
+			if j < dataLen {
+				preItem := dataList[j]
+				preDate, _ := time.Parse(utils.FormatDate, preItem.DataTime)
+				day = int(currentDate.Sub(preDate).Hours() / float64(24))
+			}
+		}
+		for k := 1; k <= day; k++ {
+			needDay := currentDate.AddDate(0, 0, k).Format(utils.FormatDate)
+			existKey := edbCode + needDay
+			if _, ok := existMap[existKey]; !ok {
+				currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
+				timestamp := currentDate.UnixNano() / 1e6
+				timestampStr := fmt.Sprintf("%d", timestamp)
+				valStr := decimal.NewFromFloat(currentItem.Value).String()
+				addSql += GetAddSql(edbInfoIdStr, edbCode, needDay, timestampStr, valStr)
+			}
+			existMap[existKey] = needDay
+		}
+		existKey := edbCode + currentItem.DataTime
+		if _, ok := existMap[existKey]; !ok {
+			currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
+			timestamp := currentDate.UnixNano() / 1e6
+			timestampStr := fmt.Sprintf("%d", timestamp)
+			valStr := decimal.NewFromFloat(currentItem.Value).String()
+			addSql += GetAddSql(edbInfoIdStr, edbCode, currentItem.DataTime, timestampStr, valStr)
+		}
+		existMap[existKey] = currentItem.DataTime
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = o.Raw(addSql).Exec()
+		if err != nil {
+			return err
+		}
+	}
+	return
+}
+
+type EdbInfoCalculateBpDetail struct {
+	EdbInfoCalculateBpId int       `orm:"column(edb_info_calculate_bp_id);pk"`
+	EdbInfoId            int       `description:"指标id"`
+	EdbCode              string    `description:"指标编码"`
+	FromEdbInfoId        int       `description:"计算指标id"`
+	FromEdbCode          string    `description:"计算指标编码"`
+	FromEdbName          string    `description:"计算指标名称"`
+	FromSource           int       `description:"计算指标来源"`
+	FromSourceName       string    `description:"计算指标来源名称"`
+	FromTag              string    `description:"来源指标标签"`
+	Sort                 int       `description:"计算指标名称排序"`
+	CreateTime           time.Time `description:"创建时间"`
+	ModifyTime           time.Time `description:"修改时间"`
+	StartDate            string    `description:"开始日期"`
+	EndDate              string    `description:"结束日期"`
+}
+
+func GetEdbInfoCalculateBpDetail(edbInfoId int) (item *EdbInfoCalculateTbzDetail, err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	sql := ` SELECT a.*,b.start_date,b.end_date FROM edb_info_calculate_bp AS a
+			INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
+			WHERE a.edb_info_id=? `
+	err = o.Raw(sql, edbInfoId).QueryRow(&item)
+	return
+}

+ 164 - 0
models/data_manage/edb_info_calculate_hbz.go

@@ -0,0 +1,164 @@
+package data_manage
+
+import (
+	"fmt"
+	"github.com/shopspring/decimal"
+	"hongze/hongze_task/utils"
+	"rdluck_tools/orm"
+	"strconv"
+	"strings"
+	"time"
+)
+
+type EdbInfoCalculateHbz struct {
+	EdbInfoCalculateHbzId int       `orm:"column(edb_info_calculate_hbz_id);pk"`
+	EdbInfoId             int       `description:"指标id"`
+	EdbCode               string    `description:"指标编码"`
+	FromEdbInfoId         int       `description:"计算指标id"`
+	FromEdbCode           string    `description:"计算指标编码"`
+	FromEdbName           string    `description:"计算指标名称"`
+	FromSource            int       `description:"计算指标来源"`
+	FromSourceName        string    `description:"计算指标来源名称"`
+	FromTag               string    `description:"来源指标标签"`
+	Sort                  int       `description:"计算指标名称排序"`
+	CreateTime            time.Time `description:"创建时间"`
+	ModifyTime            time.Time `description:"修改时间"`
+}
+
+//环比值,current:当期,pre:上期 公式: (当期-上期)/上期
+func HbzDiv(current, pre float64) string {
+	if pre == 0 {
+		return ""
+	}
+	currentVal := decimal.NewFromFloat(float64(current))
+	preVal := decimal.NewFromFloat(float64(pre))
+	val, _ := currentVal.Sub(preVal).Div(preVal).Float64()
+	valStr := utils.SubFloatToString(val, 4)
+	return valStr
+}
+
+//刷新环比值数据
+func RefreshCalculateHbz(edbInfoId, source int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate string) (err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	o.Begin()
+	defer func() {
+		if err != nil {
+			o.Rollback()
+		} else {
+			o.Commit()
+		}
+	}()
+
+	if err != nil {
+		return
+	}
+	edbInfoIdStr := strconv.Itoa(edbInfoId)
+
+	var condition string
+	var pars []interface{}
+	condition += " AND edb_info_id=? "
+	pars = append(pars, fromEdbInfo.EdbInfoId)
+
+	if startDate != "" {
+		condition += " AND data_time>=? "
+		pars = append(pars, startDate)
+	}
+	if endDate != "" {
+		condition += " AND data_time<=? "
+		pars = append(pars, endDate)
+	}
+
+	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
+	if err != nil {
+		return err
+	}
+
+	//获取指标所有数据
+	existDataList := make([]*EdbDataBase, 0)
+	dataTableName := GetEdbDataTableName(source)
+	fmt.Println("dataTableName:", dataTableName)
+	sql := `SELECT * FROM %s WHERE edb_info_id=? `
+	sql = fmt.Sprintf(sql, dataTableName)
+	_, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
+	if err != nil {
+		return err
+	}
+	existDataMap := make(map[string]string)
+	for _, v := range existDataList {
+		existDataMap[v.DataTime] = v.Value
+	}
+	addSql := ` INSERT INTO edb_data_calculate_hbz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
+	var isAdd bool
+	existMap := make(map[string]string)
+	dataLen := len(dataList)
+	fmt.Println("dataLen:", dataLen)
+	for i := 0; i < dataLen; i++ {
+		j := i + 1
+		if j < dataLen {
+			//当期
+			currentItem := dataList[i]
+			preItem := dataList[j]
+			if currentItem != nil && preItem != nil {
+				existKey := edbCode + currentItem.DataTime
+				if _, ok := existMap[existKey]; !ok {
+					currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
+					timestamp := currentDate.UnixNano() / 1e6
+					timestampStr := fmt.Sprintf("%d", timestamp)
+					val := HbzDiv(currentItem.Value, preItem.Value)
+					if val != "" {
+						if existVal, findOk := existDataMap[currentItem.DataTime]; !findOk {
+							addSql += GetAddSql(edbInfoIdStr, edbCode, currentItem.DataTime, timestampStr, val)
+							isAdd = true
+						} else {
+							if existVal != val {
+								sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
+								sql = fmt.Sprintf(sql, dataTableName)
+								_, err = o.Raw(sql, val, edbInfoId, currentItem.DataTime).Exec()
+								if err != nil {
+									return err
+								}
+							}
+						}
+					}
+				}
+				existMap[existKey] = currentItem.DataTime
+			}
+		}
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = o.Raw(addSql).Exec()
+		if err != nil {
+			return err
+		}
+	}
+	return
+}
+
+type EdbInfoCalculateHbzDetail struct {
+	EdbInfoCalculateTbzId int       `orm:"column(edb_info_calculate_tbz_id);pk"`
+	EdbInfoId             int       `description:"指标id"`
+	EdbCode               string    `description:"指标编码"`
+	FromEdbInfoId         int       `description:"计算指标id"`
+	FromEdbCode           string    `description:"计算指标编码"`
+	FromEdbName           string    `description:"计算指标名称"`
+	FromSource            int       `description:"计算指标来源"`
+	FromSourceName        string    `description:"计算指标来源名称"`
+	FromTag               string    `description:"来源指标标签"`
+	Sort                  int       `description:"计算指标名称排序"`
+	CreateTime            time.Time `description:"创建时间"`
+	ModifyTime            time.Time `description:"修改时间"`
+	StartDate             string    `description:"开始日期"`
+	EndDate               string    `description:"结束日期"`
+}
+
+func GetEdbInfoCalculateHbzDetail(edbInfoId int) (item *EdbInfoCalculateTbzDetail, err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	sql := ` SELECT a.*,b.start_date,b.end_date FROM edb_info_calculate_hbz AS a
+			INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
+			WHERE a.edb_info_id=? `
+	err = o.Raw(sql, edbInfoId).QueryRow(&item)
+	return
+}

+ 163 - 0
models/data_manage/edb_info_calculate_hcz.go

@@ -0,0 +1,163 @@
+package data_manage
+
+import (
+	"fmt"
+	"github.com/shopspring/decimal"
+	"hongze/hongze_task/utils"
+	"rdluck_tools/orm"
+	"strconv"
+	"strings"
+	"time"
+)
+
+type EdbInfoCalculateHcz struct {
+	EdbInfoCalculateHczId int       `orm:"column(edb_info_calculate_hcz_id);pk"`
+	EdbInfoId             int       `description:"指标id"`
+	EdbCode               string    `description:"指标编码"`
+	FromEdbInfoId         int       `description:"计算指标id"`
+	FromEdbCode           string    `description:"计算指标编码"`
+	FromEdbName           string    `description:"计算指标名称"`
+	FromSource            int       `description:"计算指标来源"`
+	FromSourceName        string    `description:"计算指标来源名称"`
+	FromTag               string    `description:"来源指标标签"`
+	Sort                  int       `description:"计算指标名称排序"`
+	CreateTime            time.Time `description:"创建时间"`
+	ModifyTime            time.Time `description:"修改时间"`
+}
+
+//环差值,current:当期,pre:上期 公式:当期-上期
+func HczDiv(current, pre float64) string {
+	if pre == 0 {
+		return ""
+	}
+	currentVal := decimal.NewFromFloat(current)
+	preVal := decimal.NewFromFloat(pre)
+	val, _ := currentVal.Sub(preVal).Float64()
+	valStr := utils.SubFloatToString(val, 4)
+	return valStr
+}
+
+//刷新环比值数据
+func RefreshCalculateHcz(edbInfoId, source int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate string) (err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	o.Begin()
+	defer func() {
+		if err != nil {
+			o.Rollback()
+		} else {
+			o.Commit()
+		}
+	}()
+
+	if err != nil {
+		return
+	}
+	edbInfoIdStr := strconv.Itoa(edbInfoId)
+
+	var condition string
+	var pars []interface{}
+	condition += " AND edb_info_id=? "
+	pars = append(pars, fromEdbInfo.EdbInfoId)
+
+	if startDate != "" {
+		condition += " AND data_time>=? "
+		pars = append(pars, startDate)
+	}
+	if endDate != "" {
+		condition += " AND data_time<=? "
+		pars = append(pars, endDate)
+	}
+
+	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
+	if err != nil {
+		return err
+	}
+
+	//获取指标所有数据
+	existDataList := make([]*EdbDataBase, 0)
+	dataTableName := GetEdbDataTableName(source)
+	fmt.Println("dataTableName:", dataTableName)
+	sql := `SELECT * FROM %s WHERE edb_info_id=? `
+	sql = fmt.Sprintf(sql, dataTableName)
+	_, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
+	if err != nil {
+		return err
+	}
+	existDataMap := make(map[string]string)
+	for _, v := range existDataList {
+		existDataMap[v.DataTime] = v.Value
+	}
+	addSql := ` INSERT INTO edb_data_calculate_hcz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
+	var isAdd bool
+	existMap := make(map[string]string)
+	dataLen := len(dataList)
+	for i := 0; i < dataLen; i++ {
+		j := i + 1
+		if j < dataLen {
+			//当期
+			currentItem := dataList[i]
+			preItem := dataList[j]
+			if currentItem != nil && preItem != nil {
+				existKey := edbCode + currentItem.DataTime
+				if _, ok := existMap[existKey]; !ok {
+					currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
+					timestamp := currentDate.UnixNano() / 1e6
+					timestampStr := fmt.Sprintf("%d", timestamp)
+					val := HczDiv(currentItem.Value, preItem.Value)
+					if val != "" {
+						if existVal, findOk := existDataMap[currentItem.DataTime]; !findOk {
+							addSql += GetAddSql(edbInfoIdStr, edbCode, currentItem.DataTime, timestampStr, val)
+							isAdd = true
+						} else {
+							if existVal != val {
+								sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
+								sql = fmt.Sprintf(sql, dataTableName)
+								_, err = o.Raw(sql, val, edbInfoId, currentItem.DataTime).Exec()
+								if err != nil {
+									return err
+								}
+							}
+						}
+					}
+				}
+				existMap[existKey] = currentItem.DataTime
+			}
+		}
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = o.Raw(addSql).Exec()
+		if err != nil {
+			return err
+		}
+	}
+	return
+}
+
+type EdbInfoCalculateHczDetail struct {
+	EdbInfoCalculateHczId int       `orm:"column(edb_info_calculate_hcz_id);pk"`
+	EdbInfoId             int       `description:"指标id"`
+	EdbCode               string    `description:"指标编码"`
+	FromEdbInfoId         int       `description:"计算指标id"`
+	FromEdbCode           string    `description:"计算指标编码"`
+	FromEdbName           string    `description:"计算指标名称"`
+	FromSource            int       `description:"计算指标来源"`
+	FromSourceName        string    `description:"计算指标来源名称"`
+	FromTag               string    `description:"来源指标标签"`
+	Sort                  int       `description:"计算指标名称排序"`
+	CreateTime            time.Time `description:"创建时间"`
+	ModifyTime            time.Time `description:"修改时间"`
+	StartDate             string    `description:"开始日期"`
+	EndDate               string    `description:"结束日期"`
+}
+
+func GetEdbInfoCalculateHczDetail(edbInfoId int) (item *EdbInfoCalculateHczDetail, err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	sql := ` SELECT a.*,b.start_date,b.end_date FROM edb_info_calculate_hcz AS a
+			INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
+			WHERE a.edb_info_id=? `
+	err = o.Raw(sql, edbInfoId).QueryRow(&item)
+	return
+}

+ 29 - 21
models/data_manage/edb_info_calculate_ljzzy.go

@@ -88,8 +88,9 @@ func RefreshCalculateLjzzy(edbInfoId int, fromEdbInfo *EdbInfo, edbCode, startDa
 	var isAdd bool
 
 	for yk, yv := range yearMap {
-		if _, mok := yv[2]; !mok {
-			//fmt.Println(yk, yv, "continue")
+		_, oneMonthOk := yv[1]
+		_, twoMonthOk := yv[2]
+		if !oneMonthOk && !twoMonthOk {
 			continue
 		}
 		for i := 1; i <= 12; i++ {
@@ -98,13 +99,32 @@ func RefreshCalculateLjzzy(edbInfoId int, fromEdbInfo *EdbInfo, edbCode, startDa
 			var date string
 			var val float64
 			if i == 1 || i == 2 {
-				dataTwoItem := yv[2]
-				if dataCurrentItem != nil && dataTwoItem != nil {
-					date = dataCurrentItem.DataTime
-					//val = dataTwoItem.Value
-					a := decimal.NewFromFloat(dataTwoItem.Value)
-					b := decimal.NewFromFloat(2.0)
-					val, _ = a.Div(b).Float64()
+				if _, mok := yv[1]; mok { //1月有值
+					if i == 1 {
+						date = dataCurrentItem.DataTime
+						val, _ = decimal.NewFromFloat(dataCurrentItem.Value).Float64() //a.Div(b).Float64()
+					}
+					if i == 2 {
+						dataOneItem := yv[1]
+						date = dataCurrentItem.DataTime
+						twoMonth := decimal.NewFromFloat(dataCurrentItem.Value)
+						oneMonth := decimal.NewFromFloat(dataOneItem.Value)
+						val, _ = twoMonth.Sub(oneMonth).Float64()
+					}
+				} else { //1月无值
+					dataTwoItem := yv[2]
+					if i == 1 {
+						date = strconv.Itoa(yk) + "-01-31"
+						a := decimal.NewFromFloat(dataTwoItem.Value)
+						b := decimal.NewFromFloat(2.0)
+						val, _ = a.Div(b).Float64()
+					}
+					if i == 2 {
+						date = dataCurrentItem.DataTime
+						a := decimal.NewFromFloat(dataTwoItem.Value)
+						b := decimal.NewFromFloat(2.0)
+						val, _ = a.Div(b).Float64()
+					}
 				}
 			} else {
 				dataPreItem := yv[i-1]
@@ -151,18 +171,6 @@ func RefreshCalculateLjzzy(edbInfoId int, fromEdbInfo *EdbInfo, edbCode, startDa
 			return err
 		}
 	}
-
-	maxAndMinItem, err := GetEdbInfoMaxAndMinInfo(utils.DATA_SOURCE_CALCULATE_LJZZY, edbCode)
-	if err != nil {
-		return err
-	}
-	if maxAndMinItem != nil {
-		err = ModifyEdbInfoMaxAndMinInfo(edbInfoId, maxAndMinItem)
-		if err != nil {
-			return err
-		}
-	}
-
 	return
 }
 

+ 38 - 17
models/data_manage/edb_info_calculate_nszydpjjs.go

@@ -47,7 +47,7 @@ func RefreshCalculateNszydpjjs(edbInfoId, source, formulaInt int, fromEdbInfo *E
 	var condition string
 	var pars []interface{}
 	condition += " AND edb_info_id=? "
-	pars = append(pars, edbInfoId)
+	pars = append(pars, fromEdbInfo.EdbInfoId)
 
 	dataList, err := GetEdbDataListAll(condition, pars, source, 0)
 	if err != nil {
@@ -110,11 +110,15 @@ func RefreshCalculateNszydpjjs(edbInfoId, source, formulaInt int, fromEdbInfo *E
 				}
 			}
 			valArrLen := len(valArr)
-			var totalVal float64
+			totalVal := decimal.NewFromFloat(0.00)
 			for _, v := range valArr {
-				totalVal = totalVal + v
+				//totalVal = totalVal + v
+				newDecimal := decimal.NewFromFloat(v)
+				totalVal = totalVal.Add(newDecimal)
 			}
-			af := decimal.NewFromFloat(totalVal)
+			//af := decimal.NewFromFloat(totalVal)
+			af := totalVal
+
 			bf := decimal.NewFromFloat(float64(valArrLen))
 			val, _ := af.Div(bf).Float64()
 			currentDate, err := time.Parse(utils.FormatDate, av)
@@ -125,8 +129,20 @@ func RefreshCalculateNszydpjjs(edbInfoId, source, formulaInt int, fromEdbInfo *E
 			timestamp := currentDate.UnixNano() / 1e6
 			timestampStr := fmt.Sprintf("%d", timestamp)
 			valStr := utils.SubFloatToString(val, 4)
-			addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, valStr)
-			isAdd = true
+
+			count, err := GetEdbDataCalculateNszydpjjsByCodeAndDate(edbCode, av)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				return err
+			}
+			if count <= 0 {
+				addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, valStr)
+				isAdd = true
+			} else {
+				err = ModifyEdbDataCalculateNszydpjjs(int64(edbInfoId), av, valStr)
+				if err != nil {
+					return err
+				}
+			}
 		}
 	}
 
@@ -137,17 +153,6 @@ func RefreshCalculateNszydpjjs(edbInfoId, source, formulaInt int, fromEdbInfo *E
 			return err
 		}
 	}
-
-	maxAndMinItem, err := GetEdbInfoMaxAndMinInfo(utils.DATA_SOURCE_CALCULATE_NSZYDPJJS, edbCode)
-	if err != nil {
-		return err
-	}
-	if maxAndMinItem != nil {
-		err = ModifyEdbInfoMaxAndMinInfo(edbInfoId, maxAndMinItem)
-		if err != nil {
-			return err
-		}
-	}
 	return
 }
 
@@ -177,3 +182,19 @@ func GetEdbInfoCalculateNszydpjjsDetail(edbInfoId int) (item *EdbInfoCalculateNs
 	err = o.Raw(sql, edbInfoId).QueryRow(&item)
 	return
 }
+
+func GetEdbDataCalculateNszydpjjsByCodeAndDate(edbCode string, startDate string) (count int, err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	sql := ` SELECT COUNT(1) AS count FROM edb_data_calculate_nszydpjjs WHERE edb_code=? AND data_time=? `
+	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
+	return
+}
+
+func ModifyEdbDataCalculateNszydpjjs(edbInfoId int64, dataTime, value string) (err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	sql := ` UPDATE edb_data_calculate_nszydpjjs SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
+	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
+	return
+}

+ 8 - 26
models/data_manage/edb_info_calculate_tbz.go

@@ -57,7 +57,7 @@ func RefreshCalculateTbz(edbInfoId int, fromEdbInfo *EdbInfo, edbCode, startDate
 	var condition string
 	var pars []interface{}
 	condition += " AND edb_info_id=? "
-	pars = append(pars, edbInfoId)
+	pars = append(pars, fromEdbInfo.EdbInfoId)
 
 	if startDate != "" {
 		condition += " AND data_time>=? "
@@ -195,17 +195,11 @@ func RefreshCalculateTbz(edbInfoId int, fromEdbInfo *EdbInfo, edbCode, startDate
 						break
 					}
 				} else {
-					nextDateDay := preDate.AddDate(0, 0, 1)
-					nextDateDayStr := nextDateDay.Format(utils.FormatDate)
-
-					preDateDay := preDate.AddDate(0, 0, -1)
-					preDateDayStr := preDateDay.Format(utils.FormatDate)
+					nextDateDay := preDate
+					preDateDay := preDate
 
 					for i := 0; i < 35; i++ {
-						if i >= 1 {
-							nextDateDay = nextDateDay.AddDate(0, 0, i)
-							nextDateDayStr = nextDateDay.Format(utils.FormatDate)
-						}
+						nextDateDayStr := nextDateDay.Format(utils.FormatDate)
 						if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
 							timestamp := currentDate.UnixNano() / 1e6
 							timestampStr := fmt.Sprintf("%d", timestamp)
@@ -226,10 +220,7 @@ func RefreshCalculateTbz(edbInfoId int, fromEdbInfo *EdbInfo, edbCode, startDate
 							}
 							break
 						} else {
-							if i >= 1 {
-								preDateDay = preDate.AddDate(0, 0, -i)
-								preDateDayStr = nextDateDay.Format(utils.FormatDate)
-							}
+							preDateDayStr := preDateDay.Format(utils.FormatDate)
 							if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
 								timestamp := currentDate.UnixNano() / 1e6
 								timestampStr := fmt.Sprintf("%d", timestamp)
@@ -248,9 +239,11 @@ func RefreshCalculateTbz(edbInfoId int, fromEdbInfo *EdbInfo, edbCode, startDate
 										return err
 									}
 								}
+								break
 							}
-							break
 						}
+						nextDateDay = nextDateDay.AddDate(0, 0, 1)
+						preDateDay = preDateDay.AddDate(0, 0, -1)
 					}
 				}
 			}
@@ -263,17 +256,6 @@ func RefreshCalculateTbz(edbInfoId int, fromEdbInfo *EdbInfo, edbCode, startDate
 			return err
 		}
 	}
-
-	maxAndMinItem, err := GetEdbInfoMaxAndMinInfo(utils.DATA_SOURCE_CALCULATE_TBZ, edbCode)
-	if err != nil {
-		return err
-	}
-	if maxAndMinItem != nil {
-		err = ModifyEdbInfoMaxAndMinInfo(edbInfoId, maxAndMinItem)
-		if err != nil {
-			return err
-		}
-	}
 	return
 }
 

+ 16 - 34
models/data_manage/edb_info_calculate_tcz.go

@@ -25,7 +25,6 @@ type EdbInfoCalculateTcz struct {
 	ModifyTime            time.Time `description:"修改时间"`
 }
 
-
 func TczSub(a, b float64) string {
 	af := decimal.NewFromFloat(float64(a))
 	fmt.Println(af)
@@ -52,13 +51,13 @@ func RefreshCalculateTcz(edbInfoId int, fromEdbInfo *EdbInfo, edbCode, startDate
 		return
 	}
 	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
 
+	fmt.Println(edbInfoId, fromEdbInfo.EdbInfoId)
 	//计算数据
 	var condition string
 	var pars []interface{}
 	condition += " AND edb_info_id=? "
-	pars = append(pars, edbInfoId)
+	pars = append(pars, fromEdbInfo.EdbInfoId)
 
 	if startDate != "" {
 		condition += " AND data_time>=? "
@@ -82,8 +81,7 @@ func RefreshCalculateTcz(edbInfoId int, fromEdbInfo *EdbInfo, edbCode, startDate
 
 	addSql := ` INSERT INTO edb_data_calculate_tcz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
 	var isAdd bool
-	for ak, av := range dateArr {
-		fmt.Println(ak, av)
+	for _, av := range dateArr {
 		currentItem := dataMap[av]
 		if currentItem != nil {
 			//当前日期
@@ -170,8 +168,8 @@ func RefreshCalculateTcz(edbInfoId int, fromEdbInfo *EdbInfo, edbCode, startDate
 										return err
 									}
 								}
+								break
 							}
-							break
 						}
 					}
 				} else if fromEdbInfo.Frequency == "季度" || fromEdbInfo.Frequency == "年度" {
@@ -196,17 +194,11 @@ func RefreshCalculateTcz(edbInfoId int, fromEdbInfo *EdbInfo, edbCode, startDate
 						break
 					}
 				} else {
-					nextDateDay := preDate.AddDate(0, 0, 1)
-					nextDateDayStr := nextDateDay.Format(utils.FormatDate)
-
-					preDateDay := preDate.AddDate(0, 0, -1)
-					preDateDayStr := preDateDay.Format(utils.FormatDate)
+					nextDateDay := preDate
+					preDateDay := preDate
 
 					for i := 0; i < 35; i++ {
-						if i >= 1 {
-							nextDateDay = nextDateDay.AddDate(0, 0, i)
-							nextDateDayStr = nextDateDay.Format(utils.FormatDate)
-						}
+						nextDateDayStr := nextDateDay.Format(utils.FormatDate)
 						if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
 							timestamp := currentDate.UnixNano() / 1e6
 							timestampStr := fmt.Sprintf("%d", timestamp)
@@ -227,10 +219,7 @@ func RefreshCalculateTcz(edbInfoId int, fromEdbInfo *EdbInfo, edbCode, startDate
 							}
 							break
 						} else {
-							if i >= 1 {
-								preDateDay = preDate.AddDate(0, 0, -i)
-								preDateDayStr = nextDateDay.Format(utils.FormatDate)
-							}
+							preDateDayStr := preDateDay.Format(utils.FormatDate)
 							if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
 								timestamp := currentDate.UnixNano() / 1e6
 								timestampStr := fmt.Sprintf("%d", timestamp)
@@ -249,14 +238,18 @@ func RefreshCalculateTcz(edbInfoId int, fromEdbInfo *EdbInfo, edbCode, startDate
 										return err
 									}
 								}
+								break
 							}
-							break
 						}
+						nextDateDay = nextDateDay.AddDate(0, 0, 1)
+						preDateDay = preDateDay.AddDate(0, 0, -1)
 					}
 				}
 			}
 		}
 	}
+	fmt.Println("isAdd:", isAdd)
+
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
 		_, err = o.Raw(addSql).Exec()
@@ -264,17 +257,6 @@ func RefreshCalculateTcz(edbInfoId int, fromEdbInfo *EdbInfo, edbCode, startDate
 			return err
 		}
 	}
-
-	maxAndMinItem, err := GetEdbInfoMaxAndMinInfo(utils.DATA_SOURCE_CALCULATE_TCZ, edbCode)
-	if err != nil {
-		return err
-	}
-	if maxAndMinItem != nil {
-		err = ModifyEdbInfoMaxAndMinInfo(edbInfoId, maxAndMinItem)
-		if err != nil {
-			return err
-		}
-	}
 	return
 }
 
@@ -308,15 +290,15 @@ func GetEdbInfoCalculateTczDetail(edbInfoId int) (item *EdbInfoCalculateTczDetai
 func GetEdbDataCalculateTczByCodeAndDate(edbCode string, startDate string) (count int, err error) {
 	o := orm.NewOrm()
 	o.Using("data")
-	sql := ` SELECT COUNT(1) AS count FROM edb_info_calculate_tcz WHERE edb_code=? AND data_time=? `
+	sql := ` SELECT COUNT(1) AS count FROM edb_data_calculate_tcz WHERE edb_code=? AND data_time=? `
 	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
 	return
 }
 
-func ModifyEdbDataCalculateTcz(edbInfoId int64, dataTime,value string) (err error) {
+func ModifyEdbDataCalculateTcz(edbInfoId int64, dataTime, value string) (err error) {
 	o := orm.NewOrm()
 	o.Using("data")
-	sql := ` UPDATE edb_info_calculate_tcz SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
+	sql := ` UPDATE edb_data_calculate_tcz SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
 	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
 	return
 }

+ 1 - 1
models/data_source_longzhong.go

@@ -647,7 +647,7 @@ func ModifLongzhongSurveyProductCode(lzCode string, surveyProductId int) (err er
 	o := orm.NewOrm()
 	o.Using("edb")
 	sql := `UPDATE  longzhong_survey_product
-			SET lz_code= ?
+			SET lz_code= ?,modify_time=NOW()
 			WHERE survey_product_id = ? `
 	_, err = o.Raw(sql, lzCode, surveyProductId).Exec()
 	return

+ 9 - 0
models/db.go

@@ -41,6 +41,13 @@ func init() {
 	data_db, _ := orm.GetDB("data")
 	data_db.SetConnMaxLifetime(10 * time.Minute)
 
+	_ = orm.RegisterDataBase("gl", "mysql", utils.MYSQL_URL_GL)
+	orm.SetMaxIdleConns("gl", 50)
+	orm.SetMaxOpenConns("gl", 100)
+
+	gl, _ := orm.GetDB("gl")
+	gl.SetConnMaxLifetime(10 * time.Minute)
+
 	//注册对象
 	orm.RegisterModel(
 		new(EdbinfoSendMsgRecord),
@@ -68,5 +75,7 @@ func init() {
 		new(Classify),
 		new(ReportSendThsDetail),
 		new(Report),
+		new(CompanyEndDate),
+		new(Edbdata),
 	)
 }

+ 22 - 0
models/edbdata.go

@@ -0,0 +1,22 @@
+package models
+
+import (
+	"rdluck_tools/orm"
+	"time"
+)
+
+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.NewOrm()
+	o.Using("edb")
+	err = o.Raw(sql, tradeCode).QueryRow(&item)
+	return
+}

+ 7 - 0
models/users.go

@@ -74,3 +74,10 @@ func ModifyUserLastViewTime(uid int, lastViewTime string) (err error) {
 	_, err = o.Raw(sql, lastViewTime, uid).Exec()
 	return
 }
+
+// GetUserOpenidListByUserId 根据用户id来获取他的openid列表集合
+func GetUserOpenidListByUserId(userId int) (list []*OpenIdList, err error) {
+	sql := `SELECT open_id FROM user_record WHERE user_id = ? and create_platform = 1`
+	_, err = orm.NewOrm().Raw(sql, userId).QueryRows(&list)
+	return
+}

+ 0 - 12
services/data/data_calculate.go

@@ -84,7 +84,6 @@ func RefreshCalculate(edbInfoIdArr []*data_manage.EdbInfo, edbInfoId int, edbCod
 			if err != nil && err.Error() != utils.ErrNoRow() {
 				return err
 			}
-			fmt.Println("line 89:", edbCode, sk, count)
 			if count <= 0 { //需要存入的数据
 				dataTime, _ := time.Parse(utils.FormatDate, sk)
 				timestamp := dataTime.UnixNano() / 1e6
@@ -112,16 +111,5 @@ func RefreshCalculate(edbInfoIdArr []*data_manage.EdbInfo, edbInfoId int, edbCod
 			return err
 		}
 	}
-
-	maxAndMinItem, err := data_manage.GetEdbInfoMaxAndMinInfo(utils.DATA_SOURCE_CALCULATE, edbCode)
-	if err != nil {
-		return err
-	}
-	if maxAndMinItem != nil {
-		err = data_manage.ModifyEdbInfoMaxAndMinInfo(edbInfoId, maxAndMinItem)
-		if err != nil {
-			return err
-		}
-	}
 	return
 }

+ 22 - 24
services/data/data_pb.go

@@ -31,10 +31,7 @@ func SyncEdbDataByPb(edbInfoId int64, edbCode, startDate, endDate string) (err e
 	pbUrl = fmt.Sprintf(pbUrl, edbCode, startDate, endDate)
 	utils.FileLog.Info("pbUrl:"+pbUrl)
 	body, err := http.Get(pbUrl)
-	fmt.Println(pbUrl)
-	fmt.Println("SyncEdbDataByPb body:")
-	fmt.Println(string(body))
-	utils.FileLog.Info("pb"+string(body))
+	utils.FileLog.Info("pb result:"+string(body))
 
 	if err != nil {
 		return
@@ -57,29 +54,30 @@ func SyncEdbDataByPb(edbInfoId int64, edbCode, startDate, endDate string) (err e
 			val := item.Value[k]
 			field := item.Field[k]
 			ticker := item.Ticker[k]
-
-			count, err := data_manage.GetEdbDataPbCount(addEdbCode, dateTime)
-			if err != nil {
-				return err
-			}
-			if count > 0 {
-				err = data_manage.ModifyEdbDataPb(edbInfoId, addEdbCode, dateTime, val)
+			if field == "PX_LAST" {
+				count, err := data_manage.GetEdbDataPbCount(addEdbCode, dateTime)
 				if err != nil {
 					return err
 				}
-			} else {
-				item := new(data_manage.EdbDataPb)
-				item.EdbCode = addEdbCode
-				item.EdbInfoId = int(edbInfoId)
-				item.CreateTime = time.Now()
-				item.ModifyTime = time.Now()
-				item.DataTime = dateTime
-				item.Value = val
-				item.Status = 1
-				item.Field = field
-				item.Ticker = ticker
-				item.DataTimestamp = dataTimestamp
-				pbList = append(pbList, item)
+				if count > 0 {
+					err = data_manage.ModifyEdbDataPb(edbInfoId, addEdbCode, dateTime, val)
+					if err != nil {
+						return err
+					}
+				} else {
+					item := new(data_manage.EdbDataPb)
+					item.EdbCode = addEdbCode
+					item.EdbInfoId = int(edbInfoId)
+					item.CreateTime = time.Now()
+					item.ModifyTime = time.Now()
+					item.DataTime = dateTime
+					item.Value = val
+					item.Status = 1
+					item.Field = field
+					item.Ticker = ticker
+					item.DataTimestamp = dataTimestamp
+					pbList = append(pbList, item)
+				}
 			}
 		}
 	}

+ 9 - 5
services/data/data_ths.go

@@ -7,14 +7,15 @@ import (
 	"hongze/hongze_task/models/data_manage"
 	"hongze/hongze_task/utils"
 	"rdluck_tools/http"
+	"strings"
 	"time"
 )
 
 type EdbDataFromThs struct {
-	DataVol   int64  `json:"dataVol"`
-	Errmsg    string `json:"errmsg"`
-	Errorcode int64  `json:"errorcode"`
-	Perf      int64  `json:"perf"`
+	DataVol   int64       `json:"dataVol"`
+	Errmsg    string      `json:"errmsg"`
+	Errorcode int64       `json:"errorcode"`
+	Perf      interface{} `json:"perf"`
 	Tables    []struct {
 		ID    []string  `json:"id"`
 		Time  []string  `json:"time"`
@@ -23,13 +24,16 @@ type EdbDataFromThs struct {
 }
 
 func SyncEdbDataByThs(edbInfoId int64, edbCode, startDate, endDate string) (err error) {
-	thsUrl := utils.Hz_Data_Url + `edbInfo/ths?EdbCode=%s&StartDate=%s&EndDate=%s`
+	thsUrl := utils.Hz_Server_Data_Url + `edbInfo/ths?EdbCode=%s&StartDate=%s&EndDate=%s`
 	thsUrl = fmt.Sprintf(thsUrl, edbCode, startDate, endDate)
 	utils.FileLog.Info("thsUrl:" + thsUrl)
 	body, err := http.Get(thsUrl)
 	fmt.Println(thsUrl)
 	fmt.Println("GetEdbDataByThs body:")
 	fmt.Println(string(body))
+	if strings.Contains(string(body), "html") {
+		return nil
+	}
 	utils.FileLog.Info("ths result:" + string(body))
 	if err != nil {
 		return errors.New("SyncEdbDataByThs:" + err.Error() + "; result:" + string(body))

+ 4 - 1
services/data/data_wind.go

@@ -6,6 +6,7 @@ import (
 	"hongze/hongze_task/models/data_manage"
 	"hongze/hongze_task/utils"
 	"rdluck_tools/http"
+	"strings"
 	"time"
 )
 
@@ -30,7 +31,9 @@ func SyncEdbDataByWind(edbInfoId int64, edbCode, startDate, endDate string) (err
 	fmt.Println("SyncEdbDataByWind body:")
 	fmt.Println(string(body))
 	utils.FileLog.Info("wind result:", string(body))
-
+	if strings.Contains(string(body), "html") {
+		return nil
+	}
 	if err != nil {
 		return
 	}

+ 257 - 44
services/data/edb_info.go

@@ -24,18 +24,13 @@ func RefreshDataFromThs(wg *sync.WaitGroup) (err error) {
 	var pars []interface{}
 	condition += " AND source=? "
 	pars = append(pars, utils.DATA_SOURCE_THS)
-	items, err := data_manage.GetEdbInfoByCondition(condition, pars)
+	items, err := data_manage.GetEdbInfoByCondition(condition, pars, 0)
 	if err != nil {
 		return errors.New("GetEdbInfoByCondition:" + err.Error())
 	}
 
-	now := time.Now()
 	var endDate string
-	if now.Hour() == 0 {
-		endDate = time.Now().AddDate(0, 0, -1).Format(utils.FormatDate)
-	} else {
-		endDate = time.Now().Format(utils.FormatDate)
-	}
+	endDate = time.Now().Format(utils.FormatDate)
 	for _, v := range items {
 		startDate := ""
 		if v.Frequency == "日度" {
@@ -91,18 +86,13 @@ func RefreshDataFromWind(wg *sync.WaitGroup) (err error) {
 	var pars []interface{}
 	condition += " AND source=? "
 	pars = append(pars, utils.DATA_SOURCE_WIND)
-	items, err := data_manage.GetEdbInfoByCondition(condition, pars)
+	items, err := data_manage.GetEdbInfoByCondition(condition, pars, 0)
 	if err != nil {
 		return err
 	}
 
-	now := time.Now()
 	var endDate string
-	if now.Hour() == 0 {
-		endDate = time.Now().AddDate(0, 0, -1).Format(utils.FormatDate)
-	} else {
-		endDate = time.Now().Format(utils.FormatDate)
-	}
+	endDate = time.Now().Format(utils.FormatDate)
 	for _, v := range items {
 		startDate := ""
 		if v.Frequency == "日度" {
@@ -149,34 +139,29 @@ func RefreshDataFromPb(wg *sync.WaitGroup) (err error) {
 	var pars []interface{}
 	condition += " AND source=? "
 	pars = append(pars, utils.DATA_SOURCE_PB)
-	items, err := data_manage.GetEdbInfoByCondition(condition, pars)
+
+	items, err := data_manage.GetEdbInfoByCondition(condition, pars, 0)
 	if err != nil {
 		return errors.New("GetEdbInfoByCondition:" + err.Error())
 	}
 
-	now := time.Now()
 	var endDate string
-	if now.Hour() == 0 {
-		endDate = time.Now().AddDate(0, 0, -1).Format(utils.FormatDateUnSpace)
-	} else {
-		endDate = time.Now().Format(utils.FormatDateUnSpace)
-	}
+	endDate = time.Now().Format(utils.FormatDateUnSpace)
 	for _, v := range items {
 		startDate := ""
 		if v.Frequency == "日度" {
-			startDate = v.EndDate.AddDate(0, 0, -utils.DATA_REFRESH).Format(utils.FormatDate)
+			startDate = v.EndDate.AddDate(0, 0, -utils.DATA_REFRESH).Format(utils.FormatDateUnSpace)
 		} else if v.Frequency == "周度" {
-			startDate = v.EndDate.AddDate(0, 0, -(utils.DATA_REFRESH * 7)).Format(utils.FormatDate)
+			startDate = v.EndDate.AddDate(0, 0, -(utils.DATA_REFRESH * 7)).Format(utils.FormatDateUnSpace)
 		} else if v.Frequency == "月度" {
-			startDate = v.EndDate.AddDate(0, -utils.DATA_REFRESH, 0).Format(utils.FormatDate)
+			startDate = v.EndDate.AddDate(0, -utils.DATA_REFRESH, 0).Format(utils.FormatDateUnSpace)
 		} else if v.Frequency == "季度" {
-			startDate = v.EndDate.AddDate(0, -utils.DATA_REFRESH*3, 0).Format(utils.FormatDate)
+			startDate = v.EndDate.AddDate(0, -utils.DATA_REFRESH*3, 0).Format(utils.FormatDateUnSpace)
 		} else if v.Frequency == "年度" {
-			startDate = v.EndDate.AddDate(-utils.DATA_REFRESH, 0, 0).Format(utils.FormatDate)
+			startDate = v.EndDate.AddDate(-utils.DATA_REFRESH, 0, 0).Format(utils.FormatDateUnSpace)
 		} else {
-			startDate = v.EndDate.AddDate(0, 0, -utils.DATA_REFRESH).Format(utils.FormatDate)
+			startDate = v.EndDate.AddDate(0, 0, -utils.DATA_REFRESH).Format(utils.FormatDateUnSpace)
 		}
-		fmt.Println(startDate, endDate)
 		err = SyncEdbDataByPb(int64(v.EdbInfoId), v.EdbCode, startDate, endDate)
 		if err != nil {
 			return errors.New("SyncEdbDataByPb:" + err.Error())
@@ -216,6 +201,17 @@ func CheckDataInterface(cont context.Context) (err error) {
 		if result != "1" {
 			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"检测数据接口:失败提醒", "CheckDataInterface ErrMsg:"+string(body), utils.EmailSendToUsers)
 		}
+
+		//阿里服务器监听
+		checkUrl2 := utils.Hz_Server_Data_Url + `hz_server`
+		body, err = http.Get(checkUrl2)
+		if err != nil {
+			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"检测服务器数据接口:失败提醒", "CheckDataInterface ErrMsg:"+err.Error(), utils.EmailSendToUsers)
+		}
+		result = string(body)
+		if result != "1" {
+			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"检测服务器数据接口:失败提醒", "CheckDataInterface ErrMsg:"+string(body), utils.EmailSendToUsers)
+		}
 	}()
 	return
 }
@@ -247,16 +243,19 @@ func RefreshDataFromCalculateAll() (err error) {
 	var pars []interface{}
 	condition += " AND edb_type=? "
 	pars = append(pars, 2)
+	//condition += " AND edb_info_id=? "
+	//pars = append(pars, 100341)
 
-	items, err := data_manage.GetEdbInfoByCondition(condition, pars)
+	items, err := data_manage.GetEdbInfoByCondition(condition, pars, 0)
 	if err != nil {
 		return err
 	}
 	for _, v := range items {
 		edbInfoId := v.EdbInfoId
 		edbCode := v.EdbCode
-
-		if v.Source == utils.DATA_SOURCE_CALCULATE {
+		source := v.Source
+		fmt.Println(v.EdbInfoId, v.EdbCode, v.EdbName, v.SourceName)
+		if source == utils.DATA_SOURCE_CALCULATE {
 			startDate := ""
 			if v.Frequency == "日度" {
 				startDate = v.EndDate.AddDate(0, 0, -utils.DATA_REFRESH).Format(utils.FormatDate)
@@ -285,12 +284,12 @@ func RefreshDataFromCalculateAll() (err error) {
 				edbInfo, _ := data_manage.GetEdbInfoById(v.FromEdbInfoId)
 				edbInfoList = append(edbInfoList, edbInfo)
 			}
-			fmt.Println("RefreshCalculate:",edbInfoList, edbInfoId, edbCode, v.CalculateFormula, startDate, endDate, edbInfoIdBytes)
+			fmt.Println("RefreshCalculate:", edbInfoList, edbInfoId, edbCode, v.CalculateFormula, startDate, endDate, edbInfoIdBytes)
 			err = RefreshCalculate(edbInfoList, edbInfoId, edbCode, v.CalculateFormula, startDate, endDate, edbInfoIdBytes)
 			if err != nil {
 				return errors.New("RefreshCalculate Err:" + err.Error())
 			}
-		} else if v.Source == utils.DATA_SOURCE_CALCULATE_LJZZY {
+		} else if source == utils.DATA_SOURCE_CALCULATE_LJZZY {
 			calculateLjzzy, err := data_manage.GetEdbInfoCalculateLjzzyDetail(edbInfoId)
 			if err != nil {
 				return errors.New("GetEdbInfoCalculateLjzzyDetail Err:" + err.Error())
@@ -306,7 +305,7 @@ func RefreshDataFromCalculateAll() (err error) {
 			if err != nil {
 				return errors.New("RefreshCalculateLjzzy Err:" + err.Error())
 			}
-		} else if v.Source == utils.DATA_SOURCE_CALCULATE_TBZ {
+		} else if source == utils.DATA_SOURCE_CALCULATE_TBZ {
 			calculateTbz, err := data_manage.GetEdbInfoCalculateTbzDetail(edbInfoId)
 			if err != nil {
 				return errors.New("GetEdbInfoCalculateTbzDetail Err:" + err.Error())
@@ -321,7 +320,7 @@ func RefreshDataFromCalculateAll() (err error) {
 			if err != nil {
 				return errors.New("RefreshCalculateTbz Err:" + err.Error())
 			}
-		} else if v.Source == utils.DATA_SOURCE_CALCULATE_TCZ {
+		} else if source == utils.DATA_SOURCE_CALCULATE_TCZ {
 			calculateTcz, err := data_manage.GetEdbInfoCalculateTczDetail(edbInfoId)
 			if err != nil {
 				return errors.New("GetEdbInfoCalculateTczDetail Err:" + err.Error())
@@ -336,7 +335,7 @@ func RefreshDataFromCalculateAll() (err error) {
 			if err != nil {
 				return errors.New("RefreshCalculateTcz Err:" + err.Error())
 			}
-		} else if v.Source == utils.DATA_SOURCE_CALCULATE_NSZYDPJJS {
+		} else if source == utils.DATA_SOURCE_CALCULATE_NSZYDPJJS {
 			calculateNszydpjjs, err := data_manage.GetEdbInfoCalculateNszydpjjsDetail(edbInfoId)
 			if err != nil {
 				return errors.New("GetEdbInfoCalculateNszydpjjsDetail Err:" + err.Error())
@@ -350,11 +349,67 @@ func RefreshDataFromCalculateAll() (err error) {
 			if err != nil {
 				return errors.New("RefreshCalculateNszydpjjs Err:" + err.Error())
 			}
+		} else if source == utils.DATA_SOURCE_CALCULATE_HBZ {
+			calculateHbz, err := data_manage.GetEdbInfoCalculateHbzDetail(edbInfoId)
+			if err != nil {
+				return errors.New("GetEdbInfoCalculateHbzDetail Err:" + err.Error())
+			}
+			fromEdbInfo, err := data_manage.GetEdbInfoById(calculateHbz.FromEdbInfoId)
+			if err != nil {
+				return errors.New("GetEdbInfoById Err:" + err.Error())
+			}
+			startDate := time.Now().AddDate(-2, -2, 0).Format(utils.FormatDate)
+			endDate := time.Now().Format(utils.FormatDate)
+			err = data_manage.RefreshCalculateHbz(edbInfoId, source, fromEdbInfo, calculateHbz.EdbCode, startDate, endDate)
+			if err != nil {
+				return errors.New("RefreshCalculateTbz Err:" + err.Error())
+			}
+		} else if source == utils.DATA_SOURCE_CALCULATE_HCZ {
+			calculateHcz, err := data_manage.GetEdbInfoCalculateHczDetail(edbInfoId)
+			if err != nil {
+				return errors.New("GetEdbInfoCalculateHczDetail Err:" + err.Error())
+			}
+			fromEdbInfo, err := data_manage.GetEdbInfoById(calculateHcz.FromEdbInfoId)
+			if err != nil {
+				return errors.New("GetEdbInfoById Err:" + err.Error())
+			}
+			startDate := time.Now().AddDate(-2, -2, 0).Format(utils.FormatDate)
+			endDate := time.Now().Format(utils.FormatDate)
+			err = data_manage.RefreshCalculateHcz(edbInfoId, source, fromEdbInfo, calculateHcz.EdbCode, startDate, endDate)
+			if err != nil {
+				return errors.New("RefreshCalculateTbz Err:" + err.Error())
+			}
+		} else if source == utils.DATA_SOURCE_CALCULATE_BP {
+			calculateBp, err := data_manage.GetEdbInfoCalculateBpDetail(edbInfoId)
+			if err != nil {
+				return errors.New("GetEdbInfoCalculateBpDetail Err:" + err.Error())
+			}
+			fromEdbInfo, err := data_manage.GetEdbInfoById(calculateBp.FromEdbInfoId)
+			if err != nil {
+				return errors.New("GetEdbInfoById Err:" + err.Error())
+			}
+			startDate := time.Now().AddDate(-2, -2, 0).Format(utils.FormatDate)
+			endDate := time.Now().Format(utils.FormatDate)
+			err = data_manage.RefreshCalculateBp(edbInfoId, fromEdbInfo, calculateBp.EdbCode, startDate, endDate)
+			if err != nil {
+				return errors.New("RefreshCalculateTbz Err:" + err.Error())
+			}
 		} else {
-			msg := "刷新失败,无效的指标渠道"
+			msg := "刷新失败,无效的指标渠道:source:"+strconv.Itoa(source)+" EdbCode:"+v.EdbCode
 			err = errors.New(msg)
 			return err
 		}
+
+		maxAndMinItem, err := data_manage.GetEdbInfoMaxAndMinInfo(source, edbCode)
+		if err != nil {
+			return err
+		}
+		if maxAndMinItem != nil {
+			err = data_manage.ModifyEdbInfoMaxAndMinInfo(edbInfoId, maxAndMinItem)
+			if err != nil {
+				return err
+			}
+		}
 	}
 	return err
 }
@@ -371,18 +426,13 @@ func RefreshDataFromManual(wg *sync.WaitGroup) (err error) {
 	var pars []interface{}
 	condition += " AND source=? "
 	pars = append(pars, utils.DATA_SOURCE_MANUAL)
-	items, err := data_manage.GetEdbInfoByCondition(condition, pars)
+	items, err := data_manage.GetEdbInfoByCondition(condition, pars, 0)
 	if err != nil {
 		return errors.New("GetEdbInfoByCondition:" + err.Error())
 	}
 
-	now := time.Now()
 	var endDate string
-	if now.Hour() == 0 {
-		endDate = time.Now().AddDate(0, 0, -1).Format(utils.FormatDate)
-	} else {
-		endDate = time.Now().Format(utils.FormatDate)
-	}
+	endDate = time.Now().Format(utils.FormatDate)
 	for _, v := range items {
 		startDate := ""
 		if v.Frequency == "日度" {
@@ -416,3 +466,166 @@ func RefreshDataFromManual(wg *sync.WaitGroup) (err error) {
 	wg.Done()
 	return err
 }
+
+//刷新隆众数据
+func RefreshDataFromLz(wg *sync.WaitGroup) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("RefreshDataFromLz Err:" + err.Error())
+			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "RefreshDataFromLz ErrMsg:"+err.Error(), utils.EmailSendToUsers)
+		}
+	}()
+	var condition string
+	var pars []interface{}
+	condition += " AND source=? "
+	pars = append(pars, utils.DATA_SOURCE_LZ)
+	items, err := data_manage.GetEdbInfoByCondition(condition, pars, 0)
+	if err != nil {
+		return errors.New("GetEdbInfoByCondition:" + err.Error())
+	}
+
+	var endDate string
+	endDate = time.Now().Format(utils.FormatDateUnSpace)
+	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)
+		}
+		fmt.Println(startDate, endDate)
+		err = data_manage.RefreshEdbDataByLz(v.EdbInfoId, v.EdbCode, startDate, endDate)
+		if err != nil {
+			return errors.New("RefreshEdbDataByLz:" + err.Error())
+		}
+		item, err := data_manage.GetEdbInfoMaxAndMinInfo(v.Source, v.EdbCode)
+		if err != nil {
+			return err
+		}
+		if item != nil {
+			err = data_manage.ModifyEdbInfoMaxAndMinInfo(v.EdbInfoId, item)
+			if err != nil {
+				return err
+			}
+		}
+	}
+	wg.Done()
+	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)
+		}
+	}()
+	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())
+	}
+
+	var endDate string
+	endDate = time.Now().Format(utils.FormatDateUnSpace)
+	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)
+		}
+		fmt.Println(startDate, endDate)
+		err = data_manage.RefreshEdbDataByYs(v.EdbInfoId, v.EdbCode, startDate, endDate)
+		if err != nil {
+			return errors.New("RefreshEdbDataByYs:" + err.Error())
+		}
+		item, err := data_manage.GetEdbInfoMaxAndMinInfo(v.Source, v.EdbCode)
+		if err != nil {
+			return err
+		}
+		if item != nil {
+			err = data_manage.ModifyEdbInfoMaxAndMinInfo(v.EdbInfoId, item)
+			if err != nil {
+				return err
+			}
+		}
+	}
+	wg.Done()
+	return err
+}
+
+
+//刷新钢联数据
+func RefreshDataFromGl(wg *sync.WaitGroup) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("RefreshDataFromGl Err:" + err.Error())
+			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "RefreshDataFromYs ErrMsg:"+err.Error(), utils.EmailSendToUsers)
+		}
+	}()
+	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())
+	}
+
+	var endDate string
+	endDate = time.Now().Format(utils.FormatDateUnSpace)
+	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)
+		}
+		fmt.Println(startDate, endDate)
+		err = data_manage.RefreshEdbDataByGl(v.EdbInfoId, v.EdbCode, startDate, endDate)
+		if err != nil {
+			return errors.New("RefreshEdbDataByGl:" + err.Error())
+		}
+		item, err := data_manage.GetEdbInfoMaxAndMinInfo(v.Source, v.EdbCode)
+		if err != nil {
+			return err
+		}
+		if item != nil {
+			err = data_manage.ModifyEdbInfoMaxAndMinInfo(v.EdbInfoId, item)
+			if err != nil {
+				return err
+			}
+		}
+	}
+	wg.Done()
+	return err
+}

+ 167 - 0
services/data/edb_info_notice.go

@@ -0,0 +1,167 @@
+package data
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hongze_task/models/data_manage"
+	"hongze/hongze_task/utils"
+	"time"
+)
+
+//指标更新通知
+func RefreshNotice() (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("RefreshNotice Err:" + err.Error())
+			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "RefreshNotice ErrMsg:"+err.Error(), utils.EmailSendToUsers)
+		}
+	}()
+	var condition string
+	var pars []interface{}
+
+	items, err := data_manage.GetEdbInfoByCondition(condition, pars, 1)
+	if err != nil {
+		return errors.New("GetEdbInfoByCondition:" + err.Error())
+	}
+	//日度
+	dayDiv := `<div style="margin-bottom: 20px;min-width: 1000px;overflow-x: scroll;">
+                <div>日度指标,超过3天未更新:</div>`
+	dayTable := `<table border="1" style="border-collapse: collapse;">
+    <thead>
+    <tr>
+        <td>指标编码</td>
+        <td>指标名称</td>
+        <td>指标来源</td>
+		<td>频度</td>
+        <td>指标数据最后日期</td>
+        <td>指标数据更新日期</td>
+		<td>依赖指标</td>
+    </tr>
+    </thead>`
+	dayTableBody := `<tbody>`
+
+	//周度
+	weekDiv := `<div style="margin-bottom: 20px;min-width: 1000px;overflow-x: scroll;"><div>周度指标,超过7天未更新:</div>`
+	weekTable := `<table border="1" style="border-collapse: collapse;">
+    <thead>
+    <tr>
+        <td>指标编码</td>
+        <td>指标名称</td>
+        <td>指标来源</td>
+		<td>频度</td>
+        <td>指标数据最后日期</td>
+        <td>指标数据更新日期</td>
+ 		<td>依赖指标</td>
+    </tr>
+    </thead>`
+	weekTableBody := `<tbody>`
+
+	monthDiv := `<div style="margin-bottom: 20px;min-width: 1000px;overflow-x: scroll;"><div>月度指标,超过一个月未更新:</div>`
+	monthTable := `<table border="1" style="border-collapse: collapse;">
+    <thead>
+    <tr>
+        <td>指标编码</td>
+        <td>指标名称</td>
+        <td>指标来源</td>
+		<td>频度</td>
+        <td>指标数据最后日期</td>
+        <td>指标数据更新日期</td>
+ 		<td>依赖指标</td>
+    </tr>
+    </thead>`
+	monthTableBody := `<tbody>`
+
+	allDiv := `<hr style="color: red">`
+	allDiv = `<div style="margin-bottom: 20px;min-width: 1000px;overflow-x: scroll;"><div>当前所有指标,按数据日期升序排列:</div>`
+	allTable := `<table border="1" style="border-collapse: collapse;">
+    <thead>
+    <tr>
+        <td>指标编码</td>
+        <td>指标名称</td>
+        <td>指标来源</td>
+		<td>频度</td>
+        <td>指标数据最后日期</td>
+        <td>指标数据更新日期</td>
+    </tr>
+    </thead>`
+	allTableBody := `<tbody>`
+
+	dayDate := time.Now().AddDate(0, 0, -3)
+	weekDate := time.Now().AddDate(0, 0, -7)
+	//月度
+	monthDate := time.Now().AddDate(0, -1, 0)
+
+	for _, v := range items {
+		if v.Frequency == "日度" && v.EndDate.Before(dayDate) {
+			dayTableBody += getTableTr(v, 1)
+		}
+
+		if v.Frequency == "周度" && v.EndDate.Before(weekDate) {
+			weekTableBody += getTableTr(v, 2)
+		}
+
+		if v.Frequency == "月度" && v.EndDate.Before(monthDate) {
+			monthTableBody += getTableTr(v, 3)
+		}
+
+		allTableBody += getTableTr(v, 4)
+	}
+	dayTable += dayTableBody
+	dayTable += ` </tbody></table></div>`
+	noticeSendBody := dayDiv + dayTable
+	noticeSendBody += `<br/>`
+
+	weekTable += weekTableBody
+	weekTable += ` </tbody></table></div>`
+	noticeSendBody += weekDiv + weekTable
+	noticeSendBody += `<br/>`
+
+	monthTable += monthTableBody
+	monthTable += ` </tbody></table></div>`
+	noticeSendBody += monthDiv + monthTable
+	noticeSendBody += `<br/>`
+
+	allTable += allTableBody
+	allTable += ` </tbody></table></div>`
+	noticeSendBody += allDiv + allTable
+
+	utils.SendEmailByHongze("指标更新情况通知", noticeSendBody, utils.RefreshEdbInfoEmailSendToUsers, "", "")
+	//utils.SendEmailByHongze("指标更新情况通知", noticeSendBody, "317699326@qq.com", "", "")
+	return
+}
+
+func getTableTr(item *data_manage.EdbInfoList, tableType int) string {
+	if item != nil {
+		trHtml := ` <tr>
+        <td>` + item.EdbCode + `</td>
+        <td>` + item.EdbName + `</td>
+        <td>` + item.SourceName + `</td>
+		<td>` + item.Frequency + `</td>
+        <td>` + item.EndDate.Format(utils.FormatDate) + `</td>
+        <td>` + item.ModifyTime + `</td>`
+		if item.Source == utils.DATA_SOURCE_CALCULATE ||
+			item.Source == utils.DATA_SOURCE_CALCULATE_LJZZY ||
+			item.Source == utils.DATA_SOURCE_CALCULATE_TBZ ||
+			item.Source == utils.DATA_SOURCE_CALCULATE_TCZ ||
+			item.Source == utils.DATA_SOURCE_CALCULATE_NSZYDPJJS {
+			//获取依赖指标信息
+			if tableType != 4 {
+				//获取依赖指标
+				mapList, _ := data_manage.GetEdbInfoCalculateMap(item.EdbInfoId, item.Source)
+				mapStr:=""
+				for _,v:=range mapList{
+					mapStr+="<p>指标编码:"+v.FromEdbCode+" 来源:"+v.FromSourceName+" 更新日期:"+v.EndDate+"</p>"
+				}
+				trHtml += `<td>` + mapStr + `</td>`
+			}
+		} else {
+			if tableType != 4 {
+				trHtml += `<td></td>`
+			}
+		}
+		trHtml += `</tr>`
+		return trHtml
+	} else {
+		return ""
+	}
+}

+ 85 - 67
services/data_source_longzhong.go

@@ -7,12 +7,14 @@ import (
 	"fmt"
 	"github.com/tealeg/xlsx"
 	"hongze/hongze_task/models"
+	"hongze/hongze_task/models/data_manage"
 	"hongze/hongze_task/utils"
 	"net/url"
 	"os"
 	"path/filepath"
 	"rdluck_tools/http"
 	"strconv"
+	"strings"
 	"time"
 )
 
@@ -1077,18 +1079,29 @@ func GetLzSurveyProductData(cont context.Context) (err error) {
 	paramMap["passWord"] = password
 	paramMap["pageSize"] = 100
 
-	startDate := time.Now().AddDate(-4, 0, 0).UnixNano() / 1e6
+	//startDate := time.Now().AddDate(-4, 0, 0).UnixNano() / 1e6
+	startDateTime,_ := time.Parse(utils.FormatDate,"2018-01-01")
+	startDate := startDateTime.UnixNano()/1e6
 	endDate := time.Now().UnixNano() / 1e6
 
 	for k, v := range priceInfoList {
-		pageIndex := 1
-		if v.EndDate != "" {
-			endDateTime, _ := time.Parse(utils.FormatDate, v.EndDate)
-			startDate = endDateTime.UnixNano() / 1e6
+		existList, err := data_manage.GetLzSurveyDataExistByTradeCode(v.SurveyProductId)
+		existMap := make(map[string]string)
+		for _, v := range existList {
+			existMap[v.DataTime] = v.InputValue
 		}
+		fmt.Println(existMap)
+		pageIndex := 1
+		//if v.EndDate != "" {
+		//	endDateTime, _ := time.Parse(utils.FormatDate, v.EndDate)
+		//	startDate = endDateTime.UnixNano() / 1e6
+		//}
 		if startDate < 0 {
 			startDate = time.Now().AddDate(-4, 0, 0).UnixNano() / 1e6
 		}
+		fmt.Println("startDate:" + time.Now().AddDate(-4, 0, 0).Format(utils.FormatDate))
+		fmt.Println("endDate:" + time.Now().Format(utils.FormatDate))
+
 		for {
 			paramMap["pageNum"] = pageIndex
 			paramMap["projectQuotaId"] = v.ProjectQuotaId
@@ -1102,79 +1115,84 @@ func GetLzSurveyProductData(cont context.Context) (err error) {
 			if err != nil {
 				fmt.Println("postData Err:", err.Error())
 			}
+			fmt.Println("getUrl:" + getUrl)
 			utils.FileLogLz.Info("GetLzSurveyProductData postData:" + string(postData))
 			body, err := http.Post(getUrl, string(postData), "application/json")
 			if err != nil {
 				msg = "获取隆众调研指标数据失败:Err" + err.Error()
 				return err
 			}
-			utils.FileLogLz.Info("GetLzSurveyProductData:" + string(body))
-			dataList := new(models.LzSurveyData)
-			err = json.Unmarshal(body, &dataList)
-			if err != nil {
-				msg = "获取隆众调研指标数据失败:Unmarshal Err " + err.Error() + " ;body:" + string(body)
-				return err
-			}
-			if dataList.Status != "200" {
-				msg = "获取隆众调研指标数据失败:body " + string(body)
-				return nil
-			}
-			for _, n := range dataList.Response.List {
-				//dateTime := time.Unix(n.TaskActualFinishTime/1000, 0)
-				//dateTimeStr := dateTime.Format(utils.FormatDate)
-
-				shouldDateTime := time.Unix(n.TaskShouldFinishTime/1000, 0)
-				shouldDateTimeStr := shouldDateTime.Format(utils.FormatDate)
-
-				//fmt.Println("QuotaSampleID:", n.QuotaSampleID, "taskActualFinishTime:", dateTimeStr, "taskShouldFinishTime:", shouldDateTimeStr)
-				count, err := models.GetLzSurveyDataCount(v.SurveyProductId, int(v.QuotaSampleId), shouldDateTimeStr)
+			if !strings.Contains(string(body), "<html>") {
+				utils.FileLogLz.Info("GetLzSurveyProductData:" + string(body))
+				dataList := new(models.LzSurveyData)
+				err = json.Unmarshal(body, &dataList)
 				if err != nil {
-					msg = "获取隆众调研指标数据失败:err " + err.Error()
+					msg = "获取隆众调研指标数据失败:Unmarshal Err " + err.Error() + " ;body:" + string(body)
 					return err
 				}
-				if count <= 0 {
-					item := new(models.LongzhongSurveyData)
-					item.SurveyProductId = v.SurveyProductId
-					item.ProjectQuotaId = n.ProjectQuotaID
-					item.BreedId = n.BreedID
-					item.BreedName = n.BreedName
-					item.QuotaId = n.QuotaID
-					item.QuotaName = n.QuotaName
-					item.UnitId = n.UnitID
-					item.UnitName = n.UnitName
-					item.SampleType = n.SampleType
-					item.SampleId = n.SampleID
-					item.SampleName = n.SampleName
-					item.DeviceId = n.DeviceID
-					item.Device = n.Device
-					item.ProductCraftId = n.ProductCraftID
-					item.ProductCraft = n.ProductCraft
-					item.ProductLine = n.ProductLine
-					item.InputMode = n.InputMode
-					item.Frequency = n.Frequency
-					item.InputValue = n.InputValue
-					item.TaskShouldFinishTime = n.TaskShouldFinishTime
-					item.CustomId = n.CustomID
-					item.CustomType = n.CustomType
-					item.Custom = n.Custom
-					item.QuotaSampleId = n.QuotaSampleID
-					item.TaskActualFinishTime = n.TaskActualFinishTime
-					//item.AreaName = n.AreaName.(string)
-					//item.ProvinceName = n.ProvinceName.(string)
-					item.ResearchStartData = n.ResearchStartDate
-					item.ResearchStopData = n.ResearchStopDate
-					item.DataTime = shouldDateTimeStr
-					err = models.AddLongzhongSurveyData(item)
-					if err != nil {
-						msg = "新增调研指标数据失败:err " + err.Error()
-						return err
+				if dataList.Status != "200" {
+					msg = "获取隆众调研指标数据失败:body " + string(body)
+					return nil
+				}
+				for _, n := range dataList.Response.List {
+					//dateTime := time.Unix(n.TaskActualFinishTime/1000, 0)
+					//dateTimeStr := dateTime.Format(utils.FormatDate)
+
+					shouldDateTime := time.Unix(n.TaskShouldFinishTime/1000, 0)
+					shouldDateTimeStr := shouldDateTime.Format(utils.FormatDate)
+
+					//fmt.Println("QuotaSampleID:", n.QuotaSampleID, "taskActualFinishTime:", dateTimeStr, "taskShouldFinishTime:", shouldDateTimeStr)
+					//count, err := models.GetLzSurveyDataCount(v.SurveyProductId, int(v.QuotaSampleId), shouldDateTimeStr)
+					//if err != nil {
+					//	msg = "获取隆众调研指标数据失败:err " + err.Error()
+					//	return err
+					//}
+					if _, ok := existMap[shouldDateTimeStr]; !ok {
+						item := new(models.LongzhongSurveyData)
+						item.SurveyProductId = v.SurveyProductId
+						item.ProjectQuotaId = n.ProjectQuotaID
+						item.BreedId = n.BreedID
+						item.BreedName = n.BreedName
+						item.QuotaId = n.QuotaID
+						item.QuotaName = n.QuotaName
+						item.UnitId = n.UnitID
+						item.UnitName = n.UnitName
+						item.SampleType = n.SampleType
+						item.SampleId = n.SampleID
+						item.SampleName = n.SampleName
+						item.DeviceId = n.DeviceID
+						item.Device = n.Device
+						item.ProductCraftId = n.ProductCraftID
+						item.ProductCraft = n.ProductCraft
+						item.ProductLine = n.ProductLine
+						item.InputMode = n.InputMode
+						item.Frequency = n.Frequency
+						item.InputValue = n.InputValue
+						item.TaskShouldFinishTime = n.TaskShouldFinishTime
+						item.CustomId = n.CustomID
+						item.CustomType = n.CustomType
+						item.Custom = n.Custom
+						item.QuotaSampleId = n.QuotaSampleID
+						item.TaskActualFinishTime = n.TaskActualFinishTime
+						//item.AreaName = n.AreaName.(string)
+						//item.ProvinceName = n.ProvinceName.(string)
+						item.ResearchStartData = n.ResearchStartDate
+						item.ResearchStopData = n.ResearchStopDate
+						item.DataTime = shouldDateTimeStr
+						err = models.AddLongzhongSurveyData(item)
+						if err != nil {
+							msg = "新增调研指标数据失败:err " + err.Error()
+							return err
+						}
+					} else {
+						fmt.Println("exist:", shouldDateTimeStr)
 					}
 				}
-			}
-			pageIndex = pageIndex + 1
-			totalPage := utils.PageCount(int(dataList.Response.Total), 100)
-			if pageIndex > totalPage {
-				break
+				pageIndex = pageIndex + 1
+				totalPage := utils.PageCount(int(dataList.Response.Total), 100)
+				if pageIndex > totalPage {
+					break
+				}
 			}
 		}
 

+ 136 - 3
services/report_push.go

@@ -19,7 +19,7 @@ import (
 //	SendReportToThs(report)
 //}
 
-// SendWaitReport 定时向同花顺推送报告
+// SendWaitReport 定时向同花顺推送报告(定时任务)
 func SendWaitReport(cont context.Context) (err error) {
 	defer func() {
 		if err != nil {
@@ -27,7 +27,6 @@ func SendWaitReport(cont context.Context) (err error) {
 			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
@@ -41,6 +40,87 @@ func SendWaitReport(cont context.Context) (err error) {
 	return
 }
 
+// SyncWxGroupEveryDay 每日定时向同花顺同步客户时间
+func SyncWxGroupEveryDay(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)
+		}
+	}()
+
+	//查询校验当天数据是否已经生成
+	_, err = models.GetCompanyEndDate(time.Now().Format(utils.FormatDate))
+	if err == nil || err.Error() != utils.ErrNoRow() {
+		err = errors.New(fmt.Sprint(time.Now().Format(utils.FormatDate), "当天数据已经同步"))
+		return
+	}
+
+	//永续、正式、试用、冻结
+	list, err := models.GetAllCompanyProduct()
+	if err != nil {
+		return
+	}
+	timeLoc, _ := time.LoadLocation("Asia/Shanghai")
+	//需要入库的数据
+	companyEndDateMap := make(map[string]*models.CompanyEndDate)
+	//实际需要推送的数据
+	companyEndDatePushMap := make(map[string]*models.CompanyEndDate)
+
+	//微信群组开放编号code
+	companyProductOpenCode := make(map[string]string)
+	for _, companyProduct := range list {
+		key := fmt.Sprint(companyProduct.CompanyId, "_", companyProduct.ProductId)
+
+		endDate, _ := time.ParseInLocation(utils.FormatDate, companyProduct.EndDate, timeLoc)
+		if companyProduct.Status == "冻结" {
+			endDate = time.Now().AddDate(0, 0, -1)
+		}
+		tmpCompanyEndDate := &models.CompanyEndDate{
+			CompanyId:  companyProduct.CompanyId,
+			ProductId:  companyProduct.ProductId,
+			Status:     companyProduct.Status,
+			EndDate:    endDate,
+			CreateTime: time.Now(),
+		}
+		companyEndDateMap[key] = tmpCompanyEndDate
+		companyEndDatePushMap[key] = tmpCompanyEndDate
+
+		companyProductOpenCode[key] = companyProduct.OpenCode
+	}
+
+	startDate := time.Now().AddDate(0, 0, -1).Format(utils.FormatDate)
+	endDate := time.Now().Format(utils.FormatDate)
+	endDateList, err := models.GetAllCompanyProductEndDate(startDate, endDate)
+	for _, endDate := range endDateList {
+		key := fmt.Sprint(endDate.CompanyId, "_", endDate.ProductId)
+		if companyEndDate, ok := companyEndDatePushMap[key]; ok {
+			if companyEndDate.Status == "冻结" {
+				//获取当天的零点时间
+				endDateStr := time.Now().AddDate(0, 0, -1).Format(utils.FormatDate)
+				companyEndDate.EndDate, _ = time.ParseInLocation(utils.FormatDate, endDateStr, timeLoc)
+			}
+			if companyEndDate.EndDate.Equal(endDate.EndDate) {
+				delete(companyEndDatePushMap, key)
+			}
+		}
+	}
+
+	for _, companyEndDate := range companyEndDatePushMap {
+		fmt.Println("待推送数据:", companyEndDate)
+		key := fmt.Sprint(companyEndDate.CompanyId, "_", companyEndDate.ProductId)
+		//同步至同花顺
+		if openCode, ok := companyProductOpenCode[key]; ok {
+			SyncWxGroup(openCode, companyEndDate.EndDate.Format(utils.FormatDate))
+		}
+	}
+
+	for _, companyEndDate := range companyEndDateMap {
+		models.AddCompanyEndDate(companyEndDate)
+	}
+	return
+}
+
 var permissionMap map[string]string = map[string]string{
 	"化里化外日评":    "原油,PTA,MEG,织造终端,甲醇,聚烯烃,沥青,橡胶,苯乙烯,玻璃纯碱",
 	"股债日评":      "宏观,利率债,原油,PTA,MEG,织造终端,甲醇,聚烯烃,沥青,橡胶,苯乙烯,玻璃纯碱,钢材,铁矿,双焦(焦煤、焦炭),有色(铜、铝),有色(锌、铅),镍+不锈钢",
@@ -63,12 +143,13 @@ var permissionMap map[string]string = map[string]string{
 	"黑色百家谈":     "钢材,铁矿,双焦(焦煤、焦炭)",
 }
 
-//同花顺返回信息
+//TshResult 同花顺返回信息
 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 "日度点评":
@@ -227,3 +308,55 @@ func SendThs(title, labelStr, abstract, jumpBaseUrl, logoUrl string) (err error)
 	}
 	return
 }
+
+// SyncWxGroup 同步同花顺 微信群信息
+func SyncWxGroup(openCompanyCode, deadline 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_SyncWxGroupUrl
+
+	openCompanyCode, err = gorsa.PublicEncrypt(openCompanyCode, pubKey)
+	if err != nil {
+		return
+	}
+	deadline, err = gorsa.PublicEncrypt(deadline, pubKey)
+	if err != nil {
+		return
+	}
+
+	//开始发送
+	client := http.Client{}
+	form := url.Values{}
+	form.Add("thirdWechatGroupId", openCompanyCode)
+	form.Add("deadline", deadline)
+
+	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
+}

+ 433 - 5
services/task.go

@@ -2,12 +2,17 @@ package services
 
 import (
 	"context"
+	"errors"
 	"fmt"
 	"github.com/beego/beego/v2/task"
+	"hongze/hongze_task/models"
 	"hongze/hongze_task/services/company_contract"
 	"hongze/hongze_task/services/data"
 	"hongze/hongze_task/utils"
+	"strconv"
+	"strings"
 	"sync"
+	"time"
 )
 
 func Task() {
@@ -45,7 +50,7 @@ func Task() {
 	task.AddTask("存量客户数据统计", stackCompanyStatistic)
 
 	// 定时往同花顺推送报告
-	sendWaitReport := task.NewTask("checkDataInterface", "0 */1 * * * * ", SendWaitReport)
+	sendWaitReport := task.NewTask("sendWaitReport", "0 */1 * * * * ", SendWaitReport)
 	task.AddTask("定时往同花顺推送报告", sendWaitReport)
 
 	task.StartTask()
@@ -54,6 +59,11 @@ func Task() {
 	//GetLzProductDetail()
 	//LzExportExcel()
 	//GetLzProductList()GetLzProductDetail
+
+	// 定时新增手工指标数据提醒
+	addEdbTask := task.NewTask("sendWaitReport", "0 * * * * * ", AddEdbTask)
+	task.AddTask("定时新增手工指标数据提醒", addEdbTask)
+
 	fmt.Println("task end")
 }
 
@@ -85,8 +95,8 @@ func releaseTask() {
 	sendEmail := task.NewTask("sendEmail", "0 0 12 * * 0 ", SendEmail)
 	task.AddTask("sendEmail", sendEmail)
 
-	oneMinute := task.NewTask("oneMinute", "0 */1 7-23 * * * ", OneMinute)
-	task.AddTask("oneMinute", oneMinute)
+	//oneMinute := task.NewTask("oneMinute", "0 */1 7-23 * * * ", OneMinute)
+	//task.AddTask("oneMinute", oneMinute)
 
 	// 正式/试用 用户到期提醒
 	companyRemind := task.NewTask("companyRemind", "0 30 08 * * *", CompanyRemind)
@@ -100,6 +110,10 @@ func releaseTask() {
 	refreshData := task.NewTask("refreshData", "0 1 0,19 * * *", RefreshData)
 	task.AddTask("refreshData", refreshData)
 
+	// 定时往同花顺同步微信群的截止日期(凌晨4点)
+	syncThsWxGroupEveryDay := task.NewTask("syncThsWxGroupEveryDay", "0 1 4 * * * ", SyncWxGroupEveryDay)
+	task.AddTask("定时往同花顺同步微信群的截止日期", syncThsWxGroupEveryDay)
+
 	//刷新计算指标数据
 	//refreshCalculateData := task.NewTask("refreshCalculateData", "0 15 0,19 * * *", RefreshCalculateData)
 	//task.AddTask("refreshCalculateData", refreshCalculateData)
@@ -142,7 +156,7 @@ func OneMinute(cont context.Context) (err error) {
 
 func RefreshData(cont context.Context) (err error) {
 	wg := sync.WaitGroup{}
-	wg.Add(4)
+	wg.Add(7)
 	//wind
 	go data.RefreshDataFromWind(&wg)
 	//同花顺
@@ -151,8 +165,16 @@ func RefreshData(cont context.Context) (err error) {
 	go data.RefreshDataFromPb(&wg)
 	//手工数据
 	go data.RefreshDataFromManual(&wg)
+	//隆众数据
+	go data.RefreshDataFromLz(&wg)
+	//有色
+	go data.RefreshDataFromYs(&wg)
+	//钢联
+	go data.RefreshDataFromGl(&wg)
 	wg.Wait()
-	go data.RefreshDataFromCalculateAll()
+	data.RefreshDataFromCalculateAll()
+	time.Sleep(2 * time.Second)
+	data.RefreshNotice()
 	return
 }
 
@@ -179,3 +201,409 @@ endData:=time.Now().UnixNano()/1e6
 	dateTime:=time.Unix(endData/1000,0)
 	fmt.Println(dateTime)
 */
+
+func AddEdbTask(cont context.Context) (err error) {
+	//每次先清除掉昨天的定时任务,再次开启今天的定时任务
+	for taskName := range TaskNameMap {
+		task.DeleteTask(taskName)
+		delete(TaskNameMap, taskName)
+	}
+	edbTaskAddTask()
+	return
+}
+
+// TaskNameMap 定时任务名称map集合
+var TaskNameMap map[string]bool
+
+func edbTaskAddTask() {
+	list, err := models.GetEdbInfoByFrequencyNotDay()
+	if err != nil {
+		fmt.Println("查询获取频度非日度 且 提醒时间不为空 的指标数据失败,Err:", err.Error())
+	}
+	TaskNameMap = 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()
+
+	//失败列表
+	failList := make([]string, 0)
+
+	//定时任务
+	edbTaskNameChannel := make(chan string)
+	//定时任务数量
+	taskNum := 0
+
+	//task.globalTaskManager.adminTaskList
+	for _, edb := range list {
+		tmpEdb := edb            //指标信息
+		isNotice := false        //是否需要提醒
+		noticeTime := "12:00:00" //提醒时间
+
+		var dataDtTime time.Time
+		edbData, tmpErr := models.GetLastEdbdataInfo(edb.TradeCode)
+		if tmpErr != nil {
+			if tmpErr.Error() != utils.ErrNoRow() {
+				failList = append(failList, fmt.Sprint(edb.TradeCode, "失败,Err:", tmpErr.Error()))
+				continue
+			}
+		}
+
+		//如果确实是有数据的
+		if edbData != nil {
+			tmpDataDtTime, _ := time.ParseInLocation(utils.FormatDate, edbData.Dt, time.Now().Location())
+			dataDtTime = tmpDataDtTime
+		}
+
+		switch edb.Frequency {
+		case "周度":
+			modifyDate := nowWeekLastDay //下次更新日期
+			if edb.NoticeTime != "" {
+				addDay := 7
+				noticeArr := strings.Split(edb.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 edb.NoticeTime != "" {
+				strArr := strings.Split(edb.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 edb.NoticeTime != "" {
+				noticeArr := strings.Split(edb.NoticeTime, " ")
+				if len(noticeArr) >= 2 {
+					noticeTime = noticeArr[1]
+				}
+			}
+			//每季度更新数据时间
+			//如果正好是提醒日(每季度最后一天),同时本季度没有过记录,那么需要提醒
+			if todayStr == nowQuarterLastDay.Format(utils.FormatDate) && !nowQuarterFirstDay.Before(dataDtTime) {
+				isNotice = true
+			}
+		case "半年度":
+			//提醒时间
+			if edb.NoticeTime != "" {
+				noticeArr := strings.Split(edb.NoticeTime, " ")
+				if len(noticeArr) >= 2 {
+					noticeTime = noticeArr[1]
+				}
+			}
+			//每半年度更新数据时间
+			//如果正好是提醒日(每半年度最后一天),同时本半年度没有过记录,那么需要提醒
+			if todayStr == nowHalfYearLastDay.Format(utils.FormatDate) && !nowHalfYearFirstDay.Before(dataDtTime) {
+				isNotice = true
+			}
+		case "年度":
+			//提醒时间
+			if edb.NoticeTime != "" {
+				noticeArr := strings.Split(edb.NoticeTime, " ")
+				if len(noticeArr) >= 2 {
+					noticeTime = noticeArr[1]
+				}
+			}
+			//每年度更新数据时间
+			//如果正好是提醒日(每年度最后一天),同时半年度没有过记录,那么需要提醒
+			if todayStr == nowYearLastDay.Format(utils.FormatDate) && !nowYearFirstDay.Before(dataDtTime) {
+				isNotice = true
+			}
+		}
+
+		if isNotice {
+			taskName := "edb_task_" + fmt.Sprint(edb.TradeCode)
+			fmt.Println(taskName, ";", edb.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" {
+					//tmpEdb.UserId = 44078 //测试环境的话,发送邮箱给颜鹏
+					tmpEdb.UserId = 29775 //测试环境的话,发送邮箱给嘉豪
+
+				}
+
+				//数据过期时间
+				var funcDataDtTime time.Time
+				//如果确实是有数据的
+				if edbData != nil {
+					tmpDataDtTime, _ := time.ParseInLocation(utils.FormatDate, edbData.Dt, time.Now().Location())
+					funcDataDtTime = 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(funcDataDtTime) {
+						funcIsNotice = 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 {
+							funcErr = tmpErr
+						}
+						addDay = tmpAddDay - 1
+						modifyDate = nowMonthFirstDay.AddDate(0, 0, addDay)
+					}
+
+					//如果正好是提醒日,同时本月没有过记录,那么需要提醒
+					if todayStr == modifyDate.Format(utils.FormatDate) && !nowMonthFirstDay.Before(funcDataDtTime) {
+						funcIsNotice = 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(funcDataDtTime) {
+						funcIsNotice = 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(funcDataDtTime) {
+						funcIsNotice = 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(funcDataDtTime) {
+						funcIsNotice = true
+					}
+				}
+
+				fmt.Println(tmpEdb.TradeCode, " funcIsNotice:", funcIsNotice)
+				//如果还是要提醒
+				if funcIsNotice {
+					//用户微信openid列表数据
+					openIdList := make([]*models.OpenIdList, 0)
+
+					//获取用户信息
+					isAdmin := true
+					admin, err := models.GetAdminByAdminId(tmpEdb.UserId)
+					if err != nil {
+						if err.Error() == utils.ErrNoRow() {
+							isAdmin = false
+						} else {
+							return err
+						}
+					}
+					if admin == nil {
+						isAdmin = false
+					}
+					if isAdmin {
+						if admin.Mobile == "" {
+
+						} else {
+							wxUser, err := models.GetWxUserByMobile(admin.Mobile)
+							if err != nil {
+								return err
+							}
+							if wxUser == nil {
+								funcErr = errors.New("用户信息不存在:mobile:" + admin.Mobile)
+								return err
+							}
+							tmpOpenidList, err := models.GetUserOpenidListByUserId(int(wxUser.UserId))
+							if err != nil {
+								return err
+							}
+							openIdList = tmpOpenidList
+						}
+					} else {
+						tmpOpenidList, err := models.GetUserOpenidListByUserId(tmpEdb.UserId)
+						if err != nil {
+							return err
+						}
+						openIdList = tmpOpenidList
+					}
+					//发送消息
+					if len(openIdList) <= 0 {
+						funcErr = errors.New("openId 列表为空" + strconv.Itoa(tmpEdb.UserId))
+						return
+					}
+
+					first := "数据录入提醒"
+					keyword1 := tmpEdb.SecName
+					keyword2 := "每周 " + edb.NoticeTime
+					remark := tmpEdb.SecName + "该更新了"
+					fmt.Println("开始发送模板消息了")
+					for _, openid := range openIdList {
+						fmt.Println(openid)
+					}
+
+					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)
+			TaskNameMap[taskName] = true
+			taskNum++
+		}
+	}
+
+	//清除定时任务
+	go deleteTask(edbTaskNameChannel, taskNum)
+
+	for _, v := range failList {
+		fmt.Println(v)
+	}
+	//fmt.Println(task.NewMapSorter())
+}
+func deleteTask(keyChannel chan string, lenI int) {
+	for i := 0; i < lenI; i++ {
+		taskName := <-keyChannel
+		task.DeleteTask(taskName)
+		delete(TaskNameMap, taskName)
+	}
+}

+ 224 - 17
utils/common.go

@@ -1,4 +1,3 @@
-
 package utils
 
 import (
@@ -7,6 +6,7 @@ import (
 	"encoding/base64"
 	"encoding/hex"
 	"encoding/json"
+	"errors"
 	"fmt"
 	"image"
 	"image/png"
@@ -291,22 +291,22 @@ func SaveBase64ToFile(content, path string) error {
 
 func SaveBase64ToFileBySeek(content, path string) (err error) {
 	data, err := base64.StdEncoding.DecodeString(content)
-	exist,err:=PathExists(path)
-	if err!=nil {
+	exist, err := PathExists(path)
+	if err != nil {
 		return
 	}
 	if !exist {
 		f, err := os.Create(path)
-		if err!=nil {
+		if err != nil {
 			return err
 		}
 		n, _ := f.Seek(0, 2)
 		// 从末尾的偏移量开始写入内容
 		_, err = f.WriteAt([]byte(data), n)
 		defer f.Close()
-	}else{
+	} else {
 		f, err := os.OpenFile(path, os.O_WRONLY, 0644)
-		if err!=nil {
+		if err != nil {
 			return err
 		}
 		n, _ := f.Seek(0, 2)
@@ -318,7 +318,7 @@ func SaveBase64ToFileBySeek(content, path string) (err error) {
 	return nil
 }
 
-func PathExists(path string) (bool,error) {
+func PathExists(path string) (bool, error) {
 	_, err := os.Stat(path)
 	if err == nil {
 		return true, nil
@@ -488,33 +488,240 @@ func Sha1(data string) string {
 	return hex.EncodeToString(sha1.Sum([]byte("")))
 }
 
-func GetWeekDay() (weekStr string){
+func GetWeekDay() (weekStr string) {
 	nowWeek := time.Now().Weekday().String()
 	switch nowWeek {
 	case "Monday":
-		weekStr="周一"
+		weekStr = "周一"
 		break
 	case "Tuesday":
-		weekStr="周二"
+		weekStr = "周二"
 		break
 	case "Wednesday":
-		weekStr="周三"
+		weekStr = "周三"
 		break
 	case "Thursday":
-		weekStr="周四"
+		weekStr = "周四"
 		break
 	case "Friday":
-		weekStr="周五"
+		weekStr = "周五"
 		break
 	case "Saturday":
-		weekStr="周六"
+		weekStr = "周六"
 		break
 	case "Sunday":
-		weekStr="周日"
+		weekStr = "周日"
 		break
 	default:
-		weekStr=""
+		weekStr = ""
 		break
 	}
 	return
-}
+}
+
+// GetNowWeekMonday 获取本周周一的时间
+func GetNowWeekMonday() time.Time {
+	offset := int(time.Monday - time.Now().Weekday())
+	if offset == 1 { //正好是周日,但是按照中国人的理解,周日是一周最后一天,而不是一周开始的第一天
+		offset = -6
+	}
+	mondayTime := time.Now().AddDate(0, 0, offset)
+	mondayTime = time.Date(mondayTime.Year(), mondayTime.Month(), mondayTime.Day(), 0, 0, 0, 0, mondayTime.Location())
+	return mondayTime
+}
+
+// GetNowWeekLastDay 获取本周最后一天的时间
+func GetNowWeekLastDay() time.Time {
+	offset := int(time.Monday - time.Now().Weekday())
+	if offset == 1 { //正好是周日,但是按照中国人的理解,周日是一周最后一天,而不是一周开始的第一天
+		offset = -6
+	}
+	firstDayTime := time.Now().AddDate(0, 0, offset)
+	firstDayTime = time.Date(firstDayTime.Year(), firstDayTime.Month(), firstDayTime.Day(), 0, 0, 0, 0, firstDayTime.Location()).AddDate(0, 0, 6)
+	lastDayTime := time.Date(firstDayTime.Year(), firstDayTime.Month(), firstDayTime.Day(), 23, 59, 59, 0, firstDayTime.Location())
+
+	return lastDayTime
+}
+
+// GetNowMonthFirstDay 获取本月第一天的时间
+func GetNowMonthFirstDay() time.Time {
+	nowMonthFirstDay := time.Date(time.Now().Year(), time.Now().Month(), 1, 0, 0, 0, 0, time.Now().Location())
+	return nowMonthFirstDay
+}
+
+// GetNowMonthLastDay 获取本月最后一天的时间
+func GetNowMonthLastDay() time.Time {
+	nowMonthLastDay := time.Date(time.Now().Year(), time.Now().Month(), 1, 0, 0, 0, 0, time.Now().Location()).AddDate(0, 1, -1)
+	nowMonthLastDay = time.Date(nowMonthLastDay.Year(), nowMonthLastDay.Month(), nowMonthLastDay.Day(), 23, 59, 59, 0, nowMonthLastDay.Location())
+	return nowMonthLastDay
+}
+
+// GetNowQuarterFirstDay 获取本季度第一天的时间
+func GetNowQuarterFirstDay() time.Time {
+	month := int(time.Now().Month())
+	var nowQuarterFirstDay time.Time
+	if month >= 1 && month <= 3 {
+		//1月1号
+		nowQuarterFirstDay = time.Date(time.Now().Year(), 1, 1, 0, 0, 0, 0, time.Now().Location())
+	} else if month >= 4 && month <= 6 {
+		//4月1号
+		nowQuarterFirstDay = time.Date(time.Now().Year(), 4, 1, 0, 0, 0, 0, time.Now().Location())
+	} else if month >= 7 && month <= 9 {
+		nowQuarterFirstDay = time.Date(time.Now().Year(), 7, 1, 0, 0, 0, 0, time.Now().Location())
+	} else {
+		nowQuarterFirstDay = time.Date(time.Now().Year(), 10, 1, 0, 0, 0, 0, time.Now().Location())
+	}
+	return nowQuarterFirstDay
+}
+
+// GetNowQuarterLastDay 获取本季度最后一天的时间
+func GetNowQuarterLastDay() time.Time {
+	month := int(time.Now().Month())
+	var nowQuarterLastDay time.Time
+	if month >= 1 && month <= 3 {
+		//03-31 23:59:59
+		nowQuarterLastDay = time.Date(time.Now().Year(), 3, 31, 23, 59, 59, 0, time.Now().Location())
+	} else if month >= 4 && month <= 6 {
+		//06-30 23:59:59
+		nowQuarterLastDay = time.Date(time.Now().Year(), 6, 30, 23, 59, 59, 0, time.Now().Location())
+	} else if month >= 7 && month <= 9 {
+		//09-30 23:59:59
+		nowQuarterLastDay = time.Date(time.Now().Year(), 9, 30, 23, 59, 59, 0, time.Now().Location())
+	} else {
+		//12-31 23:59:59
+		nowQuarterLastDay = time.Date(time.Now().Year(), 12, 31, 23, 59, 59, 0, time.Now().Location())
+	}
+	return nowQuarterLastDay
+}
+
+// GetNowHalfYearFirstDay 获取当前半年的第一天的时间
+func GetNowHalfYearFirstDay() time.Time {
+	month := int(time.Now().Month())
+	var nowHalfYearLastDay time.Time
+	if month >= 1 && month <= 6 {
+		//03-31 23:59:59
+		nowHalfYearLastDay = time.Date(time.Now().Year(), 1, 1, 0, 0, 0, 0, time.Now().Location())
+	} else {
+		//12-31 23:59:59
+		nowHalfYearLastDay = time.Date(time.Now().Year(), 7, 1, 0, 0, 0, 0, time.Now().Location())
+	}
+	return nowHalfYearLastDay
+}
+
+// GetNowHalfYearLastDay 获取当前半年的最后一天的时间
+func GetNowHalfYearLastDay() time.Time {
+	month := int(time.Now().Month())
+	var nowHalfYearLastDay time.Time
+	if month >= 1 && month <= 6 {
+		//03-31 23:59:59
+		nowHalfYearLastDay = time.Date(time.Now().Year(), 6, 30, 23, 59, 59, 0, time.Now().Location())
+	} else {
+		//12-31 23:59:59
+		nowHalfYearLastDay = time.Date(time.Now().Year(), 12, 31, 23, 59, 59, 0, time.Now().Location())
+	}
+	return nowHalfYearLastDay
+}
+
+// GetNowYearFirstDay 获取当前年的最后一天的时间
+func GetNowYearFirstDay() time.Time {
+	//12-31 23:59:59
+	nowYearFirstDay := time.Date(time.Now().Year(), 1, 1, 0, 0, 0, 0, time.Now().Location())
+	return nowYearFirstDay
+}
+
+// GetNowYearLastDay 获取当前年的最后一天的时间
+func GetNowYearLastDay() time.Time {
+	//12-31 23:59:59
+	nowYearLastDay := time.Date(time.Now().Year(), 12, 31, 23, 59, 59, 0, time.Now().Location())
+	return nowYearLastDay
+}
+
+// CalculationDate 计算两个日期之间相差n年m月y天
+func CalculationDate(startDate, endDate time.Time) (beetweenDay string, err error) {
+	//startDate := time.Date(2021, 3, 28, 0, 0, 0, 0, time.Now().Location())
+	//endDate := time.Date(2022, 3, 31, 0, 0, 0, 0, time.Now().Location())
+	numYear := endDate.Year() - startDate.Year()
+
+	numMonth := int(endDate.Month()) - int(startDate.Month())
+
+	numDay := 0
+	//获取截止月的总天数
+	endDateDays := getMonthDay(endDate.Year(), int(endDate.Month()))
+
+	//获取截止月的前一个月
+	endDatePrevMonthDate := endDate.AddDate(0, -1, 0)
+	//获取截止日期的上一个月的总天数
+	endDatePrevMonthDays := getMonthDay(endDatePrevMonthDate.Year(), int(endDatePrevMonthDate.Month()))
+	//获取开始日期的的月份总天数
+	startDateMonthDays := getMonthDay(startDate.Year(), int(startDate.Month()))
+
+	//判断,截止月是否完全被选中,如果相等,那么代表截止月份全部天数被选择
+	if endDate.Day() == endDateDays {
+		numDay = startDateMonthDays - startDate.Day() + 1
+
+		//如果剩余天数正好与开始日期的天数是一致的,那么月份加1
+		if numDay == startDateMonthDays {
+			numMonth++
+			numDay = 0
+			//超过月份了,那么年份加1
+			if numMonth == 12 {
+				numYear++
+				numMonth = 0
+			}
+		}
+	} else {
+		numDay = endDate.Day() - startDate.Day() + 1
+	}
+
+	//天数小于0,那么向月份借一位
+	if numDay < 0 {
+		//向上一个月借一个月的天数
+		numDay += endDatePrevMonthDays
+
+		//总月份减去一个月
+		numMonth = numMonth - 1
+	}
+
+	//月份小于0,那么向年份借一位
+	if numMonth < 0 {
+		//向上一个年借12个月
+		numMonth += 12
+
+		//总年份减去一年
+		numYear = numYear - 1
+	}
+	if numYear < 0 {
+		err = errors.New("日期异常")
+		return
+	}
+
+	if numYear > 0 {
+		beetweenDay += fmt.Sprint(numYear, "年")
+	}
+	if numMonth > 0 {
+		beetweenDay += fmt.Sprint(numMonth, "个月")
+	}
+	if numDay > 0 {
+		beetweenDay += fmt.Sprint(numDay, "天")
+	}
+	return
+}
+
+// getMonthDay 获取某年某月有多少天
+func getMonthDay(year, month int) (days int) {
+	if month != 2 {
+		if month == 4 || month == 6 || month == 9 || month == 11 {
+			days = 30
+
+		} else {
+			days = 31
+		}
+	} else {
+		if ((year%4) == 0 && (year%100) != 0) || (year%400) == 0 {
+			days = 29
+		} else {
+			days = 28
+		}
+	}
+	return
+}

+ 12 - 3
utils/config.go

@@ -10,6 +10,7 @@ var (
 	MYSQL_URL_RDDP string //数据库连接
 	MYSQL_URL_EDB  string
 	MYSQL_URL_DATA string
+	MYSQL_URL_GL   string
 )
 
 var (
@@ -38,8 +39,9 @@ var (
 )
 
 var (
-	THS_SendUrl string //同花顺地址url
-	THS_PubKey  string //同花顺公钥
+	THS_SendUrl        string //同花顺地址url
+	THS_SyncWxGroupUrl string //同花顺同步微信群url
+	THS_PubKey         string //同花顺公钥
 )
 
 func init() {
@@ -53,6 +55,7 @@ func init() {
 	MYSQL_URL_RDDP = config["mysql_url_rddp"]
 	MYSQL_URL_EDB = config["mysql_url_edb"]
 	MYSQL_URL_DATA = config["mysql_url_data"]
+	MYSQL_URL_GL = config["mysql_url_gl"]
 
 	//同花顺公钥
 	THS_PubKey = `-----BEGIN PUBLIC KEY-----
@@ -74,16 +77,22 @@ ZwIDAQAB
 		RemindTemplateId = "PaHpQjVffrvmeW8wiOUcqlEhnD1LXyU9FnPVF-Jg9wM"
 		//同花顺正式地址
 		THS_SendUrl = `https://board.10jqka.com.cn/gateway/ps/syncNews`
+		THS_SyncWxGroupUrl = `https://board.10jqka.com.cn/gateway/ps/syncWechatGroupInfo`
+		//同花顺,万得接口服务地址(阿里云windows服务器地址;内网地址)
+		Hz_Server_Data_Url = "http://172.19.173.231:7000/"
 	} else {
 		CompanyId = 16
 		RealName = "超级管理员"
 		AdminId = 11
 		WxAppId = "wx9b5d7291e581233a"
 		WxAppSecret = "f4d52e34021eee262dce9682b31f8861"
-		TemplateId = "P0klzaZjEI2UYth-z-WnmtOQgyxcF8klPoA_MlsA8Eo"
+		TemplateId = "pDk4o924gSZWj80ZdNnHodnLMIXjPSlKZU0ciQMOhec"
 		RemindTemplateId = "9JYV6sHMJlu2EHRBIj_8ift6wkrrTb9_UO-M_-YXKBw"
 		//同花顺测试地址
 		THS_SendUrl = `https://mtest.10jqka.com.cn/gateway/ps/syncNews`
+		THS_SyncWxGroupUrl = `https://mtest.10jqka.com.cn/gateway/ps/syncWechatGroupInfo`
+		//同花顺,万得接口服务地址(阿里云windows服务器地址;外网地址)
+		Hz_Server_Data_Url = "http://139.196.136.213:7000/"
 	}
 }
 

+ 13 - 4
utils/constants.go

@@ -20,9 +20,9 @@ const (
 )
 
 const (
-	APPNAME          = "弘则-task"
-	EmailSendToUsers = "317699326@qq.com;984198890@qq.com;512188925@qq.com"
-	EmailSendToMe    = "317699326@qq.com"
+	APPNAME                        = "弘则-task"
+	EmailSendToUsers               = "317699326@qq.com;984198890@qq.com;512188925@qq.com"
+	RefreshEdbInfoEmailSendToUsers = "317699326@qq.com;jhwang@hzinsights.com;lnyan@hzinsights.com"
 )
 
 //手机号,电子邮箱正则
@@ -73,6 +73,11 @@ const (
 	DATA_SOURCE_CALCULATE_NSZYDPJJS            //N数值移动平均计算
 	DATA_SOURCE_MANUAL                         //手工指标
 	DATA_SOURCE_LZ                             //隆众
+	DATA_SOURCE_YS                             //有色
+	DATA_SOURCE_CALCULATE_HBZ                  //环比值->12
+	DATA_SOURCE_CALCULATE_HCZ                  //环差值->13
+	DATA_SOURCE_CALCULATE_BP                   //变频->14
+	DATA_SOURCE_GL                             //钢联->15
 )
 
 //http://datawind.hzinsights.com:8040/hz_server
@@ -85,4 +90,8 @@ const (
 //数据刷新频率
 const (
 	DATA_REFRESH = 7 //7个单位,日/周/月/季度/年
-)
+)
+
+var (
+	Hz_Server_Data_Url string //同花顺,万得接口服务地址(阿里云windows服务器地址)
+)