@things-factory/worksheet-base 4.3.0-alpha.0 → 4.3.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/constants/index.js +1 -5
- package/dist-server/constants/index.js.map +1 -1
- package/dist-server/controllers/ecommerce/index.js +1 -5
- package/dist-server/controllers/ecommerce/index.js.map +1 -1
- package/dist-server/controllers/inbound/index.js +1 -5
- package/dist-server/controllers/inbound/index.js.map +1 -1
- package/dist-server/controllers/inbound/unloading-worksheet-controller.js +9 -3
- package/dist-server/controllers/inbound/unloading-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/index.js +2 -5
- package/dist-server/controllers/index.js.map +1 -1
- package/dist-server/controllers/inspect/index.js +1 -5
- package/dist-server/controllers/inspect/index.js.map +1 -1
- package/dist-server/controllers/outbound/index.js +1 -5
- package/dist-server/controllers/outbound/index.js.map +1 -1
- 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/controllers/render-fm-grn.js +229 -0
- package/dist-server/controllers/render-fm-grn.js.map +1 -0
- package/dist-server/controllers/render-grn.js +18 -18
- package/dist-server/controllers/vas/index.js +1 -5
- package/dist-server/controllers/vas/index.js.map +1 -1
- package/dist-server/graphql/index.js +1 -5
- package/dist-server/graphql/index.js.map +1 -1
- package/dist-server/graphql/resolvers/index.js +1 -5
- package/dist-server/graphql/resolvers/index.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/vas-transactions/index.js +1 -5
- package/dist-server/graphql/resolvers/worksheet/vas-transactions/index.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/vas-transactions/interfaces/index.js +1 -5
- package/dist-server/graphql/resolvers/worksheet/vas-transactions/interfaces/index.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/vas-transactions/relabeling/index.js +1 -5
- package/dist-server/graphql/resolvers/worksheet/vas-transactions/relabeling/index.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/vas-transactions/repackaging/index.js +1 -5
- package/dist-server/graphql/resolvers/worksheet/vas-transactions/repackaging/index.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/vas-transactions/repalletizing/index.js +1 -5
- package/dist-server/graphql/resolvers/worksheet/vas-transactions/repalletizing/index.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/vas-transactions/unpacking/index.js +1 -5
- package/dist-server/graphql/resolvers/worksheet/vas-transactions/unpacking/index.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/index.js +1 -5
- package/dist-server/graphql/types/index.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/dist-server/index.js +1 -5
- package/dist-server/index.js.map +1 -1
- package/dist-server/routes.js +4 -0
- package/dist-server/routes.js.map +1 -1
- package/dist-server/utils/index.js +1 -5
- package/dist-server/utils/index.js.map +1 -1
- package/package.json +17 -17
- package/server/controllers/inbound/unloading-worksheet-controller.ts +14 -3
- package/server/controllers/index.ts +1 -0
- 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/controllers/render-fm-grn.ts +266 -0
- package/server/controllers/render-grn.ts +18 -18
- 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
- package/server/routes.ts +5 -0
|
@@ -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
|
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { IsNull, In } from 'typeorm'
|
|
2
|
+
|
|
1
3
|
import { VasWorksheetController } from '../vas/vas-worksheet-controller'
|
|
2
4
|
import { Product, ProductDetail } from '@things-factory/product-base'
|
|
3
5
|
import {
|
|
@@ -6,11 +8,22 @@ import {
|
|
|
6
8
|
InventoryItem,
|
|
7
9
|
INVENTORY_STATUS,
|
|
8
10
|
InventoryNoGenerator,
|
|
9
|
-
INVENTORY_ITEM_SOURCE
|
|
11
|
+
INVENTORY_ITEM_SOURCE,
|
|
12
|
+
Tote,
|
|
13
|
+
TOTE_STATUS
|
|
10
14
|
} from '@things-factory/warehouse-base'
|
|
11
|
-
import {
|
|
15
|
+
import {
|
|
16
|
+
ReleaseGood,
|
|
17
|
+
OrderInventory,
|
|
18
|
+
ORDER_INVENTORY_STATUS,
|
|
19
|
+
ORDER_STATUS,
|
|
20
|
+
OrderTote,
|
|
21
|
+
OrderToteItem,
|
|
22
|
+
OrderNoGenerator
|
|
23
|
+
} from '@things-factory/sales-base'
|
|
12
24
|
import { Worksheet, WorksheetDetail } from '../../entities'
|
|
13
25
|
import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../constants'
|
|
26
|
+
import { temporaryGetRemainInventoryAmount } from 'server/graphql/resolvers/worksheet/vas-transactions/common-utils'
|
|
14
27
|
|
|
15
28
|
export class SortingWorksheetController extends VasWorksheetController {
|
|
16
29
|
async generateSortingWorksheet(
|
|
@@ -62,7 +75,8 @@ export class SortingWorksheetController extends VasWorksheetController {
|
|
|
62
75
|
taskNo: string,
|
|
63
76
|
releaseGoodNo: string,
|
|
64
77
|
productBarcode: string,
|
|
65
|
-
serialNumber: string
|
|
78
|
+
serialNumber: string,
|
|
79
|
+
toteNo: string
|
|
66
80
|
): Promise<void> {
|
|
67
81
|
const worksheet: Worksheet = await this.trxMgr.getRepository(Worksheet).findOne({
|
|
68
82
|
where: {
|
|
@@ -75,6 +89,8 @@ export class SortingWorksheetController extends VasWorksheetController {
|
|
|
75
89
|
'worksheetDetails',
|
|
76
90
|
'worksheetDetails.targetInventory',
|
|
77
91
|
'worksheetDetails.targetInventory.product',
|
|
92
|
+
'worksheetDetails.targetInventory.orderProduct',
|
|
93
|
+
'worksheetDetails.targetInventory.bizplace',
|
|
78
94
|
'worksheetDetails.targetInventory.inventory',
|
|
79
95
|
'worksheetDetails.targetInventory.inventory.product',
|
|
80
96
|
'worksheetDetails.targetInventory.inventory.product.productDetails',
|
|
@@ -204,6 +220,17 @@ export class SortingWorksheetController extends VasWorksheetController {
|
|
|
204
220
|
} else {
|
|
205
221
|
await this.updateOrderTargets([matchingOI])
|
|
206
222
|
}
|
|
223
|
+
|
|
224
|
+
if (toteNo) {
|
|
225
|
+
await this.toteScanning(
|
|
226
|
+
toteNo,
|
|
227
|
+
matchingOI.orderProduct,
|
|
228
|
+
matchingOI,
|
|
229
|
+
1,
|
|
230
|
+
releaseGood,
|
|
231
|
+
matchingOI.bizplace
|
|
232
|
+
)
|
|
233
|
+
}
|
|
207
234
|
}
|
|
208
235
|
})
|
|
209
236
|
)
|
|
@@ -216,7 +243,8 @@ export class SortingWorksheetController extends VasWorksheetController {
|
|
|
216
243
|
releaseGoodNo: string,
|
|
217
244
|
productId: string,
|
|
218
245
|
sortingQty: number,
|
|
219
|
-
serialNumber: string
|
|
246
|
+
serialNumber: string,
|
|
247
|
+
toteNo: string
|
|
220
248
|
): Promise<void> {
|
|
221
249
|
const worksheet: Worksheet = await this.trxMgr.getRepository(Worksheet).findOne({
|
|
222
250
|
where: {
|
|
@@ -229,6 +257,8 @@ export class SortingWorksheetController extends VasWorksheetController {
|
|
|
229
257
|
'worksheetDetails',
|
|
230
258
|
'worksheetDetails.targetInventory',
|
|
231
259
|
'worksheetDetails.targetInventory.product',
|
|
260
|
+
'worksheetDetails.targetInventory.orderProduct',
|
|
261
|
+
'worksheetDetails.targetInventory.bizplace',
|
|
232
262
|
'worksheetDetails.targetInventory.inventory',
|
|
233
263
|
'worksheetDetails.targetInventory.inventory.product',
|
|
234
264
|
'worksheetDetails.targetInventory.inventory.product.productDetails',
|
|
@@ -294,6 +324,17 @@ export class SortingWorksheetController extends VasWorksheetController {
|
|
|
294
324
|
}
|
|
295
325
|
}
|
|
296
326
|
|
|
327
|
+
if (toteNo) {
|
|
328
|
+
await this.toteScanning(
|
|
329
|
+
toteNo,
|
|
330
|
+
matchingOI.orderProduct,
|
|
331
|
+
matchingOI,
|
|
332
|
+
sortingQty,
|
|
333
|
+
releaseGood,
|
|
334
|
+
matchingOI.bizplace
|
|
335
|
+
)
|
|
336
|
+
}
|
|
337
|
+
|
|
297
338
|
if (releaseQty != matchingOI?.sortedQty && sortingQty != 0) {
|
|
298
339
|
if (product?.isRequireSerialNumberScanningOutbound) {
|
|
299
340
|
matchingOI.sortedQty += sortingQty
|
|
@@ -338,34 +379,50 @@ export class SortingWorksheetController extends VasWorksheetController {
|
|
|
338
379
|
}
|
|
339
380
|
|
|
340
381
|
async completeOrderSorting(releaseGoodNo: string): Promise<ReleaseGood> {
|
|
341
|
-
|
|
342
|
-
ReleaseGood
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
382
|
+
try {
|
|
383
|
+
let releaseGood: ReleaseGood = await this.findRefOrder(
|
|
384
|
+
ReleaseGood,
|
|
385
|
+
{
|
|
386
|
+
domain: this.domain,
|
|
387
|
+
name: releaseGoodNo,
|
|
388
|
+
status: ORDER_STATUS.SORTING
|
|
389
|
+
},
|
|
390
|
+
['bizplace', 'orderInventories']
|
|
391
|
+
)
|
|
350
392
|
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
393
|
+
if (!releaseGood) {
|
|
394
|
+
throw new Error('Order is already sorted')
|
|
395
|
+
}
|
|
354
396
|
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
397
|
+
const foundNotSealedOrderTote = await this.trxMgr
|
|
398
|
+
.getRepository(OrderTote)
|
|
399
|
+
.findOne({ where: { releaseGood, closedDate: IsNull() } })
|
|
358
400
|
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
itm.updater = this.user
|
|
363
|
-
})
|
|
401
|
+
if (foundNotSealedOrderTote) {
|
|
402
|
+
throw new Error('Please seal the tote(s) before proceeding')
|
|
403
|
+
}
|
|
364
404
|
|
|
365
|
-
|
|
366
|
-
|
|
405
|
+
releaseGood.status = ORDER_STATUS.READY_TO_LOAD
|
|
406
|
+
releaseGood.updater = this.user
|
|
407
|
+
await this.trxMgr.getRepository(ReleaseGood).save(releaseGood)
|
|
408
|
+
|
|
409
|
+
let inventoryItems: InventoryItem = await this.trxMgr
|
|
410
|
+
.getRepository(InventoryItem)
|
|
411
|
+
.find({ where: { outboundOrderId: releaseGood.id } })
|
|
412
|
+
|
|
413
|
+
if (inventoryItems.length > 0) {
|
|
414
|
+
inventoryItems.forEach((itm: InventoryItem) => {
|
|
415
|
+
itm.status = INVENTORY_STATUS.TERMINATED
|
|
416
|
+
itm.updater = this.user
|
|
417
|
+
})
|
|
418
|
+
|
|
419
|
+
await this.trxMgr.getRepository(InventoryItem).save(inventoryItems)
|
|
420
|
+
}
|
|
367
421
|
|
|
368
|
-
|
|
422
|
+
return releaseGood
|
|
423
|
+
} catch (e) {
|
|
424
|
+
throw e
|
|
425
|
+
}
|
|
369
426
|
}
|
|
370
427
|
|
|
371
428
|
async completeWorksheetSorting(taskNo: string): Promise<Worksheet> {
|
|
@@ -383,6 +440,16 @@ export class SortingWorksheetController extends VasWorksheetController {
|
|
|
383
440
|
]
|
|
384
441
|
})
|
|
385
442
|
|
|
443
|
+
let releaseGoodIds = worksheet.worksheetDetails.map(itm => itm.targetInventory.releaseGood.id)
|
|
444
|
+
|
|
445
|
+
const foundNotSealedOrderTote = await this.trxMgr
|
|
446
|
+
.getRepository(OrderTote)
|
|
447
|
+
.findOne({ where: { releaseGood: In(releaseGoodIds), closedDate: IsNull() } })
|
|
448
|
+
|
|
449
|
+
if (foundNotSealedOrderTote) {
|
|
450
|
+
throw new Error('Please seal the tote(s) before proceeding')
|
|
451
|
+
}
|
|
452
|
+
|
|
386
453
|
this.checkRecordValidity(worksheet, { status: WORKSHEET_STATUS.EXECUTING })
|
|
387
454
|
|
|
388
455
|
const worksheetDetails: WorksheetDetail[] = worksheet.worksheetDetails
|
|
@@ -398,4 +465,77 @@ export class SortingWorksheetController extends VasWorksheetController {
|
|
|
398
465
|
|
|
399
466
|
return worksheet
|
|
400
467
|
}
|
|
468
|
+
|
|
469
|
+
private async toteScanning(toteNo, targetProduct, targetInventory, pickedQty, releaseGood, bizplace) {
|
|
470
|
+
//1. find tote
|
|
471
|
+
let foundTote: Tote = await this.trxMgr
|
|
472
|
+
.getRepository(Tote)
|
|
473
|
+
.findOne({ where: { bizplace, name: toteNo, deletedAt: IsNull() } })
|
|
474
|
+
|
|
475
|
+
if (foundTote?.status == TOTE_STATUS.DAMAGED) {
|
|
476
|
+
throw new Error('Tote is damaged')
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
if (foundTote?.status == TOTE_STATUS.DISPATCHED) {
|
|
480
|
+
throw new Error('Tote is dispatched')
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
//2. find order tote
|
|
484
|
+
let foundOrderTote: OrderTote = await this.trxMgr
|
|
485
|
+
.getRepository(OrderTote)
|
|
486
|
+
.findOne({ where: { domain: this.domain, name: toteNo, releaseGood } })
|
|
487
|
+
|
|
488
|
+
//if order tote not found the create one, if tote not found means it's tote box
|
|
489
|
+
//create order tote item
|
|
490
|
+
if (!foundOrderTote) {
|
|
491
|
+
const orderTote = await this.trxMgr.getRepository(OrderTote).save({
|
|
492
|
+
name: toteNo,
|
|
493
|
+
domain: this.domain,
|
|
494
|
+
releaseGood,
|
|
495
|
+
tote: foundTote ? foundTote : null,
|
|
496
|
+
updater: this.user
|
|
497
|
+
})
|
|
498
|
+
|
|
499
|
+
const orderToteItem = await this.trxMgr.getRepository(OrderToteItem).save({
|
|
500
|
+
domain: this.domain,
|
|
501
|
+
name: OrderNoGenerator.orderToteItem(),
|
|
502
|
+
orderProduct: targetProduct,
|
|
503
|
+
orderInventory: targetInventory,
|
|
504
|
+
orderTote,
|
|
505
|
+
qty: pickedQty,
|
|
506
|
+
updater: this.user
|
|
507
|
+
})
|
|
508
|
+
} else {
|
|
509
|
+
if (foundOrderTote.closedDate) {
|
|
510
|
+
throw new Error('Tote has been sealed, please try another tote!')
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
//if found order tote then check if order tote item exist
|
|
514
|
+
const foundOrderToteItem: OrderToteItem = await this.trxMgr.getRepository(OrderToteItem).findOne({
|
|
515
|
+
domain: this.domain,
|
|
516
|
+
orderProduct: targetProduct,
|
|
517
|
+
orderInventory: targetInventory,
|
|
518
|
+
orderTote: foundOrderTote
|
|
519
|
+
})
|
|
520
|
+
|
|
521
|
+
//if not order tote item doesnt exist then create one
|
|
522
|
+
if (!foundOrderToteItem) {
|
|
523
|
+
const orderToteItem = await this.trxMgr.getRepository(OrderToteItem).save({
|
|
524
|
+
domain: this.domain,
|
|
525
|
+
name: OrderNoGenerator.orderToteItem(),
|
|
526
|
+
orderProduct: targetProduct,
|
|
527
|
+
orderInventory: targetInventory,
|
|
528
|
+
orderTote: foundOrderTote,
|
|
529
|
+
qty: pickedQty,
|
|
530
|
+
updater: this.user
|
|
531
|
+
})
|
|
532
|
+
} else {
|
|
533
|
+
//if found order tote item found then add the quantity
|
|
534
|
+
const orderToteItem = await this.trxMgr.getRepository(OrderToteItem).save({
|
|
535
|
+
...foundOrderToteItem,
|
|
536
|
+
qty: foundOrderToteItem.qty + pickedQty
|
|
537
|
+
})
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
}
|
|
401
541
|
}
|