@things-factory/worksheet-base 4.3.60 → 4.3.64

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 (67) hide show
  1. package/dist-server/controllers/outbound/picking-worksheet-controller.js +69 -92
  2. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  3. package/dist-server/controllers/outbound/returning-worksheet-controller.js +16 -0
  4. package/dist-server/controllers/outbound/returning-worksheet-controller.js.map +1 -1
  5. package/dist-server/entities/worksheet-detail.js +2 -1
  6. package/dist-server/entities/worksheet-detail.js.map +1 -1
  7. package/dist-server/graphql/resolvers/worksheet/find-release-orders-by-task-no.js +1 -34
  8. package/dist-server/graphql/resolvers/worksheet/find-release-orders-by-task-no.js.map +1 -1
  9. package/dist-server/graphql/resolvers/worksheet/find-sorting-release-orders-by-task-no.js +70 -0
  10. package/dist-server/graphql/resolvers/worksheet/find-sorting-release-orders-by-task-no.js.map +1 -0
  11. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-batch-picking-worksheet.js +4 -4
  12. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-batch-picking-worksheet.js.map +1 -1
  13. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-release-good-worksheet.js +7 -3
  14. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-release-good-worksheet.js.map +1 -1
  15. package/dist-server/graphql/resolvers/worksheet/index.js +2 -1
  16. package/dist-server/graphql/resolvers/worksheet/index.js.map +1 -1
  17. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js +18 -8
  18. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js.map +1 -1
  19. package/dist-server/graphql/resolvers/worksheet/picking/activate-batch-picking.js +0 -32
  20. package/dist-server/graphql/resolvers/worksheet/picking/activate-batch-picking.js.map +1 -1
  21. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js +5 -0
  22. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js.map +1 -1
  23. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +5 -0
  24. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
  25. package/dist-server/graphql/resolvers/worksheet/picking/fetch-and-assign-picking-task.js +6 -2
  26. package/dist-server/graphql/resolvers/worksheet/picking/fetch-and-assign-picking-task.js.map +1 -1
  27. package/dist-server/graphql/resolvers/worksheet/picking/scan-product-batch-picking.js +4 -4
  28. package/dist-server/graphql/resolvers/worksheet/picking/scan-product-batch-picking.js.map +1 -1
  29. package/dist-server/graphql/resolvers/worksheet/picking/scan-product-picking.js +4 -4
  30. package/dist-server/graphql/resolvers/worksheet/picking/scan-product-picking.js.map +1 -1
  31. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js +1 -0
  32. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js.map +1 -1
  33. package/dist-server/graphql/resolvers/worksheet/worksheet.js +11 -3
  34. package/dist-server/graphql/resolvers/worksheet/worksheet.js.map +1 -1
  35. package/dist-server/graphql/resolvers/worksheet-detail/index.js +2 -1
  36. package/dist-server/graphql/resolvers/worksheet-detail/index.js.map +1 -1
  37. package/dist-server/graphql/resolvers/worksheet-detail/regenerate-release-good-worksheet-details.js +81 -0
  38. package/dist-server/graphql/resolvers/worksheet-detail/regenerate-release-good-worksheet-details.js.map +1 -0
  39. package/dist-server/graphql/types/worksheet/batch-pick-worksheet-info.js +12 -0
  40. package/dist-server/graphql/types/worksheet/batch-pick-worksheet-info.js.map +1 -0
  41. package/dist-server/graphql/types/worksheet/index.js +9 -4
  42. package/dist-server/graphql/types/worksheet/index.js.map +1 -1
  43. package/dist-server/graphql/types/worksheet-detail/index.js +10 -0
  44. package/dist-server/graphql/types/worksheet-detail/index.js.map +1 -1
  45. package/package.json +12 -12
  46. package/server/controllers/outbound/picking-worksheet-controller.ts +86 -111
  47. package/server/controllers/outbound/returning-worksheet-controller.ts +23 -0
  48. package/server/entities/worksheet-detail.ts +4 -0
  49. package/server/graphql/resolvers/worksheet/find-release-orders-by-task-no.ts +2 -42
  50. package/server/graphql/resolvers/worksheet/find-sorting-release-orders-by-task-no.ts +80 -0
  51. package/server/graphql/resolvers/worksheet/generate-worksheet/generate-batch-picking-worksheet.ts +7 -8
  52. package/server/graphql/resolvers/worksheet/generate-worksheet/generate-release-good-worksheet.ts +16 -20
  53. package/server/graphql/resolvers/worksheet/index.ts +2 -0
  54. package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +32 -11
  55. package/server/graphql/resolvers/worksheet/picking/activate-batch-picking.ts +1 -49
  56. package/server/graphql/resolvers/worksheet/picking/complete-batch-picking.ts +8 -0
  57. package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +6 -0
  58. package/server/graphql/resolvers/worksheet/picking/fetch-and-assign-picking-task.ts +4 -0
  59. package/server/graphql/resolvers/worksheet/picking/scan-product-batch-picking.ts +7 -4
  60. package/server/graphql/resolvers/worksheet/picking/scan-product-picking.ts +7 -4
  61. package/server/graphql/resolvers/worksheet/picking-worksheet.ts +5 -4
  62. package/server/graphql/resolvers/worksheet/worksheet.ts +16 -3
  63. package/server/graphql/resolvers/worksheet-detail/index.ts +3 -1
  64. package/server/graphql/resolvers/worksheet-detail/regenerate-release-good-worksheet-details.ts +164 -0
  65. package/server/graphql/types/worksheet/batch-pick-worksheet-info.ts +9 -0
  66. package/server/graphql/types/worksheet/index.ts +10 -5
  67. package/server/graphql/types/worksheet-detail/index.ts +10 -0
@@ -16,7 +16,8 @@ import {
16
16
  OrderToteItem,
17
17
  OrderToteSeal,
18
18
  OrderVas,
19
- ReleaseGood
19
+ ReleaseGood,
20
+ GenerateBatchPickInfo
20
21
  } from '@things-factory/sales-base'
21
22
  import { Setting } from '@things-factory/setting-base'
22
23
  import {
@@ -82,108 +83,86 @@ export class PickingWorksheetController extends VasWorksheetController {
82
83
  return worksheet
83
84
  }
84
85
 
85
- async generateBatchPickingWorksheet(releaseGoodNos: [string], partnerBizplaceId: string): Promise<Worksheet> {
86
- let releaseGoods: ReleaseGood[] = await this.trxMgr.getRepository(ReleaseGood).find({
87
- where: { domain: this.domain, name: In(releaseGoodNos), status: ORDER_STATUS.PENDING_WORKSHEET },
88
- relations: [
89
- 'orderProducts',
90
- 'orderProducts.product',
91
- 'orderInventories',
92
- 'orderInventories.inventory',
93
- 'bizplace',
94
- 'bizplace.domain'
95
- ]
96
- })
86
+ async generateBatchPickingWorksheet(releaseGoodWithBiz: [GenerateBatchPickInfo[]]): Promise<Worksheet[]> {
87
+ let worksheets = []
88
+
89
+ for (let i = 0; i < releaseGoodWithBiz.length; i++) {
90
+ let releaseGoodNos = releaseGoodWithBiz[i].map(itm => itm.releaseGoodNo)
91
+
92
+ let releaseGoods: ReleaseGood[] = await this.trxMgr.getRepository(ReleaseGood).find({
93
+ where: { domain: this.domain, name: In(releaseGoodNos), status: ORDER_STATUS.PENDING_WORKSHEET },
94
+ relations: [
95
+ 'orderProducts',
96
+ 'orderProducts.product',
97
+ 'orderInventories',
98
+ 'orderInventories.inventory',
99
+ 'bizplace',
100
+ 'bizplace.domain'
101
+ ]
102
+ })
97
103
 
98
- const partnerBizplace: Bizplace = await this.trxMgr.getRepository(Bizplace).findOne(partnerBizplaceId)
104
+ let orderInventories: OrderInventory[] = []
105
+ releaseGoods.map((releaseGood: ReleaseGood) => {
106
+ const foundOIs: OrderInventory[] = releaseGood.orderInventories
107
+ foundOIs.map((oi: OrderInventory) => {
108
+ orderInventories.push(oi)
109
+ })
110
+ })
99
111
 
100
- let orderInventories: OrderInventory[] = []
101
- releaseGoods.map((releaseGood: ReleaseGood) => {
102
- const foundOIs: OrderInventory[] = releaseGood.orderInventories
103
- foundOIs.map((oi: OrderInventory) => {
104
- orderInventories.push(oi)
112
+ const worksheetSetting: Setting = await this.trxMgr.getRepository(Setting).findOne({
113
+ where: {
114
+ domain: this.domain,
115
+ name: TASK_NUMBER_SETTING_KEY.TASK_NO_RULE
116
+ }
105
117
  })
106
- })
118
+ if (!worksheetSetting) throw new Error(this.ERROR_MSG.FIND.NO_RESULT('task number rule'))
107
119
 
108
- const worksheetSetting: Setting = await this.trxMgr.getRepository(Setting).findOne({
109
- where: {
120
+ let worksheet: Worksheet = new Worksheet()
121
+ worksheet.name = WorksheetNoGenerator.generate(WORKSHEET_TYPE.BATCH_PICKING)
122
+ worksheet.type = WORKSHEET_TYPE.BATCH_PICKING
123
+ worksheet.taskNo = await generateId({
110
124
  domain: this.domain,
111
- name: TASK_NUMBER_SETTING_KEY.TASK_NO_RULE
112
- }
113
- })
114
- if (!worksheetSetting) throw new Error(this.ERROR_MSG.FIND.NO_RESULT('task number rule'))
115
-
116
- let worksheet: Worksheet = new Worksheet()
117
- worksheet.name = WorksheetNoGenerator.generate(WORKSHEET_TYPE.BATCH_PICKING)
118
- worksheet.type = WORKSHEET_TYPE.BATCH_PICKING
119
- worksheet.taskNo = await generateId({
120
- domain: this.domain,
121
- type: TASK_NUMBER_RULE_TYPE.TASK_NO,
122
- seed: {}
123
- })
124
- worksheet.status = WORKSHEET_STATUS.DEACTIVATED
125
- worksheet.bizplace = partnerBizplace
126
- worksheet.domain = this.domain
127
- worksheet.creator = this.user
128
- worksheet.updater = this.user
129
- worksheet = await this.trxMgr.getRepository(Worksheet).save(worksheet)
130
-
131
- if (orderInventories.some((oi: OrderInventory) => oi.inventory?.id)) {
132
- const hasInventoryOIs: OrderInventory[] = orderInventories.filter(
133
- (orderInventory: OrderInventory) => orderInventory.inventory !== null
134
- )
135
-
136
- worksheet.worksheetDetails = await this.createWorksheetDetails(
137
- worksheet,
138
- WORKSHEET_TYPE.BATCH_PICKING,
139
- hasInventoryOIs
140
- )
141
- }
142
-
143
- orderInventories.forEach((oi: OrderInventory) => {
144
- oi.refWorksheetId = worksheet.id
145
- oi.status = oi.inventory?.id ? ORDER_INVENTORY_STATUS.READY_TO_PICK : ORDER_INVENTORY_STATUS.PENDING_SPLIT
146
- oi.updater = this.user
147
- })
148
- await this.updateOrderTargets(orderInventories)
125
+ type: TASK_NUMBER_RULE_TYPE.TASK_NO,
126
+ seed: {}
127
+ })
128
+ worksheet.status = WORKSHEET_STATUS.DEACTIVATED
129
+ worksheet.bizplace = releaseGoodWithBiz[i][0].bizplaceId
130
+ worksheet.domain = this.domain
131
+ worksheet.creator = this.user
132
+ worksheet.updater = this.user
133
+ worksheet = await this.trxMgr.getRepository(Worksheet).save(worksheet)
134
+
135
+ if (orderInventories.some((oi: OrderInventory) => oi.inventory?.id)) {
136
+ const hasInventoryOIs: OrderInventory[] = orderInventories.filter(
137
+ (orderInventory: OrderInventory) => orderInventory.inventory !== null
138
+ )
149
139
 
150
- releaseGoods = releaseGoods.map((releaseGood: ReleaseGood) => {
151
- return {
152
- ...releaseGood,
153
- status: ORDER_STATUS.READY_TO_PICK,
154
- updater: this.user
140
+ worksheet.worksheetDetails = await this.createWorksheetDetails(
141
+ worksheet,
142
+ WORKSHEET_TYPE.BATCH_PICKING,
143
+ hasInventoryOIs
144
+ )
155
145
  }
156
- })
157
- await this.trxMgr.getRepository(ReleaseGood).save(releaseGoods)
158
146
 
159
- //asynchronously save packageId if found
160
- Promise.all(
161
- releaseGoods.map(async ro => {
162
- if (ro?.packageId == null || ro?.packageId.trim() == '') {
163
- const sellercraft: Sellercraft = await getRepository(Sellercraft).findOne({ domain: ro.bizplace.domain })
164
- if (sellercraft) {
165
- try {
166
- await getConnection().transaction(async trx => {
167
- const sellercraftCtrl: SellercraftController = new SellercraftController(trx, this.domain, this.user)
168
- let packageInfo = await sellercraftCtrl.packOrder(sellercraft, {
169
- ...ro,
170
- orderProducts: ro.orderProducts
171
- })
172
-
173
- await trx.getRepository(ReleaseGood).update({ id: ro.id }, { packageId: packageInfo.packageId })
174
- })
175
- } catch (error) {
176
- logger.error(
177
- `picking-worksheet-controller:generateBatchPickingWorksheet[packageId][refNo: ${ro.refNo}, refNo2: ${
178
- ro.refNo2
179
- }]: ${JSON.stringify(error)}`
180
- )
181
- }
182
- }
147
+ orderInventories.forEach((oi: OrderInventory) => {
148
+ oi.refWorksheetId = worksheet.id
149
+ oi.status = oi.inventory?.id ? ORDER_INVENTORY_STATUS.READY_TO_PICK : ORDER_INVENTORY_STATUS.PENDING_SPLIT
150
+ oi.updater = this.user
151
+ })
152
+ await this.updateOrderTargets(orderInventories)
153
+
154
+ releaseGoods = releaseGoods.map((releaseGood: ReleaseGood) => {
155
+ return {
156
+ ...releaseGood,
157
+ status: ORDER_STATUS.READY_TO_PICK,
158
+ updater: this.user
183
159
  }
184
160
  })
185
- )
186
- return worksheet
161
+ await this.trxMgr.getRepository(ReleaseGood).save(releaseGoods)
162
+
163
+ worksheets.push(worksheet)
164
+ }
165
+ return worksheets
187
166
  }
188
167
 
189
168
  async generateBatchPickingWorksheetDetail(
@@ -443,7 +422,8 @@ export class PickingWorksheetController extends VasWorksheetController {
443
422
  cartonId: string,
444
423
  binLocation?: string,
445
424
  serialNumber?: string,
446
- toteNo?: string
425
+ toteNo?: string,
426
+ pickingQty?: number
447
427
  ): Promise<OrderInventory> {
448
428
  try {
449
429
  let worksheetDetail: WorksheetDetail = await this.findExecutableWorksheetDetailByName(
@@ -485,7 +465,7 @@ export class PickingWorksheetController extends VasWorksheetController {
485
465
  const packingType: string = inventory.packingType
486
466
  const packingSize: number = inventory.packingSize
487
467
 
488
- let pickedQty: number = 1
468
+ let pickedQty: number = pickingQty ? pickingQty : 1
489
469
  const releaseQty: number = targetInventory.releaseQty
490
470
 
491
471
  targetInventory = await this.checkAndSetBinPicking(targetInventory, binLocation)
@@ -510,14 +490,16 @@ export class PickingWorksheetController extends VasWorksheetController {
510
490
  parentDetail.packingType === packingType && parentDetail.packingSize == packingSize
511
491
  )
512
492
 
513
- pickedQty = await this.getChildQty(productDetails, productBarcode, roProductDetail)
514
- if (pickedQty + targetInventory.pickedQty > releaseQty) {
515
- throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('picking', `over release`))
516
- }
493
+ let childQty = await this.getChildQty(productDetails, productBarcode, roProductDetail)
494
+ pickedQty *= childQty
517
495
  } else if (!foundProductDetail) {
518
496
  throw new Error(this.ERROR_MSG.FIND.NO_RESULT(productBarcode))
519
497
  }
520
498
 
499
+ if (pickedQty + targetInventory.pickedQty > releaseQty) {
500
+ throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('picking', `over release`))
501
+ }
502
+
521
503
  if (product?.isRequireSerialNumberScanningOutbound) {
522
504
  if (!serialNumber || serialNumber == '') {
523
505
  throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('picking', `require serial number`))
@@ -869,7 +851,8 @@ export class PickingWorksheetController extends VasWorksheetController {
869
851
  cartonId: string,
870
852
  productBarcode: string,
871
853
  inventory: any,
872
- binLocationName: string
854
+ binLocationName: string,
855
+ pickingQty: number
873
856
  ): Promise<void> {
874
857
  const worksheet: Worksheet = await this.trxMgr.getRepository(Worksheet).findOne({
875
858
  where: { domain: this.domain, taskNo, type: worksheetType, status: WORKSHEET_STATUS.EXECUTING },
@@ -893,7 +876,7 @@ export class PickingWorksheetController extends VasWorksheetController {
893
876
  const batchId: string = inventory.batchId
894
877
  const packingType: string = inventory.packingType
895
878
  const packingSize: number = inventory.packingSize
896
- let pickedQty: number = 1
879
+ let pickedQty: number = pickingQty ? pickingQty : 1
897
880
 
898
881
  const targetInventories: OrderInventory[] = worksheetDetails
899
882
  .map((wsd: WorksheetDetail) => wsd.targetInventory)
@@ -926,7 +909,8 @@ export class PickingWorksheetController extends VasWorksheetController {
926
909
  this.ERROR_MSG.FIND.NO_RESULT(`Packing Type ( ${packingType}) or Packing Size (${packingSize})`)
927
910
  )
928
911
 
929
- pickedQty = await this.getChildQty(productDetails, productBarcode, roProductDetail)
912
+ let childQty = await this.getChildQty(productDetails, productBarcode, roProductDetail)
913
+ pickedQty *= childQty
930
914
  }
931
915
 
932
916
  const sumOfReleaseQty: number = targetInventories
@@ -1042,15 +1026,6 @@ export class PickingWorksheetController extends VasWorksheetController {
1042
1026
  itm.updater = this.user
1043
1027
  })
1044
1028
 
1045
- // let inventoryLists = InventoryItems.filter(
1046
- // (value, index, self) => index === self.findIndex(itm => itm.inventory.id === value.inventory.id)
1047
- // )
1048
-
1049
- // inventoryLists.forEach((itm: Inventory) => {
1050
- // if (itm.inventory.qty - itm.releaseQty == 0)
1051
- // this.transactionInventory(itm, releaseGood, 0, 0, INVENTORY_TRANSACTION_TYPE.TERMINATED)
1052
- // })
1053
-
1054
1029
  await this.trxMgr.getRepository(InventoryItem).save(inventoryItems)
1055
1030
  }
1056
1031
 
@@ -87,6 +87,7 @@ export class ReturningWorksheetController extends VasWorksheetController {
87
87
  const releaseGood: ReleaseGood = worksheet.releaseGood
88
88
  let targetInventory: OrderInventory = worksheetDetail.targetInventory
89
89
  let inventory: Inventory = targetInventory.inventory
90
+ let location: Location = inventory.location
90
91
 
91
92
  const originLocation: Location = inventory.location
92
93
  const originPalletId: string = inventory.palletId
@@ -95,6 +96,17 @@ export class ReturningWorksheetController extends VasWorksheetController {
95
96
  where: { domain: this.domain, name: toLocationName },
96
97
  relations: ['warehouse']
97
98
  })
99
+
100
+ if (worksheet.type === 'WAREHOUSE_RETURN' && releaseGood.recall) {
101
+ if (
102
+ ![LOCATION_TYPE.QUARANTINE, LOCATION_TYPE.RESERVE].some(l => {
103
+ return l === toLocation.type
104
+ })
105
+ ) {
106
+ throw new Error('Location should be assigned only to Quarantine or Reserve Zone')
107
+ }
108
+ }
109
+
98
110
  if (!toLocation) throw new Error(this.ERROR_MSG.FIND.NO_RESULT(toLocationName))
99
111
 
100
112
  const isPalletDiff: boolean = originPalletId !== palletId
@@ -158,6 +170,7 @@ export class ReturningWorksheetController extends VasWorksheetController {
158
170
  const releaseGood: ReleaseGood = worksheet.releaseGood
159
171
  let targetInventory: OrderInventory = worksheetDetail.targetInventory
160
172
  let inventory: Inventory = targetInventory.inventory
173
+ let invLocation: Location = inventory.location
161
174
 
162
175
  if (inventory.cartonId !== cartonId) {
163
176
  throw new Error(this.ERROR_MSG.VALIDITY.UNEXPECTED_FIELD_VALUE('cartonId', cartonId, inventory.cartonId))
@@ -178,6 +191,16 @@ export class ReturningWorksheetController extends VasWorksheetController {
178
191
  relations: ['warehouse']
179
192
  })
180
193
 
194
+ if (worksheet.type === 'WAREHOUSE_RETURN' && releaseGood.recall) {
195
+ if (
196
+ ![LOCATION_TYPE.QUARANTINE, LOCATION_TYPE.RESERVE].some(l => {
197
+ return l === location.type
198
+ })
199
+ ) {
200
+ throw new Error('Location should be assigned only to Quarantine or Reserve Zone')
201
+ }
202
+ }
203
+
181
204
  if (!location) throw new Error(this.ERROR_MSG.FIND.NO_RESULT(toLocationName))
182
205
  const warehouse: Warehouse = location.warehouse
183
206
  const zone: string = warehouse.zone
@@ -12,6 +12,10 @@ import { Worksheet } from './worksheet'
12
12
  (worksheetDetail: WorksheetDetail) => [worksheetDetail.domain, worksheetDetail.bizplace, worksheetDetail.name],
13
13
  { unique: true }
14
14
  )
15
+ @Index(
16
+ 'ix_worksheet-detail_1',
17
+ (worksheetDetail: WorksheetDetail) => [worksheetDetail.targetInventory]
18
+ )
15
19
  export class WorksheetDetail {
16
20
  @PrimaryGeneratedColumn('uuid')
17
21
  id: string
@@ -1,54 +1,17 @@
1
1
  import { EntityManager, SelectQueryBuilder } from 'typeorm'
2
2
 
3
- import {
4
- ORDER_STATUS, ORDER_INVENTORY_STATUS,
5
- OrderInventory as OrderInventoryEntity,
6
- ReleaseGood as ReleaseGoodEntity
7
- } from '@things-factory/sales-base'
3
+ import { OrderInventory as OrderInventoryEntity, ReleaseGood as ReleaseGoodEntity } from '@things-factory/sales-base'
8
4
  import { Domain } from '@things-factory/shell'
9
- import { Location } from '@things-factory/warehouse-base'
10
5
 
11
- import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../../constants'
12
6
  import { Worksheet as WorksheetEntity, WorksheetDetail as WorksheetDetailEntity } from '../../../entities'
13
7
 
14
8
  export const findReleaseOrdersByTaskNoResolver = {
15
9
  async findReleaseOrdersByTaskNo(_: any, { taskNo }, context: any) {
16
10
  const { domain, tx }: { domain: Domain; tx: EntityManager } = context.state
17
11
  let task = await tx.getRepository(WorksheetEntity).findOne({
18
- where: { taskNo, status: WORKSHEET_STATUS.EXECUTING, type: WORKSHEET_TYPE.SORTING }
12
+ where: { taskNo }
19
13
  })
20
14
 
21
- // Find Task based on Bin
22
- if (!task) {
23
- const binLocation: Location = await tx.getRepository(Location).findOne({
24
- where: { domain, name: taskNo }
25
- })
26
-
27
- const qb: SelectQueryBuilder<OrderInventoryEntity> = tx.getRepository(OrderInventoryEntity).createQueryBuilder('orderInventory')
28
-
29
- qb.innerJoinAndSelect('orderInventory.releaseGood', 'releaseGood')
30
- .innerJoinAndSelect('worksheets', 'ws', `orderInventory.ref_worksheet_id = ws.id AND ws.type = 'BATCH_PICKING'`)
31
- .innerJoinAndSelect('worksheets', 'ws2', `ws2.task_no = ws.task_no AND ws2.type = 'SORTING'`)
32
- .innerJoinAndSelect('releaseGood.bizplace', 'bizplace')
33
- .innerJoinAndSelect('bizplace.domain', 'domain')
34
- .where('orderInventory.domain_id = :domainId', { domainId: domain.id })
35
- .andWhere('orderInventory.status IN (:...orderInventoryStatus)', {
36
- orderInventoryStatus: [ORDER_INVENTORY_STATUS.SORTING]
37
- })
38
- .andWhere('orderInventory.bin_location_id = :locationId', { locationId: binLocation.id })
39
- .andWhere('releaseGood.status = :status', { status: ORDER_STATUS.SORTING })
40
-
41
- const orderInventoryByBin = await qb.getRawOne()
42
- if (orderInventoryByBin?.releaseGood_id) {
43
- taskNo = orderInventoryByBin.ws_task_no
44
- task = await tx.getRepository(WorksheetEntity).findOne({
45
- where: { taskNo, status: WORKSHEET_STATUS.EXECUTING, type: WORKSHEET_TYPE.SORTING }
46
- })
47
- } else {
48
- throw new Error(`Bin do not have any batch picking order.`)
49
- }
50
- }
51
-
52
15
  if (!task) throw new Error('Unable to find task no.')
53
16
 
54
17
  const qb: SelectQueryBuilder<WorksheetEntity> = tx
@@ -63,9 +26,6 @@ export const findReleaseOrdersByTaskNoResolver = {
63
26
  .innerJoin(ReleaseGoodEntity, 'rg', 'rg.id = oi.release_good_id')
64
27
  .where('domain.id = :domainId', { domainId: domain.id })
65
28
  .andWhere('ws.taskNo = :taskNo', { taskNo: taskNo })
66
- .andWhere('ws.type = :worksheetType', { worksheetType: WORKSHEET_TYPE.SORTING })
67
- .andWhere('ws.status = :worksheetStatus', { worksheetStatus: WORKSHEET_STATUS.EXECUTING })
68
- .andWhere('rg.status = :roStatus', { roStatus: ORDER_STATUS.SORTING })
69
29
  .groupBy('rg.id')
70
30
  .addGroupBy('rg.name')
71
31
  .addGroupBy('rg.status')
@@ -0,0 +1,80 @@
1
+ import { EntityManager, SelectQueryBuilder } from 'typeorm'
2
+
3
+ import {
4
+ ORDER_INVENTORY_STATUS,
5
+ ORDER_STATUS,
6
+ OrderInventory as OrderInventoryEntity,
7
+ ReleaseGood as ReleaseGoodEntity
8
+ } from '@things-factory/sales-base'
9
+ import { Domain } from '@things-factory/shell'
10
+ import { Location } from '@things-factory/warehouse-base'
11
+
12
+ import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../../constants'
13
+ import { Worksheet as WorksheetEntity, WorksheetDetail as WorksheetDetailEntity } from '../../../entities'
14
+
15
+ export const findSortingReleaseOrdersByTaskNoResolver = {
16
+ async findSortingReleaseOrdersByTaskNo(_: any, { taskNo }, context: any) {
17
+ const { domain, tx }: { domain: Domain; tx: EntityManager } = context.state
18
+ let task = await tx.getRepository(WorksheetEntity).findOne({
19
+ where: { taskNo, status: WORKSHEET_STATUS.EXECUTING, type: WORKSHEET_TYPE.SORTING }
20
+ })
21
+
22
+ // Find Task based on Bin
23
+ if (!task) {
24
+ const binLocation: Location = await tx.getRepository(Location).findOne({
25
+ where: { domain, name: taskNo }
26
+ })
27
+
28
+ const qb: SelectQueryBuilder<OrderInventoryEntity> = tx
29
+ .getRepository(OrderInventoryEntity)
30
+ .createQueryBuilder('orderInventory')
31
+
32
+ qb.innerJoinAndSelect('orderInventory.releaseGood', 'releaseGood')
33
+ .innerJoinAndSelect('worksheets', 'ws', `orderInventory.ref_worksheet_id = ws.id AND ws.type = 'BATCH_PICKING'`)
34
+ .innerJoinAndSelect('worksheets', 'ws2', `ws2.task_no = ws.task_no AND ws2.type = 'SORTING'`)
35
+ .innerJoinAndSelect('releaseGood.bizplace', 'bizplace')
36
+ .innerJoinAndSelect('bizplace.domain', 'domain')
37
+ .where('orderInventory.domain_id = :domainId', { domainId: domain.id })
38
+ .andWhere('orderInventory.status IN (:...orderInventoryStatus)', {
39
+ orderInventoryStatus: [ORDER_INVENTORY_STATUS.SORTING]
40
+ })
41
+ .andWhere('orderInventory.bin_location_id = :locationId', { locationId: binLocation.id })
42
+ .andWhere('releaseGood.status = :status', { status: ORDER_STATUS.SORTING })
43
+
44
+ const orderInventoryByBin = await qb.getRawOne()
45
+ if (orderInventoryByBin?.releaseGood_id) {
46
+ taskNo = orderInventoryByBin.ws_task_no
47
+ task = await tx.getRepository(WorksheetEntity).findOne({
48
+ where: { taskNo, status: WORKSHEET_STATUS.EXECUTING, type: WORKSHEET_TYPE.SORTING }
49
+ })
50
+ } else {
51
+ throw new Error(`Bin do not have any batch picking order.`)
52
+ }
53
+ }
54
+
55
+ if (!task) throw new Error('Unable to find task no.')
56
+
57
+ const qb: SelectQueryBuilder<WorksheetEntity> = tx
58
+ .getRepository(WorksheetEntity)
59
+ .createQueryBuilder('ws')
60
+ .select('rg.id as id')
61
+ .addSelect('rg.name as name')
62
+ .addSelect('rg.status as status')
63
+ .innerJoin(Domain, 'domain', 'ws.domain_id = domain.id')
64
+ .innerJoin(WorksheetDetailEntity, 'wsd', 'ws.id = wsd.worksheet_id')
65
+ .innerJoin(OrderInventoryEntity, 'oi', 'oi.id = wsd.target_inventory_id')
66
+ .innerJoin(ReleaseGoodEntity, 'rg', 'rg.id = oi.release_good_id')
67
+ .where('domain.id = :domainId', { domainId: domain.id })
68
+ .andWhere('ws.taskNo = :taskNo', { taskNo: taskNo })
69
+ .andWhere('ws.type = :worksheetType', { worksheetType: WORKSHEET_TYPE.SORTING })
70
+ .andWhere('ws.status = :worksheetStatus', { worksheetStatus: WORKSHEET_STATUS.EXECUTING })
71
+ .andWhere('rg.status = :roStatus', { roStatus: ORDER_STATUS.SORTING })
72
+ .groupBy('rg.id')
73
+ .addGroupBy('rg.name')
74
+ .addGroupBy('rg.status')
75
+ .orderBy('rg.createdAt', 'ASC')
76
+
77
+ const releaseGoods: ReleaseGoodEntity[] = await qb.getRawMany()
78
+ return { releaseGoods, taskNo }
79
+ }
80
+ }
@@ -1,14 +1,14 @@
1
1
  import { User } from '@things-factory/auth-base'
2
- import { OrderInventory } from '@things-factory/sales-base'
3
- import { Domain } from '@things-factory/shell'
2
+ import { OrderInventory, GenerateBatchPickInfo } from '@things-factory/sales-base'
3
+ import { Domain, ObjectRef } from '@things-factory/shell'
4
4
  import { EntityManager } from 'typeorm'
5
5
  import { PickingWorksheetController } from '../../../../controllers/'
6
6
  import { Worksheet, WorksheetDetail } from '../../../../entities'
7
7
 
8
8
  export const generateBatchPickingWorksheetResolver = {
9
- async generateBatchPickingWorksheet(_: any, { releaseGoodNos, partnerBizplaceId }, context: any) {
9
+ async generateBatchPickingWorksheet(_: any, { releaseGoodWithBiz }, context: any) {
10
10
  const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
11
- return await generateBatchPickingWorksheet(tx, domain, user, releaseGoodNos, partnerBizplaceId)
11
+ return await generateBatchPickingWorksheet(tx, domain, user, releaseGoodWithBiz)
12
12
  }
13
13
  }
14
14
 
@@ -16,9 +16,8 @@ export async function generateBatchPickingWorksheet(
16
16
  tx: EntityManager,
17
17
  domain: Domain,
18
18
  user: User,
19
- releaseGoodNos: [string],
20
- partnerBizplaceId: string
21
- ): Promise<Worksheet> {
19
+ releaseGoodWithBiz: [[GenerateBatchPickInfo]]
20
+ ): Promise<Worksheet[]> {
22
21
  const worksheetController: PickingWorksheetController = new PickingWorksheetController(tx, domain, user)
23
- return await worksheetController.generateBatchPickingWorksheet(releaseGoodNos, partnerBizplaceId)
22
+ return await worksheetController.generateBatchPickingWorksheet(releaseGoodWithBiz)
24
23
  }
@@ -8,11 +8,7 @@ import { PartnerSetting, Setting } from '@things-factory/setting-base'
8
8
  import { PickingWorksheetController } from '../../../../controllers/'
9
9
  import { Worksheet, WorksheetDetail } from '../../../../entities'
10
10
 
11
- import {
12
- Inventory,
13
- InventoryUtil,
14
- INVENTORY_TRANSACTION_TYPE
15
- } from '@things-factory/warehouse-base'
11
+ import { Inventory, InventoryUtil, INVENTORY_TRANSACTION_TYPE } from '@things-factory/warehouse-base'
16
12
 
17
13
  export const generateReleaseGoodWorksheetResolver = {
18
14
  async generateReleaseGoodWorksheet(_: any, { releaseGoodNo }, context: any) {
@@ -30,14 +26,11 @@ export async function generatePickingWorksheet(
30
26
  try {
31
27
  const worksheetController: PickingWorksheetController = new PickingWorksheetController(tx, domain, user)
32
28
 
33
- let releaseGood: ReleaseGood = await worksheetController.findRefOrder(
34
- ReleaseGood,
35
- {
36
- domain: domain,
37
- name: releaseGoodNo,
38
- status: ORDER_STATUS.PENDING_WORKSHEET
39
- }
40
- )
29
+ let releaseGood: ReleaseGood = await worksheetController.findRefOrder(ReleaseGood, {
30
+ domain: domain,
31
+ name: releaseGoodNo,
32
+ status: ORDER_STATUS.PENDING_WORKSHEET
33
+ })
41
34
 
42
35
  let worksheet: Worksheet = new Worksheet()
43
36
 
@@ -56,11 +49,13 @@ export async function generatePickingWorksheet(
56
49
  for (let idx = 0; idx < orderInventories.length; idx++) {
57
50
  let orderInventory = orderInventories[idx]
58
51
  if (orderInventory.releaseQty <= 0 || (orderInventory.uomValue != null && orderInventory.uomValue <= 0)) {
59
- throw new Error(`Invalid data for ${releaseGoodNo}. Please contact support.`);
52
+ throw new Error(`Invalid data for ${releaseGoodNo}. Please contact support.`)
60
53
  }
61
54
  orderInventory.uomValue = orderInventory.uomValue > 0 ? orderInventory.uomValue : 0
62
55
 
63
- let inventory: Inventory = await tx.getRepository(Inventory).findOne({ where: { id: orderInventory.inventory.id } })
56
+ let inventory: Inventory = await tx
57
+ .getRepository(Inventory)
58
+ .findOne({ where: { id: orderInventory.inventory.id } })
64
59
 
65
60
  await inventoryUtil.transactionInventory(
66
61
  {
@@ -71,16 +66,17 @@ export async function generatePickingWorksheet(
71
66
  lockedUomValue: Math.round((inventory.lockedUomValue - orderInventory.releaseUomValue) * 100) / 100
72
67
  },
73
68
  releaseGood,
74
- - orderInventory.releaseQty,
75
- - orderInventory.releaseUomValue,
69
+ -orderInventory.releaseQty,
70
+ -orderInventory.releaseUomValue,
76
71
  INVENTORY_TRANSACTION_TYPE.DIRECT_DEDUCTION
77
72
  )
78
73
 
79
- await tx.getRepository(OrderInventory).save({ id: orderInventory.id, status: ORDER_INVENTORY_STATUS.TERMINATED })
74
+ await tx
75
+ .getRepository(OrderInventory)
76
+ .update({ id: orderInventory.id }, { status: ORDER_INVENTORY_STATUS.TERMINATED })
80
77
  }
81
78
 
82
- await tx.getRepository(ReleaseGood).save({ id: releaseGood.id, status: ORDER_STATUS.DONE })
83
-
79
+ await tx.getRepository(ReleaseGood).update({ id: releaseGood.id }, { status: ORDER_STATUS.DONE })
84
80
  } else {
85
81
  worksheet = await worksheetController.generatePickingWorksheet(releaseGoodNo)
86
82
  }
@@ -11,6 +11,7 @@ import { deliveryOrderByWorksheetResolver } from './delivery-order-by-worksheet'
11
11
  import { fetchDeliveryOrderROResolver } from './fetch-delivery-order-ro'
12
12
  import { fetchSellercraftAirwayBillResolver } from './fetch-sellercraft-airway-bill'
13
13
  import { findReleaseOrdersByTaskNoResolver } from './find-release-orders-by-task-no'
14
+ import { findSortingReleaseOrdersByTaskNoResolver } from './find-sorting-release-orders-by-task-no'
14
15
  import { Mutations as GenerateWorksheetMutations } from './generate-worksheet'
15
16
  import { havingVasResolver } from './having-vas'
16
17
  import { Mutations as InspectMutations } from './inspecting'
@@ -99,6 +100,7 @@ export const Query = {
99
100
  ...myPickingAssignmentStatusResolver,
100
101
  ...recommendPutawayLocationResolver,
101
102
  ...sortingWorksheetResolver,
103
+ ...findSortingReleaseOrdersByTaskNoResolver,
102
104
  ...findReleaseOrdersByTaskNoResolver,
103
105
  ...fetchDeliveryOrderROResolver
104
106
  }