@things-factory/worksheet-base 4.3.236 → 4.3.238
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/ecommerce/index.js +1 -0
- package/dist-server/controllers/ecommerce/index.js.map +1 -1
- package/dist-server/controllers/ecommerce/powrup-controller.js +201 -0
- package/dist-server/controllers/ecommerce/powrup-controller.js.map +1 -0
- package/dist-server/controllers/outbound/packing-worksheet-controller.js +23 -0
- package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/picking-worksheet-controller.js +35 -0
- package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/worksheet-controller.js +3 -2
- package/dist-server/controllers/worksheet-controller.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/packing/complete-packing.js +10 -8
- package/dist-server/graphql/resolvers/worksheet/packing/complete-packing.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/packing/packing.js +9 -0
- package/dist-server/graphql/resolvers/worksheet/packing/packing.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js +3 -2
- package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +43 -1
- package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js +23 -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 +27 -0
- package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/putaway/complete-putaway.js +13 -1
- package/dist-server/graphql/resolvers/worksheet/putaway/complete-putaway.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/putaway-return/complete-putaway-return.js +11 -1
- package/dist-server/graphql/resolvers/worksheet/putaway-return/complete-putaway-return.js.map +1 -1
- package/package.json +20 -19
- package/server/controllers/ecommerce/index.ts +1 -0
- package/server/controllers/ecommerce/powrup-controller.ts +272 -0
- package/server/controllers/outbound/packing-worksheet-controller.ts +29 -1
- package/server/controllers/outbound/picking-worksheet-controller.ts +65 -44
- package/server/controllers/worksheet-controller.ts +4 -3
- package/server/graphql/resolvers/worksheet/packing/complete-packing.ts +10 -9
- package/server/graphql/resolvers/worksheet/packing/packing.ts +12 -1
- package/server/graphql/resolvers/worksheet/packing/scan-product-packing.ts +3 -2
- package/server/graphql/resolvers/worksheet/packing-worksheet.ts +46 -2
- package/server/graphql/resolvers/worksheet/picking/complete-batch-picking.ts +30 -1
- package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +33 -1
- package/server/graphql/resolvers/worksheet/putaway/complete-putaway.ts +19 -2
- package/server/graphql/resolvers/worksheet/putaway-return/complete-putaway-return.ts +17 -2
- package/translations/ja.json +8 -0
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import { getRepository } from 'typeorm'
|
|
2
|
+
|
|
3
|
+
import { Bizplace } from '@things-factory/biz-base'
|
|
4
|
+
import { logger } from '@things-factory/env'
|
|
5
|
+
import { Powrup, PowrupAPI } from '@things-factory/integration-powrup'
|
|
6
|
+
import { Product, ProductDetail } from '@things-factory/product-base'
|
|
7
|
+
import {
|
|
8
|
+
ORDER_STATUS,
|
|
9
|
+
OrderNoGenerator,
|
|
10
|
+
OrderPackage,
|
|
11
|
+
OrderPackageItem,
|
|
12
|
+
OrderProduct,
|
|
13
|
+
ReleaseGood
|
|
14
|
+
} from '@things-factory/sales-base'
|
|
15
|
+
import { Inventory, INVENTORY_STATUS, LOCATION_TYPE } from '@things-factory/warehouse-base'
|
|
16
|
+
|
|
17
|
+
import { DateTimeDifference } from '../../utils/datetime-util'
|
|
18
|
+
import { WorksheetController } from '../worksheet-controller'
|
|
19
|
+
|
|
20
|
+
export class PowrupController extends WorksheetController {
|
|
21
|
+
async packOrder(powrup: Powrup, releaseGood: ReleaseGood): Promise<ReleaseGood> {
|
|
22
|
+
try {
|
|
23
|
+
const orderProducts: OrderProduct[] = releaseGood.orderProducts
|
|
24
|
+
const orderInformation: any = {
|
|
25
|
+
orderId: releaseGood.refOrderId
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (
|
|
29
|
+
releaseGood?.lastMarketPackCall &&
|
|
30
|
+
DateTimeDifference.timeDifferenceInSeconds(releaseGood.lastMarketPackCall, new Date()) <= 5
|
|
31
|
+
) {
|
|
32
|
+
return false
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
await getRepository(ReleaseGood).update(
|
|
36
|
+
{ id: releaseGood.id },
|
|
37
|
+
{
|
|
38
|
+
lastMarketPackCall: new Date()
|
|
39
|
+
}
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
const orderPack: any = await PowrupAPI.packOrder(powrup, {
|
|
43
|
+
...orderInformation,
|
|
44
|
+
context: { state: { domain: this?.domain, user: this?.user } }
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
if (orderPack?.packages) {
|
|
48
|
+
const packages: any[] = orderPack.packages
|
|
49
|
+
|
|
50
|
+
await Promise.all(
|
|
51
|
+
packages.map(async pkg => {
|
|
52
|
+
const items = pkg.items
|
|
53
|
+
const orderPackage: OrderPackage = {
|
|
54
|
+
name: OrderNoGenerator.orderPackage(),
|
|
55
|
+
packageId: pkg.packageId,
|
|
56
|
+
status: ORDER_STATUS.PROCESSING,
|
|
57
|
+
releaseGood,
|
|
58
|
+
domain: releaseGood.domain,
|
|
59
|
+
bizplace: releaseGood.bizplace,
|
|
60
|
+
creator: releaseGood.creator,
|
|
61
|
+
updater: releaseGood.updater
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
let savedOrderPackage: OrderPackage = await this.trxMgr.getRepository(OrderPackage).save(orderPackage)
|
|
65
|
+
|
|
66
|
+
const orderPackageItems: OrderPackageItem[] = items.map(itm => {
|
|
67
|
+
const { refCode, qty } = itm
|
|
68
|
+
const matchedOrderProduct: OrderProduct = orderProducts.find(op => op.productDetail.refCode == refCode)
|
|
69
|
+
|
|
70
|
+
return {
|
|
71
|
+
name: OrderNoGenerator.orderPackageItem(),
|
|
72
|
+
orderProduct: matchedOrderProduct,
|
|
73
|
+
status: ORDER_STATUS.PROCESSING,
|
|
74
|
+
releaseQty: qty,
|
|
75
|
+
orderPackage: savedOrderPackage,
|
|
76
|
+
domain: releaseGood.domain,
|
|
77
|
+
bizplace: releaseGood.bizplace,
|
|
78
|
+
creator: releaseGood.creator,
|
|
79
|
+
updater: releaseGood.updater
|
|
80
|
+
}
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
await this.trxMgr.getRepository(OrderPackageItem).save(orderPackageItems)
|
|
84
|
+
})
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
await this.trxMgr.getRepository(ReleaseGood).update(
|
|
88
|
+
{ id: releaseGood.id },
|
|
89
|
+
{
|
|
90
|
+
packageId: packages[0].packageId,
|
|
91
|
+
marketPackCallSuccess: new Date(),
|
|
92
|
+
lastMarketPackCall: new Date(),
|
|
93
|
+
updatedAt: new Date()
|
|
94
|
+
}
|
|
95
|
+
)
|
|
96
|
+
}
|
|
97
|
+
} catch (error) {
|
|
98
|
+
logger.error(`powrup-controller[packOrder]: ${error}`)
|
|
99
|
+
throw error
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return releaseGood
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
async updateStock(powrup: Powrup, inventory: Inventory): Promise<void> {
|
|
106
|
+
const bizplace: Bizplace = await this.trxMgr.getRepository(Bizplace).findOne({ domain: powrup.domain })
|
|
107
|
+
let product: Product = inventory.product
|
|
108
|
+
const productDetail: ProductDetail = inventory.productDetail
|
|
109
|
+
let qb = await this.trxMgr.getRepository(Inventory).createQueryBuilder('inv')
|
|
110
|
+
qb.leftJoinAndSelect('inv.location', 'loc')
|
|
111
|
+
.andWhere('"inv"."domain_id" = :domainId')
|
|
112
|
+
.andWhere('"inv"."bizplace_id" = :bizplaceId')
|
|
113
|
+
.andWhere('"inv"."product_id" = :productId')
|
|
114
|
+
.andWhere('"inv"."product_detail_id" = :productDetailId')
|
|
115
|
+
.andWhere('"inv"."status" = :status')
|
|
116
|
+
.andWhere('"loc"."type" NOT IN (:...locationTypes)')
|
|
117
|
+
.setParameters({
|
|
118
|
+
domainId: this.domain.id,
|
|
119
|
+
bizplaceId: bizplace.id,
|
|
120
|
+
productId: product.id,
|
|
121
|
+
productDetailId: productDetail.id,
|
|
122
|
+
status: INVENTORY_STATUS.STORED,
|
|
123
|
+
locationTypes: [LOCATION_TYPE.QUARANTINE]
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
const warehouseDomainId = this.domain.id
|
|
127
|
+
let inventories: Inventory[] = await qb.getMany()
|
|
128
|
+
let inventoryTotalQty: number = 0
|
|
129
|
+
let inventoryTotalLockedQty: number = 0
|
|
130
|
+
let inventoryBufferQty: number = 0
|
|
131
|
+
|
|
132
|
+
inventories.forEach((inventory: Inventory) => {
|
|
133
|
+
const { qty, lockedQty } = inventory
|
|
134
|
+
inventoryTotalQty += qty
|
|
135
|
+
inventoryTotalLockedQty += lockedQty
|
|
136
|
+
if (inventory.location.type === LOCATION_TYPE.RESERVE) {
|
|
137
|
+
inventoryBufferQty += qty
|
|
138
|
+
}
|
|
139
|
+
})
|
|
140
|
+
|
|
141
|
+
const powrupInvs: any[] = [
|
|
142
|
+
{
|
|
143
|
+
refCode: productDetail.refCode,
|
|
144
|
+
stock: {
|
|
145
|
+
quantityTotal: inventoryTotalQty - inventoryTotalLockedQty - inventoryBufferQty,
|
|
146
|
+
quantityReserved: inventoryTotalLockedQty - inventoryBufferQty,
|
|
147
|
+
quantityBuffer: inventoryBufferQty
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
]
|
|
151
|
+
|
|
152
|
+
await PowrupAPI.updateStock(powrup, {
|
|
153
|
+
context: { state: { domain: this?.domain, user: this?.user } },
|
|
154
|
+
warehouseDomainId,
|
|
155
|
+
powrupInvs
|
|
156
|
+
})
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
async initiateShipment(powrup: Powrup, releaseGood: ReleaseGood): Promise<void> {
|
|
160
|
+
try {
|
|
161
|
+
let orderPackages: OrderPackage[] = await this.trxMgr
|
|
162
|
+
.getRepository(OrderPackage)
|
|
163
|
+
.find({ where: { releaseGood, bizplace: releaseGood.bizplace } })
|
|
164
|
+
|
|
165
|
+
if (orderPackages?.length) {
|
|
166
|
+
await Promise.all(
|
|
167
|
+
orderPackages
|
|
168
|
+
.filter(op => op?.marketRtsCallSuccess == undefined)
|
|
169
|
+
.map(async op => {
|
|
170
|
+
if (!op?.packageId) throw new Error('Order package id is not found')
|
|
171
|
+
if (releaseGood.lmdOption && !op?.parcelId) return
|
|
172
|
+
|
|
173
|
+
let orderInformation: any = {
|
|
174
|
+
orderId: releaseGood.refOrderId,
|
|
175
|
+
packageId: op.packageId
|
|
176
|
+
}
|
|
177
|
+
if (releaseGood.lmdOption) {
|
|
178
|
+
let releaseGoodQuery: ReleaseGood = await getRepository(ReleaseGood).findOne({
|
|
179
|
+
where: { id: releaseGood.id },
|
|
180
|
+
relations: ['lastMileDelivery']
|
|
181
|
+
})
|
|
182
|
+
orderInformation = {
|
|
183
|
+
...orderInformation,
|
|
184
|
+
awb: op.airwayBill,
|
|
185
|
+
trackingNo: op.trackingNo,
|
|
186
|
+
lmdOption: releaseGood.lmdOption,
|
|
187
|
+
shipperName: releaseGoodQuery.lastMileDelivery.platform
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
try {
|
|
192
|
+
await PowrupAPI.initiateShipment(powrup, {
|
|
193
|
+
...orderInformation,
|
|
194
|
+
context: { state: { domain: this?.domain, user: this?.user } }
|
|
195
|
+
})
|
|
196
|
+
await getRepository(OrderPackage).update({ id: op.id }, { marketRtsCallSuccess: new Date() })
|
|
197
|
+
} catch (error) {
|
|
198
|
+
logger.error(
|
|
199
|
+
`powrup-controller[initiateShipment]: ${JSON.stringify({
|
|
200
|
+
...orderInformation,
|
|
201
|
+
context: { state: { domain: this?.domain, user: this?.user } },
|
|
202
|
+
error: error
|
|
203
|
+
})}`
|
|
204
|
+
)
|
|
205
|
+
}
|
|
206
|
+
})
|
|
207
|
+
)
|
|
208
|
+
}
|
|
209
|
+
} catch (error) {
|
|
210
|
+
throw error
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
async fetchDocument(powrup: Powrup, releaseGood: ReleaseGood): Promise<ReleaseGood> {
|
|
215
|
+
if (releaseGood?.ownTransport && releaseGood?.lmdOption) {
|
|
216
|
+
return
|
|
217
|
+
}
|
|
218
|
+
try {
|
|
219
|
+
let orderPackages: OrderPackage[] = await this.trxMgr
|
|
220
|
+
.getRepository(OrderPackage)
|
|
221
|
+
.find({ where: { releaseGood, bizplace: releaseGood.bizplace } })
|
|
222
|
+
|
|
223
|
+
if (orderPackages?.length) {
|
|
224
|
+
await Promise.all(
|
|
225
|
+
orderPackages.map(async op => {
|
|
226
|
+
if (!op?.packageId) throw new Error('Order package id is not found')
|
|
227
|
+
|
|
228
|
+
const orderInformation: any = {
|
|
229
|
+
orderId: releaseGood.refOrderId,
|
|
230
|
+
packageId: op.packageId
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
const {
|
|
234
|
+
documents,
|
|
235
|
+
trackingNo,
|
|
236
|
+
transporter
|
|
237
|
+
}: { documents: any[]; trackingNo: string; transporter: string } = await PowrupAPI.fetchDocument(powrup, {
|
|
238
|
+
...orderInformation,
|
|
239
|
+
context: { state: { domain: this?.domain, user: this?.user } }
|
|
240
|
+
})
|
|
241
|
+
|
|
242
|
+
let updateInfo: any
|
|
243
|
+
if (documents?.length) {
|
|
244
|
+
documents.map(document => {
|
|
245
|
+
if (document.type === 'invoice') {
|
|
246
|
+
updateInfo = { ...updateInfo, invoice: document.download_url }
|
|
247
|
+
} else if (document.type === 'airway_bill') {
|
|
248
|
+
updateInfo = { ...updateInfo, airwayBill: document.download_url }
|
|
249
|
+
}
|
|
250
|
+
})
|
|
251
|
+
|
|
252
|
+
updateInfo = {
|
|
253
|
+
...updateInfo,
|
|
254
|
+
trackingNo: trackingNo,
|
|
255
|
+
transporter: transporter,
|
|
256
|
+
updater: this.user
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
await this.trxMgr.getRepository(OrderPackage).update({ id: op.id }, { ...updateInfo })
|
|
260
|
+
}
|
|
261
|
+
})
|
|
262
|
+
)
|
|
263
|
+
|
|
264
|
+
releaseGood = await this.trxMgr.getRepository(ReleaseGood).findOne({ id: releaseGood.id })
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
return releaseGood
|
|
268
|
+
} catch (error) {
|
|
269
|
+
throw error
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
@@ -2,6 +2,7 @@ import { Equal, Not } from 'typeorm'
|
|
|
2
2
|
|
|
3
3
|
import { ApplicationType } from '@things-factory/auth-base'
|
|
4
4
|
import { logger } from '@things-factory/env'
|
|
5
|
+
import { Powrup } from '@things-factory/integration-powrup'
|
|
5
6
|
import { Sellercraft, SellercraftStatus } from '@things-factory/integration-sellercraft'
|
|
6
7
|
import { Product, ProductBarcode, ProductDetail } from '@things-factory/product-base'
|
|
7
8
|
import {
|
|
@@ -24,7 +25,7 @@ import {
|
|
|
24
25
|
|
|
25
26
|
import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../constants'
|
|
26
27
|
import { Worksheet, WorksheetDetail } from '../../entities'
|
|
27
|
-
import { SellercraftController } from '../index'
|
|
28
|
+
import { SellercraftController, PowrupController } from '../index'
|
|
28
29
|
import { VasWorksheetController } from '../vas/vas-worksheet-controller'
|
|
29
30
|
|
|
30
31
|
export class PackingWorksheetController extends VasWorksheetController {
|
|
@@ -124,6 +125,33 @@ export class PackingWorksheetController extends VasWorksheetController {
|
|
|
124
125
|
}
|
|
125
126
|
break
|
|
126
127
|
|
|
128
|
+
case ApplicationType.POWRUP:
|
|
129
|
+
const powrup: Powrup = await this.trxMgr.getRepository(Powrup).findOne({ active: true })
|
|
130
|
+
|
|
131
|
+
if (powrup) {
|
|
132
|
+
const powrupCtrl: PowrupController = new PowrupController(this.trxMgr, this.domain, this.user)
|
|
133
|
+
|
|
134
|
+
let rtsOrderDoc = async (powrup: any, releaseGood: any, domain: any, user: any) => {
|
|
135
|
+
try {
|
|
136
|
+
// trigger RTS
|
|
137
|
+
await powrupCtrl.initiateShipment(powrup, releaseGood)
|
|
138
|
+
} catch (error) {
|
|
139
|
+
logger.error(
|
|
140
|
+
`packing-worksheet-controller[activatePacking]:(data:${JSON.stringify({
|
|
141
|
+
powrup,
|
|
142
|
+
releaseGood,
|
|
143
|
+
domain,
|
|
144
|
+
user
|
|
145
|
+
})}) ${error} `
|
|
146
|
+
)
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// asynchronously trigger RTS
|
|
151
|
+
rtsOrderDoc(powrup, releaseGood, this.domain, this.user)
|
|
152
|
+
}
|
|
153
|
+
break
|
|
154
|
+
|
|
127
155
|
default:
|
|
128
156
|
break
|
|
129
157
|
}
|
|
@@ -1,26 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
EntityManager,
|
|
3
|
-
Equal,
|
|
4
|
-
getConnection,
|
|
5
|
-
getManager,
|
|
6
|
-
In,
|
|
7
|
-
IsNull,
|
|
8
|
-
Not
|
|
9
|
-
} from 'typeorm'
|
|
1
|
+
import { EntityManager, Equal, getConnection, getManager, In, IsNull, Not } from 'typeorm'
|
|
10
2
|
|
|
11
3
|
import { ApplicationType } from '@things-factory/auth-base'
|
|
12
4
|
import { Bizplace } from '@things-factory/biz-base'
|
|
13
5
|
import { logger } from '@things-factory/env'
|
|
14
6
|
import { generateId } from '@things-factory/id-rule-base'
|
|
15
|
-
import {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
} from '@things-factory/integration-sellercraft'
|
|
19
|
-
import {
|
|
20
|
-
Product,
|
|
21
|
-
ProductBarcode,
|
|
22
|
-
ProductDetail
|
|
23
|
-
} from '@things-factory/product-base'
|
|
7
|
+
import { Powrup } from '@things-factory/integration-powrup'
|
|
8
|
+
import { Sellercraft, SellercraftStatus } from '@things-factory/integration-sellercraft'
|
|
9
|
+
import { Product, ProductBarcode, ProductDetail } from '@things-factory/product-base'
|
|
24
10
|
import {
|
|
25
11
|
GenerateBatchPickInfo,
|
|
26
12
|
ORDER_INVENTORY_STATUS,
|
|
@@ -50,21 +36,10 @@ import {
|
|
|
50
36
|
TOTE_STATUS
|
|
51
37
|
} from '@things-factory/warehouse-base'
|
|
52
38
|
|
|
53
|
-
import {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
WORKSHEET_TYPE
|
|
58
|
-
} from '../../constants'
|
|
59
|
-
import { SellercraftController } from '../../controllers'
|
|
60
|
-
import {
|
|
61
|
-
Worksheet,
|
|
62
|
-
WorksheetDetail
|
|
63
|
-
} from '../../entities'
|
|
64
|
-
import {
|
|
65
|
-
isInventoryObsolete,
|
|
66
|
-
WorksheetNoGenerator
|
|
67
|
-
} from '../../utils'
|
|
39
|
+
import { TASK_NUMBER_RULE_TYPE, TASK_NUMBER_SETTING_KEY, WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../constants'
|
|
40
|
+
import { SellercraftController, PowrupController } from '../../controllers'
|
|
41
|
+
import { Worksheet, WorksheetDetail } from '../../entities'
|
|
42
|
+
import { isInventoryObsolete, WorksheetNoGenerator } from '../../utils'
|
|
68
43
|
import { VasWorksheetController } from '../vas/vas-worksheet-controller'
|
|
69
44
|
|
|
70
45
|
export class PickingWorksheetController extends VasWorksheetController {
|
|
@@ -292,6 +267,30 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
292
267
|
})
|
|
293
268
|
break
|
|
294
269
|
|
|
270
|
+
case ApplicationType.POWRUP:
|
|
271
|
+
getManager().transaction(async txMgr => {
|
|
272
|
+
const powrup: Powrup = await txMgr.getRepository(Powrup).findOne({ active: true })
|
|
273
|
+
|
|
274
|
+
if (powrup) {
|
|
275
|
+
const powrupCtrl: PowrupController = new PowrupController(txMgr, this.domain, this.user)
|
|
276
|
+
|
|
277
|
+
if (!releaseGood?.orderPackages?.length) {
|
|
278
|
+
const orderProducts: OrderProduct[] = await txMgr.getRepository(OrderProduct).find({
|
|
279
|
+
where: { releaseGood },
|
|
280
|
+
relations: ['product', 'productDetail']
|
|
281
|
+
})
|
|
282
|
+
|
|
283
|
+
// asynchronously pack order
|
|
284
|
+
await powrupCtrl.packOrder(powrup, {
|
|
285
|
+
...releaseGood,
|
|
286
|
+
orderProducts,
|
|
287
|
+
domain: worksheet.domain
|
|
288
|
+
})
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
})
|
|
292
|
+
break
|
|
293
|
+
|
|
295
294
|
default:
|
|
296
295
|
break
|
|
297
296
|
}
|
|
@@ -331,16 +330,16 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
331
330
|
const pickingOrderInventory: OrderInventory[] = await this.trxMgr.getRepository(OrderInventory).find({
|
|
332
331
|
where: { domain: this.domain, refWorksheetId: worksheet.id, status: ORDER_STATUS.PICKING },
|
|
333
332
|
relations: [
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
333
|
+
'releaseGood',
|
|
334
|
+
'releaseGood.domain',
|
|
335
|
+
'releaseGood.lastMileDelivery',
|
|
336
|
+
'releaseGood.bizplace',
|
|
337
|
+
'releaseGood.bizplace.domain',
|
|
338
|
+
'releaseGood.orderPackages',
|
|
339
|
+
'releaseGood.orderPackages.orderPackageItems',
|
|
340
|
+
'releaseGood.orderPackages.orderPackageItems.orderProduct',
|
|
341
|
+
'releaseGood.orderPackages.orderPackageItems.orderProduct.product'
|
|
342
|
+
]
|
|
344
343
|
})
|
|
345
344
|
|
|
346
345
|
let releaseGoods: ReleaseGood[] = pickingOrderInventory.reduce((data, oi: OrderInventory) => {
|
|
@@ -383,6 +382,26 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
383
382
|
})
|
|
384
383
|
break
|
|
385
384
|
|
|
385
|
+
case ApplicationType.POWRUP:
|
|
386
|
+
getManager().transaction(async txMgr => {
|
|
387
|
+
const powrup: Powrup = await txMgr.getRepository(Powrup).findOne({ active: true })
|
|
388
|
+
|
|
389
|
+
if (powrup) {
|
|
390
|
+
const powrupCtrl: PowrupController = new PowrupController(txMgr, this.domain, this.user)
|
|
391
|
+
|
|
392
|
+
if (!releaseGood?.orderPackages?.length) {
|
|
393
|
+
const orderProducts: OrderProduct[] = await txMgr.getRepository(OrderProduct).find({
|
|
394
|
+
where: { releaseGood },
|
|
395
|
+
relations: ['product', 'productDetail']
|
|
396
|
+
})
|
|
397
|
+
|
|
398
|
+
// asynchronously pack order
|
|
399
|
+
await powrupCtrl.packOrder(powrup, { ...releaseGood, orderProducts })
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
})
|
|
403
|
+
break
|
|
404
|
+
|
|
386
405
|
default:
|
|
387
406
|
break
|
|
388
407
|
}
|
|
@@ -1354,7 +1373,9 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
1354
1373
|
worksheet.endedAt = new Date()
|
|
1355
1374
|
worksheet.updater = this.user
|
|
1356
1375
|
|
|
1357
|
-
const worksheetDetails: any = worksheet.worksheetDetails.filter(
|
|
1376
|
+
const worksheetDetails: any = worksheet.worksheetDetails.filter(
|
|
1377
|
+
wsD => wsD.status != 'MISSING' && wsD.status != 'CANCELLED'
|
|
1378
|
+
)
|
|
1358
1379
|
worksheetDetails.forEach((wsd: WorksheetDetail) => {
|
|
1359
1380
|
wsd.status = WORKSHEET_STATUS.DONE
|
|
1360
1381
|
wsd.updater = this.user
|
|
@@ -416,7 +416,7 @@ export class WorksheetController {
|
|
|
416
416
|
let existingWorksheet: Worksheet
|
|
417
417
|
try {
|
|
418
418
|
existingWorksheet = await this.findWorksheetByRefOrder(refOrder, type)
|
|
419
|
-
} catch (e) {}
|
|
419
|
+
} catch (e) { }
|
|
420
420
|
|
|
421
421
|
if (existingWorksheet)
|
|
422
422
|
throw new Error(
|
|
@@ -1128,8 +1128,8 @@ export class WorksheetController {
|
|
|
1128
1128
|
}
|
|
1129
1129
|
|
|
1130
1130
|
public async getDirectQty(productDetail: ProductDetail, productBarcode: string, qty: number): Promise<any> {
|
|
1131
|
+
console.time(`getDirectQty ${productDetail.id} - ${productBarcode}`)
|
|
1131
1132
|
try {
|
|
1132
|
-
console.time('getDirectQty')
|
|
1133
1133
|
let results = await this.trxMgr.query(
|
|
1134
1134
|
`
|
|
1135
1135
|
WITH RECURSIVE cte as (
|
|
@@ -1157,9 +1157,10 @@ export class WorksheetController {
|
|
|
1157
1157
|
|
|
1158
1158
|
if (results.length <= 0) throw new Error(this.ERROR_MSG.FIND.NO_RESULT(productBarcode))
|
|
1159
1159
|
|
|
1160
|
-
console.timeEnd(
|
|
1160
|
+
console.timeEnd(`getDirectQty ${productDetail.id} - ${productBarcode}`)
|
|
1161
1161
|
return results[0]
|
|
1162
1162
|
} catch (error) {
|
|
1163
|
+
console.timeEnd(`getDirectQty ${productDetail.id} - ${productBarcode}`)
|
|
1163
1164
|
throw error
|
|
1164
1165
|
}
|
|
1165
1166
|
}
|
|
@@ -37,16 +37,17 @@ export const completePackingResolver = {
|
|
|
37
37
|
logger.error(`worksheet-base[completePacking]: ${error}`)
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
|
+
} else {
|
|
41
|
+
const bizplace: Bizplace = await getMyBizplace(domain, user)
|
|
42
|
+
const worksheetController: WorksheetController = new WorksheetController(tx, domain, user)
|
|
43
|
+
|
|
44
|
+
await worksheetController.notifyToCustomer(bizplace, {
|
|
45
|
+
title: `Packing has been completed (${bizplace.name}, ${releaseGoodNo})`,
|
|
46
|
+
body: `Items now are ready to be shipped/delivery`,
|
|
47
|
+
url: context.header.referer,
|
|
48
|
+
data: { url: context.header.referer }
|
|
49
|
+
})
|
|
40
50
|
}
|
|
41
|
-
|
|
42
|
-
const bizplace: Bizplace = await getMyBizplace(domain, user)
|
|
43
|
-
const worksheetController: WorksheetController = new WorksheetController(tx, domain, user)
|
|
44
|
-
await worksheetController.notifyToCustomer(bizplace, {
|
|
45
|
-
title: `Packing has been completed (${bizplace.name}, ${releaseGoodNo})`,
|
|
46
|
-
body: `Items now are ready to be shipped/delivery`,
|
|
47
|
-
url: context.header.referer,
|
|
48
|
-
data: { url: context.header.referer }
|
|
49
|
-
})
|
|
50
51
|
}
|
|
51
52
|
}
|
|
52
53
|
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { EntityManager } from 'typeorm'
|
|
2
2
|
|
|
3
3
|
import { ApplicationType, User } from '@things-factory/auth-base'
|
|
4
|
+
import { Powrup } from '@things-factory/integration-powrup'
|
|
4
5
|
import { Sellercraft, SellercraftStatus } from '@things-factory/integration-sellercraft'
|
|
5
6
|
import { ReleaseGood } from '@things-factory/sales-base'
|
|
6
7
|
import { Domain } from '@things-factory/shell'
|
|
8
|
+
// import { PowrupController } from '@things-factory/warehouse-base'
|
|
7
9
|
|
|
8
|
-
import { PackingWorksheetController, SellercraftController } from '../../../../controllers'
|
|
10
|
+
import { PackingWorksheetController, SellercraftController, PowrupController } from '../../../../controllers'
|
|
9
11
|
|
|
10
12
|
export const packingResolver = {
|
|
11
13
|
async packing(_: any, { orderPackageItemId, releaseQty, serialNumber }, context: any) {
|
|
@@ -40,6 +42,15 @@ export async function packing(
|
|
|
40
42
|
}
|
|
41
43
|
break
|
|
42
44
|
|
|
45
|
+
case ApplicationType.POWRUP:
|
|
46
|
+
const powrup: Powrup = await tx.getRepository(Powrup).findOne({ active: true })
|
|
47
|
+
|
|
48
|
+
if (powrup) {
|
|
49
|
+
const powrupCtrl: PowrupController = new PowrupController(tx, domain, user)
|
|
50
|
+
await powrupCtrl.fetchDocument(powrup, releaseGood)
|
|
51
|
+
}
|
|
52
|
+
break
|
|
53
|
+
|
|
43
54
|
default:
|
|
44
55
|
break
|
|
45
56
|
}
|
|
@@ -20,8 +20,8 @@ export async function scanProductPacking(
|
|
|
20
20
|
productBarcode: string,
|
|
21
21
|
serialNumber?: string
|
|
22
22
|
) {
|
|
23
|
+
console.time(`execution time to scan for packing ${orderPackageItemId} - ${productBarcode}`)
|
|
23
24
|
try {
|
|
24
|
-
console.time('execution time to scan for packing')
|
|
25
25
|
const worksheetController: PackingWorksheetController = new PackingWorksheetController(tx, domain, user)
|
|
26
26
|
const inventoryItems = await worksheetController.scanProductPacking(
|
|
27
27
|
orderPackageItemId,
|
|
@@ -29,7 +29,7 @@ export async function scanProductPacking(
|
|
|
29
29
|
serialNumber
|
|
30
30
|
)
|
|
31
31
|
|
|
32
|
-
console.timeEnd(
|
|
32
|
+
console.timeEnd(`execution time to scan for packing ${orderPackageItemId} - ${productBarcode}`)
|
|
33
33
|
return inventoryItems
|
|
34
34
|
|
|
35
35
|
// if (releaseGood.type === 'b2c' && !releaseGood?.airwayBill) {
|
|
@@ -43,6 +43,7 @@ export async function scanProductPacking(
|
|
|
43
43
|
// }
|
|
44
44
|
// }
|
|
45
45
|
} catch (error) {
|
|
46
|
+
console.timeEnd(`execution time to scan for packing ${orderPackageItemId} - ${productBarcode}`)
|
|
46
47
|
throw error
|
|
47
48
|
}
|
|
48
49
|
}
|
|
@@ -2,6 +2,7 @@ import { EntityManager, getManager, SelectQueryBuilder } from 'typeorm'
|
|
|
2
2
|
|
|
3
3
|
import { ApplicationType, User } from '@things-factory/auth-base'
|
|
4
4
|
import { logger } from '@things-factory/env'
|
|
5
|
+
import { Powrup } from '@things-factory/integration-powrup'
|
|
5
6
|
import { Sellercraft, SellercraftStatus } from '@things-factory/integration-sellercraft'
|
|
6
7
|
import {
|
|
7
8
|
MarketplaceOrder,
|
|
@@ -22,7 +23,7 @@ import { Domain } from '@things-factory/shell'
|
|
|
22
23
|
import { Location } from '@things-factory/warehouse-base'
|
|
23
24
|
|
|
24
25
|
import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../../constants'
|
|
25
|
-
import { PackingWorksheetController, SellercraftController } from '../../../controllers'
|
|
26
|
+
import { PackingWorksheetController, SellercraftController, PowrupController } from '../../../controllers'
|
|
26
27
|
import { Worksheet } from '../../../entities'
|
|
27
28
|
|
|
28
29
|
export const packingWorksheetResolver = {
|
|
@@ -210,6 +211,15 @@ export const packingWorksheetResolver = {
|
|
|
210
211
|
}
|
|
211
212
|
break
|
|
212
213
|
|
|
214
|
+
case ApplicationType.POWRUP:
|
|
215
|
+
const powrup: Powrup = await tx.getRepository(Powrup).findOne({ active: true })
|
|
216
|
+
|
|
217
|
+
if (powrup) {
|
|
218
|
+
// asynchronously get document from powrup
|
|
219
|
+
getPowrupDocument(powrup, releaseGood, domain, user)
|
|
220
|
+
}
|
|
221
|
+
break
|
|
222
|
+
|
|
213
223
|
case ApplicationType.MMS:
|
|
214
224
|
marketplaceOrder = await tx.getRepository(MarketplaceOrder).findOne({
|
|
215
225
|
where: { orderNo: releaseGood.refNo },
|
|
@@ -297,7 +307,9 @@ export const packingWorksheetResolver = {
|
|
|
297
307
|
// packingType: inventory.packingType,
|
|
298
308
|
// packingSize: inventory.packingSize,
|
|
299
309
|
// this is the problem
|
|
300
|
-
binLocation: binLocation
|
|
310
|
+
binLocation: binLocation
|
|
311
|
+
? releaseGood.orderInventories.find(oi => oi.orderProductId == opi.orderProduct.id)?.binLocation
|
|
312
|
+
: binLocation,
|
|
301
313
|
isBatchPicking
|
|
302
314
|
// location: inventory.location,
|
|
303
315
|
// relatedOrderInv: targetInventory
|
|
@@ -397,3 +409,35 @@ async function getSellercraftDocument(sellercraft: Sellercraft, releaseGood: Rel
|
|
|
397
409
|
}
|
|
398
410
|
})
|
|
399
411
|
}
|
|
412
|
+
|
|
413
|
+
//trigger RTS, init document, and fetch powrup document in separated transaction
|
|
414
|
+
async function getPowrupDocument(powrup: Powrup, releaseGood: ReleaseGood, domain: Domain, user: User) {
|
|
415
|
+
await getManager().transaction(async txMgr => {
|
|
416
|
+
const powrupCtrl: PowrupController = new PowrupController(txMgr, domain, user)
|
|
417
|
+
try {
|
|
418
|
+
if (!releaseGood?.airwayBill) {
|
|
419
|
+
try {
|
|
420
|
+
// try fetch order document / AWB
|
|
421
|
+
releaseGood = await powrupCtrl.fetchDocument(powrup, releaseGood)
|
|
422
|
+
} catch (error) {
|
|
423
|
+
try {
|
|
424
|
+
// retry initiate order shipment / RTS
|
|
425
|
+
await powrupCtrl.initiateShipment(powrup, releaseGood)
|
|
426
|
+
} catch (error) {
|
|
427
|
+
throw new Error(`initiateOrderShipment: ${error}`)
|
|
428
|
+
}
|
|
429
|
+
throw new Error(`fetchOrderDocument: ${error}`)
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
} catch (error) {
|
|
433
|
+
logger.error(
|
|
434
|
+
`packing-worksheet[getPowrupDocument]:(data:${JSON.stringify({
|
|
435
|
+
powrup,
|
|
436
|
+
releaseGood,
|
|
437
|
+
domain,
|
|
438
|
+
user
|
|
439
|
+
})}) ${error} `
|
|
440
|
+
)
|
|
441
|
+
}
|
|
442
|
+
})
|
|
443
|
+
}
|