@things-factory/worksheet-base 4.3.211 → 4.3.213
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/inbound/putaway-worksheet-controller.js +11 -9
- package/dist-server/controllers/inbound/putaway-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/inbound/unloading-worksheet-controller.js +77 -98
- package/dist-server/controllers/inbound/unloading-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/worksheet-controller.js +28 -8
- package/dist-server/controllers/worksheet-controller.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/putaway/complete-putaway.js +4 -2
- package/dist-server/graphql/resolvers/worksheet/putaway/complete-putaway.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/putaway/putaway.js +3 -1
- package/dist-server/graphql/resolvers/worksheet/putaway/putaway.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/putaway-worksheet.js +86 -49
- package/dist-server/graphql/resolvers/worksheet/putaway-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/unloading/unload.js +5 -3
- package/dist-server/graphql/resolvers/worksheet/unloading/unload.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js +84 -74
- package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/worksheet.js +116 -0
- package/dist-server/graphql/resolvers/worksheet/worksheet.js.map +1 -1
- package/dist-server/graphql/types/worksheet/index.js +10 -4
- package/dist-server/graphql/types/worksheet/index.js.map +1 -1
- package/dist-server/graphql/types/worksheet/worksheet-detail-info.js +4 -0
- package/dist-server/graphql/types/worksheet/worksheet-detail-info.js.map +1 -1
- package/dist-server/utils/lmd-util.js +24 -8
- package/dist-server/utils/lmd-util.js.map +1 -1
- package/package.json +8 -8
- package/server/controllers/inbound/putaway-worksheet-controller.ts +12 -9
- package/server/controllers/inbound/unloading-worksheet-controller.ts +150 -130
- package/server/controllers/worksheet-controller.ts +28 -8
- package/server/graphql/resolvers/worksheet/putaway/complete-putaway.ts +6 -2
- package/server/graphql/resolvers/worksheet/putaway/putaway.ts +5 -1
- package/server/graphql/resolvers/worksheet/putaway-worksheet.ts +92 -46
- package/server/graphql/resolvers/worksheet/unloading/unload.ts +8 -4
- package/server/graphql/resolvers/worksheet/unloading-worksheet.ts +100 -82
- package/server/graphql/resolvers/worksheet/worksheet.ts +134 -0
- package/server/graphql/types/worksheet/index.ts +11 -5
- package/server/graphql/types/worksheet/worksheet-detail-info.ts +4 -0
- package/server/utils/lmd-util.ts +38 -26
|
@@ -1,52 +1,115 @@
|
|
|
1
|
-
import { getRepository } from 'typeorm'
|
|
1
|
+
import { getRepository, EntityManager } from 'typeorm'
|
|
2
|
+
|
|
3
|
+
import { logger } from '@things-factory/env'
|
|
2
4
|
|
|
3
5
|
import { Bizplace } from '@things-factory/biz-base'
|
|
4
6
|
import { ArrivalNotice, OrderInventory } from '@things-factory/sales-base'
|
|
7
|
+
import { Inventory, Location, Pallet } from '@things-factory/warehouse-base'
|
|
8
|
+
import { Product } from '@things-factory/product-base'
|
|
5
9
|
import { Domain } from '@things-factory/shell'
|
|
6
|
-
import { Inventory } from '@things-factory/warehouse-base'
|
|
7
10
|
|
|
8
11
|
import { WORKSHEET_TYPE } from '../../../constants'
|
|
9
12
|
import { Worksheet, WorksheetDetail } from '../../../entities'
|
|
10
13
|
import { fetchExecutingWorksheet } from '../../../utils'
|
|
11
14
|
|
|
15
|
+
import { WORKSHEET_STATUS } from '../../../constants'
|
|
16
|
+
|
|
12
17
|
export const putawayWorksheetResolver = {
|
|
13
18
|
async putawayWorksheet(_: any, { arrivalNoticeNo }, context: any) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
domain,
|
|
21
|
-
name: arrivalNoticeNo
|
|
22
|
-
/*status: In([ORDER_STATUS.PUTTING_AWAY, ORDER_STATUS.PROCESSING])*/
|
|
23
|
-
},
|
|
24
|
-
relations: ['bizplace', 'bizplace.domain', 'bizplace.company', 'bizplace.company.domain']
|
|
25
|
-
})
|
|
19
|
+
return await findPutawayWorksheetByArrivalNoticeNo(arrivalNoticeNo, context)
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export async function findPutawayWorksheetByArrivalNoticeNo(arrivalNoticeNo, context: any) {
|
|
24
|
+
const { domain, tx }: { domain: Domain, tx: EntityManager } = context.state
|
|
26
25
|
|
|
27
|
-
|
|
26
|
+
const arrivalNotice: ArrivalNotice = await tx.getRepository(ArrivalNotice).findOne({
|
|
27
|
+
// Because of partial unloading current status of arrivalNotice can be PUTTING_AWAY or PROCESSING
|
|
28
|
+
// PUTTING_AWAY means unloading is completely finished.
|
|
29
|
+
// PROCESSING means some products are still being unloaded.
|
|
30
|
+
where: {
|
|
31
|
+
domain,
|
|
32
|
+
name: arrivalNoticeNo
|
|
33
|
+
/*status: In([ORDER_STATUS.PUTTING_AWAY, ORDER_STATUS.PROCESSING])*/
|
|
34
|
+
},
|
|
35
|
+
relations: ['bizplace', 'bizplace.domain', 'bizplace.company', 'bizplace.company.domain']
|
|
36
|
+
})
|
|
28
37
|
|
|
38
|
+
if (!arrivalNotice) throw new Error(`Arrival notice dosen't exist.`)
|
|
39
|
+
|
|
40
|
+
try {
|
|
29
41
|
const customerBizplace: Bizplace = arrivalNotice.bizplace
|
|
30
42
|
const customerCompanyDomain: Domain = arrivalNotice.bizplace?.company.domain
|
|
31
|
-
|
|
43
|
+
|
|
44
|
+
// Splitted worksheet details to another query to reduce time required for typeorm mapping
|
|
45
|
+
let worksheet: Worksheet = await fetchExecutingWorksheet(
|
|
32
46
|
domain,
|
|
33
47
|
arrivalNotice.bizplace,
|
|
34
48
|
[
|
|
35
49
|
'bizplace',
|
|
36
50
|
'arrivalNotice',
|
|
37
|
-
'bufferLocation'
|
|
38
|
-
'worksheetDetails',
|
|
39
|
-
'worksheetDetails.targetInventory',
|
|
40
|
-
'worksheetDetails.targetInventory.inventory',
|
|
41
|
-
'worksheetDetails.targetInventory.inventory.location',
|
|
42
|
-
'worksheetDetails.targetInventory.inventory.product',
|
|
43
|
-
'worksheetDetails.targetInventory.inventory.reusablePallet',
|
|
44
|
-
'worksheetDetails.toLocation'
|
|
51
|
+
'bufferLocation'
|
|
45
52
|
],
|
|
46
53
|
WORKSHEET_TYPE.PUTAWAY,
|
|
47
|
-
arrivalNotice
|
|
54
|
+
arrivalNotice,
|
|
55
|
+
tx
|
|
48
56
|
)
|
|
49
57
|
|
|
58
|
+
const toCamelCase = str => str.toLowerCase().replace(/[^a-zA-Z0-9]+(.)/g, (m, chr) => chr.toUpperCase());;
|
|
59
|
+
|
|
60
|
+
let convertSnakeToCamelOnStartingKeyword = (startingKeyword: string, object: object) => {
|
|
61
|
+
let regex = new RegExp(`^${startingKeyword}_`)
|
|
62
|
+
let result = {}
|
|
63
|
+
Object.keys(object).filter(obj => regex.test(obj)).forEach(itm => {
|
|
64
|
+
result[toCamelCase(itm.replace(`${startingKeyword}_`, ''))] = object[itm]
|
|
65
|
+
})
|
|
66
|
+
return result
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
let wdQb = await tx.getRepository(WorksheetDetail).createQueryBuilder('wd')
|
|
70
|
+
wdQb.leftJoinAndSelect('wd.targetInventory', 'oi')
|
|
71
|
+
.leftJoinAndSelect('oi.inventory', 'inv')
|
|
72
|
+
.leftJoinAndSelect('inv.location', 'loc')
|
|
73
|
+
.leftJoinAndSelect('inv.product', 'prd')
|
|
74
|
+
.leftJoinAndSelect('inv.reusablePallet', 'rp')
|
|
75
|
+
.where('wd.worksheet_id = :worksheetId')
|
|
76
|
+
.orderBy('wd.status', 'DESC')
|
|
77
|
+
.addOrderBy('inv.cartonId')
|
|
78
|
+
.addOrderBy('inv.palletId')
|
|
79
|
+
.setParameters({
|
|
80
|
+
worksheetId: worksheet.id,
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
let worksheetDetails = (await wdQb.getRawMany()).map(wd => {
|
|
84
|
+
let product: Product = convertSnakeToCamelOnStartingKeyword('prd', wd)
|
|
85
|
+
let location: Location = convertSnakeToCamelOnStartingKeyword('loc', wd)
|
|
86
|
+
let reusablePallet: Pallet = convertSnakeToCamelOnStartingKeyword('rp', wd)
|
|
87
|
+
|
|
88
|
+
let data = {
|
|
89
|
+
name: wd.wd_name,
|
|
90
|
+
status: wd.wd_status,
|
|
91
|
+
targetName: wd.oi_name,
|
|
92
|
+
description: wd.wd_description,
|
|
93
|
+
palletId: wd.inv_pallet_id,
|
|
94
|
+
cartonId: wd.inv_carton_id,
|
|
95
|
+
batchId: wd.inv_batch_id,
|
|
96
|
+
expirationDate: wd.inv_expiration_date,
|
|
97
|
+
batchIdRef: wd.inv_batch_id_ref,
|
|
98
|
+
qty: wd.inv_qty,
|
|
99
|
+
packingType: wd.inv_packing_type,
|
|
100
|
+
packingSize: wd.inv_packing_size,
|
|
101
|
+
product: product?.id ? product : null,
|
|
102
|
+
location: location?.id ? location : null,
|
|
103
|
+
reusablePallet: reusablePallet?.id ? reusablePallet : null,
|
|
104
|
+
completed: wd.wd_status === WORKSHEET_STATUS.DONE,
|
|
105
|
+
packingTypeSize: `${wd.inv_packing_type}(${wd.inv_packing_size})`,
|
|
106
|
+
reusablePalletName: reusablePallet?.id ? reusablePallet.name : '',
|
|
107
|
+
sku: product.sku,
|
|
108
|
+
expirationPeriod: product.expirationPeriod
|
|
109
|
+
}
|
|
110
|
+
return data
|
|
111
|
+
})
|
|
112
|
+
|
|
50
113
|
return {
|
|
51
114
|
worksheetInfo: {
|
|
52
115
|
bizplaceName: customerBizplace.name,
|
|
@@ -58,27 +121,10 @@ export const putawayWorksheetResolver = {
|
|
|
58
121
|
refNo3: arrivalNotice.refNo3,
|
|
59
122
|
startedAt: worksheet.startedAt
|
|
60
123
|
},
|
|
61
|
-
worksheetDetailInfos:
|
|
62
|
-
const targetInventory: OrderInventory = putawayWSD.targetInventory
|
|
63
|
-
const inventory: Inventory = targetInventory.inventory
|
|
64
|
-
return {
|
|
65
|
-
name: putawayWSD.name,
|
|
66
|
-
palletId: inventory.palletId,
|
|
67
|
-
cartonId: inventory.cartonId,
|
|
68
|
-
batchId: inventory.batchId,
|
|
69
|
-
expirationDate: inventory.expirationDate,
|
|
70
|
-
batchIdRef: inventory.batchIdRef,
|
|
71
|
-
product: inventory.product,
|
|
72
|
-
qty: inventory.qty,
|
|
73
|
-
status: putawayWSD.status,
|
|
74
|
-
description: putawayWSD.description,
|
|
75
|
-
targetName: targetInventory.name,
|
|
76
|
-
packingType: inventory.packingType,
|
|
77
|
-
packingSize: inventory.packingSize,
|
|
78
|
-
location: inventory.location,
|
|
79
|
-
reusablePallet: inventory.reusablePallet
|
|
80
|
-
}
|
|
81
|
-
})
|
|
124
|
+
worksheetDetailInfos: worksheetDetails
|
|
82
125
|
}
|
|
126
|
+
} catch (error) {
|
|
127
|
+
logger.error(`[putawayWorksheet - ${domain.name} - ${arrivalNoticeNo}]${error}`)
|
|
128
|
+
throw 'Something went wrong.'
|
|
83
129
|
}
|
|
84
130
|
}
|
|
@@ -5,11 +5,15 @@ import { Domain } from '@things-factory/shell'
|
|
|
5
5
|
import { Inventory } from '@things-factory/warehouse-base'
|
|
6
6
|
|
|
7
7
|
import { UnloadingWorksheetController } from '../../../../controllers'
|
|
8
|
+
import { unloadingWorksheetResolver } from '../unloading-worksheet'
|
|
9
|
+
import { findUnloadingWorksheetByArrivalNoticeNo } from '../unloading-worksheet'
|
|
8
10
|
|
|
9
11
|
export const unloadResolver = {
|
|
10
|
-
async unload(_: any, { worksheetDetailName, inventory, productBarcode }, context: any) {
|
|
12
|
+
async unload(_: any, { worksheetDetailName, inventory, productBarcode, orderType }, context: any) {
|
|
11
13
|
const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
|
|
12
|
-
await unload(tx, domain, user, worksheetDetailName, inventory, productBarcode)
|
|
14
|
+
const arrivalNoticeNo = await unload(tx, domain, user, worksheetDetailName, inventory, productBarcode)
|
|
15
|
+
|
|
16
|
+
return await findUnloadingWorksheetByArrivalNoticeNo(arrivalNoticeNo, context)
|
|
13
17
|
}
|
|
14
18
|
}
|
|
15
19
|
|
|
@@ -20,7 +24,7 @@ async function unload(
|
|
|
20
24
|
worksheetDetailName: string,
|
|
21
25
|
inventory: Partial<Inventory>,
|
|
22
26
|
productBarcode: string
|
|
23
|
-
): Promise<
|
|
27
|
+
): Promise<string> {
|
|
24
28
|
const worksheetController: UnloadingWorksheetController = new UnloadingWorksheetController(tx, domain, user)
|
|
25
|
-
await worksheetController.unload(worksheetDetailName, inventory, productBarcode)
|
|
29
|
+
return await worksheetController.unload(worksheetDetailName, inventory, productBarcode)
|
|
26
30
|
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { getRepository } from 'typeorm'
|
|
1
|
+
import { EntityManager, SelectQueryBuilder, getRepository } from 'typeorm'
|
|
2
2
|
|
|
3
3
|
import { Bizplace } from '@things-factory/biz-base'
|
|
4
4
|
import { ArrivalNotice, OrderProduct } from '@things-factory/sales-base'
|
|
5
5
|
import { Domain } from '@things-factory/shell'
|
|
6
|
+
import { Product } from '@things-factory/product-base'
|
|
6
7
|
|
|
7
8
|
import { WORKSHEET_TYPE } from '../../../constants'
|
|
8
9
|
import { Worksheet, WorksheetDetail } from '../../../entities'
|
|
@@ -10,91 +11,108 @@ import { fetchExecutingWorksheet } from '../../../utils'
|
|
|
10
11
|
|
|
11
12
|
export const unloadingWorksheetResolver = {
|
|
12
13
|
async unloadingWorksheet(_: any, { arrivalNoticeNo }, context: any) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
relations: ['bizplace', 'bizplace.domain', 'bizplace.company', 'bizplace.company.domain']
|
|
17
|
-
})
|
|
18
|
-
if (!arrivalNotice) throw new Error(`Arrival notice doesn't exist.`)
|
|
14
|
+
return await findUnloadingWorksheetByArrivalNoticeNo(arrivalNoticeNo, context)
|
|
15
|
+
}
|
|
16
|
+
}
|
|
19
17
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
'bufferLocation',
|
|
28
|
-
'bufferLocation.warehouse',
|
|
29
|
-
'arrivalNotice',
|
|
30
|
-
'worksheetDetails',
|
|
31
|
-
'worksheetDetails.targetProduct',
|
|
32
|
-
'worksheetDetails.targetProduct.product',
|
|
33
|
-
'creator',
|
|
34
|
-
'updater'
|
|
35
|
-
],
|
|
36
|
-
WORKSHEET_TYPE.UNLOADING,
|
|
37
|
-
arrivalNotice
|
|
38
|
-
)
|
|
18
|
+
export async function findUnloadingWorksheetByArrivalNoticeNo(arrivalNoticeNo, context: any) {
|
|
19
|
+
const { domain, tx }: { domain: Domain; tx: EntityManager } = context.state
|
|
20
|
+
const arrivalNotice: ArrivalNotice = await tx.getRepository(ArrivalNotice).findOne({
|
|
21
|
+
where: { domain, name: arrivalNoticeNo /*status: ORDER_STATUS.PROCESSING*/ },
|
|
22
|
+
relations: ['bizplace', 'bizplace.domain', 'bizplace.company', 'bizplace.company.domain']
|
|
23
|
+
})
|
|
24
|
+
if (!arrivalNotice) throw new Error(`Arrival notice doesn't exist.`)
|
|
39
25
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
'worksheetDetails.targetVas',
|
|
54
|
-
'worksheetDetails.targetVas.vas',
|
|
55
|
-
'creator',
|
|
56
|
-
'updater'
|
|
57
|
-
]
|
|
58
|
-
})
|
|
26
|
+
const customerBizplace: Bizplace = arrivalNotice.bizplace
|
|
27
|
+
const customerCompanyDomain: Domain = arrivalNotice.bizplace?.company.domain
|
|
28
|
+
|
|
29
|
+
let worksheet: Worksheet = await fetchExecutingWorksheet(
|
|
30
|
+
domain,
|
|
31
|
+
customerBizplace,
|
|
32
|
+
['bizplace', 'bufferLocation'],
|
|
33
|
+
WORKSHEET_TYPE.UNLOADING,
|
|
34
|
+
arrivalNotice,
|
|
35
|
+
tx
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
const qb: SelectQueryBuilder<WorksheetDetail> = tx.getRepository(WorksheetDetail).createQueryBuilder('wd')
|
|
59
39
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
bizplaceName: customerBizplace.name,
|
|
64
|
-
partnerDomainId: customerBizplace?.domain.id,
|
|
65
|
-
customerCompanyDomainId: customerCompanyDomain.id,
|
|
66
|
-
containerNo: arrivalNotice.containerNo,
|
|
67
|
-
bufferLocation: worksheet.bufferLocation.name,
|
|
68
|
-
startedAt: worksheet.startedAt,
|
|
69
|
-
refNo: arrivalNotice.refNo,
|
|
70
|
-
refNo2: arrivalNotice?.refNo2,
|
|
71
|
-
refNo3: arrivalNotice?.refNo3,
|
|
72
|
-
looseItem: arrivalNotice.looseItem,
|
|
73
|
-
orderVas: vasWorksheet ? vasWorksheet.worksheetDetails : null
|
|
74
|
-
},
|
|
75
|
-
worksheetDetailInfos: worksheet.worksheetDetails.map(async (productWSD: WorksheetDetail) => {
|
|
76
|
-
const targetProduct: OrderProduct = productWSD.targetProduct
|
|
40
|
+
qb.leftJoinAndSelect('wd.targetProduct', 'op')
|
|
41
|
+
.leftJoinAndSelect('op.product', 'prd')
|
|
42
|
+
.where('wd.worksheet_id = :worksheetId', { worksheetId: worksheet.id })
|
|
77
43
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
44
|
+
const vasWorksheet: Worksheet = await tx.getRepository(Worksheet).findOne({
|
|
45
|
+
where: {
|
|
46
|
+
domain,
|
|
47
|
+
arrivalNotice,
|
|
48
|
+
type: WORKSHEET_TYPE.VAS
|
|
49
|
+
},
|
|
50
|
+
relations: [
|
|
51
|
+
'bizplace',
|
|
52
|
+
'bizplace.domain',
|
|
53
|
+
'bufferLocation',
|
|
54
|
+
'bufferLocation.warehouse',
|
|
55
|
+
'arrivalNotice',
|
|
56
|
+
'worksheetDetails',
|
|
57
|
+
'worksheetDetails.targetVas',
|
|
58
|
+
'worksheetDetails.targetVas.vas',
|
|
59
|
+
'creator',
|
|
60
|
+
'updater'
|
|
61
|
+
]
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
const toCamelCase = str => str.toLowerCase().replace(/[^a-zA-Z0-9]+(.)/g, (m, chr) => chr.toUpperCase())
|
|
65
|
+
|
|
66
|
+
let convertSnakeToCamelOnStartingKeyword = (startingKeyword: string, object: object) => {
|
|
67
|
+
let regex = new RegExp(`^${startingKeyword}_`)
|
|
68
|
+
let result = {}
|
|
69
|
+
Object.keys(object)
|
|
70
|
+
.filter(obj => regex.test(obj))
|
|
71
|
+
.forEach(itm => {
|
|
72
|
+
result[toCamelCase(itm.replace(`${startingKeyword}_`, ''))] = object[itm]
|
|
97
73
|
})
|
|
98
|
-
|
|
74
|
+
return result
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return {
|
|
78
|
+
worksheetInfo: {
|
|
79
|
+
arrivalNotice,
|
|
80
|
+
bizplaceName: customerBizplace.name,
|
|
81
|
+
partnerDomainId: customerBizplace?.domain.id,
|
|
82
|
+
customerCompanyDomainId: customerCompanyDomain.id,
|
|
83
|
+
containerNo: arrivalNotice.containerNo,
|
|
84
|
+
bufferLocation: worksheet.bufferLocation.name,
|
|
85
|
+
startedAt: worksheet.startedAt,
|
|
86
|
+
refNo: arrivalNotice.refNo,
|
|
87
|
+
refNo2: arrivalNotice?.refNo2,
|
|
88
|
+
refNo3: arrivalNotice?.refNo3,
|
|
89
|
+
looseItem: arrivalNotice.looseItem,
|
|
90
|
+
orderVas: vasWorksheet ? vasWorksheet.worksheetDetails : null
|
|
91
|
+
},
|
|
92
|
+
worksheetDetailInfos: (await qb.getRawMany()).map(async (productWSD: WorksheetDetail) => {
|
|
93
|
+
let product: Product = convertSnakeToCamelOnStartingKeyword('prd', productWSD)
|
|
94
|
+
let targetProduct: OrderProduct = convertSnakeToCamelOnStartingKeyword('op', productWSD)
|
|
95
|
+
let worksheetDetail: any = convertSnakeToCamelOnStartingKeyword('wd', productWSD)
|
|
96
|
+
|
|
97
|
+
return {
|
|
98
|
+
id: worksheetDetail.id,
|
|
99
|
+
name: worksheetDetail.name,
|
|
100
|
+
batchId: targetProduct.batchId,
|
|
101
|
+
batchIdRef: targetProduct.batchIdRef,
|
|
102
|
+
product: product?.id ? product : null,
|
|
103
|
+
description: worksheetDetail.description,
|
|
104
|
+
targetName: targetProduct.name,
|
|
105
|
+
packingType: targetProduct.packingType,
|
|
106
|
+
packingSize: targetProduct.packingSize,
|
|
107
|
+
palletQty: targetProduct.palletQty,
|
|
108
|
+
actualPalletQty: targetProduct.actualPalletQty,
|
|
109
|
+
packQty: targetProduct.packQty,
|
|
110
|
+
actualPackQty: targetProduct.actualPackQty,
|
|
111
|
+
remark: targetProduct.remark,
|
|
112
|
+
issue: worksheetDetail.issue,
|
|
113
|
+
status: worksheetDetail.status,
|
|
114
|
+
manufactureDate: targetProduct.manufactureDate ? new Date(targetProduct.manufactureDate) : null
|
|
115
|
+
}
|
|
116
|
+
})
|
|
99
117
|
}
|
|
100
118
|
}
|
|
@@ -307,6 +307,140 @@ export const worksheetResolver = {
|
|
|
307
307
|
})
|
|
308
308
|
}
|
|
309
309
|
|
|
310
|
+
return worksheet
|
|
311
|
+
},
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
async inboundWorksheetDetails(_: any, { name }, context: any) {
|
|
315
|
+
const { domain }: { domain: Domain } = context.state
|
|
316
|
+
|
|
317
|
+
let qbWorksheet = getRepository(Worksheet)
|
|
318
|
+
.createQueryBuilder('w')
|
|
319
|
+
.select('w')
|
|
320
|
+
.addSelect('bizplace.id')
|
|
321
|
+
.addSelect('bizplace.name')
|
|
322
|
+
.addSelect('bizplaceDomain.id')
|
|
323
|
+
.addSelect('bizplaceDomain.name')
|
|
324
|
+
.addSelect('bufferLocation.name')
|
|
325
|
+
.addSelect('bufferLocationWarehouse.name')
|
|
326
|
+
.leftJoinAndSelect('w.domain', 'domain')
|
|
327
|
+
.leftJoin('w.bizplace', 'bizplace')
|
|
328
|
+
.leftJoin('bizplace.domain', 'bizplaceDomain')
|
|
329
|
+
.leftJoin('w.bufferLocation', 'bufferLocation')
|
|
330
|
+
.leftJoin('bufferLocation.warehouse', 'bufferLocationWarehouse')
|
|
331
|
+
.leftJoinAndSelect('w.arrivalNotice', 'arrivalNotice')
|
|
332
|
+
.leftJoinAndSelect('w.vasOrder', 'vasOrder')
|
|
333
|
+
.where('w.domain_id = :domain', { domain: domain.id })
|
|
334
|
+
.andWhere('w.name = :name', { name: name })
|
|
335
|
+
|
|
336
|
+
let foundWorksheet: Worksheet = await qbWorksheet.getOne()
|
|
337
|
+
|
|
338
|
+
let qbWorksheetDetails = getRepository(WorksheetDetail).createQueryBuilder('worksheetDetails')
|
|
339
|
+
|
|
340
|
+
let worksheetDetails: WorksheetDetail[] = []
|
|
341
|
+
if (foundWorksheet.type === 'UNLOADING') {
|
|
342
|
+
qbWorksheetDetails.select('worksheetDetails')
|
|
343
|
+
.leftJoinAndSelect('worksheetDetails.targetProduct', 'targetProduct')
|
|
344
|
+
.leftJoinAndSelect('targetProduct.product', 'product')
|
|
345
|
+
.where('worksheetDetails.worksheet_id =:worksheetId', { worksheetId: foundWorksheet.id })
|
|
346
|
+
worksheetDetails = await qbWorksheetDetails.getMany()
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
if (foundWorksheet.type === 'PUTAWAY') {
|
|
350
|
+
qbWorksheetDetails
|
|
351
|
+
.select('worksheetDetails')
|
|
352
|
+
.addSelect('location.name')
|
|
353
|
+
.addSelect('location.description')
|
|
354
|
+
.addSelect('location.type')
|
|
355
|
+
.leftJoinAndSelect('worksheetDetails.targetInventory', 'targetInventory')
|
|
356
|
+
.leftJoinAndSelect('targetInventory.inventory', 'inventory')
|
|
357
|
+
.leftJoinAndSelect('inventory.product', 'product')
|
|
358
|
+
.leftJoin('inventory.location', 'location')
|
|
359
|
+
.where('worksheetDetails.worksheet_id =:worksheetId', { worksheetId: foundWorksheet.id })
|
|
360
|
+
worksheetDetails = await qbWorksheetDetails.getMany()
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
let orderInventories: OrderInventory[] = worksheetDetails.filter(wd => { if (wd.targetInventory) { return wd.targetInventory } })
|
|
364
|
+
|
|
365
|
+
let orderProducts: OrderProduct[] = worksheetDetails.filter(wd => { if (wd.targetProduct) { return wd.targetProduct } })
|
|
366
|
+
|
|
367
|
+
let orderVas: OrderVas[] = worksheetDetails.filter(wd => { if (wd.targetVas) { return wd.targetVas } })
|
|
368
|
+
|
|
369
|
+
// console.time('map')
|
|
370
|
+
let worksheet: WorksheetInterface = {
|
|
371
|
+
...foundWorksheet,
|
|
372
|
+
worksheetDetails: worksheetDetails,
|
|
373
|
+
orderInventories: orderInventories,
|
|
374
|
+
orderProducts: orderProducts,
|
|
375
|
+
orderVass: orderVas,
|
|
376
|
+
marketplaceOrder: {}
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
if (!worksheet) {
|
|
380
|
+
worksheet = (await getRepository(Worksheet).findOne({
|
|
381
|
+
where: {
|
|
382
|
+
domain,
|
|
383
|
+
arrivalNotice: name
|
|
384
|
+
},
|
|
385
|
+
relations: [
|
|
386
|
+
'domain',
|
|
387
|
+
'bizplace',
|
|
388
|
+
'bizplace.domain',
|
|
389
|
+
'worksheetDetails',
|
|
390
|
+
'worksheetDetails.targetProduct',
|
|
391
|
+
'worksheetDetails.targetProduct.product',
|
|
392
|
+
'worksheetDetails.targetInventory',
|
|
393
|
+
'worksheetDetails.targetInventory.releaseGood',
|
|
394
|
+
'worksheetDetails.targetInventory.product',
|
|
395
|
+
'worksheetDetails.targetInventory.inventory',
|
|
396
|
+
'worksheetDetails.targetInventory.inventory.product',
|
|
397
|
+
'worksheetDetails.targetInventory.inventory.warehouse',
|
|
398
|
+
'worksheetDetails.targetInventory.inventory.location',
|
|
399
|
+
'worksheetDetails.targetInventory.inspectedLocation',
|
|
400
|
+
'creator',
|
|
401
|
+
'updater'
|
|
402
|
+
]
|
|
403
|
+
})) as WorksheetInterface
|
|
404
|
+
}
|
|
405
|
+
if (worksheet?.arrivalNotice?.id) {
|
|
406
|
+
worksheet.orderProducts = await getRepository(OrderProduct).find({
|
|
407
|
+
where: {
|
|
408
|
+
domain,
|
|
409
|
+
bizplace: worksheet.bizplace,
|
|
410
|
+
arrivalNotice: worksheet.arrivalNotice
|
|
411
|
+
}
|
|
412
|
+
})
|
|
413
|
+
|
|
414
|
+
worksheet.orderVass = await getRepository(OrderVas).find({
|
|
415
|
+
where: {
|
|
416
|
+
domain,
|
|
417
|
+
bizplace: worksheet.bizplace,
|
|
418
|
+
arrivalNotice: worksheet.arrivalNotice
|
|
419
|
+
},
|
|
420
|
+
relations: ['targetProduct']
|
|
421
|
+
})
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
if (worksheet?.orderInventories?.length > 0) {
|
|
425
|
+
worksheet.worksheetDetails.sort(function (a, b) {
|
|
426
|
+
return (
|
|
427
|
+
worksheet.orderInventories.map(oi => oi.id).indexOf(a.targetInventory.id) -
|
|
428
|
+
worksheet.orderInventories.map(oi => oi.id).indexOf(b.targetInventory.id)
|
|
429
|
+
)
|
|
430
|
+
})
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
if (worksheet?.vasOrder?.id) {
|
|
434
|
+
worksheet.orderVass = await getRepository(OrderVas).find({
|
|
435
|
+
where: {
|
|
436
|
+
domain,
|
|
437
|
+
bizplace: worksheet.bizplace,
|
|
438
|
+
vasOrder: worksheet.vasOrder
|
|
439
|
+
},
|
|
440
|
+
relations: ['targetProduct']
|
|
441
|
+
})
|
|
442
|
+
}
|
|
443
|
+
|
|
310
444
|
return worksheet
|
|
311
445
|
}
|
|
312
446
|
}
|
|
@@ -200,7 +200,8 @@ export const Mutation = /* GraphQL */ `
|
|
|
200
200
|
worksheetDetailName: String!
|
|
201
201
|
inventory: InventoryPatch!
|
|
202
202
|
productBarcode: String
|
|
203
|
-
|
|
203
|
+
orderType: String
|
|
204
|
+
): ExecutingWorksheet @privilege(category: "worksheet_execute", privilege: "mutation") @transaction
|
|
204
205
|
|
|
205
206
|
completeProductScanUnload (
|
|
206
207
|
worksheetDetailName: String!
|
|
@@ -260,11 +261,12 @@ export const Mutation = /* GraphQL */ `
|
|
|
260
261
|
): Worksheet @privilege(category: "worksheet_execute", privilege: "mutation") @transaction
|
|
261
262
|
|
|
262
263
|
putaway (
|
|
264
|
+
arrivalNoticeNo: String!
|
|
263
265
|
worksheetDetailName: [String]!
|
|
264
266
|
palletId: String
|
|
265
267
|
cartonId: String
|
|
266
268
|
toLocation: String!
|
|
267
|
-
):
|
|
269
|
+
): ExecutingWorksheet @privilege(category: "worksheet_execute", privilege: "mutation") @transaction
|
|
268
270
|
|
|
269
271
|
replenishmentPutaway (
|
|
270
272
|
worksheetDetailName: [String]!
|
|
@@ -623,9 +625,13 @@ export const Query = /* GraphQL */ `
|
|
|
623
625
|
name: String!
|
|
624
626
|
): Worksheet @privilege(category: "worksheet", privilege: "query")
|
|
625
627
|
|
|
628
|
+
inboundWorksheetDetails (
|
|
629
|
+
name: String!
|
|
630
|
+
): Worksheet @privilege(category: "worksheet", privilege: "query")
|
|
631
|
+
|
|
626
632
|
unloadingWorksheet (
|
|
627
633
|
arrivalNoticeNo: String!
|
|
628
|
-
): ExecutingWorksheet @privilege(category: "worksheet", privilege: "query")
|
|
634
|
+
): ExecutingWorksheet @privilege(category: "worksheet", privilege: "query") @transaction
|
|
629
635
|
|
|
630
636
|
unloadingReturnWorksheet (
|
|
631
637
|
returnOrderNo: String!
|
|
@@ -650,7 +656,7 @@ export const Query = /* GraphQL */ `
|
|
|
650
656
|
|
|
651
657
|
putawayWorksheet (
|
|
652
658
|
arrivalNoticeNo: String!
|
|
653
|
-
): ExecutingWorksheet @privilege(category: "worksheet", privilege: "query")
|
|
659
|
+
): ExecutingWorksheet @privilege(category: "worksheet", privilege: "query") @transaction
|
|
654
660
|
|
|
655
661
|
putawayReplenishmentWorksheet (
|
|
656
662
|
replenishmentNo: String!
|
|
@@ -762,7 +768,7 @@ export const Query = /* GraphQL */ `
|
|
|
762
768
|
findReleaseOrdersByTaskNo(taskNo: String!): FindReleaseOrdersByTaskNo @privilege(category: "worksheet", privilege: "query") @transaction
|
|
763
769
|
`
|
|
764
770
|
|
|
765
|
-
export const Types = /* GraphQL */
|
|
771
|
+
export const Types = /* GraphQL */[
|
|
766
772
|
Worksheet,
|
|
767
773
|
SellercraftDocument,
|
|
768
774
|
NewWorksheet,
|
|
@@ -65,5 +65,9 @@ export const WorksheetDetailInfo = gql`
|
|
|
65
65
|
isRequireSerialNumberScanningOutbound: Boolean
|
|
66
66
|
hasMissingInventoryChanges: Boolean
|
|
67
67
|
toteName: String
|
|
68
|
+
completed: Boolean
|
|
69
|
+
packingTypeSize: String
|
|
70
|
+
reusablePalletName: String
|
|
71
|
+
expirationPeriod: Int
|
|
68
72
|
}
|
|
69
73
|
`
|