@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.
- package/dist-server/controllers/outbound/picking-worksheet-controller.js +69 -92
- package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/returning-worksheet-controller.js +16 -0
- package/dist-server/controllers/outbound/returning-worksheet-controller.js.map +1 -1
- package/dist-server/entities/worksheet-detail.js +2 -1
- package/dist-server/entities/worksheet-detail.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/find-release-orders-by-task-no.js +1 -34
- package/dist-server/graphql/resolvers/worksheet/find-release-orders-by-task-no.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/find-sorting-release-orders-by-task-no.js +70 -0
- package/dist-server/graphql/resolvers/worksheet/find-sorting-release-orders-by-task-no.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-batch-picking-worksheet.js +4 -4
- package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-batch-picking-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-release-good-worksheet.js +7 -3
- package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-release-good-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/index.js +2 -1
- package/dist-server/graphql/resolvers/worksheet/index.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js +18 -8
- package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/activate-batch-picking.js +0 -32
- package/dist-server/graphql/resolvers/worksheet/picking/activate-batch-picking.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js +5 -0
- package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +5 -0
- package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/fetch-and-assign-picking-task.js +6 -2
- package/dist-server/graphql/resolvers/worksheet/picking/fetch-and-assign-picking-task.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/scan-product-batch-picking.js +4 -4
- package/dist-server/graphql/resolvers/worksheet/picking/scan-product-batch-picking.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/scan-product-picking.js +4 -4
- package/dist-server/graphql/resolvers/worksheet/picking/scan-product-picking.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js +1 -0
- package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/worksheet.js +11 -3
- package/dist-server/graphql/resolvers/worksheet/worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet-detail/index.js +2 -1
- package/dist-server/graphql/resolvers/worksheet-detail/index.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet-detail/regenerate-release-good-worksheet-details.js +81 -0
- package/dist-server/graphql/resolvers/worksheet-detail/regenerate-release-good-worksheet-details.js.map +1 -0
- package/dist-server/graphql/types/worksheet/batch-pick-worksheet-info.js +12 -0
- package/dist-server/graphql/types/worksheet/batch-pick-worksheet-info.js.map +1 -0
- package/dist-server/graphql/types/worksheet/index.js +9 -4
- package/dist-server/graphql/types/worksheet/index.js.map +1 -1
- package/dist-server/graphql/types/worksheet-detail/index.js +10 -0
- package/dist-server/graphql/types/worksheet-detail/index.js.map +1 -1
- package/package.json +12 -12
- package/server/controllers/outbound/picking-worksheet-controller.ts +86 -111
- package/server/controllers/outbound/returning-worksheet-controller.ts +23 -0
- package/server/entities/worksheet-detail.ts +4 -0
- package/server/graphql/resolvers/worksheet/find-release-orders-by-task-no.ts +2 -42
- package/server/graphql/resolvers/worksheet/find-sorting-release-orders-by-task-no.ts +80 -0
- package/server/graphql/resolvers/worksheet/generate-worksheet/generate-batch-picking-worksheet.ts +7 -8
- package/server/graphql/resolvers/worksheet/generate-worksheet/generate-release-good-worksheet.ts +16 -20
- package/server/graphql/resolvers/worksheet/index.ts +2 -0
- package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +32 -11
- package/server/graphql/resolvers/worksheet/picking/activate-batch-picking.ts +1 -49
- package/server/graphql/resolvers/worksheet/picking/complete-batch-picking.ts +8 -0
- package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +6 -0
- package/server/graphql/resolvers/worksheet/picking/fetch-and-assign-picking-task.ts +4 -0
- package/server/graphql/resolvers/worksheet/picking/scan-product-batch-picking.ts +7 -4
- package/server/graphql/resolvers/worksheet/picking/scan-product-picking.ts +7 -4
- package/server/graphql/resolvers/worksheet/picking-worksheet.ts +5 -4
- package/server/graphql/resolvers/worksheet/worksheet.ts +16 -3
- package/server/graphql/resolvers/worksheet-detail/index.ts +3 -1
- package/server/graphql/resolvers/worksheet-detail/regenerate-release-good-worksheet-details.ts +164 -0
- package/server/graphql/types/worksheet/batch-pick-worksheet-info.ts +9 -0
- package/server/graphql/types/worksheet/index.ts +10 -5
- 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(
|
|
86
|
-
let
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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
|
-
|
|
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
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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
|
-
|
|
109
|
-
|
|
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
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
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
|
-
|
|
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
|
-
|
|
514
|
-
|
|
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
|
-
|
|
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
|
|
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
|
+
}
|
package/server/graphql/resolvers/worksheet/generate-worksheet/generate-batch-picking-worksheet.ts
CHANGED
|
@@ -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, {
|
|
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,
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
): Promise<Worksheet> {
|
|
19
|
+
releaseGoodWithBiz: [[GenerateBatchPickInfo]]
|
|
20
|
+
): Promise<Worksheet[]> {
|
|
22
21
|
const worksheetController: PickingWorksheetController = new PickingWorksheetController(tx, domain, user)
|
|
23
|
-
return await worksheetController.generateBatchPickingWorksheet(
|
|
22
|
+
return await worksheetController.generateBatchPickingWorksheet(releaseGoodWithBiz)
|
|
24
23
|
}
|
package/server/graphql/resolvers/worksheet/generate-worksheet/generate-release-good-worksheet.ts
CHANGED
|
@@ -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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
|
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
|
-
-
|
|
75
|
-
-
|
|
69
|
+
-orderInventory.releaseQty,
|
|
70
|
+
-orderInventory.releaseUomValue,
|
|
76
71
|
INVENTORY_TRANSACTION_TYPE.DIRECT_DEDUCTION
|
|
77
72
|
)
|
|
78
73
|
|
|
79
|
-
await tx
|
|
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).
|
|
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
|
}
|