@things-factory/worksheet-base 4.3.539 → 4.3.541
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/index.js +7 -1
- package/dist-server/controllers/outbound/index.js.map +1 -1
- package/dist-server/controllers/outbound/picking-worksheet-controller.js +512 -138
- package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/activate-picking.js.map +1 -1
- package/dist-server/utils/lmd-util.js +213 -124
- package/dist-server/utils/lmd-util.js.map +1 -1
- package/package.json +9 -9
- package/server/controllers/outbound/index.ts +9 -1
- package/server/controllers/outbound/picking-worksheet-controller.ts +593 -131
- package/server/graphql/resolvers/worksheet/picking/activate-picking.ts +1 -1
- package/server/utils/lmd-util.ts +271 -140
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { EntityManager, Equal, getConnection, getManager, In, IsNull, Not } from 'typeorm'
|
|
2
|
+
import { v4 as uuidv4 } from 'uuid'
|
|
2
3
|
|
|
3
|
-
import { ApplicationType } from '@things-factory/auth-base'
|
|
4
|
+
import { ApplicationType, User } from '@things-factory/auth-base'
|
|
4
5
|
import { Bizplace } from '@things-factory/biz-base'
|
|
5
6
|
import { logger } from '@things-factory/env'
|
|
6
7
|
import { generateId } from '@things-factory/id-rule-base'
|
|
@@ -26,6 +27,7 @@ import {
|
|
|
26
27
|
OrderToteItem,
|
|
27
28
|
OrderToteSeal,
|
|
28
29
|
OrderVas,
|
|
30
|
+
OrderConsignment,
|
|
29
31
|
PowrupController,
|
|
30
32
|
ReleaseGood,
|
|
31
33
|
WebspertController
|
|
@@ -52,6 +54,7 @@ import { SellercraftController } from '../../controllers'
|
|
|
52
54
|
import { ActiveWorksheetPickingView, Worksheet, WorksheetDetail } from '../../entities'
|
|
53
55
|
import { inventoriesByStrategy, isInventoryObsolete, WorksheetNoGenerator } from '../../utils'
|
|
54
56
|
import { VasWorksheetController } from '../vas/vas-worksheet-controller'
|
|
57
|
+
import { sortingProductResolver } from 'server/graphql/resolvers/worksheet/sorting/sorting-product'
|
|
55
58
|
|
|
56
59
|
export class PickingWorksheetController extends VasWorksheetController {
|
|
57
60
|
async generatePickingWorksheet(releaseGoodNo: string, currentStatus: string = null): Promise<Worksheet> {
|
|
@@ -260,9 +263,21 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
260
263
|
]
|
|
261
264
|
})
|
|
262
265
|
|
|
263
|
-
|
|
266
|
+
let orderConsignments: OrderConsignment[] = await this.trxMgr.getRepository(OrderConsignment).find({
|
|
267
|
+
where: { releaseGood: worksheet.releaseGood },
|
|
268
|
+
relations: [
|
|
269
|
+
'orderPackages',
|
|
270
|
+
'orderPackages.orderPackageItems',
|
|
271
|
+
'orderPackages.orderPackageItems.orderProduct',
|
|
272
|
+
'orderPackages.orderPackageItems.orderProduct.product',
|
|
273
|
+
'orderPackages.orderPackageItems.orderProduct.productDetail'
|
|
274
|
+
]
|
|
275
|
+
})
|
|
276
|
+
|
|
277
|
+
worksheet.releaseGood = { ...worksheet.releaseGood, orderProducts, orderPackages, orderConsignments }
|
|
264
278
|
|
|
265
279
|
let releaseGood: ReleaseGood = Object.assign(new ReleaseGood(), worksheet.releaseGood)
|
|
280
|
+
let newReleaseGood: ReleaseGood
|
|
266
281
|
|
|
267
282
|
// assign inventory if unassigned
|
|
268
283
|
if (!releaseGood.assignedInventory) {
|
|
@@ -370,22 +385,37 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
370
385
|
|
|
371
386
|
default:
|
|
372
387
|
if (!releaseGood?.orderPackages?.length) {
|
|
373
|
-
let
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
388
|
+
let mps = releaseGood?.lastMileDelivery?.mps
|
|
389
|
+
switch (mps) {
|
|
390
|
+
case true:
|
|
391
|
+
newReleaseGood = await splitOrderConsignment(this.trxMgr, releaseGood, this.user, this.domain)
|
|
392
|
+
break
|
|
393
|
+
case false:
|
|
394
|
+
case undefined:
|
|
395
|
+
let orderConsignment: OrderConsignment = await createOrderConsignment(
|
|
396
|
+
this.trxMgr,
|
|
397
|
+
{},
|
|
398
|
+
releaseGood,
|
|
399
|
+
this.user
|
|
400
|
+
)
|
|
401
|
+
let orderPackage: OrderPackage = {
|
|
402
|
+
name: OrderNoGenerator.orderPackage(),
|
|
403
|
+
packageId: null,
|
|
404
|
+
trackingNo: null,
|
|
405
|
+
transporter: null,
|
|
406
|
+
airwayBill: releaseGood?.airwayBill,
|
|
407
|
+
invoice: releaseGood?.invoice,
|
|
408
|
+
status: ORDER_STATUS.PROCESSING,
|
|
409
|
+
releaseGood,
|
|
410
|
+
domain: releaseGood.domain,
|
|
411
|
+
bizplace: releaseGood.bizplace,
|
|
412
|
+
creator: this.user,
|
|
413
|
+
updater: this.user,
|
|
414
|
+
orderConsignment: orderConsignment
|
|
415
|
+
}
|
|
416
|
+
newReleaseGood = await createOrderPackageAndItems(this.trxMgr, releaseGood, orderPackage)
|
|
417
|
+
break
|
|
386
418
|
}
|
|
387
|
-
worksheet.releaseGood = await createOrderPackageAndItems(this.trxMgr, releaseGood, orderPackage)
|
|
388
|
-
//worksheet.releaseGood = releaseGood
|
|
389
419
|
}
|
|
390
420
|
break
|
|
391
421
|
}
|
|
@@ -393,6 +423,10 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
393
423
|
logger.error(`picking-worksheet-controller[activatePicking]: ${error}`)
|
|
394
424
|
}
|
|
395
425
|
|
|
426
|
+
if (newReleaseGood) {
|
|
427
|
+
worksheet.releaseGood = newReleaseGood
|
|
428
|
+
}
|
|
429
|
+
|
|
396
430
|
return worksheet
|
|
397
431
|
}
|
|
398
432
|
|
|
@@ -408,13 +442,19 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
408
442
|
.leftJoinAndSelect('w.releaseGood', 'rg')
|
|
409
443
|
.leftJoinAndSelect('rg.domain', 'rgd')
|
|
410
444
|
.leftJoinAndSelect('rg.lastMileDelivery', 'lmd')
|
|
411
|
-
.leftJoinAndSelect('rg.orderPackages', '
|
|
412
|
-
.leftJoinAndSelect('
|
|
413
|
-
.leftJoinAndSelect('
|
|
445
|
+
.leftJoinAndSelect('rg.orderPackages', 'op')
|
|
446
|
+
.leftJoinAndSelect('op.orderPackageItems', 'opi')
|
|
447
|
+
.leftJoinAndSelect('opi.orderProduct', 'op2')
|
|
414
448
|
.leftJoinAndSelect('op2.product', 'p')
|
|
415
449
|
.leftJoinAndSelect('op2.productDetail', 'pd')
|
|
416
|
-
.leftJoinAndSelect('rg.
|
|
417
|
-
.leftJoinAndSelect('
|
|
450
|
+
.leftJoinAndSelect('rg.orderConsignments', 'oc')
|
|
451
|
+
.leftJoinAndSelect('oc.orderPackages', 'ocop')
|
|
452
|
+
.leftJoinAndSelect('ocop.orderPackageItems', 'ocpi')
|
|
453
|
+
.leftJoinAndSelect('ocpi.orderProduct', 'ocp2')
|
|
454
|
+
.leftJoinAndSelect('ocp2.product', 'ocp')
|
|
455
|
+
.leftJoinAndSelect('ocp2.productDetail', 'ocpd')
|
|
456
|
+
.leftJoinAndSelect('rg.bizplace', 'rgb')
|
|
457
|
+
.leftJoinAndSelect('rgb.domain', 'rgbd')
|
|
418
458
|
.leftJoinAndSelect('b.domain', 'bd')
|
|
419
459
|
.leftJoinAndSelect('b.company', 'c')
|
|
420
460
|
.leftJoinAndSelect('c.domain', 'cd')
|
|
@@ -498,30 +538,52 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
498
538
|
// retrieve order inventory
|
|
499
539
|
const pickingOrderInventory: OrderInventory[] = await this.trxMgr.getRepository(OrderInventory).find({
|
|
500
540
|
where: { domain: this.domain, refWorksheetId: worksheet.id, status: ORDER_STATUS.PICKING },
|
|
501
|
-
relations: [
|
|
502
|
-
'releaseGood',
|
|
503
|
-
'releaseGood.domain',
|
|
504
|
-
'releaseGood.lastMileDelivery',
|
|
505
|
-
'releaseGood.bizplace',
|
|
506
|
-
'releaseGood.bizplace.domain',
|
|
507
|
-
'releaseGood.orderPackages',
|
|
508
|
-
'releaseGood.orderPackages.orderPackageItems',
|
|
509
|
-
'releaseGood.orderPackages.orderPackageItems.orderProduct',
|
|
510
|
-
'releaseGood.orderPackages.orderPackageItems.orderProduct.product',
|
|
511
|
-
'releaseGood.orderPackages.orderPackageItems.orderProduct.productDetail',
|
|
512
|
-
'releaseGood.orderProducts',
|
|
513
|
-
'releaseGood.orderProducts.productDetail',
|
|
514
|
-
'releaseGood.orderProducts.product'
|
|
515
|
-
]
|
|
541
|
+
relations: ['releaseGood']
|
|
516
542
|
})
|
|
517
543
|
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
544
|
+
const releaseGoodIds = pickingOrderInventory.reduce((data, order) => {
|
|
545
|
+
const id = order.releaseGood.id
|
|
546
|
+
if (!data.includes(id)) {
|
|
547
|
+
data.push(id)
|
|
521
548
|
}
|
|
522
549
|
return data
|
|
523
550
|
}, [])
|
|
524
551
|
|
|
552
|
+
let releaseGoods: ReleaseGood[] = await this.trxMgr.getRepository(ReleaseGood).find({
|
|
553
|
+
where: { id: In(releaseGoodIds) },
|
|
554
|
+
relations: [
|
|
555
|
+
'domain',
|
|
556
|
+
'lastMileDelivery',
|
|
557
|
+
'bizplace',
|
|
558
|
+
'bizplace.domain',
|
|
559
|
+
'orderPackages',
|
|
560
|
+
'orderPackages.orderPackageItems',
|
|
561
|
+
'orderPackages.orderPackageItems.orderProduct',
|
|
562
|
+
'orderPackages.orderPackageItems.orderProduct.product',
|
|
563
|
+
'orderPackages.orderPackageItems.orderProduct.productDetail',
|
|
564
|
+
'orderProducts',
|
|
565
|
+
'orderProducts.productDetail',
|
|
566
|
+
'orderProducts.product',
|
|
567
|
+
'orderConsignments',
|
|
568
|
+
'orderConsignments.orderPackages',
|
|
569
|
+
'orderConsignments.orderPackages.orderPackageItems',
|
|
570
|
+
'orderConsignments.orderPackages.orderPackageItems.orderProduct',
|
|
571
|
+
'orderConsignments.orderPackages.orderPackageItems.orderProduct.product',
|
|
572
|
+
'orderConsignments.orderPackages.orderPackageItems.orderProduct.productDetail'
|
|
573
|
+
]
|
|
574
|
+
})
|
|
575
|
+
|
|
576
|
+
pickingOrderInventory.forEach(order => {
|
|
577
|
+
order.releaseGood = releaseGoods.find(rg => rg.id === order.releaseGood.id)
|
|
578
|
+
})
|
|
579
|
+
|
|
580
|
+
// let releaseGoodss: ReleaseGood[] = pickingOrderInventory.reduce((data, oi: OrderInventory) => {
|
|
581
|
+
// if (!data.find(x => x.id == oi.releaseGood.id)) {
|
|
582
|
+
// data.push(oi.releaseGood)
|
|
583
|
+
// }
|
|
584
|
+
// return data
|
|
585
|
+
// }, [])
|
|
586
|
+
|
|
525
587
|
// massage data and trigger SC pack order asynchronously
|
|
526
588
|
if (releaseGoods?.length) {
|
|
527
589
|
releaseGoods = await Promise.all(
|
|
@@ -588,21 +650,37 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
588
650
|
|
|
589
651
|
default:
|
|
590
652
|
if (!releaseGood?.orderPackages?.length) {
|
|
591
|
-
let
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
653
|
+
let mps = releaseGood?.lastMileDelivery?.mps
|
|
654
|
+
switch (mps) {
|
|
655
|
+
case true:
|
|
656
|
+
await splitOrderConsignment(this.trxMgr, releaseGood, this.user, this.domain)
|
|
657
|
+
break
|
|
658
|
+
case false:
|
|
659
|
+
case undefined:
|
|
660
|
+
let orderConsignment: OrderConsignment = await createOrderConsignment(
|
|
661
|
+
this.trxMgr,
|
|
662
|
+
{},
|
|
663
|
+
releaseGood,
|
|
664
|
+
this.user
|
|
665
|
+
)
|
|
666
|
+
let orderPackage: OrderPackage = {
|
|
667
|
+
name: OrderNoGenerator.orderPackage(),
|
|
668
|
+
packageId: null,
|
|
669
|
+
trackingNo: null,
|
|
670
|
+
transporter: null,
|
|
671
|
+
airwayBill: releaseGood?.airwayBill,
|
|
672
|
+
invoice: releaseGood?.invoice,
|
|
673
|
+
status: ORDER_STATUS.PROCESSING,
|
|
674
|
+
releaseGood,
|
|
675
|
+
domain: releaseGood.domain,
|
|
676
|
+
bizplace: releaseGood.bizplace,
|
|
677
|
+
creator: this.user,
|
|
678
|
+
updater: this.user,
|
|
679
|
+
orderConsignment: orderConsignment
|
|
680
|
+
}
|
|
681
|
+
await createOrderPackageAndItems(this.trxMgr, releaseGood, orderPackage)
|
|
682
|
+
break
|
|
604
683
|
}
|
|
605
|
-
releaseGood = await createOrderPackageAndItems(this.trxMgr, releaseGood, orderPackage)
|
|
606
684
|
}
|
|
607
685
|
break
|
|
608
686
|
}
|
|
@@ -618,7 +696,17 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
618
696
|
}
|
|
619
697
|
})
|
|
620
698
|
)
|
|
621
|
-
|
|
699
|
+
|
|
700
|
+
await Promise.all(
|
|
701
|
+
releaseGoods.map(rg =>
|
|
702
|
+
this.trxMgr.getRepository(ReleaseGood).update(rg.id, {
|
|
703
|
+
status: rg.status,
|
|
704
|
+
updater: this.user,
|
|
705
|
+
assignedInventory: true,
|
|
706
|
+
updatedAt: () => 'CURRENT_TIMESTAMP'
|
|
707
|
+
})
|
|
708
|
+
)
|
|
709
|
+
)
|
|
622
710
|
}
|
|
623
711
|
|
|
624
712
|
for (const releaseGood of releaseGoods) {
|
|
@@ -2550,38 +2638,62 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
2550
2638
|
|
|
2551
2639
|
await getManager().transaction(async (tx: EntityManager) => {
|
|
2552
2640
|
const worksheetRepo = tx.getRepository(Worksheet)
|
|
2553
|
-
|
|
2554
|
-
|
|
2555
|
-
|
|
2556
|
-
|
|
2557
|
-
|
|
2558
|
-
|
|
2559
|
-
|
|
2560
|
-
|
|
2561
|
-
|
|
2562
|
-
|
|
2563
|
-
|
|
2564
|
-
|
|
2565
|
-
|
|
2566
|
-
|
|
2567
|
-
|
|
2568
|
-
|
|
2569
|
-
|
|
2570
|
-
|
|
2571
|
-
.leftJoinAndSelect('opi_op.productDetail', 'op_pd2')
|
|
2572
|
-
.leftJoinAndSelect('w.domain', 'd')
|
|
2573
|
-
.leftJoinAndSelect('w.bizplace', 'b')
|
|
2574
|
-
.leftJoinAndSelect('b.company', 'c')
|
|
2575
|
-
.leftJoinAndSelect('c.domain', 'c_d')
|
|
2576
|
-
.leftJoinAndSelect('w.worksheetDetails', 'wd')
|
|
2577
|
-
.leftJoinAndSelect('wd.targetInventory', 'ti')
|
|
2578
|
-
.leftJoinAndSelect('ti.product', 'tp')
|
|
2579
|
-
.where('w.id = :worksheetId', { worksheetId: worksheetId })
|
|
2580
|
-
.andWhere('w.bizplace_id = :bizplaceId', { bizplaceId: bizplaceId })
|
|
2581
|
-
.getOne()
|
|
2641
|
+
|
|
2642
|
+
let worksheet: Worksheet = await worksheetRepo.findOne({
|
|
2643
|
+
where: { id: worksheetId, bizplace: bizplaceId },
|
|
2644
|
+
relations: [
|
|
2645
|
+
'domain',
|
|
2646
|
+
'bizplace',
|
|
2647
|
+
'bizplace.company',
|
|
2648
|
+
'bizplace.company.domain',
|
|
2649
|
+
'releaseGood',
|
|
2650
|
+
'releaseGood.bizplace',
|
|
2651
|
+
'releaseGood.domain',
|
|
2652
|
+
'releaseGood.lastMileDelivery',
|
|
2653
|
+
'releaseGood.bizplace.domain',
|
|
2654
|
+
'worksheetDetails',
|
|
2655
|
+
'worksheetDetails.targetInventory',
|
|
2656
|
+
'worksheetDetails.targetInventory.product'
|
|
2657
|
+
]
|
|
2658
|
+
})
|
|
2582
2659
|
|
|
2583
2660
|
let worksheetDetails: WorksheetDetail[]
|
|
2584
2661
|
|
|
2662
|
+
let orderProducts: OrderProduct[] = await tx.getRepository(OrderProduct).find({
|
|
2663
|
+
where: { releaseGood: worksheet.releaseGood },
|
|
2664
|
+
relations: [
|
|
2665
|
+
'product',
|
|
2666
|
+
'productDetail',
|
|
2667
|
+
'productBundle',
|
|
2668
|
+
'productBundle.productBundleSettings',
|
|
2669
|
+
'productBundle.productBundleSettings.productDetail',
|
|
2670
|
+
'productDetail.product'
|
|
2671
|
+
]
|
|
2672
|
+
})
|
|
2673
|
+
|
|
2674
|
+
let orderPackages: OrderPackage[] = await tx.getRepository(OrderPackage).find({
|
|
2675
|
+
where: { releaseGood: worksheet.releaseGood },
|
|
2676
|
+
relations: [
|
|
2677
|
+
'orderPackageItems',
|
|
2678
|
+
'orderPackageItems.orderProduct',
|
|
2679
|
+
'orderPackageItems.orderProduct.product',
|
|
2680
|
+
'orderPackageItems.orderProduct.product.productDetails'
|
|
2681
|
+
]
|
|
2682
|
+
})
|
|
2683
|
+
|
|
2684
|
+
let orderConsignments: OrderConsignment[] = await tx.getRepository(OrderConsignment).find({
|
|
2685
|
+
where: { releaseGood: worksheet.releaseGood },
|
|
2686
|
+
relations: [
|
|
2687
|
+
'orderPackages',
|
|
2688
|
+
'orderPackages.orderPackageItems',
|
|
2689
|
+
'orderPackages.orderPackageItems.orderProduct',
|
|
2690
|
+
'orderPackages.orderPackageItems.orderProduct.product',
|
|
2691
|
+
'orderPackages.orderPackageItems.orderProduct.product.productDetails'
|
|
2692
|
+
]
|
|
2693
|
+
})
|
|
2694
|
+
|
|
2695
|
+
worksheet.releaseGood = { ...worksheet.releaseGood, orderProducts, orderPackages, orderConsignments }
|
|
2696
|
+
|
|
2585
2697
|
if (worksheet.releaseGood?.assignedInventory == false) {
|
|
2586
2698
|
worksheetDetails = await this.assignInventoriesForUnassignedOrder(worksheet, tx)
|
|
2587
2699
|
worksheet.worksheetDetails = worksheetDetails
|
|
@@ -2683,23 +2795,42 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
2683
2795
|
WebspertController.triggerOrderProcesses(releaseGood, this.domain, this.user)
|
|
2684
2796
|
break
|
|
2685
2797
|
|
|
2798
|
+
case ApplicationType.MMS:
|
|
2799
|
+
break
|
|
2800
|
+
|
|
2686
2801
|
default:
|
|
2687
2802
|
if (!releaseGood?.orderPackages?.length) {
|
|
2688
|
-
let
|
|
2689
|
-
|
|
2690
|
-
|
|
2691
|
-
|
|
2692
|
-
|
|
2693
|
-
|
|
2694
|
-
|
|
2695
|
-
|
|
2696
|
-
|
|
2697
|
-
|
|
2698
|
-
|
|
2699
|
-
|
|
2700
|
-
|
|
2803
|
+
let mps = releaseGood?.lastMileDelivery?.mps
|
|
2804
|
+
switch (mps) {
|
|
2805
|
+
case true:
|
|
2806
|
+
await splitOrderConsignment(this.trxMgr, releaseGood, this.user, this.domain)
|
|
2807
|
+
break
|
|
2808
|
+
case false:
|
|
2809
|
+
case undefined:
|
|
2810
|
+
let orderConsignment: OrderConsignment = await createOrderConsignment(
|
|
2811
|
+
this.trxMgr,
|
|
2812
|
+
{},
|
|
2813
|
+
releaseGood,
|
|
2814
|
+
this.user
|
|
2815
|
+
)
|
|
2816
|
+
let orderPackage: OrderPackage = {
|
|
2817
|
+
name: OrderNoGenerator.orderPackage(),
|
|
2818
|
+
packageId: null,
|
|
2819
|
+
trackingNo: null,
|
|
2820
|
+
transporter: null,
|
|
2821
|
+
airwayBill: releaseGood?.airwayBill,
|
|
2822
|
+
invoice: releaseGood?.invoice,
|
|
2823
|
+
status: ORDER_STATUS.PROCESSING,
|
|
2824
|
+
releaseGood,
|
|
2825
|
+
domain: releaseGood.domain,
|
|
2826
|
+
bizplace: releaseGood.bizplace,
|
|
2827
|
+
creator: this.user,
|
|
2828
|
+
updater: this.user,
|
|
2829
|
+
orderConsignment: orderConsignment
|
|
2830
|
+
}
|
|
2831
|
+
await createOrderPackageAndItems(this.trxMgr, releaseGood, orderPackage)
|
|
2832
|
+
break
|
|
2701
2833
|
}
|
|
2702
|
-
await createOrderPackageAndItems(this.trxMgr, releaseGood, orderPackage)
|
|
2703
2834
|
}
|
|
2704
2835
|
break
|
|
2705
2836
|
}
|
|
@@ -2722,44 +2853,375 @@ export async function createOrderPackageAndItems(
|
|
|
2722
2853
|
releaseGood: ReleaseGood,
|
|
2723
2854
|
orderPackage: OrderPackage
|
|
2724
2855
|
): Promise<ReleaseGood> {
|
|
2725
|
-
|
|
2856
|
+
try {
|
|
2857
|
+
let savedOrderPackage: OrderPackage = await tx.getRepository(OrderPackage).save(orderPackage)
|
|
2726
2858
|
|
|
2727
|
-
|
|
2728
|
-
|
|
2729
|
-
|
|
2730
|
-
|
|
2731
|
-
|
|
2732
|
-
|
|
2733
|
-
|
|
2734
|
-
|
|
2735
|
-
|
|
2736
|
-
|
|
2737
|
-
|
|
2738
|
-
|
|
2739
|
-
|
|
2740
|
-
|
|
2859
|
+
const orderPackageItems: OrderPackageItem[] = releaseGood.orderProducts
|
|
2860
|
+
.map(op => {
|
|
2861
|
+
if (op.product) {
|
|
2862
|
+
return {
|
|
2863
|
+
id: uuidv4(),
|
|
2864
|
+
name: OrderNoGenerator.orderPackageItem(),
|
|
2865
|
+
orderProduct: op,
|
|
2866
|
+
status: ORDER_STATUS.PROCESSING,
|
|
2867
|
+
releaseQty: op.releaseQty,
|
|
2868
|
+
orderPackage: savedOrderPackage,
|
|
2869
|
+
domain: releaseGood.domain,
|
|
2870
|
+
bizplace: releaseGood.bizplace,
|
|
2871
|
+
creator: releaseGood.creator,
|
|
2872
|
+
updater: releaseGood.updater,
|
|
2873
|
+
productDetail: op.productDetail
|
|
2874
|
+
}
|
|
2875
|
+
} else {
|
|
2876
|
+
let productBundle = op.productBundle
|
|
2877
|
+
return productBundle.productBundleSettings.map(pbs => ({
|
|
2878
|
+
name: OrderNoGenerator.orderPackageItem(),
|
|
2879
|
+
orderProduct: op,
|
|
2880
|
+
status: ORDER_STATUS.PROCESSING,
|
|
2881
|
+
releaseQty: op.releaseQty * pbs.bundleQty,
|
|
2882
|
+
orderPackage: savedOrderPackage,
|
|
2883
|
+
domain: releaseGood.domain,
|
|
2884
|
+
bizplace: releaseGood.bizplace,
|
|
2885
|
+
creator: releaseGood.creator,
|
|
2886
|
+
updater: releaseGood.updater,
|
|
2887
|
+
productDetail: pbs.productDetail
|
|
2888
|
+
}))
|
|
2741
2889
|
}
|
|
2890
|
+
})
|
|
2891
|
+
.flat()
|
|
2892
|
+
|
|
2893
|
+
await tx.getRepository(OrderPackageItem).save(orderPackageItems)
|
|
2894
|
+
orderPackage.orderPackageItems = orderPackageItems
|
|
2895
|
+
releaseGood.orderPackages = [orderPackage]
|
|
2896
|
+
|
|
2897
|
+
return releaseGood
|
|
2898
|
+
} catch (e) {
|
|
2899
|
+
logger.error(`error:${e}`)
|
|
2900
|
+
}
|
|
2901
|
+
}
|
|
2902
|
+
|
|
2903
|
+
export async function splitOrderConsignment(
|
|
2904
|
+
tx: EntityManager,
|
|
2905
|
+
releaseGood: ReleaseGood,
|
|
2906
|
+
user: User,
|
|
2907
|
+
domain: Domain
|
|
2908
|
+
): Promise<any> {
|
|
2909
|
+
try {
|
|
2910
|
+
let currentConsignment = { id: uuidv4(), totalWeight: 0, orderPackages: [] }
|
|
2911
|
+
let totalConsignments = []
|
|
2912
|
+
let currOrderProducts = []
|
|
2913
|
+
let totalConsignmentWeight = 0
|
|
2914
|
+
|
|
2915
|
+
let orderProducts: OrderProduct = releaseGood.orderProducts
|
|
2916
|
+
let maxConsignmentWeight = releaseGood.lastMileDelivery.consignmentWeight
|
|
2917
|
+
|
|
2918
|
+
//sort product according to packingType
|
|
2919
|
+
let sortOrderProducts = await sortingProduct(orderProducts)
|
|
2920
|
+
|
|
2921
|
+
//initialise new orderConsignment created
|
|
2922
|
+
const createdNewConsignment = () => ({
|
|
2923
|
+
id: uuidv4(),
|
|
2924
|
+
totalWeight: 0,
|
|
2925
|
+
orderPackages: []
|
|
2926
|
+
})
|
|
2927
|
+
|
|
2928
|
+
//push orderPackage & packageItems into consigment
|
|
2929
|
+
const createPackageConsignment = (consignment, packageWeight, releaseGood, orderProduct, releaseQty, user) => {
|
|
2930
|
+
consignment.totalWeight += packageWeight
|
|
2931
|
+
|
|
2932
|
+
currentConsignment.orderPackages.push({
|
|
2933
|
+
id: uuidv4(),
|
|
2934
|
+
name: OrderNoGenerator.orderPackage(),
|
|
2935
|
+
packageId: null,
|
|
2936
|
+
trackingNo: null,
|
|
2937
|
+
transporter: null,
|
|
2938
|
+
airwayBill: releaseGood?.airwayBill,
|
|
2939
|
+
invoice: releaseGood?.invoice,
|
|
2940
|
+
status: ORDER_STATUS.PROCESSING,
|
|
2941
|
+
releaseGood,
|
|
2942
|
+
domain: releaseGood.domain,
|
|
2943
|
+
bizplace: releaseGood.bizplace,
|
|
2944
|
+
creator: user,
|
|
2945
|
+
updater: user,
|
|
2946
|
+
orderPackageItems: [
|
|
2947
|
+
{
|
|
2948
|
+
id: uuidv4(),
|
|
2949
|
+
name: OrderNoGenerator.orderPackageItem(),
|
|
2950
|
+
releaseQty: releaseQty,
|
|
2951
|
+
orderProduct: orderProduct,
|
|
2952
|
+
domain: releaseGood.domain,
|
|
2953
|
+
bizplace: releaseGood.bizplace,
|
|
2954
|
+
creator: releaseGood.creator,
|
|
2955
|
+
updater: releaseGood.updater,
|
|
2956
|
+
productDetail: orderProduct.productDetail
|
|
2957
|
+
}
|
|
2958
|
+
]
|
|
2959
|
+
})
|
|
2960
|
+
}
|
|
2961
|
+
|
|
2962
|
+
const createPackage = op => {
|
|
2963
|
+
let releaseQty = op.productDetail.packingType.toLowerCase() === 'carton' ? 1 : op.releaseQty
|
|
2964
|
+
let packageWeight =
|
|
2965
|
+
op.productDetail.packingType.toLowerCase() === 'carton'
|
|
2966
|
+
? op.productDetail.grossWeight
|
|
2967
|
+
: op.productDetail.grossWeight * releaseQty
|
|
2968
|
+
|
|
2969
|
+
const isCarton = op.productDetail.packingType.toLowerCase() === 'carton'
|
|
2970
|
+
totalConsignmentWeight += packageWeight
|
|
2971
|
+
const requiresNewConsignment = totalConsignmentWeight >= maxConsignmentWeight
|
|
2972
|
+
|
|
2973
|
+
if (isCarton || op.releaseQty > 1) {
|
|
2974
|
+
if (requiresNewConsignment) {
|
|
2975
|
+
//push the current consignment to create new consignment
|
|
2976
|
+
totalConsignments.push(currentConsignment)
|
|
2977
|
+
|
|
2978
|
+
//Initialise the totalConsignment weight to the new data
|
|
2979
|
+
totalConsignmentWeight = packageWeight + 0
|
|
2980
|
+
currentConsignment = createdNewConsignment()
|
|
2981
|
+
}
|
|
2982
|
+
createPackageConsignment(currentConsignment, packageWeight, releaseGood, op, releaseQty, user)
|
|
2742
2983
|
} else {
|
|
2743
|
-
|
|
2744
|
-
|
|
2745
|
-
|
|
2746
|
-
|
|
2747
|
-
|
|
2748
|
-
|
|
2749
|
-
|
|
2750
|
-
|
|
2751
|
-
|
|
2752
|
-
|
|
2753
|
-
|
|
2754
|
-
productDetail: pbs.productDetail
|
|
2755
|
-
}))
|
|
2984
|
+
currOrderProducts.push(op)
|
|
2985
|
+
}
|
|
2986
|
+
}
|
|
2987
|
+
|
|
2988
|
+
sortOrderProducts.forEach(item => {
|
|
2989
|
+
if (item.packingType.toLowerCase() === 'carton') {
|
|
2990
|
+
for (let i = 0; i < item.releaseQty; i++) {
|
|
2991
|
+
createPackage(item)
|
|
2992
|
+
}
|
|
2993
|
+
} else {
|
|
2994
|
+
createPackage(item)
|
|
2756
2995
|
}
|
|
2757
2996
|
})
|
|
2758
|
-
.flat()
|
|
2759
2997
|
|
|
2760
|
-
|
|
2761
|
-
|
|
2762
|
-
|
|
2998
|
+
// Add any remaining items to the last orderPackage
|
|
2999
|
+
if (currOrderProducts.length > 0) {
|
|
3000
|
+
let availableConsignment
|
|
3001
|
+
|
|
3002
|
+
for (let i = 0; i < currOrderProducts.length; i++) {
|
|
3003
|
+
let op = currOrderProducts[i]
|
|
3004
|
+
let releaseQty = op.releaseQty
|
|
3005
|
+
let currProductWeight = op.productDetail.grossWeight * op.releaseQty
|
|
3006
|
+
let lastOrderPackage = currentConsignment.orderPackages[currentConsignment.orderPackages.length - 1]
|
|
3007
|
+
|
|
3008
|
+
//push the product into last current consignment orderPackage
|
|
3009
|
+
if (currentConsignment.totalWeight + currProductWeight < maxConsignmentWeight) {
|
|
3010
|
+
if (lastOrderPackage) {
|
|
3011
|
+
lastOrderPackage.orderPackageItems.push({
|
|
3012
|
+
id: uuidv4(),
|
|
3013
|
+
name: OrderNoGenerator.orderPackageItem(),
|
|
3014
|
+
releaseQty: op.releaseQty,
|
|
3015
|
+
orderProduct: op,
|
|
3016
|
+
domain: releaseGood.domain,
|
|
3017
|
+
bizplace: releaseGood.bizplace,
|
|
3018
|
+
creator: releaseGood.creator,
|
|
3019
|
+
updater: releaseGood.updater,
|
|
3020
|
+
productDetail: op.productDetail
|
|
3021
|
+
})
|
|
3022
|
+
} else {
|
|
3023
|
+
await createPackageConsignment(currentConsignment, currProductWeight, releaseGood, op, releaseQty, user)
|
|
3024
|
+
}
|
|
3025
|
+
} else {
|
|
3026
|
+
//push the currentConsignment into list of all the consignments
|
|
3027
|
+
if (!totalConsignments.some(tc => tc.id === currentConsignment.id)) {
|
|
3028
|
+
totalConsignments.push(currentConsignment)
|
|
3029
|
+
}
|
|
3030
|
+
|
|
3031
|
+
//find one order consignment to include the product
|
|
3032
|
+
availableConsignment = totalConsignments.find(tc => {
|
|
3033
|
+
tc.totalWeight += currProductWeight < maxConsignmentWeight
|
|
3034
|
+
})
|
|
3035
|
+
|
|
3036
|
+
if (availableConsignment) {
|
|
3037
|
+
let lastOrderPackage = availableConsignment.orderPackages[currentConsignment.orderPackages.length - 1]
|
|
3038
|
+
lastOrderPackage.orderPackageItems.push({
|
|
3039
|
+
id: uuidv4(),
|
|
3040
|
+
name: OrderNoGenerator.orderPackageItem(),
|
|
3041
|
+
releaseQty: op.releaseQty,
|
|
3042
|
+
orderProducts: op,
|
|
3043
|
+
domain: releaseGood.domain,
|
|
3044
|
+
bizplace: releaseGood.bizplace,
|
|
3045
|
+
creator: releaseGood.creator,
|
|
3046
|
+
updater: releaseGood.updater,
|
|
3047
|
+
productDetail: op.productDetail
|
|
3048
|
+
})
|
|
3049
|
+
|
|
3050
|
+
//update the totalConsignment data
|
|
3051
|
+
totalConsignments = totalConsignments.map(tc => {
|
|
3052
|
+
tc.id === availableConsignment.id ? availableConsignment : tc
|
|
3053
|
+
})
|
|
3054
|
+
} else {
|
|
3055
|
+
//create new consignment if no consignment available
|
|
3056
|
+
currentConsignment = createdNewConsignment()
|
|
3057
|
+
createPackageConsignment(currentConsignment, currProductWeight, releaseGood, op, releaseQty, user)
|
|
3058
|
+
|
|
3059
|
+
totalConsignments.push(currentConsignment)
|
|
3060
|
+
}
|
|
3061
|
+
}
|
|
3062
|
+
}
|
|
3063
|
+
}
|
|
3064
|
+
|
|
3065
|
+
//totalConsignments.length < 1 ? totalConsignments.push(currentConsignment) : totalConsignments
|
|
2763
3066
|
|
|
2764
|
-
|
|
3067
|
+
const existingConsignment = totalConsignments.find(tc => tc.id === currentConsignment.id)
|
|
3068
|
+
|
|
3069
|
+
if (!existingConsignment) {
|
|
3070
|
+
totalConsignments.push(currentConsignment)
|
|
3071
|
+
}
|
|
3072
|
+
|
|
3073
|
+
let orderConsignment = totalConsignments
|
|
3074
|
+
let newReleaseGood = await createConsignmentWithMultipackage(tx, orderConsignment, releaseGood, user, domain)
|
|
3075
|
+
|
|
3076
|
+
return newReleaseGood
|
|
3077
|
+
} catch (e) {
|
|
3078
|
+
logger.error(`[lmd-create-consignment-notes]: ${e} `)
|
|
3079
|
+
}
|
|
3080
|
+
}
|
|
3081
|
+
|
|
3082
|
+
export async function createOrderConsignment(
|
|
3083
|
+
tx: EntityManager,
|
|
3084
|
+
orderCons: OrderConsignment,
|
|
3085
|
+
releaseGood: ReleaseGood,
|
|
3086
|
+
user: User
|
|
3087
|
+
): Promise<OrderConsignment> {
|
|
3088
|
+
try {
|
|
3089
|
+
let orderConsignment: OrderConsignment = {
|
|
3090
|
+
id: uuidv4(),
|
|
3091
|
+
name: OrderNoGenerator.orderConsignment(),
|
|
3092
|
+
noOfPackages: orderCons?.orderPackages?.length ? orderCons.orderPackages.length : 1,
|
|
3093
|
+
domain: releaseGood.domain,
|
|
3094
|
+
bizplace: releaseGood.bizplace,
|
|
3095
|
+
releaseGood: releaseGood,
|
|
3096
|
+
orderPackages: [],
|
|
3097
|
+
creator: user,
|
|
3098
|
+
updater: user
|
|
3099
|
+
}
|
|
3100
|
+
|
|
3101
|
+
orderConsignment = await tx.getRepository(OrderConsignment).save(orderConsignment)
|
|
3102
|
+
return orderConsignment
|
|
3103
|
+
} catch (e) {
|
|
3104
|
+
logger.error(`[lmd-create-order-consignment]: ${e} `)
|
|
3105
|
+
}
|
|
3106
|
+
}
|
|
3107
|
+
|
|
3108
|
+
export async function createConsignmentPackage(
|
|
3109
|
+
tx: EntityManager,
|
|
3110
|
+
orderPackageData: any,
|
|
3111
|
+
releaseGood: ReleaseGood,
|
|
3112
|
+
user: User,
|
|
3113
|
+
orderConsignment: OrderConsignment
|
|
3114
|
+
): Promise<OrderPackage> {
|
|
3115
|
+
try {
|
|
3116
|
+
const orderPackage: OrderPackage = {
|
|
3117
|
+
id: uuidv4(),
|
|
3118
|
+
name: OrderNoGenerator.orderPackage(),
|
|
3119
|
+
packageId: null,
|
|
3120
|
+
trackingNo: null,
|
|
3121
|
+
transporter: null,
|
|
3122
|
+
airwayBill: releaseGood?.airwayBill,
|
|
3123
|
+
invoice: releaseGood?.invoice,
|
|
3124
|
+
status: ORDER_STATUS.PROCESSING,
|
|
3125
|
+
releaseGood,
|
|
3126
|
+
domain: releaseGood.domain,
|
|
3127
|
+
bizplace: releaseGood.bizplace,
|
|
3128
|
+
creator: user,
|
|
3129
|
+
updater: user,
|
|
3130
|
+
orderConsignment
|
|
3131
|
+
}
|
|
3132
|
+
return tx.getRepository(OrderPackage).save(orderPackage)
|
|
3133
|
+
} catch (e) {
|
|
3134
|
+
logger.error(`[lmd-create-order-package]: ${e} `)
|
|
3135
|
+
}
|
|
3136
|
+
}
|
|
3137
|
+
|
|
3138
|
+
export async function createConsignmentPackageItem(
|
|
3139
|
+
tx: EntityManager,
|
|
3140
|
+
orderPackageItemsData: any[],
|
|
3141
|
+
savedOrderPackage: OrderPackage,
|
|
3142
|
+
releaseGood: ReleaseGood
|
|
3143
|
+
): Promise<OrderPackageItem[]> {
|
|
3144
|
+
try {
|
|
3145
|
+
const orderPackageItems: OrderPackageItem[] = orderPackageItemsData.map(opi => ({
|
|
3146
|
+
id: opi.id,
|
|
3147
|
+
name: opi.name,
|
|
3148
|
+
orderProduct: opi.orderProduct,
|
|
3149
|
+
status: ORDER_STATUS.PROCESSING,
|
|
3150
|
+
releaseQty: opi.releaseQty,
|
|
3151
|
+
orderPackage: savedOrderPackage,
|
|
3152
|
+
domain: releaseGood.domain,
|
|
3153
|
+
bizplace: releaseGood.bizplace,
|
|
3154
|
+
creator: releaseGood.creator,
|
|
3155
|
+
updater: releaseGood.updater,
|
|
3156
|
+
productDetail: opi.productDetail
|
|
3157
|
+
}))
|
|
3158
|
+
|
|
3159
|
+
await tx.getRepository(OrderPackageItem).save(orderPackageItems)
|
|
3160
|
+
return orderPackageItems
|
|
3161
|
+
} catch (e) {
|
|
3162
|
+
logger.error(`[lmd-create-order-package]: ${e} `)
|
|
3163
|
+
}
|
|
3164
|
+
}
|
|
3165
|
+
|
|
3166
|
+
export async function createConsignmentWithMultipackage(
|
|
3167
|
+
tx: EntityManager,
|
|
3168
|
+
orderConsList: OrderConsignment[],
|
|
3169
|
+
releaseGood: ReleaseGood,
|
|
3170
|
+
user: User,
|
|
3171
|
+
domain: Domain
|
|
3172
|
+
): Promise<any> {
|
|
3173
|
+
try {
|
|
3174
|
+
let newOrderPackages = []
|
|
3175
|
+
let newOrderConsignments: OrderConsignment = []
|
|
3176
|
+
|
|
3177
|
+
for (const orderCons of orderConsList) {
|
|
3178
|
+
const savedOrderConsignment = await createOrderConsignment(tx, orderCons, releaseGood, user)
|
|
3179
|
+
|
|
3180
|
+
for (const currentPackage of orderCons.orderPackages) {
|
|
3181
|
+
const savedOrderPackage = await createConsignmentPackage(
|
|
3182
|
+
tx,
|
|
3183
|
+
currentPackage,
|
|
3184
|
+
releaseGood,
|
|
3185
|
+
user,
|
|
3186
|
+
savedOrderConsignment
|
|
3187
|
+
)
|
|
3188
|
+
const orderPackageItems = await createConsignmentPackageItem(
|
|
3189
|
+
tx,
|
|
3190
|
+
currentPackage.orderPackageItems,
|
|
3191
|
+
savedOrderPackage,
|
|
3192
|
+
releaseGood
|
|
3193
|
+
)
|
|
3194
|
+
|
|
3195
|
+
savedOrderPackage.orderPackageItems = orderPackageItems
|
|
3196
|
+
savedOrderConsignment.orderPackages.push(savedOrderPackage)
|
|
3197
|
+
newOrderPackages.push(savedOrderPackage)
|
|
3198
|
+
}
|
|
3199
|
+
newOrderConsignments.push(savedOrderConsignment)
|
|
3200
|
+
}
|
|
3201
|
+
|
|
3202
|
+
releaseGood.orderConsignments = newOrderConsignments
|
|
3203
|
+
releaseGood.orderPackages = newOrderPackages
|
|
3204
|
+
|
|
3205
|
+
return releaseGood
|
|
3206
|
+
} catch (error) {
|
|
3207
|
+
console.error('Error creating consignment with multiple packages:', error)
|
|
3208
|
+
throw error
|
|
3209
|
+
}
|
|
3210
|
+
}
|
|
3211
|
+
|
|
3212
|
+
export async function sortingProduct(orderProducts): Promise<any> {
|
|
3213
|
+
try {
|
|
3214
|
+
orderProducts.sort((a, b) => {
|
|
3215
|
+
if (a.product.packingType !== b.product.packingType) {
|
|
3216
|
+
return a.product.packingType < b.product.packingType ? -1 : 1
|
|
3217
|
+
}
|
|
3218
|
+
if (a.product.sku !== b.product.sku) {
|
|
3219
|
+
return a.product.sku < b.product.sku ? -1 : 1
|
|
3220
|
+
}
|
|
3221
|
+
return 0
|
|
3222
|
+
})
|
|
3223
|
+
return orderProducts
|
|
3224
|
+
} catch (e) {
|
|
3225
|
+
logger.error(`[lmd-sort-product]: ${e} `)
|
|
3226
|
+
}
|
|
2765
3227
|
}
|