@things-factory/worksheet-base 3.7.2 → 3.7.7
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/constants/template.js +1 -0
- package/dist-server/constants/template.js.map +1 -1
- package/dist-server/controllers/index.js +1 -0
- package/dist-server/controllers/index.js.map +1 -1
- package/dist-server/controllers/outbound/loading-worksheet-controller.js +4 -0
- package/dist-server/controllers/outbound/loading-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/picking-worksheet-controller.js +158 -113
- package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/render-manifest.js +64 -0
- package/dist-server/controllers/render-manifest.js.map +1 -0
- package/dist-server/controllers/worksheet-controller.js +25 -0
- package/dist-server/controllers/worksheet-controller.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/loading-worksheet.js +23 -2
- package/dist-server/graphql/resolvers/worksheet/loading-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +22 -0
- package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +27 -5
- 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 +72 -0
- package/dist-server/graphql/resolvers/worksheet/picking/fetch-and-assign-picking-task.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/picking/index.js +2 -1
- package/dist-server/graphql/resolvers/worksheet/picking/index.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/picking.js +4 -4
- package/dist-server/graphql/resolvers/worksheet/picking/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 +86 -57
- package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js.map +1 -1
- package/dist-server/graphql/types/worksheet/index.js +7 -1
- package/dist-server/graphql/types/worksheet/index.js.map +1 -1
- package/dist-server/routes.js +4 -0
- package/dist-server/routes.js.map +1 -1
- package/dist-server/utils/inventory-util.js +25 -0
- package/dist-server/utils/inventory-util.js.map +1 -1
- package/package.json +16 -16
- package/server/constants/template.ts +1 -0
- package/server/controllers/index.ts +1 -0
- package/server/controllers/outbound/loading-worksheet-controller.ts +20 -0
- package/server/controllers/outbound/picking-worksheet-controller.ts +201 -143
- package/server/controllers/render-manifest.ts +68 -0
- package/server/controllers/worksheet-controller.ts +38 -0
- package/server/graphql/resolvers/worksheet/loading-worksheet.ts +30 -4
- package/server/graphql/resolvers/worksheet/packing-worksheet.ts +28 -3
- package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +37 -5
- package/server/graphql/resolvers/worksheet/picking/fetch-and-assign-picking-task.ts +78 -0
- package/server/graphql/resolvers/worksheet/picking/index.ts +3 -1
- package/server/graphql/resolvers/worksheet/picking/picking.ts +6 -4
- package/server/graphql/resolvers/worksheet/picking/scan-product-picking.ts +7 -4
- package/server/graphql/resolvers/worksheet/picking-worksheet.ts +102 -62
- package/server/graphql/types/worksheet/index.ts +8 -2
- package/server/routes.ts +5 -0
- package/server/utils/inventory-util.ts +26 -0
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
import { EcommerceController } from '../../../../controllers/ecommerce'
|
|
20
20
|
import { WorksheetController } from '../../../../controllers/worksheet-controller'
|
|
21
21
|
import { Worksheet, WorksheetDetail } from '../../../../entities'
|
|
22
|
+
import { Setting, PartnerSetting } from '@things-factory/setting-base'
|
|
22
23
|
|
|
23
24
|
export const completePickingResolver = {
|
|
24
25
|
async completePicking(_: any, { releaseGoodNo }, context: any) {
|
|
@@ -187,10 +188,30 @@ export async function completePicking(
|
|
|
187
188
|
|
|
188
189
|
if (releaseGood.packingOption) {
|
|
189
190
|
const packingWSCtrl: PackingWorksheetController = new PackingWorksheetController(tx, domain, user)
|
|
190
|
-
|
|
191
|
+
|
|
192
|
+
const directActivatePackingWorksheet: Setting = await tx.getRepository(Setting).findOne({
|
|
193
|
+
where: { domain: domain, category: 'id-rule', name: 'enable-direct-activate-packing-worksheet' }
|
|
194
|
+
})
|
|
195
|
+
const partnerDirectActivatePackingWorksheetSetting: PartnerSetting = await tx.getRepository(PartnerSetting).findOne({
|
|
196
|
+
where: { setting: directActivatePackingWorksheet, domain: domain, partnerDomain: releaseGood.bizplace?.domain }
|
|
197
|
+
})
|
|
198
|
+
|
|
199
|
+
let packingWorksheet: Worksheet = await packingWSCtrl.generatePackingWorksheet(releaseGoodNo)
|
|
200
|
+
|
|
201
|
+
if (
|
|
202
|
+
directActivatePackingWorksheet != undefined && (directActivatePackingWorksheet.value).toLowerCase() == 'true'
|
|
203
|
+
) {
|
|
204
|
+
if (partnerDirectActivatePackingWorksheetSetting != undefined) {
|
|
205
|
+
if ((partnerDirectActivatePackingWorksheetSetting.value).toLowerCase() == 'true')
|
|
206
|
+
await packingWSCtrl.activatePacking(packingWorksheet.name)
|
|
207
|
+
} else {
|
|
208
|
+
await packingWSCtrl.activatePacking(packingWorksheet.name)
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
191
212
|
} else {
|
|
192
213
|
// Find Existing Loading Worksheet if any
|
|
193
|
-
|
|
214
|
+
let existLoadingWorksheet: Worksheet = await tx.getRepository(Worksheet).findOne({
|
|
194
215
|
where: {
|
|
195
216
|
releaseGood,
|
|
196
217
|
type: WORKSHEET_TYPE.LOADING,
|
|
@@ -211,10 +232,21 @@ export async function completePicking(
|
|
|
211
232
|
|
|
212
233
|
const loadingWorksheetDetails: WorksheetDetail[] = loadingWorksheet.worksheetDetails
|
|
213
234
|
await loadingWSCtrl.activateLoading(loadingWorksheet.name, loadingWorksheetDetails)
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
const loadingWSCtrl: LoadingWorksheetController = new LoadingWorksheetController(tx, domain, user)
|
|
238
|
+
let loadingWorksheet: Worksheet = await loadingWSCtrl.updateLoadingWorksheet(
|
|
239
|
+
releaseGoodNo,
|
|
240
|
+
pickedTargetInventories,
|
|
241
|
+
existLoadingWorksheet
|
|
217
242
|
)
|
|
243
|
+
|
|
244
|
+
if (!loadingWorksheet.worksheetDetails?.length) {
|
|
245
|
+
loadingWorksheet = await pickingWSCtrl.findWorksheetById(loadingWorksheet.id)
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
const loadingWorksheetDetails: WorksheetDetail[] = loadingWorksheet.worksheetDetails
|
|
249
|
+
await loadingWSCtrl.activateLoading(loadingWorksheet.name, loadingWorksheetDetails)
|
|
218
250
|
}
|
|
219
251
|
}
|
|
220
252
|
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { EntityManager, getRepository } from 'typeorm'
|
|
2
|
+
|
|
3
|
+
import { User } from '@things-factory/auth-base'
|
|
4
|
+
import { Setting } from '@things-factory/setting-base'
|
|
5
|
+
import { Domain } from '@things-factory/shell'
|
|
6
|
+
|
|
7
|
+
import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../../../constants'
|
|
8
|
+
import { Worksheet } from '../../../../entities'
|
|
9
|
+
import { pickingWorksheet } from '../picking-worksheet'
|
|
10
|
+
import { activatePicking } from './activate-picking'
|
|
11
|
+
|
|
12
|
+
export const fetchAndAssignPickingTaskResolver = {
|
|
13
|
+
async fetchAndAssignPickingTask(_: any, {}, context: any) {
|
|
14
|
+
const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
|
|
15
|
+
const assignee: User = await tx.getRepository(User).findOne(user.id, { relations: ['domains'] })
|
|
16
|
+
if ((assignee?.domains || []).every((userDomain: Domain) => userDomain.id !== domain.id))
|
|
17
|
+
throw new Error('Target user is not belong to current domain')
|
|
18
|
+
|
|
19
|
+
if (!assignee) throw new Error('failed to find target user')
|
|
20
|
+
|
|
21
|
+
let worksheet: Worksheet
|
|
22
|
+
worksheet = await tx.getRepository(Worksheet).findOne({
|
|
23
|
+
relations: ['releaseGood'],
|
|
24
|
+
where: [
|
|
25
|
+
{
|
|
26
|
+
domain,
|
|
27
|
+
type: WORKSHEET_TYPE.PICKING,
|
|
28
|
+
status: WORKSHEET_STATUS.EXECUTING,
|
|
29
|
+
assignee: assignee
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
domain,
|
|
33
|
+
type: WORKSHEET_TYPE.PICKING,
|
|
34
|
+
status: WORKSHEET_STATUS.DEACTIVATED,
|
|
35
|
+
assignee: assignee
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
order: {
|
|
39
|
+
name: 'ASC'
|
|
40
|
+
}
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
if (!worksheet) {
|
|
44
|
+
worksheet = await tx.getRepository(Worksheet).findOne({
|
|
45
|
+
relations: ['releaseGood'],
|
|
46
|
+
where: [
|
|
47
|
+
{
|
|
48
|
+
domain,
|
|
49
|
+
type: WORKSHEET_TYPE.PICKING,
|
|
50
|
+
status: WORKSHEET_STATUS.EXECUTING,
|
|
51
|
+
assignee: null
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
domain,
|
|
55
|
+
type: WORKSHEET_TYPE.PICKING,
|
|
56
|
+
status: WORKSHEET_STATUS.DEACTIVATED,
|
|
57
|
+
assignee: null
|
|
58
|
+
}
|
|
59
|
+
]
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
await getRepository(Worksheet).update({ id: worksheet.id }, { assignee: assignee })
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (worksheet.status == WORKSHEET_STATUS.DEACTIVATED) await activatePicking(tx, domain, user, worksheet.name)
|
|
66
|
+
|
|
67
|
+
const locationSortingRules: Setting = await tx.getRepository(Setting).findOne({
|
|
68
|
+
where: { domain, name: 'rule-for-picking-product' }
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
const sortingRule = JSON.parse(locationSortingRules.value)
|
|
72
|
+
const locationSortingRule = Object.keys(sortingRule).map(field => {
|
|
73
|
+
return { name: field, desc: sortingRule[field] === 'DESC' }
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
return await pickingWorksheet(domain, worksheet.releaseGood.name, locationSortingRule, tx)
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -2,6 +2,7 @@ import { activateBatchPickingResolver } from './activate-batch-picking'
|
|
|
2
2
|
import { activatePickingResolver } from './activate-picking'
|
|
3
3
|
import { assignPickingInventoriesResolver } from './assign-picking-inventories'
|
|
4
4
|
import { assignPickingWorkerResolver } from './assign-picking-worker'
|
|
5
|
+
import { fetchAndAssignPickingTaskResolver } from './fetch-and-assign-picking-task'
|
|
5
6
|
import { batchPickingResolver } from './batch-picking'
|
|
6
7
|
import { completeBatchPickingResolver } from './complete-batch-picking'
|
|
7
8
|
import { completePickingResolver } from './complete-picking'
|
|
@@ -21,5 +22,6 @@ export const Mutations = {
|
|
|
21
22
|
...batchPickingResolver,
|
|
22
23
|
...completePickingResolver,
|
|
23
24
|
...completeBatchPickingResolver,
|
|
24
|
-
...assignPickingWorkerResolver
|
|
25
|
+
...assignPickingWorkerResolver,
|
|
26
|
+
...fetchAndAssignPickingTaskResolver
|
|
25
27
|
}
|
|
@@ -4,9 +4,9 @@ import { EntityManager } from 'typeorm'
|
|
|
4
4
|
import { PickingWorksheetController } from '../../../../controllers'
|
|
5
5
|
|
|
6
6
|
export const pickingResolver = {
|
|
7
|
-
async picking(_: any, { worksheetDetailName, worksheetType, palletId, locationName, releaseQty }, context: any) {
|
|
7
|
+
async picking(_: any, { worksheetDetailName, worksheetType, palletId, locationName, releaseQty, binLocation, serialNumber }, context: any) {
|
|
8
8
|
const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
|
|
9
|
-
await picking(tx, domain, user, worksheetDetailName, worksheetType, palletId, locationName, releaseQty)
|
|
9
|
+
await picking(tx, domain, user, worksheetDetailName, worksheetType, palletId, locationName, releaseQty, binLocation, serialNumber)
|
|
10
10
|
}
|
|
11
11
|
}
|
|
12
12
|
|
|
@@ -18,8 +18,10 @@ export async function picking(
|
|
|
18
18
|
worksheetType: string,
|
|
19
19
|
palletId: string,
|
|
20
20
|
locationName: string,
|
|
21
|
-
releaseQty: number
|
|
21
|
+
releaseQty: number,
|
|
22
|
+
binLocation?: string,
|
|
23
|
+
serialNumber?: string
|
|
22
24
|
) {
|
|
23
25
|
const worksheetController: PickingWorksheetController = new PickingWorksheetController(tx, domain, user)
|
|
24
|
-
await worksheetController.picking(worksheetDetailName, worksheetType, palletId, locationName, releaseQty)
|
|
26
|
+
await worksheetController.picking(worksheetDetailName, worksheetType, palletId, locationName, releaseQty, binLocation, serialNumber)
|
|
25
27
|
}
|
|
@@ -6,7 +6,7 @@ import { PickingWorksheetController } from '../../../../controllers'
|
|
|
6
6
|
export const scanProductPickingResolver = {
|
|
7
7
|
async scanProductPicking(
|
|
8
8
|
_: any,
|
|
9
|
-
{ worksheetDetailName, worksheetType, productBarcode, cartonId, binLocation },
|
|
9
|
+
{ worksheetDetailName, worksheetType, productBarcode, cartonId, binLocation, serialNumber },
|
|
10
10
|
context: any
|
|
11
11
|
) {
|
|
12
12
|
const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
|
|
@@ -18,7 +18,8 @@ export const scanProductPickingResolver = {
|
|
|
18
18
|
worksheetType,
|
|
19
19
|
productBarcode,
|
|
20
20
|
cartonId,
|
|
21
|
-
binLocation
|
|
21
|
+
binLocation,
|
|
22
|
+
serialNumber
|
|
22
23
|
)
|
|
23
24
|
}
|
|
24
25
|
}
|
|
@@ -31,7 +32,8 @@ export async function scanProductPicking(
|
|
|
31
32
|
worksheetType: string,
|
|
32
33
|
productBarcode: string,
|
|
33
34
|
cartonId: string,
|
|
34
|
-
binLocation?: string
|
|
35
|
+
binLocation?: string,
|
|
36
|
+
serialNumber?: string
|
|
35
37
|
) {
|
|
36
38
|
const worksheetController: PickingWorksheetController = new PickingWorksheetController(tx, domain, user)
|
|
37
39
|
await worksheetController.scanProductPicking(
|
|
@@ -39,6 +41,7 @@ export async function scanProductPicking(
|
|
|
39
41
|
worksheetType,
|
|
40
42
|
productBarcode,
|
|
41
43
|
cartonId,
|
|
42
|
-
binLocation
|
|
44
|
+
binLocation,
|
|
45
|
+
serialNumber
|
|
43
46
|
)
|
|
44
47
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { EntityManager, In, SelectQueryBuilder } from 'typeorm'
|
|
2
2
|
|
|
3
3
|
import { ORDER_INVENTORY_STATUS, OrderInventory, ReleaseGood } from '@things-factory/sales-base'
|
|
4
4
|
import { Domain } from '@things-factory/shell'
|
|
5
|
-
import { Inventory } from '@things-factory/warehouse-base'
|
|
5
|
+
import { Inventory, Location } from '@things-factory/warehouse-base'
|
|
6
6
|
|
|
7
7
|
import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../../constants'
|
|
8
8
|
import { WorksheetDetail } from '../../../entities'
|
|
@@ -10,71 +10,111 @@ import { fetchExecutingWorksheet } from '../../../utils'
|
|
|
10
10
|
|
|
11
11
|
export const pickingWorksheetResolver = {
|
|
12
12
|
async pickingWorksheet(_: any, { releaseGoodNo, locationSortingRules }, context: any) {
|
|
13
|
-
const { domain }: { domain: Domain } = context.state
|
|
14
|
-
const releaseGood: ReleaseGood = await getRepository(ReleaseGood).findOne({
|
|
15
|
-
where: { domain, name: releaseGoodNo /*status: ORDER_STATUS.PICKING*/ },
|
|
16
|
-
relations: ['bizplace', 'bizplace.domain']
|
|
17
|
-
})
|
|
18
|
-
if (!releaseGood) throw new Error(`Couldn't find picking worksheet by order no (${releaseGoodNo})`)
|
|
19
|
-
|
|
20
|
-
const worksheet = await fetchExecutingWorksheet(
|
|
21
|
-
domain,
|
|
22
|
-
releaseGood.bizplace,
|
|
23
|
-
['bizplace'],
|
|
24
|
-
WORKSHEET_TYPE.PICKING,
|
|
25
|
-
releaseGood
|
|
26
|
-
)
|
|
13
|
+
const { domain, tx }: { domain: Domain; tx: EntityManager } = context.state
|
|
27
14
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
.leftJoinAndSelect('T_INV.product', 'PROD')
|
|
32
|
-
.leftJoinAndSelect('INV.location', 'LOC')
|
|
15
|
+
return await pickingWorksheet(domain, releaseGoodNo, locationSortingRules, tx)
|
|
16
|
+
}
|
|
17
|
+
}
|
|
33
18
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
19
|
+
export async function pickingWorksheet(
|
|
20
|
+
domain: Domain,
|
|
21
|
+
releaseGoodNo: String,
|
|
22
|
+
locationSortingRules: any,
|
|
23
|
+
tx: EntityManager
|
|
24
|
+
) {
|
|
25
|
+
let releaseGood: ReleaseGood = await tx.getRepository(ReleaseGood).findOne({
|
|
26
|
+
where: { domain, name: releaseGoodNo /*status: ORDER_STATUS.PICKING*/ },
|
|
27
|
+
relations: ['bizplace', 'bizplace.domain']
|
|
28
|
+
})
|
|
39
29
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
30
|
+
// Find Release Order based on Bin
|
|
31
|
+
if (!releaseGood) {
|
|
32
|
+
const binLocation: Location = await tx.getRepository(Location).findOne({
|
|
33
|
+
where: { domain, name: releaseGoodNo }
|
|
34
|
+
})
|
|
45
35
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
36
|
+
const orderInventoryByBin: OrderInventory = await tx.getRepository(OrderInventory).findOne({
|
|
37
|
+
where: {
|
|
38
|
+
domain,
|
|
39
|
+
binLocation,
|
|
40
|
+
status: In([ORDER_INVENTORY_STATUS.PICKING, ORDER_INVENTORY_STATUS.PICKED])
|
|
41
|
+
},
|
|
42
|
+
order: {
|
|
43
|
+
createdAt: 'ASC'
|
|
54
44
|
},
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
cartonId: inventory?.cartonId,
|
|
62
|
-
batchId: inventory?.batchId,
|
|
63
|
-
batchIdRef: inventory?.batchIdRef,
|
|
64
|
-
product: inventory?.product,
|
|
65
|
-
qty: inventory?.qty,
|
|
66
|
-
releaseQty: targetInventory.releaseQty,
|
|
67
|
-
pickedQty: targetInventory.pickedQty,
|
|
68
|
-
status: pickingWSD.status,
|
|
69
|
-
description: pickingWSD.description,
|
|
70
|
-
targetName: targetInventory.name,
|
|
71
|
-
packingType: inventory?.packingType,
|
|
72
|
-
packingSize: inventory?.packingSize,
|
|
73
|
-
expirationDate: inventory?.expirationDate,
|
|
74
|
-
location: inventory?.location,
|
|
75
|
-
relatedOrderInv: targetInventory
|
|
76
|
-
}
|
|
77
|
-
})
|
|
45
|
+
relations: ['releaseGood', 'releaseGood.bizplace', 'releaseGood.bizplace.domain']
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
if (orderInventoryByBin?.releaseGood) {
|
|
49
|
+
releaseGoodNo = orderInventoryByBin.releaseGood.name
|
|
50
|
+
releaseGood = orderInventoryByBin.releaseGood
|
|
78
51
|
}
|
|
79
52
|
}
|
|
53
|
+
|
|
54
|
+
if (!releaseGood) throw new Error(`Couldn't find picking worksheet by order no (${releaseGoodNo})`)
|
|
55
|
+
|
|
56
|
+
const worksheet = await fetchExecutingWorksheet(
|
|
57
|
+
domain,
|
|
58
|
+
releaseGood.bizplace,
|
|
59
|
+
['bizplace'],
|
|
60
|
+
WORKSHEET_TYPE.PICKING,
|
|
61
|
+
releaseGood,
|
|
62
|
+
tx
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
const qb: SelectQueryBuilder<WorksheetDetail> = tx.createQueryBuilder(WorksheetDetail, 'WSD')
|
|
66
|
+
qb.leftJoinAndSelect('WSD.targetInventory', 'T_INV')
|
|
67
|
+
.leftJoinAndSelect('T_INV.binLocation', 'BIN_LOC')
|
|
68
|
+
.leftJoinAndSelect('T_INV.inventory', 'INV')
|
|
69
|
+
.leftJoinAndSelect('T_INV.product', 'PROD')
|
|
70
|
+
.leftJoinAndSelect('INV.location', 'LOC')
|
|
71
|
+
|
|
72
|
+
if (locationSortingRules?.length > 0) {
|
|
73
|
+
locationSortingRules.forEach((rule: { name: string; desc: boolean }) => {
|
|
74
|
+
qb.addOrderBy(`LOC.${rule.name}`, rule.desc ? 'DESC' : 'ASC')
|
|
75
|
+
})
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
qb.addOrderBy(`PROD.name`, 'ASC')
|
|
79
|
+
|
|
80
|
+
const worksheetDetails: WorksheetDetail[] = await qb
|
|
81
|
+
.where('"WSD"."worksheet_id" = :worksheetId', { worksheetId: worksheet.id })
|
|
82
|
+
.andWhere('"WSD"."status" != :status', { status: WORKSHEET_STATUS.REPLACED })
|
|
83
|
+
.andWhere('"T_INV"."status" != :t_invstatus', { t_invstatus: ORDER_INVENTORY_STATUS.CANCELLED })
|
|
84
|
+
.getMany()
|
|
85
|
+
|
|
86
|
+
return {
|
|
87
|
+
worksheetInfo: {
|
|
88
|
+
bizplaceName: releaseGood.bizplace.name,
|
|
89
|
+
partnerDomainId: releaseGood.bizplace?.domain.id,
|
|
90
|
+
startedAt: worksheet.startedAt,
|
|
91
|
+
refNo: releaseGood.refNo,
|
|
92
|
+
refNo2: releaseGood.refNo2,
|
|
93
|
+
releaseGood
|
|
94
|
+
},
|
|
95
|
+
worksheetDetailInfos: worksheetDetails.map(async (pickingWSD: WorksheetDetail) => {
|
|
96
|
+
const targetInventory: OrderInventory = pickingWSD.targetInventory
|
|
97
|
+
const inventory: Inventory = targetInventory.inventory
|
|
98
|
+
return {
|
|
99
|
+
name: pickingWSD.name,
|
|
100
|
+
palletId: inventory?.palletId,
|
|
101
|
+
cartonId: inventory?.cartonId,
|
|
102
|
+
batchId: inventory?.batchId,
|
|
103
|
+
batchIdRef: inventory?.batchIdRef,
|
|
104
|
+
product: inventory?.product,
|
|
105
|
+
qty: inventory?.qty,
|
|
106
|
+
binLocation: targetInventory?.binLocation || '',
|
|
107
|
+
releaseQty: targetInventory.releaseQty,
|
|
108
|
+
pickedQty: targetInventory.pickedQty,
|
|
109
|
+
status: pickingWSD.status,
|
|
110
|
+
description: pickingWSD.description,
|
|
111
|
+
targetName: targetInventory.name,
|
|
112
|
+
packingType: inventory?.packingType,
|
|
113
|
+
packingSize: inventory?.packingSize,
|
|
114
|
+
expirationDate: inventory?.expirationDate,
|
|
115
|
+
location: inventory?.location,
|
|
116
|
+
relatedOrderInv: targetInventory
|
|
117
|
+
}
|
|
118
|
+
})
|
|
119
|
+
}
|
|
80
120
|
}
|
|
@@ -290,6 +290,8 @@ export const Mutation = /* GraphQL */ `
|
|
|
290
290
|
cartonId: String
|
|
291
291
|
locationName: String!
|
|
292
292
|
releaseQty: Int!
|
|
293
|
+
binLocation: String
|
|
294
|
+
serialNumber: String
|
|
293
295
|
): Boolean @privilege(category: "worksheet_execute", privilege: "mutation") @transaction
|
|
294
296
|
|
|
295
297
|
scanProductPicking (
|
|
@@ -298,6 +300,7 @@ export const Mutation = /* GraphQL */ `
|
|
|
298
300
|
productBarcode: String!
|
|
299
301
|
cartonId: String!
|
|
300
302
|
binLocation: String
|
|
303
|
+
serialNumber: String
|
|
301
304
|
): Boolean @privilege(category: "worksheet_execute", privilege: "mutation") @transaction
|
|
302
305
|
|
|
303
306
|
sortingProduct (
|
|
@@ -515,6 +518,9 @@ export const Mutation = /* GraphQL */ `
|
|
|
515
518
|
worksheetId: String!
|
|
516
519
|
userId: String!
|
|
517
520
|
): Boolean @privilege(category: "worksheet_control", privilege: "mutation") @transaction
|
|
521
|
+
|
|
522
|
+
fetchAndAssignPickingTask
|
|
523
|
+
: ExecutingWorksheet @privilege(category: "worksheet_control", privilege: "mutation") @transaction
|
|
518
524
|
|
|
519
525
|
palletizingPallets (
|
|
520
526
|
refOrderNo: String!
|
|
@@ -588,7 +594,7 @@ export const Query = /* GraphQL */ `
|
|
|
588
594
|
|
|
589
595
|
pickingWorksheet (
|
|
590
596
|
releaseGoodNo: String!, locationSortingRules: [Sorting]
|
|
591
|
-
): ExecutingWorksheet @privilege(category: "worksheet", privilege: "query")
|
|
597
|
+
): ExecutingWorksheet @privilege(category: "worksheet", privilege: "query") @transaction
|
|
592
598
|
|
|
593
599
|
sortingWorksheet (
|
|
594
600
|
releaseGoodNo: String!
|
|
@@ -662,7 +668,7 @@ export const Query = /* GraphQL */ `
|
|
|
662
668
|
findReleaseOrdersByTaskNo(taskNo: String!): [ReleaseGood] @privilege(category: "worksheet", privilege: "query") @transaction
|
|
663
669
|
`
|
|
664
670
|
|
|
665
|
-
export const Types = /* GraphQL */
|
|
671
|
+
export const Types = /* GraphQL */[
|
|
666
672
|
Worksheet,
|
|
667
673
|
AirwayBill,
|
|
668
674
|
NewWorksheet,
|
package/server/routes.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { renderElcclGRN } from './controllers/render-elccl-grn'
|
|
|
2
2
|
import { renderGRN } from './controllers/render-grn'
|
|
3
3
|
import { renderJobSheet } from './controllers/render-job-sheet'
|
|
4
4
|
import { renderKimedaGRN } from './controllers/render-kimeda-grn'
|
|
5
|
+
import { renderManifest } from './controllers/render-manifest'
|
|
5
6
|
import { renderManualDO } from './controllers/render-manual-do'
|
|
6
7
|
import { renderOrientageDO } from './controllers/render-orientage-do'
|
|
7
8
|
import { renderOrientageGRN } from './controllers/render-orientage-grn'
|
|
@@ -44,4 +45,8 @@ process.on('bootstrap-module-domain-private-route' as any, (app, routes) => {
|
|
|
44
45
|
routes.get('/view_job_sheet/:ganNo/:timezoneOffSet', async (context, next) => {
|
|
45
46
|
context.body = await renderJobSheet(context.params, context)
|
|
46
47
|
})
|
|
48
|
+
|
|
49
|
+
routes.get('/view_manifest/:manifestNo', async (context, next) => {
|
|
50
|
+
context.body = await renderManifest(context.params, context)
|
|
51
|
+
})
|
|
47
52
|
})
|
|
@@ -59,10 +59,36 @@ export async function generateInventoryHistory(
|
|
|
59
59
|
palletId: inventory.palletId,
|
|
60
60
|
seq: seq - 1
|
|
61
61
|
})
|
|
62
|
+
|
|
62
63
|
openingQty = lastInvHistory.openingQty + lastInvHistory.qty
|
|
63
64
|
openingUomValue = lastInvHistory.openingUomValue + lastInvHistory.uomValue
|
|
64
65
|
}
|
|
65
66
|
|
|
67
|
+
if (transactionType == 'PICKING' || transactionType == 'UNLOADING') {
|
|
68
|
+
const [findSameOrderHistory, total]: InventoryHistory = await invHistoryRepo.findAndCount({
|
|
69
|
+
domain: inventory.domain,
|
|
70
|
+
palletId: inventory.palletId,
|
|
71
|
+
refOrderId: refOrder.id
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
if (findSameOrderHistory) {
|
|
75
|
+
let prevTotalQty = 0
|
|
76
|
+
let prevTotalUomValue = 0
|
|
77
|
+
for (let oh of findSameOrderHistory) {
|
|
78
|
+
prevTotalQty += oh.qty
|
|
79
|
+
prevTotalUomValue += oh.uomValue
|
|
80
|
+
}
|
|
81
|
+
qty -= prevTotalQty
|
|
82
|
+
uomValue -= prevTotalUomValue
|
|
83
|
+
}
|
|
84
|
+
} else if (transactionType == 'UNDO_UNLOADING' || transactionType == 'RETURN') {
|
|
85
|
+
qty = qty
|
|
86
|
+
uomValue = uomValue
|
|
87
|
+
} else {
|
|
88
|
+
qty = 0
|
|
89
|
+
uomValue = 0
|
|
90
|
+
}
|
|
91
|
+
|
|
66
92
|
let inventoryHistory: InventoryHistory = new InventoryHistory()
|
|
67
93
|
inventoryHistory.name = InventoryNoGenerator.inventoryHistoryName()
|
|
68
94
|
inventoryHistory.description = inventory.description
|