@things-factory/worksheet-base 4.3.592 → 4.3.595

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 (54) hide show
  1. package/dist-server/constants/worksheet.js +5 -2
  2. package/dist-server/constants/worksheet.js.map +1 -1
  3. package/dist-server/controllers/inspect/cycle-count-worksheet-controller.js +14 -18
  4. package/dist-server/controllers/inspect/cycle-count-worksheet-controller.js.map +1 -1
  5. package/dist-server/controllers/outbound/picking-worksheet-controller.js +20 -15
  6. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  7. package/dist-server/controllers/outbound/returning-worksheet-controller.js +5 -2
  8. package/dist-server/controllers/outbound/returning-worksheet-controller.js.map +1 -1
  9. package/dist-server/entities/worksheet.js +9 -5
  10. package/dist-server/entities/worksheet.js.map +1 -1
  11. package/dist-server/graphql/resolvers/worksheet/cycle-count-worksheet-for-carton.js +3 -0
  12. package/dist-server/graphql/resolvers/worksheet/cycle-count-worksheet-for-carton.js.map +1 -1
  13. package/dist-server/graphql/resolvers/worksheet/cycle-count-worksheet-for-pallet.js +3 -0
  14. package/dist-server/graphql/resolvers/worksheet/cycle-count-worksheet-for-pallet.js.map +1 -1
  15. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js +1 -1
  16. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js.map +1 -1
  17. package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js +9 -6
  18. package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js.map +1 -1
  19. package/dist-server/graphql/resolvers/worksheet/picking/fetch-and-assign-picking-task.js +1 -1
  20. package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js +1 -1
  21. package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js.map +1 -1
  22. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js +1 -0
  23. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js.map +1 -1
  24. package/dist-server/graphql/resolvers/worksheet/worksheets.js +65 -5
  25. package/dist-server/graphql/resolvers/worksheet/worksheets.js.map +1 -1
  26. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js +3 -0
  27. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js.map +1 -1
  28. package/dist-server/graphql/types/worksheet/worksheet-info.js +1 -0
  29. package/dist-server/graphql/types/worksheet/worksheet-info.js.map +1 -1
  30. package/dist-server/graphql/types/worksheet/worksheet.js +3 -0
  31. package/dist-server/graphql/types/worksheet/worksheet.js.map +1 -1
  32. package/dist-server/index.js +1 -0
  33. package/dist-server/index.js.map +1 -1
  34. package/dist-server/utils/worksheet-no-generator.js +11 -0
  35. package/dist-server/utils/worksheet-no-generator.js.map +1 -1
  36. package/package.json +13 -13
  37. package/server/constants/worksheet.ts +5 -2
  38. package/server/controllers/inspect/cycle-count-worksheet-controller.ts +13 -17
  39. package/server/controllers/outbound/picking-worksheet-controller.ts +26 -23
  40. package/server/controllers/outbound/returning-worksheet-controller.ts +4 -2
  41. package/server/entities/worksheet.ts +3 -0
  42. package/server/graphql/resolvers/worksheet/cycle-count-worksheet-for-carton.ts +3 -0
  43. package/server/graphql/resolvers/worksheet/cycle-count-worksheet-for-pallet.ts +3 -0
  44. package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +1 -1
  45. package/server/graphql/resolvers/worksheet/picking/assign-picking-worker.ts +18 -11
  46. package/server/graphql/resolvers/worksheet/picking/fetch-and-assign-picking-task.ts +1 -1
  47. package/server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.ts +1 -1
  48. package/server/graphql/resolvers/worksheet/picking-worksheet.ts +1 -0
  49. package/server/graphql/resolvers/worksheet/worksheets.ts +94 -13
  50. package/server/graphql/types/worksheet/worksheet-detail-info.ts +3 -0
  51. package/server/graphql/types/worksheet/worksheet-info.ts +1 -0
  52. package/server/graphql/types/worksheet/worksheet.ts +3 -0
  53. package/server/index.ts +1 -0
  54. package/server/utils/worksheet-no-generator.ts +17 -0
@@ -738,19 +738,17 @@ export class CycleCountWorksheetController extends WorksheetController {
738
738
  .andWhere('inventoryCheckItem.status = :status', { status: 'INSPECTING' })
739
739
  .getMany()
740
740
 
741
- const { totalOriginQty, totalOriginUomValue } = inventoryCheckItems.reduce(
741
+ const { totalOriginQty } = inventoryCheckItems.reduce(
742
742
  (total, item) => {
743
743
  total.totalOriginQty += item.originQty || 0
744
- total.totalOriginUomValue += item.originUomValue || 0
745
744
 
746
745
  return total
747
746
  },
748
- { totalOriginQty: 0, totalOriginUomValue: 0 }
747
+ { totalOriginQty: 0 }
749
748
  )
750
749
 
751
750
  const hasDiscrepancies =
752
751
  totalOriginQty !== inspectedQty ||
753
- totalOriginUomValue !== inspectedUomValue ||
754
752
  inventoryCheckItems.some(
755
753
  checkItem =>
756
754
  checkItem.originExpirationDate !== formatDate(inspectedExpirationDate) ||
@@ -758,18 +756,14 @@ export class CycleCountWorksheetController extends WorksheetController {
758
756
  )
759
757
 
760
758
  let totalInspectedQty = inspectedQty
761
- let totalInspectedUomValue = inspectedUomValue
762
759
 
763
760
  for (const checkItem of inventoryCheckItems) {
764
761
  const qtyToInspect = totalInspectedQty > 0 ? Math.min(totalInspectedQty, checkItem.originQty) : 0
765
- const uomValueToInspect =
766
- totalInspectedUomValue > 0 ? Math.min(totalInspectedUomValue, checkItem.originUomValue) : 0
767
762
 
768
763
  checkItem.inspectedQty = (checkItem.inspectedQty ?? 0) + qtyToInspect
769
764
  totalInspectedQty -= qtyToInspect
770
765
 
771
- checkItem.inspectedUomValue = (checkItem.inspectedUomValue ?? 0) + uomValueToInspect
772
- totalInspectedUomValue -= uomValueToInspect
766
+ checkItem.inspectedUomValue = checkItem.originUomValue ?? 0
773
767
 
774
768
  checkItem.inspectedBatchNo = inspectedBatchNo
775
769
  checkItem.inspectedExpirationDate = inspectedExpirationDate
@@ -801,14 +795,12 @@ export class CycleCountWorksheetController extends WorksheetController {
801
795
  }
802
796
  }
803
797
 
804
- if (totalInspectedQty > 0 && totalInspectedUomValue > 0 && inventoryCheckItems.length > 0) {
798
+ if (totalInspectedQty > 0 && inventoryCheckItems.length > 0) {
805
799
  const lastItem = inventoryCheckItems[inventoryCheckItems.length - 1]
806
800
  lastItem.inspectedQty = (lastItem.inspectedQty ?? 0) + totalInspectedQty
807
- lastItem.inspectedUomValue = (lastItem.inspectedUomValue ?? 0) + totalInspectedUomValue
808
801
 
809
802
  await this.trxMgr.getRepository(InventoryCheckItem).update(lastItem.id, {
810
803
  inspectedQty: lastItem.inspectedQty,
811
- inspectedUomValue: lastItem.inspectedUomValue,
812
804
  updater: this.user
813
805
  })
814
806
  }
@@ -1380,10 +1372,14 @@ export class CycleCountWorksheetController extends WorksheetController {
1380
1372
  }
1381
1373
 
1382
1374
  function formatDate(data) {
1383
- let date = {
1384
- year: data.getFullYear().toString(),
1385
- month: (data.getMonth() + 1).toString(),
1386
- day: data.getDate().toString()
1375
+ if (data) {
1376
+ let date = {
1377
+ year: data.getFullYear().toString(),
1378
+ month: (data.getMonth() + 1).toString(),
1379
+ day: data.getDate().toString()
1380
+ }
1381
+ return `${date.year}-${date.month.padStart(2, '0')}-${date.day.padStart(2, '0')}`
1387
1382
  }
1388
- return `${date.year}-${date.month.padStart(2, '0')}-${date.day.padStart(2, '0')}`
1383
+
1384
+ return null
1389
1385
  }
@@ -2695,35 +2695,38 @@ export class PickingWorksheetController extends VasWorksheetController {
2695
2695
  })
2696
2696
 
2697
2697
  worksheet.releaseGood = { ...worksheet.releaseGood, orderProducts, orderPackages, orderConsignments }
2698
+ if (worksheet.type === WORKSHEET_TYPE.PICKING) {
2699
+ if (worksheet.releaseGood?.assignedInventory == false) {
2700
+ worksheetDetails = await this.assignInventoriesForUnassignedOrder(worksheet, tx)
2701
+ worksheet.worksheetDetails = worksheetDetails
2702
+ worksheet.releaseGood.assignedInventory = true
2703
+ } else {
2704
+ worksheetDetails = worksheet.worksheetDetails.filter(x => x.status == 'DEACTIVATED')
2705
+ const targetInventoryIds: OrderInventory[] = worksheetDetails.map(
2706
+ (wsd: WorksheetDetail) => wsd.targetInventory.id
2707
+ )
2698
2708
 
2699
- if (worksheet.releaseGood?.assignedInventory == false) {
2700
- worksheetDetails = await this.assignInventoriesForUnassignedOrder(worksheet, tx)
2701
- worksheet.worksheetDetails = worksheetDetails
2702
- worksheet.releaseGood.assignedInventory = true
2703
- } else {
2704
- worksheetDetails = worksheet.worksheetDetails.filter(x => x.status == 'DEACTIVATED')
2705
- const targetInventoryIds: OrderInventory[] = worksheetDetails.map(
2706
- (wsd: WorksheetDetail) => wsd.targetInventory.id
2707
- )
2709
+ await tx.getRepository(OrderInventory).update(
2710
+ { id: In(targetInventoryIds) },
2711
+ {
2712
+ status: ORDER_INVENTORY_STATUS.PICKING,
2713
+ updater: this.user
2714
+ }
2715
+ )
2716
+ }
2708
2717
 
2709
- await tx.getRepository(OrderInventory).update(
2710
- { id: In(targetInventoryIds) },
2718
+ await tx.getRepository(ReleaseGood).update(
2719
+ { id: worksheet.releaseGood.id },
2711
2720
  {
2712
- status: ORDER_INVENTORY_STATUS.PICKING,
2713
- updater: this.user
2721
+ status: ORDER_STATUS.PICKING,
2722
+ updater: this.user,
2723
+ assignedInventory: true
2714
2724
  }
2715
2725
  )
2726
+ } else {
2727
+ worksheetDetails = worksheet.worksheetDetails
2716
2728
  }
2717
2729
 
2718
- await tx.getRepository(ReleaseGood).update(
2719
- { id: worksheet.releaseGood.id },
2720
- {
2721
- status: ORDER_STATUS.PICKING,
2722
- updater: this.user,
2723
- assignedInventory: true
2724
- }
2725
- )
2726
-
2727
2730
  worksheet = await this.activateWorksheet(worksheet, worksheetDetails, [], tx)
2728
2731
  releaseGood = worksheet.releaseGood
2729
2732
  domain = worksheet.domain
@@ -2733,7 +2736,7 @@ export class PickingWorksheetController extends VasWorksheetController {
2733
2736
 
2734
2737
  const orderSource: string = releaseGood?.source
2735
2738
  switch (orderSource) {
2736
- //disable temporary to prevent duplicates call
2739
+ //disable temporary to prevent duplicates call
2737
2740
  case ApplicationType.SELLERCRAFT:
2738
2741
  // getManager().transaction(async txMgr => {
2739
2742
  // const sellercraft: Sellercraft = await txMgr
@@ -235,7 +235,7 @@ export class ReturningWorksheetController extends VasWorksheetController {
235
235
  const releaseGood: ReleaseGood = await this.findRefOrder(ReleaseGood, {
236
236
  domain: this.domain,
237
237
  name: releaseGoodNo,
238
- status: ORDER_STATUS.PARTIAL_RETURN
238
+ status: In([ORDER_STATUS.PARTIAL_RETURN, ORDER_STATUS.PROCESSING, ORDER_STATUS.PARTIAL_PROCESSING])
239
239
  })
240
240
 
241
241
  const worksheet: Worksheet = await this.findWorksheetByRefOrder(releaseGood, WORKSHEET_TYPE.WAREHOUSE_RETURN, [
@@ -244,6 +244,8 @@ export class ReturningWorksheetController extends VasWorksheetController {
244
244
  ])
245
245
  this.checkRecordValidity(worksheet, { status: WORKSHEET_STATUS.EXECUTING })
246
246
 
247
- return await this.completeWorksheet(worksheet, ORDER_STATUS.DONE)
247
+ let status = ORDER_STATUS.DONE
248
+ if(releaseGood.status !== ORDER_STATUS.PARTIAL_RETURN) status = releaseGood.status
249
+ return await this.completeWorksheet(worksheet, status)
248
250
  }
249
251
  }
@@ -60,6 +60,9 @@ export class Worksheet {
60
60
  @ManyToOne(type => ShippingOrder)
61
61
  shippingOrder: ShippingOrder
62
62
 
63
+ @ManyToOne(type => User)
64
+ sorter: User
65
+
63
66
  @ManyToOne(type => Location)
64
67
  bufferLocation: Location
65
68
 
@@ -121,8 +121,11 @@ export const cycleCountWorksheetForCartonResolver = {
121
121
  uomValue: inventory?.uomValue,
122
122
  uom: inventory?.uom,
123
123
  originLocation: targetInventoryCheckItem?.originLocation,
124
+ originQty: targetInventoryCheckItem?.originQty,
124
125
  inspectedQty: targetInventoryCheckItem?.inspectedQty,
126
+ originExpirationDate: targetInventoryCheckItem?.originExpirationDate,
125
127
  inspectedExpirationDate: targetInventoryCheckItem?.inspectedExpirationDate,
128
+ originUomValue: targetInventoryCheckItem?.originUomValue,
126
129
  inspectedUomValue: targetInventoryCheckItem?.inspectedUomValue,
127
130
  inspectedLocation: targetInventoryCheckItem?.inspectedLocation,
128
131
  inspectedBatchNo: targetInventoryCheckItem?.inspectedBatchNo,
@@ -129,8 +129,11 @@ export const cycleCountWorksheetForPalletResolver = {
129
129
  uomValue: inventory?.uomValue,
130
130
  uom: inventory?.uom,
131
131
  originLocation: targetInventoryCheckItem?.originLocation,
132
+ originQty: targetInventoryCheckItem?.originQty,
132
133
  inspectedQty: targetInventoryCheckItem?.inspectedQty,
134
+ originUomValue: targetInventoryCheckItem?.originUomValue,
133
135
  inspectedUomValue: targetInventoryCheckItem?.inspectedUomValue,
136
+ originExpirationDate: targetInventoryCheckItem?.originExpirationDate,
134
137
  inspectedExpirationDate: targetInventoryCheckItem?.inspectedExpirationDate,
135
138
  inspectedLocation: targetInventoryCheckItem?.inspectedLocation,
136
139
  inspectedBatchNo: targetInventoryCheckItem?.inspectedBatchNo,
@@ -43,7 +43,7 @@ export const inventoriesByPalletResolver = {
43
43
  .andWhere('iv.qty > 0')
44
44
  .andWhere('iv.transfer_qty <= 0')
45
45
  .andWhere('iv.transfer_uom_value <= 0')
46
- .andWhere('iv.lock_inventory != true')
46
+ .andWhere('iv.lock_inventory is not true')
47
47
  .andWhere(
48
48
  `location.type ${recallFilters?.value === true ? '' : 'NOT'} IN ('${LOCATION_TYPE.QUARANTINE}', '${
49
49
  LOCATION_TYPE.RESERVE
@@ -19,17 +19,24 @@ export const assignPickingWorkerResolver = {
19
19
 
20
20
  if (!assignee) throw new Error('failed to find target user')
21
21
 
22
- await Promise.all(worksheetId.map(async (worksheetId)=>{
23
- const worksheet: Worksheet = await tx.getRepository(Worksheet).findOne({
24
- id: worksheetId,
25
- },{where: [{
26
- type:WORKSHEET_TYPE.BATCH_PICKING
27
- },{type:WORKSHEET_TYPE.PICKING}]})
28
-
29
- if (!worksheet) throw new Error('failed to find target picking worksheet')
30
- worksheet.assignee = assignee
31
- await tx.getRepository(Worksheet).save(worksheet)
22
+ await Promise.all(
23
+ worksheetId.map(async worksheetId => {
24
+ const worksheet: Worksheet = await tx.getRepository(Worksheet).findOne(
25
+ {
26
+ id: worksheetId
27
+ },
28
+ {
29
+ where: [
30
+ { type: WORKSHEET_TYPE.BATCH_PICKING },
31
+ { type: WORKSHEET_TYPE.PICKING },
32
+ { type: WORKSHEET_TYPE.ZONE_PICKING }
33
+ ]
34
+ }
35
+ )
32
36
 
33
- }))
37
+ if (!worksheet) throw new Error('failed to find target picking worksheet')
38
+ await tx.getRepository(Worksheet).update({ id: worksheet.id }, { assignee: assignee })
39
+ })
40
+ )
34
41
  }
35
42
  }
@@ -67,7 +67,7 @@ export const fetchAndAssignPickingTaskResolver = {
67
67
  INNER JOIN release_goods rg ON rg.id = ws.release_good_id
68
68
  WHERE
69
69
  ws.domain_id = $1 AND
70
- ws.type = 'PICKING'
70
+ ws.type = 'PICKING'
71
71
  AND ws.status IN ('EXECUTING', 'DEACTIVATED')
72
72
  AND ws.assignee_id IS NULL
73
73
  /*
@@ -49,7 +49,7 @@ export const pickingAssignmentStatusByUsersResolver = {
49
49
  getAssignedWSQb.addSelect("sum(case when ws.status='DEACTIVATED' then 1 else 0 end) as pending")
50
50
  getAssignedWSQb.innerJoin('ws.assignee','u')
51
51
  getAssignedWSQb.where('ws.domain_id = :id',{id:domain.id})
52
- getAssignedWSQb.andWhere('ws.type IN (:...type)', {type: [WORKSHEET_TYPE.PICKING, WORKSHEET_TYPE.BATCH_PICKING]})
52
+ getAssignedWSQb.andWhere('ws.type IN (:...type)', {type: [WORKSHEET_TYPE.PICKING, WORKSHEET_TYPE.BATCH_PICKING, WORKSHEET_TYPE.ZONE_PICKING]})
53
53
  getAssignedWSQb.andWhere('ws.status IN (:...status)', {status: [WORKSHEET_STATUS.DEACTIVATED, WORKSHEET_STATUS.EXECUTING]})
54
54
  getAssignedWSQb.groupBy('ws.assignee_id')
55
55
  getAssignedWSQb.addGroupBy('u.name')
@@ -119,6 +119,7 @@ export async function pickingWorksheet(domain: Domain, orderNo: String, location
119
119
 
120
120
  return {
121
121
  worksheetInfo: {
122
+ worksheet,
122
123
  bizplaceName: releaseGood.bizplace.name,
123
124
  partnerDomainId: releaseGood.bizplace?.domain.id,
124
125
  startedAt: worksheet.startedAt,
@@ -1,8 +1,15 @@
1
- import { Brackets, getRepository, SelectQueryBuilder } from 'typeorm'
1
+ import { Brackets, getRepository, SelectQueryBuilder, In, createQueryBuilder } from 'typeorm'
2
2
 
3
3
  import { User } from '@things-factory/auth-base'
4
4
  import { getPermittedBizplaceIds } from '@things-factory/biz-base'
5
- import { ArrivalNotice, InventoryCheck, ReleaseGood, ReturnOrder, Replenishment } from '@things-factory/sales-base'
5
+ import {
6
+ ArrivalNotice,
7
+ InventoryCheck,
8
+ ReleaseGood,
9
+ ReturnOrder,
10
+ Replenishment,
11
+ OrderInventory
12
+ } from '@things-factory/sales-base'
6
13
  import { buildQuery, convertListParams, Domain, ListParam } from '@things-factory/shell'
7
14
 
8
15
  import { WORKSHEET_TYPE } from '../../../constants'
@@ -428,7 +435,7 @@ export const worksheetsResolver = {
428
435
  qb.andWhere(`replenishment.name ILIKE '${replenishmentParam.value}'`)
429
436
  }
430
437
 
431
- if (releaseGoodParam) {
438
+ if (releaseGoodParam && typeParam.value[0] !== WORKSHEET_TYPE.ZONE_PICKING) {
432
439
  let removeSymbol = releaseGoodParam.value
433
440
  .split('')
434
441
  .filter(res => res !== '%')
@@ -552,7 +559,7 @@ export const worksheetsResolver = {
552
559
  sort.name != 'releaseRefNo' &&
553
560
  sort.name != 'returnOrderNo' &&
554
561
  sort.name != 'inventoryCheckStatus' &&
555
- sort.name != 'executionDate'
562
+ sort.name != 'executionDate'
556
563
  ) {
557
564
  return {
558
565
  ...acc,
@@ -622,9 +629,7 @@ export const worksheetsResolver = {
622
629
  if (params.sortings.some(e => e.name === 'updatedAt')) {
623
630
  // overwrite the worksheet status sorting since inventory check status is needed
624
631
  sort = {
625
- 'ws.updatedAt': params.sortings[
626
- params.sortings.findIndex(item => item.name == 'updatedAt')
627
- ].desc
632
+ 'ws.updatedAt': params.sortings[params.sortings.findIndex(item => item.name == 'updatedAt')].desc
628
633
  ? 'DESC'
629
634
  : 'ASC'
630
635
  }
@@ -634,12 +639,27 @@ export const worksheetsResolver = {
634
639
 
635
640
  let [items, total] = await qb.getManyAndCount()
636
641
 
637
- items = items.map(item => {
638
- return {
639
- ...item,
640
- orderRemark: item?.releaseGood?.remark ? true : false
641
- }
642
- })
642
+ //zone picking worksheet is not tied to ro
643
+ //therefor extra query to fetch extra detail for zone picking worksheet
644
+ let extraItems
645
+ if (typeParam.value[0] === WORKSHEET_TYPE.ZONE_PICKING) {
646
+ extraItems = await zonePickingExtras(items, releaseGoodParam)
647
+ }
648
+
649
+ if (extraItems) {
650
+ items = extraItems.map(item => {
651
+ return {
652
+ ...item
653
+ }
654
+ })
655
+ } else {
656
+ items = items.map(item => {
657
+ return {
658
+ ...item,
659
+ orderRemark: item?.releaseGood?.remark ? true : false
660
+ }
661
+ })
662
+ }
643
663
 
644
664
  return { items, total }
645
665
  } catch (error) {
@@ -647,3 +667,64 @@ export const worksheetsResolver = {
647
667
  }
648
668
  }
649
669
  }
670
+
671
+ async function zonePickingExtras(worksheets, releaseGoodParam) {
672
+ const wsIds = [...new Set(worksheets.map(ws => ws.id))]
673
+
674
+ if (wsIds.length === 0) {
675
+ throw new Error('No worksheet ID found')
676
+ }
677
+
678
+ const qb = await getRepository(OrderInventory)
679
+ .createQueryBuilder('oi')
680
+ .leftJoinAndSelect('oi.releaseGood', 'releaseGood')
681
+ .leftJoinAndSelect('oi.inventory', 'inventory')
682
+ .where('oi.refWorksheetId IN (:...wsIds)', { wsIds })
683
+
684
+ if (releaseGoodParam) {
685
+ let removeSymbol = releaseGoodParam.value
686
+ .split('')
687
+ .filter(res => res !== '%')
688
+ .join('')
689
+
690
+ let orderInfos = removeSymbol
691
+ .toLowerCase()
692
+ .split(',')
693
+ .map(prod => {
694
+ return "'%" + prod.trim().replace(/'/g, "''") + "%'"
695
+ })
696
+ .join(',')
697
+
698
+ qb.andWhere(`(
699
+ lower(releaseGood.name) like any(array[${orderInfos}])
700
+ or lower(releaseGood.ref_no) like any(array[${orderInfos}])
701
+ )`)
702
+ }
703
+
704
+ let orderInventories: OrderInventory[] = await qb.getMany()
705
+
706
+ //group oi by refWorksheetId
707
+ const groupedOi = orderInventories.reduce((acc, oi) => {
708
+ const worksheetId = oi.refWorksheetId
709
+ if (!acc[worksheetId]) acc[worksheetId] = []
710
+ acc[worksheetId].push(oi)
711
+ return acc
712
+ }, {})
713
+
714
+ //to filter worksheet when outboundOrderInfoFilter is used
715
+ const filteredWorksheets = worksheets.filter(ws => groupedOi[ws.id])
716
+
717
+ //map results to items
718
+ const extraItems = filteredWorksheets.map(ws => {
719
+ const inventories = groupedOi[ws.id] || []
720
+ const releaseGoods = inventories.map(oi => oi.releaseGood)
721
+ return {
722
+ ...ws,
723
+ roCounts: new Set(releaseGoods.map(ro => ro.id)).size,
724
+ refNo: Array.from(new Set(releaseGoods.map(ro => ro.refNo))).join(','),
725
+ skuCounts: new Set(inventories.map(oi => oi.inventory?.id)).size
726
+ }
727
+ })
728
+
729
+ return extraItems
730
+ }
@@ -33,6 +33,9 @@ export const WorksheetDetailInfo = gql`
33
33
  sortedQty: Float
34
34
  releaseUomValue: Float
35
35
  inspectedBatchNo: String
36
+ originQty: Int
37
+ originUomValue: Float
38
+ originExpirationDate: String
36
39
  inspectedQty: Int
37
40
  inspectedUomValue: Float
38
41
  inspectedExpirationDate: String
@@ -2,6 +2,7 @@ import { gql } from 'apollo-server-koa'
2
2
 
3
3
  export const WorksheetInfo = gql`
4
4
  type WorksheetInfo {
5
+ worksheet: Worksheet
5
6
  arrivalNotice: ArrivalNotice
6
7
  releaseGood: ReleaseGood
7
8
  replenishment: Replenishment
@@ -33,5 +33,8 @@ export const Worksheet = gql`
33
33
  updater: User
34
34
  createdAt: String
35
35
  updatedAt: String
36
+ roCounts: Int
37
+ skuCounts: Int
38
+ refNo: String
36
39
  }
37
40
  `
package/server/index.ts CHANGED
@@ -16,5 +16,6 @@ export * from './controllers/render-orientage-grn'
16
16
  export * from './controllers/render-orientage-do'
17
17
  export * from './controllers/render-ro-do'
18
18
  export * from './controllers/ecommerce/ecommerce-controller'
19
+ export * from './controllers/worksheet-controller'
19
20
 
20
21
  export {createOrderPackageAndItems} from './controllers/outbound/picking-worksheet-controller'
@@ -26,6 +26,9 @@ export class WorksheetNoGenerator {
26
26
  case WORKSHEET_TYPE.BATCH_PICKING:
27
27
  return this.batchPicking()
28
28
 
29
+ case WORKSHEET_TYPE.ZONE_PICKING:
30
+ return this.zonePicking()
31
+
29
32
  case WORKSHEET_TYPE.SORTING:
30
33
  return this.sorting()
31
34
 
@@ -77,6 +80,9 @@ export class WorksheetNoGenerator {
77
80
  case WORKSHEET_TYPE.BATCH_PICKING:
78
81
  return this.batchPickingDetail()
79
82
 
83
+ case WORKSHEET_TYPE.ZONE_PICKING:
84
+ return this.zonePickingDetail()
85
+
80
86
  case WORKSHEET_TYPE.SORTING:
81
87
  return this.sortingDetail()
82
88
 
@@ -153,6 +159,13 @@ export class WorksheetNoGenerator {
153
159
  }${currentDate.getDate()}${currentDate.getHours()}${currentDate.getMinutes()}${currentDate.getSeconds()}${currentDate.getMilliseconds()}`
154
160
  }
155
161
 
162
+ static zonePicking() {
163
+ const currentDate = new Date()
164
+ return `ZP-${currentDate.getFullYear()}${
165
+ currentDate.getMonth() + 1
166
+ }${currentDate.getDate()}${currentDate.getHours()}${currentDate.getMinutes()}${currentDate.getSeconds()}${currentDate.getMilliseconds()}`
167
+ }
168
+
156
169
  static sorting() {
157
170
  const currentDate = new Date()
158
171
  return `SORT-${currentDate.getFullYear()}${
@@ -220,6 +233,10 @@ export class WorksheetNoGenerator {
220
233
  return `BP-DETAIL-${uuidv4()}`
221
234
  }
222
235
 
236
+ static zonePickingDetail() {
237
+ return `ZP-DETAIL-${uuidv4()}`
238
+ }
239
+
223
240
  static vasDetail() {
224
241
  return `VAS-DETAIL-${uuidv4()}`
225
242
  }