From 7ea9c6ff07a86783b5c3abecd785fc5caf127d76 Mon Sep 17 00:00:00 2001 From: lupeng_zz <1486083023@qq.com> Date: Fri, 10 Apr 2026 09:59:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=80=E6=96=B0=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 19 +- go.sum | 23 +- main.go | 2057 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 1939 insertions(+), 160 deletions(-) diff --git a/go.mod b/go.mod index 4770d4d..5ceb1c6 100644 --- a/go.mod +++ b/go.mod @@ -3,22 +3,17 @@ module deescloud go 1.16 require ( - github.com/LukeMauldin/lodbc v0.0.0-20130219161755-59316a7de9d4 // indirect - github.com/OwnLocal/goes v1.0.0 // indirect - github.com/alexbrainman/odbc v0.0.0-20210605012845-39f8520b0d5f // indirect + github.com/LukeMauldin/lodbc v0.0.0-20130219161755-59316a7de9d4 github.com/astaxie/beego v1.12.3 - github.com/denisenkom/go-mssqldb v0.11.0 // indirect + github.com/denisenkom/go-mssqldb v0.11.0 github.com/go-ole/go-ole v1.2.6 // indirect - github.com/lionsoul2014/ip2region/binding/golang v0.0.0-20230415042440-a5e3d8259ae0 // indirect + github.com/lionsoul2014/ip2region/binding/golang v0.0.0-20230415042440-a5e3d8259ae0 github.com/mattn/go-adodb v0.0.1 github.com/mattn/go-sqlite3 v2.0.3+incompatible + github.com/rickar/cal/v2 v2.1.27 // indirect github.com/satori/go.uuid v1.2.0 - github.com/shopspring/decimal v1.3.1 // indirect - github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726 // indirect - github.com/siddontang/ledisdb v0.0.0-20181029004158-becf5f38d373 // indirect - github.com/signintech/gopdf v0.17.1 // indirect - github.com/tealeg/xlsx v1.0.5 // indirect - github.com/weigj/go-odbc v0.0.0-20120414035027-f09eefba7e19 // indirect - gitlab.com/stone.code/odbc3-go v0.0.0-20140130212748-f9bdfa0350f2 // indirect + github.com/shopspring/decimal v1.3.1 + github.com/signintech/gopdf v0.17.1 + github.com/tealeg/xlsx v1.0.5 golang.org/x/net v0.0.0-20211020060615-d418f374d309 ) diff --git a/go.sum b/go.sum index 677e665..a6c5b75 100644 --- a/go.sum +++ b/go.sum @@ -2,13 +2,10 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/LukeMauldin/lodbc v0.0.0-20130219161755-59316a7de9d4 h1:MNptLl+J1e/11fmvv5sC47Kc6pJh336HGhEa4ga81IQ= github.com/LukeMauldin/lodbc v0.0.0-20130219161755-59316a7de9d4/go.mod h1:wVRoKWzJl1ZecJg0GW+iCvOyWUHSE87uCCxWaF9WMzw= -github.com/OwnLocal/goes v1.0.0/go.mod h1:8rIFjBGTue3lCU0wplczcUgt9Gxgrkkrw7etMIcn8TM= 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/alexbrainman/odbc v0.0.0-20210605012845-39f8520b0d5f h1:qJp6jWdG+PBNCDtIwRpspahMaZ3hlfde/25ExBORKso= -github.com/alexbrainman/odbc v0.0.0-20210605012845-39f8520b0d5f/go.mod h1:c5eyz5amZqTKvY3ipqerFO/74a/8CYmXOahSr40c+Ww= 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/astaxie/beego v1.12.3 h1:SAQkdD2ePye+v8Gn1r4X6IKZM1wd28EyUOVQ3PDSOOQ= @@ -29,11 +26,13 @@ github.com/couchbase/gomemcached v0.0.0-20200526233749-ec430f949808/go.mod h1:sr 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/denisenkom/go-mssqldb v0.11.0 h1:9rHa233rhdOyrz2GcP9NM+gi2psgJZ4GWDpL/7ND8HI= github.com/denisenkom/go-mssqldb v0.11.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= 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/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/glendc/gopher-json v0.0.0-20170414221815-dc4743023d0c/go.mod h1:Gja1A+xZ9BoviGJNA2E9vFkPjjsl+CoJxSXiQM1UXtw= @@ -41,7 +40,6 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 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-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= @@ -65,6 +63,7 @@ github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8l github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= 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 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= @@ -77,6 +76,7 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxv 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= @@ -84,8 +84,6 @@ github.com/lionsoul2014/ip2region/binding/golang v0.0.0-20230415042440-a5e3d8259 github.com/lionsoul2014/ip2region/binding/golang v0.0.0-20230415042440-a5e3d8259ae0/go.mod h1:C5LA5UO2ZXJrLaPLYtE1wUJMiyd/nwWaCO5cw/2pSHs= github.com/mattn/go-adodb v0.0.1 h1:g/pk3V8m/WFX2IQRI58wAC24OQUFFXEiNsvs7dQ1WKg= github.com/mattn/go-adodb v0.0.1/go.mod h1:jaSTRde4bohMuQgYQPxW3xRTPtX/cZKyxPrFVseJULo= -github.com/mattn/go-sqlite3 v1.14.9 h1:10HX2Td0ocZpYEjhilsuo6WWtUqttj2Kb0KtD86/KYA= -github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U= github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= @@ -96,6 +94,7 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ 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.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= @@ -109,6 +108,7 @@ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE 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= @@ -125,6 +125,8 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R 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/rickar/cal/v2 v2.1.27 h1:4vFfbXI9dB1Rb/mHH51xYx36ILWk0Wu8VY0bMnoTMpw= +github.com/rickar/cal/v2 v2.1.27/go.mod h1:/fdlMcx7GjPlIBibMzOM9gMvDBsrK+mOtRXdTzUqV/A= 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= @@ -132,9 +134,7 @@ github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644/go.mod h1:nkxAfR/ github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/siddontang/go v0.0.0-20170517070808-cb568a3e5cc0/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw= -github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw= github.com/siddontang/goredis v0.0.0-20150324035039-760763f78400/go.mod h1:DDcKzU3qCuvj/tPnimWSsZZzvk9qvkvrIL5naVBPh5s= -github.com/siddontang/ledisdb v0.0.0-20181029004158-becf5f38d373/go.mod h1:mF1DpOSOUiJRMR+FDqaqu3EBqrybQtrDDszLUZ6oxPg= github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d/go.mod h1:AMEsy7v5z92TR1JKMkLLoaOQk++LVnOKL3ScbJ8GNGA= github.com/signintech/gopdf v0.17.1 h1:7g1JCz5XtdyARU3DmGcsyO/eRWM5C2KXGFQ/9+pUCOM= github.com/signintech/gopdf v0.17.1/go.mod h1:wrLtZoWaRNrS4hphED0oflFoa6IWkOu6M3nJjm4VbO4= @@ -145,19 +145,16 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ 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/weigj/go-odbc v0.0.0-20120414035027-f09eefba7e19 h1:0n3XLY0QrWER887wlRh9pzd0dmfsYak/WYwXYMEwVso= -github.com/weigj/go-odbc v0.0.0-20120414035027-f09eefba7e19/go.mod h1:I2IXPqsCTidAXyoiDDMxw9dTlFyFvpv25SiZl2Xhbnw= github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc= github.com/yookoala/realpath v1.0.0/go.mod h1:gJJMA9wuX7AcqLy1+ffPatSCySA1FQ2S8Ya9AIoYBpE= github.com/yuin/gopher-lua v0.0.0-20171031051903-609c9cd26973/go.mod h1:aEV29XrmTYFr3CiRxZeGHpkvbwq+prZduBqMaascyCU= -gitlab.com/stone.code/odbc3-go v0.0.0-20140130212748-f9bdfa0350f2 h1:euSt1+U+70sxHwOIiKaUthbzkuSWYDwDBO2FzK+6qec= -gitlab.com/stone.code/odbc3-go v0.0.0-20140130212748-f9bdfa0350f2/go.mod h1:susDFwJTAkX5t89LhGIcv/+3ZXIPZCkpAg0s5QkoPw4= 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-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -192,6 +189,7 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 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/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 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= @@ -203,6 +201,7 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/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/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= diff --git a/main.go b/main.go index 863bb85..4f15943 100644 --- a/main.go +++ b/main.go @@ -2495,7 +2495,8 @@ func get_up_off_well_csv(response http.ResponseWriter, request *http.Request) { } selSql = fmt.Sprintf("select distinct [6841],[6844],[6845],[6846],[6847],[6848],[6849] from WORKHOURS %s order by [6846] desc", whereSql) - //fmt.Println("get_get_up_off_well_csv sql:", selSql) + fmt.Println("get_get_up_off_well_csv sql:", selSql) + logs.Info("get_get_up_off_well_csv sql:", selSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Info("Query Error", err.Error()) @@ -2660,6 +2661,8 @@ func get_up_off_well_info(response http.ResponseWriter, request *http.Request) { } else { cntSql = fmt.Sprintf("select count(*) from (select distinct [6841],[6844],[6845],[6846],[6847],[6848],[6849] from WORKHOURS )t") } + logs.Info("get_up_off_well_info cntSql ", cntSql) + fmt.Println("get_up_off_well_info cntSql:", cntSql) rcnt, err := getRecordCount(sqlConn, cntSql) if err != nil { logs.Error(fmt.Sprintf("%s err:%v", cntSql, err.Error())) @@ -2674,14 +2677,17 @@ func get_up_off_well_info(response http.ResponseWriter, request *http.Request) { cnt = req.Count } - selSql = fmt.Sprintf("select distinct top %v [6841],[6844],[6845],[6846],[6847],[6848],[6849],[6850] from ( select distinct top %v [6841],[6844],[6845],[6846],[6847],[6848],[6849],[6850] from WORKHOURS ", cnt, req.Index*req.Count) + // selSql = fmt.Sprintf("select distinct top %v [6841],[6844],[6845],[6846],[6847],[6848],[6849],[6850] from ( select distinct top %v [6841],[6844],[6845],[6846],[6847],[6848],[6849],[6850] from WORKHOURS ", cnt, req.Index*req.Count) + selSql = fmt.Sprintf("select distinct top %v [6841],[6844],[6845],ISNULL([6846],'') as [6846],ISNULL([6847],'') as [6847],ISNULL([6848],'') as [6848],ISNULL([6849],'') as [6849],ISNULL([6850],'') as [6850] from ( select distinct top %v [6841],[6844],[6845],ISNULL([6846],'') as [6846],ISNULL([6847],'') as [6847],ISNULL([6848],'') as [6848],ISNULL([6849],'') as [6849],ISNULL([6850],'') as [6850] from WORKHOURS ", cnt, req.Index*req.Count) + selSql += whereSql ascSql := " order by [6846] asc" descSql := " order by [6846] desc" selSql += descSql + ")t " + whereSql + ascSql - //fmt.Println("get_up_off_well_info sql:", selSql) + fmt.Println("get_up_off_well_info sql:", selSql) + logs.Info("get_up_off_well_info sql:", selSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Info("Query Error", err.Error()) @@ -2776,9 +2782,11 @@ func get_up_off_well_info(response http.ResponseWriter, request *http.Request) { data = append(data, d) } else { logs.Info("get_up_off_well_info Query Error", err.Error()) + fmt.Println("get_up_off_well_info Query Error", err.Error()) } } - + fmt.Println("len(data)---", len(data)) + logs.Info("len(data)---", len(data)) if len(data) > 0 { for i := len(data) - 1; ; { resp.Data = append(resp.Data, data[i]) @@ -3740,7 +3748,7 @@ func GenerateInstrumentPDF(fullData []byte, resp []Tool_warning) (filename strin contextText = "正常" // warningText = fmt.Sprintf("%s", contextText) warningText = fmt.Sprintf("%s%s %s", warning.Series+" ", warning.Instrument, contextText) - pdf.SetTextColor(0, 255, 0) + pdf.SetTextColor(0, 0, 0) } else { pdf.SetTextColor(200, 0, 0) contextText = warning.Time + " " + warning.Context @@ -5786,8 +5794,19 @@ func export_tool_warning_pdf_en(opuser string, baseinfo get_srr_base_resp, data for i := 0; i < len(data); i++ { v := data[i] - s := fmt.Sprintf(`%s %s:%s`, - v.Time, v.Err_level, v.Context) + var s string = "" + + if v.Flag == 0 { + s = fmt.Sprintf(`%s`, + strings.ReplaceAll(v.Context, ":", "")) + fmt.Println("v.Context ------", v.Context) + + } else { + + s = fmt.Sprintf(`%s %s:%s`, + v.Time, v.Err_level, v.Context) + } + context, _ := pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { total_page_len += span @@ -5825,8 +5844,19 @@ func export_tool_warning_pdf_en(opuser string, baseinfo get_srr_base_resp, data for i := 0; i < len(data); i++ { v := data[i] - s := fmt.Sprintf(`%s %s:%s`, - v.Time, v.Err_level, v.Context) + var s string = "" + + if v.Flag == 0 { + s = fmt.Sprintf(`%s`, + strings.ReplaceAll(v.Context, ":", "")) + fmt.Println("v.Context ------", v.Context) + + } else { + + s = fmt.Sprintf(`%s %s:%s`, + v.Time, v.Err_level, v.Context) + } + context, _ := pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { base += span @@ -6046,9 +6076,19 @@ func export_tool_warning_pdf(opuser string, baseinfo get_srr_base_resp, data []T if len(data) > 0 { for i := 0; i < len(data); i++ { v := data[i] + var s string = "" + fmt.Println("v.Flag ------", v.Flag) + if v.Flag == 0 { + s = fmt.Sprintf(`%s`, + strings.ReplaceAll(v.Context, ":", "")) + fmt.Println("v.Context ------", v.Context) - s := fmt.Sprintf(`%s %s:%s`, - v.Time, v.Err_level, v.Context) + } else { + + s = fmt.Sprintf(`%s %s:%s`, + v.Time, v.Err_level, v.Context) + } + fmt.Println("v.Context22222 ------", s) context, _ := pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { total_page_len += span @@ -6086,8 +6126,19 @@ func export_tool_warning_pdf(opuser string, baseinfo get_srr_base_resp, data []T for i := 0; i < len(data); i++ { v := data[i] - s := fmt.Sprintf(`%s %s:%s`, - v.Time, v.Err_level, v.Context) + var s string = "" + + if v.Flag == 0 { + s = fmt.Sprintf(`%s`, + strings.ReplaceAll(v.Context, ":", "")) + fmt.Println("v.Context ------", v.Context) + + } else { + + s = fmt.Sprintf(`%s %s:%s`, + v.Time, v.Err_level, v.Context) + } + context, _ := pdf.SplitTextWithWordWrap(s, page_W-(2*margin_left)) for j := 0; j < len(context); j++ { base += span @@ -6226,7 +6277,7 @@ func get_tool_warning_info(user string, wellname string) (resp []Tool_warning) { logs.Info("查询数据库状态失败:", err.Error()) } else { fmt.Printf("数据库 %s 当前状态: %s\n", db, status) - + logs.Info("数据库 %s 当前状态: %s\n", db, status) // 如果是离线状态,设置为在线 if status == "OFFLINE" { fmt.Printf("数据库 %s 是离线状态,设置为在线\n", db) @@ -6237,10 +6288,12 @@ func get_tool_warning_info(user string, wellname string) (resp []Tool_warning) { logs.Info("设置在线失败:", err.Error()) } else { fmt.Printf("数据库 %s 已设置为在线\n", db) + logs.Info("数据库 %s 已设置为在线\n", db) needOffline = true // 标记最后需要离线 } } else { fmt.Printf("数据库 %s 已在线,不需要操作\n", db) + logs.Info("数据库 %s 已在线,不需要操作\n", db) needOffline = false // 不需要离线 } } @@ -6299,6 +6352,7 @@ func get_tool_warning_info(user string, wellname string) (resp []Tool_warning) { FROM [analysis_tool_warning] WHERE [wellname] = '%s' ORDER BY [time] DESC`, wellname) + warningRows, err := sqlConn.Query(warningSql) if err != nil { fmt.Println("警告信息查询错误:", err.Error()) @@ -6328,12 +6382,15 @@ func get_tool_warning_info(user string, wellname string) (resp []Tool_warning) { w.Err_level = errLevelPtr.String w.Context = contextPtr.String warnings = append(warnings, w) + + fmt.Println("warnings------", warnings) } if err = warningRows.Err(); err != nil { fmt.Println("警告信息遍历错误:", err.Error()) logs.Info("警告信息遍历错误:", err.Error()) } + fmt.Println("toolPairs----", toolPairs) // 处理结果:检查每个仪器组合是否出现在警告记录中 var data []Tool_warning @@ -6342,7 +6399,7 @@ func get_tool_warning_info(user string, wellname string) (resp []Tool_warning) { Series: pair.Series, Instrument: pair.Instrument, Flag: 0, // 默认flag=0 - Context: "正常", + Context: pair.Series + " " + pair.Instrument + " 正常", } // 构建要查找的字符串格式:系列号 + 空格 + 仪器号 @@ -6446,18 +6503,19 @@ func get_tool_warning_info(user string, wellname string) (resp []Tool_warning) { defer masterConn2.Close() fmt.Printf("准备将数据库 %s 设置为离线\n", db) + logs.Info("准备将数据库 %s 设置为离线\n", db) cmdSql := fmt.Sprintf("ALTER DATABASE [%s] SET OFFLINE WITH ROLLBACK IMMEDIATE", db) _, err = masterConn2.Exec(cmdSql) if err != nil { fmt.Println("SET OFFLINE command execution error:", err.Error()) + logs.Info("SET OFFLINE command execution error:", err.Error()) } else { fmt.Printf("数据库 %s 已设置为离线\n", db) + logs.Info("数据库 %s 已设置为离线\n", db) } } } - fmt.Printf("总共处理 %d 条仪器组合\n", len(data)) - logs.Info("总共处理 %d 条仪器组合\n", len(data)) if len(data) > 0 { resp = data fmt.Printf("成功返回 %d 条警告信息\n", len(data)) @@ -6812,7 +6870,7 @@ func get_tool_warning_info_en(user string, wellname string) (resp []Tool_warning } // 第二个查询:获取警告信息 - warningSql := fmt.Sprintf(`SELECT [time], [err_level], [context] + warningSql := fmt.Sprintf(`SELECT [time], [err_level], [context_en] FROM [analysis_tool_warning] WHERE [wellname] = '%s' ORDER BY [time] DESC`, wellname) @@ -6864,7 +6922,7 @@ func get_tool_warning_info_en(user string, wellname string) (resp []Tool_warning Series: pair.Series, Instrument: pair.Instrument, Flag: 0, // 默认flag=0 - Context: "正常", + Context: pair.Series + " " + pair.Instrument + " Normal", } // 构建要查找的字符串格式:系列号 + 空格 + 仪器号 @@ -7455,7 +7513,7 @@ func get_srr_pdf_page_cnt_en(opuser string, baseinfo get_srr_base_resp, state [] return } -func get_srr_pdf_page_cnt(opuser string, baseinfo get_srr_base_resp, state []Srr_state, event []Srr_event) (page_cnt int) { +func get_srr_pdf_page_cnt(opuser string, flag bool, baseinfo get_srr_base_resp, state []Srr_state, event []Srr_event) (page_cnt int) { ps_info := get_ps_info(opuser) @@ -7682,7 +7740,7 @@ func get_srr_pdf_page_cnt(opuser string, baseinfo get_srr_base_resp, state []Srr pdf.SetXY(margin_left+(1.5*h_span), base) pdf.Text(fmt.Sprintf(`地区:%s`, baseinfo.Location)) - if len(event) > 0 { + if flag && len(event) > 0 { if base+span+span > page_H { pdf.SetXY(page_F_x, page_F_y) @@ -7717,31 +7775,54 @@ func get_srr_pdf_page_cnt(opuser string, baseinfo get_srr_base_resp, state []Srr base += span pdf.Line(margin_left, base, margin_left+360, base) } + if flag { + pdf.SetFont("simfang", "", 12) + for i := 0; i < len(event); i++ { + ev := event[i] - pdf.SetFont("simfang", "", 12) - for i := 0; i < len(event); i++ { - ev := event[i] + /* + if len(ev.Bt) >= 19 { + ev.Bt = ev.Bt[:16] + } - /* - if len(ev.Bt) >= 19 { - ev.Bt = ev.Bt[:16] + if len(ev.Et) >= 19 { + ev.Et = ev.Et[:16] + } + */ + + if base+span > page_H { + pdf.SetXY(page_F_x, page_F_y) + pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) + cur_page++ + + pdf.AddPage() + base = margin_top + pdf.SetXY(margin_left*1, base) + + //表头 + pdf.SetLineWidth(0.1) + pdf.Line(margin_left, base, margin_left+360, base) + + pdf.Line(margin_left, base, margin_left, base+span) + pdf.Line(margin_left+120, base, margin_left+120, base+span) + pdf.Line(margin_left+240, base, margin_left+240, base+span) + pdf.Line(margin_left+360, base, margin_left+360, base+span) + + var option gopdf.CellOption + option.Align = gopdf.Middle | gopdf.Center + pdf.SetXY(margin_left, base) + pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "开始时间", option) + pdf.SetXY(margin_left+120, base) + pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "结束时间", option) + pdf.SetXY(margin_left+240, base) + pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "事件", option) + + base += span + pdf.Line(margin_left, base, margin_left+360, base) + } else { + pdf.SetXY(margin_left*1, base) } - if len(ev.Et) >= 19 { - ev.Et = ev.Et[:16] - } - */ - - if base+span > page_H { - pdf.SetXY(page_F_x, page_F_y) - pdf.Text(fmt.Sprintf(`%v/%v`, cur_page, total_page)) - cur_page++ - - pdf.AddPage() - base = margin_top - pdf.SetXY(margin_left*1, base) - - //表头 pdf.SetLineWidth(0.1) pdf.Line(margin_left, base, margin_left+360, base) @@ -7753,39 +7834,16 @@ func get_srr_pdf_page_cnt(opuser string, baseinfo get_srr_base_resp, state []Srr var option gopdf.CellOption option.Align = gopdf.Middle | gopdf.Center pdf.SetXY(margin_left, base) - pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "开始时间", option) + pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, ev.Bt, option) pdf.SetXY(margin_left+120, base) - pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "结束时间", option) + pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, ev.Et, option) pdf.SetXY(margin_left+240, base) - pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, "事件", option) + pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, ev.Event_name, option) base += span pdf.Line(margin_left, base, margin_left+360, base) - } else { - pdf.SetXY(margin_left*1, base) } - - pdf.SetLineWidth(0.1) - pdf.Line(margin_left, base, margin_left+360, base) - - pdf.Line(margin_left, base, margin_left, base+span) - pdf.Line(margin_left+120, base, margin_left+120, base+span) - pdf.Line(margin_left+240, base, margin_left+240, base+span) - pdf.Line(margin_left+360, base, margin_left+360, base+span) - - var option gopdf.CellOption - option.Align = gopdf.Middle | gopdf.Center - pdf.SetXY(margin_left, base) - pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, ev.Bt, option) - pdf.SetXY(margin_left+120, base) - pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, ev.Et, option) - pdf.SetXY(margin_left+240, base) - pdf.CellWithOption(&gopdf.Rect{H: span, W: 120}, ev.Event_name, option) - - base += span - pdf.Line(margin_left, base, margin_left+360, base) } - pdf.SetFont("simfang", "", 14) base += (span / 2) if base > page_H { @@ -8215,7 +8273,7 @@ func export_srr_pdf(opuser string, flag bool, baseinfo get_srr_base_resp, state var cur_page int = 1 var total_page int = 1 - total_page = get_srr_pdf_page_cnt(opuser, baseinfo, state, event) + total_page = get_srr_pdf_page_cnt(opuser, flag, baseinfo, state, event) fmt.Println("现场人员记录报告:", total_page) //W: 595, H: 842 @@ -15028,7 +15086,6 @@ func get_cmr_record_data_ex(wellname string) (data1 []Cmr_input_record_ex, data2 } func get_cmr_record_data_en(user string, wellname string) (resp []Cmr_input_record) { - ps_info := get_ps_info(user) var well_database string @@ -15038,7 +15095,7 @@ func get_cmr_record_data_en(user string, wellname string) (resp []Cmr_input_reco if err == nil { for rows.Next() { if err = rows.Scan(&well_database); err != nil { - logs.Error("get_cmr_record_data scan database err:", err.Error()) + logs.Error("get_cmr_record_data_en scan database err:", err.Error()) } } rows.Close() @@ -15054,71 +15111,347 @@ func get_cmr_record_data_en(user string, wellname string) (resp []Cmr_input_reco } defer conn.Close() - selSql := fmt.Sprintf("select distinct [6752],[6775],[6776],[6778],[6779] from [ENGINEERSERVICES] order by [6752] ") + // ============== Part 1: Measured Depth Data ============== + selSql := `SELECT DISTINCT + [6752], + [6775], + [6776], + [6778], + [6779] + FROM + [ENGINEERSERVICES] + WHERE NOT ([6775] IS NULL AND [6776] IS NULL AND [6778] IS NULL AND [6779] IS NULL) + ORDER BY + [6752]` + rows1, err := conn.Query(selSql) if err != nil { - logs.Info("get_cmr_record_data Query Error", err.Error()) + logs.Info("get_cmr_record_data_en Query Error (depth)", err.Error()) return } var old_depth, old_tvd, old_deviation, old_temp string + depthDateMap := make(map[string]bool) // different dates for depth data + depthCountMap := make(map[string]int) // count per date + depthTimeMap := make(map[string][]string) // existing time points per date + for rows1.Next() { var v Cmr_input_record var depth string var tvd string var deviation string var temp string - if err := rows1.Scan(&v.Time, &depth, &tvd, &deviation, &temp); err == nil { + var originalTime string + if err := rows1.Scan(&originalTime, &depth, &tvd, &deviation, &temp); err == nil { + v.Time = originalTime if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) } + // record date + if len(v.Time) >= 10 { + dateOnly := v.Time[:10] + depthDateMap[dateOnly] = true + if len(originalTime) >= 19 { + timeOnly := originalTime[11:19] + depthTimeMap[dateOnly] = append(depthTimeMap[dateOnly], timeOnly) + } + } + // deduplicate: skip consecutive identical values if depth == old_depth && old_tvd == tvd && old_deviation == deviation && old_temp == temp { continue } + // format context (English) if ps_info.R2 == "1" { v.Context = fmt.Sprintf(`%s Current measured depth: %sm Current TVD: %sm Current INC: %s° Current circulation temperature: %s℃`, v.Time, depth, tvd, deviation, temp) } else { f, _ := strconv.ParseFloat(temp, 64) - f = float64(1.8*f + 32) + f = 1.8*f + 32 v.Context = fmt.Sprintf(`%s Current measured depth: %sm Current TVD: %sm Current INC: %s° Current circulation temperature: %s℉`, v.Time, depth, tvd, deviation, fmt.Sprintf("%.02f", f)) } resp = append(resp, v) + // count + if len(v.Time) >= 10 { + dateOnly := v.Time[:10] + depthCountMap[dateOnly]++ + } + old_depth = depth old_deviation = deviation old_temp = temp old_tvd = tvd } else { - logs.Info("get_cmr Query Error", err.Error()) + logs.Info("get_cmr_record_data_en scan error (depth)", err.Error()) } } rows1.Close() - selSql = fmt.Sprintf("select distinct [6752],[6777],[6780],[6781],[6782] from [ENGINEERSERVICES] order by [6752] ") + // Print depth data statistics (English) + fmt.Println("\n========== Measured Depth Data ==========") + fmt.Printf("Depth data covers %d days\n", len(depthDateMap)) + if len(depthDateMap) > 0 { + fmt.Println("Date list and record counts:") + dates := make([]string, 0, len(depthDateMap)) + for date := range depthDateMap { + dates = append(dates, date) + } + sort.Strings(dates) + for _, date := range dates { + fmt.Printf("%s: %d records\n", date, depthCountMap[date]) + } + } + + // Check and supplement depth data for dates with less than 2 records + fmt.Println("\nChecking depth data for dates with <2 records and supplementing...") + needDepthDates := make([]string, 0) + for date := range depthDateMap { + if depthCountMap[date] < 2 { + needDepthDates = append(needDepthDates, date) + } + } + if len(needDepthDates) > 0 { + fmt.Printf("Found %d date(s) with less than 2 depth records\n", len(needDepthDates)) + sort.Strings(needDepthDates) + for _, supplementDate := range needDepthDates { + currentCount := depthCountMap[supplementDate] + if currentCount == 0 { + fmt.Printf("Date %s has 0 records, adding earliest and latest one each\n", supplementDate) + start := supplementDate + " 00:00:00" + end := supplementDate + " 23:59:59" + + // earliest + sqlEarliest := fmt.Sprintf(` + SELECT TOP 1 [6752],[6775],[6776],[6778],[6779] + FROM [ENGINEERSERVICES] + WHERE [6752] BETWEEN '%s' AND '%s' + AND NOT ([6775] IS NULL AND [6776] IS NULL AND [6778] IS NULL AND [6779] IS NULL) + ORDER BY [6752] ASC`, start, end) + rowsE, err := conn.Query(sqlEarliest) + if err == nil { + for rowsE.Next() { + var v Cmr_input_record + var d, tvd, dev, tmp string + var ot string + if err := rowsE.Scan(&ot, &d, &tvd, &dev, &tmp); err == nil { + v.Time = ot + if len(v.Time) >= 19 { + v.Time = v.Time[:10] + " " + v.Time[11:19] + v.Time = do_time_by_ps(v.Time, ps_info) + } + if ps_info.R2 == "1" { + v.Context = fmt.Sprintf(`%s Current measured depth: %sm Current TVD: %sm Current INC: %s° Current circulation temperature: %s℃`, + v.Time, d, tvd, dev, tmp) + } else { + f, _ := strconv.ParseFloat(tmp, 64) + f = 1.8*f + 32 + v.Context = fmt.Sprintf(`%s Current measured depth: %sm Current TVD: %sm Current INC: %s° Current circulation temperature: %s℉`, + v.Time, d, tvd, dev, fmt.Sprintf("%.02f", f)) + } + // deduplicate + dup := false + for _, item := range resp { + if item.Time == v.Time && item.Context == v.Context { + dup = true + break + } + } + if !dup { + resp = append(resp, v) + fmt.Printf(" Added earliest: %s\n", v.Time) + } + } + } + rowsE.Close() + } + + // latest + sqlLatest := fmt.Sprintf(` + SELECT TOP 1 [6752],[6775],[6776],[6778],[6779] + FROM [ENGINEERSERVICES] + WHERE [6752] BETWEEN '%s' AND '%s' + AND NOT ([6775] IS NULL AND [6776] IS NULL AND [6778] IS NULL AND [6779] IS NULL) + ORDER BY [6752] DESC`, start, end) + rowsL, err := conn.Query(sqlLatest) + if err == nil { + for rowsL.Next() { + var v Cmr_input_record + var d, tvd, dev, tmp string + var ot string + if err := rowsL.Scan(&ot, &d, &tvd, &dev, &tmp); err == nil { + v.Time = ot + if len(v.Time) >= 19 { + v.Time = v.Time[:10] + " " + v.Time[11:19] + v.Time = do_time_by_ps(v.Time, ps_info) + } + if ps_info.R2 == "1" { + v.Context = fmt.Sprintf(`%s Current measured depth: %sm Current TVD: %sm Current INC: %s° Current circulation temperature: %s℃`, + v.Time, d, tvd, dev, tmp) + } else { + f, _ := strconv.ParseFloat(tmp, 64) + f = 1.8*f + 32 + v.Context = fmt.Sprintf(`%s Current measured depth: %sm Current TVD: %sm Current INC: %s° Current circulation temperature: %s℉`, + v.Time, d, tvd, dev, fmt.Sprintf("%.02f", f)) + } + dup := false + for _, item := range resp { + if item.Time == v.Time && item.Context == v.Context { + dup = true + break + } + } + if !dup { + resp = append(resp, v) + fmt.Printf(" Added latest: %s\n", v.Time) + } + } + } + rowsL.Close() + } + } else if currentCount == 1 { + fmt.Printf("Date %s has 1 record, determining supplement based on time...\n", supplementDate) + times := depthTimeMap[supplementDate] + if len(times) > 0 { + timeStr := times[0] // "HH:MM:SS" + parts := strings.Split(timeStr, ":") + if len(parts) == 3 { + hour, _ := strconv.Atoi(parts[0]) + start := supplementDate + " 00:00:00" + end := supplementDate + " 23:59:59" + + if hour < 12 { + // supplement latest + sqlLatest := fmt.Sprintf(` + SELECT TOP 1 [6752],[6775],[6776],[6778],[6779] + FROM [ENGINEERSERVICES] + WHERE [6752] BETWEEN '%s' AND '%s' + AND NOT ([6775] IS NULL AND [6776] IS NULL AND [6778] IS NULL AND [6779] IS NULL) + ORDER BY [6752] DESC`, start, end) + rowsL, err := conn.Query(sqlLatest) + if err == nil { + for rowsL.Next() { + var v Cmr_input_record + var d, tvd, dev, tmp string + var ot string + if err := rowsL.Scan(&ot, &d, &tvd, &dev, &tmp); err == nil { + v.Time = ot + if len(v.Time) >= 19 { + v.Time = v.Time[:10] + " " + v.Time[11:19] + v.Time = do_time_by_ps(v.Time, ps_info) + } + if ps_info.R2 == "1" { + v.Context = fmt.Sprintf(`%s Current measured depth: %sm Current TVD: %sm Current INC: %s° Current circulation temperature: %s℃`, + v.Time, d, tvd, dev, tmp) + } else { + f, _ := strconv.ParseFloat(tmp, 64) + f = 1.8*f + 32 + v.Context = fmt.Sprintf(`%s Current measured depth: %sm Current TVD: %sm Current INC: %s° Current circulation temperature: %s℉`, + v.Time, d, tvd, dev, fmt.Sprintf("%.02f", f)) + } + dup := false + for _, item := range resp { + if item.Time == v.Time && item.Context == v.Context { + dup = true + break + } + } + if !dup { + resp = append(resp, v) + fmt.Printf(" Added latest: %s\n", v.Time) + } + } + } + rowsL.Close() + } + } else { + // supplement earliest + sqlEarliest := fmt.Sprintf(` + SELECT TOP 1 [6752],[6775],[6776],[6778],[6779] + FROM [ENGINEERSERVICES] + WHERE [6752] BETWEEN '%s' AND '%s' + AND NOT ([6775] IS NULL AND [6776] IS NULL AND [6778] IS NULL AND [6779] IS NULL) + ORDER BY [6752] ASC`, start, end) + rowsE, err := conn.Query(sqlEarliest) + if err == nil { + for rowsE.Next() { + var v Cmr_input_record + var d, tvd, dev, tmp string + var ot string + if err := rowsE.Scan(&ot, &d, &tvd, &dev, &tmp); err == nil { + v.Time = ot + if len(v.Time) >= 19 { + v.Time = v.Time[:10] + " " + v.Time[11:19] + v.Time = do_time_by_ps(v.Time, ps_info) + } + if ps_info.R2 == "1" { + v.Context = fmt.Sprintf(`%s Current measured depth: %sm Current TVD: %sm Current INC: %s° Current circulation temperature: %s℃`, + v.Time, d, tvd, dev, tmp) + } else { + f, _ := strconv.ParseFloat(tmp, 64) + f = 1.8*f + 32 + v.Context = fmt.Sprintf(`%s Current measured depth: %sm Current TVD: %sm Current INC: %s° Current circulation temperature: %s℉`, + v.Time, d, tvd, dev, fmt.Sprintf("%.02f", f)) + } + dup := false + for _, item := range resp { + if item.Time == v.Time && item.Context == v.Context { + dup = true + break + } + } + if !dup { + resp = append(resp, v) + fmt.Printf(" Added earliest: %s\n", v.Time) + } + } + } + rowsE.Close() + } + } + } + } + } + } + // sorting will be done at the end + } + + // ============== Part 2: Vibration / WOB Data ============== + selSql = "SELECT DISTINCT [6752],[6777],[6780],[6781],[6782] FROM [ENGINEERSERVICES] WHERE NOT ([6777] IS NULL AND [6780] IS NULL AND [6781] IS NULL AND [6782] IS NULL) ORDER BY [6752]" rows1, err = conn.Query(selSql) if err != nil { - logs.Info("get_cmr_record_data Query Error", err.Error()) + logs.Info("get_cmr_record_data_en Query Error (vibration)", err.Error()) return } var old_vibrate, old_WOB, old_drilling_rate, old_hlen string + vibrateDateMap := make(map[string]bool) + vibrateCountMap := make(map[string]int) + vibrateTimeMap := make(map[string][]string) + for rows1.Next() { var v Cmr_input_record - var vibrate string - var WOB string - var drilling_rate string - var hlen string - if err := rows1.Scan(&v.Time, &vibrate, &WOB, &drilling_rate, &hlen); err == nil { + var vibrate, WOB, drilling_rate, hlen string + var originalTime string + if err := rows1.Scan(&originalTime, &vibrate, &WOB, &drilling_rate, &hlen); err == nil { + v.Time = originalTime if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) } + if len(v.Time) >= 10 { + dateOnly := v.Time[:10] + vibrateDateMap[dateOnly] = true + if len(originalTime) >= 19 { + timeOnly := originalTime[11:19] + vibrateTimeMap[dateOnly] = append(vibrateTimeMap[dateOnly], timeOnly) + } + } + v.Context = fmt.Sprintf(`%s Vibration: %sg WOB: %skN ROP: %sr/min Length of horizontal section: %sm`, v.Time, vibrate, WOB, drilling_rate, hlen) @@ -15128,28 +15461,250 @@ func get_cmr_record_data_en(user string, wellname string) (resp []Cmr_input_reco resp = append(resp, v) + if len(v.Time) >= 10 { + dateOnly := v.Time[:10] + vibrateCountMap[dateOnly]++ + } + old_vibrate = vibrate old_WOB = WOB old_drilling_rate = drilling_rate old_hlen = hlen } else { - logs.Info("get_cmr Query Error", err.Error()) + logs.Info("get_cmr_record_data_en scan error (vibration)", err.Error()) } } rows1.Close() - selSql = fmt.Sprintf("select distinct [5209],[5210],[5211],[5212],[5219] from [EQUIPMENTRECORDS] where [5219] is not null order by [5219] ") + // Print vibration data statistics + fmt.Println("\n========== Vibration/WOB Data ==========") + fmt.Printf("Vibration data covers %d days\n", len(vibrateDateMap)) + if len(vibrateDateMap) > 0 { + fmt.Println("Date list and record counts:") + dates := make([]string, 0, len(vibrateDateMap)) + for date := range vibrateDateMap { + dates = append(dates, date) + } + sort.Strings(dates) + for _, date := range dates { + fmt.Printf("%s: %d records\n", date, vibrateCountMap[date]) + } + } + + // Supplement vibration data + fmt.Println("\nChecking vibration data for dates with <2 records and supplementing...") + needVibrateDates := make([]string, 0) + for date := range vibrateDateMap { + if vibrateCountMap[date] < 2 { + needVibrateDates = append(needVibrateDates, date) + } + } + if len(needVibrateDates) > 0 { + fmt.Printf("Found %d date(s) with less than 2 vibration records\n", len(needVibrateDates)) + sort.Strings(needVibrateDates) + for _, supplementDate := range needVibrateDates { + currentCount := vibrateCountMap[supplementDate] + if currentCount == 0 { + fmt.Printf("Date %s has 0 records, adding earliest and latest one each\n", supplementDate) + start := supplementDate + " 00:00:00" + end := supplementDate + " 23:59:59" + + // earliest + sqlEarliest := fmt.Sprintf(` + SELECT TOP 1 [6752],[6777],[6780],[6781],[6782] + FROM [ENGINEERSERVICES] + WHERE [6752] BETWEEN '%s' AND '%s' + AND NOT ([6777] IS NULL AND [6780] IS NULL AND [6781] IS NULL AND [6782] IS NULL) + ORDER BY [6752] ASC`, start, end) + rowsE, err := conn.Query(sqlEarliest) + if err == nil { + for rowsE.Next() { + var v Cmr_input_record + var vib, wob, dr, hl string + var ot string + if err := rowsE.Scan(&ot, &vib, &wob, &dr, &hl); err == nil { + v.Time = ot + if len(v.Time) >= 19 { + v.Time = v.Time[:10] + " " + v.Time[11:19] + v.Time = do_time_by_ps(v.Time, ps_info) + } + v.Context = fmt.Sprintf(`%s Vibration: %sg WOB: %skN ROP: %sr/min Length of horizontal section: %sm`, + v.Time, vib, wob, dr, hl) + dup := false + for _, item := range resp { + if item.Time == v.Time && item.Context == v.Context { + dup = true + break + } + } + if !dup { + resp = append(resp, v) + fmt.Printf(" Added earliest: %s\n", v.Time) + } + } + } + rowsE.Close() + } + + // latest + sqlLatest := fmt.Sprintf(` + SELECT TOP 1 [6752],[6777],[6780],[6781],[6782] + FROM [ENGINEERSERVICES] + WHERE [6752] BETWEEN '%s' AND '%s' + AND NOT ([6777] IS NULL AND [6780] IS NULL AND [6781] IS NULL AND [6782] IS NULL) + ORDER BY [6752] DESC`, start, end) + rowsL, err := conn.Query(sqlLatest) + if err == nil { + for rowsL.Next() { + var v Cmr_input_record + var vib, wob, dr, hl string + var ot string + if err := rowsL.Scan(&ot, &vib, &wob, &dr, &hl); err == nil { + v.Time = ot + if len(v.Time) >= 19 { + v.Time = v.Time[:10] + " " + v.Time[11:19] + v.Time = do_time_by_ps(v.Time, ps_info) + } + v.Context = fmt.Sprintf(`%s Vibration: %sg WOB: %skN ROP: %sr/min Length of horizontal section: %sm`, + v.Time, vib, wob, dr, hl) + dup := false + for _, item := range resp { + if item.Time == v.Time && item.Context == v.Context { + dup = true + break + } + } + if !dup { + resp = append(resp, v) + fmt.Printf(" Added latest: %s\n", v.Time) + } + } + } + rowsL.Close() + } + } else if currentCount == 1 { + fmt.Printf("Date %s has 1 record, determining supplement based on time...\n", supplementDate) + times := vibrateTimeMap[supplementDate] + if len(times) > 0 { + timeStr := times[0] + parts := strings.Split(timeStr, ":") + if len(parts) == 3 { + hour, _ := strconv.Atoi(parts[0]) + start := supplementDate + " 00:00:00" + end := supplementDate + " 23:59:59" + if hour < 12 { + sqlLatest := fmt.Sprintf(` + SELECT TOP 1 [6752],[6777],[6780],[6781],[6782] + FROM [ENGINEERSERVICES] + WHERE [6752] BETWEEN '%s' AND '%s' + AND NOT ([6777] IS NULL AND [6780] IS NULL AND [6781] IS NULL AND [6782] IS NULL) + ORDER BY [6752] DESC`, start, end) + rowsL, err := conn.Query(sqlLatest) + if err == nil { + for rowsL.Next() { + var v Cmr_input_record + var vib, wob, dr, hl string + var ot string + if err := rowsL.Scan(&ot, &vib, &wob, &dr, &hl); err == nil { + v.Time = ot + if len(v.Time) >= 19 { + v.Time = v.Time[:10] + " " + v.Time[11:19] + v.Time = do_time_by_ps(v.Time, ps_info) + } + v.Context = fmt.Sprintf(`%s Vibration: %sg WOB: %skN ROP: %sr/min Length of horizontal section: %sm`, + v.Time, vib, wob, dr, hl) + dup := false + for _, item := range resp { + if item.Time == v.Time && item.Context == v.Context { + dup = true + break + } + } + if !dup { + resp = append(resp, v) + fmt.Printf(" Added latest: %s\n", v.Time) + } + } + } + rowsL.Close() + } + } else { + sqlEarliest := fmt.Sprintf(` + SELECT TOP 1 [6752],[6777],[6780],[6781],[6782] + FROM [ENGINEERSERVICES] + WHERE [6752] BETWEEN '%s' AND '%s' + AND NOT ([6777] IS NULL AND [6780] IS NULL AND [6781] IS NULL AND [6782] IS NULL) + ORDER BY [6752] ASC`, start, end) + rowsE, err := conn.Query(sqlEarliest) + if err == nil { + for rowsE.Next() { + var v Cmr_input_record + var vib, wob, dr, hl string + var ot string + if err := rowsE.Scan(&ot, &vib, &wob, &dr, &hl); err == nil { + v.Time = ot + if len(v.Time) >= 19 { + v.Time = v.Time[:10] + " " + v.Time[11:19] + v.Time = do_time_by_ps(v.Time, ps_info) + } + v.Context = fmt.Sprintf(`%s Vibration: %sg WOB: %skN ROP: %sr/min Length of horizontal section: %sm`, + v.Time, vib, wob, dr, hl) + dup := false + for _, item := range resp { + if item.Time == v.Time && item.Context == v.Context { + dup = true + break + } + } + if !dup { + resp = append(resp, v) + fmt.Printf(" Added earliest: %s\n", v.Time) + } + } + } + rowsE.Close() + } + } + } + } + } + } + } + + // ============== Part 3: Mud Data ============== + selSql = "SELECT DISTINCT [5209],[5210],[5211],[5212],[5219] FROM [EQUIPMENTRECORDS] WHERE NOT ([5210] IS NULL AND [5211] IS NULL AND [5212] IS NULL AND [5219] IS NULL) ORDER BY [5219]" rows1, err = conn.Query(selSql) if err != nil { - logs.Info("get_cmr_record_data Query Error", err.Error()) + logs.Info("get_cmr_record_data_en Query Error (mud)", err.Error()) return } var old_s1, old_s2, old_s3, old_s4 float32 + mudDateMap := make(map[string]bool) + mudCountMap := make(map[string]int) + mudTimeMap := make(map[string][]string) + for rows1.Next() { var v Cmr_input_record var s1, s2, s3, s4 float32 - if err := rows1.Scan(&s1, &s2, &s3, &s4, &v.Time); err == nil { + var originalTime string + if err := rows1.Scan(&s1, &s2, &s3, &s4, &originalTime); err == nil { + v.Time = originalTime + + if len(v.Time) >= 19 { + originalTimeForStat := v.Time + v.Time = v.Time[:10] + " " + v.Time[11:19] + v.Time = do_time_by_ps(v.Time, ps_info) + + if len(v.Time) >= 10 { + dateOnly := v.Time[:10] + mudDateMap[dateOnly] = true + if len(originalTimeForStat) >= 19 { + timeOnly := originalTimeForStat[11:19] + mudTimeMap[dateOnly] = append(mudTimeMap[dateOnly], timeOnly) + } + } + } if s1 < 0.001 && s2 < 0.001 && s3 < 0.001 && s4 < 0.001 { continue @@ -15159,33 +15714,559 @@ func get_cmr_record_data_en(user string, wellname string) (resp []Cmr_input_reco continue } - if len(v.Time) >= 19 { - v.Time = v.Time[:10] + " " + v.Time[11:19] - v.Time = do_time_by_ps(v.Time, ps_info) - } - v.Context = fmt.Sprintf(`%s Mud density: %sg/cm^3 Mud viscosity: %ss Flow rate: %sL/s Sand content: %s%%`, + v.Context = fmt.Sprintf(`%s Mud density: %sg/cm³ Mud viscosity: %ss Flow rate: %sL/s Sand content: %s%%`, v.Time, fmt.Sprintf("%.02f", s1), fmt.Sprintf("%.02f", s2), fmt.Sprintf("%.02f", s3), fmt.Sprintf("%.02f", s4)) resp = append(resp, v) + if len(v.Time) >= 10 { + dateOnly := v.Time[:10] + mudCountMap[dateOnly]++ + } + old_s1 = s1 old_s2 = s2 old_s3 = s3 old_s4 = s4 } else { - logs.Info("get_cmr Query Error", err.Error()) + logs.Info("get_cmr_record_data_en scan error (mud)", err.Error()) } } rows1.Close() + // Print mud data statistics + fmt.Println("\n========== Mud Data ==========") + fmt.Printf("Mud data covers %d days\n", len(mudDateMap)) + if len(mudDateMap) > 0 { + fmt.Println("Date list and record counts:") + dates := make([]string, 0, len(mudDateMap)) + for date := range mudDateMap { + dates = append(dates, date) + } + sort.Strings(dates) + for _, date := range dates { + fmt.Printf("%s: %d records\n", date, mudCountMap[date]) + } + } + + // Supplement mud data + fmt.Println("\nChecking mud data for dates with <2 records and supplementing...") + needMudDates := make([]string, 0) + for date := range mudDateMap { + if mudCountMap[date] < 2 { + needMudDates = append(needMudDates, date) + } + } + if len(needMudDates) > 0 { + fmt.Printf("Found %d date(s) with less than 2 mud records\n", len(needMudDates)) + sort.Strings(needMudDates) + for _, supplementDate := range needMudDates { + currentCount := mudCountMap[supplementDate] + if currentCount == 0 { + fmt.Printf("Date %s has 0 records, adding earliest and latest one each\n", supplementDate) + start := supplementDate + " 00:00:00" + end := supplementDate + " 23:59:59" + + // earliest + sqlEarliest := fmt.Sprintf(` + SELECT TOP 1 [5209],[5210],[5211],[5212],[5219] + FROM [EQUIPMENTRECORDS] + WHERE [5219] BETWEEN '%s' AND '%s' + AND NOT ([5210] IS NULL AND [5211] IS NULL AND [5212] IS NULL AND [5219] IS NULL) + ORDER BY [5219] ASC`, start, end) + rowsE, err := conn.Query(sqlEarliest) + if err == nil { + for rowsE.Next() { + var v Cmr_input_record + var s1, s2, s3, s4 float32 + var ot string + if err := rowsE.Scan(&s1, &s2, &s3, &s4, &ot); err == nil { + v.Time = ot + if len(v.Time) >= 19 { + v.Time = v.Time[:10] + " " + v.Time[11:19] + v.Time = do_time_by_ps(v.Time, ps_info) + } + v.Context = fmt.Sprintf(`%s Mud density: %sg/cm³ Mud viscosity: %ss Flow rate: %sL/s Sand content: %s%%`, + v.Time, fmt.Sprintf("%.02f", s1), fmt.Sprintf("%.02f", s2), + fmt.Sprintf("%.02f", s3), fmt.Sprintf("%.02f", s4)) + dup := false + for _, item := range resp { + if item.Time == v.Time && item.Context == v.Context { + dup = true + break + } + } + if !dup && !(s1 < 0.001 && s2 < 0.001 && s3 < 0.001 && s4 < 0.001) { + resp = append(resp, v) + fmt.Printf(" Added earliest: %s\n", v.Time) + } + } + } + rowsE.Close() + } + + // latest + sqlLatest := fmt.Sprintf(` + SELECT TOP 1 [5209],[5210],[5211],[5212],[5219] + FROM [EQUIPMENTRECORDS] + WHERE [5219] BETWEEN '%s' AND '%s' + AND NOT ([5210] IS NULL AND [5211] IS NULL AND [5212] IS NULL AND [5219] IS NULL) + ORDER BY [5219] DESC`, start, end) + rowsL, err := conn.Query(sqlLatest) + if err == nil { + for rowsL.Next() { + var v Cmr_input_record + var s1, s2, s3, s4 float32 + var ot string + if err := rowsL.Scan(&s1, &s2, &s3, &s4, &ot); err == nil { + v.Time = ot + if len(v.Time) >= 19 { + v.Time = v.Time[:10] + " " + v.Time[11:19] + v.Time = do_time_by_ps(v.Time, ps_info) + } + v.Context = fmt.Sprintf(`%s Mud density: %sg/cm³ Mud viscosity: %ss Flow rate: %sL/s Sand content: %s%%`, + v.Time, fmt.Sprintf("%.02f", s1), fmt.Sprintf("%.02f", s2), + fmt.Sprintf("%.02f", s3), fmt.Sprintf("%.02f", s4)) + dup := false + for _, item := range resp { + if item.Time == v.Time && item.Context == v.Context { + dup = true + break + } + } + if !dup && !(s1 < 0.001 && s2 < 0.001 && s3 < 0.001 && s4 < 0.001) { + resp = append(resp, v) + fmt.Printf(" Added latest: %s\n", v.Time) + } + } + } + rowsL.Close() + } + } else if currentCount == 1 { + fmt.Printf("Date %s has 1 record, determining supplement based on time...\n", supplementDate) + times := mudTimeMap[supplementDate] + if len(times) > 0 { + timeStr := times[0] + parts := strings.Split(timeStr, ":") + if len(parts) == 3 { + hour, _ := strconv.Atoi(parts[0]) + start := supplementDate + " 00:00:00" + end := supplementDate + " 23:59:59" + + if hour < 12 { + // supplement latest + sqlLatest := fmt.Sprintf(` + SELECT TOP 1 [5209],[5210],[5211],[5212],[5219] + FROM [EQUIPMENTRECORDS] + WHERE [5219] BETWEEN '%s' AND '%s' + AND NOT ([5210] IS NULL AND [5211] IS NULL AND [5212] IS NULL AND [5219] IS NULL) + ORDER BY [5219] DESC`, start, end) + rowsL, err := conn.Query(sqlLatest) + if err == nil { + for rowsL.Next() { + var v Cmr_input_record + var s1, s2, s3, s4 float32 + var ot string + if err := rowsL.Scan(&s1, &s2, &s3, &s4, &ot); err == nil { + v.Time = ot + if len(v.Time) >= 19 { + v.Time = v.Time[:10] + " " + v.Time[11:19] + v.Time = do_time_by_ps(v.Time, ps_info) + } + v.Context = fmt.Sprintf(`%s Mud density: %sg/cm³ Mud viscosity: %ss Flow rate: %sL/s Sand content: %s%%`, + v.Time, fmt.Sprintf("%.02f", s1), fmt.Sprintf("%.02f", s2), + fmt.Sprintf("%.02f", s3), fmt.Sprintf("%.02f", s4)) + dup := false + for _, item := range resp { + if item.Time == v.Time && item.Context == v.Context { + dup = true + break + } + } + if !dup && !(s1 < 0.001 && s2 < 0.001 && s3 < 0.001 && s4 < 0.001) { + resp = append(resp, v) + fmt.Printf(" Added latest: %s\n", v.Time) + } + } + } + rowsL.Close() + } + } else { + // supplement earliest + sqlEarliest := fmt.Sprintf(` + SELECT TOP 1 [5209],[5210],[5211],[5212],[5219] + FROM [EQUIPMENTRECORDS] + WHERE [5219] BETWEEN '%s' AND '%s' + AND NOT ([5210] IS NULL AND [5211] IS NULL AND [5212] IS NULL AND [5219] IS NULL) + ORDER BY [5219] ASC`, start, end) + rowsE, err := conn.Query(sqlEarliest) + if err == nil { + for rowsE.Next() { + var v Cmr_input_record + var s1, s2, s3, s4 float32 + var ot string + if err := rowsE.Scan(&s1, &s2, &s3, &s4, &ot); err == nil { + v.Time = ot + if len(v.Time) >= 19 { + v.Time = v.Time[:10] + " " + v.Time[11:19] + v.Time = do_time_by_ps(v.Time, ps_info) + } + v.Context = fmt.Sprintf(`%s Mud density: %sg/cm³ Mud viscosity: %ss Flow rate: %sL/s Sand content: %s%%`, + v.Time, fmt.Sprintf("%.02f", s1), fmt.Sprintf("%.02f", s2), + fmt.Sprintf("%.02f", s3), fmt.Sprintf("%.02f", s4)) + dup := false + for _, item := range resp { + if item.Time == v.Time && item.Context == v.Context { + dup = true + break + } + } + if !dup && !(s1 < 0.001 && s2 < 0.001 && s3 < 0.001 && s4 < 0.001) { + resp = append(resp, v) + fmt.Printf(" Added earliest: %s\n", v.Time) + } + } + } + rowsE.Close() + } + } + } + } + } + } + } + + // Final sort by time descending sort.Slice(resp, func(i, j int) bool { return resp[i].Time > resp[j].Time }) + fmt.Printf("\nAll data processed. Final record count: %d\n", len(resp)) return } +// func get_cmr_record_data_en(user string, wellname string) (resp []Cmr_input_record) { + +// ps_info := get_ps_info(user) + +// var well_database string + +// sel_sql := fmt.Sprintf(`select [WELLName] from [WellInformation] where [WELLNameSource]='%s'`, wellname) +// rows, err := sqlConn.Query(sel_sql) +// if err == nil { +// for rows.Next() { +// if err = rows.Scan(&well_database); err != nil { +// logs.Error("get_cmr_record_data scan database err:", err.Error()) +// } +// } +// rows.Close() +// } + +// if well_database == "" { +// return +// } + +// conn, err := getOdbcConn(well_database) +// if err != nil { +// return +// } +// defer conn.Close() + +// selSql := fmt.Sprintf("select distinct [6752],[6775],[6776],[6778],[6779] from [ENGINEERSERVICES] order by [6752] ") +// rows1, err := conn.Query(selSql) +// if err != nil { +// logs.Info("get_cmr_record_data Query Error", err.Error()) +// return +// } + +// var old_depth, old_tvd, old_deviation, old_temp string +// for rows1.Next() { +// var v Cmr_input_record +// var depth string +// var tvd string +// var deviation string +// var temp string +// if err := rows1.Scan(&v.Time, &depth, &tvd, &deviation, &temp); err == nil { +// if len(v.Time) >= 19 { +// v.Time = v.Time[:10] + " " + v.Time[11:19] +// v.Time = do_time_by_ps(v.Time, ps_info) +// } + +// if depth == old_depth && old_tvd == tvd && old_deviation == deviation && old_temp == temp { +// continue +// } + +// if ps_info.R2 == "1" { +// v.Context = fmt.Sprintf(`%s Current measured depth: %sm Current TVD: %sm Current INC: %s° Current circulation temperature: %s℃`, +// v.Time, depth, tvd, deviation, temp) +// } else { +// f, _ := strconv.ParseFloat(temp, 64) +// f = float64(1.8*f + 32) +// v.Context = fmt.Sprintf(`%s Current measured depth: %sm Current TVD: %sm Current INC: %s° Current circulation temperature: %s℉`, +// v.Time, depth, tvd, deviation, fmt.Sprintf("%.02f", f)) +// } + +// resp = append(resp, v) + +// old_depth = depth +// old_deviation = deviation +// old_temp = temp +// old_tvd = tvd +// } else { +// logs.Info("get_cmr Query Error", err.Error()) +// } +// } +// rows1.Close() + +// selSql = fmt.Sprintf("select distinct [6752],[6777],[6780],[6781],[6782] from [ENGINEERSERVICES] order by [6752] ") +// rows1, err = conn.Query(selSql) +// if err != nil { +// logs.Info("get_cmr_record_data Query Error", err.Error()) +// return +// } + +// var old_vibrate, old_WOB, old_drilling_rate, old_hlen string +// for rows1.Next() { +// var v Cmr_input_record +// var vibrate string +// var WOB string +// var drilling_rate string +// var hlen string +// if err := rows1.Scan(&v.Time, &vibrate, &WOB, &drilling_rate, &hlen); err == nil { +// if len(v.Time) >= 19 { +// v.Time = v.Time[:10] + " " + v.Time[11:19] +// v.Time = do_time_by_ps(v.Time, ps_info) +// } +// v.Context = fmt.Sprintf(`%s Vibration: %sg WOB: %skN ROP: %sr/min Length of horizontal section: %sm`, +// v.Time, vibrate, WOB, drilling_rate, hlen) + +// if old_vibrate == vibrate && old_WOB == WOB && old_drilling_rate == drilling_rate && old_hlen == hlen { +// continue +// } + +// resp = append(resp, v) + +// old_vibrate = vibrate +// old_WOB = WOB +// old_drilling_rate = drilling_rate +// old_hlen = hlen +// } else { +// logs.Info("get_cmr Query Error", err.Error()) +// } +// } +// rows1.Close() + +// selSql = fmt.Sprintf("select distinct [5209],[5210],[5211],[5212],[5219] from [EQUIPMENTRECORDS] where [5219] is not null order by [5219] ") +// rows1, err = conn.Query(selSql) +// if err != nil { +// logs.Info("get_cmr_record_data Query Error", err.Error()) +// return +// } + +// var old_s1, old_s2, old_s3, old_s4 float32 +// for rows1.Next() { +// var v Cmr_input_record +// var s1, s2, s3, s4 float32 +// if err := rows1.Scan(&s1, &s2, &s3, &s4, &v.Time); err == nil { + +// if s1 < 0.001 && s2 < 0.001 && s3 < 0.001 && s4 < 0.001 { +// continue +// } + +// if old_s1 == s1 && old_s2 == s2 && old_s3 == s3 && old_s4 == s4 { +// continue +// } + +// if len(v.Time) >= 19 { +// v.Time = v.Time[:10] + " " + v.Time[11:19] +// v.Time = do_time_by_ps(v.Time, ps_info) +// } +// v.Context = fmt.Sprintf(`%s Mud density: %sg/cm^3 Mud viscosity: %ss Flow rate: %sL/s Sand content: %s%%`, +// v.Time, fmt.Sprintf("%.02f", s1), fmt.Sprintf("%.02f", s2), +// fmt.Sprintf("%.02f", s3), fmt.Sprintf("%.02f", s4)) + +// resp = append(resp, v) + +// old_s1 = s1 +// old_s2 = s2 +// old_s3 = s3 +// old_s4 = s4 +// } else { +// logs.Info("get_cmr Query Error", err.Error()) +// } +// } +// rows1.Close() + +// sort.Slice(resp, func(i, j int) bool { +// return resp[i].Time > resp[j].Time +// }) + +// return +// } + +// func get_cmr_record_data(user string, wellname string) (resp []Cmr_input_record) { + +// ps_info := get_ps_info(user) + +// var well_database string + +// sel_sql := fmt.Sprintf(`select [WELLName] from [WellInformation] where [WELLNameSource]='%s'`, wellname) +// rows, err := sqlConn.Query(sel_sql) +// if err == nil { +// for rows.Next() { +// if err = rows.Scan(&well_database); err != nil { +// logs.Error("get_cmr_record_data scan database err:", err.Error()) +// } +// } +// rows.Close() +// } + +// if well_database == "" { +// return +// } + +// conn, err := getOdbcConn(well_database) +// if err != nil { +// return +// } +// defer conn.Close() + +// selSql := fmt.Sprintf("select distinct [6752],[6775],[6776],[6778],[6779] from [ENGINEERSERVICES] order by [6752] ") +// rows1, err := conn.Query(selSql) + +// if err != nil { +// logs.Info("get_cmr_record_data Query Error", err.Error()) +// return +// } + +// var old_depth, old_tvd, old_deviation, old_temp string +// for rows1.Next() { +// var v Cmr_input_record +// var depth string +// var tvd string +// var deviation string +// var temp string +// if err := rows1.Scan(&v.Time, &depth, &tvd, &deviation, &temp); err == nil { +// if len(v.Time) >= 19 { +// v.Time = v.Time[:10] + " " + v.Time[11:19] +// v.Time = do_time_by_ps(v.Time, ps_info) +// } + +// if depth == old_depth && old_tvd == tvd && old_deviation == deviation && old_temp == temp { +// continue +// } + +// if ps_info.R2 == "1" { +// v.Context = fmt.Sprintf(`%s 当前测深: %sm 当前垂深: %sm 当前井斜: %s° 当前循环温度: %s℃`, +// v.Time, depth, tvd, deviation, temp) +// } else { +// f, _ := strconv.ParseFloat(temp, 64) +// f = float64(1.8*f + 32) +// v.Context = fmt.Sprintf(`%s 当前测深: %sm 当前垂深: %sm 当前井斜: %s° 当前循环温度: %s℉`, +// v.Time, depth, tvd, deviation, fmt.Sprintf("%.02f", f)) +// } + +// resp = append(resp, v) + +// old_depth = depth +// old_deviation = deviation +// old_temp = temp +// old_tvd = tvd +// } else { +// logs.Info("get_cmr Query Error", err.Error()) +// } +// } +// rows1.Close() + +// selSql = fmt.Sprintf("select distinct [6752],[6777],[6780],[6781],[6782] from [ENGINEERSERVICES] order by [6752] ") +// rows1, err = conn.Query(selSql) +// if err != nil { +// logs.Info("get_cmr_record_data Query Error", err.Error()) +// return +// } + +// var old_vibrate, old_WOB, old_drilling_rate, old_hlen string +// for rows1.Next() { +// var v Cmr_input_record +// var vibrate string +// var WOB string +// var drilling_rate string +// var hlen string +// if err := rows1.Scan(&v.Time, &vibrate, &WOB, &drilling_rate, &hlen); err == nil { +// if len(v.Time) >= 19 { +// v.Time = v.Time[:10] + " " + v.Time[11:19] +// v.Time = do_time_by_ps(v.Time, ps_info) +// } +// v.Context = fmt.Sprintf(`%s 振动值: %sg 钻压值: %skN 钻速值: %sr/min 水平段长度: %sm`, +// v.Time, vibrate, WOB, drilling_rate, hlen) + +// if old_vibrate == vibrate && old_WOB == WOB && old_drilling_rate == drilling_rate && old_hlen == hlen { +// continue +// } + +// resp = append(resp, v) + +// old_vibrate = vibrate +// old_WOB = WOB +// old_drilling_rate = drilling_rate +// old_hlen = hlen + +// } else { +// logs.Info("get_cmr Query Error", err.Error()) +// } +// } +// rows1.Close() + +// selSql = fmt.Sprintf("select distinct [5209],[5210],[5211],[5212],[5219] from [EQUIPMENTRECORDS] where [5219] is not null order by [5219] ") +// rows1, err = conn.Query(selSql) +// fmt.Println("selSql---------", selSql) +// if err != nil { +// logs.Info("get_cmr_record_data Query Error", err.Error()) +// return +// } + +// var old_s1, old_s2, old_s3, old_s4 float32 +// for rows1.Next() { +// var v Cmr_input_record +// var s1, s2, s3, s4 float32 +// if err := rows1.Scan(&s1, &s2, &s3, &s4, &v.Time); err == nil { + +// if s1 < 0.001 && s2 < 0.001 && s3 < 0.001 && s4 < 0.001 { +// continue +// } + +// if old_s1 == s1 && old_s2 == s2 && old_s3 == s3 && old_s4 == s4 { +// continue +// } + +// if len(v.Time) >= 19 { +// v.Time = v.Time[:10] + " " + v.Time[11:19] +// v.Time = do_time_by_ps(v.Time, ps_info) +// } +// v.Context = fmt.Sprintf(`%s 泥浆密度: %sg/cm^3 泥浆粘度: %ss 排量: %sL/s 泥浆含沙量: %s%%`, +// v.Time, fmt.Sprintf("%.02f", s1), fmt.Sprintf("%.02f", s2), +// fmt.Sprintf("%.02f", s3), fmt.Sprintf("%.02f", s4)) + +// resp = append(resp, v) + +// old_s1 = s1 +// old_s2 = s2 +// old_s3 = s3 +// old_s4 = s4 +// } else { +// logs.Info("get_cmr Query Error", err.Error()) +// } +// } +// rows1.Close() + +// sort.Slice(resp, func(i, j int) bool { +// return resp[i].Time > resp[j].Time +// }) + +// return +// } + func get_cmr_record_data(user string, wellname string) (resp []Cmr_input_record) { ps_info := get_ps_info(user) @@ -15213,7 +16294,18 @@ func get_cmr_record_data(user string, wellname string) (resp []Cmr_input_record) } defer conn.Close() - selSql := fmt.Sprintf("select distinct [6752],[6775],[6776],[6778],[6779] from [ENGINEERSERVICES] order by [6752] ") + // ============== 第一部分:测深数据 ============== + selSql := `SELECT DISTINCT + [6752], + [6775], + [6776], + [6778], + [6779] + FROM + [ENGINEERSERVICES] WHERE NOT ([6775] IS NULL AND [6776] IS NULL AND [6778] IS NULL AND [6779] IS NULL) + ORDER BY + [6752]` + rows1, err := conn.Query(selSql) if err != nil { logs.Info("get_cmr_record_data Query Error", err.Error()) @@ -15221,22 +16313,40 @@ func get_cmr_record_data(user string, wellname string) (resp []Cmr_input_record) } var old_depth, old_tvd, old_deviation, old_temp string + depthDateMap := make(map[string]bool) // 测深数据不同日期 + depthCountMap := make(map[string]int) // 测深数据每个日期已有数量 + depthTimeMap := make(map[string][]string) // 测深数据每个日期已有的时间点(用于判断) + for rows1.Next() { var v Cmr_input_record var depth string var tvd string var deviation string var temp string - if err := rows1.Scan(&v.Time, &depth, &tvd, &deviation, &temp); err == nil { + var originalTime string + if err := rows1.Scan(&originalTime, &depth, &tvd, &deviation, &temp); err == nil { + v.Time = originalTime if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) } + // 统计日期 + if len(v.Time) >= 10 { + dateOnly := v.Time[:10] + depthDateMap[dateOnly] = true + // 记录原始时间点 + if len(originalTime) >= 19 { + timeOnly := originalTime[11:19] + depthTimeMap[dateOnly] = append(depthTimeMap[dateOnly], timeOnly) + } + } + // 去重:连续相同值跳过 if depth == old_depth && old_tvd == tvd && old_deviation == deviation && old_temp == temp { continue } + // 格式化上下文 if ps_info.R2 == "1" { v.Context = fmt.Sprintf(`%s 当前测深: %sm 当前垂深: %sm 当前井斜: %s° 当前循环温度: %s℃`, v.Time, depth, tvd, deviation, temp) @@ -15249,6 +16359,12 @@ func get_cmr_record_data(user string, wellname string) (resp []Cmr_input_record) resp = append(resp, v) + // 统计数量 + if len(v.Time) >= 10 { + dateOnly := v.Time[:10] + depthCountMap[dateOnly]++ + } + old_depth = depth old_deviation = deviation old_temp = temp @@ -15259,7 +16375,232 @@ func get_cmr_record_data(user string, wellname string) (resp []Cmr_input_record) } rows1.Close() - selSql = fmt.Sprintf("select distinct [6752],[6777],[6780],[6781],[6782] from [ENGINEERSERVICES] order by [6752] ") + // 打印测深数据统计 + fmt.Println("\n========== 测深数据 ==========") + fmt.Printf("测深数据共有 %d 天的数据\n", len(depthDateMap)) + if len(depthDateMap) > 0 { + fmt.Println("测深数据日期列表及数据条数:") + dates := make([]string, 0, len(depthDateMap)) + for date := range depthDateMap { + dates = append(dates, date) + } + sort.Strings(dates) + for _, date := range dates { + fmt.Printf("%s: %d 条\n", date, depthCountMap[date]) + } + } + + // 检查并补充测深数据 + fmt.Println("\n检查测深数据条数少于2的日期并补充...") + needDepthDates := make([]string, 0) + for date := range depthDateMap { + if depthCountMap[date] < 2 { + needDepthDates = append(needDepthDates, date) + } + } + if len(needDepthDates) > 0 { + fmt.Printf("测深数据发现 %d 个日期少于2条\n", len(needDepthDates)) + sort.Strings(needDepthDates) + for _, supplementDate := range needDepthDates { + currentCount := depthCountMap[supplementDate] + if currentCount == 0 { + fmt.Printf("日期 %s 有0条,补充最早和最晚各1条\n", supplementDate) + start := supplementDate + " 00:00:00" + end := supplementDate + " 23:59:59" + + // 最早一条 + sqlEarliest := fmt.Sprintf(` + SELECT TOP 1 [6752],[6775],[6776],[6778],[6779] + FROM [ENGINEERSERVICES] + WHERE [6752] BETWEEN '%s' AND '%s' AND NOT ([6775] IS NULL AND [6776] IS NULL AND [6778] IS NULL AND [6779] IS NULL) + ORDER BY [6752] ASC`, start, end) + rowsE, err := conn.Query(sqlEarliest) + if err == nil { + for rowsE.Next() { + var v Cmr_input_record + var d, tvd, dev, tmp string + var ot string + if err := rowsE.Scan(&ot, &d, &tvd, &dev, &tmp); err == nil { + v.Time = ot + if len(v.Time) >= 19 { + v.Time = v.Time[:10] + " " + v.Time[11:19] + v.Time = do_time_by_ps(v.Time, ps_info) + } + if ps_info.R2 == "1" { + v.Context = fmt.Sprintf(`%s 当前测深: %sm 当前垂深: %sm 当前井斜: %s° 当前循环温度: %s℃`, + v.Time, d, tvd, dev, tmp) + } else { + f, _ := strconv.ParseFloat(tmp, 64) + f = 1.8*f + 32 + v.Context = fmt.Sprintf(`%s 当前测深: %sm 当前垂深: %sm 当前井斜: %s° 当前循环温度: %s℉`, + v.Time, d, tvd, dev, fmt.Sprintf("%.02f", f)) + } + // 去重检查 + dup := false + for _, item := range resp { + if item.Time == v.Time && item.Context == v.Context { + dup = true + break + } + } + if !dup { + resp = append(resp, v) + fmt.Printf(" 已添加最早: %s\n", v.Time) + } + } + } + rowsE.Close() + } + + // 最晚一条 + sqlLatest := fmt.Sprintf(` + SELECT TOP 1 [6752],[6775],[6776],[6778],[6779] + FROM [ENGINEERSERVICES] + WHERE [6752] BETWEEN '%s' AND '%s' AND NOT ([6775] IS NULL AND [6776] IS NULL AND [6778] IS NULL AND [6779] IS NULL) + ORDER BY [6752] DESC`, start, end) + rowsL, err := conn.Query(sqlLatest) + if err == nil { + for rowsL.Next() { + var v Cmr_input_record + var d, tvd, dev, tmp string + var ot string + if err := rowsL.Scan(&ot, &d, &tvd, &dev, &tmp); err == nil { + v.Time = ot + if len(v.Time) >= 19 { + v.Time = v.Time[:10] + " " + v.Time[11:19] + v.Time = do_time_by_ps(v.Time, ps_info) + } + if ps_info.R2 == "1" { + v.Context = fmt.Sprintf(`%s 当前测深: %sm 当前垂深: %sm 当前井斜: %s° 当前循环温度: %s℃`, + v.Time, d, tvd, dev, tmp) + } else { + f, _ := strconv.ParseFloat(tmp, 64) + f = 1.8*f + 32 + v.Context = fmt.Sprintf(`%s 当前测深: %sm 当前垂深: %sm 当前井斜: %s° 当前循环温度: %s℉`, + v.Time, d, tvd, dev, fmt.Sprintf("%.02f", f)) + } + dup := false + for _, item := range resp { + if item.Time == v.Time && item.Context == v.Context { + dup = true + break + } + } + if !dup { + resp = append(resp, v) + fmt.Printf(" 已添加最晚: %s\n", v.Time) + } + } + } + rowsL.Close() + } + } else if currentCount == 1 { + fmt.Printf("日期 %s 有1条,根据时间判断补充...\n", supplementDate) + // 获取已有时间点 + times := depthTimeMap[supplementDate] + if len(times) > 0 { + timeStr := times[0] // "HH:MM:SS" + parts := strings.Split(timeStr, ":") + if len(parts) == 3 { + hour, _ := strconv.Atoi(parts[0]) + start := supplementDate + " 00:00:00" + end := supplementDate + " 23:59:59" + + if hour < 12 { + // 补充最晚 + sqlLatest := fmt.Sprintf(` + SELECT TOP 1 [6752],[6775],[6776],[6778],[6779] + FROM [ENGINEERSERVICES] + WHERE [6752] BETWEEN '%s' AND '%s' AND NOT ([6775] IS NULL AND [6776] IS NULL AND [6778] IS NULL AND [6779] IS NULL) + ORDER BY [6752] DESC`, start, end) + rowsL, err := conn.Query(sqlLatest) + if err == nil { + for rowsL.Next() { + var v Cmr_input_record + var d, tvd, dev, tmp string + var ot string + if err := rowsL.Scan(&ot, &d, &tvd, &dev, &tmp); err == nil { + v.Time = ot + if len(v.Time) >= 19 { + v.Time = v.Time[:10] + " " + v.Time[11:19] + v.Time = do_time_by_ps(v.Time, ps_info) + } + if ps_info.R2 == "1" { + v.Context = fmt.Sprintf(`%s 当前测深: %sm 当前垂深: %sm 当前井斜: %s° 当前循环温度: %s℃`, + v.Time, d, tvd, dev, tmp) + } else { + f, _ := strconv.ParseFloat(tmp, 64) + f = 1.8*f + 32 + v.Context = fmt.Sprintf(`%s 当前测深: %sm 当前垂深: %sm 当前井斜: %s° 当前循环温度: %s℉`, + v.Time, d, tvd, dev, fmt.Sprintf("%.02f", f)) + } + dup := false + for _, item := range resp { + if item.Time == v.Time && item.Context == v.Context { + dup = true + break + } + } + if !dup { + resp = append(resp, v) + fmt.Printf(" 已添加最晚: %s\n", v.Time) + } + } + } + rowsL.Close() + } + } else { + // 补充最早 + sqlEarliest := fmt.Sprintf(` + SELECT TOP 1 [6752],[6775],[6776],[6778],[6779] + FROM [ENGINEERSERVICES] + WHERE [6752] BETWEEN '%s' AND '%s' AND NOT ([6775] IS NULL AND [6776] IS NULL AND [6778] IS NULL AND [6779] IS NULL) + ORDER BY [6752] ASC`, start, end) + rowsE, err := conn.Query(sqlEarliest) + if err == nil { + for rowsE.Next() { + var v Cmr_input_record + var d, tvd, dev, tmp string + var ot string + if err := rowsE.Scan(&ot, &d, &tvd, &dev, &tmp); err == nil { + v.Time = ot + if len(v.Time) >= 19 { + v.Time = v.Time[:10] + " " + v.Time[11:19] + v.Time = do_time_by_ps(v.Time, ps_info) + } + if ps_info.R2 == "1" { + v.Context = fmt.Sprintf(`%s 当前测深: %sm 当前垂深: %sm 当前井斜: %s° 当前循环温度: %s℃`, + v.Time, d, tvd, dev, tmp) + } else { + f, _ := strconv.ParseFloat(tmp, 64) + f = 1.8*f + 32 + v.Context = fmt.Sprintf(`%s 当前测深: %sm 当前垂深: %sm 当前井斜: %s° 当前循环温度: %s℉`, + v.Time, d, tvd, dev, fmt.Sprintf("%.02f", f)) + } + dup := false + for _, item := range resp { + if item.Time == v.Time && item.Context == v.Context { + dup = true + break + } + } + if !dup { + resp = append(resp, v) + fmt.Printf(" 已添加最早: %s\n", v.Time) + } + } + } + rowsE.Close() + } + } + } + } + } + } + // 重新排序(后面统一排序) + } + + selSql = "select distinct [6752],[6777],[6780],[6781],[6782] from [ENGINEERSERVICES] WHERE NOT ([6777] IS NULL AND [6780] IS NULL AND [6781] IS NULL AND [6782] IS NULL) order by [6752]" rows1, err = conn.Query(selSql) if err != nil { logs.Info("get_cmr_record_data Query Error", err.Error()) @@ -15267,17 +16608,29 @@ func get_cmr_record_data(user string, wellname string) (resp []Cmr_input_record) } var old_vibrate, old_WOB, old_drilling_rate, old_hlen string + vibrateDateMap := make(map[string]bool) + vibrateCountMap := make(map[string]int) + vibrateTimeMap := make(map[string][]string) + for rows1.Next() { var v Cmr_input_record - var vibrate string - var WOB string - var drilling_rate string - var hlen string - if err := rows1.Scan(&v.Time, &vibrate, &WOB, &drilling_rate, &hlen); err == nil { + var vibrate, WOB, drilling_rate, hlen string + var originalTime string + if err := rows1.Scan(&originalTime, &vibrate, &WOB, &drilling_rate, &hlen); err == nil { + v.Time = originalTime if len(v.Time) >= 19 { v.Time = v.Time[:10] + " " + v.Time[11:19] v.Time = do_time_by_ps(v.Time, ps_info) } + if len(v.Time) >= 10 { + dateOnly := v.Time[:10] + vibrateDateMap[dateOnly] = true + if len(originalTime) >= 19 { + timeOnly := originalTime[11:19] + vibrateTimeMap[dateOnly] = append(vibrateTimeMap[dateOnly], timeOnly) + } + } + v.Context = fmt.Sprintf(`%s 振动值: %sg 钻压值: %skN 钻速值: %sr/min 水平段长度: %sm`, v.Time, vibrate, WOB, drilling_rate, hlen) @@ -15287,29 +16640,250 @@ func get_cmr_record_data(user string, wellname string) (resp []Cmr_input_record) resp = append(resp, v) + if len(v.Time) >= 10 { + dateOnly := v.Time[:10] + vibrateCountMap[dateOnly]++ + } + old_vibrate = vibrate old_WOB = WOB old_drilling_rate = drilling_rate old_hlen = hlen - } else { logs.Info("get_cmr Query Error", err.Error()) } } rows1.Close() - selSql = fmt.Sprintf("select distinct [5209],[5210],[5211],[5212],[5219] from [EQUIPMENTRECORDS] where [5219] is not null order by [5219] ") + // 打印振动数据统计 + fmt.Println("\n========== 振动/钻压数据 ==========") + fmt.Printf("振动数据共有 %d 天的数据\n", len(vibrateDateMap)) + if len(vibrateDateMap) > 0 { + fmt.Println("振动数据日期列表及数据条数:") + dates := make([]string, 0, len(vibrateDateMap)) + for date := range vibrateDateMap { + dates = append(dates, date) + } + sort.Strings(dates) + for _, date := range dates { + fmt.Printf("%s: %d 条\n", date, vibrateCountMap[date]) + } + } + + // 补充振动数据 + fmt.Println("\n检查振动数据条数少于2的日期并补充...") + needVibrateDates := make([]string, 0) + for date := range vibrateDateMap { + if vibrateCountMap[date] < 2 { + needVibrateDates = append(needVibrateDates, date) + } + } + if len(needVibrateDates) > 0 { + fmt.Printf("振动数据发现 %d 个日期少于2条\n", len(needVibrateDates)) + sort.Strings(needVibrateDates) + for _, supplementDate := range needVibrateDates { + currentCount := vibrateCountMap[supplementDate] + if currentCount == 0 { + fmt.Printf("日期 %s 有0条,补充最早和最晚各1条\n", supplementDate) + start := supplementDate + " 00:00:00" + end := supplementDate + " 23:59:59" + + // 最早 + sqlEarliest := fmt.Sprintf(` + SELECT TOP 1 [6752],[6777],[6780],[6781],[6782] + FROM [ENGINEERSERVICES] + WHERE [6752] BETWEEN '%s' AND '%s' AND NOT ([6777] IS NULL AND [6780] IS NULL AND [6781] IS NULL AND [6782] IS NULL) + ORDER BY [6752] ASC`, start, end) + fmt.Println("sqlEarliest--------", sqlEarliest) + rowsE, err := conn.Query(sqlEarliest) + if err == nil { + for rowsE.Next() { + var v Cmr_input_record + var vib, wob, dr, hl string + var ot string + if err := rowsE.Scan(&ot, &vib, &wob, &dr, &hl); err == nil { + v.Time = ot + if len(v.Time) >= 19 { + v.Time = v.Time[:10] + " " + v.Time[11:19] + v.Time = do_time_by_ps(v.Time, ps_info) + } + v.Context = fmt.Sprintf(`%s 振动值: %sg 钻压值: %skN 钻速值: %sr/min 水平段长度: %sm`, + v.Time, vib, wob, dr, hl) + dup := false + for _, item := range resp { + if item.Time == v.Time && item.Context == v.Context { + dup = true + break + } + } + if !dup { + resp = append(resp, v) + fmt.Printf(" 已添加最早: %s\n", v.Time) + } + } + } + rowsE.Close() + } + // 最晚 + sqlLatest := fmt.Sprintf(` + SELECT TOP 1 [6752],[6777],[6780],[6781],[6782] + FROM [ENGINEERSERVICES] + WHERE [6752] BETWEEN '%s' AND '%s' AND NOT ([6777] IS NULL AND [6780] IS NULL AND [6781] IS NULL AND [6782] IS NULL) + ORDER BY [6752] DESC`, start, end) + rowsL, err := conn.Query(sqlLatest) + if err == nil { + for rowsL.Next() { + var v Cmr_input_record + var vib, wob, dr, hl string + var ot string + if err := rowsL.Scan(&ot, &vib, &wob, &dr, &hl); err == nil { + v.Time = ot + if len(v.Time) >= 19 { + v.Time = v.Time[:10] + " " + v.Time[11:19] + v.Time = do_time_by_ps(v.Time, ps_info) + } + v.Context = fmt.Sprintf(`%s 振动值: %sg 钻压值: %skN 钻速值: %sr/min 水平段长度: %sm`, + v.Time, vib, wob, dr, hl) + dup := false + for _, item := range resp { + if item.Time == v.Time && item.Context == v.Context { + dup = true + break + } + } + if !dup { + resp = append(resp, v) + fmt.Printf(" 已添加最晚: %s\n", v.Time) + } + } + } + rowsL.Close() + } + } else if currentCount == 1 { + fmt.Printf("日期 %s 有1条,根据时间判断补充...\n", supplementDate) + times := vibrateTimeMap[supplementDate] + if len(times) > 0 { + timeStr := times[0] + parts := strings.Split(timeStr, ":") + if len(parts) == 3 { + hour, _ := strconv.Atoi(parts[0]) + start := supplementDate + " 00:00:00" + end := supplementDate + " 23:59:59" + if hour < 12 { + sqlLatest := fmt.Sprintf(` + SELECT TOP 1 [6752],[6777],[6780],[6781],[6782] + FROM [ENGINEERSERVICES] + WHERE [6752] BETWEEN '%s' AND '%s' AND NOT ([6777] IS NULL AND [6780] IS NULL AND [6781] IS NULL AND [6782] IS NULL) + ORDER BY [6752] DESC`, start, end) + rowsL, err := conn.Query(sqlLatest) + if err == nil { + for rowsL.Next() { + var v Cmr_input_record + var vib, wob, dr, hl string + var ot string + if err := rowsL.Scan(&ot, &vib, &wob, &dr, &hl); err == nil { + v.Time = ot + if len(v.Time) >= 19 { + v.Time = v.Time[:10] + " " + v.Time[11:19] + v.Time = do_time_by_ps(v.Time, ps_info) + } + v.Context = fmt.Sprintf(`%s 振动值: %sg 钻压值: %skN 钻速值: %sr/min 水平段长度: %sm`, + v.Time, vib, wob, dr, hl) + dup := false + for _, item := range resp { + if item.Time == v.Time && item.Context == v.Context { + dup = true + break + } + } + if !dup { + resp = append(resp, v) + fmt.Printf(" 已添加最晚: %s\n", v.Time) + } + } + } + rowsL.Close() + } + } else { + sqlEarliest := fmt.Sprintf(` + SELECT TOP 1 [6752],[6777],[6780],[6781],[6782] + FROM [ENGINEERSERVICES] + WHERE [6752] BETWEEN '%s' AND '%s' AND NOT ([6777] IS NULL AND [6780] IS NULL AND [6781] IS NULL AND [6782] IS NULL) + ORDER BY [6752] ASC`, start, end) + rowsE, err := conn.Query(sqlEarliest) + if err == nil { + for rowsE.Next() { + var v Cmr_input_record + var vib, wob, dr, hl string + var ot string + if err := rowsE.Scan(&ot, &vib, &wob, &dr, &hl); err == nil { + v.Time = ot + if len(v.Time) >= 19 { + v.Time = v.Time[:10] + " " + v.Time[11:19] + v.Time = do_time_by_ps(v.Time, ps_info) + } + v.Context = fmt.Sprintf(`%s 振动值: %sg 钻压值: %skN 钻速值: %sr/min 水平段长度: %sm`, + v.Time, vib, wob, dr, hl) + dup := false + for _, item := range resp { + if item.Time == v.Time && item.Context == v.Context { + dup = true + break + } + } + if !dup { + resp = append(resp, v) + fmt.Printf(" 已添加最早: %s\n", v.Time) + } + } + } + rowsE.Close() + } + } + } + } + } + } + } + + // ============== 第三部分:泥浆数据 ============== + selSql = "select distinct [5209],[5210],[5211],[5212],[5219] from [EQUIPMENTRECORDS] WHERE NOT ([5210] IS NULL AND [5211] IS NULL AND [5212] IS NULL AND [5219] IS NULL) order by [5219]" rows1, err = conn.Query(selSql) + fmt.Println("selSql---------", selSql) if err != nil { logs.Info("get_cmr_record_data Query Error", err.Error()) return } var old_s1, old_s2, old_s3, old_s4 float32 + mudDateMap := make(map[string]bool) // 泥浆数据不同日期 + mudCountMap := make(map[string]int) // 泥浆数据每个日期已有数量 + mudTimeMap := make(map[string][]string) // 泥浆数据每个日期已有的时间点 + for rows1.Next() { var v Cmr_input_record var s1, s2, s3, s4 float32 - if err := rows1.Scan(&s1, &s2, &s3, &s4, &v.Time); err == nil { + var originalTime string + if err := rows1.Scan(&s1, &s2, &s3, &s4, &originalTime); err == nil { + v.Time = originalTime + + // 记录原始时间用于统计 + if len(v.Time) >= 19 { + originalTimeForStat := v.Time + v.Time = v.Time[:10] + " " + v.Time[11:19] + v.Time = do_time_by_ps(v.Time, ps_info) + + // 统计日期 + if len(v.Time) >= 10 { + dateOnly := v.Time[:10] + mudDateMap[dateOnly] = true + // 记录原始时间点 + if len(originalTimeForStat) >= 19 { + timeOnly := originalTimeForStat[11:19] + mudTimeMap[dateOnly] = append(mudTimeMap[dateOnly], timeOnly) + } + } + } if s1 < 0.001 && s2 < 0.001 && s3 < 0.001 && s4 < 0.001 { continue @@ -15319,16 +16893,18 @@ func get_cmr_record_data(user string, wellname string) (resp []Cmr_input_record) continue } - if len(v.Time) >= 19 { - v.Time = v.Time[:10] + " " + v.Time[11:19] - v.Time = do_time_by_ps(v.Time, ps_info) - } v.Context = fmt.Sprintf(`%s 泥浆密度: %sg/cm^3 泥浆粘度: %ss 排量: %sL/s 泥浆含沙量: %s%%`, v.Time, fmt.Sprintf("%.02f", s1), fmt.Sprintf("%.02f", s2), fmt.Sprintf("%.02f", s3), fmt.Sprintf("%.02f", s4)) resp = append(resp, v) + // 统计数量 + if len(v.Time) >= 10 { + dateOnly := v.Time[:10] + mudCountMap[dateOnly]++ + } + old_s1 = s1 old_s2 = s2 old_s3 = s3 @@ -15339,10 +16915,212 @@ func get_cmr_record_data(user string, wellname string) (resp []Cmr_input_record) } rows1.Close() + // 打印泥浆数据统计 + fmt.Println("\n========== 泥浆数据 ==========") + fmt.Printf("泥浆数据共有 %d 天的数据\n", len(mudDateMap)) + if len(mudDateMap) > 0 { + fmt.Println("泥浆数据日期列表及数据条数:") + dates := make([]string, 0, len(mudDateMap)) + for date := range mudDateMap { + dates = append(dates, date) + } + sort.Strings(dates) + for _, date := range dates { + fmt.Printf("%s: %d 条\n", date, mudCountMap[date]) + } + } + + // 补充泥浆数据 + fmt.Println("\n检查泥浆数据条数少于2的日期并补充...") + needMudDates := make([]string, 0) + for date := range mudDateMap { + if mudCountMap[date] < 2 { + needMudDates = append(needMudDates, date) + } + } + if len(needMudDates) > 0 { + fmt.Printf("泥浆数据发现 %d 个日期少于2条\n", len(needMudDates)) + sort.Strings(needMudDates) + for _, supplementDate := range needMudDates { + currentCount := mudCountMap[supplementDate] + if currentCount == 0 { + fmt.Printf("日期 %s 有0条,补充最早和最晚各1条\n", supplementDate) + start := supplementDate + " 00:00:00" + end := supplementDate + " 23:59:59" + + // 最早一条 + sqlEarliest := fmt.Sprintf(` + SELECT TOP 1 [5209],[5210],[5211],[5212],[5219] + FROM [EQUIPMENTRECORDS] + WHERE [5219] BETWEEN '%s' AND '%s' AND NOT ([5210] IS NULL AND [5211] IS NULL AND [5212] IS NULL AND [5219] IS NULL) + ORDER BY [5219] ASC`, start, end) + rowsE, err := conn.Query(sqlEarliest) + if err == nil { + for rowsE.Next() { + var v Cmr_input_record + var s1, s2, s3, s4 float32 + var ot string + if err := rowsE.Scan(&s1, &s2, &s3, &s4, &ot); err == nil { + v.Time = ot + if len(v.Time) >= 19 { + v.Time = v.Time[:10] + " " + v.Time[11:19] + v.Time = do_time_by_ps(v.Time, ps_info) + } + v.Context = fmt.Sprintf(`%s 泥浆密度: %sg/cm^3 泥浆粘度: %ss 排量: %sL/s 泥浆含沙量: %s%%`, + v.Time, fmt.Sprintf("%.02f", s1), fmt.Sprintf("%.02f", s2), + fmt.Sprintf("%.02f", s3), fmt.Sprintf("%.02f", s4)) + // 去重检查 + dup := false + for _, item := range resp { + if item.Time == v.Time && item.Context == v.Context { + dup = true + break + } + } + if !dup && !(s1 < 0.001 && s2 < 0.001 && s3 < 0.001 && s4 < 0.001) { + resp = append(resp, v) + fmt.Printf(" 已添加最早: %s\n", v.Time) + } + } + } + rowsE.Close() + } + + // 最晚一条 + sqlLatest := fmt.Sprintf(` + SELECT TOP 1 [5209],[5210],[5211],[5212],[5219] + FROM [EQUIPMENTRECORDS] + WHERE [5219] BETWEEN '%s' AND '%s' AND NOT ([5210] IS NULL AND [5211] IS NULL AND [5212] IS NULL AND [5219] IS NULL) + ORDER BY [5219] DESC`, start, end) + rowsL, err := conn.Query(sqlLatest) + if err == nil { + for rowsL.Next() { + var v Cmr_input_record + var s1, s2, s3, s4 float32 + var ot string + if err := rowsL.Scan(&s1, &s2, &s3, &s4, &ot); err == nil { + v.Time = ot + if len(v.Time) >= 19 { + v.Time = v.Time[:10] + " " + v.Time[11:19] + v.Time = do_time_by_ps(v.Time, ps_info) + } + v.Context = fmt.Sprintf(`%s 泥浆密度: %sg/cm^3 泥浆粘度: %ss 排量: %sL/s 泥浆含沙量: %s%%`, + v.Time, fmt.Sprintf("%.02f", s1), fmt.Sprintf("%.02f", s2), + fmt.Sprintf("%.02f", s3), fmt.Sprintf("%.02f", s4)) + dup := false + for _, item := range resp { + if item.Time == v.Time && item.Context == v.Context { + dup = true + break + } + } + if !dup && !(s1 < 0.001 && s2 < 0.001 && s3 < 0.001 && s4 < 0.001) { + resp = append(resp, v) + fmt.Printf(" 已添加最晚: %s\n", v.Time) + } + } + } + rowsL.Close() + } + } else if currentCount == 1 { + fmt.Printf("日期 %s 有1条,根据时间判断补充...\n", supplementDate) + // 获取已有时间点 + times := mudTimeMap[supplementDate] + if len(times) > 0 { + timeStr := times[0] // "HH:MM:SS" + parts := strings.Split(timeStr, ":") + if len(parts) == 3 { + hour, _ := strconv.Atoi(parts[0]) + start := supplementDate + " 00:00:00" + end := supplementDate + " 23:59:59" + + if hour < 12 { + // 补充最晚 + sqlLatest := fmt.Sprintf(` + SELECT TOP 1 [5209],[5210],[5211],[5212],[5219] + FROM [EQUIPMENTRECORDS] + WHERE [5219] BETWEEN '%s' AND '%s' AND NOT ([5210] IS NULL AND [5211] IS NULL AND [5212] IS NULL AND [5219] IS NULL) + ORDER BY [5219] DESC`, start, end) + rowsL, err := conn.Query(sqlLatest) + if err == nil { + for rowsL.Next() { + var v Cmr_input_record + var s1, s2, s3, s4 float32 + var ot string + if err := rowsL.Scan(&s1, &s2, &s3, &s4, &ot); err == nil { + v.Time = ot + if len(v.Time) >= 19 { + v.Time = v.Time[:10] + " " + v.Time[11:19] + v.Time = do_time_by_ps(v.Time, ps_info) + } + v.Context = fmt.Sprintf(`%s 泥浆密度: %sg/cm^3 泥浆粘度: %ss 排量: %sL/s 泥浆含沙量: %s%%`, + v.Time, fmt.Sprintf("%.02f", s1), fmt.Sprintf("%.02f", s2), + fmt.Sprintf("%.02f", s3), fmt.Sprintf("%.02f", s4)) + dup := false + for _, item := range resp { + if item.Time == v.Time && item.Context == v.Context { + dup = true + break + } + } + if !dup && !(s1 < 0.001 && s2 < 0.001 && s3 < 0.001 && s4 < 0.001) { + resp = append(resp, v) + fmt.Printf(" 已添加最晚: %s\n", v.Time) + } + } + } + rowsL.Close() + } + } else { + // 补充最早 + sqlEarliest := fmt.Sprintf(` + SELECT TOP 1 [5209],[5210],[5211],[5212],[5219] + FROM [EQUIPMENTRECORDS] + WHERE [5219] BETWEEN '%s' AND '%s' AND NOT ([5210] IS NULL AND [5211] IS NULL AND [5212] IS NULL AND [5219] IS NULL) + ORDER BY [5219] ASC`, start, end) + rowsE, err := conn.Query(sqlEarliest) + if err == nil { + for rowsE.Next() { + var v Cmr_input_record + var s1, s2, s3, s4 float32 + var ot string + if err := rowsE.Scan(&s1, &s2, &s3, &s4, &ot); err == nil { + v.Time = ot + if len(v.Time) >= 19 { + v.Time = v.Time[:10] + " " + v.Time[11:19] + v.Time = do_time_by_ps(v.Time, ps_info) + } + v.Context = fmt.Sprintf(`%s 泥浆密度: %sg/cm^3 泥浆粘度: %ss 排量: %sL/s 泥浆含沙量: %s%%`, + v.Time, fmt.Sprintf("%.02f", s1), fmt.Sprintf("%.02f", s2), + fmt.Sprintf("%.02f", s3), fmt.Sprintf("%.02f", s4)) + dup := false + for _, item := range resp { + if item.Time == v.Time && item.Context == v.Context { + dup = true + break + } + } + if !dup && !(s1 < 0.001 && s2 < 0.001 && s3 < 0.001 && s4 < 0.001) { + resp = append(resp, v) + fmt.Printf(" 已添加最早: %s\n", v.Time) + } + } + } + rowsE.Close() + } + } + } + } + } + } + } + + // 最后统一按时间倒序排序 sort.Slice(resp, func(i, j int) bool { return resp[i].Time > resp[j].Time }) + fmt.Printf("\n所有数据处理完成,最终共有 %d 条数据记录\n", len(resp)) return } @@ -15383,7 +17161,7 @@ func get_cmr_record(response http.ResponseWriter, request *http.Request) { data := get_cmr_record_data(req.OpUser, req.Wellname) for i := 0; i < len(data); i++ { data[i].Context = strings.ReplaceAll(data[i].Context, "%", "%%") - //fmt.Println(data[i].Context) + // fmt.Println(data[i].Context) } var resp get_cmr_record_resp resp.Data = append(resp.Data, data...) @@ -19204,9 +20982,9 @@ func getLcmDevice(response http.ResponseWriter, request *http.Request) { } if ifWhere { - selSql = fmt.Sprintf("select top %d [ID],[sid],[iid],[ver],[op_user],[op_time],[if_warning] from [life_cycle_manager_device] where ID not in (select top %d ID from [life_cycle_manager_device] where %s order by op_time desc) and %s order by op_time desc", req.Count, (req.Index-1)*req.Count, whereSql, whereSql) + selSql = fmt.Sprintf("select top %d [ID],[sid],[iid],[ver],[op_user],[op_time],COALESCE([if_warning],'') from [life_cycle_manager_device] where ID not in (select top %d ID from [life_cycle_manager_device] where %s order by op_time desc) and %s order by op_time desc", req.Count, (req.Index-1)*req.Count, whereSql, whereSql) } else { - selSql = fmt.Sprintf("select top %d [ID],[sid],[iid],[ver],[op_user],[op_time],[if_warning] from [life_cycle_manager_device] where ID not in (select top %d ID from [life_cycle_manager_device] order by op_time desc) order by op_time desc", req.Count, (req.Index-1)*req.Count) + selSql = fmt.Sprintf("select top %d [ID],[sid],[iid],[ver],[op_user],[op_time],COALESCE([if_warning],'') from [life_cycle_manager_device] where ID not in (select top %d ID from [life_cycle_manager_device] order by op_time desc) order by op_time desc", req.Count, (req.Index-1)*req.Count) } fmt.Println(selSql) rows, err := sqlConn.Query(selSql) @@ -21458,7 +23236,7 @@ func getWellEx1_en(response http.ResponseWriter, request *http.Request) { selSql = fmt.Sprintf(` SELECT [ID],[WELLNameSource],[stats],[CreateTableTime], COALESCE([Operator],''),[rt_flag], - COALESCE([ClOUDACCOUNT],''),[tool_status_warning] + COALESCE([ClOUDACCOUNT],''),ISNULL([tool_status_warning], 1) AS [tool_status_warning] FROM [WellInformation] WHERE %s ORDER BY [CreateTableTime] DESC, [tool_status_warning] DESC @@ -21468,7 +23246,7 @@ func getWellEx1_en(response http.ResponseWriter, request *http.Request) { selSql = fmt.Sprintf(` SELECT [ID],[WELLNameSource],[stats],[CreateTableTime], COALESCE([Operator],''),[rt_flag], - COALESCE([ClOUDACCOUNT],''),[tool_status_warning] + COALESCE([ClOUDACCOUNT],''),ISNULL([tool_status_warning], 1) AS [tool_status_warning] FROM [WellInformation] ORDER BY [CreateTableTime] DESC, [tool_status_warning] DESC OFFSET %d ROWS FETCH NEXT %d ROWS ONLY`, @@ -21486,6 +23264,7 @@ func getWellEx1_en(response http.ResponseWriter, request *http.Request) { logs.Error("getWellEx1_en count Query Error", err.Error()) return } + fmt.Println("selSql-------", selSql) row, err := sqlConn.Query(selSql) if err != nil { @@ -21500,9 +23279,9 @@ func getWellEx1_en(response http.ResponseWriter, request *http.Request) { var id int var wellstate int var rt_falg int + var tsw int if err := row.Scan(&id, &d.WellNameSource, &wellstate, &d.Welltime, &d.Welloperator, - &rt_falg); err == nil { - + &rt_falg, &d.Upload_user, &tsw); err == nil { if len(d.Welltime) >= 19 { d.Welltime = d.Welltime[:10] + " " + d.Welltime[11:19] d.Welltime = do_time_by_ps(d.Welltime, ps_info) @@ -21602,9 +23381,9 @@ func getWellEx1(response http.ResponseWriter, request *http.Request) { } if ifWhere { - selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[rt_flag],COALESCE([ClOUDACCOUNT],''),[tool_status_warning] from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] where %s order by [CreateTableTime] desc) and %s order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count, whereSql, whereSql) + selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[rt_flag],COALESCE([ClOUDACCOUNT],''),ISNULL([tool_status_warning], 1) AS [tool_status_warning] from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] where %s order by [CreateTableTime] desc) and %s order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count, whereSql, whereSql) } else { - selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[rt_flag],COALESCE([ClOUDACCOUNT],''),[tool_status_warning] from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] order by [CreateTableTime] desc) order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count) + selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[rt_flag],COALESCE([ClOUDACCOUNT],''),ISNULL([tool_status_warning], 1) AS [tool_status_warning] from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] order by [CreateTableTime] desc) order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count) } if ifWhere { @@ -21618,7 +23397,7 @@ func getWellEx1(response http.ResponseWriter, request *http.Request) { logs.Error("getWellEx1 count Query Error", err.Error()) return } - + fmt.Println("selSql-------", selSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Error("getWellEx1 Query Error", err.Error()) @@ -21747,9 +23526,9 @@ func get_well_tool(response http.ResponseWriter, request *http.Request) { ifWhere = true if ifWhere { - selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[rt_flag],COALESCE([ClOUDACCOUNT],''),[tool_status_warning] from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] where %s order by [CreateTableTime] desc) and %s order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count, whereSql, whereSql) + selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[rt_flag],COALESCE([ClOUDACCOUNT],''),COALESCE([tool_status_warning], 0) from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] where %s order by [CreateTableTime] desc) and %s order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count, whereSql, whereSql) } else { - selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[rt_flag],COALESCE([ClOUDACCOUNT],''),[tool_status_warning] from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] order by [CreateTableTime] desc) order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count) + selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[rt_flag],COALESCE([ClOUDACCOUNT],''),COALESCE([tool_status_warning], 0) from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] order by [CreateTableTime] desc) order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count) } if ifWhere { @@ -22156,9 +23935,9 @@ func get_well_cmp_en(response http.ResponseWriter, request *http.Request) { ifWhere = true if ifWhere { - selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[rt_flag] from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] where %s order by [CreateTableTime] desc) and %s order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count, whereSql, whereSql) + selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[rt_flag],COALESCE([ClOUDACCOUNT],''),[tool_status_warning] from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] where %s order by [CreateTableTime] desc) and %s order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count, whereSql, whereSql) } else { - selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[rt_flag] from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] order by [CreateTableTime] desc) order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count) + selSql = fmt.Sprintf("select top %d [ID],[WELLNameSource],[stats],[CreateTableTime],COALESCE([Operator],''),[rt_flag],COALESCE([ClOUDACCOUNT],''),[tool_status_warning] from [WellInformation] where [ID] not in (select top %d [ID] from [WellInformation] order by [CreateTableTime] desc) order by [CreateTableTime] desc", req.Count, (req.Index-1)*req.Count) } if ifWhere { @@ -22182,12 +23961,14 @@ func get_well_cmp_en(response http.ResponseWriter, request *http.Request) { var resp GetWellExResp for row.Next() { + var d wellExData var id int var wellstate int - var rt_falg int + var rt_flag int + var tsw int if err := row.Scan(&id, &d.WellNameSource, &wellstate, &d.Welltime, &d.Welloperator, - &rt_falg); err == nil { + &rt_flag, &d.Upload_user, &tsw); err == nil { if len(d.Welltime) >= 19 { d.Welltime = d.Welltime[:10] + " " + d.Welltime[11:19] @@ -22200,7 +23981,7 @@ func get_well_cmp_en(response http.ResponseWriter, request *http.Request) { } d.Welloperator = strings.Trim(d.Welloperator, " ") - if rt_falg == 1 { + if rt_flag == 1 { d.Rt_flag = true } @@ -22311,7 +24092,7 @@ func get_well_cmp(response http.ResponseWriter, request *http.Request) { logs.Error("getWellEx1 count Query Error", err.Error()) return } - + fmt.Println("selSql-------", selSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Error("getWellEx1 Query Error", err.Error()) @@ -26147,7 +27928,7 @@ func getMss_en(response http.ResponseWriter, request *http.Request) { var resp GetMssResp - var whereSql string = " where [if_available] !=1" + var whereSql string = " where [if_available] !=1 and lastVer is not null and lastVer != '' " if req.WellName != "" { whereSql += " and wellname like '%" + req.WellName + "%'" } @@ -26191,7 +27972,7 @@ func getMss_en(response http.ResponseWriter, request *http.Request) { if whereSql != "" { selSql += whereSql } - selSql += fmt.Sprintf(` and ID not in (select top %v ID from analysis_result_mss %s %s)`, (req.Index-1)*req.Count, whereSql, orderBySql) + selSql += fmt.Sprintf(`and lastVer is not null and lastVer != '' and ID not in (select top %v ID from analysis_result_mss %s %s)`, (req.Index-1)*req.Count, whereSql, orderBySql) selSql += orderBySql fmt.Println(selSql) @@ -26265,7 +28046,7 @@ func getMss(response http.ResponseWriter, request *http.Request) { var resp GetMssResp - var whereSql string = " where [if_available] !=1" + var whereSql string = " where [if_available] !=1 and lastVer is not null and lastVer != '' " if req.WellName != "" { whereSql += " and wellname like '%" + req.WellName + "%'" } @@ -26288,30 +28069,34 @@ func getMss(response http.ResponseWriter, request *http.Request) { } selCountSql := fmt.Sprintf(`select count([ID]) from [analysis_result_mss] %s`, whereSql) + logs.Info("getMss selCountSql------- : ", selCountSql) rcnt, err := getRecordCount(sqlConn, selCountSql) + logs.Info("getMss select data : ", rcnt) if err != nil { logs.Error(fmt.Sprintf("%s err:%v", selCountSql, err.Error())) jdata, _ := json.Marshal(resp) response.Write(jdata) return } - query_cnt := req.Index * req.Count var cnt int + logs.Info("getMss query_cnt : ", query_cnt) + logs.Info("getMss rcnt : ", rcnt) if query_cnt > rcnt { cnt = rcnt + req.Count - query_cnt } else { cnt = req.Count } - + logs.Info("getMss cnt : ", cnt) orderBySql := " order by saveTime desc" selSql := fmt.Sprintf(`select top %d [ID],[wellname],[series],[instrument_id],[saveTime],[ver],[lastVer],[workTime],[totalWorkTime],[state],[repairCnt] from [analysis_result_mss]`, cnt) if whereSql != "" { selSql += whereSql } - selSql += fmt.Sprintf(` and ID not in (select top %v ID from analysis_result_mss %s %s)`, (req.Index-1)*req.Count, whereSql, orderBySql) + selSql += fmt.Sprintf(`and lastVer is not null and lastVer != '' and ID not in (select top %v ID from analysis_result_mss %s %s)`, (req.Index-1)*req.Count, whereSql, orderBySql) selSql += orderBySql + logs.Info("getMss select data : ", selSql) fmt.Println(selSql) row, err := sqlConn.Query(selSql) if err != nil { @@ -26994,7 +28779,7 @@ func getMhS(response http.ResponseWriter, request *http.Request) { logs.Info("查询数据库状态失败:", err.Error()) } else { fmt.Printf("数据库 %s 当前状态: %s\n", db, status) - + logs.Info("数据库 %s 当前状态: %s\n", db, status) // 如果是离线状态,设置为在线 if status == "OFFLINE" { fmt.Printf("数据库 %s 是离线状态,设置为在线\n", db) @@ -27418,7 +29203,7 @@ func getMh(response http.ResponseWriter, request *http.Request) { endIndex := req.Count * req.Index selSql := fmt.Sprintf("select [wellname],[wellCreateTime],[welloper],[state],[wellBeginTime],[wellEndTime],[wellWorkTime] from [analysis_result_mh] %s", whereSql) - //fmt.Println(selSql) + fmt.Println("getMh--sql---", selSql) row, err := sqlConn.Query(selSql) if err != nil { logs.Error("getMh query:", selSql, " err:", err.Error()) @@ -28671,9 +30456,9 @@ func getAuth(response http.ResponseWriter, request *http.Request) { } if !ifWhere { - sql = fmt.Sprintf("select top %v [ID],[6500],[6501],[6502],[6503],[6504],[6505],[6506],[6507],[6508],[6509],[6510],[6511],[6512] from AUTHINFO where ID not in (select top %v ID from AUTHINFO order by [6502] desc) order by [6502] desc", req.Count, (req.Index-1)*req.Count) + sql = fmt.Sprintf("select top %v [ID],[6500],[6501],[6502],[6503],[6504],[6505],[6506],[6507],[6508],[6509],[6510],ISNULL([6511],'') as [6511],ISNULL([6512],'') as [6512] from AUTHINFO where ID not in (select top %v ID from AUTHINFO order by [6502] desc) order by [6502] desc", req.Count, (req.Index-1)*req.Count) } else { - sql = fmt.Sprintf("select top %v [ID],[6500],[6501],[6502],[6503],[6504],[6505],[6506],[6507],[6508],[6509],[6510],[6511],[6512] from AUTHINFO where %s and ID not in (select top %v ID from AUTHINFO where %s order by [6502] desc) order by [6502] desc", req.Count, sqlCntWhere, (req.Index-1)*req.Count, sqlCntWhere) + sql = fmt.Sprintf("select top %v [ID],[6500],[6501],[6502],[6503],[6504],[6505],[6506],[6507],[6508],[6509],[6510],ISNULL([6511],'') as [6511],ISNULL([6512],'') as [6512] from AUTHINFO where %s and ID not in (select top %v ID from AUTHINFO where %s order by [6502] desc) order by [6502] desc", req.Count, sqlCntWhere, (req.Index-1)*req.Count, sqlCntWhere) } fmt.Println(sql)