@things-factory/worksheet-base 4.3.593 → 4.3.596

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 (42) 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/outbound/picking-worksheet-controller.js +20 -15
  4. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  5. package/dist-server/controllers/outbound/returning-worksheet-controller.js +5 -2
  6. package/dist-server/controllers/outbound/returning-worksheet-controller.js.map +1 -1
  7. package/dist-server/entities/worksheet.js +9 -5
  8. package/dist-server/entities/worksheet.js.map +1 -1
  9. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js +1 -1
  10. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js.map +1 -1
  11. package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js +9 -6
  12. package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js.map +1 -1
  13. package/dist-server/graphql/resolvers/worksheet/picking/fetch-and-assign-picking-task.js +1 -1
  14. package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js +1 -1
  15. package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js.map +1 -1
  16. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js +1 -0
  17. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js.map +1 -1
  18. package/dist-server/graphql/resolvers/worksheet/worksheets.js +65 -5
  19. package/dist-server/graphql/resolvers/worksheet/worksheets.js.map +1 -1
  20. package/dist-server/graphql/types/worksheet/worksheet-info.js +1 -0
  21. package/dist-server/graphql/types/worksheet/worksheet-info.js.map +1 -1
  22. package/dist-server/graphql/types/worksheet/worksheet.js +3 -0
  23. package/dist-server/graphql/types/worksheet/worksheet.js.map +1 -1
  24. package/dist-server/index.js +1 -0
  25. package/dist-server/index.js.map +1 -1
  26. package/dist-server/utils/worksheet-no-generator.js +11 -0
  27. package/dist-server/utils/worksheet-no-generator.js.map +1 -1
  28. package/package.json +13 -13
  29. package/server/constants/worksheet.ts +5 -2
  30. package/server/controllers/outbound/picking-worksheet-controller.ts +26 -23
  31. package/server/controllers/outbound/returning-worksheet-controller.ts +4 -2
  32. package/server/entities/worksheet.ts +3 -0
  33. package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +1 -1
  34. package/server/graphql/resolvers/worksheet/picking/assign-picking-worker.ts +18 -11
  35. package/server/graphql/resolvers/worksheet/picking/fetch-and-assign-picking-task.ts +1 -1
  36. package/server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.ts +1 -1
  37. package/server/graphql/resolvers/worksheet/picking-worksheet.ts +1 -0
  38. package/server/graphql/resolvers/worksheet/worksheets.ts +94 -13
  39. package/server/graphql/types/worksheet/worksheet-info.ts +1 -0
  40. package/server/graphql/types/worksheet/worksheet.ts +3 -0
  41. package/server/index.ts +1 -0
  42. package/server/utils/worksheet-no-generator.ts +17 -0
@@ -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
 
@@ -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
+ }
@@ -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
  }