正在显示
43 个修改的文件
包含
2416 行增加
和
10 行删除
| @@ -13,6 +13,7 @@ require ( | @@ -13,6 +13,7 @@ require ( | ||
| 13 | github.com/go-redis/redis v6.15.7+incompatible | 13 | github.com/go-redis/redis v6.15.7+incompatible |
| 14 | github.com/google/go-querystring v1.1.0 // indirect | 14 | github.com/google/go-querystring v1.1.0 // indirect |
| 15 | github.com/google/uuid v1.3.0 | 15 | github.com/google/uuid v1.3.0 |
| 16 | + github.com/hibiken/asynq v0.21.0 | ||
| 16 | github.com/imkira/go-interpol v1.1.0 // indirect | 17 | github.com/imkira/go-interpol v1.1.0 // indirect |
| 17 | github.com/linmadan/egglib-go v0.0.0-20210313060205-8b5e456b11f7 | 18 | github.com/linmadan/egglib-go v0.0.0-20210313060205-8b5e456b11f7 |
| 18 | github.com/moul/http2curl v1.0.0 // indirect | 19 | github.com/moul/http2curl v1.0.0 // indirect |
| @@ -29,6 +30,7 @@ require ( | @@ -29,6 +30,7 @@ require ( | ||
| 29 | github.com/yudai/gojsondiff v1.0.0 // indirect | 30 | github.com/yudai/gojsondiff v1.0.0 // indirect |
| 30 | github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 // indirect | 31 | github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 // indirect |
| 31 | github.com/yudai/pp v2.0.1+incompatible // indirect | 32 | github.com/yudai/pp v2.0.1+incompatible // indirect |
| 33 | + golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 | ||
| 32 | golang.org/x/text v0.3.6 | 34 | golang.org/x/text v0.3.6 |
| 33 | ) | 35 | ) |
| 34 | 36 |
| @@ -61,6 +61,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c | @@ -61,6 +61,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c | ||
| 61 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | 61 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= |
| 62 | github.com/dchest/siphash v1.2.1/go.mod h1:q+IRvb2gOSrUnYoPqHiyHXS0FOBBOdl6tONBlVnOnt4= | 62 | github.com/dchest/siphash v1.2.1/go.mod h1:q+IRvb2gOSrUnYoPqHiyHXS0FOBBOdl6tONBlVnOnt4= |
| 63 | github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= | 63 | github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= |
| 64 | +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= | ||
| 65 | +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= | ||
| 64 | github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= | 66 | github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= |
| 65 | github.com/eapache/go-resiliency v1.1.0 h1:1NtRmCAqadE2FN4ZcN6g90TP3uk8cg9rn9eNK2197aU= | 67 | github.com/eapache/go-resiliency v1.1.0 h1:1NtRmCAqadE2FN4ZcN6g90TP3uk8cg9rn9eNK2197aU= |
| 66 | github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= | 68 | github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= |
| @@ -112,6 +114,8 @@ github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8w | @@ -112,6 +114,8 @@ github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8w | ||
| 112 | github.com/go-redis/redis v6.15.7+incompatible h1:3skhDh95XQMpnqeqNftPkQD9jL9e5e36z/1SUm6dy1U= | 114 | github.com/go-redis/redis v6.15.7+incompatible h1:3skhDh95XQMpnqeqNftPkQD9jL9e5e36z/1SUm6dy1U= |
| 113 | github.com/go-redis/redis v6.15.7+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= | 115 | github.com/go-redis/redis v6.15.7+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= |
| 114 | github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= | 116 | github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= |
| 117 | +github.com/go-redis/redis/v8 v8.11.2 h1:WqlSpAwz8mxDSMCvbyz1Mkiqe0LE5OY4j3lgkvu1Ts0= | ||
| 118 | +github.com/go-redis/redis/v8 v8.11.2/go.mod h1:DLomh7y2e3ggQXQLd1YgmvIfecPJoFl7WU5SOQ/r06M= | ||
| 115 | github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= | 119 | github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= |
| 116 | github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= | 120 | github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= |
| 117 | github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= | 121 | github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= |
| @@ -154,8 +158,9 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ | @@ -154,8 +158,9 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ | ||
| 154 | github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | 158 | github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= |
| 155 | github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | 159 | github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= |
| 156 | github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | 160 | github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= |
| 157 | -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= | ||
| 158 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | 161 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= |
| 162 | +github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= | ||
| 163 | +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||
| 159 | github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= | 164 | github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= |
| 160 | github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= | 165 | github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= |
| 161 | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= | 166 | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= |
| @@ -163,6 +168,7 @@ github.com/google/gops v0.3.7/go.mod h1:bj0cwMmX1X4XIJFTjR99R5sCxNssNJ8HebFNvoQl | @@ -163,6 +168,7 @@ github.com/google/gops v0.3.7/go.mod h1:bj0cwMmX1X4XIJFTjR99R5sCxNssNJ8HebFNvoQl | ||
| 163 | github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= | 168 | github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= |
| 164 | github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | 169 | github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= |
| 165 | github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | 170 | github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= |
| 171 | +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||
| 166 | github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= | 172 | github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= |
| 167 | github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | 173 | github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= |
| 168 | github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= | 174 | github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= |
| @@ -180,6 +186,8 @@ github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1 | @@ -180,6 +186,8 @@ github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1 | ||
| 180 | github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= | 186 | github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= |
| 181 | github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= | 187 | github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= |
| 182 | github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= | 188 | github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= |
| 189 | +github.com/hibiken/asynq v0.21.0 h1:uH9XogJhjq/S39E0/DEPWLZQ6hHJ73UiblZTe4RzHwA= | ||
| 190 | +github.com/hibiken/asynq v0.21.0/go.mod h1:tyc63ojaW8SJ5SBm8mvI4DDONsguP5HE85EEl4Qr5Ig= | ||
| 183 | github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= | 191 | github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= |
| 184 | github.com/iancoleman/strcase v0.1.2/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE= | 192 | github.com/iancoleman/strcase v0.1.2/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE= |
| 185 | github.com/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk= | 193 | github.com/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk= |
| @@ -266,6 +274,7 @@ github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+ | @@ -266,6 +274,7 @@ github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+ | ||
| 266 | github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= | 274 | github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= |
| 267 | github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= | 275 | github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= |
| 268 | github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= | 276 | github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= |
| 277 | +github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg= | ||
| 269 | github.com/onsi/ginkgo v1.15.2 h1:l77YT15o814C2qVL47NOyjV/6RbaP7kKdrvZnxQ3Org= | 278 | github.com/onsi/ginkgo v1.15.2 h1:l77YT15o814C2qVL47NOyjV/6RbaP7kKdrvZnxQ3Org= |
| 270 | github.com/onsi/ginkgo v1.15.2/go.mod h1:Dd6YFfwBW84ETqqtL0CPyPXillHgY6XhQH3uuCCTr/o= | 279 | github.com/onsi/ginkgo v1.15.2/go.mod h1:Dd6YFfwBW84ETqqtL0CPyPXillHgY6XhQH3uuCCTr/o= |
| 271 | github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= | 280 | github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= |
| @@ -273,6 +282,7 @@ github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa | @@ -273,6 +282,7 @@ github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa | ||
| 273 | github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= | 282 | github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= |
| 274 | github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= | 283 | github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= |
| 275 | github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= | 284 | github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= |
| 285 | +github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48= | ||
| 276 | github.com/onsi/gomega v1.11.0 h1:+CqWgvj0OZycCaqclBD1pxKHAU+tOkHmQIWvDHq2aug= | 286 | github.com/onsi/gomega v1.11.0 h1:+CqWgvj0OZycCaqclBD1pxKHAU+tOkHmQIWvDHq2aug= |
| 277 | github.com/onsi/gomega v1.11.0/go.mod h1:azGKhqFUon9Vuj0YmTfLSmx0FUwqXYSTl5re8lQLTUg= | 287 | github.com/onsi/gomega v1.11.0/go.mod h1:azGKhqFUon9Vuj0YmTfLSmx0FUwqXYSTl5re8lQLTUg= |
| 278 | github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= | 288 | github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= |
| @@ -314,6 +324,8 @@ github.com/richardlehane/mscfb v1.0.3 h1:rD8TBkYWkObWO0oLDFCbwMeZ4KoalxQy+QgniCj | @@ -314,6 +324,8 @@ github.com/richardlehane/mscfb v1.0.3 h1:rD8TBkYWkObWO0oLDFCbwMeZ4KoalxQy+QgniCj | ||
| 314 | github.com/richardlehane/mscfb v1.0.3/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk= | 324 | github.com/richardlehane/mscfb v1.0.3/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk= |
| 315 | github.com/richardlehane/msoleps v1.0.1 h1:RfrALnSNXzmXLbGct/P2b4xkFz4e8Gmj/0Vj9M9xC1o= | 325 | github.com/richardlehane/msoleps v1.0.1 h1:RfrALnSNXzmXLbGct/P2b4xkFz4e8Gmj/0Vj9M9xC1o= |
| 316 | github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= | 326 | github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= |
| 327 | +github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= | ||
| 328 | +github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= | ||
| 317 | github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= | 329 | github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= |
| 318 | github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= | 330 | github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= |
| 319 | github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= | 331 | github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= |
| @@ -340,6 +352,8 @@ github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3 | @@ -340,6 +352,8 @@ github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3 | ||
| 340 | github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= | 352 | github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= |
| 341 | github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= | 353 | github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= |
| 342 | github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= | 354 | github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= |
| 355 | +github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= | ||
| 356 | +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= | ||
| 343 | github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= | 357 | github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= |
| 344 | github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= | 358 | github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= |
| 345 | github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE= | 359 | github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE= |
| @@ -432,6 +446,8 @@ go.opentelemetry.io/otel/trace v0.19.0/go.mod h1:4IXiNextNOpPnRlI4ryK69mn5iC84bj | @@ -432,6 +446,8 @@ go.opentelemetry.io/otel/trace v0.19.0/go.mod h1:4IXiNextNOpPnRlI4ryK69mn5iC84bj | ||
| 432 | go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= | 446 | go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= |
| 433 | go.uber.org/automaxprocs v1.3.0 h1:II28aZoGdaglS5vVNnspf28lnZpXScxtIozx1lAjdb0= | 447 | go.uber.org/automaxprocs v1.3.0 h1:II28aZoGdaglS5vVNnspf28lnZpXScxtIozx1lAjdb0= |
| 434 | go.uber.org/automaxprocs v1.3.0/go.mod h1:9CWT6lKIep8U41DDaPiH6eFscnTyjfTANNQNx6LrIcA= | 448 | go.uber.org/automaxprocs v1.3.0/go.mod h1:9CWT6lKIep8U41DDaPiH6eFscnTyjfTANNQNx6LrIcA= |
| 449 | +go.uber.org/goleak v0.10.0 h1:G3eWbSNIskeRqtsN/1uI5B+eP73y3JUuBsv9AZjehb4= | ||
| 450 | +go.uber.org/goleak v0.10.0/go.mod h1:VCZuO8V8mFPlL0F5J5GK1rtHV3DrFcQ1R8ryq7FK0aI= | ||
| 435 | go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= | 451 | go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= |
| 436 | go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= | 452 | go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= |
| 437 | go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= | 453 | go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= |
| @@ -540,6 +556,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | @@ -540,6 +556,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | ||
| 540 | golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= | 556 | golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= |
| 541 | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | 557 | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= |
| 542 | golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | 558 | golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= |
| 559 | +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||
| 560 | +golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= | ||
| 543 | golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | 561 | golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= |
| 544 | golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | 562 | golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= |
| 545 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | 563 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= |
| @@ -2,6 +2,7 @@ package main | @@ -2,6 +2,7 @@ package main | ||
| 2 | 2 | ||
| 3 | import ( | 3 | import ( |
| 4 | "fmt" | 4 | "fmt" |
| 5 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/port/task" | ||
| 5 | 6 | ||
| 6 | "github.com/beego/beego/v2/server/web" | 7 | "github.com/beego/beego/v2/server/web" |
| 7 | "github.com/linmadan/egglib-go/log/logrus" | 8 | "github.com/linmadan/egglib-go/log/logrus" |
| @@ -34,9 +35,11 @@ func main() { | @@ -34,9 +35,11 @@ func main() { | ||
| 34 | log.Logger.AddHook(bw) | 35 | log.Logger.AddHook(bw) |
| 35 | redis.InitRedis() | 36 | redis.InitRedis() |
| 36 | go mqtt.Start() | 37 | go mqtt.Start() |
| 38 | + go task.Run() | ||
| 37 | cron := crontab.NewCrontabService(nil) | 39 | cron := crontab.NewCrontabService(nil) |
| 38 | cron.StartCrontabTask() | 40 | cron.StartCrontabTask() |
| 39 | defer cron.StopCrontabTask() | 41 | defer cron.StopCrontabTask() |
| 40 | log.Logger.Info("server start!") | 42 | log.Logger.Info("server start!") |
| 41 | web.Run() | 43 | web.Run() |
| 44 | + log.Logger.Info("server stop!") | ||
| 42 | } | 45 | } |
| @@ -140,7 +140,7 @@ func FastPgProductGroup(transactionContext application.TransactionContext, id in | @@ -140,7 +140,7 @@ func FastPgProductGroup(transactionContext application.TransactionContext, id in | ||
| 140 | rep = value | 140 | rep = value |
| 141 | } | 141 | } |
| 142 | if id > 0 { | 142 | if id > 0 { |
| 143 | - if mod, err = rep.FindOne(map[string]interface{}{"productJobId": id}); err != nil { | 143 | + if mod, err = rep.FindOne(map[string]interface{}{"productGroupId": id}); err != nil { |
| 144 | if err == domain.ErrorNotFound { | 144 | if err == domain.ErrorNotFound { |
| 145 | return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该生产班组不存在") | 145 | return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该生产班组不存在") |
| 146 | } | 146 | } |
| @@ -169,7 +169,7 @@ func FastPgProduct(transactionContext application.TransactionContext, id int, op | @@ -169,7 +169,7 @@ func FastPgProduct(transactionContext application.TransactionContext, id int, op | ||
| 169 | rep = value | 169 | rep = value |
| 170 | } | 170 | } |
| 171 | if id > 0 { | 171 | if id > 0 { |
| 172 | - if mod, err = rep.FindOne(map[string]interface{}{"productJobId": id}); err != nil { | 172 | + if mod, err = rep.FindOne(map[string]interface{}{"productId": id}); err != nil { |
| 173 | if err == domain.ErrorNotFound { | 173 | if err == domain.ErrorNotFound { |
| 174 | return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该产品不存在") | 174 | return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该产品不存在") |
| 175 | } | 175 | } |
| @@ -195,7 +195,7 @@ func FastPgDevice(transactionContext application.TransactionContext, id int, opt | @@ -195,7 +195,7 @@ func FastPgDevice(transactionContext application.TransactionContext, id int, opt | ||
| 195 | rep = value | 195 | rep = value |
| 196 | } | 196 | } |
| 197 | if id > 0 { | 197 | if id > 0 { |
| 198 | - if mod, err = rep.FindOne(map[string]interface{}{"productJobId": id}); err != nil { | 198 | + if mod, err = rep.FindOne(map[string]interface{}{"deviceId": id}); err != nil { |
| 199 | if err == domain.ErrorNotFound { | 199 | if err == domain.ErrorNotFound { |
| 200 | return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该设备档案不存在") | 200 | return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该设备档案不存在") |
| 201 | } | 201 | } |
| @@ -221,7 +221,7 @@ func FastPgProductCalendar(transactionContext application.TransactionContext, id | @@ -221,7 +221,7 @@ func FastPgProductCalendar(transactionContext application.TransactionContext, id | ||
| 221 | rep = value | 221 | rep = value |
| 222 | } | 222 | } |
| 223 | if id > 0 { | 223 | if id > 0 { |
| 224 | - if mod, err = rep.FindOne(map[string]interface{}{"productJobId": id}); err != nil { | 224 | + if mod, err = rep.FindOne(map[string]interface{}{"productCalendar": id}); err != nil { |
| 225 | if err == domain.ErrorNotFound { | 225 | if err == domain.ErrorNotFound { |
| 226 | return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该车间日历不存在") | 226 | return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该车间日历不存在") |
| 227 | } | 227 | } |
| @@ -247,7 +247,7 @@ func FastPgUnitConversion(transactionContext application.TransactionContext, id | @@ -247,7 +247,7 @@ func FastPgUnitConversion(transactionContext application.TransactionContext, id | ||
| 247 | rep = value | 247 | rep = value |
| 248 | } | 248 | } |
| 249 | if id > 0 { | 249 | if id > 0 { |
| 250 | - if mod, err = rep.FindOne(map[string]interface{}{"productJobId": id}); err != nil { | 250 | + if mod, err = rep.FindOne(map[string]interface{}{"unitConversionId": id}); err != nil { |
| 251 | if err == domain.ErrorNotFound { | 251 | if err == domain.ErrorNotFound { |
| 252 | return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该单位换算不存在") | 252 | return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该单位换算不存在") |
| 253 | } | 253 | } |
| @@ -309,6 +309,32 @@ func FastPgAttendance(transactionContext application.TransactionContext, id int, | @@ -309,6 +309,32 @@ func FastPgAttendance(transactionContext application.TransactionContext, id int, | ||
| 309 | return rep, mod, err | 309 | return rep, mod, err |
| 310 | } | 310 | } |
| 311 | 311 | ||
| 312 | +// FastPgProductRecord 快速返回生产记录 | ||
| 313 | +// | ||
| 314 | +// transactionContext 事务 | ||
| 315 | +// id 对象唯一标识 | ||
| 316 | +func FastPgProductRecord(transactionContext application.TransactionContext, id int, options ...option) (domain.ProductRecordRepository, *domain.ProductRecord, error) { | ||
| 317 | + var rep domain.ProductRecordRepository | ||
| 318 | + var mod *domain.ProductRecord | ||
| 319 | + var err error | ||
| 320 | + if value, err := CreateProductRecordRepository(map[string]interface{}{ | ||
| 321 | + "transactionContext": transactionContext, | ||
| 322 | + }); err != nil { | ||
| 323 | + return nil, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 324 | + } else { | ||
| 325 | + rep = value | ||
| 326 | + } | ||
| 327 | + if id > 0 { | ||
| 328 | + if mod, err = rep.FindOne(map[string]interface{}{"productRecordId": id}); err != nil { | ||
| 329 | + if err == domain.ErrorNotFound { | ||
| 330 | + return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该记录不存在") | ||
| 331 | + } | ||
| 332 | + return nil, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 333 | + } | ||
| 334 | + } | ||
| 335 | + return rep, mod, err | ||
| 336 | +} | ||
| 337 | + | ||
| 312 | /***** 2.配置 *****/ | 338 | /***** 2.配置 *****/ |
| 313 | 339 | ||
| 314 | type FastOptions struct { | 340 | type FastOptions struct { |
| @@ -85,3 +85,11 @@ func CreateWorkshopRepository(options map[string]interface{}) (domain.WorkshopRe | @@ -85,3 +85,11 @@ func CreateWorkshopRepository(options map[string]interface{}) (domain.WorkshopRe | ||
| 85 | } | 85 | } |
| 86 | return repository.NewWorkshopRepository(transactionContext) | 86 | return repository.NewWorkshopRepository(transactionContext) |
| 87 | } | 87 | } |
| 88 | + | ||
| 89 | +func CreateEmployeeProductRecordRepository(options map[string]interface{}) (domain.EmployeeProductRecordRepository, error) { | ||
| 90 | + var transactionContext *pg.TransactionContext | ||
| 91 | + if value, ok := options["transactionContext"]; ok { | ||
| 92 | + transactionContext = value.(*pg.TransactionContext) | ||
| 93 | + } | ||
| 94 | + return repository.NewEmployeeProductRecordRepository(transactionContext) | ||
| 95 | +} |
| 1 | +package command | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "reflect" | ||
| 6 | + "strings" | ||
| 7 | + | ||
| 8 | + "github.com/beego/beego/v2/core/validation" | ||
| 9 | +) | ||
| 10 | + | ||
| 11 | +type ApproveProductRecordCommand struct { | ||
| 12 | + // 生产记录ID | ||
| 13 | + ProductRecordId int `cname:"生产记录ID" json:"productRecordId" valid:"Required"` | ||
| 14 | + // 审核人 | ||
| 15 | + ApproveUserId int `cname:"审核人" json:"approveUserId" valid:"Required"` | ||
| 16 | + // 审核后重量 | ||
| 17 | + WeighAfter float64 `cname:"审核后重量" json:"weighAfter" valid:"Required"` | ||
| 18 | + // 审核时间 | ||
| 19 | + ApproveAt string `cname:"审核时间" json:"approveAt" valid:"Required"` | ||
| 20 | +} | ||
| 21 | + | ||
| 22 | +func (approveProductRecordCommand *ApproveProductRecordCommand) Valid(validation *validation.Validation) { | ||
| 23 | + //validation.SetError("CustomValid", "未实现的自定义认证") | ||
| 24 | +} | ||
| 25 | + | ||
| 26 | +func (approveProductRecordCommand *ApproveProductRecordCommand) ValidateCommand() error { | ||
| 27 | + valid := validation.Validation{} | ||
| 28 | + b, err := valid.Valid(approveProductRecordCommand) | ||
| 29 | + if err != nil { | ||
| 30 | + return err | ||
| 31 | + } | ||
| 32 | + if !b { | ||
| 33 | + elem := reflect.TypeOf(approveProductRecordCommand).Elem() | ||
| 34 | + for _, validErr := range valid.Errors { | ||
| 35 | + field, isExist := elem.FieldByName(validErr.Field) | ||
| 36 | + if isExist { | ||
| 37 | + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1)) | ||
| 38 | + } else { | ||
| 39 | + return fmt.Errorf(validErr.Message) | ||
| 40 | + } | ||
| 41 | + } | ||
| 42 | + } | ||
| 43 | + return nil | ||
| 44 | +} |
| 1 | +package command | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "reflect" | ||
| 6 | + "strings" | ||
| 7 | + | ||
| 8 | + "github.com/beego/beego/v2/core/validation" | ||
| 9 | +) | ||
| 10 | + | ||
| 11 | +type CreateProductRecordCommand struct { | ||
| 12 | + // 生产记录ID | ||
| 13 | + ProductRecordId int `cname:"生产记录ID" json:"productRecordId" valid:"Required"` | ||
| 14 | +} | ||
| 15 | + | ||
| 16 | +func (createProductRecordCommand *CreateProductRecordCommand) Valid(validation *validation.Validation) { | ||
| 17 | + validation.SetError("CustomValid", "未实现的自定义认证") | ||
| 18 | +} | ||
| 19 | + | ||
| 20 | +func (createProductRecordCommand *CreateProductRecordCommand) ValidateCommand() error { | ||
| 21 | + valid := validation.Validation{} | ||
| 22 | + b, err := valid.Valid(createProductRecordCommand) | ||
| 23 | + if err != nil { | ||
| 24 | + return err | ||
| 25 | + } | ||
| 26 | + if !b { | ||
| 27 | + elem := reflect.TypeOf(createProductRecordCommand).Elem() | ||
| 28 | + for _, validErr := range valid.Errors { | ||
| 29 | + field, isExist := elem.FieldByName(validErr.Field) | ||
| 30 | + if isExist { | ||
| 31 | + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1)) | ||
| 32 | + } else { | ||
| 33 | + return fmt.Errorf(validErr.Message) | ||
| 34 | + } | ||
| 35 | + } | ||
| 36 | + } | ||
| 37 | + return nil | ||
| 38 | +} |
| 1 | +package command | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "github.com/beego/beego/v2/core/validation" | ||
| 6 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
| 7 | + "reflect" | ||
| 8 | + "strings" | ||
| 9 | +) | ||
| 10 | + | ||
| 11 | +type ProductRecordStaticsCommand struct { | ||
| 12 | + *domain.ProductRecord | ||
| 13 | +} | ||
| 14 | + | ||
| 15 | +// Type is a string value that indicates the type of the task. | ||
| 16 | +//func (t *ProductRecordStaticsCommand) Type() string | ||
| 17 | + | ||
| 18 | +// Payload is the data needed for task execution. | ||
| 19 | +//func (t *ProductRecordStaticsCommand) Payload() []byte | ||
| 20 | + | ||
| 21 | +func (removeProductRecordCommand *ProductRecordStaticsCommand) Valid(validation *validation.Validation) { | ||
| 22 | + //validation.SetError("CustomValid", "未实现的自定义认证") | ||
| 23 | +} | ||
| 24 | + | ||
| 25 | +func (removeProductRecordCommand *ProductRecordStaticsCommand) ValidateCommand() error { | ||
| 26 | + valid := validation.Validation{} | ||
| 27 | + b, err := valid.Valid(removeProductRecordCommand) | ||
| 28 | + if err != nil { | ||
| 29 | + return err | ||
| 30 | + } | ||
| 31 | + if !b { | ||
| 32 | + elem := reflect.TypeOf(removeProductRecordCommand).Elem() | ||
| 33 | + for _, validErr := range valid.Errors { | ||
| 34 | + field, isExist := elem.FieldByName(validErr.Field) | ||
| 35 | + if isExist { | ||
| 36 | + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1)) | ||
| 37 | + } else { | ||
| 38 | + return fmt.Errorf(validErr.Message) | ||
| 39 | + } | ||
| 40 | + } | ||
| 41 | + } | ||
| 42 | + return nil | ||
| 43 | +} |
| 1 | +package command | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "reflect" | ||
| 6 | + "strings" | ||
| 7 | + | ||
| 8 | + "github.com/beego/beego/v2/core/validation" | ||
| 9 | +) | ||
| 10 | + | ||
| 11 | +type RemoveProductRecordCommand struct { | ||
| 12 | + // 生产记录ID | ||
| 13 | + ProductRecordId int `cname:"生产记录ID" json:"productRecordId" valid:"Required"` | ||
| 14 | +} | ||
| 15 | + | ||
| 16 | +func (removeProductRecordCommand *RemoveProductRecordCommand) Valid(validation *validation.Validation) { | ||
| 17 | + //validation.SetError("CustomValid", "未实现的自定义认证") | ||
| 18 | +} | ||
| 19 | + | ||
| 20 | +func (removeProductRecordCommand *RemoveProductRecordCommand) ValidateCommand() error { | ||
| 21 | + valid := validation.Validation{} | ||
| 22 | + b, err := valid.Valid(removeProductRecordCommand) | ||
| 23 | + if err != nil { | ||
| 24 | + return err | ||
| 25 | + } | ||
| 26 | + if !b { | ||
| 27 | + elem := reflect.TypeOf(removeProductRecordCommand).Elem() | ||
| 28 | + for _, validErr := range valid.Errors { | ||
| 29 | + field, isExist := elem.FieldByName(validErr.Field) | ||
| 30 | + if isExist { | ||
| 31 | + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1)) | ||
| 32 | + } else { | ||
| 33 | + return fmt.Errorf(validErr.Message) | ||
| 34 | + } | ||
| 35 | + } | ||
| 36 | + } | ||
| 37 | + return nil | ||
| 38 | +} |
| 1 | +package command | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "reflect" | ||
| 6 | + "strings" | ||
| 7 | + | ||
| 8 | + "github.com/beego/beego/v2/core/validation" | ||
| 9 | +) | ||
| 10 | + | ||
| 11 | +type UpdateProductRecordCommand struct { | ||
| 12 | + // 生产记录ID | ||
| 13 | + ProductRecordId int `cname:"生产记录ID" json:"productRecordId" valid:"Required"` | ||
| 14 | +} | ||
| 15 | + | ||
| 16 | +func (updateProductRecordCommand *UpdateProductRecordCommand) Valid(validation *validation.Validation) { | ||
| 17 | + validation.SetError("CustomValid", "未实现的自定义认证") | ||
| 18 | +} | ||
| 19 | + | ||
| 20 | +func (updateProductRecordCommand *UpdateProductRecordCommand) ValidateCommand() error { | ||
| 21 | + valid := validation.Validation{} | ||
| 22 | + b, err := valid.Valid(updateProductRecordCommand) | ||
| 23 | + if err != nil { | ||
| 24 | + return err | ||
| 25 | + } | ||
| 26 | + if !b { | ||
| 27 | + elem := reflect.TypeOf(updateProductRecordCommand).Elem() | ||
| 28 | + for _, validErr := range valid.Errors { | ||
| 29 | + field, isExist := elem.FieldByName(validErr.Field) | ||
| 30 | + if isExist { | ||
| 31 | + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1)) | ||
| 32 | + } else { | ||
| 33 | + return fmt.Errorf(validErr.Message) | ||
| 34 | + } | ||
| 35 | + } | ||
| 36 | + } | ||
| 37 | + return nil | ||
| 38 | +} |
| 1 | +package dto | ||
| 2 | + | ||
| 3 | +import "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
| 4 | + | ||
| 5 | +type EmployeeProductRecordDto struct { | ||
| 6 | + // 员工产能记录ID | ||
| 7 | + EmployeeProductRecordId int `json:"employeeProductRecordId"` | ||
| 8 | + // 生产工人 | ||
| 9 | + ProductWorker *domain.User `json:"productWorker,omitempty"` | ||
| 10 | + *domain.WorkStation | ||
| 11 | + // 生产日期 | ||
| 12 | + //ProductDate string `json:"productDate"` | ||
| 13 | + // 计划的产品名称 | ||
| 14 | + PlanProductName string `json:"planProductName,omitempty"` | ||
| 15 | + // 批号 | ||
| 16 | + BatchNumber string `json:"batchNumber,omitempty"` | ||
| 17 | + // 参与类型 1:正常 2:支援 | ||
| 18 | + ParticipateType int `json:"participateType"` | ||
| 19 | + // 产能 | ||
| 20 | + ProductWeigh float64 `json:"productWeigh"` | ||
| 21 | + // 二级品产能 | ||
| 22 | + SecondLevelWeigh float64 `json:"secondLevelWeigh"` | ||
| 23 | + // 创建时间 | ||
| 24 | + CreatedAt string `json:"createdAt,omitempty"` | ||
| 25 | + // 组织名称 | ||
| 26 | + OrgName string `json:"orgName"` | ||
| 27 | + // 权限标识 (当前登录组织匹配为true,否则false) | ||
| 28 | + AuthFlag bool `json:"authFlag"` | ||
| 29 | + // 合格率 百分比 | ||
| 30 | + QualificationRate int `json:"qualificationRate"` | ||
| 31 | +} | ||
| 32 | + | ||
| 33 | +func (d *EmployeeProductRecordDto) LoadDto(m *domain.EmployeeProductRecord, orgId int) *EmployeeProductRecordDto { | ||
| 34 | + d.EmployeeProductRecordId = m.EmployeeProductRecordId | ||
| 35 | + d.ProductWorker = m.ProductWorker | ||
| 36 | + d.WorkStation = m.WorkStation | ||
| 37 | + d.PlanProductName = m.ProductRecordInfo.PlanProductName | ||
| 38 | + d.BatchNumber = m.ProductRecordInfo.BatchNumber | ||
| 39 | + d.ParticipateType = m.ParticipateType | ||
| 40 | + d.ProductWeigh = m.RealProductWeigh() | ||
| 41 | + d.SecondLevelWeigh = m.SecondLevelWeigh | ||
| 42 | + d.QualificationRate = m.QualificationRate() | ||
| 43 | + d.CreatedAt = m.CreatedAt.Format("06-01-02") | ||
| 44 | + d.AuthFlag = domain.CheckOrgAuth(orgId, m.OrgId) | ||
| 45 | + if m.Ext != nil { | ||
| 46 | + d.OrgName = m.Ext.OrgName | ||
| 47 | + } | ||
| 48 | + return d | ||
| 49 | +} |
| 1 | +package dto | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
| 5 | + "time" | ||
| 6 | +) | ||
| 7 | + | ||
| 8 | +// 二级品记录 | ||
| 9 | +type ProductLevelTwoRecord struct { | ||
| 10 | + // 生产记录ID | ||
| 11 | + ProductRecordId int `json:"productRecordId,omitempty"` | ||
| 12 | + // 生产工人 | ||
| 13 | + ProductWorker *domain.User `json:"productWorker,omitempty"` | ||
| 14 | + *domain.WorkStation | ||
| 15 | + // 上班班次 1:全天 2:白班 4:中班 8:夜班 | ||
| 16 | + WorkOn int `json:"workOn"` | ||
| 17 | + // 产能 - 审核前 | ||
| 18 | + WeighBefore float64 `json:"weighBefore"` | ||
| 19 | + // 产能-审核后 | ||
| 20 | + WeighAfter float64 `json:"weighAfter"` | ||
| 21 | + // 审核状态 1:未审核 2:已审核 | ||
| 22 | + ApproveStatus int64 `json:"approveStatus"` | ||
| 23 | + // 审核时间 | ||
| 24 | + ApproveAt string `json:"approveAt"` | ||
| 25 | + // 计划的产品名称 | ||
| 26 | + PlanProductName string `json:"planProductName,omitempty"` | ||
| 27 | + // 批号 | ||
| 28 | + BatchNumber string `json:"batchNumber,omitempty"` | ||
| 29 | + | ||
| 30 | + // 创建时间 | ||
| 31 | + CreatedAt string `json:"createdAt,omitempty"` | ||
| 32 | + // 组织名称 | ||
| 33 | + OrgName string `json:"orgName"` | ||
| 34 | + // 权限标识 (当前登录组织匹配为true,否则false) | ||
| 35 | + AuthFlag bool `json:"authFlag"` | ||
| 36 | +} | ||
| 37 | + | ||
| 38 | +func (d *ProductLevelTwoRecord) LoadDto(m *domain.ProductRecord, orgId int) *ProductLevelTwoRecord { | ||
| 39 | + d.ProductRecordId = m.ProductRecordId | ||
| 40 | + d.ProductWorker = m.ProductWorker | ||
| 41 | + d.WorkStation = m.WorkStation | ||
| 42 | + d.WeighBefore = m.ProductRecordInfo.WeighBefore | ||
| 43 | + d.WeighAfter = m.ProductRecordInfo.WeighAfter | ||
| 44 | + d.ApproveStatus = m.ProductRecordInfo.ApproveStatus | ||
| 45 | + if m.ProductRecordInfo.ApproveAt > 0 { | ||
| 46 | + d.ApproveAt = time.Unix(m.ProductRecordInfo.ApproveAt, 0).Format("2006-01-02 15:04:05") | ||
| 47 | + } | ||
| 48 | + d.PlanProductName = m.ProductRecordInfo.PlanProductName | ||
| 49 | + d.BatchNumber = m.ProductRecordInfo.BatchNumber | ||
| 50 | + | ||
| 51 | + d.CreatedAt = m.CreatedAt.Format("2006-01-02") | ||
| 52 | + d.AuthFlag = domain.CheckOrgAuth(orgId, m.OrgId) | ||
| 53 | + if m.Ext != nil { | ||
| 54 | + d.OrgName = m.Ext.OrgName | ||
| 55 | + } | ||
| 56 | + return d | ||
| 57 | +} |
| 1 | +package query | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "reflect" | ||
| 6 | + "strings" | ||
| 7 | + | ||
| 8 | + "github.com/beego/beego/v2/core/validation" | ||
| 9 | +) | ||
| 10 | + | ||
| 11 | +type GetProductRecordQuery struct { | ||
| 12 | + // 生产记录ID | ||
| 13 | + ProductRecordId int `cname:"生产记录ID" json:"productRecordId" valid:"Required"` | ||
| 14 | +} | ||
| 15 | + | ||
| 16 | +func (getProductRecordQuery *GetProductRecordQuery) Valid(validation *validation.Validation) { | ||
| 17 | + //validation.SetError("CustomValid", "未实现的自定义认证") | ||
| 18 | +} | ||
| 19 | + | ||
| 20 | +func (getProductRecordQuery *GetProductRecordQuery) ValidateQuery() error { | ||
| 21 | + valid := validation.Validation{} | ||
| 22 | + b, err := valid.Valid(getProductRecordQuery) | ||
| 23 | + if err != nil { | ||
| 24 | + return err | ||
| 25 | + } | ||
| 26 | + if !b { | ||
| 27 | + elem := reflect.TypeOf(getProductRecordQuery).Elem() | ||
| 28 | + for _, validErr := range valid.Errors { | ||
| 29 | + field, isExist := elem.FieldByName(validErr.Field) | ||
| 30 | + if isExist { | ||
| 31 | + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1)) | ||
| 32 | + } else { | ||
| 33 | + return fmt.Errorf(validErr.Message) | ||
| 34 | + } | ||
| 35 | + } | ||
| 36 | + } | ||
| 37 | + return nil | ||
| 38 | +} |
| 1 | +package query | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "reflect" | ||
| 6 | + "strings" | ||
| 7 | + | ||
| 8 | + "github.com/beego/beego/v2/core/validation" | ||
| 9 | +) | ||
| 10 | + | ||
| 11 | +type ListProductRecordQuery struct { | ||
| 12 | + // 查询偏离量 | ||
| 13 | + Offset int `cname:"查询偏离量" json:"offset" valid:"Required"` | ||
| 14 | + // 查询限制 | ||
| 15 | + Limit int `cname:"查询限制" json:"limit" valid:"Required"` | ||
| 16 | +} | ||
| 17 | + | ||
| 18 | +func (listProductRecordQuery *ListProductRecordQuery) Valid(validation *validation.Validation) { | ||
| 19 | + //validation.SetError("CustomValid", "未实现的自定义认证") | ||
| 20 | +} | ||
| 21 | + | ||
| 22 | +func (listProductRecordQuery *ListProductRecordQuery) ValidateQuery() error { | ||
| 23 | + valid := validation.Validation{} | ||
| 24 | + b, err := valid.Valid(listProductRecordQuery) | ||
| 25 | + if err != nil { | ||
| 26 | + return err | ||
| 27 | + } | ||
| 28 | + if !b { | ||
| 29 | + elem := reflect.TypeOf(listProductRecordQuery).Elem() | ||
| 30 | + for _, validErr := range valid.Errors { | ||
| 31 | + field, isExist := elem.FieldByName(validErr.Field) | ||
| 32 | + if isExist { | ||
| 33 | + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1)) | ||
| 34 | + } else { | ||
| 35 | + return fmt.Errorf(validErr.Message) | ||
| 36 | + } | ||
| 37 | + } | ||
| 38 | + } | ||
| 39 | + return nil | ||
| 40 | +} |
| 1 | +package query | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
| 6 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log" | ||
| 7 | + "reflect" | ||
| 8 | + "strings" | ||
| 9 | + "time" | ||
| 10 | + | ||
| 11 | + "github.com/beego/beego/v2/core/validation" | ||
| 12 | +) | ||
| 13 | + | ||
| 14 | +type SearchEmployeeProductRecordQuery struct { | ||
| 15 | + // 查询偏离量 | ||
| 16 | + Offset int `cname:"查询偏离量" json:"offset"` | ||
| 17 | + // 查询限制 | ||
| 18 | + Limit int `cname:"查询限制" json:"limit"` | ||
| 19 | + // 当前公司 | ||
| 20 | + CompanyId int `cname:"当前公司" json:"companyId,omitempty" valid:"Required"` | ||
| 21 | + // 当前登录的组织 | ||
| 22 | + OrgId int `cname:"当前登录的组织" json:"orgId,omitempty"` | ||
| 23 | + // 匹配多个组织 | ||
| 24 | + InOrgIds []int `cname:"匹配多个组织" json:"inOrgIds,omitempty"` | ||
| 25 | + // 页码 | ||
| 26 | + PageNumber int `cname:"页码" json:"pageNumber,omitempty"` | ||
| 27 | + // 页数 | ||
| 28 | + PageSize int `cname:"页数" json:"pageSize,omitempty"` | ||
| 29 | + // 车间名称 | ||
| 30 | + WorkshopName string `cname:"车间名称" json:"workshopName,omitempty"` | ||
| 31 | + // 生产线名称 | ||
| 32 | + LineName string `cname:"生产线名称" json:"lineName,omitempty"` | ||
| 33 | + // 工段名称 | ||
| 34 | + SectionName string `cname:"工段名称" json:"sectionName,omitempty"` | ||
| 35 | + // 姓名 | ||
| 36 | + UserName string `cname:"姓名" json:"userName"` | ||
| 37 | + // 员工类型 1:固定 2:派遣 3.临时 | ||
| 38 | + EmployeeType string `cname:"员工类型 1:固定 2:派遣 3.临时" json:"employeeType"` | ||
| 39 | + // 开始时间 | ||
| 40 | + BeginTime string `cname:"开始时间" json:"beginTime"` | ||
| 41 | + // 结束时间 | ||
| 42 | + EndTime string `cname:"结束时间" json:"endTime"` | ||
| 43 | + | ||
| 44 | + // 开始时间 | ||
| 45 | + ProductBeginTime time.Time `cname:"开始时间" json:"productBeginTime"` | ||
| 46 | + // 结束时间 | ||
| 47 | + ProductEndTime time.Time `cname:"结束时间" json:"productEndTime"` | ||
| 48 | +} | ||
| 49 | + | ||
| 50 | +func (cmd *SearchEmployeeProductRecordQuery) Valid(validation *validation.Validation) { | ||
| 51 | + cmd.Offset, cmd.Limit = domain.Pagination(cmd.PageNumber, cmd.PageSize) | ||
| 52 | + var err error | ||
| 53 | + if len(cmd.BeginTime) > 0 { | ||
| 54 | + if cmd.ProductBeginTime, err = time.Parse("2006-01-02 15:04:05", cmd.BeginTime); err != nil { | ||
| 55 | + log.Logger.Error(err.Error()) | ||
| 56 | + validation.Error("开始时间有误") | ||
| 57 | + return | ||
| 58 | + } | ||
| 59 | + } | ||
| 60 | + if len(cmd.EndTime) > 0 { | ||
| 61 | + if cmd.ProductEndTime, err = time.Parse("2006-01-02 15:04:05", cmd.EndTime); err != nil { | ||
| 62 | + log.Logger.Error(err.Error()) | ||
| 63 | + validation.Error("结束时间有误") | ||
| 64 | + return | ||
| 65 | + } | ||
| 66 | + } | ||
| 67 | +} | ||
| 68 | + | ||
| 69 | +func (cmd *SearchEmployeeProductRecordQuery) ValidateQuery() error { | ||
| 70 | + valid := validation.Validation{} | ||
| 71 | + b, err := valid.Valid(cmd) | ||
| 72 | + if err != nil { | ||
| 73 | + return err | ||
| 74 | + } | ||
| 75 | + if !b { | ||
| 76 | + elem := reflect.TypeOf(cmd).Elem() | ||
| 77 | + for _, validErr := range valid.Errors { | ||
| 78 | + field, isExist := elem.FieldByName(validErr.Field) | ||
| 79 | + if isExist { | ||
| 80 | + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1)) | ||
| 81 | + } else { | ||
| 82 | + return fmt.Errorf(validErr.Message) | ||
| 83 | + } | ||
| 84 | + } | ||
| 85 | + } | ||
| 86 | + return nil | ||
| 87 | +} |
| 1 | +package query | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
| 6 | + "reflect" | ||
| 7 | + "strings" | ||
| 8 | + | ||
| 9 | + "github.com/beego/beego/v2/core/validation" | ||
| 10 | +) | ||
| 11 | + | ||
| 12 | +type SearchProductRecordQuery struct { | ||
| 13 | + // 查询偏离量 | ||
| 14 | + Offset int `cname:"查询偏离量" json:"offset"` | ||
| 15 | + // 查询限制 | ||
| 16 | + Limit int `cname:"查询限制" json:"limit"` | ||
| 17 | + // 当前公司 | ||
| 18 | + CompanyId int `cname:"当前公司" json:"companyId,omitempty" valid:"Required"` | ||
| 19 | + // 当前登录的组织 | ||
| 20 | + OrgId int `cname:"当前登录的组织" json:"orgId,omitempty"` | ||
| 21 | + // 匹配多个组织 | ||
| 22 | + InOrgIds []int `cname:"匹配多个组织" json:"inOrgIds,omitempty"` | ||
| 23 | + // 页码 | ||
| 24 | + PageNumber int `cname:"页码" json:"pageNumber,omitempty"` | ||
| 25 | + // 页数 | ||
| 26 | + PageSize int `cname:"页数" json:"pageSize,omitempty"` | ||
| 27 | + // 车间名称 | ||
| 28 | + WorkshopName string `cname:"车间名称" json:"workshopName"` | ||
| 29 | + // 批号 | ||
| 30 | + BatchNumber string `cname:"批号" json:"batchNumber"` | ||
| 31 | + // 姓名 | ||
| 32 | + UserName string `cname:"姓名" json:"userName"` | ||
| 33 | +} | ||
| 34 | + | ||
| 35 | +func (cmd *SearchProductRecordQuery) Valid(validation *validation.Validation) { | ||
| 36 | + cmd.Offset, cmd.Limit = domain.Pagination(cmd.PageNumber, cmd.PageSize) | ||
| 37 | +} | ||
| 38 | + | ||
| 39 | +func (cmd *SearchProductRecordQuery) ValidateQuery() error { | ||
| 40 | + valid := validation.Validation{} | ||
| 41 | + b, err := valid.Valid(cmd) | ||
| 42 | + if err != nil { | ||
| 43 | + return err | ||
| 44 | + } | ||
| 45 | + if !b { | ||
| 46 | + elem := reflect.TypeOf(cmd).Elem() | ||
| 47 | + for _, validErr := range valid.Errors { | ||
| 48 | + field, isExist := elem.FieldByName(validErr.Field) | ||
| 49 | + if isExist { | ||
| 50 | + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1)) | ||
| 51 | + } else { | ||
| 52 | + return fmt.Errorf(validErr.Message) | ||
| 53 | + } | ||
| 54 | + } | ||
| 55 | + } | ||
| 56 | + return nil | ||
| 57 | +} |
| 1 | +package query | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
| 6 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log" | ||
| 7 | + "reflect" | ||
| 8 | + "strings" | ||
| 9 | + "time" | ||
| 10 | + | ||
| 11 | + "github.com/beego/beego/v2/core/validation" | ||
| 12 | +) | ||
| 13 | + | ||
| 14 | +type SearchWorkshopProductRecordQuery struct { | ||
| 15 | + // 查询偏离量 | ||
| 16 | + Offset int `cname:"查询偏离量" json:"offset"` | ||
| 17 | + // 查询限制 | ||
| 18 | + Limit int `cname:"查询限制" json:"limit"` | ||
| 19 | + // 当前公司 | ||
| 20 | + CompanyId int `cname:"当前公司" json:"companyId,omitempty" valid:"Required"` | ||
| 21 | + // 当前登录的组织 | ||
| 22 | + OrgId int `cname:"当前登录的组织" json:"orgId,omitempty"` | ||
| 23 | + // 匹配多个组织 | ||
| 24 | + InOrgIds []int `cname:"匹配多个组织" json:"inOrgIds,omitempty"` | ||
| 25 | + // 页码 | ||
| 26 | + PageNumber int `cname:"页码" json:"pageNumber,omitempty"` | ||
| 27 | + // 页数 | ||
| 28 | + PageSize int `cname:"页数" json:"pageSize,omitempty"` | ||
| 29 | + // 品名 | ||
| 30 | + PlanProductName string `cname:"品名" json:"planProductName,omitempty"` | ||
| 31 | + // 工段名称 | ||
| 32 | + SectionName string `cname:"工段名称" json:"sectionName,omitempty"` | ||
| 33 | + // 开始时间 | ||
| 34 | + BeginTime string `cname:"开始时间" json:"beginTime"` | ||
| 35 | + // 结束时间 | ||
| 36 | + EndTime string `cname:"结束时间" json:"endTime"` | ||
| 37 | + | ||
| 38 | + // 开始时间 | ||
| 39 | + ProductBeginTime time.Time `cname:"开始时间" json:"productBeginTime"` | ||
| 40 | + // 结束时间 | ||
| 41 | + ProductEndTime time.Time `cname:"结束时间" json:"productEndTime"` | ||
| 42 | +} | ||
| 43 | + | ||
| 44 | +func (cmd *SearchWorkshopProductRecordQuery) Valid(validation *validation.Validation) { | ||
| 45 | + cmd.Offset, cmd.Limit = domain.Pagination(cmd.PageNumber, cmd.PageSize) | ||
| 46 | + var err error | ||
| 47 | + if len(cmd.BeginTime) > 0 { | ||
| 48 | + if cmd.ProductBeginTime, err = time.Parse("2006-01-02 15:04:05", cmd.BeginTime); err != nil { | ||
| 49 | + log.Logger.Error(err.Error()) | ||
| 50 | + validation.Error("开始时间有误") | ||
| 51 | + return | ||
| 52 | + } | ||
| 53 | + } | ||
| 54 | + if len(cmd.EndTime) > 0 { | ||
| 55 | + if cmd.ProductEndTime, err = time.Parse("2006-01-02 15:04:05", cmd.EndTime); err != nil { | ||
| 56 | + log.Logger.Error(err.Error()) | ||
| 57 | + validation.Error("结束时间有误") | ||
| 58 | + return | ||
| 59 | + } | ||
| 60 | + } | ||
| 61 | +} | ||
| 62 | + | ||
| 63 | +func (cmd *SearchWorkshopProductRecordQuery) ValidateQuery() error { | ||
| 64 | + valid := validation.Validation{} | ||
| 65 | + b, err := valid.Valid(cmd) | ||
| 66 | + if err != nil { | ||
| 67 | + return err | ||
| 68 | + } | ||
| 69 | + if !b { | ||
| 70 | + elem := reflect.TypeOf(cmd).Elem() | ||
| 71 | + for _, validErr := range valid.Errors { | ||
| 72 | + field, isExist := elem.FieldByName(validErr.Field) | ||
| 73 | + if isExist { | ||
| 74 | + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1)) | ||
| 75 | + } else { | ||
| 76 | + return fmt.Errorf(validErr.Message) | ||
| 77 | + } | ||
| 78 | + } | ||
| 79 | + } | ||
| 80 | + return nil | ||
| 81 | +} |
| 1 | +package service | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/linmadan/egglib-go/core/application" | ||
| 5 | + pgTransaction "github.com/linmadan/egglib-go/transaction/pg" | ||
| 6 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory" | ||
| 7 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productRecord/dto" | ||
| 8 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productRecord/query" | ||
| 9 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
| 10 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/dao" | ||
| 11 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils" | ||
| 12 | +) | ||
| 13 | + | ||
| 14 | +// 返回员工生产记录服务列表 | ||
| 15 | +func (productRecordService *ProductRecordService) SearchEmployeeProductRecord(operateInfo *domain.OperateInfo, listProductRecordQuery *query.SearchEmployeeProductRecordQuery) (int64, interface{}, error) { | ||
| 16 | + if err := listProductRecordQuery.ValidateQuery(); err != nil { | ||
| 17 | + return 0, nil, application.ThrowError(application.ARG_ERROR, err.Error()) | ||
| 18 | + } | ||
| 19 | + transactionContext, err := factory.CreateTransactionContext(nil) | ||
| 20 | + if err != nil { | ||
| 21 | + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 22 | + } | ||
| 23 | + if err := transactionContext.StartTransaction(); err != nil { | ||
| 24 | + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 25 | + } | ||
| 26 | + defer func() { | ||
| 27 | + transactionContext.RollbackTransaction() | ||
| 28 | + }() | ||
| 29 | + //var productRecordRepository domain.ProductRecordRepository | ||
| 30 | + //productRecordRepository,_,_ = factory.FastPgProductRecord(transactionContext,0) | ||
| 31 | + | ||
| 32 | + productRecordRepository, _ := dao.NewEmployeeProductRecordDao(transactionContext.(*pgTransaction.TransactionContext)) | ||
| 33 | + options := utils.ObjectToMap(listProductRecordQuery) | ||
| 34 | + count, productRecords, err := productRecordRepository.SearchEmployeeProductRecord(options) | ||
| 35 | + if err != nil { | ||
| 36 | + return 0, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 37 | + } | ||
| 38 | + if err := transactionContext.CommitTransaction(); err != nil { | ||
| 39 | + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 40 | + } | ||
| 41 | + var result = make([]*dto.EmployeeProductRecordDto, 0) | ||
| 42 | + for i := range productRecords { | ||
| 43 | + item := productRecords[i] | ||
| 44 | + newItem := &dto.EmployeeProductRecordDto{} | ||
| 45 | + newItem.LoadDto(item, operateInfo.OrgId) | ||
| 46 | + result = append(result, newItem) | ||
| 47 | + } | ||
| 48 | + return count, result, nil | ||
| 49 | +} |
| 1 | +package service | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "github.com/linmadan/egglib-go/core/application" | ||
| 6 | + pgTransaction "github.com/linmadan/egglib-go/transaction/pg" | ||
| 7 | + "github.com/linmadan/egglib-go/utils/tool_funs" | ||
| 8 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory" | ||
| 9 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productRecord/command" | ||
| 10 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productRecord/dto" | ||
| 11 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productRecord/query" | ||
| 12 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
| 13 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/domainService" | ||
| 14 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils" | ||
| 15 | + "time" | ||
| 16 | +) | ||
| 17 | + | ||
| 18 | +// 生产记录服务 | ||
| 19 | +type ProductRecordService struct { | ||
| 20 | +} | ||
| 21 | + | ||
| 22 | +// 生产记录审核 | ||
| 23 | +func (productRecordService *ProductRecordService) ApproveProductRecord(cmd *command.ApproveProductRecordCommand) (interface{}, error) { | ||
| 24 | + if err := cmd.ValidateCommand(); err != nil { | ||
| 25 | + return nil, application.ThrowError(application.ARG_ERROR, err.Error()) | ||
| 26 | + } | ||
| 27 | + transactionContext, err := factory.CreateTransactionContext(nil) | ||
| 28 | + if err != nil { | ||
| 29 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 30 | + } | ||
| 31 | + if err := transactionContext.StartTransaction(); err != nil { | ||
| 32 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 33 | + } | ||
| 34 | + defer func() { | ||
| 35 | + transactionContext.RollbackTransaction() | ||
| 36 | + }() | ||
| 37 | + | ||
| 38 | + svr, err := domainService.NewPGProductRecordService(transactionContext.(*pgTransaction.TransactionContext)) | ||
| 39 | + if _, err = svr.Approve(cmd.ProductRecordId, cmd.ApproveUserId, cmd.WeighAfter, time.Now()); err != nil { | ||
| 40 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 41 | + } | ||
| 42 | + | ||
| 43 | + if err := transactionContext.CommitTransaction(); err != nil { | ||
| 44 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 45 | + } | ||
| 46 | + return struct{}{}, nil | ||
| 47 | +} | ||
| 48 | + | ||
| 49 | +// 创建生产记录服务 | ||
| 50 | +func (productRecordService *ProductRecordService) CreateProductRecord(createProductRecordCommand *command.CreateProductRecordCommand) (interface{}, error) { | ||
| 51 | + if err := createProductRecordCommand.ValidateCommand(); err != nil { | ||
| 52 | + return nil, application.ThrowError(application.ARG_ERROR, err.Error()) | ||
| 53 | + } | ||
| 54 | + transactionContext, err := factory.CreateTransactionContext(nil) | ||
| 55 | + if err != nil { | ||
| 56 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 57 | + } | ||
| 58 | + if err := transactionContext.StartTransaction(); err != nil { | ||
| 59 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 60 | + } | ||
| 61 | + defer func() { | ||
| 62 | + transactionContext.RollbackTransaction() | ||
| 63 | + }() | ||
| 64 | + newProductRecord := &domain.ProductRecord{ | ||
| 65 | + ProductRecordId: createProductRecordCommand.ProductRecordId, | ||
| 66 | + } | ||
| 67 | + var productRecordRepository domain.ProductRecordRepository | ||
| 68 | + if value, err := factory.CreateProductRecordRepository(map[string]interface{}{ | ||
| 69 | + "transactionContext": transactionContext, | ||
| 70 | + }); err != nil { | ||
| 71 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 72 | + } else { | ||
| 73 | + productRecordRepository = value | ||
| 74 | + } | ||
| 75 | + if productRecord, err := productRecordRepository.Save(newProductRecord); err != nil { | ||
| 76 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 77 | + } else { | ||
| 78 | + if err := transactionContext.CommitTransaction(); err != nil { | ||
| 79 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 80 | + } | ||
| 81 | + return productRecord, nil | ||
| 82 | + } | ||
| 83 | +} | ||
| 84 | + | ||
| 85 | +// 返回生产记录服务 | ||
| 86 | +func (productRecordService *ProductRecordService) GetProductRecord(getProductRecordQuery *query.GetProductRecordQuery) (interface{}, error) { | ||
| 87 | + if err := getProductRecordQuery.ValidateQuery(); err != nil { | ||
| 88 | + return nil, application.ThrowError(application.ARG_ERROR, err.Error()) | ||
| 89 | + } | ||
| 90 | + transactionContext, err := factory.CreateTransactionContext(nil) | ||
| 91 | + if err != nil { | ||
| 92 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 93 | + } | ||
| 94 | + if err := transactionContext.StartTransaction(); err != nil { | ||
| 95 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 96 | + } | ||
| 97 | + defer func() { | ||
| 98 | + transactionContext.RollbackTransaction() | ||
| 99 | + }() | ||
| 100 | + var productRecordRepository domain.ProductRecordRepository | ||
| 101 | + if value, err := factory.CreateProductRecordRepository(map[string]interface{}{ | ||
| 102 | + "transactionContext": transactionContext, | ||
| 103 | + }); err != nil { | ||
| 104 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 105 | + } else { | ||
| 106 | + productRecordRepository = value | ||
| 107 | + } | ||
| 108 | + productRecord, err := productRecordRepository.FindOne(map[string]interface{}{"productRecordId": getProductRecordQuery.ProductRecordId}) | ||
| 109 | + if err != nil { | ||
| 110 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 111 | + } | ||
| 112 | + if productRecord == nil { | ||
| 113 | + return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(getProductRecordQuery.ProductRecordId))) | ||
| 114 | + } else { | ||
| 115 | + if err := transactionContext.CommitTransaction(); err != nil { | ||
| 116 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 117 | + } | ||
| 118 | + var result = &dto.ProductLevelTwoRecord{} | ||
| 119 | + return result.LoadDto(productRecord, productRecord.OrgId), nil | ||
| 120 | + } | ||
| 121 | +} | ||
| 122 | + | ||
| 123 | +// 返回生产记录服务列表 | ||
| 124 | +func (productRecordService *ProductRecordService) ListProductRecord(listProductRecordQuery *query.ListProductRecordQuery) (interface{}, error) { | ||
| 125 | + if err := listProductRecordQuery.ValidateQuery(); err != nil { | ||
| 126 | + return nil, application.ThrowError(application.ARG_ERROR, err.Error()) | ||
| 127 | + } | ||
| 128 | + transactionContext, err := factory.CreateTransactionContext(nil) | ||
| 129 | + if err != nil { | ||
| 130 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 131 | + } | ||
| 132 | + if err := transactionContext.StartTransaction(); err != nil { | ||
| 133 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 134 | + } | ||
| 135 | + defer func() { | ||
| 136 | + transactionContext.RollbackTransaction() | ||
| 137 | + }() | ||
| 138 | + var productRecordRepository domain.ProductRecordRepository | ||
| 139 | + if value, err := factory.CreateProductRecordRepository(map[string]interface{}{ | ||
| 140 | + "transactionContext": transactionContext, | ||
| 141 | + }); err != nil { | ||
| 142 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 143 | + } else { | ||
| 144 | + productRecordRepository = value | ||
| 145 | + } | ||
| 146 | + if count, productRecords, err := productRecordRepository.Find(tool_funs.SimpleStructToMap(listProductRecordQuery)); err != nil { | ||
| 147 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 148 | + } else { | ||
| 149 | + if err := transactionContext.CommitTransaction(); err != nil { | ||
| 150 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 151 | + } | ||
| 152 | + return map[string]interface{}{ | ||
| 153 | + "count": count, | ||
| 154 | + "productRecords": productRecords, | ||
| 155 | + }, nil | ||
| 156 | + } | ||
| 157 | +} | ||
| 158 | + | ||
| 159 | +// 移除生产记录服务 | ||
| 160 | +func (productRecordService *ProductRecordService) RemoveProductRecord(removeProductRecordCommand *command.RemoveProductRecordCommand) (interface{}, error) { | ||
| 161 | + if err := removeProductRecordCommand.ValidateCommand(); err != nil { | ||
| 162 | + return nil, application.ThrowError(application.ARG_ERROR, err.Error()) | ||
| 163 | + } | ||
| 164 | + transactionContext, err := factory.CreateTransactionContext(nil) | ||
| 165 | + if err != nil { | ||
| 166 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 167 | + } | ||
| 168 | + if err := transactionContext.StartTransaction(); err != nil { | ||
| 169 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 170 | + } | ||
| 171 | + defer func() { | ||
| 172 | + transactionContext.RollbackTransaction() | ||
| 173 | + }() | ||
| 174 | + var productRecordRepository domain.ProductRecordRepository | ||
| 175 | + if value, err := factory.CreateProductRecordRepository(map[string]interface{}{ | ||
| 176 | + "transactionContext": transactionContext, | ||
| 177 | + }); err != nil { | ||
| 178 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 179 | + } else { | ||
| 180 | + productRecordRepository = value | ||
| 181 | + } | ||
| 182 | + productRecord, err := productRecordRepository.FindOne(map[string]interface{}{"productRecordId": removeProductRecordCommand.ProductRecordId}) | ||
| 183 | + if err != nil { | ||
| 184 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 185 | + } | ||
| 186 | + if productRecord == nil { | ||
| 187 | + return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(removeProductRecordCommand.ProductRecordId))) | ||
| 188 | + } | ||
| 189 | + if productRecord, err := productRecordRepository.Remove(productRecord); err != nil { | ||
| 190 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 191 | + } else { | ||
| 192 | + if err := transactionContext.CommitTransaction(); err != nil { | ||
| 193 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 194 | + } | ||
| 195 | + return productRecord, nil | ||
| 196 | + } | ||
| 197 | +} | ||
| 198 | + | ||
| 199 | +// 更新生产记录服务 | ||
| 200 | +func (productRecordService *ProductRecordService) UpdateProductRecord(updateProductRecordCommand *command.UpdateProductRecordCommand) (interface{}, error) { | ||
| 201 | + if err := updateProductRecordCommand.ValidateCommand(); err != nil { | ||
| 202 | + return nil, application.ThrowError(application.ARG_ERROR, err.Error()) | ||
| 203 | + } | ||
| 204 | + transactionContext, err := factory.CreateTransactionContext(nil) | ||
| 205 | + if err != nil { | ||
| 206 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 207 | + } | ||
| 208 | + if err := transactionContext.StartTransaction(); err != nil { | ||
| 209 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 210 | + } | ||
| 211 | + defer func() { | ||
| 212 | + transactionContext.RollbackTransaction() | ||
| 213 | + }() | ||
| 214 | + var productRecordRepository domain.ProductRecordRepository | ||
| 215 | + if value, err := factory.CreateProductRecordRepository(map[string]interface{}{ | ||
| 216 | + "transactionContext": transactionContext, | ||
| 217 | + }); err != nil { | ||
| 218 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 219 | + } else { | ||
| 220 | + productRecordRepository = value | ||
| 221 | + } | ||
| 222 | + productRecord, err := productRecordRepository.FindOne(map[string]interface{}{"productRecordId": updateProductRecordCommand.ProductRecordId}) | ||
| 223 | + if err != nil { | ||
| 224 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 225 | + } | ||
| 226 | + if productRecord == nil { | ||
| 227 | + return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(updateProductRecordCommand.ProductRecordId))) | ||
| 228 | + } | ||
| 229 | + if err := productRecord.Update(tool_funs.SimpleStructToMap(updateProductRecordCommand)); err != nil { | ||
| 230 | + return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error()) | ||
| 231 | + } | ||
| 232 | + if productRecord, err := productRecordRepository.Save(productRecord); err != nil { | ||
| 233 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 234 | + } else { | ||
| 235 | + if err := transactionContext.CommitTransaction(); err != nil { | ||
| 236 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 237 | + } | ||
| 238 | + return productRecord, nil | ||
| 239 | + } | ||
| 240 | +} | ||
| 241 | + | ||
| 242 | +// 返回生产记录服务列表 | ||
| 243 | +func (productRecordService *ProductRecordService) SearchProductRecord(operateInfo *domain.OperateInfo, listProductRecordQuery *query.SearchProductRecordQuery) (int64, interface{}, error) { | ||
| 244 | + if err := listProductRecordQuery.ValidateQuery(); err != nil { | ||
| 245 | + return 0, nil, application.ThrowError(application.ARG_ERROR, err.Error()) | ||
| 246 | + } | ||
| 247 | + transactionContext, err := factory.CreateTransactionContext(nil) | ||
| 248 | + if err != nil { | ||
| 249 | + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 250 | + } | ||
| 251 | + if err := transactionContext.StartTransaction(); err != nil { | ||
| 252 | + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 253 | + } | ||
| 254 | + defer func() { | ||
| 255 | + transactionContext.RollbackTransaction() | ||
| 256 | + }() | ||
| 257 | + var productRecordRepository domain.ProductRecordRepository | ||
| 258 | + productRecordRepository, _, _ = factory.FastPgProductRecord(transactionContext, 0) | ||
| 259 | + | ||
| 260 | + count, productRecords, err := productRecordRepository.Find(utils.ObjectToMap(listProductRecordQuery)) | ||
| 261 | + if err != nil { | ||
| 262 | + return 0, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 263 | + } | ||
| 264 | + if err := transactionContext.CommitTransaction(); err != nil { | ||
| 265 | + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 266 | + } | ||
| 267 | + var result = make([]*dto.ProductLevelTwoRecord, 0) | ||
| 268 | + for i := range productRecords { | ||
| 269 | + item := productRecords[i] | ||
| 270 | + newItem := &dto.ProductLevelTwoRecord{} | ||
| 271 | + newItem.LoadDto(item, operateInfo.OrgId) | ||
| 272 | + result = append(result, newItem) | ||
| 273 | + } | ||
| 274 | + return count, result, nil | ||
| 275 | +} | ||
| 276 | + | ||
| 277 | +// 生产记录统计 | ||
| 278 | +func (productRecordService *ProductRecordService) ProductRecordStatics(cmd *command.ProductRecordStaticsCommand) (interface{}, error) { | ||
| 279 | + if err := cmd.ValidateCommand(); err != nil { | ||
| 280 | + return nil, application.ThrowError(application.ARG_ERROR, err.Error()) | ||
| 281 | + } | ||
| 282 | + transactionContext, err := factory.CreateTransactionContext(nil) | ||
| 283 | + if err != nil { | ||
| 284 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 285 | + } | ||
| 286 | + if err := transactionContext.StartTransaction(); err != nil { | ||
| 287 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 288 | + } | ||
| 289 | + defer func() { | ||
| 290 | + transactionContext.RollbackTransaction() | ||
| 291 | + }() | ||
| 292 | + var _ domain.ProductRecordRepository | ||
| 293 | + var productRecord *domain.ProductRecord = cmd.ProductRecord | ||
| 294 | + //_,productRecord,err = factory.FastPgProductRecord(transactionContext,cmd.ProductRecordId) | ||
| 295 | + //if err!=nil{ | ||
| 296 | + // log.Logger.Error(err.Error()) | ||
| 297 | + // return nil, nil | ||
| 298 | + //} | ||
| 299 | + // | ||
| 300 | + if productRecord == nil { | ||
| 301 | + return nil, nil | ||
| 302 | + } | ||
| 303 | + svr, _ := domainService.NewPGProductRecordService(transactionContext.(*pgTransaction.TransactionContext)) | ||
| 304 | + if _, err = svr.EmployeeProductStatics(productRecord); err != nil { | ||
| 305 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 306 | + } | ||
| 307 | + if err := transactionContext.CommitTransaction(); err != nil { | ||
| 308 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 309 | + } | ||
| 310 | + | ||
| 311 | + return nil, nil | ||
| 312 | +} | ||
| 313 | + | ||
| 314 | +func NewProductRecordService(options map[string]interface{}) *ProductRecordService { | ||
| 315 | + newProductRecordService := &ProductRecordService{} | ||
| 316 | + return newProductRecordService | ||
| 317 | +} |
| 1 | +package service | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/linmadan/egglib-go/core/application" | ||
| 5 | + pgTransaction "github.com/linmadan/egglib-go/transaction/pg" | ||
| 6 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory" | ||
| 7 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productRecord/dto" | ||
| 8 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productRecord/query" | ||
| 9 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
| 10 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/dao" | ||
| 11 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils" | ||
| 12 | +) | ||
| 13 | + | ||
| 14 | +// 返回员工生产记录服务列表 | ||
| 15 | +func (productRecordService *ProductRecordService) SearchWorkshopProductRecord(operateInfo *domain.OperateInfo, listProductRecordQuery *query.SearchWorkshopProductRecordQuery) (int64, interface{}, error) { | ||
| 16 | + if err := listProductRecordQuery.ValidateQuery(); err != nil { | ||
| 17 | + return 0, nil, application.ThrowError(application.ARG_ERROR, err.Error()) | ||
| 18 | + } | ||
| 19 | + transactionContext, err := factory.CreateTransactionContext(nil) | ||
| 20 | + if err != nil { | ||
| 21 | + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 22 | + } | ||
| 23 | + if err := transactionContext.StartTransaction(); err != nil { | ||
| 24 | + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 25 | + } | ||
| 26 | + defer func() { | ||
| 27 | + transactionContext.RollbackTransaction() | ||
| 28 | + }() | ||
| 29 | + //var productRecordRepository domain.ProductRecordRepository | ||
| 30 | + //productRecordRepository,_,_ = factory.FastPgProductRecord(transactionContext,0) | ||
| 31 | + | ||
| 32 | + productRecordRepository, _ := dao.NewEmployeeProductRecordDao(transactionContext.(*pgTransaction.TransactionContext)) | ||
| 33 | + options := utils.ObjectToMap(listProductRecordQuery) | ||
| 34 | + count, productRecords, err := productRecordRepository.SearchEmployeeProductRecord(options) | ||
| 35 | + if err != nil { | ||
| 36 | + return 0, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 37 | + } | ||
| 38 | + if err := transactionContext.CommitTransaction(); err != nil { | ||
| 39 | + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 40 | + } | ||
| 41 | + var result = make([]*dto.EmployeeProductRecordDto, 0) | ||
| 42 | + for i := range productRecords { | ||
| 43 | + item := productRecords[i] | ||
| 44 | + newItem := &dto.EmployeeProductRecordDto{} | ||
| 45 | + newItem.LoadDto(item, operateInfo.OrgId) | ||
| 46 | + result = append(result, newItem) | ||
| 47 | + } | ||
| 48 | + return count, result, nil | ||
| 49 | +} |
| @@ -10,6 +10,8 @@ var ( | @@ -10,6 +10,8 @@ var ( | ||
| 10 | DISABLE_REPOSITORY_CACHE = false | 10 | DISABLE_REPOSITORY_CACHE = false |
| 11 | // 缓存过期时间 单位秒 | 11 | // 缓存过期时间 单位秒 |
| 12 | REPOSITORY_CACHE_EXPIRE = 30 * 60 | 12 | REPOSITORY_CACHE_EXPIRE = 30 * 60 |
| 13 | + | ||
| 14 | + REDIS_ADDRESS = "" | ||
| 13 | ) | 15 | ) |
| 14 | 16 | ||
| 15 | func init() { | 17 | func init() { |
| @@ -29,4 +31,5 @@ func init() { | @@ -29,4 +31,5 @@ func init() { | ||
| 29 | if os.Getenv("DISABLE_REPOSITORY_CACHE") != "" { | 31 | if os.Getenv("DISABLE_REPOSITORY_CACHE") != "" { |
| 30 | DISABLE_REPOSITORY_CACHE = true | 32 | DISABLE_REPOSITORY_CACHE = true |
| 31 | } | 33 | } |
| 34 | + REDIS_ADDRESS = REDIS_HOST + ":" + REDIS_PORT | ||
| 32 | } | 35 | } |
pkg/domain/employee_product_record.go
0 → 100644
| 1 | +package domain | ||
| 2 | + | ||
| 3 | +import "time" | ||
| 4 | + | ||
| 5 | +const ( | ||
| 6 | + ParticipateNormal = 1 | ||
| 7 | + ParticipateSupport = 2 | ||
| 8 | +) | ||
| 9 | + | ||
| 10 | +// 员工生产记录 | ||
| 11 | +type EmployeeProductRecord struct { | ||
| 12 | + // 企业id | ||
| 13 | + CompanyId int `json:"companyId,omitempty"` | ||
| 14 | + // 组织ID | ||
| 15 | + OrgId int `json:"orgId,omitempty"` | ||
| 16 | + // 员工产能记录ID | ||
| 17 | + EmployeeProductRecordId int `json:"employeeProductRecordId"` | ||
| 18 | + // 工作位置 | ||
| 19 | + WorkStation *WorkStation `json:"workStation"` | ||
| 20 | + // 上班班次 1:全天 2:白班 4:中班 8:夜班 | ||
| 21 | + WorkOn int `json:"workOn"` | ||
| 22 | + // 参与类型 1:正常 2:支援 | ||
| 23 | + ParticipateType int `json:"participateType"` | ||
| 24 | + // 产能 | ||
| 25 | + ProductWeigh float64 `json:"productWeigh"` | ||
| 26 | + // 二级品产能 | ||
| 27 | + SecondLevelWeigh float64 `json:"secondLevelWeigh"` | ||
| 28 | + // 创建时间 | ||
| 29 | + CreatedAt time.Time `json:"createdAt"` | ||
| 30 | + // 更新时间 | ||
| 31 | + UpdatedAt time.Time `json:"updatedAt"` | ||
| 32 | + // 删除时间 | ||
| 33 | + DeletedAt time.Time `json:"deletedAt"` | ||
| 34 | + // 扩展 | ||
| 35 | + Ext *Ext `json:"ext"` | ||
| 36 | + // 版本号 | ||
| 37 | + Version int `json:"version"` | ||
| 38 | + // 生产记录信息 | ||
| 39 | + ProductRecordInfo *EmployeeProductRecordInfo `json:"productRecordInfo"` | ||
| 40 | + // 生产工人 | ||
| 41 | + ProductWorker *User `comment:"生产工人"` | ||
| 42 | +} | ||
| 43 | + | ||
| 44 | +type EmployeeProductRecordInfo struct { | ||
| 45 | + // 生产日期 | ||
| 46 | + ProductDate string `json:"productDate"` | ||
| 47 | + // 原始上报数据 | ||
| 48 | + //OriginalWeigh float64 `json:"originalWeigh,omitempty"` | ||
| 49 | + // 换算后的产能 | ||
| 50 | + //Weigh float64 `json:"weigh"` | ||
| 51 | + // 产能 - 审核前 | ||
| 52 | + //WeighBefore float64 `json:"weighBefore"` | ||
| 53 | + // 产能-审核后 | ||
| 54 | + //WeighAfter float64 `json:"weighAfter"` | ||
| 55 | + // 审核状态 1:未审核 2:已审核 | ||
| 56 | + //ApproveStatus int64 `json:"approveStatus"` | ||
| 57 | + // 审核时间 | ||
| 58 | + //ApproveAt int64 `json:"approveAt"` | ||
| 59 | + // 审核人 | ||
| 60 | + //ApproveUser *User `json:"approveUser"` | ||
| 61 | + // 物料信息 | ||
| 62 | + //Material *UnitConversion `json:"material,omitempty"` | ||
| 63 | + // 生产计划信息(批次) | ||
| 64 | + //ProductPlan *ProductPlan `json:"productPlan,omitempty"` | ||
| 65 | + // 单位换算ID | ||
| 66 | + //UnitConversionId int `json:"unitConversionId,omitempty"` | ||
| 67 | + | ||
| 68 | + // 生产计划ID | ||
| 69 | + ProductPlanId int `json:"productPlanId,omitempty"` | ||
| 70 | + // 计划的产品名称 | ||
| 71 | + PlanProductName string `json:"planProductName,omitempty"` | ||
| 72 | + // 批号 | ||
| 73 | + BatchNumber string `json:"batchNumber,omitempty"` | ||
| 74 | + | ||
| 75 | + // 生产小组ID | ||
| 76 | + ProductGroupId int `json:"productGroupId,omitempty"` | ||
| 77 | +} | ||
| 78 | + | ||
| 79 | +type EmployeeProductRecordRepository interface { | ||
| 80 | + Save(employeeProductRecord *EmployeeProductRecord) (*EmployeeProductRecord, error) | ||
| 81 | + Remove(employeeProductRecord *EmployeeProductRecord) (*EmployeeProductRecord, error) | ||
| 82 | + FindOne(queryOptions map[string]interface{}) (*EmployeeProductRecord, error) | ||
| 83 | + Find(queryOptions map[string]interface{}) (int64, []*EmployeeProductRecord, error) | ||
| 84 | +} | ||
| 85 | + | ||
| 86 | +func (employeeProductRecord *EmployeeProductRecord) Identify() interface{} { | ||
| 87 | + if employeeProductRecord.EmployeeProductRecordId == 0 { | ||
| 88 | + return nil | ||
| 89 | + } | ||
| 90 | + return employeeProductRecord.EmployeeProductRecordId | ||
| 91 | +} | ||
| 92 | + | ||
| 93 | +func (employeeProductRecord *EmployeeProductRecord) Update(data map[string]interface{}) error { | ||
| 94 | + return nil | ||
| 95 | +} | ||
| 96 | + | ||
| 97 | +func (employeeProductRecord *EmployeeProductRecord) UpdateProductWeigh(weigh float64, productRecordType int) { | ||
| 98 | + if productRecordType == RecordTypeSecondLevelWeigh { | ||
| 99 | + employeeProductRecord.SecondLevelWeigh += weigh | ||
| 100 | + } | ||
| 101 | + if productRecordType == RecordTypeReceiveMaterial { | ||
| 102 | + employeeProductRecord.ProductWeigh += weigh | ||
| 103 | + } | ||
| 104 | + if productRecordType == RecordTypeReturnMaterial { | ||
| 105 | + employeeProductRecord.ProductWeigh -= weigh | ||
| 106 | + } | ||
| 107 | + employeeProductRecord.UpdatedAt = time.Now() | ||
| 108 | + employeeProductRecord.Version += 1 | ||
| 109 | +} | ||
| 110 | + | ||
| 111 | +func (employeeProductRecord *EmployeeProductRecord) RealProductWeigh() float64 { | ||
| 112 | + return employeeProductRecord.ProductWeigh - employeeProductRecord.SecondLevelWeigh | ||
| 113 | +} | ||
| 114 | + | ||
| 115 | +func (employeeProductRecord *EmployeeProductRecord) QualificationRate() int { | ||
| 116 | + if employeeProductRecord.ProductWeigh == employeeProductRecord.SecondLevelWeigh { | ||
| 117 | + return 0 | ||
| 118 | + } | ||
| 119 | + result := int((employeeProductRecord.ProductWeigh - employeeProductRecord.SecondLevelWeigh) * 100 / employeeProductRecord.ProductWeigh) | ||
| 120 | + return result | ||
| 121 | +} |
| 1 | package domain | 1 | package domain |
| 2 | 2 | ||
| 3 | -import "time" | 3 | +import ( |
| 4 | + "errors" | ||
| 5 | + "fmt" | ||
| 6 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant" | ||
| 7 | + "time" | ||
| 8 | +) | ||
| 4 | 9 | ||
| 5 | const ( | 10 | const ( |
| 6 | RecordTypeReceiveMaterial = 1 // 领料 | 11 | RecordTypeReceiveMaterial = 1 // 领料 |
| @@ -57,3 +62,23 @@ func (productRecord *ProductRecord) Identify() interface{} { | @@ -57,3 +62,23 @@ func (productRecord *ProductRecord) Identify() interface{} { | ||
| 57 | func (productRecord *ProductRecord) Update(data map[string]interface{}) error { | 62 | func (productRecord *ProductRecord) Update(data map[string]interface{}) error { |
| 58 | return nil | 63 | return nil |
| 59 | } | 64 | } |
| 65 | + | ||
| 66 | +func (productRecord *ProductRecord) Approve(approveUser *User, weighAfter float64, approveAt time.Time) error { | ||
| 67 | + if productRecord.ProductRecordInfo.ApproveAt > 0 { | ||
| 68 | + return errors.New("已审核") | ||
| 69 | + } | ||
| 70 | + if weighAfter <= 0 { | ||
| 71 | + return errors.New("审核后重量必须大于0") | ||
| 72 | + } | ||
| 73 | + productRecord.ProductRecordInfo.ApproveAt = approveAt.Unix() | ||
| 74 | + productRecord.ProductRecordInfo.ApproveStatus = ProductRecordApproved | ||
| 75 | + productRecord.ProductRecordInfo.ApproveUser = approveUser | ||
| 76 | + productRecord.ProductRecordInfo.WeighAfter = weighAfter | ||
| 77 | + productRecord.ProductRecordInfo.Weigh = weighAfter | ||
| 78 | + productRecord.UpdatedAt = time.Now() | ||
| 79 | + return nil | ||
| 80 | +} | ||
| 81 | + | ||
| 82 | +func TaskKeyPatternProductRecordStatics() string { | ||
| 83 | + return fmt.Sprintf("%v:task:product-record:statics", constant.CACHE_PREFIX) | ||
| 84 | +} |
| @@ -7,15 +7,17 @@ type ProductRecordInfo struct { | @@ -7,15 +7,17 @@ type ProductRecordInfo struct { | ||
| 7 | // 原始上报数据 | 7 | // 原始上报数据 |
| 8 | OriginalWeigh float64 `json:"originalWeigh,omitempty"` | 8 | OriginalWeigh float64 `json:"originalWeigh,omitempty"` |
| 9 | // 换算后的产能 | 9 | // 换算后的产能 |
| 10 | - Weigh float64 `json:"weigh,omitempty"` | 10 | + Weigh float64 `json:"weigh"` |
| 11 | // 产能 - 审核前 | 11 | // 产能 - 审核前 |
| 12 | - WeighBefore float64 `json:"weighBefore,omitempty"` | 12 | + WeighBefore float64 `json:"weighBefore"` |
| 13 | // 产能-审核后 | 13 | // 产能-审核后 |
| 14 | - WeighAfter float64 `json:"weighAfter,omitempty"` | 14 | + WeighAfter float64 `json:"weighAfter"` |
| 15 | // 审核状态 1:未审核 2:已审核 | 15 | // 审核状态 1:未审核 2:已审核 |
| 16 | ApproveStatus int64 `json:"approveStatus"` | 16 | ApproveStatus int64 `json:"approveStatus"` |
| 17 | // 审核时间 | 17 | // 审核时间 |
| 18 | ApproveAt int64 `json:"approveAt"` | 18 | ApproveAt int64 `json:"approveAt"` |
| 19 | + // 审核人 | ||
| 20 | + ApproveUser *User `json:"approveUser"` | ||
| 19 | // 物料信息 | 21 | // 物料信息 |
| 20 | //Material *UnitConversion `json:"material,omitempty"` | 22 | //Material *UnitConversion `json:"material,omitempty"` |
| 21 | // 生产计划信息(批次) | 23 | // 生产计划信息(批次) |
| 1 | +package dao | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "github.com/linmadan/egglib-go/persistent/pg/sqlbuilder" | ||
| 6 | + pgTransaction "github.com/linmadan/egglib-go/transaction/pg" | ||
| 7 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
| 8 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/models" | ||
| 9 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/transform" | ||
| 10 | + "time" | ||
| 11 | +) | ||
| 12 | + | ||
| 13 | +type AttendanceRecordDao struct { | ||
| 14 | + transactionContext *pgTransaction.TransactionContext | ||
| 15 | +} | ||
| 16 | + | ||
| 17 | +func NewAttendanceRecordDao(transactionContext *pgTransaction.TransactionContext) (*AttendanceRecordDao, error) { | ||
| 18 | + if transactionContext == nil { | ||
| 19 | + return nil, fmt.Errorf("transactionContext参数不能为nil") | ||
| 20 | + } else { | ||
| 21 | + return &AttendanceRecordDao{ | ||
| 22 | + transactionContext: transactionContext, | ||
| 23 | + }, nil | ||
| 24 | + } | ||
| 25 | +} | ||
| 26 | + | ||
| 27 | +// 生产工段的考勤记录 | ||
| 28 | +func (dao *AttendanceRecordDao) ProductWorkStationAttendanceRecord(companyId, orgId int, workStationId string, productTime time.Time) (int64, []*domain.ProductAttendanceRecord, error) { | ||
| 29 | + tx := dao.transactionContext.PgTx | ||
| 30 | + var productAttendanceRecordModels []*models.ProductAttendanceRecord | ||
| 31 | + productAttendanceRecords := make([]*domain.ProductAttendanceRecord, 0) | ||
| 32 | + query := sqlbuilder.BuildQuery(tx.Model(&productAttendanceRecordModels), map[string]interface{}{}) | ||
| 33 | + query.Where("company_id = ?", companyId) | ||
| 34 | + query.Where("org_id = ?", orgId) | ||
| 35 | + query.Where("work_station->>'workStationId' = ?", workStationId) | ||
| 36 | + query.Where("sign_in <= ?", productTime) | ||
| 37 | + query.Where("sign_out >= ?", productTime) | ||
| 38 | + query.SetOffsetAndLimit(domain.MaxQueryRow) | ||
| 39 | + query.SetOrderDirect("product_attendance_id", "DESC") | ||
| 40 | + if count, err := query.SelectAndCount(); err != nil { | ||
| 41 | + return 0, productAttendanceRecords, err | ||
| 42 | + } else { | ||
| 43 | + for _, productAttendanceRecordModel := range productAttendanceRecordModels { | ||
| 44 | + if productAttendanceRecord, err := transform.TransformToProductAttendanceRecordDomainModelFromPgModels(productAttendanceRecordModel); err != nil { | ||
| 45 | + return 0, productAttendanceRecords, err | ||
| 46 | + } else { | ||
| 47 | + productAttendanceRecords = append(productAttendanceRecords, productAttendanceRecord) | ||
| 48 | + } | ||
| 49 | + } | ||
| 50 | + return int64(count), productAttendanceRecords, nil | ||
| 51 | + } | ||
| 52 | +} |
| 1 | +package dao | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "github.com/go-pg/pg/v10" | ||
| 6 | + "github.com/linmadan/egglib-go/persistent/pg/sqlbuilder" | ||
| 7 | + pgTransaction "github.com/linmadan/egglib-go/transaction/pg" | ||
| 8 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
| 9 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/models" | ||
| 10 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/transform" | ||
| 11 | + "time" | ||
| 12 | +) | ||
| 13 | + | ||
| 14 | +type EmployeeProductRecordDao struct { | ||
| 15 | + transactionContext *pgTransaction.TransactionContext | ||
| 16 | +} | ||
| 17 | + | ||
| 18 | +func NewEmployeeProductRecordDao(transactionContext *pgTransaction.TransactionContext) (*EmployeeProductRecordDao, error) { | ||
| 19 | + if transactionContext == nil { | ||
| 20 | + return nil, fmt.Errorf("transactionContext参数不能为nil") | ||
| 21 | + } else { | ||
| 22 | + return &EmployeeProductRecordDao{ | ||
| 23 | + transactionContext: transactionContext, | ||
| 24 | + }, nil | ||
| 25 | + } | ||
| 26 | +} | ||
| 27 | + | ||
| 28 | +// 员工对应批次的生产记录 (生产日期) | ||
| 29 | +func (dao *EmployeeProductRecordDao) WorkerProductRecord(companyId, orgId, planId, workerId int, productTime time.Time) (*domain.EmployeeProductRecord, error) { | ||
| 30 | + tx := dao.transactionContext.PgTx | ||
| 31 | + employeeProductRecordModel := new(models.EmployeeProductRecord) | ||
| 32 | + query := sqlbuilder.BuildQuery(tx.Model(employeeProductRecordModel), map[string]interface{}{}) | ||
| 33 | + query.Where("company_id = ?", companyId) | ||
| 34 | + query.Where("org_id = ?", orgId) | ||
| 35 | + query.Where("product_worker ->>'userId' = '?'", workerId) | ||
| 36 | + query.Where("product_record_info ->>'productPlanId' = '?'", planId) | ||
| 37 | + query.Where("product_record_info ->>'productDate' = ?", productTime.Format("2006-01-02")) | ||
| 38 | + if err := query.First(); err != nil { | ||
| 39 | + if err.Error() == "pg: no rows in result set" { | ||
| 40 | + return nil, domain.ErrorNotFound | ||
| 41 | + } else { | ||
| 42 | + return nil, err | ||
| 43 | + } | ||
| 44 | + } | ||
| 45 | + if employeeProductRecordModel.EmployeeProductRecordId == 0 { | ||
| 46 | + return nil, domain.ErrorNotFound | ||
| 47 | + } else { | ||
| 48 | + return transform.TransformToEmployeeProductRecordDomainModelFromPgModels(employeeProductRecordModel) | ||
| 49 | + } | ||
| 50 | +} | ||
| 51 | + | ||
| 52 | +func (dao *EmployeeProductRecordDao) SearchEmployeeProductRecord(queryOptions map[string]interface{}) (int64, []*domain.EmployeeProductRecord, error) { | ||
| 53 | + tx := dao.transactionContext.PgTx | ||
| 54 | + var employeeProductRecordModels []*models.EmployeeProductRecord | ||
| 55 | + employeeProductRecords := make([]*domain.EmployeeProductRecord, 0) | ||
| 56 | + query := sqlbuilder.BuildQuery(tx.Model(&employeeProductRecordModels), queryOptions) | ||
| 57 | + query.SetWhereByQueryOption("company_id = ?", "companyId") | ||
| 58 | + query.SetWhereByQueryOption("org_id = ?", "orgId") | ||
| 59 | + if v, ok := queryOptions["inOrgIds"]; ok && len(v.([]int)) > 0 { | ||
| 60 | + query.Where(`org_id in (?)`, pg.In(v)) | ||
| 61 | + } | ||
| 62 | + if v, ok := queryOptions["workshopName"]; ok && len(v.(string)) > 0 { | ||
| 63 | + query.Where(fmt.Sprintf(`work_station->>'workshopName' like '%%%v%%'`, v)) | ||
| 64 | + } | ||
| 65 | + if v, ok := queryOptions["lineName"]; ok && len(v.(string)) > 0 { | ||
| 66 | + query.Where(fmt.Sprintf(`work_station->>'lineName' like '%%%v%%'`, v)) | ||
| 67 | + } | ||
| 68 | + if v, ok := queryOptions["sectionName"]; ok && len(v.(string)) > 0 { | ||
| 69 | + query.Where(fmt.Sprintf(`work_station->>'sectionName' like '%%%v%%'`, v)) | ||
| 70 | + } | ||
| 71 | + if v, ok := queryOptions["userName"]; ok && len(v.(string)) > 0 { | ||
| 72 | + query.Where(fmt.Sprintf(`product_worker->>'userName' like '%%%v%%'`, v)) | ||
| 73 | + } | ||
| 74 | + if v, ok := queryOptions["employeeType"]; ok && len(v.(string)) > 0 { | ||
| 75 | + query.Where(fmt.Sprintf(`product_worker->>'employeeType' = '%v'`, v)) | ||
| 76 | + } | ||
| 77 | + if v, ok := queryOptions["productBeginTime"]; ok && !((v.(time.Time)).IsZero()) { | ||
| 78 | + query.Where("created_at>=?", v.(time.Time)) | ||
| 79 | + } | ||
| 80 | + if v, ok := queryOptions["productEndTime"]; ok && !((v.(time.Time)).IsZero()) { | ||
| 81 | + query.Where("created_at<?", v.(time.Time)) | ||
| 82 | + } | ||
| 83 | + query.SetOffsetAndLimit(domain.MaxQueryRow) | ||
| 84 | + query.SetOrderDirect("employee_product_record_id", "DESC") | ||
| 85 | + if count, err := query.SelectAndCount(); err != nil { | ||
| 86 | + return 0, employeeProductRecords, err | ||
| 87 | + } else { | ||
| 88 | + for _, employeeProductRecordModel := range employeeProductRecordModels { | ||
| 89 | + if employeeProductRecord, err := transform.TransformToEmployeeProductRecordDomainModelFromPgModels(employeeProductRecordModel); err != nil { | ||
| 90 | + return 0, employeeProductRecords, err | ||
| 91 | + } else { | ||
| 92 | + employeeProductRecords = append(employeeProductRecords, employeeProductRecord) | ||
| 93 | + } | ||
| 94 | + } | ||
| 95 | + return int64(count), employeeProductRecords, nil | ||
| 96 | + } | ||
| 97 | +} | ||
| 98 | + | ||
| 99 | +// 车间生产记录 | ||
| 100 | +func (dao *EmployeeProductRecordDao) SearchWorkshopProductRecord(queryOptions map[string]interface{}) (int64, []*domain.EmployeeProductRecord, error) { | ||
| 101 | + tx := dao.transactionContext.PgTx | ||
| 102 | + var employeeProductRecordModels []*models.EmployeeProductRecord | ||
| 103 | + employeeProductRecords := make([]*domain.EmployeeProductRecord, 0) | ||
| 104 | + query := sqlbuilder.BuildQuery(tx.Model(&employeeProductRecordModels), queryOptions) | ||
| 105 | + query.SetWhereByQueryOption("company_id = ?", "companyId") | ||
| 106 | + query.SetWhereByQueryOption("org_id = ?", "orgId") | ||
| 107 | + if v, ok := queryOptions["inOrgIds"]; ok && len(v.([]int)) > 0 { | ||
| 108 | + query.Where(`org_id in (?)`, pg.In(v)) | ||
| 109 | + } | ||
| 110 | + if v, ok := queryOptions["sectionName"]; ok && len(v.(string)) > 0 { | ||
| 111 | + query.Where(fmt.Sprintf(`work_station->>'sectionName' like '%%%v%%'`, v)) | ||
| 112 | + } | ||
| 113 | + if v, ok := queryOptions["planProductName"]; ok && len(v.(string)) > 0 { | ||
| 114 | + query.Where(fmt.Sprintf(`product_record_info->>'planProductName' like '%%%v%%'`, v)) | ||
| 115 | + } | ||
| 116 | + if v, ok := queryOptions["productBeginTime"]; ok && !((v.(time.Time)).IsZero()) { | ||
| 117 | + query.Where("created_at>=?", v.(time.Time)) | ||
| 118 | + } | ||
| 119 | + if v, ok := queryOptions["productEndTime"]; ok && !((v.(time.Time)).IsZero()) { | ||
| 120 | + query.Where("created_at<?", v.(time.Time)) | ||
| 121 | + } | ||
| 122 | + query.Group("company_id,org_id,work_station->>'workStationId',product_record_info->>'productPlanId'") | ||
| 123 | + query.SetOffsetAndLimit(domain.MaxQueryRow) | ||
| 124 | + //query.SetOrderDirect("employee_product_record_id", "DESC") | ||
| 125 | + if count, err := query.SelectAndCount(); err != nil { | ||
| 126 | + return 0, employeeProductRecords, err | ||
| 127 | + } else { | ||
| 128 | + for _, employeeProductRecordModel := range employeeProductRecordModels { | ||
| 129 | + if employeeProductRecord, err := transform.TransformToEmployeeProductRecordDomainModelFromPgModels(employeeProductRecordModel); err != nil { | ||
| 130 | + return 0, employeeProductRecords, err | ||
| 131 | + } else { | ||
| 132 | + employeeProductRecords = append(employeeProductRecords, employeeProductRecord) | ||
| 133 | + } | ||
| 134 | + } | ||
| 135 | + return int64(count), employeeProductRecords, nil | ||
| 136 | + } | ||
| 137 | +} |
| @@ -2,8 +2,11 @@ package domainService | @@ -2,8 +2,11 @@ package domainService | ||
| 2 | 2 | ||
| 3 | import ( | 3 | import ( |
| 4 | "fmt" | 4 | "fmt" |
| 5 | + "github.com/hibiken/asynq" | ||
| 5 | "github.com/linmadan/egglib-go/core/application" | 6 | "github.com/linmadan/egglib-go/core/application" |
| 6 | pgTransaction "github.com/linmadan/egglib-go/transaction/pg" | 7 | pgTransaction "github.com/linmadan/egglib-go/transaction/pg" |
| 8 | + "github.com/linmadan/egglib-go/utils/json" | ||
| 9 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant" | ||
| 7 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | 10 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" |
| 8 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/repository" | 11 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/repository" |
| 9 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils" | 12 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils" |
| @@ -119,9 +122,55 @@ func (ptr *PGProductRecordService) SubmitProductRecord(productRecordType int, qu | @@ -119,9 +122,55 @@ func (ptr *PGProductRecordService) SubmitProductRecord(productRecordType int, qu | ||
| 119 | if record, err = productRecordRepository.Save(record); err != nil { | 122 | if record, err = productRecordRepository.Save(record); err != nil { |
| 120 | return nil, err | 123 | return nil, err |
| 121 | } | 124 | } |
| 125 | + | ||
| 126 | + // 发送Job | ||
| 127 | + if productRecordType == domain.RecordTypeReceiveMaterial || productRecordType == domain.RecordTypeReturnMaterial { | ||
| 128 | + // 发送Job | ||
| 129 | + if err = SendProductRecordStaticsJob(record); err != nil { | ||
| 130 | + return nil, err | ||
| 131 | + } | ||
| 132 | + } | ||
| 122 | return nil, nil | 133 | return nil, nil |
| 123 | } | 134 | } |
| 124 | 135 | ||
| 136 | +// Approve 审核生产记录 (二级品审核) | ||
| 137 | +func (ptr *PGProductRecordService) Approve(productRecordId int, approveUserId int, weighAfter float64, approveAt time.Time) (interface{}, error) { | ||
| 138 | + productRecordRepository, err := repository.NewProductRecordRepository(ptr.transactionContext) | ||
| 139 | + | ||
| 140 | + var productRecord *domain.ProductRecord | ||
| 141 | + productRecord, err = productRecordRepository.FindOne(map[string]interface{}{"productRecordId": productRecordId}) | ||
| 142 | + if err != nil { | ||
| 143 | + return nil, err | ||
| 144 | + } | ||
| 145 | + | ||
| 146 | + var user *domain.User | ||
| 147 | + userService := NewUserService() | ||
| 148 | + user, err = userService.User(approveUserId) | ||
| 149 | + if err != nil { | ||
| 150 | + return nil, err | ||
| 151 | + } | ||
| 152 | + | ||
| 153 | + if err = productRecord.Approve(user, weighAfter, approveAt); err != nil { | ||
| 154 | + return nil, err | ||
| 155 | + } | ||
| 156 | + if _, err = productRecordRepository.Save(productRecord); err != nil { | ||
| 157 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 158 | + } | ||
| 159 | + // 发送Job | ||
| 160 | + if err = SendProductRecordStaticsJob(productRecord); err != nil { | ||
| 161 | + return nil, err | ||
| 162 | + } | ||
| 163 | + return struct{}{}, nil | ||
| 164 | +} | ||
| 165 | + | ||
| 166 | +func SendProductRecordStaticsJob(productRecord *domain.ProductRecord) error { | ||
| 167 | + task := asynq.NewTask(domain.TaskKeyPatternProductRecordStatics(), []byte(json.MarshalToString(productRecord))) | ||
| 168 | + | ||
| 169 | + client := asynq.NewClient(asynq.RedisClientOpt{Addr: constant.REDIS_ADDRESS}) | ||
| 170 | + _, err := client.Enqueue(task) | ||
| 171 | + return err | ||
| 172 | +} | ||
| 173 | + | ||
| 125 | func NewPGProductRecordService(transactionContext *pgTransaction.TransactionContext) (*PGProductRecordService, error) { | 174 | func NewPGProductRecordService(transactionContext *pgTransaction.TransactionContext) (*PGProductRecordService, error) { |
| 126 | if transactionContext == nil { | 175 | if transactionContext == nil { |
| 127 | return nil, fmt.Errorf("transactionContext参数不能为nil") | 176 | return nil, fmt.Errorf("transactionContext参数不能为nil") |
| 1 | +package domainService | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
| 6 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/dao" | ||
| 7 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/repository" | ||
| 8 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log" | ||
| 9 | + "time" | ||
| 10 | +) | ||
| 11 | + | ||
| 12 | +const ( | ||
| 13 | + ProductSection1 = "打料" | ||
| 14 | + ProductSection2 = "成型" | ||
| 15 | + ProductSection3 = "穿串" | ||
| 16 | + ProductSection4 = "包装" | ||
| 17 | +) | ||
| 18 | + | ||
| 19 | +//EmployeeProductStatics 员工产能统计 | ||
| 20 | +func (ptr *PGProductRecordService) EmployeeProductStatics(productRecord *domain.ProductRecord) (interface{}, error) { | ||
| 21 | + | ||
| 22 | + var ( | ||
| 23 | + workshopRepository, _ = repository.NewWorkshopRepository(ptr.transactionContext) | ||
| 24 | + productPlanRepository, _ = repository.NewProductPlanRepository(ptr.transactionContext) | ||
| 25 | + productGroupRepository, _ = repository.NewProductGroupRepository(ptr.transactionContext) | ||
| 26 | + employeeProductRecordRepository, _ = repository.NewEmployeeProductRecordRepository(ptr.transactionContext) | ||
| 27 | + ) | ||
| 28 | + | ||
| 29 | + var ( | ||
| 30 | + cid = productRecord.CompanyId | ||
| 31 | + oid = productRecord.OrgId | ||
| 32 | + planId = productRecord.ProductRecordInfo.ProductPlanId | ||
| 33 | + productPlan *domain.ProductPlan | ||
| 34 | + err error | ||
| 35 | + ) | ||
| 36 | + | ||
| 37 | + switch productRecord.WorkStation.SectionName { | ||
| 38 | + case ProductSection1: | ||
| 39 | + if productRecord.ProductRecordType == domain.RecordTypeSecondLevelWeigh { | ||
| 40 | + //查询生产记录 批次、生产日期、下(成型)所有二级品 | ||
| 41 | + // 更新打料的二级品需要再一次更新成型的二级品 | ||
| 42 | + if section, err := FindSectionByName(workshopRepository, productRecord.WorkStation.WorkshopId, productRecord.WorkStation.LineId, ProductSection2); err == nil && section != nil { | ||
| 43 | + nextProductRecord := *productRecord | ||
| 44 | + nextProductRecord.WorkStation.SectionName = ProductSection2 | ||
| 45 | + nextProductRecord.WorkStation.SectionId = section.SectionId | ||
| 46 | + ptr.EmployeeProductStatics(&nextProductRecord) | ||
| 47 | + } | ||
| 48 | + } | ||
| 49 | + break | ||
| 50 | + case ProductSection2: | ||
| 51 | + break | ||
| 52 | + case ProductSection3: | ||
| 53 | + break | ||
| 54 | + case ProductSection4: //个人特殊处理 | ||
| 55 | + return ptr.personalProductStatics(productRecord) | ||
| 56 | + default: | ||
| 57 | + return nil, nil //ptr.personalProductStatics(productRecord) | ||
| 58 | + } | ||
| 59 | + | ||
| 60 | + productPlan, err = productPlanRepository.FindOne(map[string]interface{}{"productPlanId": planId}) | ||
| 61 | + if err != nil { | ||
| 62 | + return nil, err | ||
| 63 | + } | ||
| 64 | + | ||
| 65 | + // 集体 | ||
| 66 | + // 1.查询员工 -》 员工打卡记录 工位+打卡日期 | ||
| 67 | + // 2.打卡记录的时间区间 在生产记录上报的时间范围内 | ||
| 68 | + attendanceRecordDao, _ := dao.NewAttendanceRecordDao(ptr.transactionContext) | ||
| 69 | + _, attendanceRecords, err := attendanceRecordDao.ProductWorkStationAttendanceRecord(cid, oid, productRecord.WorkStation.WorkStationId, productRecord.CreatedAt) | ||
| 70 | + if err != nil || len(attendanceRecords) == 0 { | ||
| 71 | + return nil, err | ||
| 72 | + } | ||
| 73 | + | ||
| 74 | + // 2.1 判断是否是支援类型 有打卡记录,员工是否是属于该工段的员工 | ||
| 75 | + groupMembers, groupMembersKeyFunc := FindGroupMembers(productGroupRepository, cid, oid, productRecord.WorkStation.WorkStationId) | ||
| 76 | + employeeProductRecordDao, _ := dao.NewEmployeeProductRecordDao(ptr.transactionContext) | ||
| 77 | + for i := 0; i < len(attendanceRecords); i++ { | ||
| 78 | + r := attendanceRecords[i] | ||
| 79 | + participateType := domain.ParticipateNormal | ||
| 80 | + if _, ok := groupMembers[groupMembersKeyFunc(r.ProductWorker.UserId)]; !ok { | ||
| 81 | + participateType = domain.ParticipateSupport | ||
| 82 | + } | ||
| 83 | + var employeeProductRecord *domain.EmployeeProductRecord | ||
| 84 | + employeeProductRecord, err = employeeProductRecordDao.WorkerProductRecord(cid, oid, productRecord.ProductRecordInfo.ProductPlanId, r.ProductWorker.UserId, productRecord.CreatedAt) | ||
| 85 | + if err == domain.ErrorNotFound { | ||
| 86 | + employeeProductRecord = newEmployeeProductRecord(productRecord, participateType, productPlan, r.ProductWorker) | ||
| 87 | + } else { | ||
| 88 | + log.Logger.Error(err.Error()) | ||
| 89 | + continue | ||
| 90 | + } | ||
| 91 | + employeeProductRecord.UpdateProductWeigh(productRecord.ProductRecordInfo.Weigh, productRecord.ProductRecordType) | ||
| 92 | + | ||
| 93 | + if employeeProductRecord, err = employeeProductRecordRepository.Save(employeeProductRecord); err != nil { | ||
| 94 | + // TODO:异常处理 | ||
| 95 | + log.Logger.Error(fmt.Sprintf("生产记录:[%v] 员工:[%v] 处理异常:%v", productRecord.ProductRecordId, r.ProductWorker.UserId, err.Error())) | ||
| 96 | + continue | ||
| 97 | + } | ||
| 98 | + } | ||
| 99 | + // 3.查询员工产能记录 -》员工 批次+工位+批次生产日期 (有 更新产能数据、没有插入一条产能数据) | ||
| 100 | + | ||
| 101 | + // 4.更新产能 (产能、二级品) (特殊工段处理 打料、成型) | ||
| 102 | + | ||
| 103 | + // 个人 | ||
| 104 | + return nil, nil | ||
| 105 | +} | ||
| 106 | + | ||
| 107 | +// newEmployeeProductRecord 员工生产记录 | ||
| 108 | +func newEmployeeProductRecord(productRecord *domain.ProductRecord, participateType int, productPlan *domain.ProductPlan, worker *domain.User) *domain.EmployeeProductRecord { | ||
| 109 | + record := &domain.EmployeeProductRecord{ | ||
| 110 | + CompanyId: productRecord.CompanyId, | ||
| 111 | + OrgId: productRecord.OrgId, | ||
| 112 | + WorkStation: productRecord.WorkStation, | ||
| 113 | + WorkOn: productPlan.WorkOn, | ||
| 114 | + ParticipateType: participateType, | ||
| 115 | + ProductWeigh: 0, | ||
| 116 | + SecondLevelWeigh: 0, | ||
| 117 | + CreatedAt: time.Now(), | ||
| 118 | + UpdatedAt: time.Now(), | ||
| 119 | + Ext: productPlan.Ext, | ||
| 120 | + Version: 1, | ||
| 121 | + ProductRecordInfo: &domain.EmployeeProductRecordInfo{ | ||
| 122 | + ProductDate: productRecord.CreatedAt.Format("2006-01-02"), | ||
| 123 | + ProductPlanId: productRecord.ProductRecordInfo.ProductPlanId, | ||
| 124 | + PlanProductName: productRecord.ProductRecordInfo.PlanProductName, | ||
| 125 | + BatchNumber: productRecord.ProductRecordInfo.BatchNumber, | ||
| 126 | + ProductGroupId: productRecord.ProductRecordInfo.ProductGroupId, | ||
| 127 | + }, | ||
| 128 | + ProductWorker: worker, | ||
| 129 | + } | ||
| 130 | + // 打料、成型有初始值 | ||
| 131 | + if productRecord.WorkStation.SectionName == ProductSection1 || productRecord.WorkStation.SectionName == ProductSection2 { | ||
| 132 | + record.ProductWeigh = productPlan.PlanDevoted.Weight | ||
| 133 | + } | ||
| 134 | + return record | ||
| 135 | +} | ||
| 136 | + | ||
| 137 | +// 按名称查询工段 | ||
| 138 | +func FindSectionByName(workshopRepository domain.WorkshopRepository, workshopId, lineId int, equalName string) (*domain.ProductSection, error) { | ||
| 139 | + var workshop *domain.Workshop | ||
| 140 | + var err error | ||
| 141 | + if workshop, err = workshopRepository.FindOne(map[string]interface{}{"workshopId": workshopId}); err != nil { | ||
| 142 | + return nil, err | ||
| 143 | + } | ||
| 144 | + sections, _ := workshop.FindLine(lineId) | ||
| 145 | + for i := range sections.ProductSections { | ||
| 146 | + sec := sections.ProductSections[i] | ||
| 147 | + if sec.Removed == domain.Deleted { | ||
| 148 | + continue | ||
| 149 | + } | ||
| 150 | + if sec.SectionName == equalName { | ||
| 151 | + return sec, nil | ||
| 152 | + } | ||
| 153 | + } | ||
| 154 | + return nil, fmt.Errorf("not found section") | ||
| 155 | +} | ||
| 156 | + | ||
| 157 | +// 查询组成员 | ||
| 158 | +func FindGroupMembers(productGroupRepository domain.ProductGroupRepository, companyId, orgId int, workStationId string) (map[string]*domain.User, func(int) string) { | ||
| 159 | + var result = make(map[string]*domain.User) | ||
| 160 | + var keyFunc = func(userId int) string { | ||
| 161 | + return fmt.Sprintf("%v", userId) | ||
| 162 | + } | ||
| 163 | + _, groups, err := productGroupRepository.Find(map[string]interface{}{"companyId": companyId, "orgId": orgId, "workStationId": workStationId}) | ||
| 164 | + if err != nil { | ||
| 165 | + return result, keyFunc | ||
| 166 | + } | ||
| 167 | + for i := range groups { | ||
| 168 | + //g:=groups[i] | ||
| 169 | + for j := range groups[i].GroupMembers { | ||
| 170 | + u := groups[i].GroupMembers[j] | ||
| 171 | + result[keyFunc(u.UserId)] = u | ||
| 172 | + } | ||
| 173 | + } | ||
| 174 | + return result, keyFunc | ||
| 175 | +} | ||
| 176 | + | ||
| 177 | +// 个人生产记录统计 | ||
| 178 | +func (ptr *PGProductRecordService) personalProductStatics(productRecord *domain.ProductRecord) (interface{}, error) { | ||
| 179 | + var ( | ||
| 180 | + //workshopRepository,_=repository.NewWorkshopRepository(ptr.transactionContext) | ||
| 181 | + productPlanRepository, _ = repository.NewProductPlanRepository(ptr.transactionContext) | ||
| 182 | + productGroupRepository, _ = repository.NewProductGroupRepository(ptr.transactionContext) | ||
| 183 | + employeeProductRecordRepository, _ = repository.NewEmployeeProductRecordRepository(ptr.transactionContext) | ||
| 184 | + ) | ||
| 185 | + var ( | ||
| 186 | + cid = productRecord.CompanyId | ||
| 187 | + oid = productRecord.OrgId | ||
| 188 | + planId = productRecord.ProductRecordInfo.ProductPlanId | ||
| 189 | + productPlan *domain.ProductPlan | ||
| 190 | + err error | ||
| 191 | + ) | ||
| 192 | + // 2.1 判断是否是支援类型 有打卡记录,员工是否是属于该工段的员工 | ||
| 193 | + groupMembers, groupMembersKeyFunc := FindGroupMembers(productGroupRepository, cid, oid, productRecord.WorkStation.WorkStationId) | ||
| 194 | + employeeProductRecordDao, _ := dao.NewEmployeeProductRecordDao(ptr.transactionContext) | ||
| 195 | + | ||
| 196 | + productPlan, err = productPlanRepository.FindOne(map[string]interface{}{"productPlanId": planId}) | ||
| 197 | + if err != nil { | ||
| 198 | + return nil, err | ||
| 199 | + } | ||
| 200 | + | ||
| 201 | + participateType := domain.ParticipateNormal | ||
| 202 | + if _, ok := groupMembers[groupMembersKeyFunc(productRecord.ProductWorker.UserId)]; !ok { | ||
| 203 | + participateType = domain.ParticipateSupport | ||
| 204 | + } | ||
| 205 | + var employeeProductRecord *domain.EmployeeProductRecord | ||
| 206 | + employeeProductRecord, err = employeeProductRecordDao.WorkerProductRecord(cid, oid, productRecord.ProductRecordInfo.ProductPlanId, productRecord.ProductWorker.UserId, productRecord.CreatedAt) | ||
| 207 | + if err == domain.ErrorNotFound { | ||
| 208 | + employeeProductRecord = newEmployeeProductRecord(productRecord, participateType, productPlan, productRecord.ProductWorker) | ||
| 209 | + } | ||
| 210 | + employeeProductRecord.UpdateProductWeigh(productRecord.ProductRecordInfo.Weigh, productRecord.ProductRecordType) | ||
| 211 | + | ||
| 212 | + if employeeProductRecord, err = employeeProductRecordRepository.Save(employeeProductRecord); err != nil { | ||
| 213 | + // TODO:异常处理 | ||
| 214 | + log.Logger.Error(fmt.Sprintf("生产记录:[%v] 员工:[%v] 处理异常:%v", productRecord.ProductRecordId, productRecord.ProductWorker.UserId, err.Error())) | ||
| 215 | + } | ||
| 216 | + return nil, nil | ||
| 217 | +} | ||
| 218 | + | ||
| 219 | +//WorkshopProductStatics 车间产能统计 | ||
| 220 | +func (ptr *PGProductRecordService) WorkshopProductStatics(productRecord *domain.ProductRecord, productPlan *domain.ProductPlan) (interface{}, error) { | ||
| 221 | + return nil, nil | ||
| 222 | +} |
| @@ -39,6 +39,7 @@ func init() { | @@ -39,6 +39,7 @@ func init() { | ||
| 39 | (*models.MaterialK3cloud)(nil), | 39 | (*models.MaterialK3cloud)(nil), |
| 40 | (*models.MaterialGroupK3cloud)(nil), | 40 | (*models.MaterialGroupK3cloud)(nil), |
| 41 | (*models.PrdMoK3cloud)(nil), | 41 | (*models.PrdMoK3cloud)(nil), |
| 42 | + (*models.EmployeeProductRecord)(nil), | ||
| 42 | } { | 43 | } { |
| 43 | err := DB.Model(model).CreateTable(&orm.CreateTableOptions{ | 44 | err := DB.Model(model).CreateTable(&orm.CreateTableOptions{ |
| 44 | Temp: false, | 45 | Temp: false, |
| 1 | +package models | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
| 5 | + "time" | ||
| 6 | +) | ||
| 7 | + | ||
| 8 | +type EmployeeProductRecord struct { | ||
| 9 | + tableName string `comment:"员工生产记录" pg:"manufacture.employee_product_record"` | ||
| 10 | + // 员工产能记录ID | ||
| 11 | + EmployeeProductRecordId int `comment:"员工产能记录ID" pg:"pk:employee_product_record_id"` | ||
| 12 | + // 企业id | ||
| 13 | + CompanyId int `comment:"企业id"` | ||
| 14 | + // 组织ID | ||
| 15 | + OrgId int `comment:"组织ID"` | ||
| 16 | + // 工作位置 | ||
| 17 | + WorkStation *domain.WorkStation `comment:"工作位置"` | ||
| 18 | + // 上班班次 1:全天 2:白班 4:中班 8:夜班 | ||
| 19 | + WorkOn int `comment:"上班班次 1:全天 2:白班 4:中班 8:夜班"` | ||
| 20 | + // 参与类型 1:正常 2:支援 | ||
| 21 | + ParticipateType int `comment:"参与类型 1:正常 2:支援"` | ||
| 22 | + // 产能 | ||
| 23 | + ProductWeigh float64 `comment:"产能"` | ||
| 24 | + // 二级品产能 | ||
| 25 | + SecondLevelWeigh float64 `comment:"二级品产能"` | ||
| 26 | + // 创建时间 | ||
| 27 | + CreatedAt time.Time `comment:"创建时间"` | ||
| 28 | + // 更新时间 | ||
| 29 | + UpdatedAt time.Time `comment:"更新时间"` | ||
| 30 | + // 删除时间 | ||
| 31 | + DeletedAt time.Time `pg:",soft_delete" comment:"删除时间"` | ||
| 32 | + // 扩展 | ||
| 33 | + Ext *domain.Ext `comment:"扩展"` | ||
| 34 | + // 版本号 | ||
| 35 | + Version int `comment:"版本号"` | ||
| 36 | + // 生产记录信息 | ||
| 37 | + ProductRecordInfo *domain.EmployeeProductRecordInfo `comment:"生产记录信息"` | ||
| 38 | + // 生产工人 | ||
| 39 | + ProductWorker *domain.User `comment:"生产工人"` | ||
| 40 | +} |
| 1 | +package transform | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
| 5 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/models" | ||
| 6 | +) | ||
| 7 | + | ||
| 8 | +func TransformToEmployeeProductRecordDomainModelFromPgModels(employeeProductRecordModel *models.EmployeeProductRecord) (*domain.EmployeeProductRecord, error) { | ||
| 9 | + return &domain.EmployeeProductRecord{ | ||
| 10 | + EmployeeProductRecordId: employeeProductRecordModel.EmployeeProductRecordId, | ||
| 11 | + CompanyId: employeeProductRecordModel.CompanyId, | ||
| 12 | + OrgId: employeeProductRecordModel.OrgId, | ||
| 13 | + WorkStation: employeeProductRecordModel.WorkStation, | ||
| 14 | + WorkOn: employeeProductRecordModel.WorkOn, | ||
| 15 | + ParticipateType: employeeProductRecordModel.ParticipateType, | ||
| 16 | + ProductWeigh: employeeProductRecordModel.ProductWeigh, | ||
| 17 | + SecondLevelWeigh: employeeProductRecordModel.SecondLevelWeigh, | ||
| 18 | + CreatedAt: employeeProductRecordModel.CreatedAt, | ||
| 19 | + UpdatedAt: employeeProductRecordModel.UpdatedAt, | ||
| 20 | + DeletedAt: employeeProductRecordModel.DeletedAt, | ||
| 21 | + Ext: employeeProductRecordModel.Ext, | ||
| 22 | + Version: employeeProductRecordModel.Version, | ||
| 23 | + ProductRecordInfo: employeeProductRecordModel.ProductRecordInfo, | ||
| 24 | + ProductWorker: employeeProductRecordModel.ProductWorker, | ||
| 25 | + }, nil | ||
| 26 | +} |
| 1 | +package repository | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "github.com/go-pg/pg/v10" | ||
| 6 | + | ||
| 7 | + "github.com/linmadan/egglib-go/persistent/pg/sqlbuilder" | ||
| 8 | + pgTransaction "github.com/linmadan/egglib-go/transaction/pg" | ||
| 9 | + "github.com/linmadan/egglib-go/utils/snowflake" | ||
| 10 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
| 11 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/models" | ||
| 12 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/transform" | ||
| 13 | +) | ||
| 14 | + | ||
| 15 | +type EmployeeProductRecordRepository struct { | ||
| 16 | + transactionContext *pgTransaction.TransactionContext | ||
| 17 | +} | ||
| 18 | + | ||
| 19 | +func (repository *EmployeeProductRecordRepository) nextIdentify() (int64, error) { | ||
| 20 | + IdWorker, err := snowflake.NewIdWorker(1) | ||
| 21 | + if err != nil { | ||
| 22 | + return 0, err | ||
| 23 | + } | ||
| 24 | + id, err := IdWorker.NextId() | ||
| 25 | + return id, err | ||
| 26 | +} | ||
| 27 | +func (repository *EmployeeProductRecordRepository) Save(employeeProductRecord *domain.EmployeeProductRecord) (*domain.EmployeeProductRecord, error) { | ||
| 28 | + sqlBuildFields := []string{ | ||
| 29 | + "employee_product_record_id", | ||
| 30 | + "org_id", | ||
| 31 | + "company_id", | ||
| 32 | + "work_station", | ||
| 33 | + "work_on", | ||
| 34 | + "participate_type", | ||
| 35 | + "product_weigh", | ||
| 36 | + "second_level_weigh", | ||
| 37 | + "created_at", | ||
| 38 | + "updated_at", | ||
| 39 | + "deleted_at", | ||
| 40 | + "ext", | ||
| 41 | + "version", | ||
| 42 | + "product_record_info", | ||
| 43 | + "product_worker", | ||
| 44 | + } | ||
| 45 | + insertFieldsSnippet := sqlbuilder.SqlFieldsSnippet(sqlbuilder.RemoveSqlFields(sqlBuildFields, "employee_product_record_id", "deleted_at")) | ||
| 46 | + insertPlaceHoldersSnippet := sqlbuilder.SqlPlaceHoldersSnippet(sqlbuilder.RemoveSqlFields(sqlBuildFields, "employee_product_record_id", "deleted_at")) | ||
| 47 | + returningFieldsSnippet := sqlbuilder.SqlFieldsSnippet(sqlBuildFields) | ||
| 48 | + updateFields := sqlbuilder.RemoveSqlFields(sqlBuildFields, "employee_product_record_id", "deleted_at") | ||
| 49 | + updateFieldsSnippet := sqlbuilder.SqlUpdateFieldsSnippet(updateFields) | ||
| 50 | + tx := repository.transactionContext.PgTx | ||
| 51 | + if employeeProductRecord.Identify() == nil { | ||
| 52 | + if _, err := tx.QueryOne( | ||
| 53 | + pg.Scan( | ||
| 54 | + &employeeProductRecord.EmployeeProductRecordId, | ||
| 55 | + &employeeProductRecord.CompanyId, | ||
| 56 | + &employeeProductRecord.OrgId, | ||
| 57 | + &employeeProductRecord.WorkStation, | ||
| 58 | + &employeeProductRecord.WorkOn, | ||
| 59 | + &employeeProductRecord.ParticipateType, | ||
| 60 | + &employeeProductRecord.ProductWeigh, | ||
| 61 | + &employeeProductRecord.SecondLevelWeigh, | ||
| 62 | + &employeeProductRecord.CreatedAt, | ||
| 63 | + &employeeProductRecord.UpdatedAt, | ||
| 64 | + &employeeProductRecord.DeletedAt, | ||
| 65 | + &employeeProductRecord.Ext, | ||
| 66 | + &employeeProductRecord.Version, | ||
| 67 | + &employeeProductRecord.ProductRecordInfo, | ||
| 68 | + &employeeProductRecord.ProductWorker, | ||
| 69 | + ), | ||
| 70 | + fmt.Sprintf("INSERT INTO manufacture.employee_product_record (%s) VALUES (%s) RETURNING %s", insertFieldsSnippet, insertPlaceHoldersSnippet, returningFieldsSnippet), | ||
| 71 | + //employeeProductRecord.EmployeeProductRecordId, | ||
| 72 | + employeeProductRecord.CompanyId, | ||
| 73 | + employeeProductRecord.OrgId, | ||
| 74 | + employeeProductRecord.WorkStation, | ||
| 75 | + employeeProductRecord.WorkOn, | ||
| 76 | + employeeProductRecord.ParticipateType, | ||
| 77 | + employeeProductRecord.ProductWeigh, | ||
| 78 | + employeeProductRecord.SecondLevelWeigh, | ||
| 79 | + employeeProductRecord.CreatedAt, | ||
| 80 | + employeeProductRecord.UpdatedAt, | ||
| 81 | + //employeeProductRecord.DeletedAt, | ||
| 82 | + employeeProductRecord.Ext, | ||
| 83 | + employeeProductRecord.Version, | ||
| 84 | + employeeProductRecord.ProductRecordInfo, | ||
| 85 | + employeeProductRecord.ProductWorker, | ||
| 86 | + ); err != nil { | ||
| 87 | + return employeeProductRecord, err | ||
| 88 | + } | ||
| 89 | + } else { | ||
| 90 | + if _, err := tx.QueryOne( | ||
| 91 | + pg.Scan( | ||
| 92 | + &employeeProductRecord.EmployeeProductRecordId, | ||
| 93 | + &employeeProductRecord.CompanyId, | ||
| 94 | + &employeeProductRecord.OrgId, | ||
| 95 | + &employeeProductRecord.WorkStation, | ||
| 96 | + &employeeProductRecord.WorkOn, | ||
| 97 | + &employeeProductRecord.ParticipateType, | ||
| 98 | + &employeeProductRecord.ProductWeigh, | ||
| 99 | + &employeeProductRecord.SecondLevelWeigh, | ||
| 100 | + &employeeProductRecord.CreatedAt, | ||
| 101 | + &employeeProductRecord.UpdatedAt, | ||
| 102 | + &employeeProductRecord.DeletedAt, | ||
| 103 | + &employeeProductRecord.Ext, | ||
| 104 | + &employeeProductRecord.Version, | ||
| 105 | + &employeeProductRecord.ProductRecordInfo, | ||
| 106 | + &employeeProductRecord.ProductWorker, | ||
| 107 | + ), | ||
| 108 | + fmt.Sprintf("UPDATE manufacture.employee_product_record SET %s WHERE employee_product_record_id=? RETURNING %s", updateFieldsSnippet, returningFieldsSnippet), | ||
| 109 | + //employeeProductRecord.EmployeeProductRecordId, | ||
| 110 | + employeeProductRecord.CompanyId, | ||
| 111 | + employeeProductRecord.OrgId, | ||
| 112 | + employeeProductRecord.WorkStation, | ||
| 113 | + employeeProductRecord.WorkOn, | ||
| 114 | + employeeProductRecord.ParticipateType, | ||
| 115 | + employeeProductRecord.ProductWeigh, | ||
| 116 | + employeeProductRecord.SecondLevelWeigh, | ||
| 117 | + employeeProductRecord.CreatedAt, | ||
| 118 | + employeeProductRecord.UpdatedAt, | ||
| 119 | + //employeeProductRecord.DeletedAt, | ||
| 120 | + employeeProductRecord.Ext, | ||
| 121 | + employeeProductRecord.Version, | ||
| 122 | + employeeProductRecord.ProductRecordInfo, | ||
| 123 | + employeeProductRecord.ProductWorker, | ||
| 124 | + employeeProductRecord.Identify(), | ||
| 125 | + ); err != nil { | ||
| 126 | + return employeeProductRecord, err | ||
| 127 | + } | ||
| 128 | + } | ||
| 129 | + return employeeProductRecord, nil | ||
| 130 | +} | ||
| 131 | +func (repository *EmployeeProductRecordRepository) Remove(employeeProductRecord *domain.EmployeeProductRecord) (*domain.EmployeeProductRecord, error) { | ||
| 132 | + tx := repository.transactionContext.PgTx | ||
| 133 | + employeeProductRecordModel := new(models.EmployeeProductRecord) | ||
| 134 | + employeeProductRecordModel.EmployeeProductRecordId = employeeProductRecord.Identify().(int) | ||
| 135 | + if _, err := tx.Model(employeeProductRecordModel).WherePK().Delete(); err != nil { | ||
| 136 | + return employeeProductRecord, err | ||
| 137 | + } | ||
| 138 | + return employeeProductRecord, nil | ||
| 139 | +} | ||
| 140 | +func (repository *EmployeeProductRecordRepository) FindOne(queryOptions map[string]interface{}) (*domain.EmployeeProductRecord, error) { | ||
| 141 | + tx := repository.transactionContext.PgTx | ||
| 142 | + employeeProductRecordModel := new(models.EmployeeProductRecord) | ||
| 143 | + query := sqlbuilder.BuildQuery(tx.Model(employeeProductRecordModel), queryOptions) | ||
| 144 | + query.SetWhereByQueryOption("employee_product_record.employee_product_record_id = ?", "employeeProductRecordId") | ||
| 145 | + if err := query.First(); err != nil { | ||
| 146 | + if err.Error() == "pg: no rows in result set" { | ||
| 147 | + return nil, domain.ErrorNotFound | ||
| 148 | + } else { | ||
| 149 | + return nil, err | ||
| 150 | + } | ||
| 151 | + } | ||
| 152 | + if employeeProductRecordModel.EmployeeProductRecordId == 0 { | ||
| 153 | + return nil, nil | ||
| 154 | + } else { | ||
| 155 | + return transform.TransformToEmployeeProductRecordDomainModelFromPgModels(employeeProductRecordModel) | ||
| 156 | + } | ||
| 157 | +} | ||
| 158 | +func (repository *EmployeeProductRecordRepository) Find(queryOptions map[string]interface{}) (int64, []*domain.EmployeeProductRecord, error) { | ||
| 159 | + tx := repository.transactionContext.PgTx | ||
| 160 | + var employeeProductRecordModels []*models.EmployeeProductRecord | ||
| 161 | + employeeProductRecords := make([]*domain.EmployeeProductRecord, 0) | ||
| 162 | + query := sqlbuilder.BuildQuery(tx.Model(&employeeProductRecordModels), queryOptions) | ||
| 163 | + query.SetOffsetAndLimit(domain.MaxQueryRow) | ||
| 164 | + query.SetOrderDirect("employee_product_record_id", "DESC") | ||
| 165 | + if count, err := query.SelectAndCount(); err != nil { | ||
| 166 | + return 0, employeeProductRecords, err | ||
| 167 | + } else { | ||
| 168 | + for _, employeeProductRecordModel := range employeeProductRecordModels { | ||
| 169 | + if employeeProductRecord, err := transform.TransformToEmployeeProductRecordDomainModelFromPgModels(employeeProductRecordModel); err != nil { | ||
| 170 | + return 0, employeeProductRecords, err | ||
| 171 | + } else { | ||
| 172 | + employeeProductRecords = append(employeeProductRecords, employeeProductRecord) | ||
| 173 | + } | ||
| 174 | + } | ||
| 175 | + return int64(count), employeeProductRecords, nil | ||
| 176 | + } | ||
| 177 | +} | ||
| 178 | +func NewEmployeeProductRecordRepository(transactionContext *pgTransaction.TransactionContext) (*EmployeeProductRecordRepository, error) { | ||
| 179 | + if transactionContext == nil { | ||
| 180 | + return nil, fmt.Errorf("transactionContext参数不能为nil") | ||
| 181 | + } else { | ||
| 182 | + return &EmployeeProductRecordRepository{ | ||
| 183 | + transactionContext: transactionContext, | ||
| 184 | + }, nil | ||
| 185 | + } | ||
| 186 | +} |
| @@ -143,6 +143,20 @@ func (repository *ProductRecordRepository) Find(queryOptions map[string]interfac | @@ -143,6 +143,20 @@ func (repository *ProductRecordRepository) Find(queryOptions map[string]interfac | ||
| 143 | var productRecordModels []*models.ProductRecord | 143 | var productRecordModels []*models.ProductRecord |
| 144 | productRecords := make([]*domain.ProductRecord, 0) | 144 | productRecords := make([]*domain.ProductRecord, 0) |
| 145 | query := sqlbuilder.BuildQuery(tx.Model(&productRecordModels), queryOptions) | 145 | query := sqlbuilder.BuildQuery(tx.Model(&productRecordModels), queryOptions) |
| 146 | + query.SetWhereByQueryOption("company_id = ?", "companyId") | ||
| 147 | + query.SetWhereByQueryOption("org_id = ?", "orgId") | ||
| 148 | + if v, ok := queryOptions["inOrgIds"]; ok && len(v.([]int)) > 0 { | ||
| 149 | + query.Where(`org_id in (?)`, pg.In(v)) | ||
| 150 | + } | ||
| 151 | + if v, ok := queryOptions["userName"]; ok && len(v.(string)) > 0 { | ||
| 152 | + query.Where(fmt.Sprintf(`product_worker->>'userName' like '%%%v%%'`, v)) | ||
| 153 | + } | ||
| 154 | + if v, ok := queryOptions["workshopName"]; ok && len(v.(string)) > 0 { | ||
| 155 | + query.Where(fmt.Sprintf(`work_station->>'workshopName' like '%%%v%%'`, v)) | ||
| 156 | + } | ||
| 157 | + if v, ok := queryOptions["batchNumber"]; ok && len(v.(string)) > 0 { | ||
| 158 | + query.Where(fmt.Sprintf(`product_record_info->>'batchNumber' like '%%%v%%'`, v)) | ||
| 159 | + } | ||
| 146 | query.SetOffsetAndLimit(domain.MaxQueryRow) | 160 | query.SetOffsetAndLimit(domain.MaxQueryRow) |
| 147 | query.SetOrderDirect("product_record_id", "DESC") | 161 | query.SetOrderDirect("product_record_id", "DESC") |
| 148 | if count, err := query.SelectAndCount(); err != nil { | 162 | if count, err := query.SelectAndCount(); err != nil { |
| 1 | +package controllers | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/linmadan/egglib-go/web/beego" | ||
| 5 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productRecord/command" | ||
| 6 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productRecord/query" | ||
| 7 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productRecord/service" | ||
| 8 | +) | ||
| 9 | + | ||
| 10 | +type ProductRecordController struct { | ||
| 11 | + beego.BaseController | ||
| 12 | +} | ||
| 13 | + | ||
| 14 | +func (controller *ProductRecordController) CreateProductRecord() { | ||
| 15 | + productRecordService := service.NewProductRecordService(nil) | ||
| 16 | + createProductRecordCommand := &command.CreateProductRecordCommand{} | ||
| 17 | + controller.Unmarshal(createProductRecordCommand) | ||
| 18 | + data, err := productRecordService.CreateProductRecord(createProductRecordCommand) | ||
| 19 | + controller.Response(data, err) | ||
| 20 | +} | ||
| 21 | + | ||
| 22 | +func (controller *ProductRecordController) UpdateProductRecord() { | ||
| 23 | + productRecordService := service.NewProductRecordService(nil) | ||
| 24 | + updateProductRecordCommand := &command.UpdateProductRecordCommand{} | ||
| 25 | + controller.Unmarshal(updateProductRecordCommand) | ||
| 26 | + productRecordId, _ := controller.GetInt(":productRecordId") | ||
| 27 | + updateProductRecordCommand.ProductRecordId = productRecordId | ||
| 28 | + data, err := productRecordService.UpdateProductRecord(updateProductRecordCommand) | ||
| 29 | + controller.Response(data, err) | ||
| 30 | +} | ||
| 31 | + | ||
| 32 | +func (controller *ProductRecordController) GetProductRecord() { | ||
| 33 | + productRecordService := service.NewProductRecordService(nil) | ||
| 34 | + getProductRecordQuery := &query.GetProductRecordQuery{} | ||
| 35 | + productRecordId, _ := controller.GetInt(":productRecordId") | ||
| 36 | + getProductRecordQuery.ProductRecordId = productRecordId | ||
| 37 | + data, err := productRecordService.GetProductRecord(getProductRecordQuery) | ||
| 38 | + controller.Response(data, err) | ||
| 39 | +} | ||
| 40 | + | ||
| 41 | +func (controller *ProductRecordController) RemoveProductRecord() { | ||
| 42 | + productRecordService := service.NewProductRecordService(nil) | ||
| 43 | + removeProductRecordCommand := &command.RemoveProductRecordCommand{} | ||
| 44 | + controller.Unmarshal(removeProductRecordCommand) | ||
| 45 | + productRecordId, _ := controller.GetInt(":productRecordId") | ||
| 46 | + removeProductRecordCommand.ProductRecordId = productRecordId | ||
| 47 | + data, err := productRecordService.RemoveProductRecord(removeProductRecordCommand) | ||
| 48 | + controller.Response(data, err) | ||
| 49 | +} | ||
| 50 | + | ||
| 51 | +func (controller *ProductRecordController) ListProductRecord() { | ||
| 52 | + productRecordService := service.NewProductRecordService(nil) | ||
| 53 | + listProductRecordQuery := &query.ListProductRecordQuery{} | ||
| 54 | + offset, _ := controller.GetInt("offset") | ||
| 55 | + listProductRecordQuery.Offset = offset | ||
| 56 | + limit, _ := controller.GetInt("limit") | ||
| 57 | + listProductRecordQuery.Limit = limit | ||
| 58 | + data, err := productRecordService.ListProductRecord(listProductRecordQuery) | ||
| 59 | + controller.Response(data, err) | ||
| 60 | +} | ||
| 61 | + | ||
| 62 | +func (controller *ProductRecordController) ApproveProductRecord() { | ||
| 63 | + productRecordService := service.NewProductRecordService(nil) | ||
| 64 | + approveProductRecordCommand := &command.ApproveProductRecordCommand{} | ||
| 65 | + controller.Unmarshal(approveProductRecordCommand) | ||
| 66 | + data, err := productRecordService.ApproveProductRecord(approveProductRecordCommand) | ||
| 67 | + controller.Response(data, err) | ||
| 68 | +} | ||
| 69 | + | ||
| 70 | +func (controller *ProductRecordController) SearchProductRecord() { | ||
| 71 | + productPlanService := service.NewProductRecordService(nil) | ||
| 72 | + cmd := &query.SearchProductRecordQuery{} | ||
| 73 | + Must(controller.Unmarshal(cmd)) | ||
| 74 | + operateInfo := ParseOperateInfo(controller.BaseController) | ||
| 75 | + //cmd.OrgId = operateInfo.OrgId | ||
| 76 | + cmd.CompanyId = operateInfo.CompanyId | ||
| 77 | + cmd.InOrgIds = operateInfo.OrgIds | ||
| 78 | + total, data, err := productPlanService.SearchProductRecord(ParseOperateInfo(controller.BaseController), cmd) | ||
| 79 | + ResponseGrid(controller.BaseController, total, data, err) | ||
| 80 | +} | ||
| 81 | + | ||
| 82 | +func (controller *ProductRecordController) SearchEmployeeProductRecord() { | ||
| 83 | + productPlanService := service.NewProductRecordService(nil) | ||
| 84 | + cmd := &query.SearchEmployeeProductRecordQuery{} | ||
| 85 | + Must(controller.Unmarshal(cmd)) | ||
| 86 | + operateInfo := ParseOperateInfo(controller.BaseController) | ||
| 87 | + //cmd.OrgId = operateInfo.OrgId | ||
| 88 | + cmd.CompanyId = operateInfo.CompanyId | ||
| 89 | + cmd.InOrgIds = operateInfo.OrgIds | ||
| 90 | + total, data, err := productPlanService.SearchEmployeeProductRecord(ParseOperateInfo(controller.BaseController), cmd) | ||
| 91 | + ResponseGrid(controller.BaseController, total, data, err) | ||
| 92 | +} |
| 1 | +package routers | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/beego/beego/v2/server/web" | ||
| 5 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/port/beego/controllers" | ||
| 6 | +) | ||
| 7 | + | ||
| 8 | +func init() { | ||
| 9 | + web.Router("/product-records/", &controllers.ProductRecordController{}, "Post:CreateProductRecord") | ||
| 10 | + web.Router("/product-records/:productRecordId", &controllers.ProductRecordController{}, "Put:UpdateProductRecord") | ||
| 11 | + web.Router("/product-records/:productRecordId", &controllers.ProductRecordController{}, "Get:GetProductRecord") | ||
| 12 | + web.Router("/product-records/:productRecordId", &controllers.ProductRecordController{}, "Delete:RemoveProductRecord") | ||
| 13 | + web.Router("/product-records/", &controllers.ProductRecordController{}, "Get:ListProductRecord") | ||
| 14 | + web.Router("/product-records/approve", &controllers.ProductRecordController{}, "Post:ApproveProductRecord") | ||
| 15 | + web.Router("/product-records/search", &controllers.ProductRecordController{}, "Post:SearchProductRecord") | ||
| 16 | + web.Router("/product-records/employee-productive/search", &controllers.ProductRecordController{}, "Post:SearchEmployeeProductRecord") | ||
| 17 | +} |
pkg/port/task/run.go
0 → 100644
| 1 | +package task | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "context" | ||
| 5 | + "encoding/json" | ||
| 6 | + "fmt" | ||
| 7 | + "github.com/hibiken/asynq" | ||
| 8 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productRecord/command" | ||
| 9 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productRecord/service" | ||
| 10 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
| 11 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log" | ||
| 12 | + "os" | ||
| 13 | + "os/signal" | ||
| 14 | + "syscall" | ||
| 15 | +) | ||
| 16 | + | ||
| 17 | +func Run() { | ||
| 18 | + srv := asynq.NewServer( | ||
| 19 | + asynq.RedisClientOpt{Addr: ":6379"}, | ||
| 20 | + asynq.Config{Concurrency: 1}, | ||
| 21 | + ) | ||
| 22 | + | ||
| 23 | + h := asynq.NewServeMux() | ||
| 24 | + // ... Register handlers | ||
| 25 | + h.HandleFunc(domain.TaskKeyPatternProductRecordStatics(), HandlerProductRecordStatics) | ||
| 26 | + | ||
| 27 | + log.Logger.Info("aysnq task running ...") | ||
| 28 | + // Run blocks and waits for os signal to terminate the program. | ||
| 29 | + if err := srv.Run(h); err != nil { | ||
| 30 | + log.Logger.Error(err.Error()) | ||
| 31 | + } | ||
| 32 | + sigs := make(chan os.Signal, 1) | ||
| 33 | + signal.Notify(sigs, syscall.SIGTERM, syscall.SIGINT) | ||
| 34 | + <-sigs // wait for termination signal | ||
| 35 | + log.Logger.Info("aysnq task stopping ...") | ||
| 36 | + srv.Shutdown() | ||
| 37 | +} | ||
| 38 | + | ||
| 39 | +// 生产记录统计 | ||
| 40 | +func HandlerProductRecordStatics(c context.Context, t *asynq.Task) error { | ||
| 41 | + productPlanService := service.NewProductRecordService(nil) | ||
| 42 | + cmd := &command.ProductRecordStaticsCommand{} | ||
| 43 | + if err := json.Unmarshal(t.Payload(), cmd); err != nil { | ||
| 44 | + return err | ||
| 45 | + } | ||
| 46 | + log.Logger.Debug(fmt.Sprintf("【生产记录统计】 消费 生产记录ID:%v 类型:%v 工段:%v(%v) 重量:%v", cmd.ProductRecordId, cmd.ProductRecordType, | ||
| 47 | + cmd.WorkStation.SectionName, cmd.WorkStation.WorkStationId, cmd.ProductRecordInfo.Weigh)) | ||
| 48 | + _, err := productPlanService.ProductRecordStatics(cmd) | ||
| 49 | + if err != nil { | ||
| 50 | + log.Logger.Error(err.Error()) | ||
| 51 | + } | ||
| 52 | + return err | ||
| 53 | +} |
| 1 | +package product_record | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/go-pg/pg/v10" | ||
| 5 | + "net/http" | ||
| 6 | + | ||
| 7 | + "github.com/gavv/httpexpect" | ||
| 8 | + . "github.com/onsi/ginkgo" | ||
| 9 | + . "github.com/onsi/gomega" | ||
| 10 | + pG "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg" | ||
| 11 | +) | ||
| 12 | + | ||
| 13 | +var _ = Describe("生产记录审核", func() { | ||
| 14 | + var productRecordId int64 | ||
| 15 | + BeforeEach(func() { | ||
| 16 | + _, err := pG.DB.QueryOne( | ||
| 17 | + pg.Scan(&productRecordId), | ||
| 18 | + "INSERT INTO product_records (product_record_id, company_id, org_id, product_record_type, product_worker, work_station, created_at, updated_at, deleted_at, product_record_info) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING product_record_id", | ||
| 19 | + "testProductRecordId", "testCompanyId", "testOrgId", "testProductRecordType", "testProductWorker", "testWorkStation", "testCreatedAt", "testUpdatedAt", "testDeletedAt", "testProductRecordInfo") | ||
| 20 | + Expect(err).NotTo(HaveOccurred()) | ||
| 21 | + }) | ||
| 22 | + Describe("生产记录审核", func() { | ||
| 23 | + Context("", func() { | ||
| 24 | + It("", func() { | ||
| 25 | + httpExpect := httpexpect.New(GinkgoT(), server.URL) | ||
| 26 | + body := map[string]interface{}{ | ||
| 27 | + "productRecordId": "int", | ||
| 28 | + } | ||
| 29 | + httpExpect.POST("/product-records/approve"). | ||
| 30 | + WithJSON(body). | ||
| 31 | + Expect(). | ||
| 32 | + Status(http.StatusOK). | ||
| 33 | + JSON(). | ||
| 34 | + Object(). | ||
| 35 | + ContainsKey("code").ValueEqual("code", 0). | ||
| 36 | + ContainsKey("msg").ValueEqual("msg", "ok"). | ||
| 37 | + ContainsKey("data").Value("data").Object() | ||
| 38 | + }) | ||
| 39 | + }) | ||
| 40 | + }) | ||
| 41 | + AfterEach(func() { | ||
| 42 | + _, err := pG.DB.Exec("DELETE FROM product_records WHERE true") | ||
| 43 | + Expect(err).NotTo(HaveOccurred()) | ||
| 44 | + }) | ||
| 45 | +}) |
| 1 | +package product_record | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "net/http" | ||
| 5 | + | ||
| 6 | + "github.com/gavv/httpexpect" | ||
| 7 | + . "github.com/onsi/ginkgo" | ||
| 8 | + . "github.com/onsi/gomega" | ||
| 9 | + pG "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg" | ||
| 10 | +) | ||
| 11 | + | ||
| 12 | +var _ = Describe("创建生产记录服务", func() { | ||
| 13 | + Describe("提交数据创建生产记录服务", func() { | ||
| 14 | + Context("提交正确的新生产记录数据", func() { | ||
| 15 | + It("返回生产记录数据", func() { | ||
| 16 | + httpExpect := httpexpect.New(GinkgoT(), server.URL) | ||
| 17 | + body := map[string]interface{}{ | ||
| 18 | + "productRecordId": "int", | ||
| 19 | + } | ||
| 20 | + httpExpect.POST("/product-records/"). | ||
| 21 | + WithJSON(body). | ||
| 22 | + Expect(). | ||
| 23 | + Status(http.StatusOK). | ||
| 24 | + JSON(). | ||
| 25 | + Object(). | ||
| 26 | + ContainsKey("code").ValueEqual("code", 0). | ||
| 27 | + ContainsKey("msg").ValueEqual("msg", "ok"). | ||
| 28 | + ContainsKey("data").Value("data").Object(). | ||
| 29 | + ContainsKey("productRecordId").ValueNotEqual("productRecordId", BeZero()) | ||
| 30 | + }) | ||
| 31 | + }) | ||
| 32 | + }) | ||
| 33 | + AfterEach(func() { | ||
| 34 | + _, err := pG.DB.Exec("DELETE FROM product_records WHERE true") | ||
| 35 | + Expect(err).NotTo(HaveOccurred()) | ||
| 36 | + }) | ||
| 37 | +}) |
| 1 | +package product_record | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/go-pg/pg/v10" | ||
| 5 | + "net/http" | ||
| 6 | + | ||
| 7 | + "github.com/gavv/httpexpect" | ||
| 8 | + . "github.com/onsi/ginkgo" | ||
| 9 | + . "github.com/onsi/gomega" | ||
| 10 | + pG "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg" | ||
| 11 | +) | ||
| 12 | + | ||
| 13 | +var _ = Describe("返回生产记录服务", func() { | ||
| 14 | + var productRecordId int64 | ||
| 15 | + BeforeEach(func() { | ||
| 16 | + _, err := pG.DB.QueryOne( | ||
| 17 | + pg.Scan(&productRecordId), | ||
| 18 | + "INSERT INTO product_records (product_record_id, company_id, org_id, product_record_type, product_worker, work_station, created_at, updated_at, deleted_at, product_record_info) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING product_record_id", | ||
| 19 | + "testProductRecordId", "testCompanyId", "testOrgId", "testProductRecordType", "testProductWorker", "testWorkStation", "testCreatedAt", "testUpdatedAt", "testDeletedAt", "testProductRecordInfo") | ||
| 20 | + Expect(err).NotTo(HaveOccurred()) | ||
| 21 | + }) | ||
| 22 | + Describe("根据productRecordId参数返回生产记录", func() { | ||
| 23 | + Context("传入有效的productRecordId", func() { | ||
| 24 | + It("返回生产记录数据", func() { | ||
| 25 | + httpExpect := httpexpect.New(GinkgoT(), server.URL) | ||
| 26 | + httpExpect.GET("/product-records/{productRecordId}"). | ||
| 27 | + Expect(). | ||
| 28 | + Status(http.StatusOK). | ||
| 29 | + JSON(). | ||
| 30 | + Object(). | ||
| 31 | + ContainsKey("code").ValueEqual("code", 0). | ||
| 32 | + ContainsKey("msg").ValueEqual("msg", "ok"). | ||
| 33 | + ContainsKey("data").Value("data").Object() | ||
| 34 | + }) | ||
| 35 | + }) | ||
| 36 | + }) | ||
| 37 | + AfterEach(func() { | ||
| 38 | + _, err := pG.DB.Exec("DELETE FROM product_records WHERE true") | ||
| 39 | + Expect(err).NotTo(HaveOccurred()) | ||
| 40 | + }) | ||
| 41 | +}) |
| 1 | +package product_record | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/go-pg/pg/v10" | ||
| 5 | + "net/http" | ||
| 6 | + | ||
| 7 | + "github.com/gavv/httpexpect" | ||
| 8 | + . "github.com/onsi/ginkgo" | ||
| 9 | + . "github.com/onsi/gomega" | ||
| 10 | + pG "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg" | ||
| 11 | +) | ||
| 12 | + | ||
| 13 | +var _ = Describe("返回生产记录服务列表", func() { | ||
| 14 | + var productRecordId int64 | ||
| 15 | + BeforeEach(func() { | ||
| 16 | + _, err := pG.DB.QueryOne( | ||
| 17 | + pg.Scan(&productRecordId), | ||
| 18 | + "INSERT INTO product_records (product_record_id, company_id, org_id, product_record_type, product_worker, work_station, created_at, updated_at, deleted_at, product_record_info) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING product_record_id", | ||
| 19 | + "testProductRecordId", "testCompanyId", "testOrgId", "testProductRecordType", "testProductWorker", "testWorkStation", "testCreatedAt", "testUpdatedAt", "testDeletedAt", "testProductRecordInfo") | ||
| 20 | + Expect(err).NotTo(HaveOccurred()) | ||
| 21 | + }) | ||
| 22 | + Describe("根据参数返回生产记录列表", func() { | ||
| 23 | + Context("传入有效的参数", func() { | ||
| 24 | + It("返回生产记录数据列表", func() { | ||
| 25 | + httpExpect := httpexpect.New(GinkgoT(), server.URL) | ||
| 26 | + httpExpect.GET("/product-records/"). | ||
| 27 | + WithQuery("offset", "int"). | ||
| 28 | + WithQuery("limit", "int"). | ||
| 29 | + Expect(). | ||
| 30 | + Status(http.StatusOK). | ||
| 31 | + JSON(). | ||
| 32 | + Object(). | ||
| 33 | + ContainsKey("code").ValueEqual("code", 0). | ||
| 34 | + ContainsKey("msg").ValueEqual("msg", "ok"). | ||
| 35 | + ContainsKey("data").Value("data").Object(). | ||
| 36 | + ContainsKey("count").ValueEqual("count", 1). | ||
| 37 | + ContainsKey("productRecords").Value("productRecords").Array() | ||
| 38 | + }) | ||
| 39 | + }) | ||
| 40 | + }) | ||
| 41 | + AfterEach(func() { | ||
| 42 | + _, err := pG.DB.Exec("DELETE FROM product_records WHERE true") | ||
| 43 | + Expect(err).NotTo(HaveOccurred()) | ||
| 44 | + }) | ||
| 45 | +}) |
| 1 | +package product_record | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "net/http" | ||
| 5 | + "net/http/httptest" | ||
| 6 | + "testing" | ||
| 7 | + | ||
| 8 | + "github.com/beego/beego/v2/server/web" | ||
| 9 | + . "github.com/onsi/ginkgo" | ||
| 10 | + . "github.com/onsi/gomega" | ||
| 11 | + _ "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application" | ||
| 12 | + _ "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg" | ||
| 13 | + _ "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/port/beego" | ||
| 14 | +) | ||
| 15 | + | ||
| 16 | +func TestProductRecord(t *testing.T) { | ||
| 17 | + RegisterFailHandler(Fail) | ||
| 18 | + RunSpecs(t, "Beego Port ProductRecord Correlations Test Case Suite") | ||
| 19 | +} | ||
| 20 | + | ||
| 21 | +var handler http.Handler | ||
| 22 | +var server *httptest.Server | ||
| 23 | + | ||
| 24 | +var _ = BeforeSuite(func() { | ||
| 25 | + handler = web.BeeApp.Handlers | ||
| 26 | + server = httptest.NewServer(handler) | ||
| 27 | +}) | ||
| 28 | + | ||
| 29 | +var _ = AfterSuite(func() { | ||
| 30 | + server.Close() | ||
| 31 | +}) |
| 1 | +package product_record | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/go-pg/pg/v10" | ||
| 5 | + "net/http" | ||
| 6 | + | ||
| 7 | + "github.com/gavv/httpexpect" | ||
| 8 | + . "github.com/onsi/ginkgo" | ||
| 9 | + . "github.com/onsi/gomega" | ||
| 10 | + pG "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg" | ||
| 11 | +) | ||
| 12 | + | ||
| 13 | +var _ = Describe("移除生产记录服务", func() { | ||
| 14 | + var productRecordId int64 | ||
| 15 | + BeforeEach(func() { | ||
| 16 | + _, err := pG.DB.QueryOne( | ||
| 17 | + pg.Scan(&productRecordId), | ||
| 18 | + "INSERT INTO product_records (product_record_id, company_id, org_id, product_record_type, product_worker, work_station, created_at, updated_at, deleted_at, product_record_info) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING product_record_id", | ||
| 19 | + "testProductRecordId", "testCompanyId", "testOrgId", "testProductRecordType", "testProductWorker", "testWorkStation", "testCreatedAt", "testUpdatedAt", "testDeletedAt", "testProductRecordInfo") | ||
| 20 | + Expect(err).NotTo(HaveOccurred()) | ||
| 21 | + }) | ||
| 22 | + Describe("根据参数移除生产记录服务", func() { | ||
| 23 | + Context("传入有效的productRecordId", func() { | ||
| 24 | + It("返回被移除生产记录的数据", func() { | ||
| 25 | + httpExpect := httpexpect.New(GinkgoT(), server.URL) | ||
| 26 | + httpExpect.DELETE("/product-records/{productRecordId}"). | ||
| 27 | + Expect(). | ||
| 28 | + Status(http.StatusOK). | ||
| 29 | + JSON(). | ||
| 30 | + Object(). | ||
| 31 | + ContainsKey("code").ValueEqual("code", 0). | ||
| 32 | + ContainsKey("msg").ValueEqual("msg", "ok"). | ||
| 33 | + ContainsKey("data").Value("data").Object() | ||
| 34 | + }) | ||
| 35 | + }) | ||
| 36 | + }) | ||
| 37 | + AfterEach(func() { | ||
| 38 | + _, err := pG.DB.Exec("DELETE FROM product_records WHERE true") | ||
| 39 | + Expect(err).NotTo(HaveOccurred()) | ||
| 40 | + }) | ||
| 41 | +}) |
| 1 | +package product_record | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/go-pg/pg/v10" | ||
| 5 | + "net/http" | ||
| 6 | + | ||
| 7 | + "github.com/gavv/httpexpect" | ||
| 8 | + . "github.com/onsi/ginkgo" | ||
| 9 | + . "github.com/onsi/gomega" | ||
| 10 | + pG "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg" | ||
| 11 | +) | ||
| 12 | + | ||
| 13 | +var _ = Describe("更新生产记录服务", func() { | ||
| 14 | + var productRecordId int64 | ||
| 15 | + BeforeEach(func() { | ||
| 16 | + _, err := pG.DB.QueryOne( | ||
| 17 | + pg.Scan(&productRecordId), | ||
| 18 | + "INSERT INTO product_records (product_record_id, company_id, org_id, product_record_type, product_worker, work_station, created_at, updated_at, deleted_at, product_record_info) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING product_record_id", | ||
| 19 | + "testProductRecordId", "testCompanyId", "testOrgId", "testProductRecordType", "testProductWorker", "testWorkStation", "testCreatedAt", "testUpdatedAt", "testDeletedAt", "testProductRecordInfo") | ||
| 20 | + Expect(err).NotTo(HaveOccurred()) | ||
| 21 | + }) | ||
| 22 | + Describe("提交数据更新生产记录服务", func() { | ||
| 23 | + Context("提交正确的生产记录数据", func() { | ||
| 24 | + It("返回更新后的生产记录数据", func() { | ||
| 25 | + httpExpect := httpexpect.New(GinkgoT(), server.URL) | ||
| 26 | + body := map[string]interface{}{} | ||
| 27 | + httpExpect.PUT("/product-records/{productRecordId}"). | ||
| 28 | + WithJSON(body). | ||
| 29 | + Expect(). | ||
| 30 | + Status(http.StatusOK). | ||
| 31 | + JSON(). | ||
| 32 | + Object(). | ||
| 33 | + ContainsKey("code").ValueEqual("code", 0). | ||
| 34 | + ContainsKey("msg").ValueEqual("msg", "ok"). | ||
| 35 | + ContainsKey("data").Value("data").Object(). | ||
| 36 | + ContainsKey("productRecordId").ValueEqual("productRecordId", productRecordId) | ||
| 37 | + }) | ||
| 38 | + }) | ||
| 39 | + }) | ||
| 40 | + AfterEach(func() { | ||
| 41 | + _, err := pG.DB.Exec("DELETE FROM product_records WHERE true") | ||
| 42 | + Expect(err).NotTo(HaveOccurred()) | ||
| 43 | + }) | ||
| 44 | +}) |
-
请 注册 或 登录 后发表评论