作者 yangfu

feat: 领料、退料统计

正在显示 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 }
  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 +}
  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 +})