瀏覽代碼

Merge branch 'activity' into debug

Roc 3 年之前
父節點
當前提交
c955cbb3da

+ 1 - 1
.gitignore

@@ -11,4 +11,4 @@ hongze_task
 go.sum
 go.mod
 /lastupdate.tmp
-.DS_Store
+.DS_Store

+ 0 - 326
go.sum

@@ -1,326 +0,0 @@
-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.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=
-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.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=
-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/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=
-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/wenzhenxi/gorsa v0.0.0-20210524035706-528c7050d703 h1:Tiqr9EWpYopXZf668mgTNWguzE6ssRIEviULO3gSWnU=
-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=
-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-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=
-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 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=
-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=

+ 39 - 0
main.go

@@ -1,9 +1,16 @@
 package main
 
 import (
+	"fmt"
 	"github.com/beego/beego/v2/server/web"
 	_ "hongze/hongze_task/routers"
 	"hongze/hongze_task/services"
+	"hongze/hongze_task/utils"
+	"runtime"
+	"time"
+
+	"github.com/beego/beego/v2/server/web/context"
+	"github.com/beego/beego/v2/adapter/logs"
 )
 
 func main() {
@@ -13,5 +20,37 @@ func main() {
 	}
 	go services.Task()
 	//services.TaskTest()
+	web.BConfig.RecoverFunc = Recover
 	web.Run()
 }
+
+func Recover(ctx *context.Context, conf *web.Config) {
+	if err := recover(); err != nil {
+		if err == web.ErrAbort {
+			return
+		}
+		if !web.BConfig.RecoverPanic {
+			panic(err)
+		}
+		stack := ""
+		msg := fmt.Sprintf("The request url is  %v", ctx.Input.URL())
+		stack += msg + "</br>"
+		logs.Critical(msg)
+		msg = fmt.Sprintf("The request data is %v", string(ctx.Input.RequestBody))
+		stack += msg + "</br>"
+		logs.Critical(msg)
+		msg = fmt.Sprintf("Handler crashed with error %v", err)
+		stack += msg + "</br>"
+		logs.Critical(msg)
+		for i := 1; ; i++ {
+			_, file, line, ok := runtime.Caller(i)
+			if !ok {
+				break
+			}
+			logs.Critical(fmt.Sprintf("%s:%d", file, line))
+			stack = stack + fmt.Sprintln(fmt.Sprintf("%s:%d</br>", file, line))
+		}
+		go utils.SendEmail(utils.APPNAME+"崩了"+time.Now().Format("2006-01-02 15:04:05"), stack, utils.EmailSendToUsers)
+	}
+	return
+}

+ 172 - 0
models/data_manage/base_from_smm.go

@@ -0,0 +1,172 @@
+package data_manage
+
+import (
+	"rdluck_tools/orm"
+	"time"
+)
+
+type BaseFromSmm struct {
+	BaseFromSmmId int `orm:"column(base_from_smm_id);pk"`
+	Aid           int
+	Name          string
+	Interface     string
+	ApiUpdate     int
+	ApiUpdateType string
+	ApiType       int
+	ApiTypeAll    string
+	Type1         string `orm:"column(type_1)"`
+	Type2         string `orm:"column(type_2)"`
+	Type3         string `orm:"column(type_3)"`
+	ApiStartTime  string
+	ApiUpdateTime string
+	StartTime     string
+	FinishTime    string
+	AuthModule    string
+	AuthLang      string
+	ApiLabel      string
+	Enable        string
+	EditPerson    string
+	EditTime      string
+	AuthDur       int
+	AuthDurType   string
+	StartDate     string
+	EndDate       string
+}
+
+func AddBaseFromSmm(item *BaseFromSmm) (lastId int64, err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	lastId, err = o.Insert(item)
+	return
+}
+
+func GetBaseFromSmmList() (list []*BaseFromSmm, err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	//sql := `SELECT * FROM base_from_smm WHERE interface='cu_annual_copper_cathode_demand_supply_balance_in_china' `
+	sql := `SELECT * FROM base_from_smm WHERE end_date IS NOT NULL `
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+type BaseFromSmmIndex struct {
+	BaseFromSmmIndexId int `orm:"column(base_from_smm_index_id);pk"`
+	Interface          string
+	Name               string
+	IndexCode          string
+	IndexName          string
+	Type1              string `orm:"column(type_1)"`
+	Type2              string `orm:"column(type_2)"`
+	Type3              string `orm:"column(type_3)"`
+	Frequency          string
+	Unit               string
+	ApiStartTime       string
+	ApiUpdateTime      string
+	StartTime          string
+	FinishTime         string
+	CreateTime         time.Time
+	ModifyTime         time.Time
+}
+
+func AddBaseFromSmmIndex(item *BaseFromSmmIndex) (lastId int64, err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	lastId, err = o.Insert(item)
+	return
+}
+
+func GetBaseFromSmmIndex() (list []*BaseFromSmmIndex, err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	sql := `SELECT * FROM base_from_smm_index `
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+type BaseFromSmmData struct {
+	SmmDataId          int `orm:"column(smm_data_id);pk"`
+	BaseFromSmmIndexId int
+	IndexCode          string
+	DataTime           string
+	Value              string
+	CreateTime         time.Time
+	ModifyTime         time.Time
+	DataTimestamp      int64
+}
+
+func AddBaseFromSmmData(item *BaseFromSmmData) (lastId int64, err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	lastId, err = o.Insert(item)
+	return
+}
+
+func GetBaseFromSmmDataAll(indexCode string) (list []*BaseFromSmmData, err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	sql := `SELECT * FROM base_from_smm_data WHERE index_code=?`
+	_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	return
+}
+
+func ModifyBaseFromSmmData(smmDataId int, value string) (err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	sql := `UPDATE base_from_smm_data SET value=?,modify_time=NOW() WHERE smm_data_id=? `
+	_, err = o.Raw(sql, value, smmDataId).Exec()
+	return
+}
+
+func GetBaseFromSmmIndexByCode(smmCode string) (list []*BaseFromSmmIndex, err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	sql := ` SELECT * FROM base_from_smm_index WHERE interface=? `
+	_, err = o.Raw(sql, smmCode).QueryRows(&list)
+	return
+}
+
+func GetBaseFromSmmMaxOrMinDate(indexCode string) (min_date, max_date string, err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date FROM base_from_smm_data WHERE index_code=? `
+	err = o.Raw(sql, indexCode).QueryRow(&min_date, &max_date)
+	return
+}
+
+
+func ModifyBaseFromSmmSmmType(baseFromSmmId int, smmType string) (err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	sql := ` UPDATE base_from_smm SET smm_type=? WHERE base_from_smm_id=? `
+	_, err = o.Raw(sql, smmType, baseFromSmmId).Exec()
+	return
+}
+
+func ModifyBaseFromSmmMinDateAndMaxDate(baseFromSmmIndexId, baseFromSmmId int, minDate, maxDate string) (err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	sql := ` UPDATE base_from_smm_index SET start_date=?,end_date=?,modify_time=NOW() WHERE base_from_smm_index_id=? `
+	_, err = o.Raw(sql, minDate, maxDate, baseFromSmmIndexId).Exec()
+	sql = ` UPDATE base_from_smm SET start_date=?,end_date=?,modify_time=NOW() WHERE base_from_smm_id=? `
+	_, err = o.Raw(sql, minDate, maxDate, baseFromSmmId).Exec()
+	return
+}
+
+type BaseFromSmmDataSimple struct {
+	SmmDataId          int `orm:"column(smm_data_id);pk"`
+	BaseFromSmmIndexId int
+	IndexCode          string
+	DataTime           string
+	Value              float64
+}
+
+func GetBaseFromSmmDataByCondition(condition string, pars []interface{}) (list []*BaseFromSmmDataSimple, err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	sql := `SELECT * FROM base_from_smm_data WHERE 1=1 `
+	if condition!="" {
+		sql+=condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&list)
+	return
+}

+ 25 - 13
models/data_manage/edb_data_gl.go

@@ -16,7 +16,6 @@ func AddEdbDataGlBySql(sqlStr string) (err error) {
 	return
 }
 
-
 type GlData struct {
 	InputValue string `orm:"column(DATA_VALUE)" description:"日期"`
 	DataTime   string `orm:"column(DATA_DATE)" description:"值"`
@@ -85,20 +84,29 @@ func RefreshEdbDataByGl(edbInfoId int, edbCode, startDate, endDate string) (err
 		condition += " AND DATA_DATE<=? "
 		pars = append(pars, endDate)
 	}
+	//获取已存在指标所有数据
+	existDataList := make([]*EdbDataBase, 0)
+	dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_GL)
+	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
+	}
 
 	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)
+	addExistMap := 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 {
+		if _, ok := addExistMap[v.DataTime]; !ok {
+			if existVal, existOk := existDataMap[v.DataTime]; !existOk {
 				eDate := item.DataTime
 				sValue := item.InputValue
 				if sValue != "" {
@@ -112,13 +120,17 @@ func RefreshEdbDataByGl(edbInfoId int, edbCode, startDate, endDate string) (err
 					isAdd = true
 				}
 			} else {
-				err = ModifyEdbDataGl(int64(edbInfoId), v.DataTime, v.InputValue)
-				if err != nil {
-					return err
+				if existVal != item.InputValue {
+					sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
+					sql = fmt.Sprintf(sql, dataTableName)
+					_, err = o.Raw(sql, item.InputValue, edbInfoId, v.DataTime).Exec()
+					if err != nil {
+						return err
+					}
 				}
 			}
 		}
-		existMap[v.DataTime] = v.InputValue
+		addExistMap[v.DataTime] = v.InputValue
 	}
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
@@ -129,4 +141,4 @@ func RefreshEdbDataByGl(edbInfoId int, edbCode, startDate, endDate string) (err
 	}
 
 	return
-}
+}

+ 39 - 34
models/data_manage/edb_data_lz.go

@@ -124,35 +124,51 @@ func RefreshEdbDataByLz(edbInfoId int, edbCode, startDate, endDate string) (err
 
 	lzDataList, err := GetLzSurveyDataByTradeCode(condition, pars)
 
+	//获取已存在指标所有数据
+	existDataList := make([]*EdbDataBase, 0)
+	dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_LZ)
+	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_lz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
 	var isAdd bool
+	addExistMap := make(map[string]string)
 	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 _, ok := addExistMap[v.DataTime]; !ok {
+			if existVal, existOk := existDataMap[v.DataTime]; !existOk {
+				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 {
+				if existVal != item.InputValue {
+					sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
+					sql = fmt.Sprintf(sql, dataTableName)
+					_, err = o.Raw(sql, item.InputValue, edbInfoId, v.DataTime).Exec()
+					if err != nil {
+						return err
+					}
+				}
 			}
 		}
+		addExistMap[v.DataTime] = v.InputValue
 	}
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
@@ -161,16 +177,5 @@ func RefreshEdbDataByLz(edbInfoId int, edbCode, startDate, endDate string) (err
 			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
 }

+ 316 - 75
models/data_manage/edb_data_ys.go

@@ -17,112 +17,353 @@ import (
 	"net/url"
 	"rdluck_tools/orm"
 	"strconv"
-	"strings"
 	"time"
 )
 
-//刷新有色指标数据
-func RefreshEdbDataByYs(edbInfoId int, edbCode, startDate, endDate string) (err error) {
+type EdbDataYs struct {
+	EdbDataId     int `orm:"column(edb_data_id);pk"`
+	EdbInfoId     int
+	EdbCode       string
+	DataTime      string
+	Value         float64
+	Status        int
+	CreateTime    time.Time
+	ModifyTime    time.Time
+	DataTimestamp int64
+}
+
+func AddEdbDataSmm(items []*EdbDataYs) (err error) {
 	o := orm.NewOrm()
 	o.Using("data")
-	o.Begin()
-	defer func() {
-		if err != nil {
-			o.Rollback()
+	_, err = o.InsertMulti(1, items)
+	return
+}
+
+func ModifyEdbDataSmm(edbCode, dataTime string, value float64) (err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	sql := ` UPDATE edb_data_ys SET value=?,status=1,modify_time=NOW() WHERE edb_code=? AND data_time=? `
+	_, err = o.Raw(sql, value, edbCode, dataTime).Exec()
+	return
+}
+
+//刷新有色指标数据
+func RefreshEdbDataByYs(edbInfoId int, edbCode, startDate, endDate string) (err error) {
+	var condition string
+	var pars []interface{}
+	condition += " AND index_code=? "
+	pars = append(pars, edbCode)
+
+	if startDate != "" {
+		condition += " AND data_time>=? "
+		pars = append(pars, startDate)
+	}
+
+	if endDate != "" {
+		condition += " AND data_time<=? "
+		pars = append(pars, endDate)
+	}
+
+	ysBaseDataAll, err := GetBaseFromSmmDataByCondition(condition, pars)
+	if err != nil {
+		err = errors.New("GetBaseFromSmmDataByCondition Err:" + err.Error())
+		return
+	}
+	var existCondition string
+	var existPars []interface{}
+	existCondition += " AND edb_code=? "
+	existPars = append(existPars, edbCode)
+
+	existDataList, err := GetEdbDataListAll(existCondition, existPars, utils.DATA_SOURCE_YS, 1)
+	if err != nil {
+		err = errors.New("GetEdbDataListAll Err:" + err.Error())
+		return err
+	}
+
+	existMap := make(map[string]float64)
+	for _, ev := range existDataList {
+		existMap[ev.DataTime] = ev.Value
+	}
+	ysList := make([]*EdbDataYs, 0)
+	for _, dv := range ysBaseDataAll {
+		if existItem, ok := existMap[dv.DataTime]; !ok { //新增
+			dataDate, _ := time.Parse(utils.FormatDate, dv.DataTime)
+			timestamp := dataDate.UnixNano() / 1e6
+			item := new(EdbDataYs)
+			item.EdbCode = edbCode
+			item.EdbInfoId = edbInfoId
+			item.CreateTime = time.Now()
+			item.ModifyTime = time.Now()
+			item.DataTime = dv.DataTime
+			item.Value = dv.Value
+			item.Status = 1
+			item.DataTimestamp = timestamp
+			ysList = append(ysList, item)
 		} else {
-			o.Commit()
+			if dv.Value != existItem { //修改
+				fmt.Println("ModifyEdbDataSmm:", edbCode, dv.DataTime, dv.Value)
+				ModifyEdbDataSmm(edbCode, dv.DataTime, dv.Value)
+			}
+		}
+	}
+	if len(ysList) > 0 {
+		err = AddEdbDataSmm(ysList)
+		if err != nil {
+			return
 		}
-	}()
+	}
+	return
+}
+
+/*
 
+//有色基础指标同步
+func SyncSmmIndexDataBase() {
+	utils.FileLog.Info("start:" + time.Now().Format(utils.FormatDateTime))
+	list, err := data_manage.GetBaseFromSmmList()
+	if err != nil {
+		fmt.Println("GetBaseFromSmmList Err:" + err.Error())
+		return
+	}
 	token, err := getToken("pqian@hzinsights.com", "hz123456")
 	if err != nil {
 		fmt.Println(err)
 		return
 	}
-
-	ysResult, err := getApiData(token, edbCode, startDate, endDate)
+	endDate := time.Now().Format(utils.FormatDate)
+	smmIndexAll, err := data_manage.GetBaseFromSmmIndex()
 	if err != nil {
-		fmt.Println(err)
+		fmt.Println("GetBaseFromSmmIndex Err:" + err.Error())
 		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)
+	existIndexMap := make(map[string]*data_manage.BaseFromSmmIndex)
+	for _, item := range smmIndexAll {
+		existIndexMap[item.IndexCode] = item
+	}
+
+	for k, v := range list {
+		edbCode := v.Interface
+		var startDate string
+		if v.EndDate == "" || v.EndDate == "0000-00-00" {
+			startDate = v.ApiStartTime
+		} else {
+			if v.EndDate != "" {
+				dateFormate, _ := time.Parse(utils.FormatDate, v.EndDate)
+				var syncDay int
+				if v.ApiUpdateType == "day" {
+					syncDay = utils.DATA_REFRESH
+				} else if v.ApiUpdateType == "month" {
+					syncDay = utils.DATA_REFRESH * 30
+				} else if v.ApiUpdateType == "week" {
+					syncDay = utils.DATA_REFRESH * 7
+				} else if v.ApiUpdateType == "year" {
+					syncDay = utils.DATA_REFRESH * 365
 				}
+				startDate = dateFormate.AddDate(0, 0, -syncDay).Format(utils.FormatDate)
 			}
-			if sValue=="" {
-				continue
+		}
+
+		ysItem, err := getApiData(token, edbCode, startDate, endDate)
+		if err != nil {
+			fmt.Println(err)
+			return
+		}
+		if ysItem != nil && ysItem.Code == 200 {
+
+			frequency := ysItem.Data.Frequency
+
+			indexMap := make(map[string]int)
+			smmIndexIdMap := make(map[int]int)
+			indexCodeMap := make(map[int]string)
+
+			indexKey := 0
+			var isDateIndex int
+			for fk, fv := range ysItem.Data.Field {
+				if fv.IsDate == "1" {
+					isDateIndex = fk
+				} else {
+					if !strings.Contains(fv.Name, "产品名称") &&
+						!strings.Contains(fv.Name, "单位") &&
+						!strings.Contains(fv.Name, "时间") &&
+						!strings.Contains(fv.Name, "备注") {
+
+						indexMap[fv.DBColName] = fk
+
+						indexKey += 1
+						indexCode := v.Interface + "#" + strconv.Itoa(indexKey)
+
+						if findItem, ok := existIndexMap[indexCode]; !ok {
+							ssmIndex := new(data_manage.BaseFromSmmIndex)
+							ssmIndex.Interface = v.Interface
+							ssmIndex.Name = v.Name
+							ssmIndex.IndexCode = indexCode
+							ssmIndex.IndexName = v.Name + "_" + fv.Name
+							ssmIndex.Type1 = v.Type1
+							ssmIndex.Type2 = v.Type2
+							ssmIndex.Type3 = v.Type3
+							ssmIndex.Frequency = frequency
+							ssmIndex.Unit = fv.Unit
+							ssmIndex.ApiStartTime = v.ApiStartTime
+							ssmIndex.ApiUpdateTime = v.ApiUpdateTime
+							ssmIndex.StartTime = v.StartTime
+							ssmIndex.FinishTime = v.FinishTime
+							ssmIndex.CreateTime = time.Now()
+							ssmIndex.ModifyTime = time.Now()
+							lastIndexId, err := data_manage.AddBaseFromSmmIndex(ssmIndex)
+							if err != nil {
+								return
+							}
+							smmIndexIdMap[fk] = int(lastIndexId)
+							indexCodeMap[fk] = indexCode
+						} else {
+							smmIndexIdMap[fk] = findItem.BaseFromSmmIndexId
+							indexCodeMap[fk] = findItem.IndexCode
+						}
+					}
+				}
 			}
-			if frequency == "月" {
-				monthDate, err := time.Parse("2006-01", eDate)
+
+			existDataMap := make(map[string]*data_manage.BaseFromSmmData)
+			for _, mv := range indexCodeMap {
+				indexCode := mv
+				dataAllList, err := data_manage.GetBaseFromSmmDataAll(indexCode)
 				if err != nil {
-					fmt.Println("time.Parse:" + err.Error())
+					fmt.Println("GetBaseFromSmmData Err:" + err.Error())
+					return
 				}
-				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)
+				for _, item := range dataAllList {
+					key := item.IndexCode + item.DataTime
+					existDataMap[key] = item
 				}
-				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)
+
+			addExistDataMap := make(map[string]string)
+
+			for _, dv := range ysItem.Data.Content {
+				var dataTime string
+				dataTime = dv[isDateIndex]
+				if strings.Contains(dataTime, "Q1") {
+					dataTime = strings.Replace(dataTime, "Q1", "-01", -1)
+					dataTime += "-31"
+				}
+				if strings.Contains(dataTime, "Q2") {
+					dataTime = strings.Replace(dataTime, "Q2", "-06", -1)
+					dataTime += "-30"
+				}
+				if strings.Contains(dataTime, "Q3") {
+					dataTime = strings.Replace(dataTime, "Q3", "-09", -1)
+					dataTime += "-30"
+				}
+				if strings.Contains(dataTime, "Q4") {
+					dataTime = strings.Replace(dataTime, "Q4", "-12", -1)
+					dataTime += "-31"
+				}
+
+				if strings.Contains(dataTime, "H1") {
+					dataTime = strings.Replace(dataTime, "H1", "-06", -1)
+					dataTime += "-30"
+				}
+
+				if strings.Contains(dataTime, "H2") {
+					dataTime = strings.Replace(dataTime, "H2", "-12", -1)
+					dataTime += "-31"
+				}
+
+				if frequency == "月" {
+					monthDate, err := time.Parse("2006-01", dataTime)
+					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)
+					}
+					dataTime = lastDate
+				} else if frequency == "年" {
+					dataTime = dataTime + "-12-31"
+				}
+				saveDataTime, err := time.Parse(utils.FormatDate, dataTime)
 				if err != nil {
-					return err
+					fmt.Println("saveDataTime parse err:" + err.Error() + " dataTime:" + dataTime)
+					panic(err)
 				}
-				timestamp := dataTime.UnixNano() / 1e6
-				timeStr := fmt.Sprintf("%d", timestamp)
-				if _, ok := existMap[eDate]; !ok {
-					addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
-					isAdd = true
+				timestamp := saveDataTime.UnixNano() / 1e6
+				//循环指标
+				for _, v := range indexMap {
+
+					indexCode := indexCodeMap[v]
+					smmIndexId := smmIndexIdMap[v]
+					dataVal := dv[v]
+
+					if indexCode != "" {
+
+						key := indexCode + dataTime
+						val := strings.Replace(dataVal, ",", "", -1)
+						if findData, dataOk := existDataMap[key]; !dataOk {
+							if _, addOK := addExistDataMap[key]; !addOK {
+								if val != "" && val != "-" {
+									dataItem := new(data_manage.BaseFromSmmData)
+									dataItem.BaseFromSmmIndexId = int(smmIndexId)
+									dataItem.IndexCode = indexCode
+									dataItem.DataTime = dataTime
+									dataItem.Value = val
+									dataItem.CreateTime = time.Now()
+									dataItem.ModifyTime = time.Now()
+									dataItem.DataTimestamp = timestamp
+									_, err = data_manage.AddBaseFromSmmData(dataItem)
+									if err != nil && !strings.Contains(err.Error(), "idx_index_code_date") {
+										fmt.Println("AddBaseFromSmmData Err:" + err.Error())
+										return
+									}
+								}
+							}
+						} else {
+							if findData != nil && findData.Value != val { //修改
+								if _, addOK := addExistDataMap[key]; !addOK {
+									if val != "" && val != "-" {
+										err = data_manage.ModifyBaseFromSmmData(findData.SmmDataId, val)
+										if err != nil {
+											fmt.Println("ModifyBaseFromSmmData Err:" + err.Error())
+											return
+										}
+									}
+								}
+							}
+						}
+						addExistDataMap[key] = key
+					}
 				}
-			} 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
+			//修改数据开始,结束日期
+			{
+				indexList, err := data_manage.GetBaseFromSmmIndexByCode(v.Interface)
+				if err != nil {
+					fmt.Println("GetBaseFromSmmIndexByCode Err:" + err.Error())
+				}
+				for _, sv := range indexList {
+					minDate, maxDate, err := data_manage.GetBaseFromSmmMaxOrMinDate(sv.IndexCode)
+					if err != nil {
+						fmt.Println("GetEdbDataSmmMaxOrMinDate Err:" + err.Error())
+					} else {
+						err = data_manage.ModifyBaseFromSmmMinDateAndMaxDate(sv.BaseFromSmmIndexId, v.BaseFromSmmId, minDate, maxDate)
+						if err != nil {
+							fmt.Println("ModifyBaseFromSmmMinDateAndMaxDate Err:" + err.Error())
+						}
+					}
+				}
+			}
 		}
+		fmt.Println(v.Interface, v.Name, k)
+		time.Sleep(1 * time.Second)
 	}
-	return
+	utils.FileLog.Info("end:" + time.Now().Format(utils.FormatDateTime))
 }
-
-
+*/
 
 const (
 	dataUrl = "https://dataapi.smm.cn/GetData/" //data url (中文)

+ 21 - 6
models/data_manage/edb_info.go

@@ -74,10 +74,11 @@ func ModifyEdbDataInfoDate(edbInfoId int, maxDate string) (err error) {
 }
 
 type EdbInfoMaxAndMinInfo struct {
-	MinDate  string  `description:"最小日期"`
-	MaxDate  string  `description:"最大日期"`
-	MinValue float64 `description:"最小值"`
-	MaxValue float64 `description:"最大值"`
+	MinDate     string  `description:"最小日期"`
+	MaxDate     string  `description:"最大日期"`
+	MinValue    float64 `description:"最小值"`
+	MaxValue    float64 `description:"最大值"`
+	LatestValue float64 `description:"最新值"`
 }
 
 func GetEdbInfoMaxAndMinInfo(source int, edbCode string) (item *EdbInfoMaxAndMinInfo, err error) {
@@ -88,14 +89,20 @@ func GetEdbInfoMaxAndMinInfo(source int, edbCode string) (item *EdbInfoMaxAndMin
 	sql = ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date,MIN(value) AS min_value,MAX(value) AS max_value FROM %s WHERE edb_code=? `
 	sql = fmt.Sprintf(sql, tableName)
 	err = o.Raw(sql, edbCode).QueryRow(&item)
+
+	var latest_value float64
+	sql = ` SELECT value AS latest_value FROM %s WHERE edb_code=? ORDER BY data_time DESC LIMIT 1 `
+	sql = fmt.Sprintf(sql, tableName)
+	err = o.Raw(sql, edbCode).QueryRow(&latest_value)
+	item.LatestValue = latest_value
 	return
 }
 
 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=?,is_update=2,modify_time=NOW() WHERE edb_info_id=? `
-	_, err = o.Raw(sql, item.MinDate, item.MaxDate, item.MinValue, item.MaxValue, edbInfoId).Exec()
+	sql := ` UPDATE edb_info SET start_date=?,end_date=?,min_value=?,max_value=?,is_update=2,latest_date=?,latest_value=?,modify_time=NOW() WHERE edb_info_id=? `
+	_, err = o.Raw(sql, item.MinDate, item.MaxDate, item.MinValue, item.MaxValue, item.MaxDate, item.LatestValue, edbInfoId).Exec()
 	return
 }
 
@@ -140,3 +147,11 @@ func GetQuarterEdbInfo() (item []*EdbInfo, err error) {
 	_, err = o.Raw(sql).QueryRows(&item)
 	return
 }
+
+func ResetEdbInfoIsUpdate() (err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	sql := ` UPDATE edb_info SET is_update=1  `
+	_, err = o.Raw(sql).Exec()
+	return
+}

+ 43 - 20
models/data_manage/edb_info_calculate_bp.go

@@ -42,28 +42,40 @@ func RefreshCalculateBp(edbInfoId int, fromEdbInfo *EdbInfo, edbCode, startDate,
 		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)
+
+	var existCondition string
+	var existPars []interface{}
+	existCondition += " AND edb_info_id=? "
+	existPars = append(existPars, edbInfoId)
+	dataExistList, err := GetEdbDataListAll(existCondition, existPars, utils.DATA_SOURCE_CALCULATE_BP, 0)
+	if err != nil {
+		return err
+	}
+
+	existDataMap := make(map[string]*EdbInfoSearchData)
+	for _, v := range dataExistList {
+		existDataMap[v.DataTime] = v
+	}
+
+	addExistMap := 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
@@ -83,31 +95,42 @@ func RefreshCalculateBp(edbInfoId int, fromEdbInfo *EdbInfo, edbCode, startDate,
 			}
 		}
 		for k := 1; k <= day; k++ {
-			needDay := currentDate.AddDate(0, 0, k).Format(utils.FormatDate)
-			existKey := edbCode + needDay
-			if _, ok := existMap[existKey]; !ok {
+			needDayForm := currentDate.AddDate(0, 0, k)
+			if needDayForm.Before(time.Now()) {
+				needDay := needDayForm.Format(utils.FormatDate)
+				if _, ok := existDataMap[needDay]; !ok {
+					existKey := edbCode + needDay
+					if _, ok := addExistMap[existKey]; !ok {
+						currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
+						timestamp := currentDate.UnixNano() / 1e6
+						timestampStr := fmt.Sprintf("%d", timestamp)
+						valStr := decimal.NewFromFloat(currentItem.Value).String()
+						isAdd = true
+						addSql += GetAddSql(edbInfoIdStr, edbCode, needDay, timestampStr, valStr)
+					}
+					addExistMap[existKey] = needDay
+				}
+			}
+		}
+
+		if _, ok := existDataMap[currentItem.DataTime]; !ok {
+			existKey := edbCode + currentItem.DataTime
+			if _, ok := addExistMap[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)
+				isAdd = true
+				addSql += GetAddSql(edbInfoIdStr, edbCode, currentItem.DataTime, timestampStr, valStr)
 			}
-			existMap[existKey] = needDay
+			addExistMap[existKey] = currentItem.DataTime
 		}
-		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 {
+			fmt.Println("add err:" + err.Error())
 			return err
 		}
 	}
@@ -139,4 +162,4 @@ func GetEdbInfoCalculateBpDetail(edbInfoId int) (item *EdbInfoCalculateTbzDetail
 			WHERE a.edb_info_id=? `
 	err = o.Raw(sql, edbInfoId).QueryRow(&item)
 	return
-}
+}

+ 82 - 0
models/data_manage/edb_info_calculate_mapping.go

@@ -0,0 +1,82 @@
+package data_manage
+
+import (
+	"fmt"
+	"rdluck_tools/orm"
+	"time"
+)
+
+type EdbInfoCalculateMapping struct {
+	EdbInfoCalculateMappingId int       `orm:"column(edb_info_calculate_mapping_id);pk"`
+	EdbInfoId                 int       `description:"计算指标id"`
+	Source                    int       `description:"计算指标来源"`
+	SourceName                string    `description:"计算指标来源名称"`
+	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 AddEdbInfoCalculateMappingMulti(items []*EdbInfoCalculateMapping) (err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	_, err = o.InsertMulti(1, items)
+	return
+}
+
+func FixEdbInfoCalculateMapping() {
+	o := orm.NewOrm()
+	o.Using("data")
+	o.Begin()
+	var err error
+	defer func() {
+		if err != nil {
+			o.Rollback()
+		} else {
+			o.Commit()
+		}
+	}()
+	edbInfoList := make([]*EdbInfoList, 0)
+	sql := `SELECT * FROM edb_info WHERE edb_type=2 `
+	_, err = o.Raw(sql).QueryRows(&edbInfoList)
+	if err != nil {
+		return
+	}
+	for k, v := range edbInfoList {
+		fmt.Println(k, v.EdbInfoId)
+		calculateList := make([]*EdbInfoCalculateDetail, 0)
+		calculateTableName := GetEdbInfoCalculateTableName(v.Source)
+		sql := ` SELECT * FROM %s
+			WHERE edb_info_id=? ORDER BY sort ASC `
+		sql = fmt.Sprintf(sql, calculateTableName)
+		_, err = o.Raw(sql, v.EdbInfoId).QueryRows(&calculateList)
+		if err != nil {
+			fmt.Println("query calculate err:" + err.Error())
+			return
+		}
+		for _, cv := range calculateList {
+			//关联关系
+			calculateMappingItem := new(EdbInfoCalculateMapping)
+			calculateMappingItem.CreateTime = time.Now()
+			calculateMappingItem.ModifyTime = time.Now()
+			calculateMappingItem.Sort = 1
+			calculateMappingItem.EdbCode = v.EdbCode
+			calculateMappingItem.EdbInfoId = v.EdbInfoId
+			calculateMappingItem.FromEdbInfoId = cv.FromEdbInfoId
+			calculateMappingItem.FromEdbCode = cv.FromEdbCode
+			calculateMappingItem.FromEdbName = cv.FromEdbName
+			calculateMappingItem.FromSource = cv.FromSource
+			calculateMappingItem.FromSourceName = cv.FromSourceName
+			calculateMappingItem.FromTag = cv.FromTag
+			calculateMappingItem.Source = v.Source
+			calculateMappingItem.SourceName = v.SourceName
+			o.Insert(calculateMappingItem)
+		}
+	}
+}

+ 64 - 52
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, fromEdbInfo.EdbInfoId)
+	pars = append(pars, edbInfoId)
 
 	dataList, err := GetEdbDataListAll(condition, pars, source, 0)
 	if err != nil {
@@ -56,18 +56,21 @@ func RefreshCalculateNszydpjjs(edbInfoId, source, formulaInt int, fromEdbInfo *E
 
 	existDataMap := make(map[string]*EdbInfoSearchData)
 	for _, v := range dataList {
+		utils.FileLog.Info("exist:",v.DataTime,v.Value)
 		existDataMap[v.DataTime] = v
 	}
 
+	fmt.Println("existDataMap:",existDataMap)
+
 	//计算来源数据
-	startDate := time.Now().AddDate(-2, 0, 0).Format(utils.FormatDate)
+	//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)
+	//fromCondition += " AND data_time>=? "
+	//fromPars = append(fromPars, startDate)
 
 	fromDataList, err := GetEdbDataListAll(fromCondition, fromPars, fromEdbInfo.Source, 0)
 	if err != nil {
@@ -86,58 +89,67 @@ func RefreshCalculateNszydpjjs(edbInfoId, source, formulaInt int, fromEdbInfo *E
 
 	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
-					}
+		//处理第一个值
+		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)
-			totalVal := decimal.NewFromFloat(0.00)
-			for _, v := range valArr {
-				//totalVal = totalVal + v
-				newDecimal := decimal.NewFromFloat(v)
-				totalVal = totalVal.Add(newDecimal)
-			}
-			//af := decimal.NewFromFloat(totalVal)
-			af := totalVal
-
-			bf := decimal.NewFromFloat(float64(valArrLen))
-			val, _ := af.Div(bf).Float64()
-			currentDate, err := time.Parse(utils.FormatDate, av)
-			if err != nil {
-				return err
-			}
+		}
+		valArrLen := len(valArr)
+		totalVal := decimal.NewFromFloat(0.00)
+		for _, v := range valArr {
+			//totalVal = totalVal + v
+			newDecimal := decimal.NewFromFloat(v)
+			totalVal = totalVal.Add(newDecimal)
+		}
+		//af := decimal.NewFromFloat(totalVal)
+		af := totalVal
 
-			timestamp := currentDate.UnixNano() / 1e6
-			timestampStr := fmt.Sprintf("%d", timestamp)
-			valStr := utils.SubFloatToString(val, 4)
+		bf := decimal.NewFromFloat(float64(valArrLen))
+		val, _ := af.Div(bf).Float64()
+		currentDate, err := time.Parse(utils.FormatDate, av)
+		if err != nil {
+			return err
+		}
 
-			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 {
+		timestamp := currentDate.UnixNano() / 1e6
+		timestampStr := fmt.Sprintf("%d", timestamp)
+		valStr := utils.SubFloatToString(val, 4)
+
+		if existItem, existOk := existDataMap[av]; !existOk {
+			//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
+			//	}
+			//}
+			addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, valStr)
+			isAdd = true
+		} else {
+			if existItem.Value != val {
 				err = ModifyEdbDataCalculateNszydpjjs(int64(edbInfoId), av, valStr)
 				if err != nil {
 					return err

+ 9 - 1
models/data_source_longzhong.go

@@ -660,4 +660,12 @@ func GetLongzhongSurveyProductItem(quotaSampleId int64) (item *LongzhongSurveyPr
 	sql := `SELECT * FROM longzhong_survey_product WHERE quota_sample_id=? `
 	err = o.Raw(sql, quotaSampleId).QueryRow(&item)
 	return
-}
+}
+
+func ModifyLzSurveyData(inputValue string, surveyDataId int) (err error) {
+	o := orm.NewOrm()
+	o.Using("edb")
+	sql := ` UPDATE longzhong_survey_data SET input_value=? WHERE survey_data_id=? `
+	_, err = o.Raw(sql, inputValue, surveyDataId).Exec()
+	return
+}

+ 11 - 0
models/db.go

@@ -5,6 +5,7 @@ import (
 	"hongze/hongze_task/models/company_approval"
 	"hongze/hongze_task/models/company_contract"
 	"hongze/hongze_task/models/data_manage"
+	"hongze/hongze_task/models/yb"
 	"hongze/hongze_task/utils"
 	"time"
 
@@ -76,6 +77,16 @@ func init() {
 		new(ReportSendThsDetail),
 		new(Report),
 		new(CompanyEndDate),
+		new(data_manage.BaseFromSmm),
+		new(data_manage.BaseFromSmmIndex),
+		new(data_manage.BaseFromSmmData),
+		new(data_manage.EdbDataYs),
 		new(Edbdata),
+		new(data_manage.EdbInfoCalculateMapping),
+		new(yb.Activity),         // 研报活动表
+		new(yb.ActivityType),     //研报活动分类表
+		new(yb.ActivityVoice),    //研报活动语音表
+		new(yb.ActivityRegister), //研报活动报名表
+		new(yb.Speaker),          //研报主持人表
 	)
 }

+ 11 - 0
models/users.go

@@ -2,6 +2,7 @@ package models
 
 import (
 	"rdluck_tools/orm"
+	"strings"
 )
 
 type HongzeUsers struct {
@@ -81,3 +82,13 @@ func GetUserOpenidListByUserId(userId int) (list []*OpenIdList, err error) {
 	_, err = orm.NewOrm().Raw(sql, userId).QueryRows(&list)
 	return
 }
+
+// GetUserOpenidListByUserIds 根据用户id字符串集合来获取他的openid列表集合
+func GetUserOpenidListByUserIds(userIdStr []string) (list []*OpenIdList, err error) {
+	if len(userIdStr) <= 0 {
+		return
+	}
+	sql := `SELECT open_id FROM user_record WHERE user_id in (` + strings.Join(userIdStr, ",") + `) and create_platform = 1`
+	_, err = orm.NewOrm().Raw(sql).QueryRows(&list)
+	return
+}

+ 129 - 0
models/yb/activity.go

@@ -0,0 +1,129 @@
+package yb
+
+import (
+	"rdluck_tools/orm"
+	"time"
+)
+
+// Activity 活动表
+type Activity struct {
+	ActivityId            int       `orm:"column(activity_id);pk" description:"活动ID"`
+	FirstActivityTypeId   int       `description:"第一级的活动类型ID"`
+	FirstActivityTypeName string    `description:"第一级的活动类型名称"`
+	ActivityTypeId        int       `description:"活动类型ID"`
+	ActivityTypeName      string    `description:"活动类型名称"`
+	ChartPermissionId     int       `description:"对应的权限id,表chart_permission中id"`
+	ChartPermissionName   string    `description:"对应的权限名称,表chart_permission中name"`
+	ActivityName          string    `description:"活动标题"`
+	StartTime             time.Time `description:"活动开始时间"`
+	EndTime               time.Time `description:"活动结束时间"`
+	Speaker               string    `description:"主讲人"`
+	SpeakerHeadPic        string    `description:"主讲人头像"`
+	SpeakerBackgroundPic  string    `description:"主讲人背景图"`
+	MainlandTel           string    `description:"大陆拨入"`
+	HongKongTel           string    `description:"香港拨入"`
+	TaiwanTel             string    `description:"台湾拨入"`
+	AmericaTel            string    `description:"美国拨入"`
+	SingaporeTel          string    `description:"新加坡拨入"`
+	ParticipationCode     string    `description:"参会密码"`
+	LinkParticipants      string    `description:"参会链接"`
+	IsLimitPeople         int8      `description:"是否限制人数 1是,0否"`
+	LimitPeopleNum        int       `description:"限制人数数量"`
+	ReportLink            string    `description:"报告链接"`
+	City                  string    `description:"城市"`
+	Address               string    `description:"活动地址"`
+	PosterUrl             string    `description:"活动海报地址"`
+	Remarks               string    `description:"备注"`
+	UserId                int       `description:"创建者id"`
+	PublishStatus         int8      `description:"发布状态,0未发布,1已发布"`
+	IsSendWxMsg           int8      `description:"是否推送过会议提醒微信消息,未推送:0,已推送:1"`
+	IsSendSalonWxMsg      int8      `description:"是否推送过沙龙提醒微信消息,未推送:0,已推送:1"`
+	IsDelete              int8      `description:"是否删除,0:未删除,1:已删除"`
+	ArticleId             int       `description:"报告链接所关联的文章ID"`
+	ModifyTime            time.Time `description:"修改时间"`
+	CreateTime            time.Time `description:"创建时间"`
+}
+
+// TableName 表名变更
+func (activity *Activity) TableName() string {
+	return "yb_activity"
+}
+
+// GetById 根据id获取活动详情
+func GetById(activityId int) (item *Activity, err error) {
+	o := orm.NewOrm()
+	sql := "select * from yb_activity where activity_id=? AND is_delete = 0 "
+	err = o.Raw(sql, activityId).QueryRow(&item)
+	return
+}
+
+type ActivityList struct {
+	ActivityId            int              `orm:"column(activity_id);pk" description:"活动ID"`
+	FirstActivityTypeId   int              `description:"第一级的活动类型ID"`
+	FirstActivityTypeName string           `description:"第一级的活动类型名称"`
+	ActivityTypeId        int              `description:"活动类型ID"`
+	ActivityTypeName      string           `description:"活动类型名称"`
+	ChartPermissionId     int              `description:"对应的权限id,表chart_permission中id"`
+	ChartPermissionName   string           `description:"对应的权限名称,表chart_permission中name"`
+	ActivityName          string           `description:"活动标题"`
+	StartTime             time.Time        `description:"活动开始时间"`
+	EndTime               time.Time        `description:"活动结束时间"`
+	Speaker               string           `description:"主讲人"`
+	MainlandTel           string           `description:"大陆拨入"`
+	HongKongTel           string           `description:"香港拨入"`
+	TaiwanTel             string           `description:"台湾拨入"`
+	AmericaTel            string           `description:"美国拨入"`
+	SingaporeTel          string           `description:"新加坡拨入"`
+	ParticipationCode     string           `description:"参会密码"`
+	LinkParticipants      string           `description:"参会链接"`
+	IsLimitPeople         int8             `description:"是否限制人数 1是,0否"`
+	LimitPeopleNum        int              `description:"限制人数数量"`
+	ReportLink            string           `description:"报告链接"`
+	City                  string           `description:"城市"`
+	Address               string           `description:"活动地址"`
+	PosterUrl             string           `description:"活动海报地址"`
+	Remarks               string           `description:"备注"`
+	UserId                int              `description:"创建者id"`
+	PublishStatus         int8             `description:"发布状态,0未发布,1已发布"`
+	IsSendWxMsg           int8             `description:"是否推送过会议提醒微信消息,未推送:0,已推送:1"`
+	IsSendSalonWxMsg      int8             `description:"是否推送过沙龙提醒微信消息,未推送:0,已推送:1"`
+	ArticleId             int              `description:"报告链接所关联的文章ID"`
+	ModifyTime            time.Time        `description:"修改时间"`
+	CreateTime            time.Time        `description:"创建时间"`
+	VoiceList             []*ActivityVoice `description:"音频文件列表"`
+}
+
+// GetList 获取活动列表数据
+func GetList(condition string, pars []interface{}, startSize, pageSize int) (total int, list []*Activity, err error) {
+	o := orm.NewOrm()
+	sql := "select * from yb_activity where 1=1 AND is_delete = 0 "
+	sql += condition
+	sql += ` order by modify_time desc `
+
+	totalSql := `select count(1) total from (` + sql + `) z `
+	err = o.Raw(totalSql, pars).QueryRow(&total)
+	if err != nil {
+		return
+	}
+	sql += ` LIMIT ?,? `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&list)
+	return
+}
+
+// Update 更新活动
+func (activity *Activity) Update(cols []string) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Update(activity, cols...)
+	return
+}
+
+// AddActivity 新增活动
+func AddActivity(activity *Activity) (err error) {
+	o := orm.NewOrm()
+	id, err := o.Insert(activity)
+	if err != nil {
+		return
+	}
+	activity.ActivityId = int(id)
+	return
+}

+ 121 - 0
models/yb/activity_register.go

@@ -0,0 +1,121 @@
+package yb
+
+import (
+	"rdluck_tools/orm"
+	"time"
+)
+
+// ActivityRegister 活动报名表
+type ActivityRegister struct {
+	Id            int       `orm:"column(activity_register_id);pk" description:"活动报名ID"`
+	ActivityId    int       `description:"活动ID"`
+	UserId        int       `description:"微信用户表ID"`
+	CompanyId     int       `description:"客户id"`
+	CompanyName   string    `description:"客户名称"`
+	SellerName    string    `description:"所属销售名称"`
+	RealName      string    `description:"用户实际名称"`
+	Mobile        string    `description:"用户手机号"`
+	RegisterState int8      `description:"报名状态 0-取消报名 1-已报名"`
+	CreateTime    time.Time `description:"创建时间"`
+}
+
+// TableName 表名变更
+func (activity *ActivityRegister) TableName() string {
+	return "yb_activity_register"
+}
+
+type ActivityRegisterList struct {
+	ActivityId        int       `orm:"column(activity_id);pk" description:"活动ID"`
+	ActivityTypeId    int       `description:"活动类型ID"`
+	ActivityTypeName  string    `description:"活动类型名称"`
+	ActivityName      string    `description:"活动标题"`
+	StartTime         time.Time `description:"活动开始时间"`
+	EndTime           time.Time `description:"活动结束时间"`
+	IsLimitPeople     int8      `description:"是否限制人数 1是,0否"`
+	LimitPeopleNum    int       `description:"限制人数数量"`
+	RegisterPeopleNum int       `description:"已报名人数数量"`
+}
+
+// GetActivityRegisterList 获取活动报名列表数据
+func GetActivityRegisterList(condition string, pars []interface{}, startSize, pageSize int) (total int, list []*ActivityRegisterList, err error) {
+	o := orm.NewOrm()
+	sql := "select * from yb_activity where 1=1 AND is_delete = 0 "
+	sql += condition
+	sql += ` order by start_time asc ` //按照开始时间正序
+
+	totalSql := `select count(1) total from (` + sql + `) z `
+	err = o.Raw(totalSql, pars).QueryRow(&total)
+	if err != nil {
+		return
+	}
+	sql += ` LIMIT ?,? `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&list)
+	return
+}
+
+// Update 更新活动报名
+func (activityRegister *ActivityRegister) Update(cols []string) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Update(activityRegister, cols...)
+	return
+}
+
+// AddActivityRegister 新增活动报名
+func AddActivityRegister(activityRegister *ActivityRegister) (err error) {
+	o := orm.NewOrm()
+	id, err := o.Insert(activityRegister)
+	if err != nil {
+		return
+	}
+	activityRegister.Id = int(id)
+	return
+}
+
+type ActivityRegisterTotal struct {
+	Total      int `description:"报名总人数"`
+	ActivityId int `description:"活动id"`
+}
+
+// GetActivityRegisterTotalListByActivityIds 根据活动id集合获取报名总人数列表
+func GetActivityRegisterTotalListByActivityIds(activityIds string) (list []*ActivityRegisterTotal, err error) {
+	if activityIds == "" {
+		return
+	}
+	o := orm.NewOrm()
+	sql := `select count(*) total,activity_id from yb_activity_register where activity_id in (` + activityIds + `) where register_state = 1  group by activity_id`
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+// GetActivityRegisterListByActivityId 获取已经报名活动的用户列表数据
+func GetActivityRegisterListByActivityId(activityId, startSize, pageSize int) (total int, list []*ActivityRegister, err error) {
+	o := orm.NewOrm()
+	sql := "select * from yb_activity_register  where register_state = 1 and activity_id = ? "
+	sql += ` order by create_time desc `
+
+	totalSql := `select count(1) total from (` + sql + `) z `
+	err = o.Raw(totalSql, activityId).QueryRow(&total)
+	if err != nil {
+		return
+	}
+	sql += ` LIMIT ?,? `
+	_, err = o.Raw(sql, activityId, startSize, pageSize).QueryRows(&list)
+	return
+}
+
+// GetActivityRegister 获取活动报名用户详情
+func GetActivityRegister(activityId, userId int) (item *ActivityRegister, err error) {
+	o := orm.NewOrm()
+	sql := "select * from yb_activity_register where activity_id = ? and user_id = ? order by id desc"
+	err = o.Raw(sql, activityId, userId).QueryRow(&item)
+	return
+}
+
+// GetAllActivityRegisterListByActivityId 根据活动id获取所有的线下报名用户
+func GetAllActivityRegisterListByActivityId(activityId int) (list []*ActivityRegister, err error) {
+	o := orm.NewOrm()
+	sql := "select * from yb_activity_register where register_state = 1 and activity_id = ? "
+	sql += ` order by activity_register_id asc ` //按照预约时间正序
+	_, err = o.Raw(sql, activityId).QueryRows(&list)
+	return
+}

+ 39 - 0
models/yb/activity_remind.go

@@ -0,0 +1,39 @@
+package yb
+
+import (
+	"rdluck_tools/orm"
+	"time"
+)
+
+// ActivityRemind 活动会议提醒表
+type ActivityRemind struct {
+	ActivityRemindId int    `orm:"column(activity_remind_id);pk" description:"活动提醒ID"`
+	ActivityId       int    `description:"活动ID"`
+	UserId           int    `description:"微信用户表ID"`
+	CompanyId        int    `description:"客户id"`
+	RealName         string `description:"用户实际名称"`
+	Mobile           string `description:"用户手机号"`
+	//RegisterState int8      `description:"报名状态 0-取消报名 1-已报名"`
+	CreateTime time.Time `description:"创建时间"`
+}
+
+// TableName 表名变更
+func (activityRemind *ActivityRemind) TableName() string {
+	return "yb_activity_remind"
+}
+
+// GetAllActivityRemindListByActivityId 根据活动id获取所有的提醒用户
+func GetAllActivityRemindListByActivityId(activityId int) (list []*ActivityRemind, err error) {
+	o := orm.NewOrm()
+	sql := "select * from yb_activity_remind where activity_id = ? "
+	sql += ` order by activity_remind_id asc ` //按照预约时间正序
+	_, err = o.Raw(sql, activityId).QueryRows(&list)
+	return
+}
+
+// Update 更新活动报名
+func (activityRemind *ActivityRemind) Update(cols []string) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Update(activityRemind, cols...)
+	return
+}

+ 47 - 0
models/yb/activity_type.go

@@ -0,0 +1,47 @@
+package yb
+
+import (
+	"rdluck_tools/orm"
+	"time"
+)
+
+// ActivityType 活动分类表
+type ActivityType struct {
+	ActivityTypeId   int       `orm:"column(activity_type_id);pk" description:"活动类型ID"`
+	ActivityTypeName string    `description:"活动类型名称"`
+	Pid              int       `description:"父级id,默认是:0"`
+	Sort             int       `description:"排序字段"`
+	FrontIsShow      int8      `description:"是否在前台展示,0:不展示,1:展示"`
+	CreateTime       time.Time `description:"创建时间"`
+}
+
+// TableName 表名变更
+func (activityType *ActivityType) TableName() string {
+	return "yb_activity_type"
+}
+
+type ActivityTypeList struct {
+	ActivityTypeId   int                 `description:"活动类型ID"`
+	ActivityTypeName string              `description:"活动类型名称"`
+	Pid              int                 `description:"父级id,默认是:0"`
+	Sort             int                 `description:"排序字段"`
+	FrontIsShow      int8                `description:"是否在前台展示,0:不展示,1:展示"`
+	CreateTime       time.Time           `description:"创建时间"`
+	ChildList        []*ActivityTypeList `description:"下级活动类型列表"`
+}
+
+// GetActivityTypeListByPid 获取最高级的活动分类
+func GetActivityTypeListByPid(pid int) (list []*ActivityType, err error) {
+	o := orm.NewOrm()
+	sql := `select * from yb_activity_type where pid=? order by sort asc ,activity_type_id asc`
+	_, err = o.Raw(sql, pid).QueryRows(&list)
+	return
+}
+
+// GetActivityTypeByActivityTypeId 根据id获取活动分类详情
+func GetActivityTypeByActivityTypeId(pid int) (list []*ActivityTypeList, err error) {
+	o := orm.NewOrm()
+	sql := `select * from yb_activity_type where pid=? order by sort asc ,activity_type_id asc`
+	_, err = o.Raw(sql, pid).QueryRows(&list)
+	return
+}

+ 54 - 0
models/yb/activity_voice.go

@@ -0,0 +1,54 @@
+package yb
+
+import (
+	"rdluck_tools/orm"
+	"time"
+)
+
+// ActivityVoice 活动语音表结构体
+type ActivityVoice struct {
+	ActivityVoiceId  int       `orm:"column(activity_voice_id);pk" description:"活动音频ID"`
+	ActivityId       int       ` description:"活动ID"`
+	VoiceUrl         string    `description:"音频地址"`
+	VoiceName        string    `description:"音频名称"`
+	VoicePlaySeconds string    `description:"音频时长"`
+	CreateTime       time.Time `description:"创建时间"`
+}
+
+// TableName 表名变更
+func (activityVoice *ActivityVoice) TableName() string {
+	return "yb_activity_voice"
+}
+
+// DelByActivityId 根据活动id删除所有音频
+func DelByActivityId(activityId int) (err error) {
+	o := orm.NewOrm()
+	sql := "delete from yb_activity_voice where activity_id=?"
+	_, err = o.Raw(sql, activityId).Exec()
+	return
+}
+
+// AddActivityVoice 新增活动音频
+func AddActivityVoice(activityVoiceInfo *ActivityVoice) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Insert(activityVoiceInfo)
+	return
+}
+
+// AddActivityVoiceMulti 批量新增活动音频
+func AddActivityVoiceMulti(activityVoiceList []*ActivityVoice) (err error) {
+	o := orm.NewOrm()
+	_, err = o.InsertMulti(len(activityVoiceList), activityVoiceList)
+	return
+}
+
+// GetVoiceListByActivityIds 根据活动id集合获取音频列表
+func GetVoiceListByActivityIds(activityIds string) (list []*ActivityVoice, err error) {
+	if activityIds == "" {
+		return
+	}
+	o := orm.NewOrm()
+	sql := `select * from yb_activity_voice where activity_id in (` + activityIds + `) `
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}

+ 34 - 0
models/yb/yb_speaker.go

@@ -0,0 +1,34 @@
+package yb
+
+import (
+	"rdluck_tools/orm"
+)
+
+// Speaker 活动表
+type Speaker struct {
+	SpeakerId            int    `orm:"column(speaker_id);pk" description:"主讲人ID"`
+	SpeakerName          string `description:"主讲人"`
+	SpeakerHeadPic       string `description:"主讲人头像"`
+	SpeakerBackgroundPic string `description:"主讲人背景图"`
+}
+
+// TableName 表名变更
+func (speaker *Speaker) TableName() string {
+	return "yb_speaker"
+}
+
+// GetSpeakerById 根据id获取主讲人详情
+func GetSpeakerById(id int) (item *Speaker, err error) {
+	o := orm.NewOrm()
+	sql := "select * from yb_speaker where speaker_id=? "
+	err = o.Raw(sql, id).QueryRow(&item)
+	return
+}
+
+// GetAllSpeakerList 获取所有主讲人列表数据
+func GetAllSpeakerList() (list []*Speaker, err error) {
+	o := orm.NewOrm()
+	sql := "select * from yb_speaker order by speaker_id desc "
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}

+ 154 - 0
services/activity.go

@@ -0,0 +1,154 @@
+package services
+
+import (
+	"context"
+	"fmt"
+	"hongze/hongze_task/models"
+	"hongze/hongze_task/models/yb"
+	"hongze/hongze_task/utils"
+	"time"
+)
+
+// YbTelRemind 研报电话会提醒
+func YbTelRemind(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)
+		}
+	}()
+
+	condition := ""
+	pars := make([]interface{}, 0)
+
+	startTime := time.Now().Add(time.Second * 60 * 15).Format(utils.FormatDateTime) //15分钟后就要开始的会议
+	condition += ` and publish_status = 1 and is_send_wx_msg = 0 and is_delete = 0 and start_time <= ? and end_time >= now() `
+	pars = append(pars, startTime)
+
+	condition += ` and first_activity_type_id in (1,3) `
+
+	_, list, err := yb.GetList(condition, pars, 0, 1000)
+
+	for _, activityInfo := range list {
+		activityInfo.IsSendWxMsg = 1
+		activityInfo.Update([]string{"IsSendWxMsg"})
+		go sendWxMsg(activityInfo, "会议提醒")
+	}
+	return
+}
+
+// YbSalonRemind 研报沙龙提醒
+func YbSalonRemind(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)
+		}
+	}()
+
+	condition := ""
+	pars := make([]interface{}, 0)
+
+	startTime := time.Now().Add(time.Second * 60 * 60).Format(utils.FormatDateTime) //1小时后就要开始的沙龙
+	condition += ` and publish_status = 1 and is_send_salon_wx_msg = 0 and is_delete = 0 and start_time <= ? and end_time >= now() `
+	pars = append(pars, startTime)
+
+	condition += ` and first_activity_type_id =3 `
+
+	_, list, err := yb.GetList(condition, pars, 0, 1000)
+
+	for _, activityInfo := range list {
+		activityInfo.IsSendSalonWxMsg = 1
+		activityInfo.Update([]string{"IsSendSalonWxMsg"})
+		go sendWxMsg(activityInfo, "沙龙提醒")
+	}
+	return
+}
+
+func sendWxMsg(activityInfo *yb.Activity, remindType string) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "发送电话会提醒失败 ErrMsg:"+err.Error())
+			utils.FileLog.Info(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "发送电话会提醒失败 ErrMsg:"+err.Error())
+			//go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "发送电话会提醒失败 ErrMsg:"+err.Error(), utils.EmailSendToUsers)
+		}
+	}()
+
+	keyword4 := "- -"
+
+	//您有一场【橡胶双周报】将在15分钟后开始
+	timeStr := ``
+	userIdList := make([]string, 0) //提醒用户列表
+	if remindType == "会议提醒" {
+		timeStr = `15分钟`
+		list, tmpErr := yb.GetAllActivityRemindListByActivityId(activityInfo.ActivityId)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		for _, v := range list {
+			userIdList = append(userIdList, fmt.Sprint(v.UserId))
+		}
+
+	} else {
+		timeStr = `1小时`
+		list, tmpErr := yb.GetAllActivityRegisterListByActivityId(activityInfo.ActivityId)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		for _, v := range list {
+			userIdList = append(userIdList, fmt.Sprint(v.UserId))
+		}
+
+		keyword4 = activityInfo.Address
+	}
+
+	if len(userIdList) <= 0 {
+		return
+	}
+
+	first := `您有一场【` + activityInfo.ActivityTypeName + `】将在` + timeStr + `后开始`
+	keyword1 := activityInfo.ActivityName
+	keyword2 := "- -"
+	//keyword3 := `2021-10-18 16:30-17:00 星期一`
+	keyword3 := formatActivityTimeStr(activityInfo.StartTime, activityInfo.EndTime)
+
+	remark := `点击查看活动详情`
+
+	//获取所有用户的openid列表
+	openidList, err := models.GetUserOpenidListByUserIds(userIdList)
+	if err != nil {
+		return
+	}
+	//小程序跳转地址
+	wxAppPath := `pages-activity/detail?id=` + fmt.Sprint(activityInfo.ActivityId)
+	err = SendWxMsgWithActivityAppointmentRemind(first, keyword1, keyword2, keyword3, keyword4, remark, wxAppPath, openidList)
+	return
+}
+
+// formatActivityTimeStr 格式化活动的开始结束时间
+func formatActivityTimeStr(startTime, endTime time.Time) string {
+	startStr := startTime.Format("2006-01-02 15:04")
+	endStr := endTime.Format("15:04")
+	weekStr := ``
+	weekInt := startTime.Weekday()
+	switch weekInt {
+	case 0:
+		weekStr = `星期日`
+	case 1:
+		weekStr = `星期一`
+	case 2:
+		weekStr = `星期二`
+	case 3:
+		weekStr = `星期三`
+	case 4:
+		weekStr = `星期四`
+	case 5:
+		weekStr = `星期五`
+	case 6:
+		weekStr = `星期六`
+	}
+
+	return startStr + `-` + endStr + ` ` + weekStr
+}

文件差異過大導致無法顯示
+ 69 - 0
services/data/base_from_smm.go


+ 7 - 2
services/data/data_pb.go

@@ -7,6 +7,7 @@ import (
 	"hongze/hongze_task/utils"
 	"net/url"
 	"rdluck_tools/http"
+	"strings"
 	"time"
 )
 
@@ -29,9 +30,13 @@ func SyncEdbDataByPb(edbInfoId int64, edbCode, startDate, endDate string) (err e
 	edbCode = url.QueryEscape(edbCode)
 	pbUrl := utils.Hz_Data_PB_Url + `edbInfo/pb?EdbCode=%s&StartDate=%s&EndDate=%s`
 	pbUrl = fmt.Sprintf(pbUrl, edbCode, startDate, endDate)
-	utils.FileLog.Info("pbUrl:"+pbUrl)
+	utils.FileLog.Info("pbUrl:" + pbUrl)
 	body, err := http.Get(pbUrl)
-	utils.FileLog.Info("pb result:"+string(body))
+	utils.FileLog.Info("pb result:" + string(body))
+
+	if strings.Contains(string(body), "html") {
+		return nil
+	}
 
 	if err != nil {
 		return

+ 1 - 3
services/data/data_ths.go

@@ -28,9 +28,7 @@ func SyncEdbDataByThs(edbInfoId int64, edbCode, startDate, endDate string) (err
 	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
 	}

+ 7 - 7
services/data/data_wind.go

@@ -2,6 +2,7 @@ package data
 
 import (
 	"encoding/json"
+	"errors"
 	"fmt"
 	"hongze/hongze_task/models/data_manage"
 	"hongze/hongze_task/utils"
@@ -19,19 +20,17 @@ type EdbDataFromWind struct {
 func SyncEdbDataByWind(edbInfoId int64, edbCode, startDate, endDate string) (err error) {
 	defer func() {
 		if err != nil {
-			fmt.Println("GetEdbDataByWind Err:" + err.Error())
+			utils.FileLog.Info("GetEdbDataByWind Err:" + err.Error())
 		}
 	}()
 
 	windUrl := utils.Hz_Data_Url + `edbInfo/wind?EdbCode=%s&StartDate=%s&EndDate=%s`
 	windUrl = fmt.Sprintf(windUrl, edbCode, startDate, endDate)
-	utils.FileLog.Info("windUrl:", windUrl)
+	utils.FileLog.Info("windUrl:" + windUrl)
 	body, err := http.Get(windUrl)
-	fmt.Println(windUrl)
-	fmt.Println("SyncEdbDataByWind body:")
-	fmt.Println(string(body))
-	utils.FileLog.Info("wind result:", string(body))
-	if strings.Contains(string(body), "html") {
+	bodyStr := string(body)
+	utils.FileLog.Info("wind result:" + bodyStr)
+	if strings.Contains(bodyStr, "html") || strings.Contains(bodyStr, "CWSDService: No data.") {
 		return nil
 	}
 	if err != nil {
@@ -40,6 +39,7 @@ func SyncEdbDataByWind(edbInfoId int64, edbCode, startDate, endDate string) (err
 	item := new(EdbDataFromWind)
 	err = json.Unmarshal(body, &item)
 	if err != nil {
+		err = errors.New("Err:"+err.Error() +" EdbCode:"+ edbCode + "\n" +" BodyStr:"+ string(body))
 		return
 	}
 

+ 29 - 21
services/data/edb_info.go

@@ -19,6 +19,7 @@ func RefreshDataFromThs(wg *sync.WaitGroup) (err error) {
 			fmt.Println("RefreshDataFromThs Err:" + err.Error())
 			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "RefreshDataFromThs ErrMsg:"+err.Error(), utils.EmailSendToUsers)
 		}
+		wg.Done()
 	}()
 	var condition string
 	var pars []interface{}
@@ -70,7 +71,6 @@ func RefreshDataFromThs(wg *sync.WaitGroup) (err error) {
 		//	return errors.New("ModifyEdbDataInfoDate:" + err.Error())
 		//}
 	}
-	wg.Done()
 	return err
 }
 
@@ -81,11 +81,13 @@ func RefreshDataFromWind(wg *sync.WaitGroup) (err error) {
 			fmt.Println("RefreshDataFromWind Err:" + err.Error())
 			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "RefreshDataFromWind ErrMsg:"+err.Error(), utils.EmailSendToUsers)
 		}
+		wg.Done()
 	}()
 	var condition string
 	var pars []interface{}
 	condition += " AND source=? "
 	pars = append(pars, utils.DATA_SOURCE_WIND)
+
 	items, err := data_manage.GetEdbInfoByCondition(condition, pars, 0)
 	if err != nil {
 		return err
@@ -123,7 +125,6 @@ func RefreshDataFromWind(wg *sync.WaitGroup) (err error) {
 			}
 		}
 	}
-	wg.Done()
 	return err
 }
 
@@ -134,6 +135,7 @@ func RefreshDataFromPb(wg *sync.WaitGroup) (err error) {
 			fmt.Println("RefreshDataFromPb Err:" + err.Error())
 			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "RefreshDataFromPb ErrMsg:"+err.Error(), utils.EmailSendToUsers)
 		}
+		wg.Done()
 	}()
 	var condition string
 	var pars []interface{}
@@ -186,7 +188,6 @@ func RefreshDataFromPb(wg *sync.WaitGroup) (err error) {
 		//	return errors.New("ModifyEdbDataInfoDate:" + err.Error())
 		//}
 	}
-	wg.Done()
 	return err
 }
 
@@ -243,8 +244,9 @@ func RefreshDataFromCalculateAll() (err error) {
 	var pars []interface{}
 	condition += " AND edb_type=? "
 	pars = append(pars, 2)
-	//condition += " AND edb_info_id=? "
-	//pars = append(pars, 100341)
+
+	//condition += " AND source=? "
+	//pars = append(pars, utils.DATA_SOURCE_CALCULATE_BP)
 
 	items, err := data_manage.GetEdbInfoByCondition(condition, pars, 0)
 	if err != nil {
@@ -381,21 +383,23 @@ func RefreshDataFromCalculateAll() (err error) {
 			}
 		} else if source == utils.DATA_SOURCE_CALCULATE_BP {
 			calculateBp, err := data_manage.GetEdbInfoCalculateBpDetail(edbInfoId)
-			if err != nil {
+			if err != nil && err.Error() != utils.ErrNoRow() {
 				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())
+			if calculateBp != nil {
+				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 := "刷新失败,无效的指标渠道:source:"+strconv.Itoa(source)+" EdbCode:"+v.EdbCode
+			msg := "刷新失败,无效的指标渠道:source:" + strconv.Itoa(source) + " EdbCode:" + v.EdbCode
 			err = errors.New(msg)
 			return err
 		}
@@ -421,6 +425,7 @@ func RefreshDataFromManual(wg *sync.WaitGroup) (err error) {
 			fmt.Println("RefreshDataFromManual Err:" + err.Error())
 			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "RefreshDataFromManual ErrMsg:"+err.Error(), utils.EmailSendToUsers)
 		}
+		wg.Done()
 	}()
 	var condition string
 	var pars []interface{}
@@ -463,7 +468,6 @@ func RefreshDataFromManual(wg *sync.WaitGroup) (err error) {
 			}
 		}
 	}
-	wg.Done()
 	return err
 }
 
@@ -474,6 +478,7 @@ func RefreshDataFromLz(wg *sync.WaitGroup) (err error) {
 			fmt.Println("RefreshDataFromLz Err:" + err.Error())
 			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "RefreshDataFromLz ErrMsg:"+err.Error(), utils.EmailSendToUsers)
 		}
+		wg.Done()
 	}()
 	var condition string
 	var pars []interface{}
@@ -517,7 +522,6 @@ func RefreshDataFromLz(wg *sync.WaitGroup) (err error) {
 			}
 		}
 	}
-	wg.Done()
 	return err
 }
 
@@ -528,6 +532,7 @@ func RefreshDataFromYs(wg *sync.WaitGroup) (err error) {
 			fmt.Println("RefreshDataFromYs Err:" + err.Error())
 			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "RefreshDataFromYs ErrMsg:"+err.Error(), utils.EmailSendToUsers)
 		}
+		wg.Done()
 	}()
 	var condition string
 	var pars []interface{}
@@ -571,11 +576,9 @@ func RefreshDataFromYs(wg *sync.WaitGroup) (err error) {
 			}
 		}
 	}
-	wg.Done()
 	return err
 }
 
-
 //刷新钢联数据
 func RefreshDataFromGl(wg *sync.WaitGroup) (err error) {
 	defer func() {
@@ -583,6 +586,7 @@ func RefreshDataFromGl(wg *sync.WaitGroup) (err error) {
 			fmt.Println("RefreshDataFromGl Err:" + err.Error())
 			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "RefreshDataFromYs ErrMsg:"+err.Error(), utils.EmailSendToUsers)
 		}
+		wg.Done()
 	}()
 	var condition string
 	var pars []interface{}
@@ -626,6 +630,10 @@ func RefreshDataFromGl(wg *sync.WaitGroup) (err error) {
 			}
 		}
 	}
-	wg.Done()
 	return err
+}
+
+func ResetEdbInfoIsUpdate(cont context.Context) (err error) {
+	go data_manage.ResetEdbInfoIsUpdate()
+	return nil
 }

+ 7 - 0
services/data/edb_info_calculate.go

@@ -158,3 +158,10 @@ func GetFormulaMap() map[string]string {
 	funMap["ROUND"] = "[@(]"
 	return funMap
 }
+
+//修复计算指标与基础指标的关联关系
+func FixEdbInfoCalculateMapping() {
+	fmt.Println("start")
+	data_manage.FixEdbInfoCalculateMapping()
+	fmt.Println("end")
+}

+ 145 - 0
services/data/edb_info_sync.go

@@ -0,0 +1,145 @@
+package data
+
+import (
+	"hongze/hongze_task/models/data_manage"
+	"hongze/hongze_task/utils"
+)
+
+//同步钢炼数据
+func SyncGlDataBase() {
+	var err error
+	defer func() {
+		if err != nil {
+			utils.FileLog.Info("SyncGlDataBase Err:" + err.Error())
+		}
+	}()
+	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
+	}
+	for _, v := range items {
+		err = data_manage.RefreshEdbDataByGl(v.EdbInfoId, v.EdbCode, v.StartDate.Format(utils.FormatDate), "")
+		if err != nil {
+			return
+		}
+
+		item, err := data_manage.GetEdbInfoMaxAndMinInfo(v.Source, v.EdbCode)
+		if err != nil {
+			return
+		}
+		if item != nil {
+			err = data_manage.ModifyEdbInfoMaxAndMinInfo(v.EdbInfoId, item)
+			if err != nil {
+				return
+			}
+		}
+	}
+}
+
+//同步隆重数据
+func SyncLzDataBase() {
+	var err error
+	defer func() {
+		if err != nil {
+			utils.FileLog.Info("SyncLzDataBase Err:" + err.Error())
+		}
+	}()
+	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
+	}
+	for _, v := range items {
+		err = data_manage.RefreshEdbDataByLz(v.EdbInfoId, v.EdbCode, v.StartDate.Format(utils.FormatDate), "")
+		if err != nil {
+			return
+		}
+		item, err := data_manage.GetEdbInfoMaxAndMinInfo(v.Source, v.EdbCode)
+		if err != nil {
+			return
+		}
+		if item != nil {
+			err = data_manage.ModifyEdbInfoMaxAndMinInfo(v.EdbInfoId, item)
+			if err != nil {
+				return
+			}
+		}
+	}
+}
+
+//同步有色数据
+func SyncSmmDataBase() {
+	var err error
+	defer func() {
+		if err != nil {
+			utils.FileLog.Info("SyncSmmDataBase Err:" + err.Error())
+		}
+	}()
+	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
+	}
+	for _, v := range items {
+		err = data_manage.RefreshEdbDataByYs(v.EdbInfoId, v.EdbCode, v.StartDate.Format(utils.FormatDate), "")
+		if err != nil {
+			return
+		}
+		item, err := data_manage.GetEdbInfoMaxAndMinInfo(v.Source, v.EdbCode)
+		if err != nil {
+			return
+		}
+		if item != nil {
+			err = data_manage.ModifyEdbInfoMaxAndMinInfo(v.EdbInfoId, item)
+			if err != nil {
+				return
+			}
+		}
+	}
+}
+
+
+//同步手工数据
+func SyncManualDataBase() {
+	var err error
+	defer func() {
+		if err != nil {
+			utils.FileLog.Info("SyncLzDataBase Err:" + err.Error())
+		}
+	}()
+	var condition string
+	var pars []interface{}
+	condition += " AND source=? "
+	pars = append(pars, utils.DATA_SOURCE_MANUAL)
+	items, err := data_manage.GetEdbInfoByCondition(condition, pars, 0)
+	if err != nil {
+		return
+	}
+	for _, v := range items {
+		err = data_manage.RefreshManual(v.EdbInfoId, v.EdbCode, v.StartDate.Format(utils.FormatDate), "")
+		if err != nil {
+			return
+		}
+		item, err := data_manage.GetEdbInfoMaxAndMinInfo(v.Source, v.EdbCode)
+		if err != nil {
+			return
+		}
+		if item != nil {
+			err = data_manage.ModifyEdbInfoMaxAndMinInfo(v.EdbInfoId, item)
+			if err != nil {
+				return
+			}
+		}
+	}
+}

+ 8 - 5
services/data_source_longzhong.go

@@ -1080,15 +1080,15 @@ func GetLzSurveyProductData(cont context.Context) (err error) {
 	paramMap["pageSize"] = 100
 
 	//startDate := time.Now().AddDate(-4, 0, 0).UnixNano() / 1e6
-	startDateTime,_ := time.Parse(utils.FormatDate,"2018-01-01")
-	startDate := startDateTime.UnixNano()/1e6
+	startDateTime, _ := time.Parse(utils.FormatDate, "2018-01-01")
+	startDate := startDateTime.UnixNano() / 1e6
 	endDate := time.Now().UnixNano() / 1e6
 
 	for k, v := range priceInfoList {
 		existList, err := data_manage.GetLzSurveyDataExistByTradeCode(v.SurveyProductId)
-		existMap := make(map[string]string)
+		existMap := make(map[string]*data_manage.LongzhongSurveyData)
 		for _, v := range existList {
-			existMap[v.DataTime] = v.InputValue
+			existMap[v.DataTime] = v
 		}
 		fmt.Println(existMap)
 		pageIndex := 1
@@ -1147,7 +1147,7 @@ func GetLzSurveyProductData(cont context.Context) (err error) {
 					//	msg = "获取隆众调研指标数据失败:err " + err.Error()
 					//	return err
 					//}
-					if _, ok := existMap[shouldDateTimeStr]; !ok {
+					if findItem, ok := existMap[shouldDateTimeStr]; !ok && n.InputValue != "0" {
 						item := new(models.LongzhongSurveyData)
 						item.SurveyProductId = v.SurveyProductId
 						item.ProjectQuotaId = n.ProjectQuotaID
@@ -1185,6 +1185,9 @@ func GetLzSurveyProductData(cont context.Context) (err error) {
 							return err
 						}
 					} else {
+						if findItem != nil && findItem.InputValue != n.InputValue && n.InputValue != "0" {
+							models.ModifyLzSurveyData(n.InputValue, findItem.SurveyDataId)
+						}
 						fmt.Println("exist:", shouldDateTimeStr)
 					}
 				}

+ 73 - 8
services/task.go

@@ -53,7 +53,13 @@ func Task() {
 	sendWaitReport := task.NewTask("sendWaitReport", "0 */1 * * * * ", SendWaitReport)
 	task.AddTask("定时往同花顺推送报告", sendWaitReport)
 
-	task.StartTask()
+	// 研报电话会提醒
+	ybTelRemind := task.NewTask("YbTelRemind", "0 */1 * * * * ", YbTelRemind)
+	task.AddTask("研报电话会提醒", ybTelRemind)
+
+	// 研报沙龙提醒
+	ybSalonRemind := task.NewTask("ybSalonRemind", "0 */1 * * * * ", YbSalonRemind)
+	task.AddTask("研报沙龙提醒", ybSalonRemind)
 	//GetHistoryLzProductDetail()
 	//GetLzPrice()
 	//GetLzProductDetail()
@@ -66,6 +72,8 @@ func Task() {
 	//每次服务启动都需要执行一次的
 	_ = AddEdbTask(nil)
 
+	task.StartTask()
+
 	fmt.Println("task end")
 }
 
@@ -87,10 +95,10 @@ func releaseTask() {
 	//task.AddTask("getLzProductPriceData", getLzProductPriceData)
 
 	//隆众调研指标获取
-	getLzSurveyProduct := task.NewTask("getLzSurveyProduct", "0 5 11-19/1 * * * ", GetLzSurveyProduct)
+	getLzSurveyProduct := task.NewTask("getLzSurveyProduct", "0 5 08-19/1 * * * ", GetLzSurveyProduct)
 	task.AddTask("getLzSurveyProduct", getLzSurveyProduct)
 	//隆众调研指标数据获取
-	getLzSurveyProductData := task.NewTask("getLzSurveyProductData", "0 10 11-19/1 * * * ", GetLzSurveyProductData)
+	getLzSurveyProductData := task.NewTask("getLzSurveyProductData", "0 10 08-19/1 * * * ", GetLzSurveyProductData)
 	task.AddTask("getLzSurveyProductData", getLzSurveyProductData)
 
 	//发送邮件
@@ -112,6 +120,17 @@ func releaseTask() {
 	refreshData := task.NewTask("refreshData", "0 1 0,19 * * *", RefreshData)
 	task.AddTask("refreshData", refreshData)
 
+	//刷新指标基础数据
+	refreshBaseData := task.NewTask("refreshBaseData", "0 */30 * * * * ", RefreshBaseData)
+	task.AddTask("refreshBaseData", refreshBaseData)
+
+	//同步弘则数据库中来自,钢联,隆众,有色,人工等基础数据--每隔五分钟,同步一次最新数据
+	syncBaseData := task.NewTask("syncBaseData", "0 */5 * * * * ", SyncBaseData)
+	task.AddTask("syncBaseData", syncBaseData)
+
+	syncBaseDataExt := task.NewTask("syncBaseDataExt", "0 */30 * * * * ", SyncBaseDataExt)
+	task.AddTask("syncBaseDataExt", syncBaseDataExt)
+
 	// 定时往同花顺同步微信群的截止日期(凌晨4点)
 	syncThsWxGroupEveryDay := task.NewTask("syncThsWxGroupEveryDay", "0 1 4 * * * ", SyncWxGroupEveryDay)
 	task.AddTask("定时往同花顺同步微信群的截止日期", syncThsWxGroupEveryDay)
@@ -125,6 +144,10 @@ func releaseTask() {
 
 	checkPbDataInterface := task.NewTask("checkPbDataInterface", "0 */5 * * * * ", data.CheckPbDataInterface)
 	task.AddTask("checkPbDataInterface", checkPbDataInterface)
+
+	//初始化指标更新状态
+	resetEdbInfoIsUpdate := task.NewTask("resetEdbInfoIsUpdate", "0 0 0 * * *", data.ResetEdbInfoIsUpdate)
+	task.AddTask("resetEdbInfoIsUpdate", resetEdbInfoIsUpdate)
 }
 
 func TaskTest() {
@@ -173,13 +196,53 @@ func RefreshData(cont context.Context) (err error) {
 	go data.RefreshDataFromYs(&wg)
 	//钢联
 	go data.RefreshDataFromGl(&wg)
+
 	wg.Wait()
+	//计算指标
 	data.RefreshDataFromCalculateAll()
+
 	time.Sleep(2 * time.Second)
 	data.RefreshNotice()
 	return
 }
 
+//刷新基础数据
+func RefreshBaseData(cont context.Context) (err error) {
+	now := time.Now()
+	if now.Hour() == 0 || now.Hour() == 19 {
+		return nil
+	}
+	//同步有色基础指标数据
+	go data.SyncSmmIndexDataBase()
+	return
+}
+
+//刷新基础数据
+func SyncBaseData(cont context.Context) (err error) {
+	now := time.Now()
+	if now.Hour() == 0 || now.Hour() == 19 {
+		return nil
+	}
+	//同步钢联基础数据
+	go data.SyncGlDataBase()
+	return
+}
+
+//刷新基础数据
+func SyncBaseDataExt(cont context.Context) (err error) {
+	now := time.Now()
+	if now.Hour() == 0 || now.Hour() == 19 {
+		return nil
+	}
+	//同步隆众基础数据
+	go data.SyncLzDataBase()
+	//同步手工数据
+	go data.SyncManualDataBase()
+	//同步有色基础数据
+	go data.SyncSmmDataBase()
+	return
+}
+
 //func RefreshCalculateData(cont context.Context) (err error) {
 //	//计算指标
 //	go data.RefreshDataFromCalculateAll()
@@ -586,20 +649,22 @@ func AddEdbTask(cont context.Context) (err error) {
 				return
 			}
 
-			//添加定时任务
+			//添加定时任务(没有设置通知时间就不进行定时任务通知了)
 			spec := ``
 			if noticeTime != "" {
 				noticeArr := strings.Split(noticeTime, ":")
 				if len(noticeArr) == 3 {
 					//spec = ` */20 * * * * * `
 					spec = fmt.Sprintf(` %s %s %s * * * `, noticeArr[2], noticeArr[1], noticeArr[0])
+
+					//定时任务开始的时间
+					tmpTask := task.NewTask(taskName, spec, tmpTaskFunc)
+
+					task.AddTask(taskName, tmpTask)
+					tmpEdbTaskNameMap[taskName] = true
 				}
 			}
-			//定时任务开始的时间
-			tmpTask := task.NewTask(taskName, spec, tmpTaskFunc)
 
-			task.AddTask(taskName, tmpTask)
-			tmpEdbTaskNameMap[taskName] = true
 		}
 	}
 

+ 40 - 0
services/wx_template_msg.go

@@ -120,3 +120,43 @@ func SendWxMsgWithCompanyRemind(first, keyword1, keyword2, remark string, openId
 	WxSendTemplateMsg(sendUrl, sendMap, openIdList)
 	return
 }
+
+// SendWxMsgWithActivityAppointmentRemind 活动预约/报名时间通知
+func SendWxMsgWithActivityAppointmentRemind(first, keyword1, keyword2, keyword3, keyword4, remark, wxAppPath string, openIdList []*models.OpenIdList) (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
+			utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
+		}
+	}()
+	utils.FileLog.Info("%s", "services SendMsg")
+	accessToken, err := models.GetWxAccessToken()
+	if err != nil {
+		msg = "GetWxAccessToken Err:" + err.Error()
+		return
+	}
+	if accessToken == "" {
+		msg = "accessToken is empty"
+		return
+	}
+
+	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
+	sendMap := make(map[string]interface{})
+	sendData := make(map[string]interface{})
+
+	sendMap["template_id"] = utils.AppointmentRemindTemplateId
+	sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
+	sendData["activity_name"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
+	sendData["reserve_results"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
+	sendData["activity_time"] = map[string]interface{}{"value": keyword3, "color": "#173177"}
+	sendData["activity_address"] = map[string]interface{}{"value": keyword4, "color": "#173177"}
+	sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
+
+	if wxAppPath != "" {
+		sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxYbAppId, "pagepath": wxAppPath}
+	}
+	sendMap["data"] = sendData
+	WxSendTemplateMsg(sendUrl, sendMap, openIdList)
+	return
+}

+ 12 - 4
utils/config.go

@@ -20,10 +20,14 @@ var (
 )
 
 var (
-	WxAppId          string
-	WxAppSecret      string
-	TemplateId       string
-	RemindTemplateId string
+	WxAppId                     string
+	WxAppSecret                 string
+	TemplateId                  string
+	RemindTemplateId            string
+	AppointmentRemindTemplateId string //活动预约通知模板id
+
+	WxYbAppId string //微信研报小程序
+
 )
 
 //oss配置
@@ -68,6 +72,8 @@ jRS9hreKFKb0BUQ4TB26e7IDCstbMRvUp4+OGezexzic5NYPQ8uLo5OTaS7f7PrW
 ZwIDAQAB
 -----END PUBLIC KEY-----`
 
+	WxYbAppId = "wxb059c872d79b9967" //弘则研报小程序
+
 	if RunMode == "release" {
 		CompanyId = 16
 		RealName = "超级管理员"
@@ -88,6 +94,8 @@ ZwIDAQAB
 		WxAppSecret = "f4d52e34021eee262dce9682b31f8861"
 		TemplateId = "pDk4o924gSZWj80ZdNnHodnLMIXjPSlKZU0ciQMOhec"
 		RemindTemplateId = "9JYV6sHMJlu2EHRBIj_8ift6wkrrTb9_UO-M_-YXKBw"
+		AppointmentRemindTemplateId = `Y59n_AHg-RLCKaz293geW76KDHpGL1qOnE7eF_lxelY` //活动预约通知模板id
+
 		//同花顺测试地址
 		THS_SendUrl = `https://mtest.10jqka.com.cn/gateway/ps/syncNews`
 		THS_SyncWxGroupUrl = `https://mtest.10jqka.com.cn/gateway/ps/syncWechatGroupInfo`

+ 1 - 1
utils/constants.go

@@ -22,7 +22,7 @@ const (
 const (
 	APPNAME                        = "弘则-task"
 	EmailSendToUsers               = "317699326@qq.com;984198890@qq.com;512188925@qq.com"
-	RefreshEdbInfoEmailSendToUsers = "317699326@qq.com;jhwang@hzinsights.com;lnyan@hzinsights.com"
+	RefreshEdbInfoEmailSendToUsers = "317699326@qq.com;jhwang@hzinsights.com;lnyan@hzinsights.com;vwang@hzinsights.com"
 )
 
 //手机号,电子邮箱正则

部分文件因文件數量過多而無法顯示