@things-factory/worksheet-base 4.3.137 → 4.3.139
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 +59 -73
- package/dist-server/controllers/inbound/unloading-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/inspect/cycle-count-worksheet-controller.js +2 -4
- package/dist-server/controllers/inspect/cycle-count-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/loading-worksheet-controller.js +5 -4
- package/dist-server/controllers/outbound/loading-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/packing-worksheet-controller.js +23 -23
- package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/picking-worksheet-controller.js +157 -120
- package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/sorting-worksheet-controller.js +14 -14
- package/dist-server/controllers/outbound/sorting-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/vas/vas-worksheet-controller.js +1 -2
- package/dist-server/controllers/vas/vas-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/worksheet-controller.js +7 -7
- package/dist-server/controllers/worksheet-controller.js.map +1 -1
- package/dist-server/entities/index.js +3 -2
- package/dist-server/entities/index.js.map +1 -1
- package/dist-server/entities/warehouse-bizplace-onhand-inventory.js +29 -62
- package/dist-server/entities/warehouse-bizplace-onhand-inventory.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/batch-picking-worksheet.js +6 -0
- package/dist-server/graphql/resolvers/worksheet/batch-picking-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/confirm-cancellation-release-order.js +1 -2
- package/dist-server/graphql/resolvers/worksheet/confirm-cancellation-release-order.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/cycle-count-adjustment.js +6 -6
- package/dist-server/graphql/resolvers/worksheet/cycle-count-adjustment.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/find-sorting-release-orders-by-task-no.js +2 -2
- package/dist-server/graphql/resolvers/worksheet/find-sorting-release-orders-by-task-no.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js +2 -1
- package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +4 -1
- package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js +3 -2
- package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/transfer.js +9 -9
- package/dist-server/graphql/resolvers/worksheet/transfer.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js +1 -1
- package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/vas-transactions/common-utils.js +17 -17
- package/dist-server/graphql/resolvers/worksheet/vas-transactions/common-utils.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet-detail/regenerate-release-good-worksheet-details.js +4 -4
- package/dist-server/graphql/resolvers/worksheet-detail/regenerate-release-good-worksheet-details.js.map +1 -1
- package/dist-server/graphql/types/worksheet-detail/index.js +1 -0
- package/dist-server/graphql/types/worksheet-detail/index.js.map +1 -1
- package/dist-server/utils/inventory-util.js +1 -98
- package/dist-server/utils/inventory-util.js.map +1 -1
- package/package.json +16 -16
- package/server/controllers/inbound/unloading-worksheet-controller.ts +74 -86
- package/server/controllers/inspect/cycle-count-worksheet-controller.ts +2 -4
- package/server/controllers/outbound/loading-worksheet-controller.ts +13 -3
- package/server/controllers/outbound/packing-worksheet-controller.ts +32 -37
- package/server/controllers/outbound/picking-worksheet-controller.ts +186 -150
- package/server/controllers/outbound/sorting-worksheet-controller.ts +14 -21
- package/server/controllers/vas/vas-worksheet-controller.ts +2 -2
- package/server/controllers/worksheet-controller.ts +15 -10
- package/server/entities/index.ts +2 -2
- package/server/entities/warehouse-bizplace-onhand-inventory.ts +29 -63
- package/server/graphql/resolvers/worksheet/batch-picking-worksheet.ts +6 -0
- package/server/graphql/resolvers/worksheet/confirm-cancellation-release-order.ts +1 -2
- package/server/graphql/resolvers/worksheet/cycle-count-adjustment.ts +2 -2
- package/server/graphql/resolvers/worksheet/find-sorting-release-orders-by-task-no.ts +2 -2
- package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +3 -1
- package/server/graphql/resolvers/worksheet/packing-worksheet.ts +4 -2
- package/server/graphql/resolvers/worksheet/picking-worksheet.ts +3 -2
- package/server/graphql/resolvers/worksheet/transfer.ts +18 -16
- package/server/graphql/resolvers/worksheet/unloaded-inventories.ts +1 -1
- package/server/graphql/resolvers/worksheet/vas-transactions/common-utils.ts +3 -2
- package/server/graphql/resolvers/worksheet-detail/regenerate-release-good-worksheet-details.ts +4 -1
- package/server/graphql/types/worksheet-detail/index.ts +1 -0
- package/server/utils/inventory-util.ts +1 -126
|
@@ -18,6 +18,7 @@ const product_base_1 = require("@things-factory/product-base");
|
|
|
18
18
|
const sales_base_1 = require("@things-factory/sales-base");
|
|
19
19
|
const setting_base_1 = require("@things-factory/setting-base");
|
|
20
20
|
const warehouse_base_1 = require("@things-factory/warehouse-base");
|
|
21
|
+
const env_1 = require("@things-factory/env");
|
|
21
22
|
const constants_1 = require("../../constants");
|
|
22
23
|
const entities_1 = require("../../entities");
|
|
23
24
|
const utils_1 = require("../../utils");
|
|
@@ -287,7 +288,7 @@ class PickingWorksheetController extends vas_worksheet_controller_1.VasWorksheet
|
|
|
287
288
|
}, { status: sales_base_1.ORDER_INVENTORY_STATUS.PENDING_SPLIT, updater: this.user, updatedAt: new Date() });
|
|
288
289
|
}
|
|
289
290
|
async scanProductPicking(worksheetDetailName, worksheetType, productBarcode, cartonId, binLocation, serialNumber, toteNo, pickedQty = 1) {
|
|
290
|
-
var _a
|
|
291
|
+
var _a;
|
|
291
292
|
try {
|
|
292
293
|
//find existing worksheet detail
|
|
293
294
|
let worksheetDetail = await this.trxMgr
|
|
@@ -300,7 +301,8 @@ class PickingWorksheetController extends vas_worksheet_controller_1.VasWorksheet
|
|
|
300
301
|
.innerJoinAndSelect('oi.inventory', 'inv')
|
|
301
302
|
.leftJoinAndSelect('oi.orderProduct', 'op')
|
|
302
303
|
.innerJoinAndSelect('oi.product', 'prd')
|
|
303
|
-
.
|
|
304
|
+
.innerJoinAndSelect('oi.productDetail', 'pd')
|
|
305
|
+
.innerJoinAndSelect('pd.productBarcodes', 'pb')
|
|
304
306
|
.where('wd.name = :name', { name: worksheetDetailName })
|
|
305
307
|
.andWhere('wd.domain_id = :domainId', { domainId: this.domain.id })
|
|
306
308
|
.andWhere('wd.type = :type', { type: worksheetType })
|
|
@@ -308,29 +310,54 @@ class PickingWorksheetController extends vas_worksheet_controller_1.VasWorksheet
|
|
|
308
310
|
.andWhere('inv.carton_id = :cartonId', { cartonId: cartonId })
|
|
309
311
|
.getOne();
|
|
310
312
|
//validation to check matching worksheet detail based on name
|
|
311
|
-
if (!worksheetDetail
|
|
313
|
+
if (!worksheetDetail)
|
|
312
314
|
throw new Error(this.ERROR_MSG.FIND.NO_RESULT(worksheetDetailName));
|
|
315
|
+
const releaseGood = worksheetDetail.targetInventory.releaseGood;
|
|
316
|
+
let targetInventory = worksheetDetail.targetInventory;
|
|
317
|
+
let targetProduct = targetInventory.orderProduct;
|
|
318
|
+
const product = targetInventory.product;
|
|
319
|
+
const matchProductBarcode = await this.trxMgr.getRepository(product_base_1.ProductBarcode).findOne({
|
|
320
|
+
where: { gtin: productBarcode },
|
|
321
|
+
relations: ['productDetail']
|
|
322
|
+
});
|
|
323
|
+
const productDetail = targetInventory.productDetail;
|
|
324
|
+
const productBarcodes = productDetail.productBarcodes;
|
|
325
|
+
let inventory = targetInventory.inventory;
|
|
326
|
+
let bizplace = worksheetDetail.worksheet.bizplace;
|
|
327
|
+
let pickedUomValue = pickedQty * productDetail.uomValue;
|
|
328
|
+
let matchingProduct;
|
|
313
329
|
//validation to prevent duplicated picking
|
|
314
|
-
if ((
|
|
330
|
+
if ((targetInventory === null || targetInventory === void 0 ? void 0 : targetInventory.status) != sales_base_1.ORDER_INVENTORY_STATUS.PICKING)
|
|
315
331
|
throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('picking', `is done`));
|
|
316
|
-
|
|
332
|
+
if (!productBarcodes.find(itm => itm.gtin == productBarcode) && (product === null || product === void 0 ? void 0 : product.isRequireSerialNumberScanningOutbound)) {
|
|
333
|
+
throw new Error(this.ERROR_MSG.FIND.NO_RESULT(productBarcode));
|
|
334
|
+
}
|
|
335
|
+
matchingProduct = await this.getDirectQty(Object.assign(Object.assign({}, productDetail), { product: targetInventory === null || targetInventory === void 0 ? void 0 : targetInventory.product }), productBarcode, pickedQty);
|
|
317
336
|
//validate matching product details based on scanned barcode
|
|
318
337
|
if (!matchingProduct)
|
|
319
338
|
throw new Error(this.ERROR_MSG.FIND.NO_RESULT(productBarcode));
|
|
320
339
|
pickedQty = matchingProduct.qty;
|
|
321
|
-
|
|
340
|
+
pickedUomValue = matchingProduct.uomValue;
|
|
322
341
|
//validation to prevent over release
|
|
323
342
|
if (!(worksheetDetail === null || worksheetDetail === void 0 ? void 0 : worksheetDetail.targetInventory) ||
|
|
324
343
|
(worksheetDetail === null || worksheetDetail === void 0 ? void 0 : worksheetDetail.targetInventory.inventory.qty) < 1 ||
|
|
325
|
-
pickedQty + (((
|
|
344
|
+
pickedQty + (((_a = worksheetDetail.targetInventory) === null || _a === void 0 ? void 0 : _a.pickedQty) || 0) > worksheetDetail.targetInventory.releaseQty)
|
|
326
345
|
throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('picking', `over release`));
|
|
327
|
-
const releaseGood = worksheetDetail.targetInventory.releaseGood;
|
|
328
|
-
let targetInventory = worksheetDetail.targetInventory;
|
|
329
|
-
let targetProduct = targetInventory.orderProduct;
|
|
330
|
-
let inventory = targetInventory.inventory;
|
|
331
|
-
let bizplace = worksheetDetail.worksheet.bizplace;
|
|
332
|
-
const product = targetInventory.product;
|
|
333
346
|
targetInventory = await this.checkAndSetBinPicking(targetInventory, binLocation);
|
|
347
|
+
// // search for matching product barcode
|
|
348
|
+
// const productDetails: ProductDetail[] = product?.productDetails.filter(detail => !detail.deletedAt)
|
|
349
|
+
// // scannedProductDetail can be child or gtin
|
|
350
|
+
// const scannedProductDetail: ProductDetail = productDetails.find(detail => detail.gtin == productBarcode)
|
|
351
|
+
// if (!scannedProductDetail) throw new Error(this.ERROR_MSG.FIND.NO_RESULT(productBarcode))
|
|
352
|
+
// // case for scanning parent packing type, packing size
|
|
353
|
+
// // when scannedProductDetail id is not the same as productDetail id, then it's not child gtin, proceed to get child qty
|
|
354
|
+
// if (scannedProductDetail.id !== productDetail.id && !product?.isRequireSerialNumberScanningOutbound) {
|
|
355
|
+
// let childQty = await this.getChildQty(productDetails, productBarcode, productDetail, scannedProductDetail)
|
|
356
|
+
// pickedQty *= childQty
|
|
357
|
+
// }
|
|
358
|
+
// if (pickedQty + targetInventory.pickedQty > releaseQty) {
|
|
359
|
+
// throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('picking', `over release`))
|
|
360
|
+
// }
|
|
334
361
|
// for required outbound serial number scanning
|
|
335
362
|
if (product === null || product === void 0 ? void 0 : product.isRequireSerialNumberScanningOutbound) {
|
|
336
363
|
if (!serialNumber || serialNumber == '') {
|
|
@@ -371,6 +398,7 @@ class PickingWorksheetController extends vas_worksheet_controller_1.VasWorksheet
|
|
|
371
398
|
inventoryItem.outboundOrderId = releaseGood.id;
|
|
372
399
|
inventoryItem.source = warehouse_base_1.INVENTORY_ITEM_SOURCE.OUTBOUND;
|
|
373
400
|
inventoryItem.product = product;
|
|
401
|
+
inventoryItem.productDetail = productDetail;
|
|
374
402
|
inventoryItem.inventory = inventory;
|
|
375
403
|
inventoryItem.domain = this.domain;
|
|
376
404
|
await this.trxMgr.getRepository(warehouse_base_1.InventoryItem).save(inventoryItem);
|
|
@@ -440,7 +468,7 @@ class PickingWorksheetController extends vas_worksheet_controller_1.VasWorksheet
|
|
|
440
468
|
.then(dt => {
|
|
441
469
|
return dt.raw[0].qty;
|
|
442
470
|
});
|
|
443
|
-
await (0,
|
|
471
|
+
await (0, warehouse_base_1.generateInventoryHistory)(inventory, releaseGood, warehouse_base_1.INVENTORY_TRANSACTION_TYPE.PICKING, -releaseQty, -releaseUomValue, this.user, tx);
|
|
444
472
|
let inventoryItems = await tx
|
|
445
473
|
.getRepository(warehouse_base_1.InventoryItem)
|
|
446
474
|
.find({ where: { outboundOrderId: releaseGood.id } });
|
|
@@ -459,7 +487,7 @@ class PickingWorksheetController extends vas_worksheet_controller_1.VasWorksheet
|
|
|
459
487
|
.set({ status: warehouse_base_1.INVENTORY_STATUS.TERMINATED })
|
|
460
488
|
.where('id = :id', { id: targetInventory.inventory.id })
|
|
461
489
|
.execute();
|
|
462
|
-
await (0,
|
|
490
|
+
await (0, warehouse_base_1.generateInventoryHistory)(inventory, releaseGood, warehouse_base_1.INVENTORY_TRANSACTION_TYPE.TERMINATED, 0, 0, this.user, tx);
|
|
463
491
|
}
|
|
464
492
|
});
|
|
465
493
|
}
|
|
@@ -487,11 +515,13 @@ class PickingWorksheetController extends vas_worksheet_controller_1.VasWorksheet
|
|
|
487
515
|
'targetInventory.orderProduct',
|
|
488
516
|
'targetInventory.inventory',
|
|
489
517
|
'targetInventory.inventory.location',
|
|
490
|
-
'targetInventory.product'
|
|
518
|
+
'targetInventory.product',
|
|
519
|
+
'targetInventory.productDetail'
|
|
491
520
|
]);
|
|
492
521
|
const releaseGood = worksheetDetail.targetInventory.releaseGood;
|
|
493
522
|
let targetInventory = worksheetDetail.targetInventory;
|
|
494
523
|
const product = targetInventory.product;
|
|
524
|
+
const productDetail = targetInventory.productDetail;
|
|
495
525
|
let inventory = targetInventory.inventory;
|
|
496
526
|
let targetProduct = targetInventory.orderProduct;
|
|
497
527
|
let bizplace = worksheetDetail.worksheet.bizplace;
|
|
@@ -517,12 +547,12 @@ class PickingWorksheetController extends vas_worksheet_controller_1.VasWorksheet
|
|
|
517
547
|
}
|
|
518
548
|
});
|
|
519
549
|
let foundSerialNumber = await this.trxMgr.getRepository(warehouse_base_1.InventoryItem).findOne({
|
|
520
|
-
where: { domain: this.domain, serialNumber: serialNumber,
|
|
521
|
-
relations: ['product', 'inventory']
|
|
550
|
+
where: { domain: this.domain, serialNumber: serialNumber, productDetail },
|
|
551
|
+
relations: ['product', 'productDetail', 'inventory']
|
|
522
552
|
});
|
|
523
553
|
let scannedPalletIdInventory = await this.trxMgr
|
|
524
554
|
.getRepository(warehouse_base_1.Inventory)
|
|
525
|
-
.findOne({ where: { domain: this.domain, palletId }, relations: ['
|
|
555
|
+
.findOne({ where: { domain: this.domain, palletId }, relations: ['productDetail'] });
|
|
526
556
|
if (foundSerialNumber) {
|
|
527
557
|
if (foundSerialNumber.outboundOrderId) {
|
|
528
558
|
let releaseGood = await this.trxMgr
|
|
@@ -546,6 +576,7 @@ class PickingWorksheetController extends vas_worksheet_controller_1.VasWorksheet
|
|
|
546
576
|
inventoryItem.source = warehouse_base_1.INVENTORY_ITEM_SOURCE.OUTBOUND;
|
|
547
577
|
inventoryItem.outboundOrderId = releaseGood.id;
|
|
548
578
|
inventoryItem.product = product;
|
|
579
|
+
inventoryItem.productDetail = productDetail;
|
|
549
580
|
inventoryItem.inventory = scannedPalletIdInventory;
|
|
550
581
|
inventoryItem.domain = this.domain;
|
|
551
582
|
foundSerialNumber = await this.trxMgr.getRepository(warehouse_base_1.InventoryItem).save(inventoryItem);
|
|
@@ -563,10 +594,9 @@ class PickingWorksheetController extends vas_worksheet_controller_1.VasWorksheet
|
|
|
563
594
|
await this.serialNumberReplacementForExistingOrderInv(existingOrderInv, targetInventory, worksheetDetail, foundSerialNumber);
|
|
564
595
|
}
|
|
565
596
|
else if (scannedPalletIdInventory.batchId == inventory.batchId &&
|
|
566
|
-
scannedPalletIdInventory.
|
|
567
|
-
scannedPalletIdInventory.product.packingType == product.packingType) {
|
|
597
|
+
scannedPalletIdInventory.productDetail.id == productDetail.id) {
|
|
568
598
|
//if replacement order inventory does not exist
|
|
569
|
-
await this.serialNumberReplacement(targetInventory, scannedPalletIdInventory, releaseGood, product, worksheetDetail, foundSerialNumber);
|
|
599
|
+
await this.serialNumberReplacement(targetInventory, scannedPalletIdInventory, releaseGood, product, productDetail, worksheetDetail, foundSerialNumber);
|
|
570
600
|
}
|
|
571
601
|
else {
|
|
572
602
|
throw new Error(this.ERROR_MSG.VALIDITY.UNEXPECTED_FIELD_VALUE('Pallet ID', palletId, inventory.palletId));
|
|
@@ -682,105 +712,107 @@ class PickingWorksheetController extends vas_worksheet_controller_1.VasWorksheet
|
|
|
682
712
|
await this.trxMgr.getRepository(entities_1.WorksheetDetail).save(worksheetDetails);
|
|
683
713
|
}
|
|
684
714
|
async scanProductBatchPicking(taskNo, worksheetType, cartonId, productBarcode, inventory, binLocationName, pickingQty) {
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
'worksheetDetails
|
|
691
|
-
'worksheetDetails.targetInventory
|
|
692
|
-
'
|
|
693
|
-
'
|
|
694
|
-
'
|
|
695
|
-
'
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
const
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
const binLocation = await this.trxMgr.getRepository(warehouse_base_1.Location).findOne({
|
|
747
|
-
where: { domain: this.domain, name: binLocationName, type: warehouse_base_1.LOCATION_TYPE.BIN }
|
|
748
|
-
});
|
|
749
|
-
if (!binLocation)
|
|
750
|
-
throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('picking', `invalid bin location id`));
|
|
751
|
-
targetInventory.binLocation = binLocation;
|
|
752
|
-
}
|
|
753
|
-
// pickedQty = 1, gap = 5 || pickedQty = 12, gap = 5 || pickedQty = 5, gap = 5
|
|
754
|
-
targetInventory.pickedQty += pickedQty > gapQtyRemaining ? gapQtyRemaining : pickedQty;
|
|
755
|
-
remainingAssignedQty = remainingAssignedQty < 0 ? 0 : remainingAssignedQty;
|
|
756
|
-
if (targetInventory.pickedQty == targetReleaseQty) {
|
|
757
|
-
const leftQty = inventory.qty - targetInventory.releaseQty;
|
|
758
|
-
if (leftQty < 0) {
|
|
759
|
-
throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('picking', `quantity can't exceed limitation`));
|
|
715
|
+
try {
|
|
716
|
+
console.time(`scanProductBatchPicking:${taskNo}`);
|
|
717
|
+
const worksheet = await this.trxMgr
|
|
718
|
+
.getRepository(entities_1.Worksheet)
|
|
719
|
+
.createQueryBuilder('worksheet')
|
|
720
|
+
.innerJoinAndSelect('worksheet.worksheetDetails', 'worksheetDetails')
|
|
721
|
+
.innerJoinAndSelect('worksheetDetails.targetInventory', 'targetInventory')
|
|
722
|
+
.innerJoinAndSelect('targetInventory.product', 'product')
|
|
723
|
+
.leftJoinAndSelect('targetInventory.productDetail', 'productDetail')
|
|
724
|
+
.leftJoinAndSelect('targetInventory.inventory', 'inventory')
|
|
725
|
+
.leftJoinAndSelect('inventory.location', 'location')
|
|
726
|
+
.leftJoinAndSelect('targetInventory.releaseGood', 'releaseGood')
|
|
727
|
+
.where('worksheet.domain_id = :domainId', { domainId: this.domain.id })
|
|
728
|
+
.andWhere('worksheet.task_no = :taskNo', { taskNo })
|
|
729
|
+
.andWhere('worksheet.type = :type', { type: worksheetType })
|
|
730
|
+
.andWhere('worksheet.status = :status', { status: constants_1.WORKSHEET_STATUS.EXECUTING })
|
|
731
|
+
.getOne();
|
|
732
|
+
const worksheetDetails = worksheet.worksheetDetails;
|
|
733
|
+
const productDetail = worksheetDetails
|
|
734
|
+
.map(wsd => wsd.targetInventory.productDetail)
|
|
735
|
+
.find(productDetail => productDetail.id === inventory.productDetail.id);
|
|
736
|
+
const product = productDetail.product;
|
|
737
|
+
const batchId = inventory.batchId;
|
|
738
|
+
let pickedQty = pickingQty ? pickingQty : 1;
|
|
739
|
+
let matchingProduct;
|
|
740
|
+
const targetInventories = worksheetDetails
|
|
741
|
+
.map((wsd) => wsd.targetInventory)
|
|
742
|
+
.filter((targetInventory) => targetInventory.batchId === batchId &&
|
|
743
|
+
targetInventory.inventory.cartonId === cartonId &&
|
|
744
|
+
targetInventory.productDetail.id === productDetail.id);
|
|
745
|
+
matchingProduct = await this.getDirectQty(Object.assign(Object.assign({}, productDetail), { product }), productBarcode, pickedQty);
|
|
746
|
+
//validate matching product details based on scanned barcode
|
|
747
|
+
if (!matchingProduct)
|
|
748
|
+
throw new Error(this.ERROR_MSG.FIND.NO_RESULT(productBarcode));
|
|
749
|
+
pickedQty = matchingProduct.qty;
|
|
750
|
+
const sumOfReleaseQty = targetInventories
|
|
751
|
+
.map((oi) => oi.releaseQty)
|
|
752
|
+
.reduce((a, b) => a + b, 0);
|
|
753
|
+
const sumOfPickedQty = targetInventories.map((oi) => oi.pickedQty).reduce((a, b) => a + b, 0) + pickedQty;
|
|
754
|
+
if (sumOfPickedQty > sumOfReleaseQty)
|
|
755
|
+
throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('picking', `quantity can't exceed limitation`));
|
|
756
|
+
for (var i = 0; i < targetInventories.length; i++) {
|
|
757
|
+
let targetInventory = targetInventories[i];
|
|
758
|
+
let inventory = targetInventory.inventory;
|
|
759
|
+
const targetReleaseQty = targetInventory.releaseQty;
|
|
760
|
+
const targetPickedQty = targetInventory.pickedQty;
|
|
761
|
+
const releaseGood = targetInventory.releaseGood;
|
|
762
|
+
if (pickedQty <= 0)
|
|
763
|
+
break;
|
|
764
|
+
if (targetInventory.status === sales_base_1.ORDER_INVENTORY_STATUS.PICKING &&
|
|
765
|
+
targetReleaseQty > targetPickedQty &&
|
|
766
|
+
pickedQty > 0) {
|
|
767
|
+
let remainingAssignedQty = pickedQty - (targetReleaseQty - targetPickedQty); // -1, 0, 1
|
|
768
|
+
const gapQtyRemaining = targetReleaseQty - targetPickedQty; // > 0
|
|
769
|
+
if (binLocationName && !(targetInventory === null || targetInventory === void 0 ? void 0 : targetInventory.binLocation)) {
|
|
770
|
+
const binLocation = await this.trxMgr.getRepository(warehouse_base_1.Location).findOne({
|
|
771
|
+
where: { domain: this.domain, name: binLocationName, type: warehouse_base_1.LOCATION_TYPE.BIN }
|
|
772
|
+
});
|
|
773
|
+
if (!binLocation)
|
|
774
|
+
throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('picking', `invalid bin location id`));
|
|
775
|
+
targetInventory.binLocation = binLocation;
|
|
760
776
|
}
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
777
|
+
// pickedQty = 1, gap = 5 || pickedQty = 12, gap = 5 || pickedQty = 5, gap = 5
|
|
778
|
+
targetInventory.pickedQty += pickedQty > gapQtyRemaining ? gapQtyRemaining : pickedQty;
|
|
779
|
+
remainingAssignedQty = remainingAssignedQty < 0 ? 0 : remainingAssignedQty;
|
|
780
|
+
if (targetInventory.pickedQty == targetReleaseQty) {
|
|
781
|
+
const leftQty = inventory.qty - targetInventory.releaseQty;
|
|
782
|
+
if (leftQty < 0) {
|
|
783
|
+
throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('picking', `quantity can't exceed limitation`));
|
|
784
|
+
}
|
|
785
|
+
targetInventory.status = sales_base_1.ORDER_INVENTORY_STATUS.PICKED;
|
|
786
|
+
await this.updateOrderTargets([targetInventory]);
|
|
787
|
+
inventory.qty -= targetInventory.releaseQty;
|
|
788
|
+
inventory.uomValue = Math.round((inventory.uomValue - targetInventory.releaseUomValue) * 100) / 100;
|
|
789
|
+
inventory.lockedQty = inventory.lockedQty - targetInventory.releaseQty;
|
|
790
|
+
inventory.lockedUomValue =
|
|
791
|
+
Math.round((inventory.lockedUomValue - targetInventory.releaseUomValue) * 100) / 100;
|
|
792
|
+
await this.transactionInventory(inventory, releaseGood, -targetInventory.releaseQty, -targetInventory.releaseUomValue, warehouse_base_1.INVENTORY_TRANSACTION_TYPE.PICKING);
|
|
793
|
+
if (leftQty === 0) {
|
|
794
|
+
inventory.status = warehouse_base_1.INVENTORY_STATUS.TERMINATED;
|
|
795
|
+
await this.transactionInventory(inventory, releaseGood, 0, 0, warehouse_base_1.INVENTORY_TRANSACTION_TYPE.TERMINATED);
|
|
796
|
+
}
|
|
797
|
+
let worksheetDetail = worksheetDetails.find((wsd) => wsd.targetInventory.id === targetInventory.id);
|
|
798
|
+
worksheetDetail.status = constants_1.WORKSHEET_STATUS.DONE;
|
|
799
|
+
worksheetDetail.updater = this.user;
|
|
800
|
+
await this.trxMgr.getRepository(entities_1.WorksheetDetail).save(worksheetDetail);
|
|
772
801
|
}
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
}
|
|
778
|
-
else {
|
|
779
|
-
await this.updateOrderTargets([targetInventory]);
|
|
802
|
+
else {
|
|
803
|
+
await this.updateOrderTargets([targetInventory]);
|
|
804
|
+
}
|
|
805
|
+
pickedQty = pickedQty - (targetReleaseQty - targetPickedQty);
|
|
780
806
|
}
|
|
781
|
-
pickedQty = pickedQty - (targetReleaseQty - targetPickedQty);
|
|
782
807
|
}
|
|
783
808
|
}
|
|
809
|
+
catch (error) {
|
|
810
|
+
env_1.logger.error(`picking-worksheet-controller[scanProductBatchPicking]: ${error}`);
|
|
811
|
+
throw new Error(error);
|
|
812
|
+
}
|
|
813
|
+
finally {
|
|
814
|
+
console.timeEnd(`scanProductBatchPicking:${taskNo}`);
|
|
815
|
+
}
|
|
784
816
|
}
|
|
785
817
|
async completePicking(releaseGoodNo) {
|
|
786
818
|
let releaseGood = await this.findRefOrder(sales_base_1.ReleaseGood, {
|
|
@@ -1004,9 +1036,11 @@ class PickingWorksheetController extends vas_worksheet_controller_1.VasWorksheet
|
|
|
1004
1036
|
await this.trxMgr.getRepository(sales_base_1.OrderInventory).delete(targetInventory.id);
|
|
1005
1037
|
}
|
|
1006
1038
|
}
|
|
1007
|
-
catch (e) {
|
|
1039
|
+
catch (e) {
|
|
1040
|
+
env_1.logger.error(`picking-worksheet-controller[serialNumberReplacementForExistingOrderInv]: ${e}`);
|
|
1041
|
+
}
|
|
1008
1042
|
}
|
|
1009
|
-
async serialNumberReplacement(targetInventory, scannedPalletIdInventory, releaseGood, product, worksheetDetail, foundSerialNumber) {
|
|
1043
|
+
async serialNumberReplacement(targetInventory, scannedPalletIdInventory, releaseGood, product, productDetail, worksheetDetail, foundSerialNumber) {
|
|
1010
1044
|
try {
|
|
1011
1045
|
//1. create new inventory, new order inventory, update old inventory, old order inventory quantity
|
|
1012
1046
|
let newInventory = await this.trxMgr
|
|
@@ -1050,7 +1084,8 @@ class PickingWorksheetController extends vas_worksheet_controller_1.VasWorksheet
|
|
|
1050
1084
|
var { id } = _a, targetInventory = __rest(_a, ["id"]);
|
|
1051
1085
|
return targetInventory;
|
|
1052
1086
|
})(targetInventory);
|
|
1053
|
-
let newOrderInventory = await this.trxMgr.getRepository(sales_base_1.OrderInventory).save(Object.assign(Object.assign({}, newTargetInventory), { domain: this.domain, name: sales_base_1.OrderNoGenerator.orderInventory(), releaseGood, releaseQty: newOrderInventoryReleaseQty, releaseUomValue: newOrderInventoryReleaseUomValue, pickedQty: 1, product,
|
|
1087
|
+
let newOrderInventory = await this.trxMgr.getRepository(sales_base_1.OrderInventory).save(Object.assign(Object.assign({}, newTargetInventory), { domain: this.domain, name: sales_base_1.OrderNoGenerator.orderInventory(), releaseGood, releaseQty: newOrderInventoryReleaseQty, releaseUomValue: newOrderInventoryReleaseUomValue, pickedQty: 1, product,
|
|
1088
|
+
productDetail, inventory: scannedPalletIdInventory, creator: this.user, updater: this.user }));
|
|
1054
1089
|
oldInventory = await this.trxMgr.getRepository(warehouse_base_1.Inventory).save(Object.assign(Object.assign({}, oldInventory), { updater: this.user }));
|
|
1055
1090
|
foundSerialNumber = await this.trxMgr
|
|
1056
1091
|
.getRepository(warehouse_base_1.InventoryItem)
|
|
@@ -1079,7 +1114,9 @@ class PickingWorksheetController extends vas_worksheet_controller_1.VasWorksheet
|
|
|
1079
1114
|
await this.trxMgr.getRepository(sales_base_1.OrderInventory).delete(targetInventory.id);
|
|
1080
1115
|
}
|
|
1081
1116
|
}
|
|
1082
|
-
catch (e) {
|
|
1117
|
+
catch (e) {
|
|
1118
|
+
env_1.logger.error(`picking-worksheet-controller[serialNumberReplacement]: ${e}`);
|
|
1119
|
+
}
|
|
1083
1120
|
}
|
|
1084
1121
|
async toteScanning(toteNo, targetProduct, targetInventory, pickedQty, releaseGood, bizplace) {
|
|
1085
1122
|
//1. find tote
|