@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.
Files changed (25) hide show
  1. package/dist-server/controllers/ecommerce/ecommerce-controller.js +4 -2
  2. package/dist-server/controllers/ecommerce/ecommerce-controller.js.map +1 -1
  3. package/dist-server/controllers/ecommerce/sellercraft-controller.js +2 -1
  4. package/dist-server/controllers/ecommerce/sellercraft-controller.js.map +1 -1
  5. package/dist-server/controllers/outbound/packing-worksheet-controller.js +12 -3
  6. package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
  7. package/dist-server/entities/active-worksheet-picking-view.js +20 -9
  8. package/dist-server/entities/active-worksheet-picking-view.js.map +1 -1
  9. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +49 -72
  10. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
  11. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js +33 -12
  12. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js.map +1 -1
  13. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +35 -12
  14. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
  15. package/dist-server/utils/lmd-util.js +8 -8
  16. package/dist-server/utils/lmd-util.js.map +1 -1
  17. package/package.json +3 -3
  18. package/server/controllers/ecommerce/ecommerce-controller.ts +3 -2
  19. package/server/controllers/ecommerce/sellercraft-controller.ts +2 -1
  20. package/server/controllers/outbound/packing-worksheet-controller.ts +15 -3
  21. package/server/entities/active-worksheet-picking-view.ts +21 -24
  22. package/server/graphql/resolvers/worksheet/packing-worksheet.ts +46 -69
  23. package/server/graphql/resolvers/worksheet/picking/complete-batch-picking.ts +31 -11
  24. package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +33 -11
  25. 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
- op.product_id as "productId",
19
- op.product_detail_id as "productDetailId",
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
- LEFT JOIN product_barcodes pb ON pb.product_detail_id = op.product_detail_id
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.getRepository(ActiveWorksheetPickingView).query('REFRESH MATERIALIZED VIEW CONCURRENTLY active_worksheet_picking_views')
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) => [ActiveWorksheetPickingView.orderInventoryId, ActiveWorksheetPickingView.productBarcodeId],
55
+ (ActiveWorksheetPickingView: ActiveWorksheetPickingView) => [
56
+ ActiveWorksheetPickingView.orderInventoryId,
57
+ ActiveWorksheetPickingView.productBarcodeId
58
+ ],
59
59
  { unique: true }
60
60
  )
61
- @Index(
62
- 'ix_active-worksheet-picking_1',
63
- (ActiveWorksheetPickingView: ActiveWorksheetPickingView) => [ActiveWorksheetPickingView.worksheetDetailId]
64
- )
65
- @Index(
66
- 'ix_active-worksheet-picking_2',
67
- (ActiveWorksheetPickingView: ActiveWorksheetPickingView) => [ActiveWorksheetPickingView.domainId, ActiveWorksheetPickingView.worksheetDetailName]
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.orderProduct.product',
127
- 'orderPackageItems.orderProduct.product.productDetails',
128
- 'orderPackageItems.orderProduct.product.productDetails.productBarcodes'
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
- .map(opi => {
293
- const orderProduct: OrderProduct = opi.orderProduct
294
- return {
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
- // batchIdRef: inventory.batchIdRef,
301
- product: orderProduct.product,
302
- sku: orderProduct.product.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 == opi.orderProduct.id)?.binLocation
316
+ ? releaseGood.orderInventories.find(oi => oi.orderProductId === opi.orderProduct.id)?.binLocation
313
317
  : binLocation,
314
- isBatchPicking
315
- // location: inventory.location,
316
- // relatedOrderInv: targetInventory
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('opr.product', 'p')
528
- .innerJoinAndSelect('p.productDetails', 'pd')
529
- .innerJoinAndSelect('pd.productBarcodes', 'pb')
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
- // let qb: SelectQueryBuilder<OrderInventory> = tx.getRepository(OrderInventory).createQueryBuilder('orderInventory')
551
-
552
- // qb.select('releaseGood.id', 'id')
553
- // .innerJoinAndSelect('orderInventory.location', 'binLocation')
554
- // .innerJoinAndSelect('orderInventory.releaseGood', 'releaseGood')
555
- // .innerJoinAndSelect('releaseGood.bizplace', 'bizplace')
556
- // .innerJoinAndSelect('bizplace.domain', 'domain')
557
- // .innerJoinAndSelect(
558
- // 'worksheets',
559
- // 'ws',
560
- // `orderInventory.release_good_id = ws.release_good_id AND ws.type = 'PACKING' AND (ws.status = 'EXECUTING' OR ws.status = 'DEACTIVATED')`
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
- return {
225
- name: OrderNoGenerator.orderPackageItem(),
226
- orderProduct: op,
227
- status: ORDER_STATUS.PROCESSING,
228
- releaseQty: op.releaseQty,
229
- orderPackage: savedOrderPackage,
230
- domain: foundReleaseGood.domain,
231
- bizplace: foundReleaseGood.bizplace,
232
- creator: foundReleaseGood.creator,
233
- updater: foundReleaseGood.updater
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
- return {
375
- name: OrderNoGenerator.orderPackageItem(),
376
- orderProduct: op,
377
- status: ORDER_STATUS.PROCESSING,
378
- releaseQty: op.releaseQty,
379
- orderPackage: savedOrderPackage,
380
- domain: releaseGood.domain,
381
- bizplace: releaseGood.bizplace,
382
- creator: releaseGood.creator,
383
- updater: releaseGood.updater
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]
@@ -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?.orderProduct.productDetail?.lengthUnit?.toString()?.toLowerCase() || ''
158
+ let lengthUnit = opi?.productDetail?.lengthUnit?.toString()?.toLowerCase() || ''
159
159
 
160
160
  let items = {
161
161
  quantity: opi?.releaseQty?.toString() || ' ',
162
- item: opi.orderProduct.product.name.slice(0, 49).trim() || ' ',
163
- sku: opi.orderProduct.product.sku || ' ',
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?.orderProduct.productDetail?.costPrice || 0)?.toString() ||
166
+ (opi?.releaseQty * opi?.productDetail?.costPrice || 0)?.toString() ||
167
167
  ' ',
168
- weight: opi?.orderProduct.productDetail?.grossWeight?.toString() || ' ',
169
- width: opi?.orderProduct.productDetail?.width || ' ',
170
- length: opi?.orderProduct.productDetail?.depth || ' ',
171
- height: opi?.orderProduct.productDetail?.height || ' '
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') {