bsj vor 3 Jahren
Ursprung
Commit
a7b548385a
12 geänderte Dateien mit 1814 neuen und 328 gelöschten Zeilen
  1. 6 6
      conf/app.ini
  2. BIN
      crm.exe
  3. 0 20
      go.mod
  4. 0 117
      go.sum
  5. 12 13
      main.go
  6. 24 24
      pkg/util/workwechat.go
  7. 105 119
      routers/api/db.go
  8. 1562 0
      routers/api/sunshine.go
  9. 26 16
      routers/restful/sql_utils.go
  10. 21 10
      routers/router.go
  11. 5 3
      test/main.go
  12. 53 0
      utils/utils.go

+ 6 - 6
conf/app.ini

@@ -65,17 +65,17 @@ User = root
 #Password = root
 #Host = 127.0.0.1:3326
 #Host = 210.16.186.252:3326
-#Password = root
-#Host = 192.168.1.50:3326
-
+Password = root
+Host = 192.168.1.50:3326
+# Host = 192.168.1.8:3326
 #####本地
-Password = kepaiteng!QAZ
+# Password = kepaiteng!QAZ
 #Password = keep
-Host = 222.73.129.15:31306
+# Host = 222.73.129.15:31306
 #Host = 127.0.0.1:3306
 #Host = 210.16.186.252
 #Name = equipment
-Name = eqdev
+Name = zp30o1_db
 #Name = crm
 #Name = eq0422
 #Name = eq

BIN
crm.exe


+ 0 - 20
go.mod

@@ -1,20 +0,0 @@
-module github.com/kptyun/go-admin
-
-go 1.12
-
-require (
-	github.com/Anderson-Lu/gofasion v0.0.0-20190311020154-5db4d09c9cb8
-	github.com/Unknwon/com v0.0.0-20190214221849-2d12a219ccaf
-	github.com/astaxie/beego v1.11.1
-	github.com/casbin/casbin v1.8.1
-	github.com/dgrijalva/jwt-go v3.2.0+incompatible
-	github.com/facebookgo/inject v0.0.0-20180706035515-f23751cae28b
-	github.com/facebookgo/structtag v0.0.0-20150214074306-217e25fb9691 // indirect
-	github.com/gin-gonic/gin v1.3.0
-	github.com/go-ini/ini v1.42.0
-	github.com/go-sql-driver/mysql v1.4.1
-	github.com/jinzhu/gorm v1.9.2
-	github.com/jinzhu/inflection v0.0.0-20180308033659-04140366298a // indirect
-	github.com/swaggo/gin-swagger v1.1.0
-	github.com/swaggo/swag v1.4.1
-)

+ 0 - 117
go.sum

@@ -1,117 +0,0 @@
-github.com/Anderson-Lu/gofasion v0.0.0-20190311020154-5db4d09c9cb8 h1:APdOdz4xKtWkdpF9u2W2sVeGnjfOu78b/4PpgGo1Vvo=
-github.com/Anderson-Lu/gofasion v0.0.0-20190311020154-5db4d09c9cb8/go.mod h1:nJfnu9e1b/lczgULa3laeoUzeadR3ylEgYj8zpXO+Wc=
-github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
-github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible h1:1G1pk05UrOh0NlF1oeaaix1x8XzrfjIDK47TY0Zehcw=
-github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
-github.com/PuerkitoBio/purell v1.1.0 h1:rmGxhojJlM0tuKtfdvliR84CFHljx9ag64t2xmVkjK4=
-github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
-github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
-github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
-github.com/Unknwon/com v0.0.0-20190214221849-2d12a219ccaf h1:g3hliyjkDSCLzNlOEc6Bd1dngsiIwPb9LfPuYUv+F+Y=
-github.com/Unknwon/com v0.0.0-20190214221849-2d12a219ccaf/go.mod h1:voKvFVpXBJxdIPeqjoJuLK+UVcRlo/JLjeToGxPYu68=
-github.com/astaxie/beego v1.11.1 h1:6DESefxW5oMcRLFRKi53/6exzup/IR6N4EzzS1n6CnQ=
-github.com/astaxie/beego v1.11.1/go.mod h1:i69hVzgauOPSw5qeyF4GVZhn7Od0yG5bbCGzmhbWxgQ=
-github.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd/go.mod h1:1b+Y/CofkYwXMUU0OhQqGvsY2Bvgr4j6jfT699wyZKQ=
-github.com/beego/x2j v0.0.0-20131220205130-a0352aadc542/go.mod h1:kSeGC/p1AbBiEp5kat81+DSQrZenVBZXklMLaELspWU=
-github.com/belogik/goes v0.0.0-20151229125003-e54d722c3aff/go.mod h1:PhH1ZhyCzHKt4uAasyx+ljRCgoezetRNf59CUtwUkqY=
-github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60=
-github.com/casbin/casbin v1.7.0/go.mod h1:c67qKN6Oum3UF5Q1+BByfFxkwKvhwW57ITjqwtzR1KE=
-github.com/casbin/casbin v1.8.1 h1:BVvL6H0nc+1y68nwIe8ZxwMIOEVUgg9y00yeD3GTDCc=
-github.com/casbin/casbin v1.8.1/go.mod h1:z8uPsfBJGUsnkagrt3G8QvjgTKFMBJ32UP8HpZllfog=
-github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80=
-github.com/couchbase/go-couchbase v0.0.0-20181122212707-3e9b6e1258bb/go.mod h1:TWI8EKQMs5u5jLKW/tsb9VwauIrMIxQG1r5fMsswK5U=
-github.com/couchbase/gomemcached v0.0.0-20181122193126-5125a94a666c/go.mod h1:srVSlQLB8iXBVXHgnqemxUXqN6FCvClgCMPCsjBDR7c=
-github.com/couchbase/goutils v0.0.0-20180530154633-e865a1461c8a/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs=
-github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76/go.mod h1:vYwsqCOLxGiisLwp9rITslkFNpZD5rz43tf41QFkTWY=
-github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
-github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
-github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
-github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4=
-github.com/facebookgo/inject v0.0.0-20180706035515-f23751cae28b h1:V6c4/dSTNhSaNn4c5ulbakfv277qCvs7byFYv7P83iQ=
-github.com/facebookgo/inject v0.0.0-20180706035515-f23751cae28b/go.mod h1:oO8UHw+fDHjDsk4CTy/E96WDzFUYozAtBAaGNoVL0+c=
-github.com/facebookgo/structtag v0.0.0-20150214074306-217e25fb9691 h1:KnnwHN59Jxec0htA2pe/i0/WI9vxXLQifdhBrP3lqcQ=
-github.com/facebookgo/structtag v0.0.0-20150214074306-217e25fb9691/go.mod h1:sKLL1iua/0etWfo/nPCmyz+v2XDMXy+Ho53W7RAuZNY=
-github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-github.com/gin-contrib/sse v0.0.0-20170109093832-22d885f9ecc7 h1:AzN37oI0cOS+cougNAV9szl6CVoj2RYwzS3DpUQNtlY=
-github.com/gin-contrib/sse v0.0.0-20170109093832-22d885f9ecc7/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s=
-github.com/gin-gonic/gin v1.3.0 h1:kCmZyPklC0gVdL728E6Aj20uYBJV93nj/TkwBTKhFbs=
-github.com/gin-gonic/gin v1.3.0/go.mod h1:7cKuhb5qV2ggCFctp2fJQ+ErvciLZrIeoOSOm6mUr7Y=
-github.com/go-ini/ini v1.42.0 h1:TWr1wGj35+UiWHlBA8er89seFXxzwFn11spilrrj+38=
-github.com/go-ini/ini v1.42.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
-github.com/go-openapi/jsonpointer v0.17.0 h1:nH6xp8XdXHx8dqveo0ZuJBluCO2qGrPbDNZ0dwoRHP0=
-github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
-github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
-github.com/go-openapi/jsonreference v0.18.0 h1:oP2OUNdG1l2r5kYhrfVMXO54gWmzcfAwP/GFuHpNTkE=
-github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
-github.com/go-openapi/spec v0.18.0 h1:aIjeyG5mo5/FrvDkpKKEGZPmF9MPHahS72mzfVqeQXQ=
-github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
-github.com/go-openapi/swag v0.17.0 h1:iqrgMg7Q7SvtbWLlltPrkMs0UBJI6oTSs79JFRUi880=
-github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
-github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
-github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA=
-github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
-github.com/gogf/gf v1.5.18 h1:WnHoGNnmYMvlYtBHmxOTqjyOghkgSp+fk1EMEpQY80w=
-github.com/gogf/gf v1.5.18/go.mod h1:witsoQr7PSjWHK2T1lOa1EKSFIs31QF0T8/+ITaJoho=
-github.com/gogf/gf v1.5.23 h1:LE3kTI2YdCvSIYkP2pYAItRwOJbFa0NKQ/HyYccvSs0=
-github.com/gogf/gf v1.5.23/go.mod h1:witsoQr7PSjWHK2T1lOa1EKSFIs31QF0T8/+ITaJoho=
-github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
-github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
-github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
-github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
-github.com/jinzhu/gorm v1.9.2 h1:lCvgEaqe/HVE+tjAR2mt4HbbHAZsQOv3XAZiEZV37iw=
-github.com/jinzhu/gorm v1.9.2/go.mod h1:Vla75njaFJ8clLU1W44h34PjIkijhjHIYnZxMqCdxqo=
-github.com/jinzhu/inflection v0.0.0-20180308033659-04140366298a h1:eeaG9XMUvRBYXJi4pg1ZKM7nxc5AfXfojeLLW7O5J3k=
-github.com/jinzhu/inflection v0.0.0-20180308033659-04140366298a/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
-github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
-github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
-github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329 h1:2gxZ0XQIU/5z3Z3bUBu+FXuk2pFbkN6tcwi/pjyaDic=
-github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
-github.com/mattn/go-isatty v0.0.4 h1:bnP0vzxcAdeI1zdubAl5PjU6zsERjGZb7raWodagDYs=
-github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
-github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
-github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
-github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
-github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
-github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw=
-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/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
-github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s=
-github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE=
-github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
-github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
-github.com/swaggo/gin-swagger v1.0.0/go.mod h1:Mt37wE46iUaTAOv+HSnHbJYssKGqbS25X19lNF4YpBo=
-github.com/swaggo/gin-swagger v1.1.0 h1:ZI6/82S07DkkrMfGKbJhKj1R+QNTICkeAJP06pU36pU=
-github.com/swaggo/gin-swagger v1.1.0/go.mod h1:FQlm07YuT1glfN3hQiO11UQ2m39vOCZ/aa3WWr5E+XU=
-github.com/swaggo/swag v1.4.0/go.mod h1:hog2WgeMOrQ/LvQ+o1YGTeT+vWVrbi0SiIslBtxKTyM=
-github.com/swaggo/swag v1.4.1 h1:h/+2F8r3Q4ZC/47O7K+X3J1cKGnkhBj88zEQuHl5KO8=
-github.com/swaggo/swag v1.4.1/go.mod h1:E+4OXevRqOkzkw4fQQeDK9SWTHnnq7ymbDA2IbJJTwg=
-github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
-github.com/ugorji/go/codec v0.0.0-20181209151446-772ced7fd4c2 h1:EICbibRW4JNKMcY+LsWmuwob+CRS1BmdRdjphAm9mH4=
-github.com/ugorji/go/codec v0.0.0-20181209151446-772ced7fd4c2/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
-github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
-github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc=
-golang.org/x/crypto v0.0.0-20181127143415-eb0de9b17e85/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e h1:bRhVy7zSSasaqNksaRZiA5EEI+Ei4I1nO5Jh72wfHlg=
-golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
-golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/tools v0.0.0-20190110015856-aa033095749b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190114222345-bf090417da8b h1:qMK98NmNCRVDIYFycQ5yVRkvgDUFfdP8Ip4KqmDEB7g=
-golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/go-playground/validator.v8 v8.18.2 h1:lFB4DoMU6B626w8ny76MV7VX6W2VHct2GVOI3xgiMrQ=
-gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y=
-gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
-gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=

+ 12 - 13
main.go

@@ -1,6 +1,12 @@
 package main
 
 import (
+	"fmt"
+	"log"
+	"net/http"
+	"os"
+	"strings"
+
 	"./comm"
 	"./mdns"
 	"./models"
@@ -8,12 +14,7 @@ import (
 	"./pkg/setting"
 	"./pkg/util"
 	"./routers"
-	"fmt"
 	"github.com/kardianos/service"
-	"log"
-	"net/http"
-	"os"
-	"strings"
 	//"unsafe"
 )
 
@@ -35,14 +36,14 @@ func main() {
 	logging.Setup()
 
 	svcConfig := &service.Config{
-		Name:        setting.ServerSetting.ServerName, //服务显示名称
-		DisplayName:  setting.ServerSetting.DisplayName, //服务名称
-		Description:  setting.ServerSetting.Description, //服务描述
+		Name:        setting.ServerSetting.ServerName,  //服务显示名称
+		DisplayName: setting.ServerSetting.DisplayName, //服务名称
+		Description: setting.ServerSetting.Description, //服务描述
 	}
 	prg := &program{}
 	s, err := service.New(prg, svcConfig)
 	if err != nil {
-		fmt.Println(err, "service.New() err",err)
+		fmt.Println(err, "service.New() err", err)
 	}
 
 	if len(os.Args) > 1 {
@@ -67,11 +68,10 @@ func main() {
 	}
 	_ = s.Run()
 
-
 }
 
-
 type program struct{}
+
 func (p *program) Start(s service.Service) error {
 	go p.run()
 	return nil
@@ -91,7 +91,7 @@ func (p *program) run() {
 	// 系统定时任务
 	util.CronServer()
 	// 现代牧业eas 系统对接初始化
-	util.InitWebS(setting.ServerSetting.EasName,setting.ServerSetting.EasPassword,setting.ServerSetting.EasUrl)
+	util.InitWebS(setting.ServerSetting.EasName, setting.ServerSetting.EasPassword, setting.ServerSetting.EasUrl)
 
 	routersInit := routers.InitRouter()
 	readTimeout := setting.ServerSetting.ReadTimeout
@@ -129,7 +129,6 @@ func (p *program) run() {
 
 }
 
-
 func (p *program) Stop(s service.Service) error {
 	fmt.Println("程序被关闭")
 	return nil

+ 24 - 24
pkg/util/workwechat.go

@@ -1,13 +1,13 @@
 package util
 
-
 import (
-"bytes"
-"github.com/json-iterator/go"
-"io/ioutil"
-"net/http"
-"os"
-"strings"
+	"bytes"
+	"io/ioutil"
+	"net/http"
+	"os"
+	"strings"
+
+	jsoniter "github.com/json-iterator/go"
 )
 
 var json = jsoniter.ConfigCompatibleWithStandardLibrary
@@ -17,18 +17,18 @@ type JSON struct {
 }
 
 type MESSAGES struct {
-	Touser string `json:"touser"`
+	Touser  string `json:"touser"`
 	Toparty string `json:"toparty"`
 	Msgtype string `json:"msgtype"`
-	Agentid int `json:"agentid"`
-	Text struct {
+	Agentid int    `json:"agentid"`
+	Text    struct {
 		//Subject string `json:"subject"`
 		Content string `json:"content"`
 	} `json:"text"`
 	Safe int `json:"safe"`
 }
 
-func Get_AccessToken(corpid,corpsecret string) string {
+func Get_AccessToken(corpid, corpsecret string) string {
 	gettoken_url := "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + corpid + "&corpsecret=" + corpsecret
 	//print(gettoken_url)
 	client := &http.Client{}
@@ -42,13 +42,13 @@ func Get_AccessToken(corpid,corpsecret string) string {
 	return json_str.Access_token
 }
 
-func Send_Message(access_token,msg string) {
+func Send_Message(access_token, msg string) {
 	send_url := "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + access_token
 	//print(send_url)
 	client := &http.Client{}
 	req, _ := http.NewRequest("POST", send_url, bytes.NewBuffer([]byte(msg)))
 	req.Header.Set("Content-Type", "application/json")
-	req.Header.Set("charset","UTF-8")
+	req.Header.Set("charset", "UTF-8")
 	resp, err := client.Do(req)
 	if err != nil {
 		panic(err)
@@ -59,13 +59,13 @@ func Send_Message(access_token,msg string) {
 	//fmt.Println("response Body:", string(body))
 }
 
-func messages(touser string,toparty string,agentid int,content string) string{
+func messages(touser string, toparty string, agentid int, content string) string {
 	msg := MESSAGES{
-		Touser: touser,
+		Touser:  touser,
 		Toparty: toparty,
 		Msgtype: "text",
 		Agentid: agentid,
-		Safe: 0,
+		Safe:    0,
 		Text: struct {
 			//Subject string `json:"subject"`
 			Content string `json:"content"`
@@ -77,18 +77,18 @@ func messages(touser string,toparty string,agentid int,content string) string{
 }
 
 func main() {
-	touser := "BigBoss"  //企业号中的用户帐号,在zabbix用户Media中配置,如果配置不正常,将按部门发送。
-	toparty := "2"       //企业号中的部门id。
-	agentid:= 1000002    //企业号中的应用id。
-	corpid := "xxxxxxxxxxxxxxxxx"  //企业号的标识
-	corpsecret := "exxxxxxxxxxxxxxxxxxxxxxxxxxxxx"  ///企业号中的应用的Secret
-	accessToken := Get_AccessToken(corpid,corpsecret)
+	touser := "BigBoss"                            //企业号中的用户帐号,在zabbix用户Media中配置,如果配置不正常,将按部门发送。
+	toparty := "2"                                 //企业号中的部门id。
+	agentid := 1000002                             //企业号中的应用id。
+	corpid := "xxxxxxxxxxxxxxxxx"                  //企业号的标识
+	corpsecret := "exxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ///企业号中的应用的Secret
+	accessToken := Get_AccessToken(corpid, corpsecret)
 	content := os.Args[1]
 	//  fmt.Println(content)
 	// 序列化成json之后,\n会被转义,也就是变成了\\n,使用str替换,替换掉转义
-	msg := strings.Replace(messages(touser,toparty,agentid,content),"\\\\","\\",-1)
+	msg := strings.Replace(messages(touser, toparty, agentid, content), "\\\\", "\\", -1)
 
 	//  fmt.Println(strings.Replace(msg,"\\\\","\\",-1))
-	Send_Message(accessToken,msg)
+	Send_Message(accessToken, msg)
 
 }

+ 105 - 119
routers/api/db.go

@@ -1,23 +1,10 @@
 package api
 
 import (
-	"../../models"
-	"../../pkg/app"
-	"../../pkg/e"
-	"../../pkg/logging"
-	"../../pkg/setting"
-	"../../pkg/util"
-	"../../routers/restful"
 	"database/sql"
 	"encoding/json"
 	"errors"
 	"fmt"
-	"github.com/360EntSecGroup-Skylar/excelize"
-	"github.com/Anderson-Lu/gofasion/gofasion"
-	"github.com/axetroy/go-fs"
-	"github.com/gin-gonic/gin"
-	"github.com/tealeg/xlsx"
-	"github.com/xormplus/xorm"
 	"io/ioutil"
 	"math"
 	"net/http"
@@ -27,8 +14,21 @@ import (
 	"strconv"
 	"strings"
 	"time"
-)
 
+	"../../models"
+	"../../pkg/app"
+	"../../pkg/e"
+	"../../pkg/logging"
+	"../../pkg/setting"
+	"../../pkg/util"
+	"../../routers/restful"
+	"github.com/360EntSecGroup-Skylar/excelize"
+	"github.com/Anderson-Lu/gofasion/gofasion"
+	"github.com/axetroy/go-fs"
+	"github.com/gin-gonic/gin"
+	"github.com/tealeg/xlsx"
+	"github.com/xormplus/xorm"
+)
 
 // @Summary   根据SQL执行得到数据集
 // @Tags getData
@@ -220,7 +220,7 @@ func GetDataByName(c *gin.Context) {
 
 		} else {
 			queryData, err := getDataBySqlT(sql, offset, pagecount, returntype, s_params, tx)
-			if getTotal == "total3"{
+			if getTotal == "total3" {
 				totalData := make(map[string]interface{})
 				queryData1 := queryData.(map[string]interface{})
 				totalData["total3"] = queryData1["total"]
@@ -688,7 +688,7 @@ func praseReportform(sqlnamestr string, parammaps *gofasion.Fasion) (queryData m
 		queryData, err = getpSumNow(sqlnamestr, parammaps)
 	case "getPastureSumMonth", "getPastureSumMonthWater", "getPastureSumMonthElec", "getPastureSumMonthDiesel":
 		queryData, err = getPastureSumMonth(sqlnamestr, parammaps)
-	case  "getPastureSumDayWater", "getPastureSumDayElec", "getPastureSumDayDiesel":
+	case "getPastureSumDayWater", "getPastureSumDayElec", "getPastureSumDayDiesel":
 		queryData, err = getPastureSumDay(sqlnamestr, parammaps)
 	case "getPastureSumDay":
 		queryData, err = getPastureSumDay1(sqlnamestr, parammaps)
@@ -1220,19 +1220,16 @@ func getPastureSumDay(sqlnamestr string, parammaps *gofasion.Fasion) (map[string
 
 }
 
-
-
-
 func getPastureSumDay1(sqlnamestr string, parammaps *gofasion.Fasion) (map[string]interface{}, error) {
 	queryData := make(map[string]interface{})
 	receiveTime := parammaps.Get(strings.Trim("receiveTime", " ")).ValueStr()
 	pastureNames := parammaps.Get(strings.Trim("pastureName", " ")).ValueStr()
 	departmentName := parammaps.Get(strings.Trim("departmentName", " ")).ValueStr()
 	sqlNow, _ := restful.GetSqlByNameDB(sqlnamestr)
-	pSumNow, _ := restful.Engine.SQL(sqlNow, pastureNames, receiveTime,departmentName,departmentName,departmentName,departmentName,departmentName,departmentName).QueryString()
+	pSumNow, _ := restful.Engine.SQL(sqlNow, pastureNames, receiveTime, departmentName, departmentName, departmentName, departmentName, departmentName, departmentName).QueryString()
 	tempTime, _ := strconv.Atoi(receiveTime[:4])
 	receiveTimetemp := strconv.Itoa(tempTime-1) + receiveTime[4:]
-	pSumLast, _ := restful.Engine.SQL(sqlNow, pastureNames, receiveTimetemp,departmentName,departmentName,departmentName,departmentName,departmentName,departmentName).QueryString()
+	pSumLast, _ := restful.Engine.SQL(sqlNow, pastureNames, receiveTimetemp, departmentName, departmentName, departmentName, departmentName, departmentName, departmentName).QueryString()
 	chartData := make(map[string]interface{})
 	months := []string{}
 	lastYear := []string{}
@@ -1308,17 +1305,17 @@ func getPastureSumMonth(sqlnamestr string, parammaps *gofasion.Fasion) (map[stri
 	departmentName := parammaps.Get(strings.Trim("departmentName", " ")).ValueStr()
 	sqlNow, _ := restful.GetSqlByNameDB(sqlnamestr)
 	var pSumNow []map[string]string
-	if sqlnamestr == "getPastureSumMonth"{
-		pSumNow, _ = restful.Engine.SQL(sqlNow, pastureNames, receiveTime,departmentName,departmentName,departmentName,departmentName,departmentName,departmentName).QueryString()
-	}else {
+	if sqlnamestr == "getPastureSumMonth" {
+		pSumNow, _ = restful.Engine.SQL(sqlNow, pastureNames, receiveTime, departmentName, departmentName, departmentName, departmentName, departmentName, departmentName).QueryString()
+	} else {
 		pSumNow, _ = restful.Engine.SQL(sqlNow, pastureNames, receiveTime).QueryString()
 	}
 	tempTime, _ := strconv.Atoi(receiveTime)
 	receiveTimetemp := strconv.Itoa(tempTime - 1)
 	var pSumLast []map[string]string
-	if sqlnamestr == "getPastureSumMonth"{
-		pSumLast, _ = restful.Engine.SQL(sqlNow, pastureNames, receiveTimetemp,departmentName,departmentName,departmentName,departmentName,departmentName,departmentName).QueryString()
-	}else {
+	if sqlnamestr == "getPastureSumMonth" {
+		pSumLast, _ = restful.Engine.SQL(sqlNow, pastureNames, receiveTimetemp, departmentName, departmentName, departmentName, departmentName, departmentName, departmentName).QueryString()
+	} else {
 		pSumLast, _ = restful.Engine.SQL(sqlNow, pastureNames, receiveTimetemp).QueryString()
 	}
 
@@ -1464,9 +1461,9 @@ func getpSumNow(sqlnamestr string, parammaps *gofasion.Fasion) (map[string]inter
 	rTime := ""
 	sqlNow, _ := restful.GetSqlByNameDB(sqlnamestr)
 	var pSumNow []map[string]string
-	if sqlnamestr == "getpSumNow"{
-		pSumNow, _ = restful.Engine.SQL(sqlNow, rTime, rTime, receiveTime,departmentName,departmentName,departmentName,departmentName,departmentName,departmentName).QueryString()
-	}else {
+	if sqlnamestr == "getpSumNow" {
+		pSumNow, _ = restful.Engine.SQL(sqlNow, rTime, rTime, receiveTime, departmentName, departmentName, departmentName, departmentName, departmentName, departmentName).QueryString()
+	} else {
 		pSumNow, _ = restful.Engine.SQL(sqlNow, rTime, rTime, receiveTime).QueryString()
 	}
 	//pSumNow, _ := restful.Engine.SQL(sqlNow, rTime, rTime, receiveTime,departmentName,departmentName,departmentName,departmentName,departmentName,departmentName).QueryString()
@@ -1478,9 +1475,9 @@ func getpSumNow(sqlnamestr string, parammaps *gofasion.Fasion) (map[string]inter
 	}
 	receiveTime = strconv.Itoa(receiveTimei - 1)
 	var pSumLast []map[string]string
-	if sqlnamestr == "getpSumNow"{
-		pSumLast, _ = restful.Engine.SQL(sqlNow, rTime, rTime, receiveTime,departmentName,departmentName,departmentName,departmentName,departmentName,departmentName).QueryString()
-	}else {
+	if sqlnamestr == "getpSumNow" {
+		pSumLast, _ = restful.Engine.SQL(sqlNow, rTime, rTime, receiveTime, departmentName, departmentName, departmentName, departmentName, departmentName, departmentName).QueryString()
+	} else {
 		pSumLast, _ = restful.Engine.SQL(sqlNow, rTime, rTime, receiveTime).QueryString()
 	}
 	//pSumLast, _ = restful.Engine.SQL(sqlNow, rTime, rTime, receiveTime,departmentName,departmentName,departmentName,departmentName,departmentName,departmentName).QueryString()
@@ -1611,7 +1608,7 @@ func GetUpkeepPlan(c *gin.Context) {
 										jstr = "m" + bu["plantime"][8:]
 									}
 
-									if bu["flowCompeleted"] < "2" && bu["plantime"] < time.Now().Add(-24 * time.Hour).Format("2006-01-02") { //如果保养状态是0并且小于当前日期 则状态已延期2
+									if bu["flowCompeleted"] < "2" && bu["plantime"] < time.Now().Add(-24*time.Hour).Format("2006-01-02") { //如果保养状态是0并且小于当前日期 则状态已延期2
 										queryData.(map[string]interface{})["list"].([]map[string]interface{})[index][jstr] = va["upkeepName"] + "#" + va["id"] + "#2" + "#" + bu["id"] + "#" + bu["pushbackId"]
 									} else {
 										if bu["flowCompeleted"] >= "2" {
@@ -1741,7 +1738,7 @@ func PostDataByName(c *gin.Context) {
 	parammaps := fsion.Get("parammaps")
 	if sqlnamestr == "partsCharge" && parammaps.Get("statue").ValueInt() == 1 {
 		//fmt.Println("jinlaile")
-		defer func(){
+		defer func() {
 			go util.EASBillSync(5, fsion.Get("parammaps").Get("id").ValueStr(), fsion.Get("parammaps").Get("statue").ValueStr())
 		}()
 		//go CheckEASWebServiceParts(fsion.Get("parammaps").Get("statue").ValueStr(),fsion.Get("parammaps").Get("id").ValueStr())
@@ -2030,7 +2027,6 @@ func ExecDataByConfig(c *gin.Context) {
 			if tempv, exists := c.Get("jwt_username"); exists {
 				tempCommon["jwt_username"] = tempv.(string)
 			}
-
 			for _, paramvalue := range tempval {
 				if _, ok := paramvalue["resultname"]; !ok {
 					paramvalue["resultname"] = paramvalue["name"]
@@ -2060,8 +2056,9 @@ func ExecDataByConfig(c *gin.Context) {
 		appG.Response(http.StatusOK, e.ERROR, msg)
 		//appG.Response(http.StatusOK, e.ERROR, err.Error())
 	}
+
 	// 开协程
-	defer func(){
+	defer func() {
 		go BillType(tempval_)
 	}()
 }
@@ -2070,11 +2067,11 @@ func BillType(tempval_ map[string]interface{}) {
 	switch tempval_["data"].(type) {
 	case []interface{}:
 		if len(tempval_["data"].([]interface{})) > 0 {
-			name := tempval_["data"].([]interface{})[0].(map[string]interface{}) ["name"]
+			name := tempval_["data"].([]interface{})[0].(map[string]interface{})["name"]
 			switch name {
 			case "insertBigPartlaid":
-				billcode := tempval_["data"].([]interface{})[0].(map[string]interface{}) ["parammaps"].(map[string]interface{})["laidCode"]
-				laidType := interfacetostringv2(tempval_["data"].([]interface{})[0].(map[string]interface{}) ["parammaps"].(map[string]interface{})["laidType"])
+				billcode := tempval_["data"].([]interface{})[0].(map[string]interface{})["parammaps"].(map[string]interface{})["laidCode"]
+				laidType := interfacetostringv2(tempval_["data"].([]interface{})[0].(map[string]interface{})["parammaps"].(map[string]interface{})["laidType"])
 
 				if laidType != "2" {
 					typein = 1
@@ -2083,8 +2080,8 @@ func BillType(tempval_ map[string]interface{}) {
 				}
 				_ = util.EASBillSync(typein, billcode, "")
 			case "insertBigPartUse":
-				billcode := tempval_["data"].([]interface{})[0].(map[string]interface{}) ["parammaps"].(map[string]interface{})["useForm"]
-				usetypev := interfacetostringv2(tempval_["data"].([]interface{})[0].(map[string]interface{}) ["parammaps"].(map[string]interface{})["useType"])
+				billcode := tempval_["data"].([]interface{})[0].(map[string]interface{})["parammaps"].(map[string]interface{})["useForm"]
+				usetypev := interfacetostringv2(tempval_["data"].([]interface{})[0].(map[string]interface{})["parammaps"].(map[string]interface{})["useType"])
 				if usetypev != "4" {
 					typein = 2
 				} else {
@@ -2092,11 +2089,11 @@ func BillType(tempval_ map[string]interface{}) {
 				}
 				_ = util.EASBillSync(typein, billcode, "")
 			case "insertBigPartquit":
-				billcode := tempval_["data"].([]interface{})[0].(map[string]interface{}) ["parammaps"].(map[string]interface{})["useForm"]
+				billcode := tempval_["data"].([]interface{})[0].(map[string]interface{})["parammaps"].(map[string]interface{})["useForm"]
 				_ = util.EASBillSync(3, billcode, "")
 			case "partrefundCharge1":
-				billcode := tempval_["data"].([]interface{})[0].(map[string]interface{}) ["parammaps"].(map[string]interface{})["id"]
-				statue := interfacetostringv2(tempval_["data"].([]interface{})[0].(map[string]interface{}) ["parammaps"].(map[string]interface{})["statue"])
+				billcode := tempval_["data"].([]interface{})[0].(map[string]interface{})["parammaps"].(map[string]interface{})["id"]
+				statue := interfacetostringv2(tempval_["data"].([]interface{})[0].(map[string]interface{})["parammaps"].(map[string]interface{})["statue"])
 				if statue == "5" {
 					_ = util.EASBillSync(4, billcode, "")
 				}
@@ -2200,9 +2197,8 @@ func ExecDataParam(fasion map[string]interface{}, CommonParamMap map[string]inte
 	//}
 	//defer func() {
 
-
 	//}()
-	defer func(){
+	defer func() {
 		if sqlname == "batchPartsSH" {
 			id := ""
 			switch ParentParamMap["id"].(type) {
@@ -2230,6 +2226,7 @@ func ExecDataParam(fasion map[string]interface{}, CommonParamMap map[string]inte
 			paramslist := strings.Split(p, ",")
 			if len(paramslist) > 0 && p != "" {
 				for _, value := range paramslist {
+					fmt.Println(value, "caacaca")
 					ss := ""
 
 					if ss == "" && CommonParamMap != nil {
@@ -2313,6 +2310,7 @@ func ExecDataParam(fasion map[string]interface{}, CommonParamMap map[string]inte
 	} else if sqltype == "e" {
 		tempVal_arrary := make([]map[string]interface{}, 0)
 		tempVal_map := make(map[string]interface{})
+
 		tempValParam, err := restful.ExecQueryT(sql, s_params, tx)
 		if err == nil {
 			fasion["resultmaps"] = tempValParam.(map[string]interface{})
@@ -2920,7 +2918,7 @@ func PastureDepartment(c *gin.Context) {
 	deptName := paramMap.Get("deptName").ValueStr()
 	idList := strings.Split(ids, ",")
 	checkDeptList := make([]map[string]interface{}, 0)
-	for _, v := range (idList) {
+	for _, v := range idList {
 		aa, _ := strconv.Atoi(v)
 		data, err := Engine.SQL("select * from department where pastureId=? and name=? and enable=1 and isDel=0 and isPasture=0", aa, deptName).Query().List()
 		if err != nil {
@@ -2955,22 +2953,22 @@ func Equipment(c *gin.Context) {
 	dataList := make([]interface{}, 0)
 	Engine := models.Engine
 	pastureData, err := Engine.SQL("select p.`name`,p.id from pasture p group by p.`name`").Query().List()
-	str:= "select eqS.id,eqS.deapartmentName deptName, eqS.`use`,eqclass.`typeName`,p.`name`,p.id pastureId ,eqS.eqClassId "+
-		" from equipment_standard eqS"+
-		" left join pasture p on p.id= eqS.pastureId"+
-		" left join eqclass  on eqclass.id=eqS.eqClassId "+
-		" where (eqS.deapartmentName = ?deptName or ?deptName ='') and "+
-		" (eqS.eqClassId = ?eqClassId or ?eqClassId ='') "+
-		" group by deptName,eqClassId "+
+	str := "select eqS.id,eqS.deapartmentName deptName, eqS.`use`,eqclass.`typeName`,p.`name`,p.id pastureId ,eqS.eqClassId " +
+		" from equipment_standard eqS" +
+		" left join pasture p on p.id= eqS.pastureId" +
+		" left join eqclass  on eqclass.id=eqS.eqClassId " +
+		" where (eqS.deapartmentName = ?deptName or ?deptName ='') and " +
+		" (eqS.eqClassId = ?eqClassId or ?eqClassId ='') " +
+		" group by deptName,eqClassId " +
 		" ORDER BY eqS.id DESC"
-	offset = offset-1
+	offset = offset - 1
 	if pagecount > 0 && offset > 0 {
 		offset = offset * pagecount
 	}
 	paramMap_3_6 := map[string]interface{}{"deptName": deptName, "eqClassId": eqClassId}
 	//paramMap := map[string]interface{}{"deptName": deptName, "eqClassId": 17}
 	//equipmentStandardData1, err := Engine.SQL(str, deptName, deptName, eqClassId, eqClassId).Limit(pagecount,offset).Query().List()
-	equipmentStandardData1, err := Engine.SQL(str, &paramMap_3_6).Limit(pagecount,offset).Query().List()
+	equipmentStandardData1, err := Engine.SQL(str, &paramMap_3_6).Limit(pagecount, offset).Query().List()
 	//数据
 	equipmentStandardData2, err := Engine.SQL("select eqS.deapartmentName deptName, eqS.id eqSId,eqS.equipmentNumber,p.`name`,p.id pastureId,eqS.eqClassId"+
 		" from equipment_standard eqS"+
@@ -2981,18 +2979,18 @@ func Equipment(c *gin.Context) {
 
 	sqlstr := str
 
-	params := make([]interface{},0)
-	for i:=0;i<2;i++{
-		param := make(map[string]interface{},0)
+	params := make([]interface{}, 0)
+	for i := 0; i < 2; i++ {
+		param := make(map[string]interface{}, 0)
 		param["deptName"] = deptName
 		param["eqClassId"] = eqClassId
-		params = append(params,param)
+		params = append(params, param)
 	}
 	label := make([]map[string]interface{}, 0)
 	if err != nil {
 		fmt.Println(err)
 	} else {
-		for i, v := range (pastureData) {
+		for i, v := range pastureData {
 			pasturelist := make(map[string]interface{}, 1)
 			pasturelist["label"] = v["name"]
 			pasturelist["id"] = v["id"]
@@ -3001,7 +2999,7 @@ func Equipment(c *gin.Context) {
 		}
 		label2 := make([]map[string]interface{}, 0)
 		//equipmentStandardList := make(map[string]interface{}, 1)
-		for _, s := range (equipmentStandardData1) {
+		for _, s := range equipmentStandardData1 {
 			equipmentStandardList := make(map[string]interface{}, 1)
 			for i := 1; i <= len(label); i++ {
 				equipmentStandardList["m"+strconv.Itoa(i)] = ""
@@ -3010,9 +3008,9 @@ func Equipment(c *gin.Context) {
 			equipmentStandardList["use"] = s["use"]
 			equipmentStandardList["typeName"] = s["typeName"]
 			equipmentStandardList["eqClassId"] = s["eqClassId"]
-			for _, z := range (equipmentStandardData2) {
-				for e, x := range (label) {
-					if s["deptName"] == z["deptName"] && x["label"] == z["name"] && s["eqClassId"]==z["eqClassId"]{
+			for _, z := range equipmentStandardData2 {
+				for e, x := range label {
+					if s["deptName"] == z["deptName"] && x["label"] == z["name"] && s["eqClassId"] == z["eqClassId"] {
 						equipmentStandardList["pastureId"+strconv.Itoa(e+1)] = x["id"]
 						//equipmentStandardList["eqSId"+strconv.Itoa(e+1)] = z["eqSId"]
 						equipmentStandardList[x["property"].(string)] = z["equipmentNumber"]
@@ -3030,10 +3028,10 @@ func Equipment(c *gin.Context) {
 		} else {
 			dataList = append(dataList, label)
 			dataList = append(dataList, label2)
-			data :=make(map[string]interface{})
+			data := make(map[string]interface{})
 			recordcount := int64(0)
 			if pagecount > 1 {
-				tt, err := Engine.SQL("SELECT COUNT(*) as count FROM ("+sqlstr+") a",deptName, deptName, eqClassId, eqClassId).Query().List()
+				tt, err := Engine.SQL("SELECT COUNT(*) as count FROM ("+sqlstr+") a", deptName, deptName, eqClassId, eqClassId).Query().List()
 				if err != nil {
 					fmt.Println("s1", err)
 				}
@@ -3070,13 +3068,10 @@ func Equipment(c *gin.Context) {
 	}
 }
 
-
-
-
 // 资产标准管理插入修改写在一起
 func UpdateAndInsert(c *gin.Context) {
 	appG := app.Gin{C: c}
-	data := make(map[string]interface{},0)
+	data := make(map[string]interface{}, 0)
 	dataByte, _ := ioutil.ReadAll(c.Request.Body)
 	fsion := gofasion.NewFasion(string(dataByte))
 	param := fsion.Get("param")
@@ -3088,30 +3083,30 @@ func UpdateAndInsert(c *gin.Context) {
 	eqClassId, err := strconv.Atoi(param.Get("eqClassId").ValueStr())
 	use := param.Get("use").ValueStr()
 	paramStr := fsion.Get("param").ValueStr()
-	paramMap:=make(map[string]interface{},0)
+	paramMap := make(map[string]interface{}, 0)
 	err = json.Unmarshal([]byte(paramStr), &paramMap)
 	fmt.Println(len(paramMap))
 	fmt.Println(paramMap)
 	// 标准库存
-	name :=  fsion.Get("name").ValueStr()
-	partClassId,err := strconv.Atoi(param.Get("partClassId").ValueStr())
+	name := fsion.Get("name").ValueStr()
+	partClassId, err := strconv.Atoi(param.Get("partClassId").ValueStr())
 	Engine := models.Engine
 	ff := 0
 	if check == "insert" {
-		querydata := make([]map[string]interface{},0)
-		if name == "partStandard"{
+		querydata := make([]map[string]interface{}, 0)
+		if name == "partStandard" {
 			ff = 2
-			querydata,err=tx.SQL(" select * from part_standard where partClassId2 =? ",partClassId).Query().List()
-			if querydata != nil{
+			querydata, err = tx.SQL(" select * from part_standard where partClassId2 =? ", partClassId).Query().List()
+			if querydata != nil {
 				//data["msg"]="请不输入重复数据"
 				msg := geterrmsg("请不输入重复数据")
 				appG.Response(http.StatusOK, e.ERROR, msg)
 				return
 			}
-		}else {
+		} else {
 			ff = 4
-			querydata,err=tx.SQL(" select * from equipment_standard where eqClassId =? and deapartmentName = ?",eqClassId,deptName).Query().List()
-			if querydata != nil{
+			querydata, err = tx.SQL(" select * from equipment_standard where eqClassId =? and deapartmentName = ?", eqClassId, deptName).Query().List()
+			if querydata != nil {
 				//data["msg"]="请不输入重复数据"
 				msg := geterrmsg("请不输入重复数据")
 				appG.Response(http.StatusOK, e.ERROR, msg)
@@ -3123,13 +3118,13 @@ func UpdateAndInsert(c *gin.Context) {
 			pastureId, err := strconv.Atoi(param.Get("pastureId" + strconv.Itoa(i)).ValueStr())
 			if err != nil {
 			}
-			if name == "partStandard"{
+			if name == "partStandard" {
 				if param.Get("m"+strconv.Itoa(i)).ValueStr() != "" {
-					tx.SQL("call add_part_standard(?,?,?)",partClassId,pastureId,param.Get("m"+strconv.Itoa(i)).ValueStr()).Execute()
+					tx.SQL("call add_part_standard(?,?,?)", partClassId, pastureId, param.Get("m"+strconv.Itoa(i)).ValueStr()).Execute()
 				}
-			}else {
+			} else {
 				if param.Get("m"+strconv.Itoa(i)).ValueStr() != "" {
-					tx.SQL("call add_equipment_standard(?,?,?,?,?,?)", deptName, use, eqClassId, pastureId, param.Get("m"+strconv.Itoa(i)).ValueStr(),eqCode).Execute()
+					tx.SQL("call add_equipment_standard(?,?,?,?,?,?)", deptName, use, eqClassId, pastureId, param.Get("m"+strconv.Itoa(i)).ValueStr(), eqCode).Execute()
 				}
 			}
 
@@ -3138,19 +3133,19 @@ func UpdateAndInsert(c *gin.Context) {
 		}
 	}
 	if check == "update" {
-		if name == "partStandard"{
+		if name == "partStandard" {
 			ff = 2
-			Engine.SQL("delete from part_standard where partClassId2 =?",partClassId).Execute()
+			Engine.SQL("delete from part_standard where partClassId2 =?", partClassId).Execute()
 			for i := 1; i <= (len(paramMap)-ff)/2; i++ {
 				pastureId, err := strconv.Atoi(param.Get("pastureId" + strconv.Itoa(i)).ValueStr())
 				if err != nil {
 				}
 				if param.Get("m"+strconv.Itoa(i)).ValueStr() != "" {
-					Engine.SQL("call add_part_standard(?,?,?)",partClassId,pastureId,param.Get("m"+strconv.Itoa(i)).ValueStr()).Execute()
+					Engine.SQL("call add_part_standard(?,?,?)", partClassId, pastureId, param.Get("m"+strconv.Itoa(i)).ValueStr()).Execute()
 					//	" WHERE deapartmentName=? and pastureId = ? and eqClassId=?", use, param.Get("m"+strconv.Itoa(i)).ValueStr(), deptName, pastureId,eqClassId).Execute()
 				}
 			}
-		}else {
+		} else {
 			ff = 4
 			Engine.SQL("delete from equipment_standard   where deapartmentName=? and eqClassId=?", deptName, eqClassId).Execute()
 			for i := 1; i <= (len(paramMap)-ff)/2; i++ {
@@ -3158,37 +3153,37 @@ func UpdateAndInsert(c *gin.Context) {
 				if err != nil {
 				}
 				if param.Get("m"+strconv.Itoa(i)).ValueStr() != "" {
-					Engine.SQL("call add_equipment_standard(?,?,?,?,?,?)", deptName, use, eqClassId, pastureId, param.Get("m"+strconv.Itoa(i)).ValueStr(),eqCode).Execute()
+					Engine.SQL("call add_equipment_standard(?,?,?,?,?,?)", deptName, use, eqClassId, pastureId, param.Get("m"+strconv.Itoa(i)).ValueStr(), eqCode).Execute()
 					//	" WHERE deapartmentName=? and pastureId = ? and eqClassId=?", use, param.Get("m"+strconv.Itoa(i)).ValueStr(), deptName, pastureId,eqClassId).Execute()
 				}
 			}
 		}
 		if err != nil {
-			data["msg"]="error"
-			data["error"]=err.Error()
+			data["msg"] = "error"
+			data["error"] = err.Error()
 			appG.Response(http.StatusOK, e.SUCCESS, data)
 		}
 	}
 	if check == "delete" {
-		if name == "partStandard"{
+		if name == "partStandard" {
 			for i := 1; i <= (len(paramMap)-ff)/2; i++ {
 				pastureId, err := strconv.Atoi(param.Get("pastureId" + strconv.Itoa(i)).ValueStr())
-				if err != nil{
+				if err != nil {
 				}
 				Engine.SQL("delete from part_standard   where  pastureId=? and partClassId2=?", pastureId, partClassId).Execute()
 			}
-		}else {
+		} else {
 			ff = 4
 			for i := 1; i <= (len(paramMap)-ff)/2; i++ {
 				pastureId, err := strconv.Atoi(param.Get("pastureId" + strconv.Itoa(i)).ValueStr())
-				if err != nil{
+				if err != nil {
 				}
 				Engine.SQL("delete from equipment_standard   where deapartmentName=? and pastureId=? and eqClassId=?", deptName, pastureId, eqClassId).Execute()
 			}
 		}
 	}
 
-	data["msg"]="ok"
+	data["msg"] = "ok"
 	appG.Response(http.StatusOK, e.SUCCESS, data)
 	defer func() {
 		switch {
@@ -3208,10 +3203,7 @@ func UpdateAndInsert(c *gin.Context) {
 	}()
 }
 
-
-
-
-func StandardPart(c *gin.Context){
+func StandardPart(c *gin.Context) {
 	appG := app.Gin{C: c}
 	dataByte, _ := ioutil.ReadAll(c.Request.Body)
 	fsion := gofasion.NewFasion(string(dataByte))
@@ -3222,24 +3214,24 @@ func StandardPart(c *gin.Context){
 	pastureData, err := Engine.SQL("select p.`name`,p.id from pasture p group by p.`name`").Query().List()
 
 	//s_params := make([]interface{}, 0)
-	offset = offset-1
+	offset = offset - 1
 	if pagecount > 0 && offset > 0 {
 		offset = offset * pagecount
 	}
 	dataList := make([]interface{}, 0)
 	label := make([]map[string]interface{}, 0)
-	str := "select p_c.partName,p.`name`,p_s.pastureId,p_s.partClassId2 from part_standard p_s left join part_class p_c on p_c.id= p_s.partClassId2 "+
-	" left join pasture p on p.id = p_s.pastureId where p_s.partClassId2 = ? or ?='' "+
-	" GROUP BY p_s.partClassId2  ORDER BY p_s.id DESC"
-	str1 :="select  p_s.standardMoney,p_s.partClassId2,p_s.pastureId,p.`name` from part_standard p_s left join pasture p on p.id=p_s.pastureId  where p_s.partClassId2 = ? or ?=''"
-	partStandardData1, err := Engine.SQL(str, partClassId,partClassId).Limit(pagecount,offset).Query().List()
+	str := "select p_c.partName,p.`name`,p_s.pastureId,p_s.partClassId2 from part_standard p_s left join part_class p_c on p_c.id= p_s.partClassId2 " +
+		" left join pasture p on p.id = p_s.pastureId where p_s.partClassId2 = ? or ?='' " +
+		" GROUP BY p_s.partClassId2  ORDER BY p_s.id DESC"
+	str1 := "select  p_s.standardMoney,p_s.partClassId2,p_s.pastureId,p.`name` from part_standard p_s left join pasture p on p.id=p_s.pastureId  where p_s.partClassId2 = ? or ?=''"
+	partStandardData1, err := Engine.SQL(str, partClassId, partClassId).Limit(pagecount, offset).Query().List()
 	//数据
-	partStandardData2, err := Engine.SQL(str1, partClassId,partClassId).Query().List()
+	partStandardData2, err := Engine.SQL(str1, partClassId, partClassId).Query().List()
 
 	if err != nil {
 		fmt.Println(err)
 	} else {
-		for i, v := range (pastureData) {
+		for i, v := range pastureData {
 			pasturelist := make(map[string]interface{}, 1)
 			pasturelist["label"] = v["name"]
 			pasturelist["id"] = v["id"]
@@ -3248,15 +3240,15 @@ func StandardPart(c *gin.Context){
 		}
 		label2 := make([]map[string]interface{}, 0)
 		//equipmentStandardList := make(map[string]interface{}, 1)
-		for _, s := range (partStandardData1) {
+		for _, s := range partStandardData1 {
 			partStandardList := make(map[string]interface{}, 1)
 			for i := 1; i <= len(label); i++ {
 				partStandardList["m"+strconv.Itoa(i)] = ""
 			}
 			partStandardList["partClassId"] = s["partClassId2"]
 			partStandardList["partName"] = s["partName"]
-			for _, z := range (partStandardData2) {
-				for e, x := range (label) {
+			for _, z := range partStandardData2 {
+				for e, x := range label {
 					if x["label"] == z["name"] && s["partClassId2"] == z["partClassId2"] {
 						partStandardList["pastureId"+strconv.Itoa(e+1)] = x["id"]
 						//equipmentStandardList["eqSId"+strconv.Itoa(e+1)] = z["eqSId"]
@@ -3315,9 +3307,3 @@ func StandardPart(c *gin.Context){
 		}
 	}
 }
-
-
-
-
-
-

+ 1562 - 0
routers/api/sunshine.go

@@ -0,0 +1,1562 @@
+package api
+
+import (
+	"fmt"
+	"io/ioutil"
+	"log"
+	"math"
+	"net/http"
+	"sort"
+	"strconv"
+	"strings"
+
+	"../../utils"
+
+	"../../pkg/app"
+	"../../pkg/e"
+	"../../routers/restful"
+	"github.com/Anderson-Lu/gofasion/gofasion"
+	"github.com/gin-gonic/gin"
+	"github.com/tealeg/xlsx"
+)
+
+func GetProductAreas(c *gin.Context) {
+	appG := app.Gin{C: c}
+
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+
+	offset := fsion.Get("offset").ValueDefaultInt(0)
+	pagecount := fsion.Get("pagecount").ValueDefaultInt(0)
+
+	parammaps := fsion.Get("parammaps")
+	productname := parammaps.Get("productname").ValueStr()
+	classids := parammaps.Get("productclassid").ValueStr()
+
+	var recordcount int64 = 0
+	queryData := make([]map[string]interface{}, 1)
+	var err error
+	tx := restful.Engine.NewSession()
+	defer tx.Close()
+	{
+		sqlstr := `SELECT t1.id,t1.productname,t1.spec FROM productinfo t1 
+	INNER JOIN prounit t2 ON t1.prounit = t2.id where 1=1 and t1.enable = 1 `
+		if len(classids) > 0 {
+			sqlstr += fmt.Sprintf(" and  t1.productclass in ('%s')", classids)
+		}
+		if len(productname) > 0 {
+			sqlstr += fmt.Sprintf(" and  t1.productname like ('%s')", "%"+productname+"%")
+		}
+
+		tt, err := tx.SQL(sqlstr).Query().Count()
+		if err != nil {
+			log.Println("GetProductAreas-err1: ", err)
+			appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+			return
+		}
+		recordcount = int64(tt)
+	}
+
+	if pagecount == 0 {
+		sqlstr := `SELECT t1.id as productid,t1.productname,ifnull(t1.spec,"")   as specifications,ifnull(t2.unitname,"") as unit
+		FROM productinfo t1 
+		INNER JOIN prounit t2 ON t1.prounit = t2.id where 1=1 and t1.enable = 1 `
+		if len(classids) > 0 {
+			sqlstr += fmt.Sprintf(" and  t1.productclass in ('%s')", classids)
+		}
+		if len(productname) > 0 {
+			sqlstr += fmt.Sprintf(" and  t1.productname like ('%s')", "%"+productname+"%")
+		}
+
+		query := tx.SQL(sqlstr)
+		queryData, err = query.Query().List()
+		if err != nil {
+			log.Println("GetProductAreas-err2: ", err)
+			appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+			return
+		}
+	} else {
+		sqlstr := `SELECT t1.id as productid,t1.productname,ifnull(t1.spec,"")  as specifications,ifnull(t2.unitname,"") as unit
+		FROM productinfo t1 
+		INNER JOIN prounit t2 ON t1.prounit = t2.id where 1=1  and t1.enable = 1 `
+
+		if len(classids) > 0 {
+			sqlstr += fmt.Sprintf(" and  t1.productclass in ('%s')", classids)
+		}
+		if len(productname) > 0 {
+			sqlstr += fmt.Sprintf(" and  t1.productname like ('%s')", "%"+productname+"%")
+		}
+
+		queryData, err = tx.SQL(sqlstr).Limit(pagecount, (offset-1)*pagecount).Query().List()
+		if err != nil {
+			log.Println("GetProductAreas-err3: ", err)
+			appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+			return
+		}
+	}
+
+	headlist := make([]map[string]interface{}, 0)
+	areaData := make([]map[string]interface{}, 0)
+	{
+		sqlstr := `SELECT
+		t1.id AS productareaid,
+		t1.AreaId as areaid,
+		t2.name,
+		t1.Productid  as productid
+	FROM
+		productarea t1
+		INNER JOIN canton t2 ON t1.AreaId = t2.ID order by areaid`
+
+		areaData, err = tx.SQL(sqlstr).Query().List()
+		if err != nil {
+			log.Println("GetProductAreas-err4: ", err)
+			appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+			return
+		}
+
+		areaMap := make(map[interface{}]interface{})
+		contactlistMap := make(map[interface{}][]interface{})
+		for _, area := range areaData {
+			areaMap[area["areaid"]] = area["name"]
+			contactlistMap[area["productid"]] = append(contactlistMap[area["productid"]], area["areaid"])
+		}
+		areaids := []int64{}
+		for areaid, _ := range areaMap {
+			areaids = append(areaids, areaid.(int64))
+		}
+
+		utils.QuickSort(areaids, 0, int64(len(areaids)-1))
+		for _, v := range areaids {
+			head := make(map[string]interface{})
+			head["column_name"] = fmt.Sprintf("column%v", v)
+			head["column_title"] = areaMap[v]
+			head["column_id"] = v
+			headlist = append(headlist, head)
+		}
+
+		for _, data := range queryData {
+			for id, _ := range areaMap {
+				data[fmt.Sprintf("column%v", id)] = 0
+			}
+
+			if _, ok := contactlistMap[data["productid"]]; ok {
+				for _, areaid := range contactlistMap[data["productid"]] {
+					data[fmt.Sprintf("column%v", areaid)] = 1
+				}
+			}
+
+		}
+	}
+
+	data := make(map[string]interface{})
+
+	data["headlist"] = headlist
+	data["list"] = queryData
+	data["total"] = recordcount
+	data["code"] = 0
+	data["message"] = "ok"
+	if pagecount > 0 {
+		data["pages"] = math.Ceil(float64(recordcount) / float64(pagecount))
+		data["pageNum"] = math.Ceil(float64(offset+1) / float64(pagecount))
+	}
+	data["pageSize"] = pagecount
+
+	appG.Response(http.StatusOK, e.SUCCESS, data)
+}
+
+//查看发布价格
+func GetPublishPrice(c *gin.Context) {
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	offset := fsion.Get("offset").ValueDefaultInt(0)
+	pagecount := fsion.Get("pagecount").ValueDefaultInt(0)
+	parammaps := fsion.Get("parammaps")
+	productclass := parammaps.Get("productclassid").ValueInt64()
+	date := parammaps.Get("starttime").ValueStr()
+	productname := parammaps.Get("productname").ValueStr()
+
+	data := make(map[string]interface{})
+	var err error
+	queryData := make([]map[string]interface{}, 0)
+	var recordcount int
+
+	tx := restful.Engine.NewSession()
+	defer tx.Close()
+	{
+		sqlstr := `select t1.id as productid,t1.productname,t1.productclass,ifnull(t1.spec,"") as 	specifications ,ifnull(t2.unitname,"") as unitname from productinfo  t1  
+		join prounit  t2 on t2.id = t1.prounit  where 1=1 and t1.enable = 1 `
+
+		var args []interface{}
+		if productclass > 0 {
+			sqlstr += " and t1.productclass = ?"
+			args = append(args, productclass)
+		}
+		if len(productname) > 0 {
+			sqlstr += " and t1.productname like CONCAT('%',?,'%')"
+			args = append(args, productname)
+		}
+		if pagecount > 0 {
+			sqlstr += "  limit ?,?"
+			args = append(args, (offset-1)*pagecount, pagecount)
+		}
+
+		productrow := tx.SQL(sqlstr, args...)
+		defer productrow.Close()
+		queryData, err = productrow.Query().List()
+		if err != nil {
+			log.Println("GetPublishPrice-err1: ", err)
+			appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+			return
+		}
+
+		var args1 []interface{}
+		sqlstr1 := `select t1.id from productinfo  t1  
+		join prounit  t2 on t2.id = t1.prounit  where 1=1 and t1.enable = 1 `
+
+		if productclass > 0 {
+			sqlstr1 += " and t1.productclass = ?"
+			args1 = append(args1, productclass)
+		}
+
+		if len(productname) > 0 {
+			sqlstr1 += " and t1.productname like CONCAT('%',?,'%')"
+			args1 = append(args1, productname)
+		}
+
+		row := tx.SQL(sqlstr1, args1...)
+		defer row.Close()
+		count, err := row.Query().Count()
+		if err != nil {
+			log.Println("GetPublishPrice-err2: ", err)
+			appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+			return
+		}
+		recordcount = count
+	}
+
+	productidlist := []string{"0"}
+	for _, data := range queryData {
+		productidlist = append(productidlist, strconv.FormatInt(data["productid"].(int64), 10))
+	}
+
+	type areaid struct {
+		areaid   int64
+		name     string
+		parentid int64
+		layer    int64
+		sort     int64
+	}
+
+	headlist := make([]map[string]interface{}, 0)
+	{
+		sqlstr := `select t1.id,t1.name,t1.parent_id as parentid ,t1.layer,t1.ord  from canton t1 
+		join (select DISTINCT(areaid) as areaid,t2.name from productarea t1 join canton t2 on t2.id = t1.areaid  
+		where productid in (%s)) t2 on (t1.id = t2.areaid or t1.PARENT_ID = t2.areaid)`
+		arearow := tx.SQL(fmt.Sprintf(sqlstr, strings.Join(productidlist, ",")))
+		areaData, err := arearow.Query().List()
+		if err != nil {
+			log.Println("GetPublishPrice-err3: ", err)
+			appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+			return
+		}
+
+		bigarea := make([]*areaid, 0)
+		for _, area := range areaData {
+			if area["layer"].(int64) == 1 {
+				bigarea = append(bigarea, &areaid{
+					areaid:   area["id"].(int64),
+					name:     area["name"].(string),
+					parentid: area["parentid"].(int64),
+					layer:    area["layer"].(int64),
+					sort:     area["ord"].(int64),
+				})
+			}
+		}
+
+		sort.Slice(bigarea, func(i, j int) bool {
+			return bigarea[i].areaid < bigarea[j].areaid // 升序
+		})
+		sort.Slice(bigarea, func(i, j int) bool {
+			return bigarea[i].sort < bigarea[j].sort // 升序
+		})
+
+		for _, big := range bigarea {
+			head := make(map[string]interface{})
+			head["column_id"] = big.areaid
+			head["column_name"] = fmt.Sprintf("column_%d", big.areaid)
+			head["column_title"] = big.name
+			smallarea := make([]*areaid, 0)
+			for _, area := range areaData {
+				if area["parentid"].(int64) == big.areaid {
+					smallarea = append(smallarea, &areaid{
+						areaid:   area["id"].(int64),
+						name:     area["name"].(string),
+						parentid: area["parentid"].(int64),
+						layer:    area["layer"].(int64),
+						sort:     area["ord"].(int64),
+					})
+				}
+			}
+			sort.Slice(smallarea, func(i, j int) bool {
+				return smallarea[i].areaid < smallarea[j].areaid // 升序
+			})
+			sort.Slice(smallarea, func(i, j int) bool {
+				return smallarea[i].sort < smallarea[j].sort // 升序
+			})
+			smallhead := make([]map[string]interface{}, 0)
+			for _, small := range smallarea {
+				data1 := make(map[string]interface{})
+				data1["column_id"] = small.areaid
+				data1["column_name"] = fmt.Sprintf("column_%d", small.areaid)
+				data1["column_title"] = small.name
+				smallhead = append(smallhead, data1)
+			}
+			head["headlist"] = smallhead
+			headlist = append(headlist, head)
+		}
+
+		productpricesql := `SELECT  productid,marketid as smallareaid , marketclass as bigareaid,price FROM (
+			SELECT * FROM productprice WHERE productid in (%s) ORDER BY pricedate DESC limit 10000000000000000
+			) AS t  where 1=1 `
+
+		if date != "" {
+			productpricesql += fmt.Sprintf(" and DATE_FORMAT(pricedate,'%%Y-%%c-%%d') = %s ", date)
+		}
+
+		productpricesql += " group by productid, marketid  "
+		productpricerow := tx.SQL(fmt.Sprintf(productpricesql, strings.Join(productidlist, ",")))
+		productpriceData, err := productpricerow.Query().List()
+		type priceStruct struct {
+			marketid int64
+			price    string
+		}
+
+		priceMap := make(map[int64][]priceStruct)
+		for _, productprice := range productpriceData {
+			priceMap[productprice["productid"].(int64)] = append(priceMap[productprice["productid"].(int64)], priceStruct{
+				marketid: productprice["smallareaid"].(int64),
+				price:    productprice["price"].(string),
+			})
+		}
+
+		for _, query := range queryData {
+			for _, area := range areaData {
+				if area["layer"].(int64) == 2 {
+					query[fmt.Sprintf("column_%v", area["id"])] = 0
+				}
+			}
+			query["Edit"] = false
+			query["NoEdit"] = true
+			query["isCreate"] = false
+			query["isUpdate"] = true
+			query["isUpdateSave"] = false
+		}
+
+		for _, query := range queryData {
+			for _, price := range priceMap[query["productid"].(int64)] {
+				query[fmt.Sprintf("column_%d", price.marketid)] = price.price
+			}
+		}
+		data["list"] = queryData
+	}
+
+	data["headlist"] = headlist
+	data["total"] = recordcount
+	data["code"] = 0
+	data["message"] = "ok"
+	if pagecount > 0 {
+		data["pages"] = math.Ceil(float64(recordcount) / float64(pagecount))
+		data["pageNum"] = math.Ceil(float64(offset+1) / float64(pagecount))
+	}
+	data["pageSize"] = pagecount
+
+	appG.Response(http.StatusOK, e.SUCCESS, data)
+}
+
+//修改发布价格信息
+func UpdatePublishPrice(c *gin.Context) {
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	params := fsion.Get("params").Array()
+
+	tx := restful.Engine.NewSession()
+	defer tx.Close()
+	for _, param := range params {
+		productid := param.Get("productid").ValueInt64()
+		productclass := param.Get("productclass").ValueStr()
+		areaidlist := []string{"0"}
+		for _, key := range param.Keys() {
+			if strings.Index(key, "column_") > -1 {
+				areaidlist = append(areaidlist, key[len("column_"):])
+			}
+		}
+
+		areamap, err := tx.SQL(fmt.Sprintf(`select t1.id,t2.PARENT_ID as parentid from canton t1
+		 join canton t2 on t1.PARENT_ID = t2.id  where t1.id in (%s)
+		  order by t2.ORD  ,t1.ORD,t1.id`, strings.Join(areaidlist, ","))).Query().List()
+		if err != nil {
+			log.Println("UpdatePublishPrice-err1: ", err)
+			appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+			return
+		}
+
+		pricemap, err := tx.SQL(`SELECT   t.marketid ,t.marketclass,t.price , t.pricedate,id FROM (
+			SELECT * FROM productprice WHERE productid = ? ORDER BY pricedate DESC limit 10000000000000000
+			) AS t 
+			GROUP BY t.marketid  `, productid).Query().List()
+		if err != nil {
+			log.Println("UpdatePublishPrice-err2: ", err)
+			appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+			return
+		}
+
+		for _, area := range areamap {
+			pricenum := param.Get(fmt.Sprintf("column_%v", area["id"])).ValueFloat64()
+			isupdateprice := false
+			exist := false
+			for _, price := range pricemap {
+				if area["id"].(int64) == price["marketid"].(int64) {
+					priceintface, _ := strconv.ParseFloat(price["price"].(string), 64)
+					if priceintface == pricenum {
+						// if !isupdateinfo {
+						// 	_, err := tx.SQL("update productinfo set price = ? where id = ?", pricenum, productid).Execute()
+						// 	if err != nil {
+						// 		log.Println("UpdatePublishPrice-err3: ", err)
+						// 		appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+						// 		return
+						// 	}
+						// 	isupdateinfo = true
+						// }
+						isupdateprice = true
+					}
+					exist = true
+					break
+				}
+			}
+
+			// if !isupdateinfo && (exist && pricenum == 0) {
+			// 	_, err := tx.SQL("update productinfo set price = ? where id = ?", pricenum, productid).Execute()
+			// 	if err != nil {
+			// 		log.Println("UpdatePublishPrice-err3: ", err)
+			// 		appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+			// 		return
+			// 	}
+			// 	isupdateinfo = true
+			// }
+			if (!isupdateprice && (exist)) || (!isupdateprice && !exist && pricenum != 0) {
+				var args []interface{}
+				args = append(args, productid, area["id"], pricenum, area["parentid"], productclass)
+				_, err := tx.SQL("insert into productprice(productid,marketid,price,marketclass,productclass,pricedate)values(?,?,?,?,?,now())", args...).Execute()
+				if err != nil {
+					log.Println("UpdatePublishPrice-err4: ", err)
+					appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+					return
+				}
+			}
+		}
+	}
+
+	appG.Response(http.StatusOK, e.SUCCESS, nil)
+}
+
+//查看产品信息 GetProductInfo
+func GetProductInfo(c *gin.Context) {
+	appG := app.Gin{C: c}
+
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	offset := fsion.Get("offset").ValueDefaultInt(0)
+	pagecount := fsion.Get("pagecount").ValueDefaultInt(0)
+	parammaps := fsion.Get("parammaps")
+	smallclassid := parammaps.Get("smallclassid").ValueStr()
+	productname := parammaps.Get("productname").ValueStr()
+
+	var args []interface{}
+
+	tx := restful.Engine.NewSession()
+	defer tx.Close()
+	sqlstr := `  select t1.id as productid ,t1.productname,  IFNULL(t1.spec,'') as specifications  ,t2.unitname as unit,t1.prounit as unitid ,t1.enable,t1.ordernum as sort ,  t3.productclass ,t3.id as smallclassid 
+	from productinfo t1 
+inner join prounit t2  on t2.id = t1.prounit
+inner join (select t1.classname as smallname,t2.classname as bigname,t1.id,CONCAT(t2.classname,'-',t1.classname)as productclass ,t1.ordernum as smallsort ,t2.ordernum as bigsort
+from productclass t1  join productclass t2 on t2.id = t1.parentid where t1.leavel = 2) t3 on t3.id = t1.productclass 
+where  1=1     `
+	if smallclassid != "" {
+		sqlstr += "  and t1.productclass  =  ? "
+		args = append(args, smallclassid)
+	}
+	if productname != "" {
+		sqlstr += "  and t1.productname  like CONCAT('%',?,'%')  "
+		args = append(args, productname)
+	}
+
+	sqlstr += "  order  by t3.bigsort,t3.smallsort ,t1.ordernum"
+
+	arearow := tx.SQL(sqlstr, args...)
+	defer arearow.Close()
+	queryData := make([]map[string]interface{}, 0)
+	var err error
+
+	if pagecount > 0 {
+		queryData, err = arearow.Limit(pagecount, (offset-1)*pagecount).Query().List()
+		if err != nil {
+			log.Println("GetProductInfo-err1: ", err)
+			appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+			return
+		}
+	} else {
+		queryData, err = arearow.Query().List()
+		if err != nil {
+			log.Println("GetProductInfo-err1: ", err)
+			appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+			return
+		}
+	}
+
+	sqlstrcount := `select t1.id
+	from productinfo t1 
+inner join prounit t2  on t2.id = t1.prounit
+inner join (select t1.classname as smallname,t2.classname as bigname,t1.id,CONCAT(t2.classname,'-',t1.classname)as productclass ,t1.ordernum as smallsort ,t2.ordernum as bigsort
+from productclass t1  join productclass t2 on t2.id = t1.parentid where t1.leavel = 2) t3 on t3.id = t1.productclass 
+where  1=1   and t1.enable = 1 `
+	if smallclassid != "" {
+		sqlstrcount += "  and t1.productclass  =  ? "
+	}
+	if productname != "" {
+		sqlstrcount += "  and t1.productname  like CONCAT('%',?,'%')  "
+	}
+
+	countrow := tx.SQL(sqlstr, args...)
+	recordcount, err := countrow.Query().Count()
+	if err != nil {
+		log.Println("GetProductInfo-err2: ", err)
+		appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+		return
+	}
+
+	productids := []string{"0"}
+	for _, query := range queryData {
+		productids = append(productids, fmt.Sprintf("%v", query["productid"]))
+	}
+
+	pricemap, err := tx.SQL(fmt.Sprintf(`SELECT  productid,price FROM (
+		SELECT * FROM productprice WHERE productid in (%s) ORDER BY pricedate DESC limit 10000000000000000
+		) AS t   group by productid `, strings.Join(productids, ","))).Query().List()
+	if err != nil {
+		log.Println("GetProductInfo-err3: ", err)
+		appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+		return
+	}
+
+	for _, query := range queryData {
+		productid := query["productid"].(int64)
+		for _, price := range pricemap {
+			if productid == price["productid"].(int64) {
+				query["price"] = price["price"]
+			}
+		}
+	}
+	data := make(map[string]interface{})
+	data["list"] = queryData
+	data["total"] = recordcount
+	data["code"] = 0
+	data["message"] = "ok"
+	if pagecount > 0 {
+		data["pages"] = math.Ceil(float64(recordcount) / float64(pagecount))
+		data["pageNum"] = math.Ceil(float64(offset+1) / float64(pagecount))
+	}
+	data["pageSize"] = pagecount
+
+	appG.Response(http.StatusOK, e.SUCCESS, data)
+}
+
+func GetAveragePrice(c *gin.Context) {
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	offset := fsion.Get("offset").ValueDefaultInt(0)
+	pagecount := fsion.Get("pagecount").ValueDefaultInt(0)
+	parammaps := fsion.Get("parammaps")
+	productclass := parammaps.Get("productclassid").ValueStr()
+	productid := parammaps.Get("productid").ValueInt64()
+	starttime := parammaps.Get("starttime").ValueStr()
+	endtime := parammaps.Get("endtime").ValueStr()
+	productname := parammaps.Get("productname").ValueStr()
+	userid := parammaps.Get("userid").ValueStr()
+
+	var productidlist []string
+	if productid != 0 {
+		productidlist = append(productidlist, fmt.Sprintf("%d", productid))
+	}
+	data := make(map[string]interface{})
+	var err error
+	queryData := make([]map[string]interface{}, 0)
+	var recordcount int
+
+	tx := restful.Engine.NewSession()
+	defer tx.Close()
+	if userid != "" {
+		productidmap, err := tx.SQL("select Productid as productid from attention where userid = ?", userid).Query().List()
+		if err != nil {
+			log.Println("GetAveragePrice-err1: ", err)
+			appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+			return
+		}
+		for _, product := range productidmap {
+			productidlist = append(productidlist, fmt.Sprintf("%v", product["productid"]))
+		}
+		if len(productidlist) == 0 {
+			appG.Response(http.StatusOK, e.SUCCESS, data)
+			return
+		}
+	}
+	{
+		sqlstr := `select t1.id as productid,t1.productname,t1.productclass,ifnull(t1.spec,"") as 	specifications ,ifnull(t2.unitname,"") as unitname from productinfo  t1  
+		join prounit  t2 on t2.id = t1.prounit join productclass t3 on t3.id = t1.productclass   where 1=1  and t1.enable = 1 `
+
+		var args []interface{}
+		if len(productclass) > 0 {
+			sqlstr += fmt.Sprintf(" and t1.productclass in (%s)", productclass)
+		}
+		if len(productname) > 0 {
+			sqlstr += " and t1.productname like CONCAT('%',?,'%')"
+			args = append(args, productname)
+		}
+		// if productid != 0 {
+		// 	sqlstr += " and t1.id in (?) "
+		// 	args = append(args, strings.Join(productidlist, ","))
+		// }
+		if len(productidlist) > 0 {
+			sqlstr += fmt.Sprintf(" and t1.id in (%s) ", strings.Join(productidlist, ","))
+		}
+		sqlstr += " order by t3.ordernum,t3.id,t1.ordernum,t1.id"
+		if pagecount > 0 && productid == 0 {
+			sqlstr += "  limit ?,?"
+			args = append(args, (offset-1)*pagecount, pagecount)
+		}
+
+		productrow := tx.SQL(sqlstr, args...)
+		defer productrow.Close()
+		queryData, err = productrow.Query().List()
+		if err != nil {
+			log.Println("GetAveragePrice-err1: ", err)
+			appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+			return
+		}
+		if productid == 0 {
+			var args1 []interface{}
+			sqlstr1 := `select t1.id from productinfo  t1  
+		join prounit  t2 on t2.id = t1.prounit  where 1=1  and t1.enable = 1 `
+
+			if len(productclass) > 0 {
+				sqlstr1 += fmt.Sprintf(" and t1.productclass in (%s) ", productclass)
+			}
+
+			if len(productname) > 0 {
+				sqlstr1 += " and t1.productname like CONCAT('%',?,'%')"
+				args1 = append(args1, productname)
+			}
+			if len(productidlist) > 0 {
+				sqlstr1 += fmt.Sprintf(" and t1.id in (%s) ", strings.Join(productidlist, ","))
+			}
+			row := tx.SQL(sqlstr1, args1...)
+			defer row.Close()
+			count, err := row.Query().Count()
+			if err != nil {
+				log.Println("GetAveragePrice-err2: ", err)
+				appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+				return
+			}
+			recordcount = count
+			defer row.Close()
+		}
+		defer productrow.Close()
+	}
+
+	// productidlist := []string{"0"}
+	for _, data := range queryData {
+		productidlist = append(productidlist, strconv.FormatInt(data["productid"].(int64), 10))
+	}
+
+	type areaid struct {
+		areaid   int64
+		name     string
+		parentid int64
+		layer    int64
+		sort     int64
+	}
+
+	headlist := make([]map[string]interface{}, 0)
+	if len(productidlist) > 0 {
+		sqlstr := `select t1.id,t1.name,t1.parent_id as parentid ,t1.layer,t1.ord  from canton t1 
+		join (select DISTINCT(areaid) as areaid,t2.name from productarea t1 join canton t2 on t2.id = t1.areaid  
+		where productid in (%s)) t2 on (t1.id = t2.areaid or t1.PARENT_ID = t2.areaid)`
+		arearow := tx.SQL(fmt.Sprintf(sqlstr, strings.Join(productidlist, ",")))
+		areaData, err := arearow.Query().List()
+		if err != nil {
+			log.Println("GetAveragePrice-err3: ", err)
+			appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+			return
+		}
+
+		bigarea := make([]*areaid, 0)
+		for _, area := range areaData {
+			if area["layer"].(int64) == 1 {
+				bigarea = append(bigarea, &areaid{
+					areaid:   area["id"].(int64),
+					name:     area["name"].(string),
+					parentid: area["parentid"].(int64),
+					layer:    area["layer"].(int64),
+					sort:     area["ord"].(int64),
+				})
+			}
+		}
+
+		sort.Slice(bigarea, func(i, j int) bool {
+			return bigarea[i].areaid < bigarea[j].areaid // 升序
+		})
+		sort.Slice(bigarea, func(i, j int) bool {
+			return bigarea[i].sort < bigarea[j].sort // 升序
+		})
+
+		for _, big := range bigarea {
+			head := make(map[string]interface{})
+			head["column_id"] = big.areaid
+			head["column_name"] = fmt.Sprintf("column_%d", big.areaid)
+			head["column_title"] = big.name
+			smallarea := make([]*areaid, 0)
+			for _, area := range areaData {
+				if area["parentid"].(int64) == big.areaid {
+					smallarea = append(smallarea, &areaid{
+						areaid:   area["id"].(int64),
+						name:     area["name"].(string),
+						parentid: area["parentid"].(int64),
+						layer:    area["layer"].(int64),
+						sort:     area["ord"].(int64),
+					})
+				}
+			}
+			sort.Slice(smallarea, func(i, j int) bool {
+				return smallarea[i].areaid < smallarea[j].areaid // 升序
+			})
+			sort.Slice(smallarea, func(i, j int) bool {
+				return smallarea[i].sort < smallarea[j].sort // 升序
+			})
+			smallhead := make([]map[string]interface{}, 0)
+			for _, small := range smallarea {
+				data1 := make(map[string]interface{})
+				data1["column_id"] = small.areaid
+				data1["column_name"] = fmt.Sprintf("column_%d", small.areaid)
+				data1["column_title"] = small.name
+				smallhead = append(smallhead, data1)
+			}
+			head["headlist"] = smallhead
+			headlist = append(headlist, head)
+		}
+
+		type priceStruct struct {
+			marketid  int64
+			price     float64
+			pricedate string
+		}
+		priceMap := make(map[int64][]priceStruct)
+		if productid == 0 {
+
+			productpricesql := `SELECT  productid,marketid as smallareaid , marketclass as bigareaid,avg(price) as price,pricedate FROM (
+					SELECT * FROM productprice WHERE productid in (%s) ORDER BY pricedate DESC limit 10000000000000000
+					) AS t  where 1=1 `
+
+			if starttime != "" && endtime != "" {
+				productpricesql += fmt.Sprintf("  and pricedate BETWEEN '%s' and '%s' ", fmt.Sprintf("%s 00:00:00", starttime), fmt.Sprintf("%s 23:59:59", endtime))
+			}
+
+			productpricesql += " group by productid, marketid  "
+			if offset != 0 || pagecount != 0 {
+				productpricesql += fmt.Sprintf("  limit %d,%d", (offset-1)*pagecount, pagecount)
+			}
+			productpricerow := tx.SQL(fmt.Sprintf(productpricesql, strings.Join(productidlist, ",")))
+			defer productpricerow.Close()
+			productpriceData, err := productpricerow.Query().List()
+			if err != nil {
+				log.Println("GetAveragePrice-err4: ", err)
+				appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+				return
+			}
+
+			for _, productprice := range productpriceData {
+				price, err := strconv.ParseFloat(productprice["price"].(string), 64)
+				if err != nil {
+					log.Println("GetAveragePrice-err6: ", err)
+					appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+					return
+				}
+				priceMap[productprice["productid"].(int64)] = append(priceMap[productprice["productid"].(int64)], priceStruct{
+					marketid: productprice["smallareaid"].(int64),
+					price:    utils.Round(price, 2),
+				})
+			}
+
+			for _, query := range queryData {
+				for _, area := range areaData {
+					if area["layer"].(int64) == 2 {
+						query[fmt.Sprintf("column_%v", area["id"])] = 0
+					}
+				}
+				query["Edit"] = false
+				query["NoEdit"] = true
+				query["isCreate"] = false
+				query["isUpdate"] = true
+				query["isUpdateSave"] = false
+			}
+
+			for _, query := range queryData {
+				for _, price := range priceMap[query["productid"].(int64)] {
+					query[fmt.Sprintf("column_%d", price.marketid)] = price.price
+				}
+			}
+			data["list"] = queryData
+		} else {
+			timesql := `SELECT  date_format(pricedate, '%%Y-%%c-%%d') as pricedate FROM (
+				SELECT * FROM productprice WHERE productid in (%s) ORDER BY pricedate desc limit 10000000000000000
+				) AS t  where 1=1  group by date_format(pricedate, '%%Y-%%c-%%d')  ORDER BY pricedate desc `
+
+			count, err := tx.SQL(fmt.Sprintf(timesql, strings.Join(productidlist, ","))).Query().Count()
+			if err != nil {
+				log.Println("GetAveragePrice-err4: ", err)
+				appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+				return
+			}
+			recordcount = int(count)
+			dates := []string{}
+
+			if offset != 0 || pagecount != 0 {
+				timesql += fmt.Sprintf("  limit %d,%d", (offset-1)*pagecount, pagecount)
+			}
+			timeData, err := tx.SQL(fmt.Sprintf(timesql, strings.Join(productidlist, ","))).Query().List()
+			if err != nil {
+				log.Println("GetAveragePrice-err5: ", err)
+				appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+				return
+			}
+
+			productpricesql := `SELECT  productid,marketid as smallareaid , marketclass as bigareaid,avg(price) as price,date_format(pricedate, '%%Y-%%c-%%d') as pricedate FROM (
+				SELECT * FROM productprice WHERE productid in (%s) ORDER BY pricedate DESC limit 10000000000000000
+				) AS t  where 1=1 `
+			if len(timeData) > 0 {
+				starttime = fmt.Sprintf("%s 00:00:00", timeData[len(timeData)-1]["pricedate"].(string))
+				endtime = fmt.Sprintf("%s 23:59:59", timeData[0]["pricedate"].(string))
+				productpricesql += fmt.Sprintf("  and pricedate BETWEEN '%s' and '%s' ", fmt.Sprintf("%s 00:00:00", starttime), fmt.Sprintf("%s 23:59:59", endtime))
+
+			}
+
+			productpricesql += " group by marketid,date_format(pricedate, '%%Y-%%c-%%d')   "
+			productpricerow := tx.SQL(fmt.Sprintf(productpricesql, strings.Join(productidlist, ",")))
+			defer productpricerow.Close()
+			productpriceData, err := productpricerow.Query().List()
+			if err != nil {
+				log.Println("GetAveragePrice-err6: ", err)
+				appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+				return
+			}
+
+			for _, productprice := range productpriceData {
+				dates = append(dates, productprice["pricedate"].(string))
+				price, err := strconv.ParseFloat(productprice["price"].(string), 64)
+				if err != nil {
+					log.Println("GetAveragePrice-err7: ", err)
+					appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+					return
+				}
+				priceMap[productprice["productid"].(int64)] = append(priceMap[productprice["productid"].(int64)], priceStruct{
+					marketid:  productprice["smallareaid"].(int64),
+					price:     utils.Round(price, 2),
+					pricedate: productprice["pricedate"].(string),
+				})
+			}
+			datelist := utils.RemoveRepeatedElement(dates)
+			sort.Sort(sort.Reverse(sort.StringSlice(datelist)))
+
+			productmap := make([]map[string]interface{}, 0)
+			for _, date := range datelist {
+				product := make(map[string]interface{}, 0)
+				product["productid"] = productid
+				for _, query := range queryData {
+					if query["productid"].(int64) == productid {
+						product["productclass"] = query["productclass"]
+						product["productname"] = query["productname"]
+						product["unitname"] = query["unitname"]
+						product["specifications"] = query["specifications"]
+						break
+					}
+				}
+				for _, area := range areaData {
+					if area["layer"].(int64) == 2 {
+						product[fmt.Sprintf("column_%v", area["id"])] = 0
+					}
+				}
+				product["Edit"] = false
+				product["NoEdit"] = true
+				product["isCreate"] = false
+				product["isUpdate"] = true
+				product["isUpdateSave"] = false
+				product["pricedate"] = date
+				for _, price := range priceMap[product["productid"].(int64)] {
+					if date == price.pricedate {
+						product[fmt.Sprintf("column_%d", price.marketid)] = price.price
+					}
+				}
+				productmap = append(productmap, product)
+			}
+
+			data["list"] = productmap
+		}
+	}
+	data["headlist"] = headlist
+	data["total"] = recordcount
+	data["code"] = 0
+	data["message"] = "ok"
+	if pagecount > 0 {
+		data["pages"] = math.Ceil(float64(recordcount) / float64(pagecount))
+		data["pageNum"] = math.Ceil(float64(offset+1) / float64(pagecount))
+	}
+	data["pageSize"] = pagecount
+
+	appG.Response(http.StatusOK, e.SUCCESS, data)
+}
+
+//查看平均价格图标信息
+func GetQuotationChart(c *gin.Context) {
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	parammaps := fsion.Get("parammaps")
+	productid := parammaps.Get("productid").ValueInt64()
+
+	tx := restful.Engine.NewSession()
+	defer tx.Close()
+
+	areamap, err := tx.SQL("select name from  canton t1   join productarea t2 on t2.productid = ? and t1.PARENT_ID = t2.areaid where layer = 2 ", productid).Query().List()
+	if err != nil {
+		log.Println("GetQuotationChart-err0: ", err)
+		appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+		return
+	}
+
+	sqlstr := `select  avg(t1.price) as price , date_format(t1.pricedate, '%Y-%c-%d') as date ,t2.name  from  productprice t1
+	join canton t2 on t2.id = t1.marketid  where t1.productid = ?  group by  date,name order by date  desc `
+
+	priceData, err := tx.SQL(sqlstr, productid).Query().List()
+	if err != nil {
+		log.Println("GetQuotationChart-err1: ", err)
+		appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+		return
+	}
+
+	datelist := []string{}
+	daylist := []interface{}{}
+	for _, price := range priceData {
+		datelist = append(datelist, price["date"].(string))
+	}
+
+	days := utils.RemoveRepeatedElement(datelist)
+	sort.Sort(sort.Reverse(sort.StringSlice(days)))
+
+	for _, day := range days {
+		daylist = append(daylist, day)
+	}
+
+	var list [][]interface{}
+
+	namelist := []interface{}{}
+	for _, area := range areamap {
+		namelist = append(namelist, area["name"].(string))
+	}
+
+	list = append(list, namelist)
+	list = append(list, daylist)
+	for _, name := range namelist {
+		pricelist := []interface{}{}
+		for _, day := range daylist {
+			exist := false
+			for _, pricemap := range priceData {
+				if pricemap["name"].(string) == name.(string) && day.(string) == pricemap["date"].(string) {
+					price, err := strconv.ParseFloat(pricemap["price"].(string), 64)
+					if err != nil {
+						log.Println("GetAveragePrice-err6: ", err)
+						appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+						return
+					}
+					pricelist = append(pricelist, utils.Round(price, 2))
+					exist = true
+				}
+			}
+			if !exist {
+				pricelist = append(pricelist, 0)
+			}
+		}
+		list = append(list, pricelist)
+	}
+	appG.Response(http.StatusOK, e.SUCCESS, list)
+}
+
+func AttentionProduce(c *gin.Context) {
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	userid := fsion.Get("userid").ValueStr()
+	params := fsion.Get("params").Array()
+
+	tx := restful.Engine.NewSession()
+	defer tx.Close()
+	productids := []string{}
+	for _, product := range params {
+		productids = append(productids, product.ValueStr())
+		exist, err := tx.SQL("select id from attention where userid = ? and productid = ? ", userid, product.ValueInt64()).Exist()
+		if err != nil {
+			log.Println("AttentionProduce-err1: ", err)
+			appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+			return
+		}
+		if !exist {
+			_, err := tx.SQL("insert into attention(userid,productid)values(?,?)", userid, product.ValueInt64()).Execute()
+			if err != nil {
+				log.Println("AttentionProduce-err2: ", err)
+				appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+				return
+			}
+		}
+	}
+	if len(productids) == 0 {
+		productids = append(productids, "0")
+	}
+	_, err := tx.SQL(fmt.Sprintf("delete from attention where userid = ? and productid not in(%s)", strings.Join(productids, ",")), userid).Execute()
+	if err != nil {
+		log.Println("AttentionProduce-err3: ", err)
+		appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+		return
+	}
+	appG.Response(http.StatusOK, e.SUCCESS, true)
+}
+
+func GetAveragePriceExcel(c *gin.Context) {
+	appG := app.Gin{C: c}
+	dataByte, _ := ioutil.ReadAll(c.Request.Body)
+	fsion := gofasion.NewFasion(string(dataByte))
+	offset := fsion.Get("offset").ValueDefaultInt(0)
+	pagecount := fsion.Get("pagecount").ValueDefaultInt(0)
+	parammaps := fsion.Get("parammaps")
+	productclass := parammaps.Get("productclassid").ValueStr()
+	productid := parammaps.Get("productid").ValueInt64()
+	starttime := parammaps.Get("starttime").ValueStr()
+	endtime := parammaps.Get("endtime").ValueStr()
+	productname := parammaps.Get("productname").ValueStr()
+	userid := parammaps.Get("userid").ValueStr()
+	username := parammaps.Get("empname").ValueStr()
+
+	// var productidlist []string
+	// if productid != 0 {
+	// 	productidlist = append(productidlist, fmt.Sprintf("%d", productid))
+	// }
+	// data := make(map[string]interface{})
+	// var err error
+	// queryData := make([]map[string]interface{}, 0)
+
+	var productidlist []string
+	if productid != 0 {
+		productidlist = append(productidlist, fmt.Sprintf("%d", productid))
+	}
+	data := make(map[string]interface{})
+	var err error
+	queryData := make([]map[string]interface{}, 0)
+	// var recordcount int
+
+	tx := restful.Engine.NewSession()
+	defer tx.Close()
+	if userid != "" {
+		productidmap, err := tx.SQL("select Productid as productid from attention where userid = ?", userid).Query().List()
+		if err != nil {
+			log.Println("GetAveragePrice-err1: ", err)
+			appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+			return
+		}
+		for _, product := range productidmap {
+			productidlist = append(productidlist, fmt.Sprintf("%v", product["productid"]))
+		}
+		if len(productidlist) == 0 {
+			appG.Response(http.StatusOK, e.SUCCESS, data)
+			return
+		}
+	}
+	{
+		sqlstr := `select  t3.classname,t1.id as productid,t1.productname,t1.productclass,ifnull(t1.spec,"") as 	specifications ,ifnull(t2.unitname,"") as unitname from productinfo  t1  
+		join prounit  t2 on t2.id = t1.prounit join productclass t3 on t3.id = t1.productclass   where 1=1  and t1.enable = 1 `
+
+		var args []interface{}
+		if len(productclass) > 0 {
+			sqlstr += fmt.Sprintf(" and t1.productclass in (%s)", productclass)
+		}
+		if len(productname) > 0 {
+			sqlstr += " and t1.productname like CONCAT('%',?,'%')"
+			args = append(args, productname)
+		}
+		// if productid != 0 {
+		// 	sqlstr += " and t1.id in (?) "
+		// 	args = append(args, strings.Join(productidlist, ","))
+		// }
+		if len(productidlist) > 0 {
+			sqlstr += fmt.Sprintf(" and t1.id in (%s) ", strings.Join(productidlist, ","))
+		}
+		sqlstr += " order by t3.ordernum,t3.id,t1.ordernum,t1.id"
+		// if pagecount > 0 && productid == 0 {
+		// 	sqlstr += "  limit ?,?"
+		// 	args = append(args, (offset-1)*pagecount, pagecount)
+		// }
+
+		productrow := tx.SQL(sqlstr, args...)
+		defer productrow.Close()
+		queryData, err = productrow.Query().List()
+		if err != nil {
+			log.Println("GetAveragePrice-err1: ", err)
+			appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+			return
+		}
+		// if productid == 0 {
+		// 	var args1 []interface{}
+		// 	sqlstr1 := `select t1.id from productinfo  t1
+		// join prounit  t2 on t2.id = t1.prounit  where 1=1  and t1.enable = 1 `
+
+		// 	if len(productclass) > 0 {
+		// 		sqlstr1 += fmt.Sprintf(" and t1.productclass in (%s) ", productclass)
+		// 	}
+
+		// 	if len(productname) > 0 {
+		// 		sqlstr1 += " and t1.productname like CONCAT('%',?,'%')"
+		// 		args1 = append(args1, productname)
+		// 	}
+		// 	if len(productidlist) > 0 {
+		// 		sqlstr1 += fmt.Sprintf(" and t1.id in (%s) ", strings.Join(productidlist, ","))
+		// 	}
+		// 	row := tx.SQL(sqlstr1, args1...)
+		// 	defer row.Close()
+		// 	count, err := row.Query().Count()
+		// 	if err != nil {
+		// 		log.Println("GetAveragePrice-err2: ", err)
+		// 		appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+		// 		return
+		// 	}
+		// 	recordcount = count
+		// 	defer row.Close()
+		// }
+		defer productrow.Close()
+	}
+
+	// productidlist := []string{"0"}
+	for _, data := range queryData {
+		productidlist = append(productidlist, strconv.FormatInt(data["productid"].(int64), 10))
+	}
+
+	type areaid struct {
+		areaid   int64
+		name     string
+		parentid int64
+		layer    int64
+		sort     int64
+	}
+
+	headlist := make([]map[string]interface{}, 0)
+	if len(productidlist) > 0 {
+		sqlstr := `select t1.id,t1.name,t1.parent_id as parentid ,t1.layer,t1.ord  from canton t1 
+		join (select DISTINCT(areaid) as areaid,t2.name from productarea t1 join canton t2 on t2.id = t1.areaid  
+		where productid in (%s)) t2 on (t1.id = t2.areaid or t1.PARENT_ID = t2.areaid)`
+		arearow := tx.SQL(fmt.Sprintf(sqlstr, strings.Join(productidlist, ",")))
+		areaData, err := arearow.Query().List()
+		if err != nil {
+			log.Println("GetAveragePrice-err3: ", err)
+			appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+			return
+		}
+
+		bigarea := make([]*areaid, 0)
+		for _, area := range areaData {
+			if area["layer"].(int64) == 1 {
+				bigarea = append(bigarea, &areaid{
+					areaid:   area["id"].(int64),
+					name:     area["name"].(string),
+					parentid: area["parentid"].(int64),
+					layer:    area["layer"].(int64),
+					sort:     area["ord"].(int64),
+				})
+			}
+		}
+
+		sort.Slice(bigarea, func(i, j int) bool {
+			return bigarea[i].areaid < bigarea[j].areaid // 升序
+		})
+		sort.Slice(bigarea, func(i, j int) bool {
+			return bigarea[i].sort < bigarea[j].sort // 升序
+		})
+
+		for _, big := range bigarea {
+			head := make(map[string]interface{})
+			head["column_id"] = big.areaid
+			head["column_name"] = fmt.Sprintf("column_%d", big.areaid)
+			head["column_title"] = big.name
+			smallarea := make([]*areaid, 0)
+			for _, area := range areaData {
+				if area["parentid"].(int64) == big.areaid {
+					smallarea = append(smallarea, &areaid{
+						areaid:   area["id"].(int64),
+						name:     area["name"].(string),
+						parentid: area["parentid"].(int64),
+						layer:    area["layer"].(int64),
+						sort:     area["ord"].(int64),
+					})
+				}
+			}
+			sort.Slice(smallarea, func(i, j int) bool {
+				return smallarea[i].areaid < smallarea[j].areaid // 升序
+			})
+			sort.Slice(smallarea, func(i, j int) bool {
+				return smallarea[i].sort < smallarea[j].sort // 升序
+			})
+			smallhead := make([]map[string]interface{}, 0)
+			for _, small := range smallarea {
+				data1 := make(map[string]interface{})
+				data1["column_id"] = small.areaid
+				data1["column_name"] = fmt.Sprintf("column_%d", small.areaid)
+				data1["column_title"] = small.name
+				smallhead = append(smallhead, data1)
+			}
+			head["headlist"] = smallhead
+			headlist = append(headlist, head)
+		}
+
+		type priceStruct struct {
+			marketid  int64
+			price     float64
+			pricedate string
+		}
+		priceMap := make(map[int64][]priceStruct)
+		if productid == 0 {
+
+			productpricesql := `SELECT  productid,marketid as smallareaid , marketclass as bigareaid,avg(price) as price,pricedate FROM (
+					SELECT * FROM productprice WHERE productid in (%s) ORDER BY pricedate DESC limit 10000000000000000
+					) AS t  where 1=1 `
+
+			if starttime != "" && endtime != "" {
+				productpricesql += fmt.Sprintf("  and pricedate BETWEEN '%s' and '%s' ", fmt.Sprintf("%s 00:00:00", starttime), fmt.Sprintf("%s 23:59:59", endtime))
+			}
+
+			productpricesql += " group by productid, marketid  "
+			if offset != 0 || pagecount != 0 {
+				productpricesql += fmt.Sprintf("  limit %d,%d", (offset-1)*pagecount, pagecount)
+			}
+			productpricerow := tx.SQL(fmt.Sprintf(productpricesql, strings.Join(productidlist, ",")))
+			defer productpricerow.Close()
+			productpriceData, err := productpricerow.Query().List()
+			if err != nil {
+				log.Println("GetAveragePrice-err4: ", err)
+				appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+				return
+			}
+
+			for _, productprice := range productpriceData {
+				price, err := strconv.ParseFloat(productprice["price"].(string), 64)
+				if err != nil {
+					log.Println("GetAveragePrice-err6: ", err)
+					appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+					return
+				}
+				priceMap[productprice["productid"].(int64)] = append(priceMap[productprice["productid"].(int64)], priceStruct{
+					marketid: productprice["smallareaid"].(int64),
+					price:    utils.Round(price, 2),
+				})
+			}
+
+			for _, query := range queryData {
+				for _, area := range areaData {
+					if area["layer"].(int64) == 2 {
+						query[fmt.Sprintf("column_%v", area["id"])] = 0
+					}
+				}
+				query["Edit"] = false
+				query["NoEdit"] = true
+				query["isCreate"] = false
+				query["isUpdate"] = true
+				query["isUpdateSave"] = false
+			}
+
+			for _, query := range queryData {
+				for _, price := range priceMap[query["productid"].(int64)] {
+					query[fmt.Sprintf("column_%d", price.marketid)] = price.price
+				}
+			}
+			data["list"] = queryData
+		} else {
+			timesql := `SELECT  date_format(pricedate, '%%Y-%%c-%%d') as pricedate FROM (
+				SELECT * FROM productprice WHERE productid in (%s) ORDER BY pricedate desc limit 10000000000000000
+				) AS t  where 1=1  group by date_format(pricedate, '%%Y-%%c-%%d')  ORDER BY pricedate desc `
+
+			// count, err := tx.SQL(fmt.Sprintf(timesql, strings.Join(productidlist, ","))).Query().Count()
+			// if err != nil {
+			// 	log.Println("GetAveragePrice-err4: ", err)
+			// 	appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+			// 	return
+			// }
+			// recordcount = int(count)
+			dates := []string{}
+
+			if offset != 0 || pagecount != 0 {
+				timesql += fmt.Sprintf("  limit %d,%d", (offset-1)*pagecount, pagecount)
+			}
+			timeData, err := tx.SQL(fmt.Sprintf(timesql, strings.Join(productidlist, ","))).Query().List()
+			if err != nil {
+				log.Println("GetAveragePrice-err5: ", err)
+				appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+				return
+			}
+
+			productpricesql := `SELECT  productid,marketid as smallareaid , marketclass as bigareaid,avg(price) as price,date_format(pricedate, '%%Y-%%c-%%d') as pricedate FROM (
+				SELECT * FROM productprice WHERE productid in (%s) ORDER BY pricedate DESC limit 10000000000000000
+				) AS t  where 1=1 `
+			if len(timeData) > 0 {
+				starttime = fmt.Sprintf("%s 00:00:00", timeData[len(timeData)-1]["pricedate"].(string))
+				endtime = fmt.Sprintf("%s 23:59:59", timeData[0]["pricedate"].(string))
+				productpricesql += fmt.Sprintf("  and pricedate BETWEEN '%s' and '%s' ", fmt.Sprintf("%s 00:00:00", starttime), fmt.Sprintf("%s 23:59:59", endtime))
+
+			}
+
+			productpricesql += " group by marketid,date_format(pricedate, '%%Y-%%c-%%d')   "
+			productpricerow := tx.SQL(fmt.Sprintf(productpricesql, strings.Join(productidlist, ",")))
+			defer productpricerow.Close()
+			productpriceData, err := productpricerow.Query().List()
+			if err != nil {
+				log.Println("GetAveragePrice-err6: ", err)
+				appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+				return
+			}
+
+			for _, productprice := range productpriceData {
+				dates = append(dates, productprice["pricedate"].(string))
+				price, err := strconv.ParseFloat(productprice["price"].(string), 64)
+				if err != nil {
+					log.Println("GetAveragePrice-err7: ", err)
+					appG.Response(http.StatusInternalServerError, e.ERROR, nil)
+					return
+				}
+				priceMap[productprice["productid"].(int64)] = append(priceMap[productprice["productid"].(int64)], priceStruct{
+					marketid:  productprice["smallareaid"].(int64),
+					price:     utils.Round(price, 2),
+					pricedate: productprice["pricedate"].(string),
+				})
+			}
+			datelist := utils.RemoveRepeatedElement(dates)
+			sort.Sort(sort.Reverse(sort.StringSlice(datelist)))
+
+			productmap := make([]map[string]interface{}, 0)
+			for _, date := range datelist {
+				product := make(map[string]interface{}, 0)
+				product["productid"] = productid
+				for _, query := range queryData {
+					if query["productid"].(int64) == productid {
+						product["productclass"] = query["productclass"]
+						product["productname"] = query["productname"]
+						product["unitname"] = query["unitname"]
+						product["specifications"] = query["specifications"]
+						product["classname"] = query["classname"]
+						break
+					}
+				}
+				for _, area := range areaData {
+					if area["layer"].(int64) == 2 {
+						product[fmt.Sprintf("column_%v", area["id"])] = 0
+					}
+				}
+				product["Edit"] = false
+				product["NoEdit"] = true
+				product["isCreate"] = false
+				product["isUpdate"] = true
+				product["isUpdateSave"] = false
+				product["pricedate"] = date
+				for _, price := range priceMap[product["productid"].(int64)] {
+					if date == price.pricedate {
+						product[fmt.Sprintf("column_%d", price.marketid)] = price.price
+					}
+				}
+				productmap = append(productmap, product)
+			}
+
+			data["list"] = productmap
+		}
+	}
+	var file *xlsx.File
+	var sheet *xlsx.Sheet
+	var row *xlsx.Row
+	var cell *xlsx.Cell
+	style := xlsx.NewStyle()
+	style.Alignment = xlsx.Alignment{
+		Horizontal:  "center",
+		Vertical:    "center",
+		WrapText:    true,
+		ShrinkToFit: true,
+	}
+
+	file = xlsx.NewFile()
+	sheet, _ = file.AddSheet("Sheet1")
+	row = sheet.AddRow()
+
+	cell = row.AddCell()
+	classnum := make(map[string]int64)
+	datamap := make(map[string][]interface{})
+	classlist := []string{}
+	fmt.Println(data["list"].([]map[string]interface{})[:10])
+	for _, data := range data["list"].([]map[string]interface{}) {
+		exist := false
+		for _, class := range classlist {
+			if data["classname"].(string) == class {
+				exist = true
+			}
+		}
+		if !exist {
+			classlist = append(classlist, data["classname"].(string))
+		}
+		classnum[data["classname"].(string)]++
+		datamap[data["classname"].(string)] = append(datamap[data["classname"].(string)], data)
+	}
+	exceltitle := "品种: "
+	for _, v := range classlist {
+		exceltitle += v + ","
+	}
+	exceltitle = exceltitle[:len(exceltitle)-1]
+	exceltitle = fmt.Sprintf("%s  用户: %s", exceltitle, username)
+	cell.Value = exceltitle
+	cell.Merge(len(datamap), 2)
+	cell.SetStyle(style)
+
+	row = sheet.AddRow()
+	cell = row.AddCell()
+	row = sheet.AddRow()
+	cell = row.AddCell()
+
+	row = sheet.AddRow()
+	cell = row.AddCell()
+	cell.Value = "分类"
+	cell.Merge(0, 1)
+	cell.SetStyle(style)
+	cell = row.AddCell()
+	cell.Value = "序号"
+	cell.SetStyle(style)
+	cell.Merge(0, 1)
+	cell = row.AddCell()
+	cell.Value = "品名"
+	cell.SetStyle(style)
+	cell.Merge(0, 1)
+	cell = row.AddCell()
+	cell.Value = "规格"
+	cell.SetStyle(style)
+	cell.Merge(0, 1)
+	cell = row.AddCell()
+	cell.Value = "单位"
+	cell.SetStyle(style)
+	cell.Merge(0, 1)
+
+	if data["list"] == nil {
+		_ = file.Write(c.Writer)
+		return
+	}
+	v := 0
+	for _, data := range headlist {
+		for i := 0; i < v; i++ {
+			cell = row.AddCell()
+			cell.Value = ""
+		}
+		cell = row.AddCell()
+		cell.Value = data["column_title"].(string)
+		cell.SetStyle(style)
+		head := data["headlist"].([]map[string]interface{})
+		hcells := len(head) - 1
+		cell.Merge(hcells, 0)
+		v = hcells
+	}
+	row = sheet.AddRow()
+	for i := 0; i < 5; i++ {
+		cell = row.AddCell()
+		cell.Value = ""
+	}
+
+	var datatitle []string
+	for _, data := range headlist {
+		headlist := data["headlist"].([]map[string]interface{})
+		for _, head := range headlist {
+			cell = row.AddCell()
+			cell.SetStyle(style)
+			cell.Value = head["column_title"].(string)
+			datatitle = append(datatitle, head["column_name"].(string))
+		}
+	}
+
+	i := 0
+	for _, v := range classlist {
+		row = sheet.AddRow()
+		cell = row.AddCell()
+		cell.SetStyle(style)
+		cell.Value = v
+		cell.Merge(0, int(classnum[v])-1)
+		n := len(datamap[v]) - 1
+		for m, data := range datamap[v] {
+			avgdata := data.(map[string]interface{})
+			i++
+			cell = row.AddCell()
+			cell.SetStyle(style)
+			cell.SetValue(i)
+
+			cell = row.AddCell()
+			cell.SetStyle(style)
+			cell.SetValue(avgdata["productname"])
+
+			cell = row.AddCell()
+			cell.SetStyle(style)
+			cell.SetValue(avgdata["specifications"])
+
+			cell = row.AddCell()
+			cell.SetStyle(style)
+			cell.SetValue(avgdata["unitname"])
+			for _, title := range datatitle {
+				var value float64
+				if _, ok := avgdata[title].(float64); ok {
+					value = avgdata[title].(float64)
+				}
+				cell = row.AddCell()
+				cell.SetStyle(style)
+				// value := avgdata[title].(float64)
+				cell.SetValue(value)
+			}
+
+			if n != m {
+				row = sheet.AddRow()
+				cell = row.AddCell()
+			}
+		}
+	}
+	row = sheet.AddRow()
+	cell = row.AddCell()
+	cell.Merge(len(datamap), 0)
+	cell.Value = "备注:1、本网站市场价格为市场现金交易价。配送价为配送到酒店的价格(含运输费,发票,15天帐期)。"
+	row = sheet.AddRow()
+	cell = row.AddCell()
+	cell.Merge(len(datamap), 0)
+	cell.Value = "     2、本网站蔬菜类价格主要是市场上大量采购及供货商拿货时间段(凌晨4:00-6:00)的价格。"
+	row = sheet.AddRow()
+	cell = row.AddCell()
+	cell.Merge(len(datamap), 0)
+	cell.Value = "     3、会员企业可根据市场价格上浮一定比例给供应商定价,部分加工品种可根据加工程度另调上浮比例来定价。"
+
+	c.Header("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
+	c.Header("Content-Disposition", "attachment; filename="+"Workbook.xlsx")
+	c.Header("Content-Transfer-Encoding", "binary")
+
+	_ = file.Write(c.Writer)
+	// appG.Response(http.StatusOK, e.SUCCESS, nil)
+}

+ 26 - 16
routers/restful/sql_utils.go

@@ -1,19 +1,21 @@
 package restful
 
 import (
-	"../../pkg/setting"
 	"database/sql"
 	"errors"
 	"fmt"
-	_ "github.com/go-sql-driver/mysql"
-	"github.com/patrickmn/go-cache"
-	"github.com/tealeg/xlsx"
-	"github.com/xormplus/xorm"
+	"log"
 	"math"
 	"strconv"
 	"strings"
 	"time"
 	"unsafe"
+
+	"../../pkg/setting"
+	_ "github.com/go-sql-driver/mysql"
+	"github.com/patrickmn/go-cache"
+	"github.com/tealeg/xlsx"
+	"github.com/xormplus/xorm"
 )
 
 var (
@@ -107,6 +109,11 @@ func GetSqlByName(name string, tx *xorm.Session) (string, string) {
 		fmt.Println("param:" + param)
 		fmt.Println("==============")
 	}
+	fmt.Println("==============")
+	fmt.Println("apisql:" + sqls)
+	fmt.Println("--------------")
+	fmt.Println("param:" + param)
+	fmt.Println("==============")
 	return sqls, param
 }
 
@@ -406,7 +413,7 @@ func QueryByMap(sqlstr string, offset, count int, params []interface{}) (interfa
 	}
 	queryData := make([]map[string]interface{}, 1)
 	var err error
-	if (count == 0) {
+	if count == 0 {
 		queryData, err = Engine.SQL(sqlstr, params...).Query().List()
 	} else {
 		if count > 0 && offset > 0 {
@@ -465,7 +472,8 @@ func QueryByMapT(sqlstr string, offset, count int, params []interface{}, tx *xor
 	}
 	queryData := make([]map[string]interface{}, 1)
 	var err error
-	if (count == 0) {
+	if count == 0 {
+		fmt.Println(len(params))
 		queryData, err = tx.SQL(sqlstr, params...).Query().List()
 	} else {
 		if count > 0 && offset > 0 {
@@ -637,7 +645,7 @@ func QueryByList(sqlstr string, offset, count int, params []interface{}) (interf
 	if err := sqlCheckParam(sqlstr); err != nil {
 		return 0, err
 	}
-	if (count == 0) {
+	if count == 0 {
 		count = 1000
 	}
 	recordcount := int64(0)
@@ -650,7 +658,7 @@ func QueryByList(sqlstr string, offset, count int, params []interface{}) (interf
 	}
 	queryData := make([]map[string]interface{}, 1)
 	var err error
-	if (count == 0) {
+	if count == 0 {
 		queryData, err = Engine.SQL(sqlstr, params...).Query().List()
 	} else {
 		if count > 0 && offset > 0 {
@@ -697,7 +705,7 @@ func QueryByListList(sqlstr string, offset, count int, params []interface{}) (in
 	if err := sqlCheckParam(sqlstr); err != nil {
 		return 0, err
 	}
-	if (count == 0) {
+	if count == 0 {
 		count = 1000
 	}
 	recordcount := int64(0)
@@ -711,7 +719,7 @@ func QueryByListList(sqlstr string, offset, count int, params []interface{}) (in
 
 	queryData := make([]map[string]interface{}, 1)
 	var err error
-	if (count == 0) {
+	if count == 0 {
 		queryData, err = Engine.SQL(sqlstr, params...).Query().List()
 	} else {
 		if count > 0 && offset > 0 {
@@ -759,7 +767,7 @@ func QueryByListT(sqlstr string, offset, count int, params []interface{}, tx *xo
 	if err := sqlCheckParam(sqlstr); err != nil {
 		return 0, err
 	}
-	if (count == 0) {
+	if count == 0 {
 		count = 1000
 	}
 	recordcount := int64(0)
@@ -779,7 +787,7 @@ func QueryByListT(sqlstr string, offset, count int, params []interface{}, tx *xo
 	}
 	queryData := make([]map[string]interface{}, 1)
 	var err error
-	if (count == 0) {
+	if count == 0 {
 		queryData, err = tx.SQL(sqlstr, params...).Query().List()
 	} else {
 		if count > 0 && offset > 0 {
@@ -826,7 +834,7 @@ func QueryByListListT(sqlstr string, offset, count int, params []interface{}, tx
 	if err := sqlCheckParam(sqlstr); err != nil {
 		return 0, err
 	}
-	if (count == 0) {
+	if count == 0 {
 		count = 1000
 	}
 	recordcount := int64(0)
@@ -847,7 +855,7 @@ func QueryByListListT(sqlstr string, offset, count int, params []interface{}, tx
 
 	queryData := make([]map[string]interface{}, 1)
 	var err error
-	if (count == 0) {
+	if count == 0 {
 		queryData, err = tx.SQL(sqlstr, params...).Query().List()
 	} else {
 		if count > 0 && offset > 0 {
@@ -915,10 +923,12 @@ func ExecQuery(sqlstr string, params []interface{}) (interface{}, error) {
 }
 
 func ExecQueryT(sqlstr string, params []interface{}, tx *xorm.Session) (interface{}, error) {
+	fmt.Println(sqlstr)
 	if err := sqlCheckParam(sqlstr); err != nil {
+		log.Println(err)
 		return 0, err
 	}
-
+	fmt.Println(sqlstr)
 	rows, err := tx.SQL(sqlstr, params...).Execute()
 	if err != nil {
 

+ 21 - 10
routers/router.go

@@ -1,18 +1,21 @@
 package routers
 
 import (
+	"fmt"
+
 	"../comm"
 	_ "../docs"
-	"../middleware/jwt"
-	"fmt"
 	"github.com/gin-gonic/gin"
+	"github.com/kptyun/KPTCOMM/middleware/jwt"
+
 	//	"../middleware/permission"
+	"net/http"
+	"strings"
+
 	"../pkg/setting"
 	"../routers/api"
-	"github.com/swaggo/gin-swagger"
+	ginSwagger "github.com/swaggo/gin-swagger"
 	"github.com/swaggo/gin-swagger/swaggerFiles"
-	"net/http"
-	"strings"
 )
 
 func InitRouter() *gin.Engine {
@@ -31,15 +34,15 @@ func InitRouter() *gin.Engine {
 	r.Use(gin.Recovery())
 	gin.SetMode(setting.ServerSetting.RunMode)
 
-	r.Static("/static", setting.CurrentPath+"/dist/static") // 添加资源路径
-	r.Static("/datas", setting.CurrentPath+"/dist/datas")   // 添加资源路径
-	r.StaticFile("/", setting.CurrentPath+"/dist/index.html") //前端接口
+	r.Static("/static", setting.CurrentPath+"/dist/static")               // 添加资源路径
+	r.Static("/datas", setting.CurrentPath+"/dist/datas")                 // 添加资源路径
+	r.StaticFile("/", setting.CurrentPath+"/dist/index.html")             //前端接口
 	r.StaticFile("/favicon.ico", setting.CurrentPath+"/dist/favicon.ico") //前端接口
 	r.StaticFile("/myMap.json", setting.CurrentPath+"/data/myMap.json")   //前端接口
 	r.Static("/file", setting.CurrentPath+"/uploads/file")
 	r.Static("/uploads", setting.CurrentPath+"/uploads")
 	r.POST("/auth", api.Auth) // 获取登录token
-
+	r.GET("/getAveragePrice/excel", api.GetAveragePriceExcel)
 	r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) // API 注释
 
 	if setting.CommSetting.PortName != "" {
@@ -52,7 +55,6 @@ func InitRouter() *gin.Engine {
 	eqm.POST("/login", api.Auth)
 
 	apiV1 := r.Group("/authdata")
-
 	apiV1.Use(jwt.JWT()) // token 验证
 
 	{
@@ -86,6 +88,15 @@ func InitRouter() *gin.Engine {
 
 		apiV1.POST("/testdata", api.TestData)
 		apiV1.POST("/Testpartitions", api.Testpartitions)
+		//查看阳光餐饮产品地区信息
+		apiV1.POST("/getproductareas", api.GetProductAreas)
+		apiV1.POST("/productinfo", api.GetProductInfo)
+		apiV1.POST("/getpublishprice", api.GetPublishPrice)
+		apiV1.POST("/updatePublishPrice", api.UpdatePublishPrice)
+		apiV1.POST("/getAveragePrice", api.GetAveragePrice)
+		apiV1.POST("/getQuotationChart", api.GetQuotationChart)
+		apiV1.POST("/attentionProduce", api.AttentionProduce)
+		apiV1.POST("/getAveragePrice/excel", api.GetAveragePriceExcel)
 		// eas 对接
 		apiV1.POST("/EasSync", api.EasSync)
 	}

+ 5 - 3
test/main.go

@@ -1,8 +1,10 @@
 package main
 
+import "fmt"
+
 // eas 测试连接
 func main() {
-	//setting.Setup("")
+	// setting.Setup("")
 	//util.InitWebS(setting.ServerSetting.EasName,setting.ServerSetting.EasPassword,setting.ServerSetting.EasUrl)
 	//s,err:= util.EASWebServiceLogin(setting.ServerSetting.EasUrlTem)
 	//if err != nil {
@@ -10,6 +12,6 @@ func main() {
 	//}else{
 	//	fmt.Println("成功+++++++++++++++++",s,setting.ServerSetting.EasUrlTem,setting.ServerSetting.EasName,setting.ServerSetting.EasPassword)
 	//}
+	fmt.Println("aaaa")
 
-
-}
+}

+ 53 - 0
utils/utils.go

@@ -0,0 +1,53 @@
+package utils
+
+import (
+	"math"
+	"sort"
+)
+
+//Int64排序
+func QuickSort(a []int64, left int64, right int64) {
+	if left >= right {
+		return
+	}
+	temp := a[left]
+	start := left
+	stop := right
+	for right != left {
+		for right > left && a[right] >= temp {
+			right--
+		}
+		for left < right && a[left] <= temp {
+			left++
+		}
+		if right > left {
+			a[right], a[left] = a[left], a[right]
+		}
+	}
+	a[right], a[start] = temp, a[right]
+	QuickSort(a, start, left)
+	QuickSort(a, right+1, stop)
+}
+
+// 字符串去重
+func RemoveRepeatedElement(arr []string) (newArr []string) {
+	newArr = make([]string, 0)
+	sort.Strings(arr)
+	for i := 0; i < len(arr); i++ {
+		repeat := false
+		for j := i + 1; j < len(arr); j++ {
+			if arr[i] == arr[j] {
+				repeat = true
+				break
+			}
+		}
+		if !repeat {
+			newArr = append(newArr, arr[i])
+		}
+	}
+	return
+}
+func Round(f float64, n int) float64 {
+	n10 := math.Pow10(n)
+	return math.Trunc((f+0.5/n10)*n10) / n10
+}