@things-factory/worksheet-base 4.2.12 → 4.3.0
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/outbound/loading-worksheet-controller.js +47 -10
- package/dist-server/controllers/outbound/loading-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/picking-worksheet-controller.js +142 -5
- package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/sorting-worksheet-controller.js +116 -20
- package/dist-server/controllers/outbound/sorting-worksheet-controller.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/batch-picking-worksheet.js +14 -1
- package/dist-server/graphql/resolvers/worksheet/batch-picking-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/loading/loading.js +3 -10
- package/dist-server/graphql/resolvers/worksheet/loading/loading.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/loading-worksheet.js +55 -21
- package/dist-server/graphql/resolvers/worksheet/loading-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +1 -0
- package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +8 -6
- package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/index.js +2 -1
- package/dist-server/graphql/resolvers/worksheet/picking/index.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/picking.js +4 -4
- package/dist-server/graphql/resolvers/worksheet/picking/picking.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/scan-product-picking.js +4 -4
- package/dist-server/graphql/resolvers/worksheet/picking/scan-product-picking.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/seal-tote.js +15 -0
- package/dist-server/graphql/resolvers/worksheet/picking/seal-tote.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js +10 -1
- package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/sorting/complete-order-sorting.js +11 -6
- package/dist-server/graphql/resolvers/worksheet/sorting/complete-order-sorting.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/worksheet.js +2 -0
- package/dist-server/graphql/resolvers/worksheet/worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/worksheets.js +17 -2
- package/dist-server/graphql/resolvers/worksheet/worksheets.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js +5 -3
- 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-batch-picking-worksheet-details.js +15 -4
- package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js +4 -1
- package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet-detail/generate-release-good-worksheet-details.js +6 -2
- package/dist-server/graphql/resolvers/worksheet-detail/generate-release-good-worksheet-details.js.map +1 -1
- package/dist-server/graphql/types/worksheet/index.js +10 -0
- package/dist-server/graphql/types/worksheet/index.js.map +1 -1
- package/dist-server/graphql/types/worksheet/loaded-worksheet-detail.js +1 -0
- package/dist-server/graphql/types/worksheet/loaded-worksheet-detail.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/worksheet-info.js +2 -0
- package/dist-server/graphql/types/worksheet/worksheet-info.js.map +1 -1
- package/dist-server/graphql/types/worksheet/worksheet.js +1 -0
- package/dist-server/graphql/types/worksheet/worksheet.js.map +1 -1
- package/package.json +17 -17
- package/server/controllers/outbound/loading-worksheet-controller.ts +83 -17
- package/server/controllers/outbound/picking-worksheet-controller.ts +178 -7
- package/server/controllers/outbound/sorting-worksheet-controller.ts +167 -27
- package/server/graphql/resolvers/worksheet/batch-picking-worksheet.ts +14 -0
- package/server/graphql/resolvers/worksheet/loading/loading.ts +5 -12
- package/server/graphql/resolvers/worksheet/loading-worksheet.ts +66 -13
- package/server/graphql/resolvers/worksheet/packing-worksheet.ts +1 -1
- package/server/graphql/resolvers/worksheet/picking/complete-batch-picking.ts +1 -1
- package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +13 -11
- package/server/graphql/resolvers/worksheet/picking/index.ts +3 -1
- package/server/graphql/resolvers/worksheet/picking/picking.ts +30 -4
- package/server/graphql/resolvers/worksheet/picking/scan-product-picking.ts +7 -4
- package/server/graphql/resolvers/worksheet/picking/seal-tote.ts +25 -0
- package/server/graphql/resolvers/worksheet/picking-worksheet.ts +13 -2
- package/server/graphql/resolvers/worksheet/sorting/complete-order-sorting.ts +13 -9
- 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/worksheet.ts +2 -0
- package/server/graphql/resolvers/worksheet/worksheets.ts +26 -2
- package/server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.ts +12 -3
- package/server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details.ts +22 -7
- package/server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.ts +6 -2
- package/server/graphql/resolvers/worksheet-detail/generate-release-good-worksheet-details.ts +7 -1
- package/server/graphql/types/worksheet/index.ts +10 -0
- package/server/graphql/types/worksheet/loaded-worksheet-detail.ts +1 -0
- package/server/graphql/types/worksheet/worksheet-detail-info.ts +2 -0
- package/server/graphql/types/worksheet/worksheet-info.ts +2 -0
- package/server/graphql/types/worksheet/worksheet.ts +1 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Equal, Not } from 'typeorm'
|
|
1
|
+
import { Equal, Not, In } from 'typeorm'
|
|
2
2
|
|
|
3
3
|
import { Bizplace } from '@things-factory/biz-base'
|
|
4
4
|
import {
|
|
@@ -8,9 +8,11 @@ import {
|
|
|
8
8
|
ORDER_TYPES,
|
|
9
9
|
OrderInventory,
|
|
10
10
|
OrderNoGenerator,
|
|
11
|
-
ReleaseGood
|
|
11
|
+
ReleaseGood,
|
|
12
|
+
OrderToteItem,
|
|
13
|
+
OrderTote
|
|
12
14
|
} from '@things-factory/sales-base'
|
|
13
|
-
import { Inventory, INVENTORY_TRANSACTION_TYPE } from '@things-factory/warehouse-base'
|
|
15
|
+
import { Inventory, INVENTORY_TRANSACTION_TYPE, Tote, TOTE_STATUS } from '@things-factory/warehouse-base'
|
|
14
16
|
|
|
15
17
|
import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../constants'
|
|
16
18
|
import { Worksheet, WorksheetDetail } from '../../entities'
|
|
@@ -95,8 +97,8 @@ export class LoadingWorksheetController extends VasWorksheetController {
|
|
|
95
97
|
|
|
96
98
|
async loading(
|
|
97
99
|
releaseGoodNo: string,
|
|
98
|
-
worksheetDetails: Partial<WorksheetDetail & { loadedQty: number }>[]
|
|
99
|
-
): Promise<
|
|
100
|
+
worksheetDetails: Partial<WorksheetDetail & { loadedQty: number } & { toteName: string }>[]
|
|
101
|
+
): Promise<any> {
|
|
100
102
|
const releaseGood: ReleaseGood = await this.findRefOrder(
|
|
101
103
|
ReleaseGood,
|
|
102
104
|
{ domain: this.domain, name: releaseGoodNo },
|
|
@@ -104,14 +106,14 @@ export class LoadingWorksheetController extends VasWorksheetController {
|
|
|
104
106
|
)
|
|
105
107
|
const bizplace: Bizplace = releaseGood.bizplace
|
|
106
108
|
|
|
107
|
-
for (let
|
|
108
|
-
const loadedQty: number =
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
'targetInventory.product'
|
|
114
|
-
|
|
109
|
+
for (let i = 0; i < worksheetDetails.length; i++) {
|
|
110
|
+
const loadedQty: number = worksheetDetails[i].loadedQty
|
|
111
|
+
const toteName: string = worksheetDetails[i].toteName
|
|
112
|
+
let worksheetDetail = await this.findExecutableWorksheetDetailByName(
|
|
113
|
+
worksheetDetails[i].name,
|
|
114
|
+
WORKSHEET_TYPE.LOADING,
|
|
115
|
+
['worksheet', 'targetInventory', 'targetInventory.inventory', 'targetInventory.product']
|
|
116
|
+
)
|
|
115
117
|
|
|
116
118
|
const worksheet: Worksheet = worksheetDetail.worksheet
|
|
117
119
|
let targetInventory: OrderInventory = worksheetDetail.targetInventory
|
|
@@ -119,9 +121,9 @@ export class LoadingWorksheetController extends VasWorksheetController {
|
|
|
119
121
|
let inventory: Inventory = targetInventory.inventory
|
|
120
122
|
|
|
121
123
|
targetInventory.loadedAt = new Date()
|
|
122
|
-
targetInventory.loadedByUser = this.user
|
|
124
|
+
targetInventory.loadedByUser = this.user
|
|
123
125
|
|
|
124
|
-
let loadedBy: string[] = targetInventory.loadedBy ?
|
|
126
|
+
let loadedBy: string[] = targetInventory.loadedBy ? targetInventory.loadedBy.split(',') : []
|
|
125
127
|
if (!loadedBy.find(x => x == this.user.name)) {
|
|
126
128
|
loadedBy.push(this.user.name)
|
|
127
129
|
targetInventory.loadedBy = loadedBy.join(',')
|
|
@@ -174,11 +176,56 @@ export class LoadingWorksheetController extends VasWorksheetController {
|
|
|
174
176
|
newTargetInventory.updater = this.user
|
|
175
177
|
newTargetInventory = await this.trxMgr.getRepository(OrderInventory).save(newTargetInventory)
|
|
176
178
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
+
if (toteName) {
|
|
180
|
+
let foundOrderTote = await this.trxMgr
|
|
181
|
+
.getRepository(OrderTote)
|
|
182
|
+
.findOne({ where: { name: toteName, releaseGood } })
|
|
183
|
+
|
|
184
|
+
let foundOrderToteItems = await this.trxMgr
|
|
185
|
+
.getRepository(OrderToteItem)
|
|
186
|
+
.find({ where: { orderInventory: targetInventory.id } })
|
|
187
|
+
|
|
188
|
+
let foundOrderToteItemIds = foundOrderToteItems.map((itm: OrderToteItem) => itm.id)
|
|
189
|
+
|
|
190
|
+
await this.trxMgr
|
|
191
|
+
.getRepository(OrderToteItem)
|
|
192
|
+
.update({ id: In(foundOrderToteItemIds) }, { orderInventory: newTargetInventory })
|
|
193
|
+
|
|
194
|
+
let foundOrderToteItem: OrderToteItem = await this.trxMgr
|
|
195
|
+
.getRepository(OrderToteItem)
|
|
196
|
+
.findOne({ where: { orderInventory: newTargetInventory.id, orderTote: foundOrderTote, qty: loadedQty } })
|
|
197
|
+
|
|
198
|
+
await this.trxMgr
|
|
199
|
+
.getRepository(OrderToteItem)
|
|
200
|
+
.update({ id: foundOrderToteItem.id }, { orderInventory: targetInventory.id })
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
let newWorksheetDetail: any = await this.createWorksheetDetails(
|
|
204
|
+
worksheet,
|
|
205
|
+
WORKSHEET_TYPE.LOADING,
|
|
206
|
+
[newTargetInventory],
|
|
207
|
+
{
|
|
208
|
+
status: WORKSHEET_STATUS.EXECUTING
|
|
209
|
+
}
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
let worksheetDetailName = worksheetDetails[i].name
|
|
213
|
+
worksheetDetails = worksheetDetails.map(record => {
|
|
214
|
+
if (record.name == worksheetDetailName && !record?.targetInventory) {
|
|
215
|
+
return {
|
|
216
|
+
...record,
|
|
217
|
+
name: newWorksheetDetail[0].name
|
|
218
|
+
}
|
|
219
|
+
} else {
|
|
220
|
+
return record
|
|
221
|
+
}
|
|
179
222
|
})
|
|
223
|
+
|
|
224
|
+
worksheetDetails[i].name = worksheetDetailName
|
|
180
225
|
}
|
|
181
226
|
|
|
227
|
+
worksheetDetails[i].targetInventory = targetInventory
|
|
228
|
+
|
|
182
229
|
await generateInventoryHistory(
|
|
183
230
|
inventory,
|
|
184
231
|
releaseGood,
|
|
@@ -189,6 +236,8 @@ export class LoadingWorksheetController extends VasWorksheetController {
|
|
|
189
236
|
this.trxMgr
|
|
190
237
|
)
|
|
191
238
|
}
|
|
239
|
+
|
|
240
|
+
return worksheetDetails
|
|
192
241
|
}
|
|
193
242
|
|
|
194
243
|
async undoLoading(deliveryOrder: Partial<DeliveryOrder>, palletIds: string[]): Promise<void> {
|
|
@@ -228,6 +277,10 @@ export class LoadingWorksheetController extends VasWorksheetController {
|
|
|
228
277
|
}
|
|
229
278
|
})
|
|
230
279
|
|
|
280
|
+
let undoOrderToteItem: OrderToteItem = await this.trxMgr
|
|
281
|
+
.getRepository(OrderToteItem)
|
|
282
|
+
.findOne({ where: { orderInventory: undoTargetOrderInventory } })
|
|
283
|
+
|
|
231
284
|
if (prevTargetInventory) {
|
|
232
285
|
// If there's prev target inventory
|
|
233
286
|
// Merge qty and uomValue into prev target inventory
|
|
@@ -236,6 +289,13 @@ export class LoadingWorksheetController extends VasWorksheetController {
|
|
|
236
289
|
prevTargetInventory.updater = this.user
|
|
237
290
|
await this.updateOrderTargets([prevTargetInventory])
|
|
238
291
|
|
|
292
|
+
//Update order tote item if any
|
|
293
|
+
if (undoOrderToteItem) {
|
|
294
|
+
undoOrderToteItem.orderInventoryId = prevTargetInventory.id
|
|
295
|
+
undoOrderToteItem.orderInventory = prevTargetInventory
|
|
296
|
+
await this.trxMgr.getRepository(OrderToteItem).save(undoOrderToteItem)
|
|
297
|
+
}
|
|
298
|
+
|
|
239
299
|
// Terminate undo target order inventory
|
|
240
300
|
undoTargetOrderInventory.status = ORDER_INVENTORY_STATUS.TERMINATED
|
|
241
301
|
await this.updateOrderTargets([undoTargetOrderInventory])
|
|
@@ -282,6 +342,12 @@ export class LoadingWorksheetController extends VasWorksheetController {
|
|
|
282
342
|
status: ORDER_STATUS.LOADING
|
|
283
343
|
})
|
|
284
344
|
|
|
345
|
+
const orderToteIds = await (
|
|
346
|
+
await this.trxMgr.getRepository(OrderTote).find({ where: { releaseGood }, relations: ['tote'] })
|
|
347
|
+
).map((record: OrderTote) => record?.toteId)
|
|
348
|
+
|
|
349
|
+
await this.trxMgr.getRepository(Tote).update({ id: In(orderToteIds) }, { status: TOTE_STATUS.DISPATCHED })
|
|
350
|
+
|
|
285
351
|
const worksheet: Worksheet = await this.findWorksheetByRefOrder(releaseGood, WORKSHEET_TYPE.LOADING, [
|
|
286
352
|
'worksheetDetails',
|
|
287
353
|
'worksheetDetails.targetInventory'
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Equal, In, Not } from 'typeorm'
|
|
1
|
+
import { Equal, In, IsNull, Not } from 'typeorm'
|
|
2
2
|
|
|
3
3
|
import { Bizplace } from '@things-factory/biz-base'
|
|
4
4
|
import { generateId } from '@things-factory/id-rule-base'
|
|
@@ -8,6 +8,10 @@ import {
|
|
|
8
8
|
ORDER_STATUS,
|
|
9
9
|
OrderInventory,
|
|
10
10
|
OrderNoGenerator,
|
|
11
|
+
OrderProduct,
|
|
12
|
+
OrderTote,
|
|
13
|
+
OrderToteItem,
|
|
14
|
+
OrderToteSeal,
|
|
11
15
|
OrderVas,
|
|
12
16
|
ReleaseGood
|
|
13
17
|
} from '@things-factory/sales-base'
|
|
@@ -20,7 +24,9 @@ import {
|
|
|
20
24
|
InventoryItem,
|
|
21
25
|
InventoryNoGenerator,
|
|
22
26
|
Location,
|
|
23
|
-
LOCATION_TYPE
|
|
27
|
+
LOCATION_TYPE,
|
|
28
|
+
Tote,
|
|
29
|
+
TOTE_STATUS
|
|
24
30
|
} from '@things-factory/warehouse-base'
|
|
25
31
|
|
|
26
32
|
import { TASK_NUMBER_RULE_TYPE, TASK_NUMBER_SETTING_KEY, WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../constants'
|
|
@@ -388,7 +394,8 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
388
394
|
productBarcode: string,
|
|
389
395
|
cartonId: string,
|
|
390
396
|
binLocation?: string,
|
|
391
|
-
serialNumber?: string
|
|
397
|
+
serialNumber?: string,
|
|
398
|
+
toteNo?: string
|
|
392
399
|
): Promise<OrderInventory> {
|
|
393
400
|
try {
|
|
394
401
|
let worksheetDetail: WorksheetDetail = await this.findExecutableWorksheetDetailByName(
|
|
@@ -401,6 +408,7 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
401
408
|
'targetInventory.releaseGood',
|
|
402
409
|
'targetInventory.inventory',
|
|
403
410
|
'targetInventory.product',
|
|
411
|
+
'targetInventory.orderProduct',
|
|
404
412
|
'targetInventory.product.productDetails',
|
|
405
413
|
'targetInventory.product.productDetails.product',
|
|
406
414
|
'targetInventory.product.productDetails.childProductDetail'
|
|
@@ -409,8 +417,10 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
409
417
|
|
|
410
418
|
const releaseGood: ReleaseGood = worksheetDetail.targetInventory.releaseGood
|
|
411
419
|
let targetInventory: OrderInventory = worksheetDetail.targetInventory
|
|
420
|
+
let targetProduct: OrderProduct = targetInventory.orderProduct
|
|
412
421
|
const product: Product = targetInventory.product
|
|
413
422
|
let inventory: Inventory = targetInventory.inventory
|
|
423
|
+
let bizplace: Bizplace = worksheetDetail.worksheet.bizplace
|
|
414
424
|
|
|
415
425
|
//validation to prevent duplicated picking
|
|
416
426
|
let oiValidate: OrderInventory = await this.trxMgr.getRepository(OrderInventory).findOne({
|
|
@@ -512,6 +522,10 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
512
522
|
}
|
|
513
523
|
}
|
|
514
524
|
|
|
525
|
+
if (toteNo) {
|
|
526
|
+
await this.toteScanning(toteNo, targetProduct, targetInventory, pickedQty, releaseGood, bizplace)
|
|
527
|
+
}
|
|
528
|
+
|
|
515
529
|
await this.updatePickingTransaction(releaseGood, targetInventory, worksheetDetail, inventory, pickedQty)
|
|
516
530
|
} catch (error) {
|
|
517
531
|
throw error
|
|
@@ -525,7 +539,8 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
525
539
|
locationName: string,
|
|
526
540
|
pickedQty: number,
|
|
527
541
|
binLocation?: string,
|
|
528
|
-
serialNumber?: string
|
|
542
|
+
serialNumber?: string,
|
|
543
|
+
toteNo?: string
|
|
529
544
|
): Promise<void> {
|
|
530
545
|
try {
|
|
531
546
|
let worksheetDetail: WorksheetDetail = await this.findExecutableWorksheetDetailByName(
|
|
@@ -533,8 +548,10 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
533
548
|
worksheetType,
|
|
534
549
|
[
|
|
535
550
|
'worksheet',
|
|
551
|
+
'worksheet.bizplace',
|
|
536
552
|
'targetInventory',
|
|
537
553
|
'targetInventory.releaseGood',
|
|
554
|
+
'targetInventory.orderProduct',
|
|
538
555
|
'targetInventory.inventory',
|
|
539
556
|
'targetInventory.inventory.location',
|
|
540
557
|
'targetInventory.product'
|
|
@@ -545,6 +562,8 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
545
562
|
let targetInventory: OrderInventory = worksheetDetail.targetInventory
|
|
546
563
|
const product: Product = targetInventory.product
|
|
547
564
|
let inventory: Inventory = targetInventory.inventory
|
|
565
|
+
let targetProduct: OrderProduct = targetInventory.orderProduct
|
|
566
|
+
let bizplace: Bizplace = worksheetDetail.worksheet.bizplace
|
|
548
567
|
|
|
549
568
|
//validation to prevent duplicated picking
|
|
550
569
|
let oiValidate: OrderInventory = await this.trxMgr.getRepository(OrderInventory).findOne({
|
|
@@ -649,6 +668,10 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
649
668
|
|
|
650
669
|
targetInventory = await this.checkAndSetBinPicking(targetInventory, binLocation)
|
|
651
670
|
|
|
671
|
+
if (toteNo) {
|
|
672
|
+
await this.toteScanning(toteNo, targetProduct, targetInventory, pickedQty, releaseGood, bizplace)
|
|
673
|
+
}
|
|
674
|
+
|
|
652
675
|
await this.updatePickingTransaction(releaseGood, targetInventory, worksheetDetail, inventory, pickedQty)
|
|
653
676
|
|
|
654
677
|
const fromLocation: Location = targetInventory.inventory.location
|
|
@@ -947,6 +970,14 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
947
970
|
status: ORDER_STATUS.PICKING
|
|
948
971
|
})
|
|
949
972
|
|
|
973
|
+
const foundNotSealedOrderTote = await this.trxMgr
|
|
974
|
+
.getRepository(OrderTote)
|
|
975
|
+
.findOne({ where: { releaseGood, closedDate: IsNull() } })
|
|
976
|
+
|
|
977
|
+
if (foundNotSealedOrderTote) {
|
|
978
|
+
throw new Error('Please seal the tote(s) before completing')
|
|
979
|
+
}
|
|
980
|
+
|
|
950
981
|
let worksheet: Worksheet = await this.findWorksheetByRefOrder(releaseGood, WORKSHEET_TYPE.PICKING, [
|
|
951
982
|
'worksheetDetails',
|
|
952
983
|
'worksheetDetails.targetInventory'
|
|
@@ -1008,14 +1039,14 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
1008
1039
|
worksheet.updater = this.user
|
|
1009
1040
|
worksheet = await this.trxMgr.getRepository(Worksheet).save(worksheet)
|
|
1010
1041
|
|
|
1011
|
-
const worksheetDetails:
|
|
1042
|
+
const worksheetDetails: any = worksheet.worksheetDetails.filter(wsD => wsD.status != 'MISSING')
|
|
1012
1043
|
worksheetDetails.forEach((wsd: WorksheetDetail) => {
|
|
1013
1044
|
wsd.status = WORKSHEET_STATUS.DONE
|
|
1014
1045
|
wsd.updater = this.user
|
|
1015
1046
|
})
|
|
1016
1047
|
await this.trxMgr.getRepository(WorksheetDetail).save(worksheetDetails)
|
|
1017
1048
|
|
|
1018
|
-
const targetInventories: OrderInventory[] =
|
|
1049
|
+
const targetInventories: OrderInventory[] = worksheetDetails.map((wsd: WorksheetDetail) => {
|
|
1019
1050
|
let targetInventory: OrderInventory = wsd.targetInventory
|
|
1020
1051
|
targetInventory.status = ORDER_INVENTORY_STATUS.TERMINATED
|
|
1021
1052
|
targetInventory.updater = this.user
|
|
@@ -1023,7 +1054,7 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
1023
1054
|
})
|
|
1024
1055
|
await this.updateOrderTargets(targetInventories)
|
|
1025
1056
|
|
|
1026
|
-
const releaseGoods: ReleaseGood[] =
|
|
1057
|
+
const releaseGoods: ReleaseGood[] = worksheetDetails.map((wsd: WorksheetDetail) => {
|
|
1027
1058
|
let releaseGood: ReleaseGood = wsd.targetInventory.releaseGood
|
|
1028
1059
|
|
|
1029
1060
|
let orderStatus: string
|
|
@@ -1108,6 +1139,9 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
1108
1139
|
}
|
|
1109
1140
|
|
|
1110
1141
|
orderInventory.status = ORDER_INVENTORY_STATUS.PICKED
|
|
1142
|
+
orderInventory.pickedBy = this.user?.name
|
|
1143
|
+
orderInventory.pickedByUser = this.user
|
|
1144
|
+
orderInventory.pickedAt = new Date()
|
|
1111
1145
|
|
|
1112
1146
|
inventory.qty -= orderInventory.releaseQty
|
|
1113
1147
|
inventory.uomValue = Math.round((inventory.uomValue - orderInventory.releaseUomValue) * 100) / 100
|
|
@@ -1367,6 +1401,75 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
1367
1401
|
} catch (e) {}
|
|
1368
1402
|
}
|
|
1369
1403
|
|
|
1404
|
+
private async toteScanning(toteNo, targetProduct, targetInventory, pickedQty, releaseGood, bizplace) {
|
|
1405
|
+
//1. find tote
|
|
1406
|
+
let foundTote: Tote = await this.trxMgr
|
|
1407
|
+
.getRepository(Tote)
|
|
1408
|
+
.findOne({ where: { bizplace, name: toteNo, deletedAt: IsNull() } })
|
|
1409
|
+
|
|
1410
|
+
if (foundTote?.status == TOTE_STATUS.DAMAGED || foundTote?.status == TOTE_STATUS.DISPATCHED) {
|
|
1411
|
+
foundTote = null
|
|
1412
|
+
}
|
|
1413
|
+
|
|
1414
|
+
//2. find order tote
|
|
1415
|
+
let foundOrderTote: OrderTote = await this.trxMgr
|
|
1416
|
+
.getRepository(OrderTote)
|
|
1417
|
+
.findOne({ where: { domain: this.domain, name: toteNo, releaseGood } })
|
|
1418
|
+
|
|
1419
|
+
//if order tote not found the create one, if tote not found means it's tote box
|
|
1420
|
+
//create order tote item
|
|
1421
|
+
if (!foundOrderTote) {
|
|
1422
|
+
const orderTote = await this.trxMgr.getRepository(OrderTote).save({
|
|
1423
|
+
name: toteNo,
|
|
1424
|
+
domain: this.domain,
|
|
1425
|
+
releaseGood,
|
|
1426
|
+
tote: foundTote ? foundTote : null,
|
|
1427
|
+
updater: this.user
|
|
1428
|
+
})
|
|
1429
|
+
|
|
1430
|
+
const orderToteItem = await this.trxMgr.getRepository(OrderToteItem).save({
|
|
1431
|
+
domain: this.domain,
|
|
1432
|
+
name: OrderNoGenerator.orderToteItem(),
|
|
1433
|
+
orderProduct: targetProduct,
|
|
1434
|
+
orderInventory: targetInventory,
|
|
1435
|
+
orderTote,
|
|
1436
|
+
qty: pickedQty,
|
|
1437
|
+
updater: this.user
|
|
1438
|
+
})
|
|
1439
|
+
} else {
|
|
1440
|
+
if (foundOrderTote.closedDate) {
|
|
1441
|
+
throw new Error('Tote has been sealed, please try another tote!')
|
|
1442
|
+
}
|
|
1443
|
+
|
|
1444
|
+
//if found order tote then check if order tote item exist
|
|
1445
|
+
const foundOrderToteItem: OrderToteItem = await this.trxMgr.getRepository(OrderToteItem).findOne({
|
|
1446
|
+
domain: this.domain,
|
|
1447
|
+
orderProduct: targetProduct,
|
|
1448
|
+
orderInventory: targetInventory,
|
|
1449
|
+
orderTote: foundOrderTote
|
|
1450
|
+
})
|
|
1451
|
+
|
|
1452
|
+
//if not order tote item doesnt exist then create one
|
|
1453
|
+
if (!foundOrderToteItem) {
|
|
1454
|
+
const orderToteItem = await this.trxMgr.getRepository(OrderToteItem).save({
|
|
1455
|
+
domain: this.domain,
|
|
1456
|
+
name: OrderNoGenerator.orderToteItem(),
|
|
1457
|
+
orderProduct: targetProduct,
|
|
1458
|
+
orderInventory: targetInventory,
|
|
1459
|
+
orderTote: foundOrderTote,
|
|
1460
|
+
qty: pickedQty,
|
|
1461
|
+
updater: this.user
|
|
1462
|
+
})
|
|
1463
|
+
} else {
|
|
1464
|
+
//if found order tote item found then add the quantity
|
|
1465
|
+
const orderToteItem = await this.trxMgr.getRepository(OrderToteItem).save({
|
|
1466
|
+
...foundOrderToteItem,
|
|
1467
|
+
qty: foundOrderToteItem.qty + pickedQty
|
|
1468
|
+
})
|
|
1469
|
+
}
|
|
1470
|
+
}
|
|
1471
|
+
}
|
|
1472
|
+
|
|
1370
1473
|
async undoSerialNumberPicking(worksheetDetailName: string, inventoryItemId: string): Promise<void> {
|
|
1371
1474
|
const worksheetDetail: WorksheetDetail = await this.trxMgr.getRepository(WorksheetDetail).findOne({
|
|
1372
1475
|
where: { name: worksheetDetailName, domain: this.domain, status: Not(Equal(WORKSHEET_STATUS.DEACTIVATED)) },
|
|
@@ -1438,4 +1541,72 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
1438
1541
|
targetInventory.updater = this.user
|
|
1439
1542
|
await this.updateOrderTargets([targetInventory])
|
|
1440
1543
|
}
|
|
1544
|
+
|
|
1545
|
+
async sealTote(sealNo: string, toteNo: string, orderNo: string): Promise<void> {
|
|
1546
|
+
const checkDuplicateSeal = await this.trxMgr.getRepository(OrderToteSeal).findOne({
|
|
1547
|
+
where: {
|
|
1548
|
+
name: sealNo
|
|
1549
|
+
}
|
|
1550
|
+
})
|
|
1551
|
+
|
|
1552
|
+
if (checkDuplicateSeal) {
|
|
1553
|
+
throw new Error('Seal has been scanned before')
|
|
1554
|
+
}
|
|
1555
|
+
|
|
1556
|
+
const releaseGood: ReleaseGood = await this.trxMgr
|
|
1557
|
+
.getRepository(ReleaseGood)
|
|
1558
|
+
.findOne({ where: { domain: this.domain, name: orderNo }, relations: ['bizplace', 'bizplace.domain'] })
|
|
1559
|
+
|
|
1560
|
+
let sealNoSetting: Setting = await this.trxMgr.getRepository(Setting).findOne({
|
|
1561
|
+
where: {
|
|
1562
|
+
domain: releaseGood.bizplace.domain,
|
|
1563
|
+
name: 'minimum-seal-number'
|
|
1564
|
+
}
|
|
1565
|
+
})
|
|
1566
|
+
|
|
1567
|
+
if (!sealNoSetting) {
|
|
1568
|
+
sealNoSetting = await this.trxMgr.getRepository(Setting).findOne({
|
|
1569
|
+
where: {
|
|
1570
|
+
domain: this.domain,
|
|
1571
|
+
name: 'minimum-seal-number'
|
|
1572
|
+
}
|
|
1573
|
+
})
|
|
1574
|
+
}
|
|
1575
|
+
|
|
1576
|
+
const foundOrderTote: OrderTote = await this.trxMgr
|
|
1577
|
+
.getRepository(OrderTote)
|
|
1578
|
+
.findOne({ where: { domain: this.domain, name: toteNo, releaseGood } })
|
|
1579
|
+
|
|
1580
|
+
if (!foundOrderTote) {
|
|
1581
|
+
throw new Error('Tote not scanned under this order')
|
|
1582
|
+
}
|
|
1583
|
+
|
|
1584
|
+
let totalOrderToteItems = await this.trxMgr.getRepository(OrderToteItem).count({
|
|
1585
|
+
where: {
|
|
1586
|
+
orderTote: foundOrderTote
|
|
1587
|
+
}
|
|
1588
|
+
})
|
|
1589
|
+
|
|
1590
|
+
if (totalOrderToteItems < 1) {
|
|
1591
|
+
throw new Error('Tote carton is empty')
|
|
1592
|
+
}
|
|
1593
|
+
|
|
1594
|
+
const newToteOrderSeal: OrderToteSeal = await this.trxMgr.getRepository(OrderToteSeal).save({
|
|
1595
|
+
domain: this.domain,
|
|
1596
|
+
name: sealNo,
|
|
1597
|
+
orderTote: foundOrderTote,
|
|
1598
|
+
updater: this.user
|
|
1599
|
+
})
|
|
1600
|
+
|
|
1601
|
+
const totalSeal = await this.trxMgr.getRepository(OrderToteSeal).count({
|
|
1602
|
+
orderTote: foundOrderTote
|
|
1603
|
+
})
|
|
1604
|
+
|
|
1605
|
+
if (totalSeal >= parseInt(sealNoSetting?.value || 0)) {
|
|
1606
|
+
await this.trxMgr.getRepository(OrderTote).save({
|
|
1607
|
+
...foundOrderTote,
|
|
1608
|
+
closedDate: new Date()
|
|
1609
|
+
})
|
|
1610
|
+
}
|
|
1611
|
+
}
|
|
1441
1612
|
}
|