@things-factory/worksheet-base 4.1.40 → 4.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-server/controllers/inbound/unloading-worksheet-controller.js +2 -0
- package/dist-server/controllers/inbound/unloading-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/packing-worksheet-controller.js +166 -8
- package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/picking-worksheet-controller.js +22 -22
- package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/sorting-worksheet-controller.js +110 -3
- package/dist-server/controllers/outbound/sorting-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/render-grn.js +2 -1
- package/dist-server/controllers/render-grn.js.map +1 -1
- package/dist-server/controllers/render-orientage-do.js +0 -31
- package/dist-server/controllers/render-orientage-do.js.map +1 -1
- package/dist-server/controllers/render-orientage-grn.js +1 -21
- package/dist-server/controllers/render-orientage-grn.js.map +1 -1
- package/dist-server/controllers/render-ro-do.js +2 -1
- package/dist-server/controllers/render-ro-do.js.map +1 -1
- package/dist-server/controllers/worksheet-controller.js +2 -1
- package/dist-server/controllers/worksheet-controller.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/find-release-orders-by-task-no.js +30 -1
- package/dist-server/graphql/resolvers/worksheet/find-release-orders-by-task-no.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js +3 -0
- package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/packing/index.js +2 -1
- package/dist-server/graphql/resolvers/worksheet/packing/index.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/packing/packing.js +4 -4
- package/dist-server/graphql/resolvers/worksheet/packing/packing.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js +4 -4
- package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.js +15 -0
- package/dist-server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +152 -133
- package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js +3 -2
- package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js +3 -3
- package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js +4 -4
- package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js +4 -4
- package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/sorting-worksheet.js +6 -0
- package/dist-server/graphql/resolvers/worksheet/sorting-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js +4 -5
- package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js +4 -2
- package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js.map +1 -1
- package/dist-server/graphql/types/worksheet/find-release-orders-by-task-no.js +11 -0
- package/dist-server/graphql/types/worksheet/find-release-orders-by-task-no.js.map +1 -0
- package/dist-server/graphql/types/worksheet/index.js +13 -2
- package/dist-server/graphql/types/worksheet/index.js.map +1 -1
- package/dist-server/graphql/types/worksheet/worksheet-detail-info.js +2 -0
- package/dist-server/graphql/types/worksheet/worksheet-detail-info.js.map +1 -1
- package/dist-server/graphql/types/worksheet-detail/index.js +0 -2
- package/dist-server/graphql/types/worksheet-detail/index.js.map +1 -1
- package/dist-server/utils/inventory-util.js +14 -25
- package/dist-server/utils/inventory-util.js.map +1 -1
- package/package.json +9 -9
- package/server/controllers/inbound/unloading-worksheet-controller.ts +2 -0
- package/server/controllers/outbound/packing-worksheet-controller.ts +217 -11
- package/server/controllers/outbound/picking-worksheet-controller.ts +23 -24
- package/server/controllers/outbound/sorting-worksheet-controller.ts +149 -4
- package/server/controllers/render-grn.ts +5 -5
- package/server/controllers/render-orientage-do.ts +12 -61
- package/server/controllers/render-orientage-grn.ts +13 -44
- package/server/controllers/render-ro-do.ts +34 -33
- package/server/controllers/worksheet-controller.ts +2 -1
- package/server/graphql/resolvers/worksheet/find-release-orders-by-task-no.ts +35 -2
- package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +2 -0
- package/server/graphql/resolvers/worksheet/packing/index.ts +3 -1
- package/server/graphql/resolvers/worksheet/packing/packing.ts +5 -4
- package/server/graphql/resolvers/worksheet/packing/scan-product-packing.ts +9 -4
- package/server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.ts +24 -0
- package/server/graphql/resolvers/worksheet/packing-worksheet.ts +166 -144
- package/server/graphql/resolvers/worksheet/picking/assign-picking-worker.ts +3 -2
- package/server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.ts +4 -4
- package/server/graphql/resolvers/worksheet/sorting/scan-product-sorting.ts +5 -4
- package/server/graphql/resolvers/worksheet/sorting/sorting-product.ts +5 -4
- package/server/graphql/resolvers/worksheet/sorting-worksheet.ts +6 -0
- package/server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.ts +10 -12
- package/server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.ts +4 -2
- package/server/graphql/types/worksheet/find-release-orders-by-task-no.ts +8 -0
- package/server/graphql/types/worksheet/index.ts +13 -2
- package/server/graphql/types/worksheet/worksheet-detail-info.ts +2 -0
- package/server/graphql/types/worksheet-detail/index.ts +0 -2
- package/server/utils/inventory-util.ts +15 -23
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import _ from 'lodash'
|
|
2
1
|
import FormData from 'form-data'
|
|
3
2
|
import fetch from 'node-fetch'
|
|
4
3
|
import { Equal, getRepository, In } from 'typeorm'
|
|
@@ -11,7 +10,7 @@ import { ProductDetail } from '@things-factory/product-base'
|
|
|
11
10
|
import { DeliveryOrder, ORDER_STATUS, OrderInventory, ReleaseGood } from '@things-factory/sales-base'
|
|
12
11
|
import { Domain } from '@things-factory/shell'
|
|
13
12
|
import { Inventory, Pallet } from '@things-factory/warehouse-base'
|
|
14
|
-
|
|
13
|
+
|
|
15
14
|
import { TEMPLATE_TYPE, WORKSHEET_STATUS, WORKSHEET_TYPE } from '../constants'
|
|
16
15
|
import { Worksheet, WorksheetDetail } from '../entities'
|
|
17
16
|
|
|
@@ -36,10 +35,6 @@ export async function renderOrientageDO({ doNo }, context: any) {
|
|
|
36
35
|
]
|
|
37
36
|
}) // .. find do from deliveryOrderId
|
|
38
37
|
|
|
39
|
-
let foundInventoryItem: InventoryItem[] = await getRepository(InventoryItem).query(
|
|
40
|
-
`select row_number() over (partition by p.sku),p.sku,p.brand_sku, ii.serial_number from inventory_items ii left join products p on ii.product_id = p.id where outbound_order_id = '${foundDO.releaseGood.id}' group by p.sku,ii.serial_number,p.brand_sku`
|
|
41
|
-
)
|
|
42
|
-
|
|
43
38
|
const ownTransportFlag: Boolean = foundDO.ownCollection
|
|
44
39
|
|
|
45
40
|
let foundCP: ContactPoint = null
|
|
@@ -155,20 +150,20 @@ export async function renderOrientageDO({ doNo }, context: any) {
|
|
|
155
150
|
pack_size: matchedProductDetail
|
|
156
151
|
? matchedProductDetail.uomValue
|
|
157
152
|
? matchedProductDetail.uomValue +
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
153
|
+
' ' +
|
|
154
|
+
matchedProductDetail.uom +
|
|
155
|
+
(inventory.product.volumeSize
|
|
156
|
+
? ' x ' + (parseFloat(inventory.product.volumeSize) / 100).toFixed(2) + ' L'
|
|
157
|
+
: '')
|
|
163
158
|
: null
|
|
164
159
|
: inventory.product.primaryValue
|
|
165
|
-
|
|
160
|
+
? inventory.product.primaryValue +
|
|
166
161
|
' ' +
|
|
167
162
|
inventory.product.primaryUnit +
|
|
168
163
|
(inventory.product.volumeSize
|
|
169
164
|
? ' x ' + (parseFloat(inventory.product.volumeSize) / 100).toFixed(2) + ' L'
|
|
170
165
|
: '')
|
|
171
|
-
|
|
166
|
+
: null,
|
|
172
167
|
aux_value_3: matchedProductDetail ? matchedProductDetail.auxValue3 : inventory.product.auxValue3,
|
|
173
168
|
product_qty: targetInventory.inventory.warehouse !== 'DAMAGE ZONE' ? targetInventory.releaseQty : 0,
|
|
174
169
|
product_qty_damage: targetInventory.inventory.warehouse === 'DAMAGE ZONE' ? targetInventory.releaseQty : 0,
|
|
@@ -181,15 +176,15 @@ export async function renderOrientageDO({ doNo }, context: any) {
|
|
|
181
176
|
? matchedProductDetail.volume
|
|
182
177
|
: 0
|
|
183
178
|
: inventory?.product?.volume
|
|
184
|
-
|
|
185
|
-
|
|
179
|
+
? inventory.product.volume
|
|
180
|
+
: 0,
|
|
186
181
|
total_volume: matchedProductDetail
|
|
187
182
|
? matchedProductDetail.volume
|
|
188
183
|
? Number((matchedProductDetail.volume * targetInventory.releaseQty).toFixed(4))
|
|
189
184
|
: 0
|
|
190
185
|
: inventory?.product?.volume
|
|
191
|
-
|
|
192
|
-
|
|
186
|
+
? Number((inventory.product.volume * targetInventory.releaseQty).toFixed(4))
|
|
187
|
+
: 0,
|
|
193
188
|
remark: targetInventory.remark,
|
|
194
189
|
inventory_remark: inventory.remark,
|
|
195
190
|
cross_docking: targetInventory.crossDocking,
|
|
@@ -268,47 +263,6 @@ export async function renderOrientageDO({ doNo }, context: any) {
|
|
|
268
263
|
})
|
|
269
264
|
}
|
|
270
265
|
}, [])
|
|
271
|
-
|
|
272
|
-
let tempFoundInventoryItem:any = []
|
|
273
|
-
|
|
274
|
-
productList.forEach((product) => {
|
|
275
|
-
|
|
276
|
-
tempFoundInventoryItem = foundInventoryItem.filter((item) =>{
|
|
277
|
-
return item.sku == product.product_sku
|
|
278
|
-
})
|
|
279
|
-
|
|
280
|
-
tempFoundInventoryItem.concat(tempFoundInventoryItem);
|
|
281
|
-
})
|
|
282
|
-
|
|
283
|
-
foundInventoryItem = tempFoundInventoryItem;
|
|
284
|
-
|
|
285
|
-
const filterInventoryItem = _.groupBy(foundInventoryItem, i => i.sku)
|
|
286
|
-
|
|
287
|
-
const tempIndexArr = []
|
|
288
|
-
|
|
289
|
-
const tempTotalQuantity = []
|
|
290
|
-
|
|
291
|
-
Object.keys(filterInventoryItem).forEach(k => {
|
|
292
|
-
const tempIndex = foundInventoryItem.findIndex(i => {
|
|
293
|
-
return i.sku == k
|
|
294
|
-
})
|
|
295
|
-
|
|
296
|
-
tempIndexArr.push(tempIndex)
|
|
297
|
-
})
|
|
298
|
-
|
|
299
|
-
Object.values(filterInventoryItem).forEach(k => {
|
|
300
|
-
const tempQuantity = k.length
|
|
301
|
-
|
|
302
|
-
tempTotalQuantity.push(tempQuantity)
|
|
303
|
-
})
|
|
304
|
-
|
|
305
|
-
tempIndexArr.forEach((t, index) => {
|
|
306
|
-
foundInventoryItem[t].totalQuantity = tempTotalQuantity[index]
|
|
307
|
-
})
|
|
308
|
-
|
|
309
|
-
foundInventoryItem[0].ref_no = ownRefNo
|
|
310
|
-
|
|
311
|
-
|
|
312
266
|
|
|
313
267
|
const data = {
|
|
314
268
|
// logo_url: logo,
|
|
@@ -351,9 +305,6 @@ export async function renderOrientageDO({ doNo }, context: any) {
|
|
|
351
305
|
batch_id_ref: prod.product_batch_ref,
|
|
352
306
|
batch_id: prod.product_batch
|
|
353
307
|
}
|
|
354
|
-
}),
|
|
355
|
-
serialNumber: foundInventoryItem.map((item: any, idx) => {
|
|
356
|
-
return { ...item, delivery_to: foundDO.to }
|
|
357
308
|
})
|
|
358
309
|
} //.. make data from do
|
|
359
310
|
const formData = new FormData()
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import _ from 'lodash'
|
|
2
1
|
import FormData from 'form-data'
|
|
3
2
|
import fetch from 'node-fetch'
|
|
4
3
|
import { getRepository, IsNull, Not } from 'typeorm'
|
|
4
|
+
|
|
5
5
|
import { Attachment, STORAGE } from '@things-factory/attachment-base'
|
|
6
6
|
import { Partner } from '@things-factory/auth-base'
|
|
7
7
|
import { Bizplace, ContactPoint } from '@things-factory/biz-base'
|
|
@@ -14,7 +14,6 @@ import {
|
|
|
14
14
|
ORDER_STATUS,
|
|
15
15
|
OrderProduct
|
|
16
16
|
} from '@things-factory/sales-base'
|
|
17
|
-
import { InventoryItem } from '@things-factory/warehouse-base'
|
|
18
17
|
import { Domain } from '@things-factory/shell'
|
|
19
18
|
|
|
20
19
|
import { TEMPLATE_TYPE } from '../constants'
|
|
@@ -41,10 +40,6 @@ export async function renderOrientageGRN({ grnNo }, context: any) {
|
|
|
41
40
|
const ownRefNo2 = foundGAN.refNo2
|
|
42
41
|
const ownRefNo3 = foundGAN.refNo3
|
|
43
42
|
|
|
44
|
-
const foundInventoryItem: InventoryItem[] = await getRepository(InventoryItem).query(
|
|
45
|
-
`select row_number() over (partition by p.sku),p.sku,p.brand_sku, ii.serial_number from inventory_items ii left join products p on ii.product_id = p.id where inbound_order_id = '${foundGAN.id}' group by p.sku,ii.serial_number,p.brand_sku`
|
|
46
|
-
)
|
|
47
|
-
|
|
48
43
|
// 4. find customer bizplace
|
|
49
44
|
const partnerBiz: Bizplace = foundGRN.bizplace
|
|
50
45
|
|
|
@@ -95,31 +90,6 @@ export async function renderOrientageGRN({ grnNo }, context: any) {
|
|
|
95
90
|
logo = 'data:' + foundLogo.mimetype + ';base64,' + (await STORAGE.readFile(foundLogo.path, 'base64'))
|
|
96
91
|
}
|
|
97
92
|
|
|
98
|
-
const filterInventoryItem = _.groupBy(foundInventoryItem, i => i.sku)
|
|
99
|
-
|
|
100
|
-
const tempIndexArr = []
|
|
101
|
-
|
|
102
|
-
const tempTotalQuantity = []
|
|
103
|
-
|
|
104
|
-
Object.keys(filterInventoryItem).forEach(k => {
|
|
105
|
-
const tempIndex = foundInventoryItem.findIndex(i => {
|
|
106
|
-
return i.sku == k
|
|
107
|
-
})
|
|
108
|
-
|
|
109
|
-
tempIndexArr.push(tempIndex)
|
|
110
|
-
})
|
|
111
|
-
|
|
112
|
-
Object.values(filterInventoryItem).forEach(k => {
|
|
113
|
-
const tempQuantity = k.length
|
|
114
|
-
|
|
115
|
-
tempTotalQuantity.push(tempQuantity)
|
|
116
|
-
})
|
|
117
|
-
|
|
118
|
-
tempIndexArr.forEach((t, index) => {
|
|
119
|
-
foundInventoryItem[t].totalQuantity = tempTotalQuantity[index]
|
|
120
|
-
})
|
|
121
|
-
|
|
122
|
-
|
|
123
93
|
const data = {
|
|
124
94
|
logo_url: logo,
|
|
125
95
|
customer_biz: partnerBiz.name,
|
|
@@ -153,16 +123,16 @@ export async function renderOrientageGRN({ grnNo }, context: any) {
|
|
|
153
123
|
pack_size: matchedProductDetail
|
|
154
124
|
? matchedProductDetail.uomValue
|
|
155
125
|
? matchedProductDetail.uomValue +
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
126
|
+
' ' +
|
|
127
|
+
matchedProductDetail.uom +
|
|
128
|
+
(item.product.volumeSize ? ' x ' + (parseFloat(item.product.volumeSize) / 100).toFixed(2) + ' L' : '')
|
|
159
129
|
: null
|
|
160
130
|
: item.product.primaryValue
|
|
161
|
-
|
|
131
|
+
? item.product.primaryValue +
|
|
162
132
|
' ' +
|
|
163
133
|
item.product.primaryUnit +
|
|
164
134
|
(item.product.volumeSize ? ' x ' + (parseFloat(item.product.volumeSize) / 100).toFixed(2) + ' L' : '')
|
|
165
|
-
|
|
135
|
+
: null,
|
|
166
136
|
pack_qty: item.packQty ? item.packQty : 0,
|
|
167
137
|
actual_pack_qty: item.actualPackQty ? item.actualPackQty : 0,
|
|
168
138
|
container_no: foundGAN.containerNo ? foundGAN.containerNo : '',
|
|
@@ -172,15 +142,15 @@ export async function renderOrientageGRN({ grnNo }, context: any) {
|
|
|
172
142
|
? matchedProductDetail.volume
|
|
173
143
|
: 0
|
|
174
144
|
: item?.product?.volume
|
|
175
|
-
|
|
176
|
-
|
|
145
|
+
? item.product.volume
|
|
146
|
+
: 0,
|
|
177
147
|
total_volume: matchedProductDetail
|
|
178
148
|
? matchedProductDetail.volume
|
|
179
149
|
? Number((matchedProductDetail.volume * item.actualPackQty).toFixed(4))
|
|
180
150
|
: 0
|
|
181
151
|
: item?.product?.volume
|
|
182
|
-
|
|
183
|
-
|
|
152
|
+
? Number((item.product.volume * item.actualPackQty).toFixed(4))
|
|
153
|
+
: 0,
|
|
184
154
|
manufacture_year: item.manufactureDate ? new Date(item.manufactureDate).getFullYear() : null,
|
|
185
155
|
manufacture_date: item.manufactureDate ? item.manufactureDate : null,
|
|
186
156
|
literage: matchedProductDetail
|
|
@@ -188,12 +158,11 @@ export async function renderOrientageGRN({ grnNo }, context: any) {
|
|
|
188
158
|
? parseFloat(matchedProductDetail.packingSize) * parseFloat(item.product.volumeSize)
|
|
189
159
|
: 0
|
|
190
160
|
: item.packingSize
|
|
191
|
-
|
|
192
|
-
|
|
161
|
+
? parseFloat(item.packingSize) * parseFloat(item.product.volumeSize)
|
|
162
|
+
: 0,
|
|
193
163
|
remark: item.remark || ''
|
|
194
164
|
}
|
|
195
|
-
})
|
|
196
|
-
serialNumber: foundInventoryItem
|
|
165
|
+
})
|
|
197
166
|
}
|
|
198
167
|
|
|
199
168
|
const formData = new FormData()
|
|
@@ -223,39 +223,39 @@ export async function renderRODO({ doNo }, context: any) {
|
|
|
223
223
|
}, [])
|
|
224
224
|
|
|
225
225
|
|
|
226
|
-
|
|
227
|
-
let tempFoundInventoryItem:any = []
|
|
228
226
|
|
|
229
|
-
|
|
227
|
+
let tempFoundInventoryItem: any = []
|
|
230
228
|
|
|
231
|
-
|
|
229
|
+
const sepProductList = productList.flatMap(p => Array.from({ length: p.product_qty }, () => ({ ...p })))
|
|
232
230
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
231
|
+
sepProductList.forEach((product) => {
|
|
232
|
+
|
|
233
|
+
let temp = foundInventoryItem.filter((item) => {
|
|
234
|
+
return item.sku == product.product_sku
|
|
235
|
+
})
|
|
236
|
+
|
|
237
|
+
if (temp.length > 1) {
|
|
238
|
+
temp.forEach(res => {
|
|
239
|
+
console.log(res)
|
|
236
240
|
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
241
|
+
if (tempFoundInventoryItem.length == 0) {
|
|
242
|
+
tempFoundInventoryItem.push(res)
|
|
243
|
+
} else {
|
|
244
|
+
const index = tempFoundInventoryItem.findIndex(res => res.serial_number == res.serial_number)
|
|
245
|
+
|
|
246
|
+
if (!index) {
|
|
242
247
|
tempFoundInventoryItem.push(res)
|
|
243
|
-
}else{
|
|
244
|
-
const index = tempFoundInventoryItem.findIndex(res=>res.serial_number == res.serial_number)
|
|
245
|
-
|
|
246
|
-
if(!index){
|
|
247
|
-
tempFoundInventoryItem.push(res)
|
|
248
|
-
}
|
|
249
248
|
}
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
tempFoundInventoryItem = _.uniqWith(tempFoundInventoryItem, _.isEqual)
|
|
252
|
+
})
|
|
253
|
+
} else {
|
|
254
|
+
tempFoundInventoryItem.push(Object.assign({}, ...temp))
|
|
255
|
+
}
|
|
256
|
+
})
|
|
257
257
|
|
|
258
|
-
|
|
258
|
+
foundInventoryItem = tempFoundInventoryItem;
|
|
259
259
|
|
|
260
260
|
const filterInventoryItem = _.groupBy(foundInventoryItem, i => i.sku)
|
|
261
261
|
|
|
@@ -278,7 +278,8 @@ export async function renderRODO({ doNo }, context: any) {
|
|
|
278
278
|
})
|
|
279
279
|
|
|
280
280
|
tempIndexArr.forEach((t, index) => {
|
|
281
|
-
|
|
281
|
+
if (t >= 0)
|
|
282
|
+
foundInventoryItem[t].totalQuantity = tempTotalQuantity[index]
|
|
282
283
|
})
|
|
283
284
|
|
|
284
285
|
foundInventoryItem[0].ref_no = ownRefNo || ""
|
|
@@ -347,12 +348,12 @@ export async function renderRODO({ doNo }, context: any) {
|
|
|
347
348
|
remark: prod?.remark
|
|
348
349
|
? prod.remark
|
|
349
350
|
: prod.cross_docking
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
351
|
+
? prod.pallet === ''
|
|
352
|
+
? `${prod.palletQty} PALLET(S) [C/D]`
|
|
353
|
+
: `${prod.palletQty} PALLET(S) (${prod.pallet}) [C/D]`
|
|
354
|
+
: prod.pallet === ''
|
|
355
|
+
? `${prod.palletQty} PALLET(S)`
|
|
356
|
+
: `${prod.palletQty} PALLET(S) (${prod.pallet})`,
|
|
356
357
|
inventory_remark: prod?.inventory_remark ? prod.inventory_remark : '',
|
|
357
358
|
batch_id_ref: prod.product_batch_ref
|
|
358
359
|
}
|
|
@@ -950,7 +950,8 @@ export class WorksheetController {
|
|
|
950
950
|
const duplicatedSerialNumberCnt: number = await this.trxMgr.getRepository(InventoryItem).count({
|
|
951
951
|
domain: this.domain,
|
|
952
952
|
product,
|
|
953
|
-
serialNumber
|
|
953
|
+
serialNumber,
|
|
954
|
+
status: Not(Equal(INVENTORY_STATUS.DELETED))
|
|
954
955
|
})
|
|
955
956
|
|
|
956
957
|
if (duplicatedSerialNumberCnt) throw new Error(this.ERROR_MSG.VALIDITY.DUPLICATED('Serial Number', serialNumber))
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { EntityManager, SelectQueryBuilder } from 'typeorm'
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
|
-
ORDER_STATUS,
|
|
4
|
+
ORDER_STATUS, ORDER_INVENTORY_STATUS,
|
|
5
5
|
OrderInventory as OrderInventoryEntity,
|
|
6
6
|
ReleaseGood as ReleaseGoodEntity
|
|
7
7
|
} from '@things-factory/sales-base'
|
|
8
8
|
import { Domain } from '@things-factory/shell'
|
|
9
|
+
import { Location } from '@things-factory/warehouse-base'
|
|
9
10
|
|
|
10
11
|
import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../../constants'
|
|
11
12
|
import { Worksheet as WorksheetEntity, WorksheetDetail as WorksheetDetailEntity } from '../../../entities'
|
|
@@ -16,6 +17,38 @@ export const findReleaseOrdersByTaskNoResolver = {
|
|
|
16
17
|
let task = await tx.getRepository(WorksheetEntity).findOne({
|
|
17
18
|
where: { taskNo, status: WORKSHEET_STATUS.EXECUTING, type: WORKSHEET_TYPE.SORTING }
|
|
18
19
|
})
|
|
20
|
+
|
|
21
|
+
// Find Task based on Bin
|
|
22
|
+
if (!task) {
|
|
23
|
+
const binLocation: Location = await tx.getRepository(Location).findOne({
|
|
24
|
+
where: { domain, name: taskNo }
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
const qb: SelectQueryBuilder<OrderInventoryEntity> = tx.getRepository(OrderInventoryEntity).createQueryBuilder('orderInventory')
|
|
28
|
+
|
|
29
|
+
qb.innerJoinAndSelect('orderInventory.releaseGood', 'releaseGood')
|
|
30
|
+
.innerJoinAndSelect('worksheets', 'ws', `orderInventory.ref_worksheet_id = ws.id AND ws.type = 'BATCH_PICKING'`)
|
|
31
|
+
.innerJoinAndSelect('worksheets', 'ws2', `ws2.task_no = ws.task_no AND ws2.type = 'SORTING'`)
|
|
32
|
+
.innerJoinAndSelect('releaseGood.bizplace', 'bizplace')
|
|
33
|
+
.innerJoinAndSelect('bizplace.domain', 'domain')
|
|
34
|
+
.where('orderInventory.domain_id = :domainId', { domainId: domain.id })
|
|
35
|
+
.andWhere('orderInventory.status IN (:...orderInventoryStatus)', {
|
|
36
|
+
orderInventoryStatus: [ORDER_INVENTORY_STATUS.SORTING]
|
|
37
|
+
})
|
|
38
|
+
.andWhere('orderInventory.bin_location_id = :locationId', { locationId: binLocation.id })
|
|
39
|
+
.andWhere('releaseGood.status = :status', { status: ORDER_STATUS.SORTING })
|
|
40
|
+
|
|
41
|
+
const orderInventoryByBin = await qb.getRawOne()
|
|
42
|
+
if (orderInventoryByBin?.releaseGood_id) {
|
|
43
|
+
taskNo = orderInventoryByBin.ws_task_no
|
|
44
|
+
task = await tx.getRepository(WorksheetEntity).findOne({
|
|
45
|
+
where: { taskNo, status: WORKSHEET_STATUS.EXECUTING, type: WORKSHEET_TYPE.SORTING }
|
|
46
|
+
})
|
|
47
|
+
} else {
|
|
48
|
+
throw new Error(`Bin do not have any batch picking order.`)
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
19
52
|
if (!task) throw new Error('Unable to find task no.')
|
|
20
53
|
|
|
21
54
|
const qb: SelectQueryBuilder<WorksheetEntity> = tx
|
|
@@ -38,6 +71,6 @@ export const findReleaseOrdersByTaskNoResolver = {
|
|
|
38
71
|
.addGroupBy('rg.status')
|
|
39
72
|
|
|
40
73
|
const releaseGoods: ReleaseGoodEntity[] = await qb.getRawMany()
|
|
41
|
-
return releaseGoods
|
|
74
|
+
return { releaseGoods, taskNo }
|
|
42
75
|
}
|
|
43
76
|
}
|
|
@@ -78,6 +78,8 @@ export const inventoriesByPalletResolver = {
|
|
|
78
78
|
locationSortingRules.forEach((rule: { name: string; desc: boolean }) => {
|
|
79
79
|
qb.addOrderBy(`location.${rule.name}`, rule.desc ? 'DESC' : 'ASC')
|
|
80
80
|
})
|
|
81
|
+
} else {
|
|
82
|
+
qb.addOrderBy('location.name', 'DESC')
|
|
81
83
|
}
|
|
82
84
|
|
|
83
85
|
if (productFilters && productFilters.length > 0) {
|
|
@@ -2,10 +2,12 @@ import { activatePackingResolver } from './activate-packing'
|
|
|
2
2
|
import { completePackingResolver } from './complete-packing'
|
|
3
3
|
import { packingResolver } from './packing'
|
|
4
4
|
import { scanProductPackingResolver } from './scan-product-packing'
|
|
5
|
+
import { undoSerialNumberPackingResolver } from './undo-serial-number-packing'
|
|
5
6
|
|
|
6
7
|
export const Mutations = {
|
|
7
8
|
...activatePackingResolver,
|
|
8
9
|
...completePackingResolver,
|
|
9
10
|
...packingResolver,
|
|
10
|
-
...scanProductPackingResolver
|
|
11
|
+
...scanProductPackingResolver,
|
|
12
|
+
...undoSerialNumberPackingResolver
|
|
11
13
|
}
|
|
@@ -9,9 +9,9 @@ import { PackingWorksheetController, SellercraftController } from '../../../../c
|
|
|
9
9
|
import { Worksheet } from '../../../../entities'
|
|
10
10
|
|
|
11
11
|
export const packingResolver = {
|
|
12
|
-
async packing(_: any, { worksheetDetailName, releaseQty }, context: any) {
|
|
12
|
+
async packing(_: any, { worksheetDetailName, releaseQty, serialNumber }, context: any) {
|
|
13
13
|
const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
|
|
14
|
-
await packing(tx, domain, user, worksheetDetailName, releaseQty)
|
|
14
|
+
await packing(tx, domain, user, worksheetDetailName, releaseQty, serialNumber)
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
17
|
|
|
@@ -20,10 +20,11 @@ export async function packing(
|
|
|
20
20
|
domain: Domain,
|
|
21
21
|
user: User,
|
|
22
22
|
worksheetDetailName: string,
|
|
23
|
-
releaseQty: number
|
|
23
|
+
releaseQty: number,
|
|
24
|
+
serialNumber: string
|
|
24
25
|
) {
|
|
25
26
|
const worksheetController: PackingWorksheetController = new PackingWorksheetController(tx, domain, user)
|
|
26
|
-
const worksheetDetail = await worksheetController.packing(worksheetDetailName, releaseQty)
|
|
27
|
+
const worksheetDetail = await worksheetController.packing(worksheetDetailName, releaseQty, serialNumber)
|
|
27
28
|
|
|
28
29
|
let releaseGood: ReleaseGood = worksheetDetail.targetInventory.releaseGood
|
|
29
30
|
const worksheet: Worksheet = worksheetDetail.worksheet
|
|
@@ -9,9 +9,9 @@ import { PackingWorksheetController, SellercraftController } from '../../../../c
|
|
|
9
9
|
import { Worksheet } from '../../../../entities'
|
|
10
10
|
|
|
11
11
|
export const scanProductPackingResolver = {
|
|
12
|
-
async scanProductPacking(_: any, { worksheetDetailName, productBarcode }, context: any) {
|
|
12
|
+
async scanProductPacking(_: any, { worksheetDetailName, productBarcode, serialNumber }, context: any) {
|
|
13
13
|
const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
|
|
14
|
-
await scanProductPacking(tx, domain, user, worksheetDetailName, productBarcode)
|
|
14
|
+
await scanProductPacking(tx, domain, user, worksheetDetailName, productBarcode, serialNumber)
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
17
|
|
|
@@ -20,10 +20,15 @@ export async function scanProductPacking(
|
|
|
20
20
|
domain: Domain,
|
|
21
21
|
user: User,
|
|
22
22
|
worksheetDetailName: string,
|
|
23
|
-
productBarcode: string
|
|
23
|
+
productBarcode: string,
|
|
24
|
+
serialNumber?: string
|
|
24
25
|
) {
|
|
25
26
|
const worksheetController: PackingWorksheetController = new PackingWorksheetController(tx, domain, user)
|
|
26
|
-
const worksheetDetail = await worksheetController.scanProductPacking(
|
|
27
|
+
const worksheetDetail = await worksheetController.scanProductPacking(
|
|
28
|
+
worksheetDetailName,
|
|
29
|
+
productBarcode,
|
|
30
|
+
serialNumber
|
|
31
|
+
)
|
|
27
32
|
|
|
28
33
|
let releaseGood: ReleaseGood = worksheetDetail.targetInventory.releaseGood
|
|
29
34
|
const worksheet: Worksheet = worksheetDetail.worksheet
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { EntityManager } from 'typeorm'
|
|
2
|
+
|
|
3
|
+
import { User } from '@things-factory/auth-base'
|
|
4
|
+
import { Domain } from '@things-factory/shell'
|
|
5
|
+
|
|
6
|
+
import { PackingWorksheetController } from '../../../../controllers'
|
|
7
|
+
|
|
8
|
+
export const undoSerialNumberPackingResolver = {
|
|
9
|
+
async undoSerialNumberPacking(_: any, { worksheetDetailName, inventoryItemId }, context: any) {
|
|
10
|
+
const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
|
|
11
|
+
await undoSerialNumberPacking(tx, domain, user, worksheetDetailName, inventoryItemId)
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async function undoSerialNumberPacking(
|
|
16
|
+
tx: EntityManager,
|
|
17
|
+
domain: Domain,
|
|
18
|
+
user: User,
|
|
19
|
+
worksheetDetailName: string,
|
|
20
|
+
inventoryItemId: string
|
|
21
|
+
): Promise<void> {
|
|
22
|
+
const worksheetController: PackingWorksheetController = new PackingWorksheetController(tx, domain, user)
|
|
23
|
+
await worksheetController.undoSerialNumberPacking(worksheetDetailName, inventoryItemId)
|
|
24
|
+
}
|