@things-factory/worksheet-base 5.0.0-alpha.25 → 5.0.0-alpha.28

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 (87) hide show
  1. package/dist-server/controllers/inbound/unloading-worksheet-controller.js +2 -0
  2. package/dist-server/controllers/inbound/unloading-worksheet-controller.js.map +1 -1
  3. package/dist-server/controllers/outbound/packing-worksheet-controller.js +166 -8
  4. package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
  5. package/dist-server/controllers/outbound/picking-worksheet-controller.js +57 -32
  6. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  7. package/dist-server/controllers/outbound/returning-worksheet-controller.js +7 -1
  8. package/dist-server/controllers/outbound/returning-worksheet-controller.js.map +1 -1
  9. package/dist-server/controllers/outbound/sorting-worksheet-controller.js +110 -3
  10. package/dist-server/controllers/outbound/sorting-worksheet-controller.js.map +1 -1
  11. package/dist-server/controllers/render-grn.js +27 -3
  12. package/dist-server/controllers/render-grn.js.map +1 -1
  13. package/dist-server/controllers/render-orientage-do.js.map +1 -1
  14. package/dist-server/controllers/render-orientage-grn.js +1 -0
  15. package/dist-server/controllers/render-orientage-grn.js.map +1 -1
  16. package/dist-server/controllers/render-ro-do.js +65 -1
  17. package/dist-server/controllers/render-ro-do.js.map +1 -1
  18. package/dist-server/controllers/worksheet-controller.js +2 -1
  19. package/dist-server/controllers/worksheet-controller.js.map +1 -1
  20. package/dist-server/graphql/resolvers/worksheet/find-release-orders-by-task-no.js +30 -1
  21. package/dist-server/graphql/resolvers/worksheet/find-release-orders-by-task-no.js.map +1 -1
  22. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js +3 -0
  23. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js.map +1 -1
  24. package/dist-server/graphql/resolvers/worksheet/packing/index.js +2 -1
  25. package/dist-server/graphql/resolvers/worksheet/packing/index.js.map +1 -1
  26. package/dist-server/graphql/resolvers/worksheet/packing/packing.js +4 -4
  27. package/dist-server/graphql/resolvers/worksheet/packing/packing.js.map +1 -1
  28. package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js +4 -4
  29. package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js.map +1 -1
  30. package/dist-server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.js +15 -0
  31. package/dist-server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.js.map +1 -0
  32. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +152 -133
  33. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
  34. package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js +13 -10
  35. package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js.map +1 -1
  36. package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js +4 -7
  37. package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js.map +1 -1
  38. package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js +4 -4
  39. package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js.map +1 -1
  40. package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js +4 -4
  41. package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js.map +1 -1
  42. package/dist-server/graphql/resolvers/worksheet/sorting-worksheet.js +6 -0
  43. package/dist-server/graphql/resolvers/worksheet/sorting-worksheet.js.map +1 -1
  44. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js +4 -5
  45. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js.map +1 -1
  46. package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js +4 -2
  47. package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js.map +1 -1
  48. package/dist-server/graphql/types/worksheet/find-release-orders-by-task-no.js +11 -0
  49. package/dist-server/graphql/types/worksheet/find-release-orders-by-task-no.js.map +1 -0
  50. package/dist-server/graphql/types/worksheet/index.js +14 -4
  51. package/dist-server/graphql/types/worksheet/index.js.map +1 -1
  52. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js +2 -0
  53. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js.map +1 -1
  54. package/dist-server/graphql/types/worksheet-detail/index.js +0 -2
  55. package/dist-server/graphql/types/worksheet-detail/index.js.map +1 -1
  56. package/dist-server/utils/inventory-util.js +14 -25
  57. package/dist-server/utils/inventory-util.js.map +1 -1
  58. package/package.json +17 -17
  59. package/server/controllers/inbound/unloading-worksheet-controller.ts +2 -0
  60. package/server/controllers/outbound/packing-worksheet-controller.ts +217 -11
  61. package/server/controllers/outbound/picking-worksheet-controller.ts +66 -34
  62. package/server/controllers/outbound/returning-worksheet-controller.ts +7 -1
  63. package/server/controllers/outbound/sorting-worksheet-controller.ts +149 -4
  64. package/server/controllers/render-grn.ts +39 -5
  65. package/server/controllers/render-orientage-do.ts +11 -11
  66. package/server/controllers/render-orientage-grn.ts +12 -11
  67. package/server/controllers/render-ro-do.ts +93 -8
  68. package/server/controllers/worksheet-controller.ts +2 -1
  69. package/server/graphql/resolvers/worksheet/find-release-orders-by-task-no.ts +35 -2
  70. package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +2 -0
  71. package/server/graphql/resolvers/worksheet/packing/index.ts +3 -1
  72. package/server/graphql/resolvers/worksheet/packing/packing.ts +5 -4
  73. package/server/graphql/resolvers/worksheet/packing/scan-product-packing.ts +9 -4
  74. package/server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.ts +24 -0
  75. package/server/graphql/resolvers/worksheet/packing-worksheet.ts +166 -144
  76. package/server/graphql/resolvers/worksheet/picking/assign-picking-worker.ts +15 -11
  77. package/server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.ts +5 -7
  78. package/server/graphql/resolvers/worksheet/sorting/scan-product-sorting.ts +5 -4
  79. package/server/graphql/resolvers/worksheet/sorting/sorting-product.ts +5 -4
  80. package/server/graphql/resolvers/worksheet/sorting-worksheet.ts +6 -0
  81. package/server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.ts +10 -12
  82. package/server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.ts +4 -2
  83. package/server/graphql/types/worksheet/find-release-orders-by-task-no.ts +8 -0
  84. package/server/graphql/types/worksheet/index.ts +14 -4
  85. package/server/graphql/types/worksheet/worksheet-detail-info.ts +2 -0
  86. package/server/graphql/types/worksheet-detail/index.ts +0 -2
  87. package/server/utils/inventory-util.ts +15 -23
@@ -9,9 +9,9 @@ import { PackingWorksheetController, SellercraftController } from '../../../../c
9
9
  import { Worksheet } from '../../../../entities'
10
10
 
11
11
  export const packingResolver = {
12
- async packing(_: any, { worksheetDetailName, releaseQty }, context: any) {
12
+ async packing(_: any, { worksheetDetailName, releaseQty, serialNumber }, context: any) {
13
13
  const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
14
- await packing(tx, domain, user, worksheetDetailName, releaseQty)
14
+ await packing(tx, domain, user, worksheetDetailName, releaseQty, serialNumber)
15
15
  }
16
16
  }
17
17
 
@@ -20,10 +20,11 @@ export async function packing(
20
20
  domain: Domain,
21
21
  user: User,
22
22
  worksheetDetailName: string,
23
- releaseQty: number
23
+ releaseQty: number,
24
+ serialNumber: string
24
25
  ) {
25
26
  const worksheetController: PackingWorksheetController = new PackingWorksheetController(tx, domain, user)
26
- const worksheetDetail = await worksheetController.packing(worksheetDetailName, releaseQty)
27
+ const worksheetDetail = await worksheetController.packing(worksheetDetailName, releaseQty, serialNumber)
27
28
 
28
29
  let releaseGood: ReleaseGood = worksheetDetail.targetInventory.releaseGood
29
30
  const worksheet: Worksheet = worksheetDetail.worksheet
@@ -9,9 +9,9 @@ import { PackingWorksheetController, SellercraftController } from '../../../../c
9
9
  import { Worksheet } from '../../../../entities'
10
10
 
11
11
  export const scanProductPackingResolver = {
12
- async scanProductPacking(_: any, { worksheetDetailName, productBarcode }, context: any) {
12
+ async scanProductPacking(_: any, { worksheetDetailName, productBarcode, serialNumber }, context: any) {
13
13
  const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
14
- await scanProductPacking(tx, domain, user, worksheetDetailName, productBarcode)
14
+ await scanProductPacking(tx, domain, user, worksheetDetailName, productBarcode, serialNumber)
15
15
  }
16
16
  }
17
17
 
@@ -20,10 +20,15 @@ export async function scanProductPacking(
20
20
  domain: Domain,
21
21
  user: User,
22
22
  worksheetDetailName: string,
23
- productBarcode: string
23
+ productBarcode: string,
24
+ serialNumber?: string
24
25
  ) {
25
26
  const worksheetController: PackingWorksheetController = new PackingWorksheetController(tx, domain, user)
26
- const worksheetDetail = await worksheetController.scanProductPacking(worksheetDetailName, productBarcode)
27
+ const worksheetDetail = await worksheetController.scanProductPacking(
28
+ worksheetDetailName,
29
+ productBarcode,
30
+ serialNumber
31
+ )
27
32
 
28
33
  let releaseGood: ReleaseGood = worksheetDetail.targetInventory.releaseGood
29
34
  const worksheet: Worksheet = worksheetDetail.worksheet
@@ -0,0 +1,24 @@
1
+ import { EntityManager } from 'typeorm'
2
+
3
+ import { User } from '@things-factory/auth-base'
4
+ import { Domain } from '@things-factory/shell'
5
+
6
+ import { PackingWorksheetController } from '../../../../controllers'
7
+
8
+ export const undoSerialNumberPackingResolver = {
9
+ async undoSerialNumberPacking(_: any, { worksheetDetailName, inventoryItemId }, context: any) {
10
+ const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
11
+ await undoSerialNumberPacking(tx, domain, user, worksheetDetailName, inventoryItemId)
12
+ }
13
+ }
14
+
15
+ async function undoSerialNumberPacking(
16
+ tx: EntityManager,
17
+ domain: Domain,
18
+ user: User,
19
+ worksheetDetailName: string,
20
+ inventoryItemId: string
21
+ ): Promise<void> {
22
+ const worksheetController: PackingWorksheetController = new PackingWorksheetController(tx, domain, user)
23
+ await worksheetController.undoSerialNumberPacking(worksheetDetailName, inventoryItemId)
24
+ }
@@ -20,164 +20,186 @@ import { fetchExecutingWorksheet } from '../../../utils'
20
20
 
21
21
  export const packingWorksheetResolver = {
22
22
  async packingWorksheet(_: any, { releaseGoodNo }, context: any) {
23
- const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
24
- let releaseGood: ReleaseGood = await tx.getRepository(ReleaseGood).findOne({
25
- where: {
26
- domain,
27
- name: releaseGoodNo
28
- },
29
- relations: ['bizplace', 'bizplace.domain']
30
- })
31
-
32
- // Find Release Order based on Bin
33
- if (!releaseGood) {
34
- const binLocation: Location = await tx.getRepository(Location).findOne({
35
- where: { domain, name: releaseGoodNo }
23
+ try {
24
+ const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
25
+ let releaseGood: ReleaseGood = await tx.getRepository(ReleaseGood).findOne({
26
+ where: {
27
+ domain,
28
+ name: releaseGoodNo
29
+ },
30
+ relations: ['bizplace', 'bizplace.domain']
36
31
  })
37
32
 
38
- const qb: SelectQueryBuilder<OrderInventory> = tx
39
- .getRepository(OrderInventory)
40
- .createQueryBuilder('orderInventory')
41
- qb.innerJoinAndSelect('orderInventory.releaseGood', 'releaseGood')
42
- .innerJoinAndSelect('releaseGood.bizplace', 'bizplace')
43
- .innerJoinAndSelect('bizplace.domain', 'domain')
44
- .where('orderInventory.domain_id = :domainId', { domainId: domain.id })
45
- .andWhere('orderInventory.status IN (:...orderInventoryStatus)', {
46
- orderInventoryStatus: [ORDER_INVENTORY_STATUS.PACKING, ORDER_INVENTORY_STATUS.PACKED]
33
+ // Find Release Order based on Bin
34
+ if (!releaseGood) {
35
+ const binLocation: Location = await tx.getRepository(Location).findOne({
36
+ where: { domain, name: releaseGoodNo }
47
37
  })
48
- .andWhere('orderInventory.bin_location_id = :locationId', { locationId: binLocation.id })
49
- .andWhere('releaseGood.status = :status', { status: ORDER_STATUS.PACKING })
50
38
 
51
- const orderInventoryByBin = await qb.getOne()
52
- if (orderInventoryByBin?.releaseGood) {
53
- releaseGoodNo = orderInventoryByBin.releaseGood.name
54
- releaseGood = orderInventoryByBin.releaseGood
39
+ if (binLocation) {
40
+ const qb: SelectQueryBuilder<OrderInventory> = tx
41
+ .getRepository(OrderInventory)
42
+ .createQueryBuilder('orderInventory')
43
+
44
+ qb.innerJoinAndSelect('orderInventory.releaseGood', 'releaseGood')
45
+ .innerJoinAndSelect('releaseGood.bizplace', 'bizplace')
46
+ .innerJoinAndSelect('bizplace.domain', 'domain')
47
+ .innerJoinAndSelect(
48
+ 'worksheets',
49
+ 'ws',
50
+ `orderInventory.release_good_id = ws.release_good_id AND ws.type = 'PACKING' AND ws.status = 'EXECUTING'`
51
+ )
52
+ .where('orderInventory.domain_id = :domainId', { domainId: domain.id })
53
+ .andWhere('orderInventory.status IN (:...orderInventoryStatus)', {
54
+ orderInventoryStatus: [
55
+ ORDER_INVENTORY_STATUS.READY_TO_PACK,
56
+ ORDER_INVENTORY_STATUS.PACKING,
57
+ ORDER_INVENTORY_STATUS.PACKED
58
+ ]
59
+ })
60
+ .andWhere('orderInventory.bin_location_id = :locationId', { locationId: binLocation.id })
61
+ .andWhere('releaseGood.status IN (:...status)', {
62
+ status: [ORDER_STATUS.READY_TO_PACK, ORDER_STATUS.PACKING]
63
+ })
64
+
65
+ const orderInventoryByBin = await qb.getOne()
66
+ if (orderInventoryByBin?.releaseGood) {
67
+ releaseGoodNo = orderInventoryByBin.releaseGood.name
68
+ releaseGood = orderInventoryByBin.releaseGood
69
+ } else {
70
+ throw new Error(`Bin do not have any existing order.`)
71
+ }
72
+ }
55
73
  }
56
- }
57
74
 
58
- if (!releaseGood) throw new Error(`Release good dosen't exist.`)
59
-
60
- const worksheet: Worksheet = await fetchExecutingWorksheet(
61
- domain,
62
- releaseGood.bizplace,
63
- [
64
- 'bizplace',
65
- 'bizplace.domain',
66
- 'releaseGood',
67
- 'releaseGood.domain',
68
- 'worksheetDetails',
69
- 'worksheetDetails.targetInventory',
70
- 'worksheetDetails.targetInventory.binLocation',
71
- 'worksheetDetails.targetInventory.inventory',
72
- 'worksheetDetails.targetInventory.inventory.location',
73
- 'worksheetDetails.targetInventory.inventory.product',
74
- 'worksheetDetails.targetInventory.inventory.product.productDetails',
75
- 'worksheetDetails.toLocation'
76
- ],
77
- WORKSHEET_TYPE.PACKING,
78
- releaseGood
79
- )
80
-
81
- let marketplaceOrder: MarketplaceOrder
82
- let marketplaceOrderItems: MarketplaceOrderItem[] = []
83
- let marketplaceStore
84
- let trackingNo: string
85
- let shippingProvider: string
86
- let marketplaceStatus: string
87
-
88
- if (releaseGood.type === 'b2c') {
89
- const sellercraft: Sellercraft = await tx.getRepository(Sellercraft).findOne({
90
- domain: worksheet.bizplace.domain,
91
- status: SellercraftStatus.ACTIVE
92
- })
75
+ if (!releaseGood) throw new Error(`Release good do not exist.`)
93
76
 
94
- if (sellercraft) {
95
- if (!releaseGood?.airwayBill) {
96
- const sellercraftCtrl: SellercraftController = new SellercraftController(tx, domain, user)
97
- releaseGood = await sellercraftCtrl.fetchOrderDocument(sellercraft, releaseGood)
98
- }
99
- trackingNo = releaseGood?.trackingNo
100
- shippingProvider = releaseGood?.transporter
101
- marketplaceStatus = releaseGood?.marketplaceOrderStatus
102
- } else {
103
- marketplaceOrder = await tx.getRepository(MarketplaceOrder).findOne({
104
- where: { orderNo: releaseGood.refNo },
105
- relations: [
106
- 'domain',
107
- 'marketplaceStore',
108
- 'marketplaceOrderItems',
109
- 'marketplaceOrderItems.marketplaceOrderShippingItems',
110
- 'marketplaceOrderItems.marketplaceOrderShippingItems.marketplaceOrderShipping'
111
- ]
77
+ const worksheet: Worksheet = await fetchExecutingWorksheet(
78
+ domain,
79
+ releaseGood.bizplace,
80
+ [
81
+ 'bizplace',
82
+ 'bizplace.domain',
83
+ 'releaseGood',
84
+ 'releaseGood.domain',
85
+ 'worksheetDetails',
86
+ 'worksheetDetails.targetInventory',
87
+ 'worksheetDetails.targetInventory.binLocation',
88
+ 'worksheetDetails.targetInventory.inventory',
89
+ 'worksheetDetails.targetInventory.inventory.location',
90
+ 'worksheetDetails.targetInventory.inventory.product',
91
+ 'worksheetDetails.targetInventory.inventory.product.productDetails',
92
+ 'worksheetDetails.toLocation'
93
+ ],
94
+ WORKSHEET_TYPE.PACKING,
95
+ releaseGood
96
+ )
97
+
98
+ let marketplaceOrder: MarketplaceOrder
99
+ let marketplaceOrderItems: MarketplaceOrderItem[] = []
100
+ let marketplaceStore
101
+ let trackingNo: string
102
+ let shippingProvider: string
103
+ let marketplaceStatus: string
104
+
105
+ if (releaseGood.type === 'b2c') {
106
+ const sellercraft: Sellercraft = await tx.getRepository(Sellercraft).findOne({
107
+ domain: worksheet.bizplace.domain,
108
+ status: SellercraftStatus.ACTIVE
112
109
  })
113
110
 
114
- if (!marketplaceOrder) {
115
- throw new Error('Failed to retrieve ecommerce information, kindly contact our support team for this issue.')
116
- }
117
-
118
- let marketplaceOrderShipping: MarketplaceOrderShipping
119
- if (marketplaceOrder.isSplitted) {
120
- marketplaceOrderShipping = await tx.getRepository(MarketplaceOrderShipping).findOne({
121
- where: { subOrderNoRef: worksheet.releaseGood.refNo2 }
122
- })
111
+ if (sellercraft) {
112
+ if (!releaseGood?.airwayBill) {
113
+ const sellercraftCtrl: SellercraftController = new SellercraftController(tx, domain, user)
114
+ releaseGood = await sellercraftCtrl.fetchOrderDocument(sellercraft, releaseGood)
115
+ }
116
+ trackingNo = releaseGood?.trackingNo
117
+ shippingProvider = releaseGood?.transporter
118
+ marketplaceStatus = releaseGood?.marketplaceOrderStatus
123
119
  } else {
124
- marketplaceOrderShipping = await tx.getRepository(MarketplaceOrderShipping).findOne({
125
- where: { orderNoRef: worksheet.releaseGood.refNo }
120
+ marketplaceOrder = await tx.getRepository(MarketplaceOrder).findOne({
121
+ where: { orderNo: releaseGood.refNo },
122
+ relations: [
123
+ 'domain',
124
+ 'marketplaceStore',
125
+ 'marketplaceOrderItems',
126
+ 'marketplaceOrderItems.marketplaceOrderShippingItems',
127
+ 'marketplaceOrderItems.marketplaceOrderShippingItems.marketplaceOrderShipping'
128
+ ]
126
129
  })
127
- }
128
130
 
129
- trackingNo = marketplaceOrderShipping.ownTrackingNo
130
- ? marketplaceOrderShipping.ownTrackingNo
131
- : marketplaceOrderShipping.trackingNo
132
- shippingProvider = marketplaceOrderShipping.ownTransporter
133
- ? marketplaceOrderShipping.ownTransporter
134
- : marketplaceOrderShipping.transporter
135
-
136
- marketplaceStore = marketplaceOrder?.marketplaceStore
137
- marketplaceStatus = marketplaceOrder?.status
131
+ if (!marketplaceOrder) {
132
+ throw new Error('Failed to retrieve ecommerce information, kindly contact our support team for this issue.')
133
+ }
134
+
135
+ let marketplaceOrderShipping: MarketplaceOrderShipping
136
+ if (marketplaceOrder.isSplitted) {
137
+ marketplaceOrderShipping = await tx.getRepository(MarketplaceOrderShipping).findOne({
138
+ where: { subOrderNoRef: worksheet.releaseGood.refNo2 }
139
+ })
140
+ } else {
141
+ marketplaceOrderShipping = await tx.getRepository(MarketplaceOrderShipping).findOne({
142
+ where: { orderNoRef: worksheet.releaseGood.refNo }
143
+ })
144
+ }
145
+
146
+ trackingNo = marketplaceOrderShipping.ownTrackingNo
147
+ ? marketplaceOrderShipping.ownTrackingNo
148
+ : marketplaceOrderShipping.trackingNo
149
+ shippingProvider = marketplaceOrderShipping.ownTransporter
150
+ ? marketplaceOrderShipping.ownTransporter
151
+ : marketplaceOrderShipping.transporter
152
+
153
+ marketplaceStore = marketplaceOrder?.marketplaceStore
154
+ marketplaceStatus = marketplaceOrder?.status
155
+ }
138
156
  }
139
- }
140
157
 
141
- return {
142
- worksheetInfo: {
143
- releaseGood,
144
- bizplaceName: releaseGood.bizplace.name,
145
- refNo: releaseGood.refNo,
146
- refNo2: releaseGood.refNo2,
147
- refNo3: releaseGood.refNo3,
148
- partnerDomainId: releaseGood.bizplace?.domain.id,
149
- startedAt: worksheet.startedAt,
150
- shippingProvider: shippingProvider ? shippingProvider : '',
151
- trackingNo: trackingNo ? trackingNo : '',
152
- airwayBill: releaseGood?.airwayBill,
153
- invoice: releaseGood?.invoice,
154
- platform: marketplaceOrder ? marketplaceOrder.marketplaceStore.platform : 'operato',
155
- marketplaceStoreId: marketplaceOrder ? marketplaceOrder.marketplaceStore.id : '',
156
- marketplaceStatus: marketplaceStatus ? marketplaceStatus : '',
157
- marketplaceOrder: marketplaceOrder ? marketplaceOrder : ''
158
- },
159
- worksheetDetailInfos: worksheet.worksheetDetails.map(async (packingWSD: WorksheetDetail) => {
160
- const targetInventory: OrderInventory = packingWSD.targetInventory
161
- const inventory: Inventory = targetInventory.inventory
162
- return {
163
- name: packingWSD.name,
164
- palletId: inventory.palletId,
165
- cartonId: inventory.cartonId,
166
- batchId: inventory.batchId,
167
- batchIdRef: inventory.batchIdRef,
168
- product: inventory.product,
169
- sku: inventory.product.sku,
170
- releaseQty: targetInventory.releaseQty,
171
- packedQty: targetInventory.packedQty,
172
- status: packingWSD.status,
173
- description: packingWSD.description,
174
- targetName: targetInventory.name,
175
- packingType: inventory.packingType,
176
- packingSize: inventory.packingSize,
177
- binLocation: targetInventory?.binLocation,
178
- location: inventory.location
179
- }
180
- })
158
+ return {
159
+ worksheetInfo: {
160
+ releaseGood,
161
+ bizplaceName: releaseGood.bizplace.name,
162
+ refNo: releaseGood.refNo,
163
+ refNo2: releaseGood.refNo2,
164
+ refNo3: releaseGood.refNo3,
165
+ partnerDomainId: releaseGood.bizplace?.domain.id,
166
+ startedAt: worksheet.startedAt,
167
+ shippingProvider: shippingProvider ? shippingProvider : '',
168
+ trackingNo: trackingNo ? trackingNo : '',
169
+ airwayBill: releaseGood?.airwayBill,
170
+ invoice: releaseGood?.invoice,
171
+ platform: marketplaceOrder ? marketplaceOrder.marketplaceStore.platform : 'operato',
172
+ marketplaceStoreId: marketplaceOrder ? marketplaceOrder.marketplaceStore.id : '',
173
+ marketplaceStatus: marketplaceStatus ? marketplaceStatus : '',
174
+ marketplaceOrder: marketplaceOrder ? marketplaceOrder : ''
175
+ },
176
+ worksheetDetailInfos: worksheet.worksheetDetails.map(async (packingWSD: WorksheetDetail) => {
177
+ const targetInventory: OrderInventory = packingWSD.targetInventory
178
+ const inventory: Inventory = targetInventory.inventory
179
+ return {
180
+ name: packingWSD.name,
181
+ palletId: inventory.palletId,
182
+ cartonId: inventory.cartonId,
183
+ batchId: inventory.batchId,
184
+ batchIdRef: inventory.batchIdRef,
185
+ product: inventory.product,
186
+ sku: inventory.product.sku,
187
+ releaseQty: targetInventory.releaseQty,
188
+ packedQty: targetInventory.packedQty,
189
+ status: packingWSD.status,
190
+ description: packingWSD.description,
191
+ targetName: targetInventory.name,
192
+ packingType: inventory.packingType,
193
+ packingSize: inventory.packingSize,
194
+ binLocation: targetInventory?.binLocation,
195
+ location: inventory.location,
196
+ relatedOrderInv: targetInventory
197
+ }
198
+ })
199
+ }
200
+ } catch (error) {
201
+ console.error(error)
202
+ throw error
181
203
  }
182
204
  }
183
205
  }
@@ -7,7 +7,7 @@ import { Worksheet } from '../../../../entities'
7
7
  export const assignPickingWorkerResolver = {
8
8
  async assignPickingWorker(
9
9
  _parentObj: void,
10
- { worksheetId, userId }: { worksheetId: string; userId: string },
10
+ { worksheetId, userId }: { worksheetId: [string]; userId: string },
11
11
  context: any
12
12
  ): Promise<void> {
13
13
  const { tx, domain }: { tx: EntityManager; domain: Domain } = context.state
@@ -17,16 +17,20 @@ export const assignPickingWorkerResolver = {
17
17
 
18
18
  if (!assignee) throw new Error('failed to find target user')
19
19
 
20
- const worksheet: Worksheet = await tx.getRepository(Worksheet).findOne({
21
- id: worksheetId,
22
- type: WORKSHEET_TYPE.PICKING
23
- })
20
+ await Promise.all(worksheetId.map(async (worksheetId)=>{
21
+ const worksheet: Worksheet = await tx.getRepository(Worksheet).findOne({
22
+ id: worksheetId,
23
+ },{where: [{
24
+ type:WORKSHEET_TYPE.BATCH_PICKING
25
+ },{type:WORKSHEET_TYPE.PICKING}]})
26
+
27
+ if (!worksheet) throw new Error('failed to find target picking worksheet')
28
+ if (worksheet.status !== WORKSHEET_STATUS.DEACTIVATED)
29
+ throw new Error(`current status of worksheet is not able to assign worker`)
30
+
31
+ worksheet.assignee = assignee
32
+ await tx.getRepository(Worksheet).save(worksheet)
24
33
 
25
- if (!worksheet) throw new Error('failed to find target picking worksheet')
26
- if (worksheet.status !== WORKSHEET_STATUS.DEACTIVATED)
27
- throw new Error(`current status of worksheet is not able to assign worker`)
28
-
29
- worksheet.assignee = assignee
30
- await tx.getRepository(Worksheet).save(worksheet)
34
+ }))
31
35
  }
32
36
  }
@@ -1,5 +1,4 @@
1
1
  import { getDomainUsers, User } from '@things-factory/auth-base'
2
- import { Bizplace } from '@things-factory/biz-base'
3
2
  import { Domain } from '@things-factory/shell'
4
3
  import { FindManyOptions, getRepository, ILike, In } from 'typeorm'
5
4
  import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../../../constants'
@@ -10,7 +9,7 @@ type AssignmentStatusByUserType = { user: User; pending?: Worksheet[]; picking?:
10
9
  export const pickingAssignmentStatusByUsersResolver = {
11
10
  async pickingAssignmentStatusByUsers(
12
11
  _: void,
13
- { bizplaceId, name, email }: { bizplaceId: string; name?: string; email?: string },
12
+ { name, email }: { name?: string; email?: string },
14
13
  context: any
15
14
  ): Promise<AssignmentStatusByUserType[]> {
16
15
  const { domain }: { domain: Domain } = context.state
@@ -19,20 +18,19 @@ export const pickingAssignmentStatusByUsersResolver = {
19
18
  const domainUserIds: string[] = domainUsers
20
19
  .filter((user: User) => user.userType === 'user')
21
20
  .map((user: User) => user.id)
21
+
22
22
  const findOneOption: FindManyOptions<User> = { where: { id: In(domainUserIds) } }
23
23
  if (name) findOneOption.where.name = ILike(`%${name}%`)
24
24
  if (email) findOneOption.where.email = ILike(`%${email}%`)
25
25
 
26
26
  const users: User[] = await getRepository(User).find(findOneOption)
27
27
 
28
- const bizplace: Bizplace = await getRepository(Bizplace).findOne(bizplaceId)
29
28
  const assignedPickingWorksheets: Worksheet[] = await getRepository(Worksheet).find({
30
29
  where: {
31
- domain,
32
- bizplace,
33
- type: WORKSHEET_TYPE.PICKING,
30
+ type: In([WORKSHEET_TYPE.PICKING, WORKSHEET_TYPE.BATCH_PICKING]),
34
31
  status: In([WORKSHEET_STATUS.DEACTIVATED, WORKSHEET_STATUS.EXECUTING]),
35
- assignee: In(users.map((u: User) => u.id))
32
+ assignee: In(users.map((u: User) => u.id)),
33
+ domain
36
34
  },
37
35
  relations: ['assignee']
38
36
  })
@@ -4,9 +4,9 @@ import { EntityManager } from 'typeorm'
4
4
  import { SortingWorksheetController } from '../../../../controllers'
5
5
 
6
6
  export const scanProductSortingResolver = {
7
- async scanProductSorting(_: any, { taskNo, releaseGoodNo, productBarcode }, context: any) {
7
+ async scanProductSorting(_: any, { taskNo, releaseGoodNo, productBarcode, serialNumber }, context: any) {
8
8
  const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
9
- await scanProductSorting(tx, domain, user, taskNo, releaseGoodNo, productBarcode)
9
+ await scanProductSorting(tx, domain, user, taskNo, releaseGoodNo, productBarcode, serialNumber)
10
10
  }
11
11
  }
12
12
 
@@ -16,8 +16,9 @@ export async function scanProductSorting(
16
16
  user: User,
17
17
  taskNo: string,
18
18
  releaseGoodNo: string,
19
- productBarcode?: string
19
+ productBarcode?: string,
20
+ serialNumber?: string
20
21
  ) {
21
22
  const worksheetController: SortingWorksheetController = new SortingWorksheetController(tx, domain, user)
22
- await worksheetController.scanProductSorting(taskNo, releaseGoodNo, productBarcode)
23
+ await worksheetController.scanProductSorting(taskNo, releaseGoodNo, productBarcode, serialNumber)
23
24
  }
@@ -4,9 +4,9 @@ import { EntityManager } from 'typeorm'
4
4
  import { SortingWorksheetController } from '../../../../controllers'
5
5
 
6
6
  export const sortingProductResolver = {
7
- async sortingProduct(_: any, { taskNo, releaseGoodNo, productId, sortingQty }, context: any) {
7
+ async sortingProduct(_: any, { taskNo, releaseGoodNo, productId, sortingQty, serialNumber }, context: any) {
8
8
  const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
9
- await sortingProduct(tx, domain, user, taskNo, releaseGoodNo, productId, sortingQty)
9
+ await sortingProduct(tx, domain, user, taskNo, releaseGoodNo, productId, sortingQty, serialNumber)
10
10
  }
11
11
  }
12
12
 
@@ -17,8 +17,9 @@ export async function sortingProduct(
17
17
  taskNo: string,
18
18
  releaseGoodNo: string,
19
19
  productId: string,
20
- sortingQty: number
20
+ sortingQty: number,
21
+ serialNumber?: string
21
22
  ) {
22
23
  const worksheetController: SortingWorksheetController = new SortingWorksheetController(tx, domain, user)
23
- await worksheetController.sortingProduct(taskNo, releaseGoodNo, productId, sortingQty)
24
+ await worksheetController.sortingProduct(taskNo, releaseGoodNo, productId, sortingQty, serialNumber)
24
25
  }
@@ -26,22 +26,26 @@ export const sortingWorksheetResolver = {
26
26
  const qb: SelectQueryBuilder<OrderInventory> = getRepository(OrderInventory).createQueryBuilder('OI')
27
27
  qb.select('SUM(OI.releaseQty)', 'releaseQty')
28
28
  .addSelect('SUM(OI.sortedQty)', 'sortedQty')
29
+ .addSelect(`string_agg(CONCAT(BIN.name, '(', OI.releaseQty, ')' ), ' ')`, 'binRemarks')
29
30
  .addSelect('PROD.id', 'productId')
30
31
  .addSelect('PROD.name', 'productName')
31
32
  .addSelect('PROD.sku', 'productSku')
32
33
  .addSelect('PROD.description', 'productDescription')
34
+ .addSelect('PROD.isRequireSerialNumberScanningOutbound', 'isRequireSerialNumberScanningOutbound')
33
35
  .addSelect('OI.batch_id', 'batchId')
34
36
  .addSelect('OI.packing_type', 'packingType')
35
37
  .addSelect('OI.packing_size', 'packingSize')
36
38
  .addSelect('INV.expiration_date', 'expirationDate')
37
39
  .leftJoin('OI.product', 'PROD')
38
40
  .leftJoin('OI.inventory', 'INV')
41
+ .leftJoin('OI.binLocation', 'BIN')
39
42
  .where('OI.release_good_id = :releaseGoodId', { releaseGoodId: releaseGood?.id })
40
43
  .andWhere('OI.status <> :releaseGoodStatus', { releaseGoodStatus: ORDER_INVENTORY_STATUS.COMPLETE_SPLIT })
41
44
  .groupBy('PROD.id')
42
45
  .addGroupBy('PROD.name')
43
46
  .addGroupBy('PROD.sku')
44
47
  .addGroupBy('PROD.description')
48
+ .addGroupBy('PROD.isRequireSerialNumberScanningOutbound')
45
49
  .addGroupBy('INV.expiration_date')
46
50
  .addGroupBy('OI.batch_id')
47
51
  .addGroupBy('OI.packing_type')
@@ -67,12 +71,14 @@ export const sortingWorksheetResolver = {
67
71
  productSku: item?.productSku,
68
72
  productName: item?.productName,
69
73
  productDescription: item?.productDescription,
74
+ isRequireSerialNumberScanningOutbound: item?.isRequireSerialNumberScanningOutbound,
70
75
  releaseQty: item.releaseQty,
71
76
  sortedQty: item.sortedQty,
72
77
  status: item.status,
73
78
  expirationDate: item?.expirationDate,
74
79
  packingType: item?.packingType,
75
80
  packingSize: item?.packingSize,
81
+ binRemarks: item?.binRemarks,
76
82
  releaseGood
77
83
  }
78
84
  })
@@ -1,20 +1,19 @@
1
- import { Product } from '@things-factory/product-base'
2
- import { OrderInventory, OrderNoGenerator, ORDER_INVENTORY_STATUS, ORDER_TYPES } from '@things-factory/sales-base'
3
- import { Inventory } from '@things-factory/warehouse-base'
1
+ import { EntityManager, getRepository } from 'typeorm'
2
+
3
+ import { User } from '@things-factory/auth-base'
4
+ import { ORDER_INVENTORY_STATUS, ORDER_TYPES, OrderInventory, OrderNoGenerator } from '@things-factory/sales-base'
4
5
  import { Setting } from '@things-factory/setting-base'
5
- import { EntityManager, In, getRepository } from 'typeorm'
6
+ import { Domain } from '@things-factory/shell'
7
+ import { Inventory } from '@things-factory/warehouse-base'
8
+
6
9
  import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../../constants'
7
10
  import { Worksheet, WorksheetDetail } from '../../../entities'
8
- import { WorksheetNoGenerator, inventoriesByStrategy } from '../../../utils'
9
- import { User } from '@things-factory/auth-base'
10
- import { Domain } from '@things-factory/shell'
11
- import { generateBatchPickingWorksheetDetailsResolver } from './generate-batch-picking-worksheet-details'
12
- import orderBy from 'lodash/orderBy'
11
+ import { inventoriesByStrategy, WorksheetNoGenerator } from '../../../utils'
13
12
 
14
13
  export const generateBatchPickingWorksheetDetailsByBulkResolver = {
15
14
  async generateBatchPickingWorksheetDetailsByBulk(
16
15
  _: any,
17
- { worksheetId, bizplaceId, selectedItems, pickingStrategy },
16
+ { worksheetId, bizplaceId, selectedItems },
18
17
  context: any
19
18
  ): Promise<Boolean> {
20
19
  const { tx, user, domain }: { tx: EntityManager; user: User; domain: Domain } = context.state
@@ -50,7 +49,7 @@ export const generateBatchPickingWorksheetDetailsByBulkResolver = {
50
49
  })
51
50
 
52
51
  await Promise.all(
53
- selectedItems.map(async (oi: OrderInventory) => {
52
+ selectedItems.map(async (oi: OrderInventory & { pickingStrategy: string }) => {
54
53
  try {
55
54
  let pOrderInventories = tx.getRepository(OrderInventory).find({
56
55
  where: {
@@ -72,7 +71,6 @@ export const generateBatchPickingWorksheetDetailsByBulkResolver = {
72
71
  ...oi,
73
72
  worksheetId: worksheet.id,
74
73
  bizplaceId,
75
- pickingStrategy,
76
74
  locationSortingRules: inventoryAssignmentSetting ? JSON.parse(inventoryAssignmentSetting.value) : false
77
75
  },
78
76
  domain,