@things-factory/sales-base 4.3.523 → 4.3.524
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/ecommerce/powrup-controller.js +341 -33
- package/dist-server/controllers/ecommerce/powrup-controller.js.map +1 -1
- package/dist-server/controllers/ecommerce/webspert-controller.js +7 -21
- package/dist-server/controllers/ecommerce/webspert-controller.js.map +1 -1
- package/dist-server/service/order-consignment/order-consignment.js +25 -6
- package/dist-server/service/order-consignment/order-consignment.js.map +1 -1
- package/dist-server/service/order-package/order-package.js.map +1 -1
- package/dist-server/service/release-good/release-good.js +5 -0
- package/dist-server/service/release-good/release-good.js.map +1 -1
- package/dist-server/utils/order-no-generator.js +3 -0
- package/dist-server/utils/order-no-generator.js.map +1 -1
- package/package.json +15 -15
- package/server/controllers/ecommerce/powrup-controller.ts +407 -36
- package/server/controllers/ecommerce/webspert-controller.ts +40 -35
- package/server/service/order-consignment/order-consignment.ts +22 -4
- package/server/service/order-package/order-package.ts +1 -1
- package/server/service/release-good/release-good.ts +5 -0
- package/server/utils/order-no-generator.ts +4 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { EntityManager, getConnection, getRepository } from 'typeorm'
|
|
2
|
-
|
|
2
|
+
import { v4 as uuidv4 } from 'uuid'
|
|
3
3
|
import { Bizplace } from '@things-factory/biz-base'
|
|
4
4
|
import { logger } from '@things-factory/env'
|
|
5
5
|
import { Platform, Powrup, PowrupAPI } from '@things-factory/integration-powrup'
|
|
@@ -14,6 +14,7 @@ import { OrderProduct } from '../../service/order-product/order-product'
|
|
|
14
14
|
import { ReleaseGood } from '../../service/release-good/release-good'
|
|
15
15
|
import { OrderNoGenerator } from '../../utils'
|
|
16
16
|
import { DateTimeDifference } from '../../utils/datetime-util'
|
|
17
|
+
import { OrderConsignment } from '../../service/order-consignment/order-consignment'
|
|
17
18
|
|
|
18
19
|
const { PerformanceObserver, performance } = require('node:perf_hooks')
|
|
19
20
|
|
|
@@ -35,9 +36,7 @@ export class PowrupController {
|
|
|
35
36
|
|
|
36
37
|
try {
|
|
37
38
|
const orderProducts: OrderProduct[] = releaseGood.orderProducts
|
|
38
|
-
const orderInformation: any = {
|
|
39
|
-
refOrderId: releaseGood.refOrderId
|
|
40
|
-
}
|
|
39
|
+
const orderInformation: any = { refOrderId: releaseGood.refOrderId }
|
|
41
40
|
|
|
42
41
|
if (
|
|
43
42
|
releaseGood?.lastMarketPackCall &&
|
|
@@ -56,47 +55,57 @@ export class PowrupController {
|
|
|
56
55
|
context: { state: { domain: domain || null, user: user || null } }
|
|
57
56
|
})
|
|
58
57
|
performance.mark(`end:${releaseGood.refOrderId}`)
|
|
58
|
+
|
|
59
59
|
if (orderPack?.packages) {
|
|
60
60
|
const packages: any[] = orderPack.packages
|
|
61
|
-
|
|
62
61
|
await Promise.all(
|
|
63
62
|
packages.map(async pkg => {
|
|
64
63
|
const items = pkg.items
|
|
65
|
-
const orderPackage: any = {
|
|
66
|
-
name: OrderNoGenerator.orderPackage(),
|
|
67
|
-
packageId: pkg.packageId,
|
|
68
|
-
status: ORDER_STATUS.PROCESSING,
|
|
69
|
-
releaseGood,
|
|
70
|
-
domain: releaseGood.domain,
|
|
71
|
-
bizplace: releaseGood.bizplace,
|
|
72
|
-
creator: releaseGood.creator,
|
|
73
|
-
updater: releaseGood.updater
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
let savedOrderPackage: OrderPackage = await trxMgr.getRepository(OrderPackage).save(orderPackage)
|
|
77
64
|
|
|
78
|
-
const
|
|
79
|
-
const { refCode, qty } = itm
|
|
80
|
-
if (!refCode) {
|
|
81
|
-
throw new Error(`universalIdentifier missing`)
|
|
82
|
-
}
|
|
83
|
-
const matchedOrderProduct: OrderProduct = orderProducts.find(op => op.productDetail.refCode == refCode)
|
|
65
|
+
const isMps = releaseGood?.lastMileDelivery?.mps
|
|
84
66
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
67
|
+
if (isMps) {
|
|
68
|
+
let newReleaseGood = await splitOrderConsignment(trxMgr, releaseGood, items, user)
|
|
69
|
+
await updatePackageId(packages, releaseGood, trxMgr)
|
|
70
|
+
} else {
|
|
71
|
+
let orderConsignment = await createOrderConsignment(trxMgr, releaseGood, user)
|
|
72
|
+
const orderPackage: any = {
|
|
73
|
+
name: OrderNoGenerator.orderPackage(),
|
|
74
|
+
packageId: pkg.packageId,
|
|
88
75
|
status: ORDER_STATUS.PROCESSING,
|
|
89
|
-
|
|
90
|
-
|
|
76
|
+
releaseGood,
|
|
77
|
+
orderConsignment,
|
|
91
78
|
domain: releaseGood.domain,
|
|
92
79
|
bizplace: releaseGood.bizplace,
|
|
93
80
|
creator: releaseGood.creator,
|
|
94
|
-
updater: releaseGood.updater
|
|
95
|
-
productDetail: matchedOrderProduct?.productDetail
|
|
81
|
+
updater: releaseGood.updater
|
|
96
82
|
}
|
|
97
|
-
})
|
|
98
83
|
|
|
99
|
-
|
|
84
|
+
let savedOrderPackage: OrderPackage = await trxMgr.getRepository(OrderPackage).save(orderPackage)
|
|
85
|
+
|
|
86
|
+
const orderPackageItems: OrderPackageItem[] = items.map(itm => {
|
|
87
|
+
const { refCode, qty } = itm
|
|
88
|
+
if (!refCode) {
|
|
89
|
+
throw new Error(`universalIdentifier missing`)
|
|
90
|
+
}
|
|
91
|
+
const matchedOrderProduct: OrderProduct = orderProducts.find(op => op.productDetail.refCode == refCode)
|
|
92
|
+
|
|
93
|
+
return {
|
|
94
|
+
name: OrderNoGenerator.orderPackageItem(),
|
|
95
|
+
orderProduct: matchedOrderProduct,
|
|
96
|
+
status: ORDER_STATUS.PROCESSING,
|
|
97
|
+
releaseQty: qty,
|
|
98
|
+
orderPackage: savedOrderPackage,
|
|
99
|
+
domain: releaseGood.domain,
|
|
100
|
+
bizplace: releaseGood.bizplace,
|
|
101
|
+
creator: releaseGood.creator,
|
|
102
|
+
updater: releaseGood.updater,
|
|
103
|
+
productDetail: matchedOrderProduct?.productDetail
|
|
104
|
+
}
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
await trxMgr.getRepository(OrderPackageItem).save(orderPackageItems)
|
|
108
|
+
}
|
|
100
109
|
})
|
|
101
110
|
)
|
|
102
111
|
|
|
@@ -230,8 +239,9 @@ export class PowrupController {
|
|
|
230
239
|
}
|
|
231
240
|
|
|
232
241
|
try {
|
|
233
|
-
let orderPackages: OrderPackage[] = await (
|
|
234
|
-
|
|
242
|
+
let orderPackages: OrderPackage[] = await (
|
|
243
|
+
trxMgr?.getRepository(OrderPackage) || getRepository(OrderPackage)
|
|
244
|
+
).find({ where: { releaseGood } })
|
|
235
245
|
|
|
236
246
|
if (orderPackages?.length) {
|
|
237
247
|
await Promise.all(
|
|
@@ -270,7 +280,10 @@ export class PowrupController {
|
|
|
270
280
|
updater: user
|
|
271
281
|
}
|
|
272
282
|
|
|
273
|
-
await (trxMgr?.getRepository(OrderPackage) || getRepository(OrderPackage)).update(
|
|
283
|
+
await (trxMgr?.getRepository(OrderPackage) || getRepository(OrderPackage)).update(
|
|
284
|
+
{ id: op.id },
|
|
285
|
+
{ ...updateInfo }
|
|
286
|
+
)
|
|
274
287
|
}
|
|
275
288
|
} catch (error) {
|
|
276
289
|
performance.mark(`end:${releaseGood.refOrderId} - ${op.packageId}`)
|
|
@@ -285,7 +298,9 @@ export class PowrupController {
|
|
|
285
298
|
})
|
|
286
299
|
)
|
|
287
300
|
|
|
288
|
-
releaseGood = await (trxMgr?.getRepository(ReleaseGood) || getRepository(ReleaseGood)).findOne({
|
|
301
|
+
releaseGood = await (trxMgr?.getRepository(ReleaseGood) || getRepository(ReleaseGood)).findOne({
|
|
302
|
+
id: releaseGood.id
|
|
303
|
+
})
|
|
289
304
|
}
|
|
290
305
|
|
|
291
306
|
return releaseGood
|
|
@@ -369,3 +384,359 @@ export class PowrupController {
|
|
|
369
384
|
}
|
|
370
385
|
}
|
|
371
386
|
}
|
|
387
|
+
|
|
388
|
+
export async function createOrderConsignment(
|
|
389
|
+
tx: EntityManager,
|
|
390
|
+
releaseGood: ReleaseGood,
|
|
391
|
+
user?: User,
|
|
392
|
+
orderCons?: OrderConsignment
|
|
393
|
+
): Promise<OrderConsignment> {
|
|
394
|
+
try {
|
|
395
|
+
const orderConsignment: OrderConsignment = {
|
|
396
|
+
id: uuidv4(),
|
|
397
|
+
name: OrderNoGenerator.orderConsignment(),
|
|
398
|
+
noOfPackages: orderCons?.orderPackages?.length ? orderCons.orderPackages.length : 1,
|
|
399
|
+
domain: releaseGood.domain,
|
|
400
|
+
bizplace: releaseGood.bizplace,
|
|
401
|
+
releaseGood: releaseGood,
|
|
402
|
+
orderPackages: [],
|
|
403
|
+
creator: user,
|
|
404
|
+
updater: user
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
return tx.getRepository(OrderConsignment).save(orderConsignment)
|
|
408
|
+
} catch (e) {
|
|
409
|
+
logger.error(`[lmd-create-order-consignment]: ${e} `)
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
export async function sortingProduct(items, releaseGood): Promise<any> {
|
|
414
|
+
try {
|
|
415
|
+
let orderProducts: OrderProduct[] = releaseGood.orderProducts
|
|
416
|
+
|
|
417
|
+
const sortedMatchedOrderProducts = items
|
|
418
|
+
.map(itm => {
|
|
419
|
+
const { refCode, qty } = itm
|
|
420
|
+
if (!refCode) {
|
|
421
|
+
throw new Error(`universalIdentifier missing`)
|
|
422
|
+
}
|
|
423
|
+
// Find matched order product for each item
|
|
424
|
+
return orderProducts.find(op => op.productDetail.refCode === refCode) || null
|
|
425
|
+
})
|
|
426
|
+
.filter(item => item) // Filter out any null values
|
|
427
|
+
.sort((a, b) => {
|
|
428
|
+
if (a.product.packingType !== b.product.packingType) {
|
|
429
|
+
return a.product.packingType < b.product.packingType ? -1 : 1
|
|
430
|
+
}
|
|
431
|
+
if (a.product.sku !== b.product.sku) {
|
|
432
|
+
return a.product.sku < b.product.sku ? -1 : 1
|
|
433
|
+
}
|
|
434
|
+
return 0
|
|
435
|
+
})
|
|
436
|
+
|
|
437
|
+
return sortedMatchedOrderProducts
|
|
438
|
+
} catch (e) {
|
|
439
|
+
logger.error(`[lmd-sort-product]: ${e} `)
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
export async function splitOrderConsignment(
|
|
444
|
+
tx: EntityManager,
|
|
445
|
+
releaseGood: ReleaseGood,
|
|
446
|
+
items: any,
|
|
447
|
+
user: User
|
|
448
|
+
): Promise<any> {
|
|
449
|
+
try {
|
|
450
|
+
let currentConsignment = { id: uuidv4(), totalWeight: 0, orderPackages: [] }
|
|
451
|
+
let totalConsignments = []
|
|
452
|
+
let currOrderProducts = []
|
|
453
|
+
let totalConsignmentWeight = 0
|
|
454
|
+
|
|
455
|
+
let orderProducts = releaseGood.orderProducts
|
|
456
|
+
let maxConsignmentWeight = releaseGood.lastMileDelivery.consignmentWeight
|
|
457
|
+
|
|
458
|
+
//sort items from packOrder API
|
|
459
|
+
let sortItems = await sortingProduct(items, releaseGood)
|
|
460
|
+
|
|
461
|
+
//initialise new orderConsignment created
|
|
462
|
+
const createdNewConsignment = () => ({
|
|
463
|
+
id: uuidv4(),
|
|
464
|
+
totalWeight: 0,
|
|
465
|
+
orderPackages: []
|
|
466
|
+
})
|
|
467
|
+
|
|
468
|
+
//push orderPackage & packageItems into consigment
|
|
469
|
+
const createPackageConsignment = (consignment, packageWeight, releaseGood, orderProduct, releaseQty, user) => {
|
|
470
|
+
consignment.totalWeight += packageWeight
|
|
471
|
+
|
|
472
|
+
currentConsignment.orderPackages.push({
|
|
473
|
+
id: uuidv4(),
|
|
474
|
+
name: OrderNoGenerator.orderPackage(),
|
|
475
|
+
packageId: null,
|
|
476
|
+
trackingNo: null,
|
|
477
|
+
transporter: null,
|
|
478
|
+
airwayBill: releaseGood?.airwayBill,
|
|
479
|
+
invoice: releaseGood?.invoice,
|
|
480
|
+
status: ORDER_STATUS.PROCESSING,
|
|
481
|
+
releaseGood,
|
|
482
|
+
domain: releaseGood.domain,
|
|
483
|
+
bizplace: releaseGood.bizplace,
|
|
484
|
+
creator: user,
|
|
485
|
+
updater: user,
|
|
486
|
+
orderPackageItems: [
|
|
487
|
+
{
|
|
488
|
+
id: uuidv4(),
|
|
489
|
+
name: OrderNoGenerator.orderPackageItem(),
|
|
490
|
+
releaseQty: releaseQty,
|
|
491
|
+
orderProduct: orderProduct,
|
|
492
|
+
domain: releaseGood.domain,
|
|
493
|
+
bizplace: releaseGood.bizplace,
|
|
494
|
+
creator: releaseGood.creator,
|
|
495
|
+
updater: releaseGood.updater,
|
|
496
|
+
productDetail: orderProduct.productDetail
|
|
497
|
+
}
|
|
498
|
+
]
|
|
499
|
+
})
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
const createPackage = op => {
|
|
503
|
+
let releaseQty = op.productDetail.packingType.toLowerCase() === 'carton' ? 1 : op.releaseQty
|
|
504
|
+
let packageWeight =
|
|
505
|
+
op.productDetail.packingType.toLowerCase() === 'carton'
|
|
506
|
+
? op.productDetail.grossWeight
|
|
507
|
+
: op.productDetail.grossWeight * releaseQty
|
|
508
|
+
|
|
509
|
+
const isCarton = op.productDetail.packingType.toLowerCase() === 'carton'
|
|
510
|
+
totalConsignmentWeight += packageWeight
|
|
511
|
+
const requiresNewConsignment = totalConsignmentWeight + packageWeight >= maxConsignmentWeight
|
|
512
|
+
|
|
513
|
+
if (isCarton || op.releaseQty > 1) {
|
|
514
|
+
if (requiresNewConsignment) {
|
|
515
|
+
//push the current consignment to create new consignment
|
|
516
|
+
totalConsignments.push(currentConsignment)
|
|
517
|
+
|
|
518
|
+
//Initialise the totalConsignment weight to the new data
|
|
519
|
+
totalConsignmentWeight = packageWeight + 0
|
|
520
|
+
currentConsignment = createdNewConsignment()
|
|
521
|
+
}
|
|
522
|
+
createPackageConsignment(currentConsignment, packageWeight, releaseGood, op, releaseQty, user)
|
|
523
|
+
} else {
|
|
524
|
+
currOrderProducts.push(op)
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
sortItems.forEach(item => {
|
|
529
|
+
let productDetail: ProductDetail = item.productDetail
|
|
530
|
+
if (productDetail.packingType.toLowerCase() === 'carton') {
|
|
531
|
+
for (let i = 0; i < item.releaseQty; i++) {
|
|
532
|
+
createPackage(item)
|
|
533
|
+
}
|
|
534
|
+
} else {
|
|
535
|
+
createPackage(item)
|
|
536
|
+
}
|
|
537
|
+
})
|
|
538
|
+
|
|
539
|
+
// Add any remaining items to the last orderPackage
|
|
540
|
+
if (currOrderProducts.length > 0) {
|
|
541
|
+
let availableConsignment
|
|
542
|
+
|
|
543
|
+
for (let i = 0; i < currOrderProducts.length; i++) {
|
|
544
|
+
let op = currOrderProducts[i]
|
|
545
|
+
let releaseQty = op.releaseQty
|
|
546
|
+
let currProductWeight = op.productDetail.grossWeight * op.releaseQty
|
|
547
|
+
let lastOrderPackage = currentConsignment.orderPackages[currentConsignment.orderPackages.length - 1]
|
|
548
|
+
|
|
549
|
+
//push the product into last current consignment orderPackage
|
|
550
|
+
if (currentConsignment.totalWeight + currProductWeight < maxConsignmentWeight) {
|
|
551
|
+
if (lastOrderPackage) {
|
|
552
|
+
lastOrderPackage.orderPackageItems.push({
|
|
553
|
+
id: uuidv4(),
|
|
554
|
+
name: OrderNoGenerator.orderPackageItem(),
|
|
555
|
+
releaseQty: op.releaseQty,
|
|
556
|
+
orderProducts: op,
|
|
557
|
+
domain: releaseGood.domain,
|
|
558
|
+
bizplace: releaseGood.bizplace,
|
|
559
|
+
creator: releaseGood.creator,
|
|
560
|
+
updater: releaseGood.updater,
|
|
561
|
+
productDetail: op.productDetail
|
|
562
|
+
})
|
|
563
|
+
} else {
|
|
564
|
+
await createPackageConsignment(currentConsignment, currProductWeight, releaseGood, op, releaseQty, user)
|
|
565
|
+
}
|
|
566
|
+
} else {
|
|
567
|
+
//push the currentConsignment into list of all the consignments
|
|
568
|
+
if (!totalConsignments.some(tc => tc.id === currentConsignment.id)) {
|
|
569
|
+
totalConsignments.push(currentConsignment)
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
//find one order consignment to include the product
|
|
573
|
+
availableConsignment = totalConsignments.find(tc => {
|
|
574
|
+
tc.totalWeight += currProductWeight < maxConsignmentWeight
|
|
575
|
+
})
|
|
576
|
+
|
|
577
|
+
if (availableConsignment) {
|
|
578
|
+
let lastOrderPackage = availableConsignment.orderPackages[currentConsignment.orderPackages.length - 1]
|
|
579
|
+
lastOrderPackage.orderPackageItems.push({
|
|
580
|
+
id: uuidv4(),
|
|
581
|
+
name: OrderNoGenerator.orderPackageItem(),
|
|
582
|
+
releaseQty: op.releaseQty,
|
|
583
|
+
orderProduct: op,
|
|
584
|
+
domain: releaseGood.domain,
|
|
585
|
+
bizplace: releaseGood.bizplace,
|
|
586
|
+
creator: releaseGood.creator,
|
|
587
|
+
updater: releaseGood.updater,
|
|
588
|
+
productDetail: op.productDetail
|
|
589
|
+
})
|
|
590
|
+
|
|
591
|
+
//update the totalConsignment data
|
|
592
|
+
totalConsignments = totalConsignments.map(tc => {
|
|
593
|
+
tc.id === availableConsignment.id ? availableConsignment : tc
|
|
594
|
+
})
|
|
595
|
+
} else {
|
|
596
|
+
//create new consignment if no consignment available
|
|
597
|
+
currentConsignment = createdNewConsignment()
|
|
598
|
+
createPackageConsignment(currentConsignment, currProductWeight, releaseGood, op, releaseQty, user)
|
|
599
|
+
|
|
600
|
+
totalConsignments.push(currentConsignment)
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
const existingConsignment = totalConsignments.find(tc => tc.id === currentConsignment.id)
|
|
607
|
+
|
|
608
|
+
if (!existingConsignment) {
|
|
609
|
+
totalConsignments.push(currentConsignment)
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
let orderConsignment = totalConsignments
|
|
613
|
+
let newReleaseGood = await createConsignmentWithMultipackage(tx, orderConsignment, releaseGood, user)
|
|
614
|
+
|
|
615
|
+
return newReleaseGood
|
|
616
|
+
} catch (e) {
|
|
617
|
+
logger.error(e)
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
export async function createConsignmentWithMultipackage(
|
|
622
|
+
tx: EntityManager,
|
|
623
|
+
orderConsList: OrderConsignment[],
|
|
624
|
+
releaseGood: ReleaseGood,
|
|
625
|
+
user: User
|
|
626
|
+
): Promise<any> {
|
|
627
|
+
try {
|
|
628
|
+
let newOrderPackages = []
|
|
629
|
+
let newOrderConsignments: OrderConsignment[] = []
|
|
630
|
+
|
|
631
|
+
for (const orderCons of orderConsList) {
|
|
632
|
+
const savedOrderConsignment = await createOrderConsignment(tx, releaseGood, user, orderCons)
|
|
633
|
+
|
|
634
|
+
for (const currentPackage of orderCons.orderPackages) {
|
|
635
|
+
const savedOrderPackage = await createConsignmentPackage(
|
|
636
|
+
tx,
|
|
637
|
+
currentPackage,
|
|
638
|
+
releaseGood,
|
|
639
|
+
user,
|
|
640
|
+
savedOrderConsignment
|
|
641
|
+
)
|
|
642
|
+
const orderPackageItems = await createConsignmentPackageItem(
|
|
643
|
+
tx,
|
|
644
|
+
currentPackage.orderPackageItems,
|
|
645
|
+
savedOrderPackage,
|
|
646
|
+
releaseGood
|
|
647
|
+
)
|
|
648
|
+
|
|
649
|
+
savedOrderPackage.orderPackageItems = orderPackageItems
|
|
650
|
+
savedOrderConsignment.orderPackages.push(savedOrderPackage)
|
|
651
|
+
newOrderPackages.push(savedOrderPackage)
|
|
652
|
+
}
|
|
653
|
+
newOrderConsignments.push(savedOrderConsignment)
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
releaseGood.orderConsignments = newOrderConsignments
|
|
657
|
+
releaseGood.orderPackages = newOrderPackages
|
|
658
|
+
|
|
659
|
+
return releaseGood
|
|
660
|
+
} catch (error) {
|
|
661
|
+
console.error('Error creating consignment with multiple packages:', error)
|
|
662
|
+
throw error
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
export async function createConsignmentPackage(
|
|
667
|
+
tx: EntityManager,
|
|
668
|
+
orderPackageData: any,
|
|
669
|
+
releaseGood: ReleaseGood,
|
|
670
|
+
user: User,
|
|
671
|
+
orderConsignment: OrderConsignment
|
|
672
|
+
): Promise<OrderPackage> {
|
|
673
|
+
try {
|
|
674
|
+
const orderPackage: any = {
|
|
675
|
+
id: uuidv4(),
|
|
676
|
+
name: OrderNoGenerator.orderPackage(),
|
|
677
|
+
packageId: null,
|
|
678
|
+
trackingNo: null,
|
|
679
|
+
transporter: null,
|
|
680
|
+
airwayBill: releaseGood?.airwayBill,
|
|
681
|
+
invoice: releaseGood?.invoice,
|
|
682
|
+
status: ORDER_STATUS.PROCESSING,
|
|
683
|
+
releaseGood,
|
|
684
|
+
domain: releaseGood.domain,
|
|
685
|
+
bizplace: releaseGood.bizplace,
|
|
686
|
+
creator: user,
|
|
687
|
+
updater: user,
|
|
688
|
+
orderConsignment
|
|
689
|
+
}
|
|
690
|
+
return tx.getRepository(OrderPackage).save(orderPackage)
|
|
691
|
+
} catch (e) {
|
|
692
|
+
logger.error(`[lmd-create-order-package]: ${e} `)
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
export async function createConsignmentPackageItem(
|
|
697
|
+
tx: EntityManager,
|
|
698
|
+
orderPackageItemsData: any[],
|
|
699
|
+
savedOrderPackage: OrderPackage,
|
|
700
|
+
releaseGood: ReleaseGood
|
|
701
|
+
): Promise<OrderPackageItem[]> {
|
|
702
|
+
try {
|
|
703
|
+
const orderPackageItems = orderPackageItemsData.map(opi => ({
|
|
704
|
+
id: opi.id,
|
|
705
|
+
name: opi.name,
|
|
706
|
+
orderProduct: opi.orderProduct,
|
|
707
|
+
status: ORDER_STATUS.PROCESSING,
|
|
708
|
+
releaseQty: opi.releaseQty,
|
|
709
|
+
orderPackage: savedOrderPackage,
|
|
710
|
+
domain: releaseGood.domain,
|
|
711
|
+
bizplace: releaseGood.bizplace,
|
|
712
|
+
creator: releaseGood.creator,
|
|
713
|
+
updater: releaseGood.updater,
|
|
714
|
+
productDetail: opi.productDetail
|
|
715
|
+
}))
|
|
716
|
+
|
|
717
|
+
let savedOrderPackageItems: OrderPackageItem[] = await tx.getRepository(OrderPackageItem).save(orderPackageItems)
|
|
718
|
+
|
|
719
|
+
return savedOrderPackageItems
|
|
720
|
+
} catch (e) {
|
|
721
|
+
logger.error(`[lmd-create-order-package]: ${e} `)
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
export async function updatePackageId(packages, releaseGood, trxMgr) {
|
|
726
|
+
try {
|
|
727
|
+
const orderPackage = await trxMgr.getRepository(OrderPackage).findOne({
|
|
728
|
+
where: { releaseGood: { id: releaseGood.id } },
|
|
729
|
+
relations: ['releaseGood']
|
|
730
|
+
})
|
|
731
|
+
if (orderPackage) {
|
|
732
|
+
await trxMgr.getRepository(OrderPackage).update(
|
|
733
|
+
{ name: orderPackage.name },
|
|
734
|
+
{
|
|
735
|
+
packageId: packages[0].packageId
|
|
736
|
+
}
|
|
737
|
+
)
|
|
738
|
+
}
|
|
739
|
+
} catch (e) {
|
|
740
|
+
logger.error('unable-to-update-package-id-powrup')
|
|
741
|
+
}
|
|
742
|
+
}
|
|
@@ -2,22 +2,29 @@ import { EntityManager, getConnection, getRepository } from 'typeorm'
|
|
|
2
2
|
|
|
3
3
|
import { logger } from '@things-factory/env'
|
|
4
4
|
import { Domain, User } from '@things-factory/shell'
|
|
5
|
-
import {
|
|
5
|
+
import { config } from '@things-factory/env'
|
|
6
|
+
|
|
6
7
|
import { WebspertController as BaseWebspertController } from '@things-factory/warehouse-base'
|
|
7
8
|
|
|
8
9
|
import { ORDER_STATUS } from '../../constants'
|
|
9
|
-
import {
|
|
10
|
+
import { ReleaseGood, OrderProduct, OrderPackageItem, OrderPackage } from '../../service'
|
|
11
|
+
|
|
12
|
+
import { sleep } from '@things-factory/utils'
|
|
10
13
|
import { OrderNoGenerator } from '../../utils'
|
|
11
14
|
|
|
12
15
|
export class WebspertController {
|
|
13
|
-
public static async packOrder(
|
|
16
|
+
public static async packOrder(
|
|
17
|
+
releaseGood: ReleaseGood,
|
|
18
|
+
domain: Domain,
|
|
19
|
+
user: User
|
|
20
|
+
) {
|
|
14
21
|
await getConnection().transaction(async trx => {
|
|
15
22
|
releaseGood = await trx.getRepository(ReleaseGood).findOne({ where: { id: releaseGood.id, domain } })
|
|
16
23
|
|
|
17
24
|
// let releaseOrder = await trx.getRepository(ReleaseGood).findOne({ refNo: releaseGood.refNo, refNo2: releaseGood.refNo2, refNo3: releaseGood.refNo3, domain })
|
|
18
25
|
|
|
19
26
|
// // only recall if releaseGood exists and pack Order fail
|
|
20
|
-
if (!releaseGood &&
|
|
27
|
+
if (!releaseGood && (releaseGood.packOrderFail == false)) return false
|
|
21
28
|
|
|
22
29
|
try {
|
|
23
30
|
let results = await BaseWebspertController.sendRequestToAPI(
|
|
@@ -44,22 +51,20 @@ export class WebspertController {
|
|
|
44
51
|
})
|
|
45
52
|
}
|
|
46
53
|
|
|
47
|
-
public static async fetchPackageAndDocument(
|
|
54
|
+
public static async fetchPackageAndDocument(
|
|
55
|
+
releaseGood: ReleaseGood,
|
|
56
|
+
domain: Domain,
|
|
57
|
+
user: User
|
|
58
|
+
) {
|
|
48
59
|
await getConnection().transaction(async trx => {
|
|
49
60
|
let roUpdateFields: Partial<ReleaseGood> = null
|
|
50
61
|
|
|
51
62
|
let releaseOrder = await trx.getRepository(ReleaseGood).findOne({
|
|
52
63
|
where: { id: releaseGood.id, domain },
|
|
53
|
-
relations: [
|
|
54
|
-
'bizplace',
|
|
55
|
-
'domain',
|
|
56
|
-
'orderProducts',
|
|
57
|
-
'orderProducts.productDetail',
|
|
58
|
-
'orderProducts.productDetail.product'
|
|
59
|
-
]
|
|
64
|
+
relations: ['bizplace', 'domain', 'orderProducts', 'orderProducts.productDetail', 'orderProducts.productDetail.product']
|
|
60
65
|
})
|
|
61
66
|
|
|
62
|
-
if (releaseOrder
|
|
67
|
+
if (releaseOrder) {
|
|
63
68
|
try {
|
|
64
69
|
// capture update fields
|
|
65
70
|
roUpdateFields = {
|
|
@@ -98,12 +103,13 @@ export class WebspertController {
|
|
|
98
103
|
releaseGood: ReleaseGood,
|
|
99
104
|
orderPackages: OrderPackage[],
|
|
100
105
|
domain: Domain,
|
|
101
|
-
user: User
|
|
106
|
+
user: User,
|
|
102
107
|
) {
|
|
103
108
|
if (orderPackages == null || orderPackages.length == 0) {
|
|
104
109
|
if (releaseGood) {
|
|
105
110
|
orderPackages = await getRepository(OrderPackage).find({ where: { releaseGood } })
|
|
106
|
-
}
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
107
113
|
console.error('webspert-controller[initiateShipment]: releaseGood is not found')
|
|
108
114
|
return false
|
|
109
115
|
}
|
|
@@ -137,13 +143,18 @@ export class WebspertController {
|
|
|
137
143
|
})
|
|
138
144
|
}
|
|
139
145
|
|
|
140
|
-
public static async triggerOrderProcesses(
|
|
146
|
+
public static async triggerOrderProcesses(
|
|
147
|
+
releaseGood: ReleaseGood,
|
|
148
|
+
domain: Domain,
|
|
149
|
+
user: User,
|
|
150
|
+
triggerRTS: false
|
|
151
|
+
) {
|
|
141
152
|
try {
|
|
142
153
|
const waitTime = 200
|
|
143
154
|
|
|
144
155
|
releaseGood = await getRepository(ReleaseGood).findOne({ where: { id: releaseGood.id, domain } })
|
|
145
156
|
// // only recall if fail
|
|
146
|
-
if (
|
|
157
|
+
if (releaseGood.packOrderFail == false || releaseGood.packOrderFail === null) {
|
|
147
158
|
await this.packOrder(releaseGood, domain, user)
|
|
148
159
|
await sleep(waitTime)
|
|
149
160
|
}
|
|
@@ -156,6 +167,7 @@ export class WebspertController {
|
|
|
156
167
|
}
|
|
157
168
|
|
|
158
169
|
return true
|
|
170
|
+
|
|
159
171
|
} catch (error) {
|
|
160
172
|
logger.error(error)
|
|
161
173
|
}
|
|
@@ -168,17 +180,16 @@ async function updateRO(releaseGoodId, roUpdateFields, trxMgr) {
|
|
|
168
180
|
}
|
|
169
181
|
}
|
|
170
182
|
|
|
171
|
-
async function generatePackage(
|
|
183
|
+
async function generatePackage(
|
|
184
|
+
releaseGood: ReleaseGood,
|
|
185
|
+
packages: any[],
|
|
186
|
+
user: User,
|
|
187
|
+
trxMgr: EntityManager
|
|
188
|
+
) {
|
|
172
189
|
if (packages.length > 0) {
|
|
173
190
|
packages = await Promise.all(
|
|
174
191
|
packages.map(async pkg => {
|
|
175
|
-
const [items, awbUrl, packageId, trackingNo, transporter] = [
|
|
176
|
-
pkg.products,
|
|
177
|
-
pkg.awb_link,
|
|
178
|
-
pkg.package_id,
|
|
179
|
-
pkg.tracking_number,
|
|
180
|
-
pkg.transporter
|
|
181
|
-
]
|
|
192
|
+
const [items, awbUrl, packageId, trackingNo, transporter] = [pkg.products, pkg.awb_link, pkg.package_id, pkg.tracking_number, pkg.transporter]
|
|
182
193
|
|
|
183
194
|
if (items.length < 1) {
|
|
184
195
|
throw new Error('No items found in package')
|
|
@@ -224,16 +235,12 @@ async function generatePackage(releaseGood: ReleaseGood, packages: any[], user:
|
|
|
224
235
|
if (!sku) {
|
|
225
236
|
throw new Error(`universalIdentifier missing`)
|
|
226
237
|
}
|
|
227
|
-
const matchedOrderPackageItem: OrderPackageItem = orderPackageItems.find(
|
|
228
|
-
op => op.productDetail.product.sku == sku && op.releaseQty == qty
|
|
229
|
-
)
|
|
238
|
+
const matchedOrderPackageItem: OrderPackageItem = orderPackageItems.find(op => op.productDetail.product.sku == sku && op.releaseQty == qty)
|
|
230
239
|
|
|
231
240
|
if (matchedOrderPackageItem) {
|
|
232
241
|
return matchedOrderPackageItem
|
|
233
242
|
} else {
|
|
234
|
-
const matchedOrderProduct: OrderProduct = releaseGood.orderProducts.find(
|
|
235
|
-
op => op.productDetail.product.sku == sku
|
|
236
|
-
)
|
|
243
|
+
const matchedOrderProduct: OrderProduct = releaseGood.orderProducts.find(op => op.productDetail.product.sku == sku)
|
|
237
244
|
return {
|
|
238
245
|
name: OrderNoGenerator.orderPackageItem(),
|
|
239
246
|
orderProduct: matchedOrderProduct,
|
|
@@ -275,8 +282,6 @@ async function generatePackage(releaseGood: ReleaseGood, packages: any[], user:
|
|
|
275
282
|
}
|
|
276
283
|
|
|
277
284
|
async function updatePackOrderStatus(trx, releaseOrder, status: Boolean = false) {
|
|
278
|
-
await trx
|
|
279
|
-
.getRepository(ReleaseGood)
|
|
280
|
-
.update({ id: releaseOrder.id }, { lastMarketPackCall: new Date(), packOrderFail: status })
|
|
285
|
+
await trx.getRepository(ReleaseGood).update({ id: releaseOrder.id }, { lastMarketPackCall: new Date(), packOrderFail: status })
|
|
281
286
|
return true
|
|
282
|
-
}
|
|
287
|
+
}
|