@things-factory/worksheet-base 4.3.159 → 4.3.161
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-returning-worksheet-controller.js +3 -1
- package/dist-server/controllers/inbound/putaway-returning-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/inbound/putaway-worksheet-controller.js +3 -1
- package/dist-server/controllers/inbound/putaway-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/picking-worksheet-controller.js +25 -14
- package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/render-manifest.js +11 -11
- package/dist-server/controllers/render-manifest.js.map +1 -1
- package/dist-server/controllers/worksheet-controller.js +9 -17
- package/dist-server/controllers/worksheet-controller.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js +20 -13
- package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js +155 -124
- package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +249 -217
- package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet-detail/regenerate-release-good-worksheet-details.js +23 -5
- package/dist-server/graphql/resolvers/worksheet-detail/regenerate-release-good-worksheet-details.js.map +1 -1
- package/dist-server/graphql/types/worksheet/index.js +2 -2
- package/dist-server/utils/inventory-util.js +29 -1
- package/dist-server/utils/inventory-util.js.map +1 -1
- package/package.json +6 -6
- package/server/controllers/inbound/putaway-returning-worksheet-controller.ts +3 -1
- package/server/controllers/inbound/putaway-worksheet-controller.ts +3 -1
- package/server/controllers/outbound/picking-worksheet-controller.ts +32 -16
- package/server/controllers/render-manifest.ts +10 -12
- package/server/controllers/worksheet-controller.ts +13 -17
- package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +24 -13
- package/server/graphql/resolvers/worksheet/picking/complete-batch-picking.ts +180 -142
- package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +276 -239
- package/server/graphql/resolvers/worksheet-detail/regenerate-release-good-worksheet-details.ts +38 -8
- package/server/graphql/types/worksheet/index.ts +2 -2
- package/server/utils/inventory-util.ts +36 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EntityManager, getManager } from 'typeorm'
|
|
1
|
+
import { EntityManager, getManager, In } from 'typeorm'
|
|
2
2
|
|
|
3
3
|
import { ApplicationType, User } from '@things-factory/auth-base'
|
|
4
4
|
import { Bizplace, getMyBizplace } from '@things-factory/biz-base'
|
|
@@ -11,11 +11,11 @@ import {
|
|
|
11
11
|
OrderNoGenerator,
|
|
12
12
|
OrderPackage,
|
|
13
13
|
OrderPackageItem,
|
|
14
|
-
ReleaseGood
|
|
15
|
-
OrderProduct
|
|
14
|
+
ReleaseGood
|
|
16
15
|
} from '@things-factory/sales-base'
|
|
17
16
|
import { Setting } from '@things-factory/setting-base'
|
|
18
17
|
import { Domain } from '@things-factory/shell'
|
|
18
|
+
import { Inventory } from '@things-factory/warehouse-base'
|
|
19
19
|
|
|
20
20
|
import {
|
|
21
21
|
PackingWorksheetController,
|
|
@@ -25,14 +25,16 @@ import {
|
|
|
25
25
|
} from '../../../../controllers/'
|
|
26
26
|
import { EcommerceController } from '../../../../controllers/ecommerce'
|
|
27
27
|
import { WorksheetController } from '../../../../controllers/worksheet-controller'
|
|
28
|
-
import { WorksheetDetail } from '../../../../entities'
|
|
28
|
+
import { Worksheet, WorksheetDetail } from '../../../../entities'
|
|
29
29
|
|
|
30
30
|
export const completeBatchPickingResolver = {
|
|
31
31
|
async completeBatchPicking(_: any, { taskNo }, context: any) {
|
|
32
32
|
const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
|
|
33
33
|
|
|
34
|
-
await completeBatchPicking(tx, domain, user, taskNo)
|
|
35
|
-
|
|
34
|
+
let obsolete = await completeBatchPicking(tx, domain, user, taskNo)
|
|
35
|
+
if (obsolete) {
|
|
36
|
+
return { obsolete: true }
|
|
37
|
+
}
|
|
36
38
|
const bizplace: Bizplace = await getMyBizplace(domain, user)
|
|
37
39
|
const worksheetController: WorksheetController = new WorksheetController(tx, domain, user)
|
|
38
40
|
await worksheetController.notifyToCustomer(bizplace, {
|
|
@@ -49,163 +51,199 @@ export async function completeBatchPicking(
|
|
|
49
51
|
domain: Domain,
|
|
50
52
|
user: User,
|
|
51
53
|
taskNo: string
|
|
52
|
-
): Promise<
|
|
54
|
+
): Promise<any> {
|
|
53
55
|
const pickingWSCtrl: PickingWorksheetController = new PickingWorksheetController(tx, domain, user)
|
|
54
56
|
const worksheet = await pickingWSCtrl.completeBatchPicking(taskNo)
|
|
55
57
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
58
|
+
if (worksheet?.type) {
|
|
59
|
+
const worksheetDetails: WorksheetDetail[] = worksheet.worksheetDetails
|
|
60
|
+
const targetInventories: OrderInventory[] = worksheetDetails
|
|
61
|
+
.filter(wsd => wsd.status != 'MISSING')
|
|
62
|
+
.map((wsd: WorksheetDetail) => wsd.targetInventory)
|
|
63
|
+
|
|
64
|
+
const releaseGoods: ReleaseGood[] = worksheetDetails.map(
|
|
65
|
+
worksheetDetail => worksheetDetail.targetInventory && worksheetDetail.targetInventory.releaseGood
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
const uniqueReleaseGoods: ReleaseGood[] = []
|
|
69
|
+
const map = new Map()
|
|
70
|
+
for (const releaseGood of releaseGoods) {
|
|
71
|
+
if (!map.has(releaseGood.id)) {
|
|
72
|
+
map.set(releaseGood.id, true)
|
|
73
|
+
uniqueReleaseGoods.push({ ...releaseGood })
|
|
74
|
+
}
|
|
70
75
|
}
|
|
71
|
-
}
|
|
72
76
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
77
|
+
for (let i = 0; i < uniqueReleaseGoods.length; i++) {
|
|
78
|
+
let foundReleaseGood: ReleaseGood = await tx.getRepository(ReleaseGood).findOne({
|
|
79
|
+
where: { id: uniqueReleaseGoods[i].id },
|
|
80
|
+
relations: [
|
|
81
|
+
'domain',
|
|
82
|
+
'creator',
|
|
83
|
+
'updater',
|
|
84
|
+
'orderPackages',
|
|
85
|
+
'orderProducts',
|
|
86
|
+
'orderProducts.product',
|
|
87
|
+
'bizplace',
|
|
88
|
+
'bizplace.company',
|
|
89
|
+
'bizplace.company.domain'
|
|
90
|
+
]
|
|
91
|
+
})
|
|
92
|
+
const orderSource: string = foundReleaseGood.source
|
|
93
|
+
switch (orderSource) {
|
|
94
|
+
case ApplicationType.SELLERCRAFT:
|
|
95
|
+
const sellercraft: Sellercraft = await tx
|
|
96
|
+
.getRepository(Sellercraft)
|
|
97
|
+
.findOne({ domain: worksheet.bizplace.domain, status: SellercraftStatus.ACTIVE })
|
|
98
|
+
|
|
99
|
+
if (sellercraft) {
|
|
100
|
+
const initSCOrderShipment = async (sellercraft: Sellercraft, foundReleaseGood: ReleaseGood) => {
|
|
101
|
+
await getManager().transaction(async txMgr => {
|
|
102
|
+
const sellercraftCtrl: SellercraftController = new SellercraftController(txMgr, domain, user)
|
|
103
|
+
|
|
104
|
+
if (!foundReleaseGood?.orderPackages?.length && !foundReleaseGood?.marketPackCallSuccess) {
|
|
105
|
+
await sellercraftCtrl.packOrder(sellercraft, foundReleaseGood)
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const rtsTriggerLevel: Setting = await tx.getRepository(Setting).findOne({
|
|
109
|
+
where: { domain, category: 'id-rule', name: 'rts-trigger-level' }
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
if (rtsTriggerLevel && parseInt(rtsTriggerLevel?.value || 0) == 1) {
|
|
113
|
+
await sellercraftCtrl.initiateOrderShipment(sellercraft, foundReleaseGood)
|
|
114
|
+
}
|
|
106
115
|
})
|
|
116
|
+
}
|
|
107
117
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
}
|
|
111
|
-
})
|
|
118
|
+
// asynchronouly call to initiate sellercraft order shipment/ RTS
|
|
119
|
+
initSCOrderShipment(sellercraft, foundReleaseGood)
|
|
112
120
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
domain: foundReleaseGood.domain,
|
|
150
|
-
bizplace: foundReleaseGood.bizplace,
|
|
151
|
-
creator: foundReleaseGood.creator,
|
|
152
|
-
updater: foundReleaseGood.updater
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
let savedOrderPackage: OrderPackage = await tx.getRepository(OrderPackage).save(orderPackage)
|
|
156
|
-
const orderPackageItems: OrderPackageItem[] = foundReleaseGood.orderProducts.map(op => {
|
|
157
|
-
return {
|
|
158
|
-
name: OrderNoGenerator.orderPackageItem(),
|
|
159
|
-
orderProduct: op,
|
|
121
|
+
break
|
|
122
|
+
|
|
123
|
+
case ApplicationType.MMS:
|
|
124
|
+
const companyDomain: Domain = foundReleaseGood.bizplace.company.domain
|
|
125
|
+
const marketplaceOrder: MarketplaceOrder = await tx.getRepository(MarketplaceOrder).findOne({
|
|
126
|
+
where: { orderNo: foundReleaseGood.refNo, domain: companyDomain },
|
|
127
|
+
relations: [
|
|
128
|
+
'marketplaceOrderItems',
|
|
129
|
+
'marketplaceOrderItems.marketplaceOrderShippingItems',
|
|
130
|
+
'marketplaceOrderItems.marketplaceOrderShippingItems.marketplaceOrderShipping',
|
|
131
|
+
'marketplaceStore',
|
|
132
|
+
'marketplaceStore.marketplaceDistributors'
|
|
133
|
+
]
|
|
134
|
+
})
|
|
135
|
+
const marketplaceStore: MarketplaceStore = marketplaceOrder.marketplaceStore
|
|
136
|
+
|
|
137
|
+
const ecommerceCtrl: EcommerceController = new EcommerceController(tx, domain, user)
|
|
138
|
+
if (marketplaceStore?.isAutoUpdateShipment) {
|
|
139
|
+
await ecommerceCtrl.createOrderShip(foundReleaseGood, marketplaceStore, marketplaceOrder, companyDomain)
|
|
140
|
+
}
|
|
141
|
+
await ecommerceCtrl.createOrderPackage(
|
|
142
|
+
tx,
|
|
143
|
+
marketplaceOrder,
|
|
144
|
+
companyDomain,
|
|
145
|
+
marketplaceStore,
|
|
146
|
+
foundReleaseGood
|
|
147
|
+
)
|
|
148
|
+
break
|
|
149
|
+
|
|
150
|
+
default:
|
|
151
|
+
const orderPackage: OrderPackage = {
|
|
152
|
+
name: OrderNoGenerator.orderPackage(),
|
|
153
|
+
packageId: null,
|
|
154
|
+
trackingNo: null,
|
|
155
|
+
transporter: null,
|
|
156
|
+
airwayBill: null,
|
|
160
157
|
status: ORDER_STATUS.PROCESSING,
|
|
161
|
-
|
|
162
|
-
orderPackage: savedOrderPackage,
|
|
158
|
+
releaseGood: foundReleaseGood,
|
|
163
159
|
domain: foundReleaseGood.domain,
|
|
164
160
|
bizplace: foundReleaseGood.bizplace,
|
|
165
161
|
creator: foundReleaseGood.creator,
|
|
166
162
|
updater: foundReleaseGood.updater
|
|
167
163
|
}
|
|
168
|
-
})
|
|
169
164
|
|
|
170
|
-
|
|
171
|
-
|
|
165
|
+
let savedOrderPackage: OrderPackage = await tx.getRepository(OrderPackage).save(orderPackage)
|
|
166
|
+
const orderPackageItems: OrderPackageItem[] = foundReleaseGood.orderProducts.map(op => {
|
|
167
|
+
return {
|
|
168
|
+
name: OrderNoGenerator.orderPackageItem(),
|
|
169
|
+
orderProduct: op,
|
|
170
|
+
status: ORDER_STATUS.PROCESSING,
|
|
171
|
+
releaseQty: op.releaseQty,
|
|
172
|
+
orderPackage: savedOrderPackage,
|
|
173
|
+
domain: foundReleaseGood.domain,
|
|
174
|
+
bizplace: foundReleaseGood.bizplace,
|
|
175
|
+
creator: foundReleaseGood.creator,
|
|
176
|
+
updater: foundReleaseGood.updater
|
|
177
|
+
}
|
|
178
|
+
})
|
|
179
|
+
|
|
180
|
+
await tx.getRepository(OrderPackageItem).save(orderPackageItems)
|
|
181
|
+
break
|
|
182
|
+
}
|
|
172
183
|
}
|
|
173
|
-
}
|
|
174
184
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
185
|
+
const pickPackTargetInventories: OrderInventory[] = targetInventories
|
|
186
|
+
.filter(targetInventory => targetInventory.releaseGood.packingOption)
|
|
187
|
+
.map((pickPackTargetInventory: OrderInventory) => {
|
|
188
|
+
return pickPackTargetInventory
|
|
189
|
+
})
|
|
190
|
+
|
|
191
|
+
const pickSortTargetInventories: OrderInventory[] = targetInventories
|
|
192
|
+
.filter(targetInventory => !targetInventory.releaseGood.packingOption)
|
|
193
|
+
.map((pickSortTargetInventory: OrderInventory) => {
|
|
194
|
+
return pickSortTargetInventory
|
|
195
|
+
})
|
|
196
|
+
|
|
197
|
+
if (pickPackTargetInventories?.length) {
|
|
198
|
+
// pull out all unique RO
|
|
199
|
+
const roNoList: string[] = pickPackTargetInventories.map((oi: OrderInventory) => oi.releaseGood.name)
|
|
200
|
+
let uniqueRoNo: string[] = []
|
|
201
|
+
roNoList.forEach(roNo => {
|
|
202
|
+
if (!uniqueRoNo.includes(roNo)) {
|
|
203
|
+
uniqueRoNo.push(roNo)
|
|
204
|
+
}
|
|
205
|
+
})
|
|
180
206
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
return pickSortTargetInventory
|
|
185
|
-
})
|
|
207
|
+
// loop to generate packing worksheet
|
|
208
|
+
for (let i: number = 0; i < uniqueRoNo.length; i++) {
|
|
209
|
+
const releaseGoodNo: string = uniqueRoNo[i]
|
|
186
210
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
const roNoList: string[] = pickPackTargetInventories.map((oi: OrderInventory) => oi.releaseGood.name)
|
|
190
|
-
let uniqueRoNo: string[] = []
|
|
191
|
-
roNoList.forEach(roNo => {
|
|
192
|
-
if (!uniqueRoNo.includes(roNo)) {
|
|
193
|
-
uniqueRoNo.push(roNo)
|
|
211
|
+
const packingWSCtrl: PackingWorksheetController = new PackingWorksheetController(tx, domain, user)
|
|
212
|
+
await packingWSCtrl.generatePackingWorksheet(releaseGoodNo)
|
|
194
213
|
}
|
|
195
|
-
})
|
|
196
|
-
|
|
197
|
-
// loop to generate packing worksheet
|
|
198
|
-
for (let i: number = 0; i < uniqueRoNo.length; i++) {
|
|
199
|
-
const releaseGoodNo: string = uniqueRoNo[i]
|
|
200
|
-
|
|
201
|
-
const packingWSCtrl: PackingWorksheetController = new PackingWorksheetController(tx, domain, user)
|
|
202
|
-
await packingWSCtrl.generatePackingWorksheet(releaseGoodNo)
|
|
203
214
|
}
|
|
204
|
-
}
|
|
205
215
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
216
|
+
// loop to generate sorting worksheet
|
|
217
|
+
if (pickSortTargetInventories?.length) {
|
|
218
|
+
const sortingWSCtrl: SortingWorksheetController = new SortingWorksheetController(tx, domain, user)
|
|
219
|
+
await sortingWSCtrl.generateSortingWorksheet(worksheet, pickSortTargetInventories)
|
|
220
|
+
}
|
|
221
|
+
} else {
|
|
222
|
+
let foundObsoleteInventories: any = worksheet
|
|
223
|
+
await tx.getRepository(Inventory).update({ id: In(foundObsoleteInventories) }, { obsolete: true })
|
|
224
|
+
|
|
225
|
+
foundObsoleteInventories = foundObsoleteInventories
|
|
226
|
+
.map(inv => {
|
|
227
|
+
return "'" + inv.trim() + "'"
|
|
228
|
+
})
|
|
229
|
+
.join(',')
|
|
230
|
+
|
|
231
|
+
//update any orders that is assigned with obsolete inventories
|
|
232
|
+
await tx.getRepository(ReleaseGood).query(`
|
|
233
|
+
update release_goods rg set status = 'OBSOLETE'
|
|
234
|
+
from order_inventories oi
|
|
235
|
+
where oi.release_good_id = rg.id
|
|
236
|
+
and oi.inventory_id in (${foundObsoleteInventories})
|
|
237
|
+
and rg.status in ('PICKING', 'PENDING_WORKSHEET', 'READY_TO_PICK')`)
|
|
238
|
+
|
|
239
|
+
await tx.getRepository(Worksheet).query(`
|
|
240
|
+
update worksheets w set status = 'DEACTIVATED', updater_id = '${user.id}', assignee_id = null
|
|
241
|
+
from worksheet_details wd
|
|
242
|
+
inner join order_inventories oi on oi.id = wd.target_inventory_id
|
|
243
|
+
where wd.worksheet_id = w.id
|
|
244
|
+
and oi.inventory_id in (${foundObsoleteInventories})
|
|
245
|
+
`)
|
|
246
|
+
|
|
247
|
+
return true
|
|
210
248
|
}
|
|
211
249
|
}
|