@things-factory/worksheet-base 4.3.384 → 4.3.388
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/ecommerce-controller.js +4 -2
- package/dist-server/controllers/ecommerce/ecommerce-controller.js.map +1 -1
- package/dist-server/controllers/ecommerce/sellercraft-controller.js +2 -1
- package/dist-server/controllers/ecommerce/sellercraft-controller.js.map +1 -1
- package/dist-server/controllers/outbound/packing-worksheet-controller.js +12 -3
- package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
- package/dist-server/entities/active-worksheet-picking-view.js +20 -9
- package/dist-server/entities/active-worksheet-picking-view.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +49 -72
- package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js +33 -12
- package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +35 -12
- package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
- package/dist-server/utils/lmd-util.js +8 -8
- package/dist-server/utils/lmd-util.js.map +1 -1
- package/package.json +3 -3
- package/server/controllers/ecommerce/ecommerce-controller.ts +3 -2
- package/server/controllers/ecommerce/sellercraft-controller.ts +2 -1
- package/server/controllers/outbound/packing-worksheet-controller.ts +15 -3
- package/server/entities/active-worksheet-picking-view.ts +21 -24
- package/server/graphql/resolvers/worksheet/packing-worksheet.ts +46 -69
- package/server/graphql/resolvers/worksheet/picking/complete-batch-picking.ts +31 -11
- package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +33 -11
- package/server/utils/lmd-util.ts +8 -8
|
@@ -1,10 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
EntityManager,
|
|
3
|
-
getConnection,
|
|
4
|
-
Index,
|
|
5
|
-
ViewColumn,
|
|
6
|
-
ViewEntity
|
|
7
|
-
} from 'typeorm'
|
|
1
|
+
import { EntityManager, getConnection, Index, ViewColumn, ViewEntity } from 'typeorm'
|
|
8
2
|
|
|
9
3
|
@ViewEntity({
|
|
10
4
|
materialized: true,
|
|
@@ -15,8 +9,8 @@ import {
|
|
|
15
9
|
w.id as "worksheetId",
|
|
16
10
|
w.domain_id as "domainId",
|
|
17
11
|
op.id as "targetProductId",
|
|
18
|
-
|
|
19
|
-
|
|
12
|
+
oi.product_id as "productId",
|
|
13
|
+
oi.product_detail_id as "productDetailId",
|
|
20
14
|
op.uom_value as "uomValue",
|
|
21
15
|
pb.id as "productBarcodeId",
|
|
22
16
|
pb.gtin,
|
|
@@ -39,15 +33,18 @@ import {
|
|
|
39
33
|
inner join release_goods rg on rg.id = oi.release_good_id
|
|
40
34
|
left join inventory_check_items ici on ici.inventory_id = oi.inventory_id
|
|
41
35
|
inner join products p on p.id = oi.product_id
|
|
42
|
-
|
|
36
|
+
left join product_bundles pb2 on pb2.id = op.product_bundle_id
|
|
37
|
+
LEFT JOIN product_barcodes pb ON pb.product_detail_id = oi.product_detail_id
|
|
38
|
+
left join product_bundle_settings pbs on pbs.product_bundle_id = pb2.id and pbs.product_id = oi.product_id and pbs.product_detail_id = oi.product_detail_id
|
|
43
39
|
WHERE w.type::text = 'PICKING'::text AND w.status::text = 'EXECUTING'::text
|
|
44
|
-
ORDER BY w.domain_id, w.bizplace_id, wd.id
|
|
45
|
-
`
|
|
40
|
+
ORDER BY w.domain_id, w.bizplace_id, wd.id`
|
|
46
41
|
})
|
|
47
42
|
export class ActiveWorksheetPickingView {
|
|
48
43
|
static async refreshView() {
|
|
49
44
|
await getConnection().transaction(async (tx: EntityManager) => {
|
|
50
|
-
await tx
|
|
45
|
+
await tx
|
|
46
|
+
.getRepository(ActiveWorksheetPickingView)
|
|
47
|
+
.query('REFRESH MATERIALIZED VIEW CONCURRENTLY active_worksheet_picking_views')
|
|
51
48
|
.then(resp => console.log('update active_worksheet_picking_views ok'))
|
|
52
49
|
.catch(err => console.error('update active_worksheet_picking_views error'))
|
|
53
50
|
})
|
|
@@ -55,18 +52,19 @@ export class ActiveWorksheetPickingView {
|
|
|
55
52
|
|
|
56
53
|
@Index(
|
|
57
54
|
'ix_active-worksheet-picking_0',
|
|
58
|
-
(ActiveWorksheetPickingView: ActiveWorksheetPickingView) => [
|
|
55
|
+
(ActiveWorksheetPickingView: ActiveWorksheetPickingView) => [
|
|
56
|
+
ActiveWorksheetPickingView.orderInventoryId,
|
|
57
|
+
ActiveWorksheetPickingView.productBarcodeId
|
|
58
|
+
],
|
|
59
59
|
{ unique: true }
|
|
60
60
|
)
|
|
61
|
-
@Index(
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
)
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
)
|
|
69
|
-
|
|
61
|
+
@Index('ix_active-worksheet-picking_1', (ActiveWorksheetPickingView: ActiveWorksheetPickingView) => [
|
|
62
|
+
ActiveWorksheetPickingView.worksheetDetailId
|
|
63
|
+
])
|
|
64
|
+
@Index('ix_active-worksheet-picking_2', (ActiveWorksheetPickingView: ActiveWorksheetPickingView) => [
|
|
65
|
+
ActiveWorksheetPickingView.domainId,
|
|
66
|
+
ActiveWorksheetPickingView.worksheetDetailName
|
|
67
|
+
])
|
|
70
68
|
@ViewColumn()
|
|
71
69
|
worksheetDetailId: string
|
|
72
70
|
|
|
@@ -129,5 +127,4 @@ export class ActiveWorksheetPickingView {
|
|
|
129
127
|
|
|
130
128
|
@ViewColumn()
|
|
131
129
|
inventoryCheckItemStatus: string
|
|
132
|
-
|
|
133
130
|
}
|
|
@@ -123,10 +123,11 @@ export const packingWorksheetResolver = {
|
|
|
123
123
|
relations: [
|
|
124
124
|
'orderPackageItems',
|
|
125
125
|
'orderPackageItems.orderProduct',
|
|
126
|
-
'orderPackageItems.
|
|
127
|
-
'orderPackageItems.
|
|
128
|
-
'orderPackageItems.
|
|
129
|
-
|
|
126
|
+
'orderPackageItems.productDetail',
|
|
127
|
+
'orderPackageItems.productDetail.product',
|
|
128
|
+
'orderPackageItems.productDetail.product.productDetails',
|
|
129
|
+
'orderPackageItems.productDetail.product.productDetails.productBarcodes',
|
|
130
|
+
]
|
|
130
131
|
})
|
|
131
132
|
|
|
132
133
|
if (packingWorksheet.status === WORKSHEET_STATUS.DONE) {
|
|
@@ -289,33 +290,38 @@ export const packingWorksheetResolver = {
|
|
|
289
290
|
orderPackages
|
|
290
291
|
},
|
|
291
292
|
worksheetDetailInfos: processingOrderPackage[0].orderPackageItems
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
293
|
+
.reduce((curr, opi) => {
|
|
294
|
+
const orderProduct = opi.orderProduct
|
|
295
|
+
const productDetailId = opi.productDetail.id
|
|
296
|
+
|
|
297
|
+
const duplicateProduct = curr.findIndex(item => item.productDetail.id === productDetailId)
|
|
298
|
+
|
|
299
|
+
if (duplicateProduct !== -1) {
|
|
300
|
+
curr [duplicateProduct].id = `${curr[duplicateProduct].id}, ${opi.id}`
|
|
301
|
+
curr [duplicateProduct].name = `${curr[duplicateProduct].name}, ${opi.name}`
|
|
302
|
+
curr[duplicateProduct].releaseQty += opi.releaseQty
|
|
303
|
+
curr[duplicateProduct].packedQty += opi?.packedQty || 0
|
|
304
|
+
} else {
|
|
305
|
+
curr.push({
|
|
295
306
|
id: opi.id,
|
|
296
307
|
name: opi.name,
|
|
297
|
-
// palletId: inventory.palletId,
|
|
298
|
-
// cartonId: inventory.cartonId,
|
|
299
308
|
batchId: orderProduct.batchId,
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
sku:
|
|
309
|
+
product: opi.productDetail.product,
|
|
310
|
+
productDetail: opi.productDetail,
|
|
311
|
+
sku: opi.productDetail.product.sku,
|
|
303
312
|
releaseQty: opi.releaseQty,
|
|
304
313
|
packedQty: opi?.packedQty || 0,
|
|
305
314
|
status: opi.status,
|
|
306
|
-
// description: packingWSD.description,
|
|
307
|
-
// targetName: targetInventory.name,
|
|
308
|
-
// packingType: inventory.packingType,
|
|
309
|
-
// packingSize: inventory.packingSize,
|
|
310
|
-
// this is the problem
|
|
311
315
|
binLocation: binLocation
|
|
312
|
-
? releaseGood.orderInventories.find(oi => oi.orderProductId
|
|
316
|
+
? releaseGood.orderInventories.find(oi => oi.orderProductId === opi.orderProduct.id)?.binLocation
|
|
313
317
|
: binLocation,
|
|
314
|
-
isBatchPicking
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
318
|
+
isBatchPicking: isBatchPicking,
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
return curr
|
|
323
|
+
}, [])
|
|
324
|
+
|
|
319
325
|
.sort((a, b) => {
|
|
320
326
|
if (a?.binLocation && b?.binLocation) {
|
|
321
327
|
if (a.binLocation.name < b.binLocation.name) return -1
|
|
@@ -521,12 +527,14 @@ async function queryPackingWorksheet(tx, domain, assignee, binLocation) {
|
|
|
521
527
|
qb.innerJoinAndSelect('rg.bizplace', 'b')
|
|
522
528
|
.innerJoinAndSelect('b.domain', 'd')
|
|
523
529
|
.innerJoinAndSelect('rg.orderInventories', 'oi')
|
|
530
|
+
.innerJoinAndSelect('oi.binLocation', 'l')
|
|
524
531
|
.leftJoinAndSelect('rg.orderPackages', 'op')
|
|
525
532
|
.innerJoinAndSelect('op.orderPackageItems', 'opi')
|
|
526
533
|
.innerJoinAndSelect('opi.orderProduct', 'opr')
|
|
527
|
-
.innerJoinAndSelect('
|
|
528
|
-
.innerJoinAndSelect('
|
|
529
|
-
.innerJoinAndSelect('
|
|
534
|
+
.innerJoinAndSelect('opi.productDetail', 'pd')
|
|
535
|
+
.innerJoinAndSelect('pd.product', 'p')
|
|
536
|
+
.innerJoinAndSelect('p.productDetails', 'pd2')
|
|
537
|
+
.innerJoinAndSelect('pd2.productBarcodes', 'pb')
|
|
530
538
|
.innerJoin('worksheets', 'w', 'w.release_good_id = rg.id')
|
|
531
539
|
.where('rg.domain_id = :domainId', { domainId: domain.id })
|
|
532
540
|
.andWhere('oi.status IN (:...orderInventoryStatus)', {
|
|
@@ -547,49 +555,18 @@ async function queryPackingWorksheet(tx, domain, assignee, binLocation) {
|
|
|
547
555
|
.addOrderBy('rg.status', 'ASC')
|
|
548
556
|
.addOrderBy('w.created_at', 'ASC')
|
|
549
557
|
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
// .innerJoinAndSelect('releaseGood.orderPackages', 'op')
|
|
563
|
-
// .innerJoinAndSelect('op.orderPackageItems', 'opi')
|
|
564
|
-
// .innerJoinAndSelect('opi.orderProduct', 'opr')
|
|
565
|
-
// .innerJoinAndSelect('opr.product', 'p')
|
|
566
|
-
// .innerJoinAndSelect('p.productDetails', 'pd')
|
|
567
|
-
// .innerJoinAndSelect('pd.productBarcodes', 'pb')
|
|
568
|
-
// .where('orderInventory.domain_id = :domainId', { domainId: domain.id })
|
|
569
|
-
// .andWhere('orderInventory.status IN (:...orderInventoryStatus)', {
|
|
570
|
-
// orderInventoryStatus: [
|
|
571
|
-
// ORDER_INVENTORY_STATUS.READY_TO_PACK,
|
|
572
|
-
// ORDER_INVENTORY_STATUS.PACKING,
|
|
573
|
-
// ORDER_INVENTORY_STATUS.PACKED
|
|
574
|
-
// ]
|
|
575
|
-
// })
|
|
576
|
-
// .andWhere('orderInventory.bin_location_id = :locationId', { locationId: binLocation.id })
|
|
577
|
-
// .andWhere('releaseGood.status IN (:...status)', {
|
|
578
|
-
// status: [ORDER_STATUS.READY_TO_PACK, ORDER_STATUS.PACKING]
|
|
579
|
-
// })
|
|
580
|
-
|
|
581
|
-
// if (assignee) {
|
|
582
|
-
// qb.andWhere('ws.assignee_id = :assigneeId', { assigneeId: assignee.id })
|
|
583
|
-
// } else {
|
|
584
|
-
// qb.andWhere('ws.assignee_id is null')
|
|
585
|
-
// }
|
|
586
|
-
|
|
587
|
-
// qb.orderBy('releaseGood.status', 'ASC')
|
|
588
|
-
// .addOrderBy('ws.created_at', 'ASC')
|
|
589
|
-
// .addOrderBy('releaseGood.name', 'ASC')
|
|
590
|
-
// .groupBy('ws.created_at')
|
|
591
|
-
// .addGroupBy('releaseGood.name')
|
|
592
|
-
// .addGroupBy('releaseGood.id')
|
|
558
|
+
if (assignee) {
|
|
559
|
+
qb.andWhere('ws.assignee_id = :assigneeId', { assigneeId: assignee.id })
|
|
560
|
+
} else {
|
|
561
|
+
qb.andWhere('ws.assignee_id is null')
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
qb.orderBy('releaseGood.status', 'ASC')
|
|
565
|
+
.addOrderBy('ws.created_at', 'ASC')
|
|
566
|
+
.addOrderBy('releaseGood.name', 'ASC')
|
|
567
|
+
.groupBy('ws.created_at')
|
|
568
|
+
.addGroupBy('releaseGood.name')
|
|
569
|
+
.addGroupBy('releaseGood.id')
|
|
593
570
|
|
|
594
571
|
let releaseGood = await qb.getOne()
|
|
595
572
|
|
|
@@ -103,6 +103,9 @@ export async function completeBatchPicking(
|
|
|
103
103
|
'orderProducts',
|
|
104
104
|
'orderProducts.product',
|
|
105
105
|
'orderProducts.productDetail',
|
|
106
|
+
'orderProducts.productBundle',
|
|
107
|
+
'orderProducts.productBundle.productBundleSettings',
|
|
108
|
+
'orderProducts.productBundle.productBundleSettings.productDetail',
|
|
106
109
|
'bizplace',
|
|
107
110
|
'bizplace.domain',
|
|
108
111
|
'bizplace.company',
|
|
@@ -221,18 +224,35 @@ export async function completeBatchPicking(
|
|
|
221
224
|
|
|
222
225
|
let savedOrderPackage: OrderPackage = await tx.getRepository(OrderPackage).save(orderPackage)
|
|
223
226
|
const orderPackageItems: OrderPackageItem[] = foundReleaseGood.orderProducts.map(op => {
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
227
|
+
if (op.product){
|
|
228
|
+
return {
|
|
229
|
+
name: OrderNoGenerator.orderPackageItem(),
|
|
230
|
+
orderProduct: op,
|
|
231
|
+
status: ORDER_STATUS.PROCESSING,
|
|
232
|
+
releaseQty: op.releaseQty,
|
|
233
|
+
orderPackage: savedOrderPackage,
|
|
234
|
+
domain: foundReleaseGood.domain,
|
|
235
|
+
bizplace: foundReleaseGood.bizplace,
|
|
236
|
+
creator: foundReleaseGood.creator,
|
|
237
|
+
updater: foundReleaseGood.updater,
|
|
238
|
+
productDetail: op.productDetail
|
|
239
|
+
}
|
|
240
|
+
} else {
|
|
241
|
+
let productBundle = op.productBundle
|
|
242
|
+
return productBundle.productBundleSettings.map(pbs => ({
|
|
243
|
+
name: OrderNoGenerator.orderPackageItem(),
|
|
244
|
+
orderProduct: op,
|
|
245
|
+
status: ORDER_STATUS.PROCESSING,
|
|
246
|
+
releaseQty: op.releaseQty * pbs.bundleQty,
|
|
247
|
+
orderPackage: savedOrderPackage,
|
|
248
|
+
domain: foundReleaseGood.domain,
|
|
249
|
+
bizplace: foundReleaseGood.bizplace,
|
|
250
|
+
creator: foundReleaseGood.creator,
|
|
251
|
+
updater: foundReleaseGood.updater,
|
|
252
|
+
productDetail: pbs.productDetail
|
|
253
|
+
}))
|
|
234
254
|
}
|
|
235
|
-
})
|
|
255
|
+
}).flat()
|
|
236
256
|
|
|
237
257
|
await tx.getRepository(OrderPackageItem).save(orderPackageItems)
|
|
238
258
|
orderPackage.orderPackageItems = orderPackageItems
|
|
@@ -116,12 +116,17 @@ export async function completePicking(
|
|
|
116
116
|
'lastMileDelivery',
|
|
117
117
|
'orderPackages',
|
|
118
118
|
'orderPackages.orderPackageItems',
|
|
119
|
+
'orderPackages.orderPackageItems.productDetail',
|
|
120
|
+
'orderPackages.orderPackageItems.productDetail.product',
|
|
119
121
|
'orderPackages.orderPackageItems.orderProduct',
|
|
120
122
|
'orderPackages.orderPackageItems.orderProduct.product',
|
|
121
123
|
'orderPackages.orderPackageItems.orderProduct.productDetail',
|
|
122
124
|
'orderProducts',
|
|
123
125
|
'orderProducts.product',
|
|
124
126
|
'orderProducts.productDetail',
|
|
127
|
+
'orderProducts.productBundle',
|
|
128
|
+
'orderProducts.productBundle.productBundleSettings',
|
|
129
|
+
'orderProducts.productBundle.productBundleSettings.productDetail',
|
|
125
130
|
'creator',
|
|
126
131
|
'updater'
|
|
127
132
|
]
|
|
@@ -371,18 +376,35 @@ export async function completePicking(
|
|
|
371
376
|
|
|
372
377
|
let savedOrderPackage: OrderPackage = await tx.getRepository(OrderPackage).save(orderPackage)
|
|
373
378
|
const orderPackageItems: OrderPackageItem[] = releaseGood.orderProducts.map(op => {
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
379
|
+
if (op.product){
|
|
380
|
+
return {
|
|
381
|
+
name: OrderNoGenerator.orderPackageItem(),
|
|
382
|
+
orderProduct: op,
|
|
383
|
+
status: ORDER_STATUS.PROCESSING,
|
|
384
|
+
releaseQty: op.releaseQty,
|
|
385
|
+
orderPackage: savedOrderPackage,
|
|
386
|
+
domain: releaseGood.domain,
|
|
387
|
+
bizplace: releaseGood.bizplace,
|
|
388
|
+
creator: releaseGood.creator,
|
|
389
|
+
updater: releaseGood.updater,
|
|
390
|
+
productDetail: op.productDetail
|
|
391
|
+
}
|
|
392
|
+
} else {
|
|
393
|
+
let productBundle = op.productBundle
|
|
394
|
+
return productBundle.productBundleSettings.map(pbs => ({
|
|
395
|
+
name: OrderNoGenerator.orderPackageItem(),
|
|
396
|
+
orderProduct: op,
|
|
397
|
+
status: ORDER_STATUS.PROCESSING,
|
|
398
|
+
releaseQty: op.releaseQty * pbs.bundleQty,
|
|
399
|
+
orderPackage: savedOrderPackage,
|
|
400
|
+
domain: releaseGood.domain,
|
|
401
|
+
bizplace: releaseGood.bizplace,
|
|
402
|
+
creator: releaseGood.creator,
|
|
403
|
+
updater: releaseGood.updater,
|
|
404
|
+
productDetail: pbs.productDetail
|
|
405
|
+
}))
|
|
384
406
|
}
|
|
385
|
-
})
|
|
407
|
+
}).flat()
|
|
386
408
|
await tx.getRepository(OrderPackageItem).save(orderPackageItems)
|
|
387
409
|
orderPackage.orderPackageItems = orderPackageItems
|
|
388
410
|
releaseGood.orderPackages = [orderPackage]
|
package/server/utils/lmd-util.ts
CHANGED
|
@@ -155,20 +155,20 @@ export async function createLmdParcel(releaseGoods, tx, domain, user, marketplac
|
|
|
155
155
|
...data,
|
|
156
156
|
refNo: op.name,
|
|
157
157
|
items: op.orderPackageItems.map(opi => {
|
|
158
|
-
let lengthUnit = opi?.
|
|
158
|
+
let lengthUnit = opi?.productDetail?.lengthUnit?.toString()?.toLowerCase() || ''
|
|
159
159
|
|
|
160
160
|
let items = {
|
|
161
161
|
quantity: opi?.releaseQty?.toString() || ' ',
|
|
162
|
-
item: opi.
|
|
163
|
-
sku: opi.
|
|
162
|
+
item: opi.productDetail.product.name.slice(0, 49).trim() || ' ',
|
|
163
|
+
sku: opi.productDetail.product.sku || ' ',
|
|
164
164
|
price:
|
|
165
165
|
opi?.orderProduct?.paidAmount?.toString() ||
|
|
166
|
-
(opi?.releaseQty * opi?.
|
|
166
|
+
(opi?.releaseQty * opi?.productDetail?.costPrice || 0)?.toString() ||
|
|
167
167
|
' ',
|
|
168
|
-
weight: opi?.
|
|
169
|
-
width: opi?.
|
|
170
|
-
length: opi?.
|
|
171
|
-
height: opi?.
|
|
168
|
+
weight: opi?.productDetail?.grossWeight?.toString() || ' ',
|
|
169
|
+
width: opi?.productDetail?.width || ' ',
|
|
170
|
+
length: opi?.productDetail?.depth || ' ',
|
|
171
|
+
height: opi?.productDetail?.height || ' '
|
|
172
172
|
}
|
|
173
173
|
|
|
174
174
|
if (lmd.platform == 'SAPX' || lmd.platform == 'VIETTEL_POST') {
|