فهرست منبع

合并计算指标

hongze 3 سال پیش
والد
کامیت
25d643bd63

+ 310 - 0
go.sum

@@ -0,0 +1,310 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
+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=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alicebob/gopher-json v0.0.0-20180125190556-5a6b3ba71ee6/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc=
+github.com/alicebob/miniredis v2.5.0+incompatible/go.mod h1:8HZjEj4yU0dwhYHky+DxYx+6BMjkBbe5ONFIF1MXffk=
+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.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/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=
+github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc=
+github.com/beego/beego/v2 v2.0.1 h1:07a7Z0Ok5vbqyqh+q53sDPl9LdhKh0ZDy3gbyGrhFnE=
+github.com/beego/beego/v2 v2.0.1/go.mod h1:8zyHi1FnWO1mZLwTn62aKRIZF/aIKvkCBB2JYs+eqQI=
+github.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd/go.mod h1:1b+Y/CofkYwXMUU0OhQqGvsY2Bvgr4j6jfT699wyZKQ=
+github.com/beego/x2j v0.0.0-20131220205130-a0352aadc542/go.mod h1:kSeGC/p1AbBiEp5kat81+DSQrZenVBZXklMLaELspWU=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60=
+github.com/casbin/casbin v1.7.0/go.mod h1:c67qKN6Oum3UF5Q1+BByfFxkwKvhwW57ITjqwtzR1KE=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80=
+github.com/coreos/etcd v3.3.25+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
+github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
+github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
+github.com/couchbase/go-couchbase v0.0.0-20200519150804-63f3cdb75e0d/go.mod h1:TWI8EKQMs5u5jLKW/tsb9VwauIrMIxQG1r5fMsswK5U=
+github.com/couchbase/gomemcached v0.0.0-20200526233749-ec430f949808/go.mod h1:srVSlQLB8iXBVXHgnqemxUXqN6FCvClgCMPCsjBDR7c=
+github.com/couchbase/goutils v0.0.0-20180530154633-e865a1461c8a/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs=
+github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76/go.mod h1:vYwsqCOLxGiisLwp9rITslkFNpZD5rz43tf41QFkTWY=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
+github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
+github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
+github.com/elastic/go-elasticsearch/v6 v6.8.5/go.mod h1:UwaDJsD3rWLM5rKNFzv9hgox93HoX8utj1kxD9aFUcI=
+github.com/elazarl/go-bindata-assetfs v1.0.0 h1:G/bYguwHIzWq9ZoyUQqrjTmJbbYn3j3CKKpKinvZLFk=
+github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4=
+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=
+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
+github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg=
+github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
+github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w=
+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
+github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
+github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
+github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+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/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8=
+github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
+github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U=
+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=
+github.com/mitchellh/mapstructure v1.3.3 h1:SzB1nHZ2Xi+17FP0zVQBHIZqvwRN9408fJO8h+eeNA8=
+github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
+github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
+github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
+github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
+github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
+github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
+github.com/pelletier/go-toml v1.0.1/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
+github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
+github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc=
+github.com/peterh/liner v1.0.1-0.20171122030339-3681c2a91233/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
+github.com/prometheus/client_golang v1.7.0 h1:wCi7urQOGBsYcQROHqpUUX4ct84xp40t9R9JX0FuA/U=
+github.com/prometheus/client_golang v1.7.0/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc=
+github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8=
+github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
+github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
+github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 h1:X+yvsM2yrEktyI+b2qND5gpH8YhURn0k8OCaeRnkINo=
+github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg=
+github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ=
+github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
+github.com/siddontang/go v0.0.0-20170517070808-cb568a3e5cc0/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw=
+github.com/siddontang/goredis v0.0.0-20150324035039-760763f78400/go.mod h1:DDcKzU3qCuvj/tPnimWSsZZzvk9qvkvrIL5naVBPh5s=
+github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d/go.mod h1:AMEsy7v5z92TR1JKMkLLoaOQk++LVnOKL3ScbJ8GNGA=
+github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/syndtr/goleveldb v0.0.0-20160425020131-cfa635847112/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
+github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
+github.com/tealeg/xlsx v1.0.5 h1:+f8oFmvY8Gw1iUXzPk+kz+4GpbDZPK1FhPiQRd+ypgE=
+github.com/tealeg/xlsx v1.0.5/go.mod h1:btRS8dz54TDnvKNosuAqxrM1QgN1udgk9O34bDCnORM=
+github.com/ugorji/go v0.0.0-20171122102828-84cb69a8af83/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ=
+github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc=
+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/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=
+go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
+go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
+go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
+go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+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=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+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/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-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=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20201211185031-d93e913c1a58 h1:1Bs6RVeBFtLZ8Yi1Hk07DiOqzvwLD/4hln4iahvFlag=
+golang.org/x/tools v0.0.0-20201211185031-d93e913c1a58/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
+gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk=
+gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
+gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE=
+gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw=
+gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
+honnef.co/go/tools v0.0.1-2020.1.5/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=

+ 191 - 0
models/data_manage/edb_data_quarter.go

@@ -0,0 +1,191 @@
+package data_manage
+
+import (
+	"fmt"
+	"hongze/hongze_task/utils"
+	"rdluck_tools/orm"
+	"sort"
+	"strconv"
+	"strings"
+	"time"
+)
+
+func GetEdbDataQuarterCount(edbInfoId int) (count int, err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	hsql := `SELECT COUNT(1) AS count FROM edb_data_quarter WHERE edb_info_id=? `
+	err = o.Raw(hsql, edbInfoId).QueryRow(&count)
+	return
+}
+
+//指标季度数据计算
+func RefreshCalculateQuarter(edbInfoId, source int, edbCode string) (err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	o.Begin()
+	defer func() {
+		if err != nil {
+			fmt.Println("Err:", err)
+			o.Rollback()
+		} else {
+			o.Commit()
+		}
+	}()
+
+	edbInfoIdStr := strconv.Itoa(edbInfoId)
+
+	startDate := time.Now().AddDate(-2, -2, 0).Format(utils.FormatDate)
+	//计算数据
+	var condition string
+	var pars []interface{}
+	condition += " AND edb_info_id=? "
+	pars = append(pars, edbInfoId)
+	condition += " AND data_time>=? "
+	pars = append(pars, startDate)
+
+	dataList, err := GetEdbDataListAll(condition, pars, source, 0)
+	if err != nil {
+		return err
+	}
+
+	//计算数据
+	var existCondition string
+	var existPars []interface{}
+	existCondition += " AND edb_info_id=? "
+	existPars = append(existPars, edbInfoId)
+	existCondition += " AND data_time>=? "
+	existPars = append(existPars, startDate)
+
+	existDataList, err := GetEdbDataListAll(existCondition, existPars, utils.DATA_SOURCE_QUARTER, 0)
+	if err != nil {
+		return err
+	}
+	existMap := make(map[string]float64)
+	for _, v := range existDataList {
+		existMap[v.DataTime] = v.Value
+	}
+
+	var yearArr []int
+	yearMap := make(map[int]int)
+	dataMap := make(map[string]*EdbInfoSearchData)
+	for _, v := range dataList {
+		//日其中获取年
+		itemDate, err := time.Parse(utils.FormatDate, v.DataTime)
+		if err != nil {
+			return err
+		}
+		year := itemDate.Year()
+		if _, ok := yearMap[year]; !ok {
+			yearArr = append(yearArr, year)
+			yearMap[year] = year
+		}
+		dataMap[v.DataTime] = v
+	}
+	sort.Sort(sort.Reverse(sort.IntSlice(yearArr)))
+	addSql := ` INSERT INTO edb_data_quarter(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
+	var isAdd bool
+	yearLen := len(yearArr)
+
+	fmt.Println(yearArr)
+
+	for yk, yv := range yearArr {
+		currentYear := yv
+		hsql := `SELECT * FROM holiday WHERE year=? `
+		currentHolidayObj := new(Holiday)
+		err = o.Raw(hsql, currentYear).QueryRow(&currentHolidayObj)
+		if err != nil {
+			return err
+		}
+		nextIndex := yk + 1
+		if nextIndex < yearLen {
+			nextYear := yearArr[nextIndex]
+			fmt.Println("year:", currentYear, nextYear)
+			nextHolidayObj := new(Holiday)
+			hsql := `SELECT * FROM holiday WHERE year=? `
+			err = o.Raw(hsql, nextYear).QueryRow(&nextHolidayObj)
+			if err != nil {
+				return err
+			}
+			nextHolidayStr := nextHolidayObj.HolidayDate.Format(utils.FormatDate)
+			currentHolidayStr := currentHolidayObj.HolidayDate.Format(utils.FormatDate)
+
+			if findItem, ok := dataMap[nextHolidayStr]; ok {
+				timestamp := currentHolidayObj.HolidayDate.UnixNano() / 1e6
+				timestampStr := fmt.Sprintf("%d", timestamp)
+				if _, ok := existMap[currentHolidayStr]; !ok {
+					addSql += GetAddSql(edbInfoIdStr, edbCode, currentHolidayStr, timestampStr, findItem.Value)
+					isAdd = true
+				}
+			}
+
+			nextMinDate := strconv.Itoa(nextYear) + "-01-01"
+			nextMaxDate := strconv.Itoa(nextYear) + "-12-31"
+			currentMinDate := strconv.Itoa(currentYear) + "-01-01"
+			currentMaxDate := strconv.Itoa(currentYear) + "-12-31"
+
+			i := 0
+			for {
+				i--
+				nextHolidayFormat := nextHolidayObj.HolidayDate.AddDate(0, 0, i)
+				currentHolidayFormat := currentHolidayObj.HolidayDate.AddDate(0, 0, i)
+
+				nextHolidayStr := nextHolidayFormat.Format(utils.FormatDate)
+				currentHolidayStr := currentHolidayFormat.Format(utils.FormatDate)
+
+				fmt.Println("currentHolidayStr:", currentHolidayStr, nextHolidayStr)
+				if findItem, ok := dataMap[nextHolidayStr]; ok {
+					timestamp := currentHolidayFormat.UnixNano() / 1e6
+					timestampStr := fmt.Sprintf("%d", timestamp)
+					if _, ok := existMap[currentHolidayStr]; !ok {
+						addSql += GetAddSql(edbInfoIdStr, edbCode, currentHolidayStr, timestampStr, findItem.Value)
+						isAdd = true
+					}
+				}
+				//fmt.Println("nextHolidayStr:", nextHolidayStr,nextMinDate)
+				if nextHolidayStr == nextMinDate || currentHolidayStr == currentMinDate {
+					fmt.Println("min跳出循环:" + nextMinDate)
+					break
+				}
+			}
+
+			n := 0
+			for {
+				n++
+				nextHolidayFormat := nextHolidayObj.HolidayDate.AddDate(0, 0, n)
+				currentHolidayFormat := currentHolidayObj.HolidayDate.AddDate(0, 0, n)
+
+				nextHolidayStr := nextHolidayFormat.Format(utils.FormatDate)
+				currentHolidayStr := currentHolidayFormat.Format(utils.FormatDate)
+
+				fmt.Println("currentHolidayStr:", currentHolidayStr, nextHolidayStr)
+
+				if findItem, ok := dataMap[nextHolidayStr]; ok {
+					timestamp := currentHolidayFormat.UnixNano() / 1e6
+					timestampStr := fmt.Sprintf("%d", timestamp)
+
+					if _, ok := existMap[currentHolidayStr]; !ok {
+						addSql += GetAddSql(edbInfoIdStr, edbCode, currentHolidayStr, timestampStr, findItem.Value)
+						isAdd = true
+					}
+				}
+
+				//fmt.Println("nextHolidayStr:", nextHolidayStr,nextMaxDate)
+				if nextHolidayStr == nextMaxDate || currentHolidayStr == currentMaxDate {
+					fmt.Println("max跳出循环:" + nextMaxDate)
+					break
+				}
+			}
+		}
+	}
+	fmt.Println("isAdd", isAdd)
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		utils.FileLog.Info(addSql)
+		_, err = o.Raw(addSql).Exec()
+		fmt.Println("err:", err)
+		if err != nil {
+			return err
+		}
+	}
+	return
+}

+ 66 - 0
models/data_manage/edb_data_table.go

@@ -0,0 +1,66 @@
+package data_manage
+
+import (
+	"errors"
+	"hongze/hongze_task/utils"
+	"strconv"
+	"time"
+)
+
+func GetEdbDataTableName(source int) (tableName string) {
+	switch source {
+	case utils.DATA_SOURCE_THS:
+		tableName = "edb_data_ths"
+	case utils.DATA_SOURCE_WIND:
+		tableName = "edb_data_wind"
+	case utils.DATA_SOURCE_PB:
+		tableName = "edb_data_pb"
+	case utils.DATA_SOURCE_CALCULATE:
+		tableName = "edb_data_calculate"
+	case utils.DATA_SOURCE_CALCULATE_LJZZY:
+		tableName = "edb_data_calculate_ljzzy"
+	case utils.DATA_SOURCE_CALCULATE_TBZ:
+		tableName = "edb_data_calculate_tbz"
+	case utils.DATA_SOURCE_CALCULATE_TCZ:
+		tableName = "edb_data_calculate_tcz"
+	case utils.DATA_SOURCE_CALCULATE_NSZYDPJJS:
+		tableName = "edb_data_calculate_nszydpjjs"
+	case utils.DATA_SOURCE_QUARTER:
+		tableName = "edb_data_quarter"
+	default:
+		tableName = ""
+		errors.New("无效的渠道:" + strconv.Itoa(source))
+		return
+	}
+	return
+}
+
+func GetEdbInfoCalculateTableName(source int) (tableName string) {
+	switch source {
+	case utils.DATA_SOURCE_CALCULATE:
+		tableName = "edb_info_calculate"
+	case utils.DATA_SOURCE_CALCULATE_LJZZY:
+		tableName = "edb_info_calculate_ljzzy"
+	case utils.DATA_SOURCE_CALCULATE_TBZ:
+		tableName = "edb_info_calculate_tbz"
+	case utils.DATA_SOURCE_CALCULATE_TCZ:
+		tableName = "edb_info_calculate_tcz"
+	case utils.DATA_SOURCE_CALCULATE_NSZYDPJJS:
+		tableName = "edb_info_calculate_nszydpjjs"
+	default:
+		tableName = ""
+		errors.New("无效的渠道:" + strconv.Itoa(source))
+		return
+	}
+	return
+}
+
+func GetAddSql(edbInfoId, edbCode, dataTime, timestampStr string, value float64) (addSql string) {
+	nowStr := time.Now().Format(utils.FormatDateTime)
+	addSql += "("
+	addSql += edbInfoId + "," + "'" + edbCode + "'" + "," + "'" + dataTime + "'" + "," + utils.SubFloatToString(value, 4) + "," + "'" + nowStr + "'" +
+		"," + "'" + nowStr + "'" + "," + "1"
+	addSql += "," + "'" + timestampStr + "'"
+	addSql += "),"
+	return
+}

+ 20 - 19
models/data_manage/edb_info.go

@@ -58,6 +58,7 @@ func GetEdbInfoByCondition(condition string, pars []interface{}) (item []*EdbInf
 	if condition != "" {
 		sql += condition
 	}
+	sql += ` ORDER BY edb_info_id ASC `
 	_, err = o.Raw(sql, pars).QueryRows(&item)
 	return
 }
@@ -109,7 +110,8 @@ func ModifyEdbInfoMaxAndMinInfo(edbInfoId int, item *EdbInfoMaxAndMinInfo) (err
 	return
 }
 
-func GetEdbDataListAll(condition string, pars []interface{}, source int) (item []*EdbInfoSearchData, err error) {
+//order:1升序,其余值为降序
+func GetEdbDataListAll(condition string, pars []interface{}, source, order int) (item []*EdbInfoSearchData, err error) {
 	o := orm.NewOrm()
 	o.Using("data")
 	sql := ``
@@ -120,26 +122,12 @@ func GetEdbDataListAll(condition string, pars []interface{}, source int) (item [
 	if condition != "" {
 		sql += condition
 	}
-
-	sql += ` ORDER BY data_time ASC `
-	_, err = o.Raw(sql, pars).QueryRows(&item)
-	return
-}
-
-func GetEdbDataTableName(source int) (tableName string) {
-	if source == utils.DATA_SOURCE_THS {
-		tableName = `edb_data_ths`
-	} else if source == utils.DATA_SOURCE_WIND {
-		tableName = `edb_data_wind`
-	} else if source == utils.DATA_SOURCE_PB {
-		tableName = `edb_data_pb`
-	} else if source == utils.DATA_SOURCE_CALCULATE {
-		tableName = `edb_data_calculate`
+	if order == 1 {
+		sql += ` ORDER BY data_time ASC `
 	} else {
-		tableName = ""
-		errors.New("无效的渠道:" + strconv.Itoa(source))
-		return
+		sql += ` ORDER BY data_time DESC `
 	}
+	_, err = o.Raw(sql, pars).QueryRows(&item)
 	return
 }
 
@@ -150,3 +138,16 @@ func GetEdbInfoById(edbInfoId int) (item *EdbInfo, err error) {
 	err = o.Raw(sql, edbInfoId).QueryRow(&item)
 	return
 }
+
+func GetQuarterEdbInfo() (item []*EdbInfo, err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	sql := ` SELECT c.* FROM chart_info AS a
+			INNER JOIN chart_edb_mapping AS b ON a.chart_info_id=b.chart_info_id
+			INNER JOIN edb_info AS c ON b.edb_info_id=c.edb_info_id
+			WHERE a.chart_type=2
+			GROUP BY b.edb_info_id
+			ORDER BY b.edb_info_id ASC  `
+	_, err = o.Raw(sql).QueryRows(&item)
+	return
+}

+ 191 - 0
models/data_manage/edb_info_calculate_ljzzy.go

@@ -0,0 +1,191 @@
+package data_manage
+
+import (
+	"fmt"
+	"github.com/shopspring/decimal"
+	"hongze/hongze_task/utils"
+	"rdluck_tools/orm"
+	"strconv"
+	"strings"
+	"time"
+)
+
+type EdbInfoCalculateLjzzy struct {
+	EdbInfoCalculateLjzzyId int       `orm:"column(edb_info_calculate_ljzzy_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 RefreshCalculateLjzzy(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, 1)
+	if err != nil {
+		return err
+	}
+
+	yearMap := make(map[int]map[int]*EdbInfoSearchData)
+	dataLen := len(dataList)
+	for i := 0; i < dataLen; i++ {
+		item := dataList[i]
+		//日其中获取年
+		itemDate, err := time.Parse(utils.FormatDate, item.DataTime)
+		if err != nil {
+			return err
+		}
+		year := itemDate.Year()
+		month := int(itemDate.Month())
+		if monthMap, yok := yearMap[year]; yok {
+			monthMap[month] = item
+			yearMap[year] = monthMap
+		} else {
+			monthMap = make(map[int]*EdbInfoSearchData)
+			monthMap[month] = item
+			yearMap[year] = monthMap
+		}
+	}
+
+	addSql := ` INSERT INTO edb_data_calculate_ljzzy(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
+	nowStr := time.Now().Format(utils.FormatDateTime)
+	var isAdd bool
+
+	for yk, yv := range yearMap {
+		if _, mok := yv[2]; !mok {
+			//fmt.Println(yk, yv, "continue")
+			continue
+		}
+		for i := 1; i <= 12; i++ {
+			fmt.Println(yk, i, yv[i])
+			dataCurrentItem := yv[i]
+			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
+				}
+			} else {
+				dataPreItem := yv[i-1]
+				if dataCurrentItem != nil && dataPreItem != nil {
+					date = dataCurrentItem.DataTime
+					val, _ = decimal.NewFromFloat(dataCurrentItem.Value).Sub(decimal.NewFromFloat(dataPreItem.Value)).Float64()
+				}
+			}
+			if date != "" {
+				//判断数据是否存在
+				count, err := GetEdbDataCalculateLjzzyByCodeAndDate(edbCode, date)
+				if err != nil && err.Error() != utils.ErrNoRow() {
+					return err
+				}
+				if count <= 0 {
+					dataTime, _ := time.Parse(utils.FormatDate, date)
+					timestamp := dataTime.UnixNano() / 1e6
+					timeStr := fmt.Sprintf("%d", timestamp)
+
+					addSql += "("
+					addSql += edbInfoIdStr + "," + "'" + edbCode + "'" + "," + "'" + date + "'" + "," + utils.SubFloatToString(val, 4) + "," + "'" + nowStr + "'" +
+						"," + "'" + nowStr + "'" + "," + "1"
+					addSql += "," + "'" + timeStr + "'"
+					addSql += "),"
+					isAdd = true
+				} else {
+					val = utils.FixFloat(val, 4)
+					err = ModifyEdbDataCalculateLjzzy(int64(edbInfoId), date, val)
+					if err != nil {
+						return err
+					}
+				}
+			}
+		}
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = o.Raw(addSql).Exec()
+		if err != nil {
+			return err
+		}
+	}
+	return
+}
+
+type EdbInfoCalculateLjzzyDetail struct {
+	EdbInfoCalculateLjzzyId int       `orm:"column(edb_info_calculate_ljzzy_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 GetEdbInfoCalculateLjzzyDetail(edbInfoId int) (item *EdbInfoCalculateLjzzyDetail, err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	sql := ` SELECT a.*,b.start_date,b.end_date FROM edb_info_calculate_ljzzy 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
+}
+
+func GetEdbDataCalculateLjzzyByCodeAndDate(edbCode string, startDate string) (count int, err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	sql := ` SELECT COUNT(1) AS count FROM edb_info_calculate_ljzzy WHERE edb_code=? AND data_time=? `
+	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
+	return
+}
+
+func ModifyEdbDataCalculateLjzzy(edbInfoId int64, dataTime string, value float64) (err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	sql := ` UPDATE edb_info_calculate_ljzzy SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
+	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
+	return
+}

+ 168 - 0
models/data_manage/edb_info_calculate_nszydpjjs.go

@@ -0,0 +1,168 @@
+package data_manage
+
+import (
+	"fmt"
+	"github.com/shopspring/decimal"
+	"hongze/hongze_task/utils"
+	"rdluck_tools/orm"
+	"strconv"
+	"strings"
+	"time"
+)
+
+type EdbInfoCalculateNszydpjjs struct {
+	EdbInfoCalculateNszydpjjsId int       `orm:"column(edb_info_calculate_nszydpjjs_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:"修改时间"`
+}
+
+//刷新 N数值移动平均计算
+func RefreshCalculateNszydpjjs(edbInfoId, source, formulaInt int, fromEdbInfo *EdbInfo, edbCode 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, edbInfoId)
+
+	dataList, err := GetEdbDataListAll(condition, pars, source, 0)
+	if err != nil {
+		return err
+	}
+
+	existDataMap := make(map[string]*EdbInfoSearchData)
+	for _, v := range dataList {
+		existDataMap[v.DataTime] = v
+	}
+
+	//计算来源数据
+	startDate := time.Now().AddDate(-2, 0, 0).Format(utils.FormatDate)
+
+	var fromCondition string
+	var fromPars []interface{}
+	fromCondition += " AND edb_info_id=? "
+	fromPars = append(fromPars, fromEdbInfo.EdbInfoId)
+	fromCondition += " AND data_time>=? "
+	fromPars = append(fromPars, startDate)
+
+	fromDataList, err := GetEdbDataListAll(fromCondition, fromPars, fromEdbInfo.Source, 0)
+	if err != nil {
+		return err
+	}
+
+	var fromDateArr []string
+	fromDataMap := make(map[string]*EdbInfoSearchData)
+	for _, v := range fromDataList {
+		fromDateArr = append(fromDateArr, v.DataTime)
+		fromDataMap[v.DataTime] = v
+	}
+
+	addSql := ` INSERT INTO edb_data_calculate_nszydpjjs(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
+	var isAdd bool
+
+	arrLen := len(fromDateArr)
+	for ak, av := range fromDateArr {
+		if _, existOk := existDataMap[av]; !existOk {
+			//处理第一个值
+			var valArr []float64
+			if findItem, ok := fromDataMap[av]; ok {
+				valArr = append(valArr, findItem.Value)
+			} else {
+				continue
+			}
+			if ak+1 != arrLen {
+				//处理除第一个值之外的N-1个值
+				for i := 1; i < formulaInt; i++ {
+					arrIndex := ak + i
+					if arrIndex >= arrLen {
+						break
+					}
+					arrVal := fromDateArr[arrIndex]
+					if findItem, ok := fromDataMap[arrVal]; ok {
+						valArr = append(valArr, findItem.Value)
+					} else {
+						continue
+					}
+				}
+			}
+			valArrLen := len(valArr)
+			var totalVal float64
+			for _, v := range valArr {
+				totalVal = totalVal + v
+			}
+			af := decimal.NewFromFloat(totalVal)
+			bf := decimal.NewFromFloat(float64(valArrLen))
+			val, _ := af.Div(bf).Float64()
+			currentDate, err := time.Parse(utils.FormatDate, av)
+			if err != nil {
+				return err
+			}
+
+			timestamp := currentDate.UnixNano() / 1e6
+			timestampStr := fmt.Sprintf("%d", timestamp)
+
+			addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
+			isAdd = true
+		}
+	}
+
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = o.Raw(addSql).Exec()
+		if err != nil {
+			return err
+		}
+	}
+	return
+}
+
+type EdbInfoCalculateNszydpjjsDetail struct {
+	EdbInfoCalculateNszydpjjsId int       `orm:"column(edb_info_calculate_nszydpjjs_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 GetEdbInfoCalculateNszydpjjsDetail(edbInfoId int) (item *EdbInfoCalculateNszydpjjsDetail, err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	sql := ` SELECT a.*,b.start_date,b.end_date FROM edb_info_calculate_nszydpjjs 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
+}

+ 309 - 0
models/data_manage/edb_info_calculate_tbz.go

@@ -0,0 +1,309 @@
+package data_manage
+
+import (
+	"fmt"
+	"github.com/shopspring/decimal"
+	"hongze/hongze_task/utils"
+	"rdluck_tools/orm"
+	"strconv"
+	"strings"
+	"time"
+)
+
+type EdbInfoCalculateTbz 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:"修改时间"`
+}
+
+func TbzDiv(a, b float64) float64 {
+	af := decimal.NewFromFloat(float64(a))
+	bf := decimal.NewFromFloat(float64(b))
+	val, _ := af.Div(bf).Float64()
+	val = val - 1
+	return val
+}
+
+//刷新同比值数据
+func RefreshCalculateTbz(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, 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
+	}
+	var dateArr []string
+	dataMap := make(map[string]*EdbInfoSearchData)
+	for _, v := range dataList {
+		dateArr = append(dateArr, v.DataTime)
+		dataMap[v.DataTime] = v
+	}
+
+	addSql := ` INSERT INTO edb_data_calculate_tbz(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)
+		currentItem := dataMap[av]
+		if currentItem != nil {
+			//当前日期
+			currentDate, err := time.Parse(utils.FormatDate, av)
+			if err != nil {
+				return err
+			}
+			//上一年的日期
+			preDate := currentDate.AddDate(-1, 0, 0)
+			preDateStr := preDate.Format(utils.FormatDate)
+			if findItem, ok := dataMap[preDateStr]; ok { //上一年同期找到
+				//dataTime, _ := time.Parse(utils.FormatDate, date)
+				timestamp := currentDate.UnixNano() / 1e6
+				timestampStr := fmt.Sprintf("%d", timestamp)
+				val := TbzDiv(currentItem.Value, findItem.Value)
+
+				count, err := GetEdbDataCalculateTbzByCodeAndDate(edbCode, av)
+				if err != nil && err.Error() != utils.ErrNoRow() {
+					return err
+				}
+				if count <= 0 {
+					addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
+					isAdd = true
+				} else {
+					err = ModifyEdbDataCalculateTbz(int64(edbInfoId), av, val)
+					if err != nil {
+						return err
+					}
+				}
+				utils.FileLog.Info("同期找到:" + av + ";" + preDateStr)
+				continue
+			} else {
+				if fromEdbInfo.Frequency == "月度" { //向上和向下,各找一个月
+					nextDateDay := preDate.AddDate(0, 1, 0)
+					nextDateDayStr := nextDateDay.Format(utils.FormatDate)
+
+					preDateDay := preDate.AddDate(0, -1, 0)
+					preDateDayStr := preDateDay.Format(utils.FormatDate)
+
+					for i := 0; i <= 6; i++ {
+						if i >= 1 {
+							nextDateDay = nextDateDay.AddDate(0, 0, i)
+							nextDateDayStr = nextDateDay.Format(utils.FormatDate)
+						}
+						if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
+							timestamp := currentDate.UnixNano() / 1e6
+							timestampStr := fmt.Sprintf("%d", timestamp)
+							val := TbzDiv(currentItem.Value, findItem.Value)
+
+							count, err := GetEdbDataCalculateTbzByCodeAndDate(edbCode, av)
+							if err != nil && err.Error() != utils.ErrNoRow() {
+								return err
+							}
+							if count <= 0 {
+								addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
+								isAdd = true
+							} else {
+								err = ModifyEdbDataCalculateTbz(int64(edbInfoId), av, val)
+								if err != nil {
+									return err
+								}
+							}
+							break
+						} else {
+							if i >= 1 {
+								preDateDay = preDate.AddDate(0, 0, -i)
+								preDateDayStr = nextDateDay.Format(utils.FormatDate)
+							}
+							if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
+								timestamp := currentDate.UnixNano() / 1e6
+								timestampStr := fmt.Sprintf("%d", timestamp)
+								val := TbzDiv(currentItem.Value, findItem.Value)
+
+								count, err := GetEdbDataCalculateTbzByCodeAndDate(edbCode, av)
+								if err != nil && err.Error() != utils.ErrNoRow() {
+									return err
+								}
+								if count <= 0 {
+									addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
+									isAdd = true
+								} else {
+									err = ModifyEdbDataCalculateTbz(int64(edbInfoId), av, val)
+									if err != nil {
+										return err
+									}
+								}
+							}
+							break
+						}
+					}
+				} else if fromEdbInfo.Frequency == "季度" || fromEdbInfo.Frequency == "年度" {
+					if findItem, ok := dataMap[preDateStr]; ok { //上一年同期->下一个月找到
+						timestamp := currentDate.UnixNano() / 1e6
+						timestampStr := fmt.Sprintf("%d", timestamp)
+						val := TbzDiv(currentItem.Value, findItem.Value)
+
+						count, err := GetEdbDataCalculateTbzByCodeAndDate(edbCode, av)
+						if err != nil && err.Error() != utils.ErrNoRow() {
+							return err
+						}
+						if count <= 0 {
+							addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
+							isAdd = true
+						} else {
+							err = ModifyEdbDataCalculateTbz(int64(edbInfoId), av, val)
+							if err != nil {
+								return err
+							}
+						}
+						break
+					}
+				} else {
+					nextDateDay := preDate.AddDate(0, 0, 1)
+					nextDateDayStr := nextDateDay.Format(utils.FormatDate)
+
+					preDateDay := preDate.AddDate(0, 0, -1)
+					preDateDayStr := preDateDay.Format(utils.FormatDate)
+
+					for i := 0; i < 35; i++ {
+						if i >= 1 {
+							nextDateDay = nextDateDay.AddDate(0, 0, i)
+							nextDateDayStr = nextDateDay.Format(utils.FormatDate)
+						}
+						if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
+							timestamp := currentDate.UnixNano() / 1e6
+							timestampStr := fmt.Sprintf("%d", timestamp)
+							val := TbzDiv(currentItem.Value, findItem.Value)
+
+							count, err := GetEdbDataCalculateTbzByCodeAndDate(edbCode, av)
+							if err != nil && err.Error() != utils.ErrNoRow() {
+								return err
+							}
+							if count <= 0 {
+								addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
+								isAdd = true
+							} else {
+								err = ModifyEdbDataCalculateTbz(int64(edbInfoId), av, val)
+								if err != nil {
+									return err
+								}
+							}
+							break
+						} else {
+							if i >= 1 {
+								preDateDay = preDate.AddDate(0, 0, -i)
+								preDateDayStr = nextDateDay.Format(utils.FormatDate)
+							}
+							if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
+								timestamp := currentDate.UnixNano() / 1e6
+								timestampStr := fmt.Sprintf("%d", timestamp)
+								val := TbzDiv(currentItem.Value, findItem.Value)
+
+								count, err := GetEdbDataCalculateTbzByCodeAndDate(edbCode, av)
+								if err != nil && err.Error() != utils.ErrNoRow() {
+									return err
+								}
+								if count <= 0 {
+									addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
+									isAdd = true
+								} else {
+									err = ModifyEdbDataCalculateTbz(int64(edbInfoId), av, val)
+									if err != nil {
+										return err
+									}
+								}
+							}
+							break
+						}
+					}
+				}
+			}
+		}
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = o.Raw(addSql).Exec()
+		if err != nil {
+			return err
+		}
+	}
+	return
+}
+
+type EdbInfoCalculateTbzDetail 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 GetEdbInfoCalculateTbzDetail(edbInfoId int) (item *EdbInfoCalculateTbzDetail, err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	sql := ` SELECT a.*,b.start_date,b.end_date FROM edb_data_calculate_tbz 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
+}
+
+func GetEdbDataCalculateTbzByCodeAndDate(edbCode string, startDate string) (count int, err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	sql := ` SELECT COUNT(1) AS count FROM edb_data_calculate_tbz WHERE edb_code=? AND data_time=? `
+	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
+	return
+}
+
+func ModifyEdbDataCalculateTbz(edbInfoId int64, dataTime string, value float64) (err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	sql := ` UPDATE edb_data_calculate_tbz SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
+	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
+	return
+}

+ 310 - 0
models/data_manage/edb_info_calculate_tcz.go

@@ -0,0 +1,310 @@
+package data_manage
+
+import (
+	"fmt"
+	"github.com/shopspring/decimal"
+	"hongze/hongze_task/utils"
+	"rdluck_tools/orm"
+	"strconv"
+	"strings"
+	"time"
+)
+
+type EdbInfoCalculateTcz struct {
+	EdbInfoCalculateTbzId int       `orm:"column(edb_info_calculate_tcz_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 TczSub(a, b float64) float64 {
+	af := decimal.NewFromFloat(float64(a))
+	fmt.Println(af)
+	bf := decimal.NewFromFloat(float64(b))
+	val, _ := af.Sub(bf).Float64()
+	return val
+}
+
+//刷新同差值数据
+func RefreshCalculateTcz(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, 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
+	}
+	var dateArr []string
+	dataMap := make(map[string]*EdbInfoSearchData)
+	for _, v := range dataList {
+		dateArr = append(dateArr, v.DataTime)
+		dataMap[v.DataTime] = v
+	}
+
+	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)
+		currentItem := dataMap[av]
+		if currentItem != nil {
+			//当前日期
+			currentDate, err := time.Parse(utils.FormatDate, av)
+			if err != nil {
+				return err
+			}
+			//上一年的日期
+			preDate := currentDate.AddDate(-1, 0, 0)
+			preDateStr := preDate.Format(utils.FormatDate)
+			if findItem, ok := dataMap[preDateStr]; ok { //上一年同期找到
+				//dataTime, _ := time.Parse(utils.FormatDate, date)
+				timestamp := currentDate.UnixNano() / 1e6
+				timestampStr := fmt.Sprintf("%d", timestamp)
+				val := TczSub(currentItem.Value, findItem.Value)
+
+				count, err := GetEdbDataCalculateTczByCodeAndDate(edbCode, av)
+				if err != nil && err.Error() != utils.ErrNoRow() {
+					return err
+				}
+				if count <= 0 {
+					addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
+					isAdd = true
+				} else {
+					err = ModifyEdbDataCalculateTcz(int64(edbInfoId), av, val)
+					if err != nil {
+						return err
+					}
+				}
+				utils.FileLog.Info("同期找到:" + av + ";" + preDateStr)
+				continue
+			} else {
+				if fromEdbInfo.Frequency == "月度" { //向上和向下,各找一个月
+					nextDateDay := preDate.AddDate(0, 1, 0)
+					nextDateDayStr := nextDateDay.Format(utils.FormatDate)
+
+					preDateDay := preDate.AddDate(0, -1, 0)
+					preDateDayStr := preDateDay.Format(utils.FormatDate)
+
+					for i := 0; i <= 6; i++ {
+						if i >= 1 {
+							nextDateDay = nextDateDay.AddDate(0, 0, i)
+							nextDateDayStr = nextDateDay.Format(utils.FormatDate)
+						}
+						if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
+							timestamp := currentDate.UnixNano() / 1e6
+							timestampStr := fmt.Sprintf("%d", timestamp)
+							val := TczSub(currentItem.Value, findItem.Value)
+
+							count, err := GetEdbDataCalculateTczByCodeAndDate(edbCode, av)
+							if err != nil && err.Error() != utils.ErrNoRow() {
+								return err
+							}
+							if count <= 0 {
+								addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
+								isAdd = true
+							} else {
+								err = ModifyEdbDataCalculateTcz(int64(edbInfoId), av, val)
+								if err != nil {
+									return err
+								}
+							}
+							break
+						} else {
+							if i >= 1 {
+								preDateDay = preDate.AddDate(0, 0, -i)
+								preDateDayStr = nextDateDay.Format(utils.FormatDate)
+							}
+							if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
+								timestamp := currentDate.UnixNano() / 1e6
+								timestampStr := fmt.Sprintf("%d", timestamp)
+								val := TczSub(currentItem.Value, findItem.Value)
+
+								count, err := GetEdbDataCalculateTczByCodeAndDate(edbCode, av)
+								if err != nil && err.Error() != utils.ErrNoRow() {
+									return err
+								}
+								if count <= 0 {
+									addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
+									isAdd = true
+								} else {
+									err = ModifyEdbDataCalculateTcz(int64(edbInfoId), av, val)
+									if err != nil {
+										return err
+									}
+								}
+							}
+							break
+						}
+					}
+				} else if fromEdbInfo.Frequency == "季度" || fromEdbInfo.Frequency == "年度" {
+					if findItem, ok := dataMap[preDateStr]; ok { //上一年同期->下一个月找到
+						timestamp := currentDate.UnixNano() / 1e6
+						timestampStr := fmt.Sprintf("%d", timestamp)
+						val := TczSub(currentItem.Value, findItem.Value)
+
+						count, err := GetEdbDataCalculateTczByCodeAndDate(edbCode, av)
+						if err != nil && err.Error() != utils.ErrNoRow() {
+							return err
+						}
+						if count <= 0 {
+							addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
+							isAdd = true
+						} else {
+							err = ModifyEdbDataCalculateTcz(int64(edbInfoId), av, val)
+							if err != nil {
+								return err
+							}
+						}
+						break
+					}
+				} else {
+					nextDateDay := preDate.AddDate(0, 0, 1)
+					nextDateDayStr := nextDateDay.Format(utils.FormatDate)
+
+					preDateDay := preDate.AddDate(0, 0, -1)
+					preDateDayStr := preDateDay.Format(utils.FormatDate)
+
+					for i := 0; i < 35; i++ {
+						if i >= 1 {
+							nextDateDay = nextDateDay.AddDate(0, 0, i)
+							nextDateDayStr = nextDateDay.Format(utils.FormatDate)
+						}
+						if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
+							timestamp := currentDate.UnixNano() / 1e6
+							timestampStr := fmt.Sprintf("%d", timestamp)
+							val := TczSub(currentItem.Value, findItem.Value)
+
+							count, err := GetEdbDataCalculateTczByCodeAndDate(edbCode, av)
+							if err != nil && err.Error() != utils.ErrNoRow() {
+								return err
+							}
+							if count <= 0 {
+								addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
+								isAdd = true
+							} else {
+								err = ModifyEdbDataCalculateTcz(int64(edbInfoId), av, val)
+								if err != nil {
+									return err
+								}
+							}
+							break
+						} else {
+							if i >= 1 {
+								preDateDay = preDate.AddDate(0, 0, -i)
+								preDateDayStr = nextDateDay.Format(utils.FormatDate)
+							}
+							if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
+								timestamp := currentDate.UnixNano() / 1e6
+								timestampStr := fmt.Sprintf("%d", timestamp)
+								val := TczSub(currentItem.Value, findItem.Value)
+
+								count, err := GetEdbDataCalculateTczByCodeAndDate(edbCode, av)
+								if err != nil && err.Error() != utils.ErrNoRow() {
+									return err
+								}
+								if count <= 0 {
+									addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
+									isAdd = true
+								} else {
+									err = ModifyEdbDataCalculateTcz(int64(edbInfoId), av, val)
+									if err != nil {
+										return err
+									}
+								}
+							}
+							break
+						}
+					}
+				}
+			}
+		}
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = o.Raw(addSql).Exec()
+		if err != nil {
+			return err
+		}
+	}
+	return
+}
+
+type EdbInfoCalculateTczDetail struct {
+	EdbInfoCalculateTczId int       `orm:"column(edb_info_calculate_tcz_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 GetEdbInfoCalculateTczDetail(edbInfoId int) (item *EdbInfoCalculateTczDetail, err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	sql := ` SELECT a.*,b.start_date,b.end_date FROM edb_info_calculate_tcz 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
+}
+
+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=? `
+	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
+	return
+}
+
+func ModifyEdbDataCalculateTcz(edbInfoId int64, dataTime string, value float64) (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=? `
+	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
+	return
+}

+ 8 - 0
models/data_manage/holiday.go

@@ -0,0 +1,8 @@
+package data_manage
+
+import "time"
+
+type Holiday struct {
+	Year        int
+	HolidayDate time.Time
+}

+ 3 - 3
services/data_manage/data_calculate.go → services/data/data_calculate.go

@@ -1,4 +1,4 @@
-package data_manage
+package data
 
 import (
 	"errors"
@@ -12,7 +12,7 @@ import (
 	"github.com/yidane/formula"
 )
 
-//刷新数据
+//指标运算刷新数据
 func RefreshCalculate(edbInfoIdArr []*data_manage.EdbInfo, edbInfoId int, edbCode, formulaStr, startDate, endDate string, edbInfoIdBytes []string) (err error) {
 	defer func() {
 		if err != nil {
@@ -34,7 +34,7 @@ func RefreshCalculate(edbInfoIdArr []*data_manage.EdbInfo, edbInfoId int, edbCod
 			condition += " AND data_time<=? "
 			pars = append(pars, endDate)
 		}
-		dataList, err := data_manage.GetEdbDataListAll(condition, pars, v.Source)
+		dataList, err := data_manage.GetEdbDataListAll(condition, pars, v.Source, 1)
 		if err != nil {
 			return err
 		}

+ 1 - 1
services/data_manage/data_pb.go → services/data/data_pb.go

@@ -1,4 +1,4 @@
-package data_manage
+package data
 
 import (
 	"encoding/json"

+ 1 - 1
services/data_manage/data_ths.go → services/data/data_ths.go

@@ -1,4 +1,4 @@
-package data_manage
+package data
 
 import (
 	"encoding/json"

+ 1 - 1
services/data_manage/data_wind.go → services/data/data_wind.go

@@ -1,4 +1,4 @@
-package data_manage
+package data
 
 import (
 	"encoding/json"

+ 116 - 33
services/data_manage/edb_info.go → services/data/edb_info.go

@@ -1,4 +1,4 @@
-package data_manage
+package data
 
 import (
 	"context"
@@ -7,6 +7,7 @@ import (
 	"hongze/hongze_task/models/data_manage"
 	"hongze/hongze_task/utils"
 	"rdluck_tools/http"
+	"strconv"
 	"time"
 )
 
@@ -50,12 +51,12 @@ func RefreshDataFromThs() (err error) {
 				return err
 			}
 		}
-		//minDate, maxDate, err := data_manage.GetEdbDataThsMaxOrMinDate(v.EdbInfoId)
+		//minDate, maxDate, err := data.GetEdbDataThsMaxOrMinDate(v.EdbInfoId)
 		//if err != nil {
 		//	return errors.New("GetEdbDataThsMaxOrMinDate:" + err.Error())
 		//}
 		//fmt.Println("minDate:" + minDate + ";maxDate:" + maxDate)
-		//err = data_manage.ModifyEdbDataInfoDate(v.EdbInfoId, maxDate)
+		//err = data.ModifyEdbDataInfoDate(v.EdbInfoId, maxDate)
 		//if err != nil {
 		//	return errors.New("ModifyEdbDataInfoDate:" + err.Error())
 		//}
@@ -148,12 +149,12 @@ func RefreshDataFromPb() (err error) {
 				return err
 			}
 		}
-		//minDate, maxDate, err := data_manage.GetEdbDataPbMaxOrMinDate(v.EdbInfoId)
+		//minDate, maxDate, err := data.GetEdbDataPbMaxOrMinDate(v.EdbInfoId)
 		//if err != nil {
 		//	return errors.New("GetEdbDataThsMaxOrMinDate:" + err.Error())
 		//}
 		//fmt.Println("minDate:" + minDate + ";maxDate:" + maxDate)
-		//err = data_manage.ModifyEdbDataInfoDate(v.EdbInfoId, maxDate)
+		//err = data.ModifyEdbDataInfoDate(v.EdbInfoId, maxDate)
 		//if err != nil {
 		//	return errors.New("ModifyEdbDataInfoDate:" + err.Error())
 		//}
@@ -191,49 +192,131 @@ func CheckPbDataInterface(cont context.Context) (err error) {
 	return
 }
 
-//刷新计算指标数据
-func RefreshDataFromCalculate() (err error) {
+//刷新所有计算指标
+func RefreshDataFromCalculateAll() (err error) {
 	defer func() {
 		if err != nil {
-			fmt.Println("RefreshDataFromCalculate Err:" + err.Error())
-			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "RefreshDataFromCalculate ErrMsg:"+err.Error(), utils.EmailSendToUsers)
+			utils.FileLog.Info("RefreshDataFromCalculateAll Err:" + err.Error())
+			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "RefreshDataFromCalculateAll ErrMsg:"+err.Error(), utils.EmailSendToUsers)
 		}
 	}()
 	var condition string
 	var pars []interface{}
-	condition += " AND source=? "
-	pars = append(pars, utils.DATA_SOURCE_CALCULATE)
+	condition += " AND edb_type=? "
+	pars = append(pars, 2)
 	items, err := data_manage.GetEdbInfoByCondition(condition, pars)
 	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)
-	}
 	for _, v := range items {
-		startDate := v.EndDate.AddDate(0, 0, -3).Format(utils.FormatDate)
-		var edbInfoIdBytes []string
-		calculateMap, err := data_manage.GetEdbInfoCalculateDetail(int(v.EdbInfoId))
-		if err != nil {
+		edbInfoId := v.EdbInfoId
+		edbCode := v.EdbCode
+
+		if v.Source == utils.DATA_SOURCE_CALCULATE {
+			startDate := v.EndDate.AddDate(0, 0, -3).Format(utils.FormatDate)
+			endDate := time.Now().Format(utils.FormatDate)
+			var edbInfoIdBytes []string
+			calculateMap, err := data_manage.GetEdbInfoCalculateDetail(int(v.EdbInfoId))
+			if err != nil {
+				return err
+			}
+			var formulaStr string
+			edbInfoList := make([]*data_manage.EdbInfo, 0)
+			for _, v := range calculateMap {
+				formulaStr += v.FromTag + ","
+				edbInfoIdBytes = append(edbInfoIdBytes, v.FromTag)
+				edbInfo, _ := data_manage.GetEdbInfoById(v.EdbInfoId)
+				edbInfoList = append(edbInfoList, edbInfo)
+			}
+			err = RefreshCalculate(edbInfoList, edbInfoId, edbCode, v.CalculateFormula, startDate, endDate, edbInfoIdBytes)
+			if err != nil {
+				return err
+			}
+		} else if v.Source == utils.DATA_SOURCE_CALCULATE_LJZZY {
+			calculateLjzzy, err := data_manage.GetEdbInfoCalculateLjzzyDetail(edbInfoId)
+			if err != nil {
+				return err
+			}
+			fromEdbInfo, err := data_manage.GetEdbInfoById(calculateLjzzy.FromEdbInfoId)
+			if err != nil {
+				return err
+			}
+			year := time.Now().Year()
+			startDate := strconv.Itoa(year) + "-01" + "-01"
+			endDate := time.Now().Format(utils.FormatDate)
+			err = data_manage.RefreshCalculateLjzzy(edbInfoId, fromEdbInfo, edbCode, startDate, endDate)
+			if err != nil {
+				return err
+			}
+		} else if v.Source == utils.DATA_SOURCE_CALCULATE_TBZ {
+			calculateTbz, err := data_manage.GetEdbInfoCalculateTbzDetail(edbInfoId)
+			if err != nil {
+				return err
+			}
+			fromEdbInfo, err := data_manage.GetEdbInfoById(calculateTbz.FromEdbInfoId)
+			if err != nil {
+				return err
+			}
+			startDate := time.Now().AddDate(-1, -2, 0).Format(utils.FormatDate)
+			endDate := time.Now().Format(utils.FormatDate)
+			err = data_manage.RefreshCalculateTbz(edbInfoId, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate)
+			if err != nil {
+				return err
+			}
+		} else if v.Source == utils.DATA_SOURCE_CALCULATE_TCZ {
+			calculateTcz, err := data_manage.GetEdbInfoCalculateTczDetail(edbInfoId)
+			if err != nil {
+				return err
+			}
+			fromEdbInfo, err := data_manage.GetEdbInfoById(calculateTcz.FromEdbInfoId)
+			if err != nil {
+				return err
+			}
+			startDate := time.Now().AddDate(-1, -2, 0).Format(utils.FormatDate)
+			endDate := time.Now().Format(utils.FormatDate)
+			err = data_manage.RefreshCalculateTcz(edbInfoId, fromEdbInfo, calculateTcz.EdbCode, startDate, endDate)
+			if err != nil {
+				return err
+			}
+		} else if v.Source == utils.DATA_SOURCE_CALCULATE_NSZYDPJJS {
+			calculateNszydpjjs, err := data_manage.GetEdbInfoCalculateNszydpjjsDetail(edbInfoId)
+			if err != nil {
+				return err
+			}
+			fromEdbInfo, err := data_manage.GetEdbInfoById(calculateNszydpjjs.FromEdbInfoId)
+			if err != nil {
+				return err
+			}
+			formulaInt, _ := strconv.Atoi(v.CalculateFormula)
+			err = data_manage.RefreshCalculateNszydpjjs(edbInfoId, v.Source, formulaInt, fromEdbInfo, calculateNszydpjjs.EdbCode)
+			if err != nil {
+				return err
+			}
+		} else {
+			msg := "刷新失败,无效的指标渠道"
+			err = errors.New(msg)
 			return err
 		}
-		var formulaStr string
-		edbInfoList := make([]*data_manage.EdbInfo, 0)
-		for _, v := range calculateMap {
-			formulaStr += v.FromTag + ","
-			edbInfoIdBytes = append(edbInfoIdBytes, v.FromTag)
-			edbInfo, _ := data_manage.GetEdbInfoById(v.FromEdbInfoId)
-			edbInfoList = append(edbInfoList, edbInfo)
-		}
-		err = RefreshCalculate(edbInfoList, v.EdbInfoId, v.EdbCode, v.CalculateFormula, startDate, endDate, edbInfoIdBytes)
+	}
+	return err
+}
+
+//刷新指标农历数据
+func RefreshDataFromQuarterAll() (err error) {
+	defer func() {
 		if err != nil {
-			return err
+			utils.FileLog.Info("RefreshDataFromQuarterAll Err:" + err.Error())
+			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "RefreshDataFromQuarterAll ErrMsg:"+err.Error(), utils.EmailSendToUsers)
 		}
+	}()
+
+	items, err := data_manage.GetQuarterEdbInfo()
+	if err != nil {
+		return err
+	}
+
+	for _, v := range items {
+		data_manage.RefreshCalculateQuarter(v.EdbInfoId, v.Source, v.EdbCode)
 	}
 	return err
 }

+ 1 - 1
services/data_manage/edb_info_calculate.go → services/data/edb_info_calculate.go

@@ -1,4 +1,4 @@
-package data_manage
+package data
 
 import (
 	"fmt"

+ 9 - 7
services/task.go

@@ -4,8 +4,8 @@ import (
 	"context"
 	"fmt"
 	"github.com/beego/beego/v2/task"
+	"hongze/hongze_task/services/data"
 	"hongze/hongze_task/services/company_contract"
-	"hongze/hongze_task/services/data_manage"
 	"hongze/hongze_task/utils"
 )
 
@@ -92,10 +92,10 @@ func releaseTask() {
 	refreshCalculateData := task.NewTask("refreshCalculateData", "0 15 0,19 * * *", RefreshCalculateData)
 	task.AddTask("refreshCalculateData", refreshCalculateData)
 
-	checkDataInterface := task.NewTask("checkDataInterface", "0 */2 * * * * ", data_manage.CheckDataInterface)
+	checkDataInterface := task.NewTask("checkDataInterface", "0 */2 * * * * ", data.CheckDataInterface)
 	task.AddTask("checkDataInterface", checkDataInterface)
 
-	checkPbDataInterface := task.NewTask("checkPbDataInterface", "0 */5 * * * * ", data_manage.CheckPbDataInterface)
+	checkPbDataInterface := task.NewTask("checkPbDataInterface", "0 */5 * * * * ", data.CheckPbDataInterface)
 	task.AddTask("checkPbDataInterface", checkPbDataInterface)
 }
 
@@ -130,16 +130,18 @@ func OneMinute(cont context.Context) (err error) {
 
 func RefreshData(cont context.Context) (err error) {
 	//wind
-	go data_manage.RefreshDataFromWind()
+	go data.RefreshDataFromWind()
 	//同花顺
-	go data_manage.RefreshDataFromThs()
+	go data.RefreshDataFromThs()
 	//彭博
-	go data_manage.RefreshDataFromPb()
+	go data.RefreshDataFromPb()
 	return
 }
 
 func RefreshCalculateData(cont context.Context) (err error) {
 	//计算指标
-	go data_manage.RefreshDataFromCalculate()
+	go data.RefreshDataFromCalculateAll()
+	//刷新公历转农历数据
+	go data.RefreshDataFromQuarterAll()
 	return
 }

+ 9 - 4
utils/constants.go

@@ -63,10 +63,15 @@ const (
 
 //数据来源渠道
 const (
-	DATA_SOURCE_THS       = iota + 1 //同花顺
-	DATA_SOURCE_WIND                 //wind
-	DATA_SOURCE_PB                   //彭博
-	DATA_SOURCE_CALCULATE            //计算指标
+	DATA_SOURCE_THS                 = iota + 1 //同花顺
+	DATA_SOURCE_WIND                           //wind
+	DATA_SOURCE_PB                             //彭博
+	DATA_SOURCE_CALCULATE                      //计算指标
+	DATA_SOURCE_CALCULATE_LJZZY                //累计值转月
+	DATA_SOURCE_CALCULATE_TBZ                  //同比值
+	DATA_SOURCE_CALCULATE_TCZ                  //同差值
+	DATA_SOURCE_CALCULATE_NSZYDPJJS            //N数值移动平均计算
+	DATA_SOURCE_QUARTER                        //公历转农历
 )
 
 //http://datawind.hzinsights.com:8040/hz_server