@things-factory/worksheet-base 4.3.346 → 4.3.348
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-server/controllers/outbound/picking-worksheet-controller.js +158 -11
- package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/worksheet-controller.js +4 -3
- package/dist-server/controllers/worksheet-controller.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js +0 -2
- package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/bulk-activate-picking.js +56 -0
- package/dist-server/graphql/resolvers/worksheet/picking/bulk-activate-picking.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/picking/index.js +6 -5
- package/dist-server/graphql/resolvers/worksheet/picking/index.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/worksheet.js +31 -41
- package/dist-server/graphql/resolvers/worksheet/worksheet.js.map +1 -1
- package/dist-server/graphql/types/worksheet/index.js +4 -0
- package/dist-server/graphql/types/worksheet/index.js.map +1 -1
- package/package.json +2 -2
- package/server/controllers/outbound/picking-worksheet-controller.ts +235 -17
- package/server/controllers/worksheet-controller.ts +37 -9
- package/server/graphql/resolvers/worksheet/picking/assign-picking-worker.ts +4 -5
- package/server/graphql/resolvers/worksheet/picking/bulk-activate-picking.ts +79 -0
- package/server/graphql/resolvers/worksheet/picking/index.ts +7 -5
- package/server/graphql/resolvers/worksheet/worksheet.ts +81 -42
- package/server/graphql/types/worksheet/index.ts +4 -0
|
@@ -1,12 +1,27 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
EntityManager,
|
|
3
|
+
Equal,
|
|
4
|
+
getConnection,
|
|
5
|
+
getManager,
|
|
6
|
+
In,
|
|
7
|
+
IsNull,
|
|
8
|
+
Not
|
|
9
|
+
} from 'typeorm'
|
|
2
10
|
|
|
3
11
|
import { ApplicationType } from '@things-factory/auth-base'
|
|
4
12
|
import { Bizplace } from '@things-factory/biz-base'
|
|
5
13
|
import { logger } from '@things-factory/env'
|
|
6
14
|
import { generateId } from '@things-factory/id-rule-base'
|
|
7
15
|
import { Powrup } from '@things-factory/integration-powrup'
|
|
8
|
-
import {
|
|
9
|
-
|
|
16
|
+
import {
|
|
17
|
+
Sellercraft,
|
|
18
|
+
SellercraftStatus
|
|
19
|
+
} from '@things-factory/integration-sellercraft'
|
|
20
|
+
import {
|
|
21
|
+
Product,
|
|
22
|
+
ProductBarcode,
|
|
23
|
+
ProductDetail
|
|
24
|
+
} from '@things-factory/product-base'
|
|
10
25
|
import {
|
|
11
26
|
GenerateBatchPickInfo,
|
|
12
27
|
InventoryUtil,
|
|
@@ -25,6 +40,7 @@ import {
|
|
|
25
40
|
ReleaseGood
|
|
26
41
|
} from '@things-factory/sales-base'
|
|
27
42
|
import { Setting } from '@things-factory/setting-base'
|
|
43
|
+
import { Domain } from '@things-factory/shell'
|
|
28
44
|
import {
|
|
29
45
|
generateInventoryHistory,
|
|
30
46
|
Inventory,
|
|
@@ -40,10 +56,22 @@ import {
|
|
|
40
56
|
TOTE_STATUS
|
|
41
57
|
} from '@things-factory/warehouse-base'
|
|
42
58
|
|
|
43
|
-
import {
|
|
59
|
+
import {
|
|
60
|
+
TASK_NUMBER_RULE_TYPE,
|
|
61
|
+
TASK_NUMBER_SETTING_KEY,
|
|
62
|
+
WORKSHEET_STATUS,
|
|
63
|
+
WORKSHEET_TYPE
|
|
64
|
+
} from '../../constants'
|
|
44
65
|
import { SellercraftController } from '../../controllers'
|
|
45
|
-
import {
|
|
46
|
-
|
|
66
|
+
import {
|
|
67
|
+
Worksheet,
|
|
68
|
+
WorksheetDetail
|
|
69
|
+
} from '../../entities'
|
|
70
|
+
import {
|
|
71
|
+
inventoriesByStrategy,
|
|
72
|
+
isInventoryObsolete,
|
|
73
|
+
WorksheetNoGenerator
|
|
74
|
+
} from '../../utils'
|
|
47
75
|
import { VasWorksheetController } from '../vas/vas-worksheet-controller'
|
|
48
76
|
|
|
49
77
|
export class PickingWorksheetController extends VasWorksheetController {
|
|
@@ -347,6 +375,56 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
347
375
|
return worksheet
|
|
348
376
|
}
|
|
349
377
|
|
|
378
|
+
async activateBulkPicking(worksheetNo: string[]): Promise<Worksheet[]> {
|
|
379
|
+
let worksheets: Worksheet[] = []
|
|
380
|
+
try {
|
|
381
|
+
const worksheetRepo = this.trxMgr.getRepository(Worksheet)
|
|
382
|
+
worksheets = await worksheetRepo
|
|
383
|
+
.createQueryBuilder('w')
|
|
384
|
+
.leftJoinAndSelect('w.domain', 'd')
|
|
385
|
+
.leftJoinAndSelect('w.bizplace', 'b')
|
|
386
|
+
.leftJoinAndSelect('w.worksheetDetails', 'wd')
|
|
387
|
+
.leftJoinAndSelect('w.releaseGood', 'rg')
|
|
388
|
+
.leftJoinAndSelect('rg.domain', 'rgd')
|
|
389
|
+
.leftJoinAndSelect('rg.bizplace', 'rgbz')
|
|
390
|
+
.leftJoinAndSelect('rgbz.domain', 'bzd')
|
|
391
|
+
.leftJoinAndSelect('b.domain', 'bd')
|
|
392
|
+
.leftJoinAndSelect('b.company', 'c')
|
|
393
|
+
.leftJoinAndSelect('c.domain', 'cd')
|
|
394
|
+
.leftJoinAndSelect('wd.targetInventory', 'ti')
|
|
395
|
+
.leftJoinAndSelect('ti.product', 'tp')
|
|
396
|
+
.where('w.name IN (:...worksheetNo)', { worksheetNo: worksheetNo })
|
|
397
|
+
.andWhere('w.status = :status', { status: WORKSHEET_STATUS.DEACTIVATED })
|
|
398
|
+
.getMany()
|
|
399
|
+
|
|
400
|
+
if (worksheets.length > 50) {
|
|
401
|
+
throw new Error('Please select maximum 50 worksheets with status deactivated to proceed')
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
let groupWs = new Map<string, string[]>()
|
|
405
|
+
for (const worksheet of worksheets) {
|
|
406
|
+
const bizplaceId = worksheet.bizplace.id
|
|
407
|
+
const worksheetId = worksheet.id
|
|
408
|
+
|
|
409
|
+
if (groupWs.has(bizplaceId)) {
|
|
410
|
+
groupWs.get(bizplaceId).push(worksheetId)
|
|
411
|
+
} else {
|
|
412
|
+
groupWs.set(bizplaceId, [worksheetId])
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
const groupedWsBiz = [...groupWs.entries()]
|
|
417
|
+
await Promise.all(
|
|
418
|
+
groupedWsBiz.map(async ([bizplaceId, worksheetIds]) => {
|
|
419
|
+
return await this.activateBulkWorksheets(bizplaceId, worksheetIds)
|
|
420
|
+
})
|
|
421
|
+
)
|
|
422
|
+
} catch (error) {
|
|
423
|
+
throw error
|
|
424
|
+
}
|
|
425
|
+
return worksheets
|
|
426
|
+
}
|
|
427
|
+
|
|
350
428
|
async activateBatchPicking(worksheetNo: string): Promise<Worksheet> {
|
|
351
429
|
let worksheet: Worksheet = await this.findActivatableWorksheet(worksheetNo, WORKSHEET_TYPE.BATCH_PICKING, [
|
|
352
430
|
'worksheetDetails',
|
|
@@ -2030,14 +2108,16 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
2030
2108
|
}
|
|
2031
2109
|
}
|
|
2032
2110
|
|
|
2033
|
-
async assignInventoriesForUnassignedOrder(worksheet: Worksheet): Promise<any> {
|
|
2111
|
+
async assignInventoriesForUnassignedOrder(worksheet: Worksheet, tx?: EntityManager): Promise<any> {
|
|
2034
2112
|
const releaseGood = worksheet.releaseGood
|
|
2035
2113
|
const orderProducts = releaseGood.orderProducts
|
|
2036
2114
|
let finalOrderInventories: OrderInventory[] = []
|
|
2037
2115
|
let newWorksheetDetails: WorksheetDetail[] = []
|
|
2038
|
-
const
|
|
2039
|
-
|
|
2040
|
-
|
|
2116
|
+
const transaction = tx ? tx : this.trxMgr
|
|
2117
|
+
|
|
2118
|
+
const inventoryAssignmentSetting: Setting = await transaction
|
|
2119
|
+
.getRepository(Setting)
|
|
2120
|
+
.findOne({ where: { domain: this.domain, name: 'rule-for-inventory-assignment' } })
|
|
2041
2121
|
|
|
2042
2122
|
for (let op of orderProducts) {
|
|
2043
2123
|
let locationSortingRules = []
|
|
@@ -2055,7 +2135,7 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
2055
2135
|
locationSortingRules,
|
|
2056
2136
|
releaseGood.bizplace,
|
|
2057
2137
|
this.domain,
|
|
2058
|
-
|
|
2138
|
+
transaction,
|
|
2059
2139
|
op.batchId
|
|
2060
2140
|
)
|
|
2061
2141
|
|
|
@@ -2074,23 +2154,22 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
2074
2154
|
|
|
2075
2155
|
finalOrderInventories.push(...assignedOrderInventories)
|
|
2076
2156
|
|
|
2077
|
-
await
|
|
2157
|
+
await transaction
|
|
2078
2158
|
.getRepository(OrderProduct)
|
|
2079
2159
|
.update({ id: op.id }, { status: ORDER_PRODUCT_STATUS.ASSIGNED, updater: this.user })
|
|
2080
2160
|
}
|
|
2081
2161
|
|
|
2082
2162
|
for (let oi of finalOrderInventories) {
|
|
2083
2163
|
// update inventory locked qty and uom value
|
|
2084
|
-
oi = await
|
|
2164
|
+
oi = await transaction.getRepository(OrderInventory).save({ ...oi })
|
|
2085
2165
|
|
|
2086
|
-
await
|
|
2166
|
+
await transaction.getRepository(Inventory).update(oi.inventory.id, {
|
|
2087
2167
|
lockedQty: (oi.inventory?.lockedQty || 0) + oi.releaseQty,
|
|
2088
2168
|
lockedUomValue: (oi.inventory?.lockedUomValue || 0) + oi.releaseUomValue,
|
|
2089
2169
|
updater: this.user
|
|
2090
2170
|
})
|
|
2091
2171
|
|
|
2092
|
-
|
|
2093
|
-
await this.trxMgr
|
|
2172
|
+
await transaction
|
|
2094
2173
|
.getRepository(ProductDetailStock)
|
|
2095
2174
|
.createQueryBuilder()
|
|
2096
2175
|
.update(ProductDetailStock)
|
|
@@ -2117,7 +2196,7 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
2117
2196
|
|
|
2118
2197
|
newWorksheetDetails.push(worksheetDetail)
|
|
2119
2198
|
}
|
|
2120
|
-
newWorksheetDetails = await
|
|
2199
|
+
newWorksheetDetails = await transaction.getRepository(WorksheetDetail).save(newWorksheetDetails)
|
|
2121
2200
|
|
|
2122
2201
|
return newWorksheetDetails
|
|
2123
2202
|
}
|
|
@@ -2272,4 +2351,143 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
2272
2351
|
}
|
|
2273
2352
|
return newWorksheetDetails
|
|
2274
2353
|
}
|
|
2354
|
+
|
|
2355
|
+
async activateBulkWorksheets(bizplaceId, worksheetIds) {
|
|
2356
|
+
try {
|
|
2357
|
+
for (const worksheetId of worksheetIds) {
|
|
2358
|
+
try {
|
|
2359
|
+
let releaseGood: ReleaseGood
|
|
2360
|
+
let domain: Domain
|
|
2361
|
+
|
|
2362
|
+
getManager().transaction(async (tx: EntityManager) => {
|
|
2363
|
+
const worksheetRepo = tx.getRepository(Worksheet)
|
|
2364
|
+
let worksheet = await worksheetRepo
|
|
2365
|
+
.createQueryBuilder('w')
|
|
2366
|
+
.leftJoinAndSelect('w.domain', 'd')
|
|
2367
|
+
.leftJoinAndSelect('w.bizplace', 'b')
|
|
2368
|
+
.leftJoinAndSelect('w.worksheetDetails', 'wd')
|
|
2369
|
+
.leftJoinAndSelect('w.releaseGood', 'rg')
|
|
2370
|
+
.leftJoinAndSelect('rg.domain', 'rgd')
|
|
2371
|
+
.leftJoinAndSelect('rg.bizplace', 'rgbz')
|
|
2372
|
+
.leftJoinAndSelect('rgbz.domain', 'bzd')
|
|
2373
|
+
.leftJoinAndSelect('rg.orderProducts', 'op')
|
|
2374
|
+
.leftJoinAndSelect('op.productDetail', 'pd')
|
|
2375
|
+
.leftJoinAndSelect('pd.product', 'p')
|
|
2376
|
+
.leftJoinAndSelect('b.domain', 'bd')
|
|
2377
|
+
.leftJoinAndSelect('b.company', 'c')
|
|
2378
|
+
.leftJoinAndSelect('c.domain', 'cd')
|
|
2379
|
+
.leftJoinAndSelect('wd.targetInventory', 'ti')
|
|
2380
|
+
.leftJoinAndSelect('ti.product', 'tp')
|
|
2381
|
+
.where('w.id = :worksheetId', { worksheetId: worksheetId })
|
|
2382
|
+
.andWhere('w.bizplace_id = :bizplaceId', { bizplaceId: bizplaceId })
|
|
2383
|
+
.getOne()
|
|
2384
|
+
|
|
2385
|
+
let worksheetDetails: WorksheetDetail[]
|
|
2386
|
+
|
|
2387
|
+
if (worksheet.releaseGood?.assignedInventory == false) {
|
|
2388
|
+
worksheetDetails = await this.assignInventoriesForUnassignedOrder(worksheet, tx)
|
|
2389
|
+
worksheet.worksheetDetails = worksheetDetails
|
|
2390
|
+
worksheet.releaseGood.assignedInventory = true
|
|
2391
|
+
} else {
|
|
2392
|
+
worksheetDetails = worksheet.worksheetDetails.filter(x => x.status == 'DEACTIVATED')
|
|
2393
|
+
const targetInventoryIds: OrderInventory[] = worksheetDetails.map(
|
|
2394
|
+
(wsd: WorksheetDetail) => wsd.targetInventory.id
|
|
2395
|
+
)
|
|
2396
|
+
|
|
2397
|
+
await tx.getRepository(OrderInventory).update(
|
|
2398
|
+
{ id: In(targetInventoryIds) },
|
|
2399
|
+
{
|
|
2400
|
+
status: ORDER_INVENTORY_STATUS.PICKING,
|
|
2401
|
+
updater: this.user
|
|
2402
|
+
}
|
|
2403
|
+
)
|
|
2404
|
+
}
|
|
2405
|
+
|
|
2406
|
+
await tx.getRepository(ReleaseGood).update(
|
|
2407
|
+
{ id: worksheet.releaseGood.id },
|
|
2408
|
+
{
|
|
2409
|
+
status: ORDER_STATUS.PICKING,
|
|
2410
|
+
updater: this.user
|
|
2411
|
+
}
|
|
2412
|
+
)
|
|
2413
|
+
|
|
2414
|
+
worksheet = await this.activateWorksheet(worksheet, worksheetDetails, [], tx)
|
|
2415
|
+
releaseGood = worksheet.releaseGood
|
|
2416
|
+
domain = worksheet.domain
|
|
2417
|
+
})
|
|
2418
|
+
|
|
2419
|
+
const orderSource: string = releaseGood?.source
|
|
2420
|
+
switch (orderSource) {
|
|
2421
|
+
case ApplicationType.SELLERCRAFT:
|
|
2422
|
+
getManager().transaction(async txMgr => {
|
|
2423
|
+
const sellercraft: Sellercraft = await txMgr
|
|
2424
|
+
.getRepository(Sellercraft)
|
|
2425
|
+
.findOne({ domain: releaseGood.bizplace.domain, status: SellercraftStatus.ACTIVE })
|
|
2426
|
+
|
|
2427
|
+
if (sellercraft) {
|
|
2428
|
+
const sellercraftCtrl: SellercraftController = new SellercraftController(
|
|
2429
|
+
txMgr,
|
|
2430
|
+
this.domain,
|
|
2431
|
+
this.user
|
|
2432
|
+
)
|
|
2433
|
+
|
|
2434
|
+
if (!releaseGood?.orderPackages?.length) {
|
|
2435
|
+
const orderProducts: OrderProduct[] = await txMgr.getRepository(OrderProduct).find({
|
|
2436
|
+
where: { releaseGood },
|
|
2437
|
+
relations: ['product', 'product.productDetails']
|
|
2438
|
+
})
|
|
2439
|
+
|
|
2440
|
+
// asynchronously pack order
|
|
2441
|
+
await sellercraftCtrl.packOrder(sellercraft, {
|
|
2442
|
+
...releaseGood,
|
|
2443
|
+
orderProducts,
|
|
2444
|
+
domain: domain
|
|
2445
|
+
})
|
|
2446
|
+
}
|
|
2447
|
+
}
|
|
2448
|
+
})
|
|
2449
|
+
break
|
|
2450
|
+
|
|
2451
|
+
case ApplicationType.POWRUP:
|
|
2452
|
+
getManager().transaction(async txMgr => {
|
|
2453
|
+
const powrup: Powrup = await txMgr.getRepository(Powrup).findOne({ active: true, platform: 'POWRUP' })
|
|
2454
|
+
|
|
2455
|
+
if (powrup) {
|
|
2456
|
+
const powrupCtrl: PowrupController = new PowrupController()
|
|
2457
|
+
|
|
2458
|
+
if (!releaseGood?.orderPackages?.length) {
|
|
2459
|
+
const orderProducts: OrderProduct[] = await txMgr.getRepository(OrderProduct).find({
|
|
2460
|
+
where: { releaseGood },
|
|
2461
|
+
relations: ['product', 'productDetail']
|
|
2462
|
+
})
|
|
2463
|
+
|
|
2464
|
+
// asynchronously pack order
|
|
2465
|
+
await powrupCtrl.packOrder(
|
|
2466
|
+
powrup,
|
|
2467
|
+
{
|
|
2468
|
+
...releaseGood,
|
|
2469
|
+
orderProducts
|
|
2470
|
+
},
|
|
2471
|
+
domain,
|
|
2472
|
+
this.user,
|
|
2473
|
+
txMgr
|
|
2474
|
+
)
|
|
2475
|
+
}
|
|
2476
|
+
}
|
|
2477
|
+
})
|
|
2478
|
+
break
|
|
2479
|
+
|
|
2480
|
+
default:
|
|
2481
|
+
break
|
|
2482
|
+
}
|
|
2483
|
+
} catch (e) {
|
|
2484
|
+
logger.error(
|
|
2485
|
+
`picking-worksheet-controller[activateBulkWorksheets]: ( WorksheetId: ${worksheetId}, Error: ${e})`
|
|
2486
|
+
)
|
|
2487
|
+
}
|
|
2488
|
+
}
|
|
2489
|
+
} catch (e) {
|
|
2490
|
+
console.log(e)
|
|
2491
|
+
}
|
|
2492
|
+
}
|
|
2275
2493
|
}
|
|
@@ -1,8 +1,25 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
EntityManager,
|
|
3
|
+
EntitySchema,
|
|
4
|
+
Equal,
|
|
5
|
+
FindOneOptions,
|
|
6
|
+
getRepository,
|
|
7
|
+
In,
|
|
8
|
+
Not
|
|
9
|
+
} from 'typeorm'
|
|
2
10
|
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
11
|
+
import {
|
|
12
|
+
Role,
|
|
13
|
+
User
|
|
14
|
+
} from '@things-factory/auth-base'
|
|
15
|
+
import {
|
|
16
|
+
Bizplace,
|
|
17
|
+
getDomainUsers
|
|
18
|
+
} from '@things-factory/biz-base'
|
|
19
|
+
import {
|
|
20
|
+
Product,
|
|
21
|
+
ProductDetail
|
|
22
|
+
} from '@things-factory/product-base'
|
|
6
23
|
import {
|
|
7
24
|
ArrivalNotice,
|
|
8
25
|
DeliveryOrder,
|
|
@@ -27,8 +44,14 @@ import {
|
|
|
27
44
|
Pallet
|
|
28
45
|
} from '@things-factory/warehouse-base'
|
|
29
46
|
|
|
30
|
-
import {
|
|
31
|
-
|
|
47
|
+
import {
|
|
48
|
+
WORKSHEET_STATUS,
|
|
49
|
+
WORKSHEET_TYPE
|
|
50
|
+
} from '../constants'
|
|
51
|
+
import {
|
|
52
|
+
Worksheet,
|
|
53
|
+
WorksheetDetail
|
|
54
|
+
} from '../entities'
|
|
32
55
|
import { WorksheetNoGenerator } from '../utils'
|
|
33
56
|
|
|
34
57
|
export type ReferenceOrderType =
|
|
@@ -742,8 +765,12 @@ export class WorksheetController {
|
|
|
742
765
|
async activateWorksheet(
|
|
743
766
|
worksheet: Worksheet,
|
|
744
767
|
worksheetDetails: WorksheetDetail[],
|
|
745
|
-
changedWorksheetDetails: Partial<WorksheetDetail>[]
|
|
768
|
+
changedWorksheetDetails: Partial<WorksheetDetail>[],
|
|
769
|
+
tx?: EntityManager
|
|
746
770
|
): Promise<Worksheet> {
|
|
771
|
+
|
|
772
|
+
const transaction = tx ? tx : this.trxMgr
|
|
773
|
+
|
|
747
774
|
if (!worksheet.id || worksheetDetails.some((wsd: WorksheetDetail) => !wsd.id)) {
|
|
748
775
|
throw new Error(this.ERROR_MSG.UPDATE.ID_NOT_EXISTS)
|
|
749
776
|
}
|
|
@@ -751,13 +778,14 @@ export class WorksheetController {
|
|
|
751
778
|
worksheet.status = WORKSHEET_STATUS.EXECUTING
|
|
752
779
|
worksheet.startedAt = new Date()
|
|
753
780
|
worksheet.updater = this.user
|
|
754
|
-
worksheet = await
|
|
781
|
+
worksheet = await transaction.getRepository(Worksheet).save(worksheet)
|
|
782
|
+
|
|
755
783
|
|
|
756
784
|
worksheetDetails = this.renewWorksheetDetails(worksheetDetails, changedWorksheetDetails, 'name', {
|
|
757
785
|
status: WORKSHEET_STATUS.EXECUTING,
|
|
758
786
|
updater: this.user
|
|
759
787
|
})
|
|
760
|
-
worksheet.worksheetDetails = await
|
|
788
|
+
worksheet.worksheetDetails = await transaction.getRepository(WorksheetDetail).save(worksheetDetails)
|
|
761
789
|
|
|
762
790
|
return worksheet
|
|
763
791
|
}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import { EntityManager } from 'typeorm'
|
|
2
|
+
|
|
1
3
|
import { User } from '@things-factory/auth-base'
|
|
2
4
|
import { Domain } from '@things-factory/shell'
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
+
|
|
6
|
+
import { WORKSHEET_TYPE } from '../../../../constants'
|
|
5
7
|
import { Worksheet } from '../../../../entities'
|
|
6
8
|
|
|
7
9
|
export const assignPickingWorkerResolver = {
|
|
@@ -25,9 +27,6 @@ export const assignPickingWorkerResolver = {
|
|
|
25
27
|
},{type:WORKSHEET_TYPE.PICKING}]})
|
|
26
28
|
|
|
27
29
|
if (!worksheet) throw new Error('failed to find target picking worksheet')
|
|
28
|
-
if (worksheet.status !== WORKSHEET_STATUS.DEACTIVATED)
|
|
29
|
-
throw new Error(`current status of worksheet is not able to assign worker`)
|
|
30
|
-
|
|
31
30
|
worksheet.assignee = assignee
|
|
32
31
|
await tx.getRepository(Worksheet).save(worksheet)
|
|
33
32
|
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { EntityManager } from 'typeorm'
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
ApplicationType,
|
|
5
|
+
User
|
|
6
|
+
} from '@things-factory/auth-base'
|
|
7
|
+
import { MarketplaceStore } from '@things-factory/integration-marketplace'
|
|
8
|
+
import { MarketplaceOrder } from '@things-factory/marketplace-base'
|
|
9
|
+
import {
|
|
10
|
+
ORDER_STATUS,
|
|
11
|
+
ReleaseGood
|
|
12
|
+
} from '@things-factory/sales-base'
|
|
13
|
+
import { Domain } from '@things-factory/shell'
|
|
14
|
+
|
|
15
|
+
import {
|
|
16
|
+
EcommerceController,
|
|
17
|
+
PickingWorksheetController
|
|
18
|
+
} from '../../../../controllers'
|
|
19
|
+
import { Worksheet } from '../../../../entities'
|
|
20
|
+
|
|
21
|
+
export const activateBulkPickingResolver = {
|
|
22
|
+
async activateBulkPicking(_: any, { worksheetNo }, context: any) {
|
|
23
|
+
const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
|
|
24
|
+
|
|
25
|
+
return await activateBulkPicking(tx, domain, user, worksheetNo)
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export async function activateBulkPicking(
|
|
30
|
+
tx: EntityManager,
|
|
31
|
+
domain: Domain,
|
|
32
|
+
user: User,
|
|
33
|
+
worksheetNo: string[]
|
|
34
|
+
): Promise<Worksheet[]> {
|
|
35
|
+
const worksheetController: PickingWorksheetController = new PickingWorksheetController(tx, domain, user)
|
|
36
|
+
const worksheets = await worksheetController.activateBulkPicking(worksheetNo)
|
|
37
|
+
|
|
38
|
+
for (const worksheet of worksheets) {
|
|
39
|
+
const companyDomain: Domain = worksheet?.bizplace.company.domain
|
|
40
|
+
let releaseGood: ReleaseGood = worksheet.releaseGood
|
|
41
|
+
const orderSource: string = releaseGood.source
|
|
42
|
+
|
|
43
|
+
switch (orderSource) {
|
|
44
|
+
case ApplicationType.MMS:
|
|
45
|
+
// find for any existing marketplace store connections
|
|
46
|
+
const marketplaceStores: MarketplaceStore[] = await tx.getRepository(MarketplaceStore).find({
|
|
47
|
+
where: { domain: companyDomain, status: 'ACTIVE', isAutoUpdateStockQty: true },
|
|
48
|
+
relations: ['marketplaceDistributors']
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
if (marketplaceStores?.length) {
|
|
52
|
+
if (marketplaceStores.some(store => store.isAutoUpdateStockQty)) {
|
|
53
|
+
const worksheetDetails = worksheet.worksheetDetails
|
|
54
|
+
let orderInventories: any[] = worksheetDetails.map(wsd => wsd.targetInventory)
|
|
55
|
+
const ecommerceCtrl: EcommerceController = new EcommerceController(tx, domain, user)
|
|
56
|
+
await ecommerceCtrl.updateProductVariationStock(marketplaceStores, orderInventories, companyDomain)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const marketplaceOrder: MarketplaceOrder = await tx.getRepository(MarketplaceOrder).findOne({
|
|
60
|
+
where: { orderNo: releaseGood.refNo, domain: companyDomain },
|
|
61
|
+
relations: ['marketplaceStore']
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
if (marketplaceOrder) {
|
|
65
|
+
const marketplaceStore: MarketplaceStore = marketplaceOrder.marketplaceStore
|
|
66
|
+
|
|
67
|
+
if (marketplaceStore.isAutoUpdateShipment) {
|
|
68
|
+
const ecommerceCtrl: EcommerceController = new EcommerceController(tx, domain, user)
|
|
69
|
+
await ecommerceCtrl.createOrderComment(marketplaceStore, marketplaceOrder, ORDER_STATUS.PICKING)
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
break
|
|
74
|
+
default:
|
|
75
|
+
break
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return worksheets
|
|
79
|
+
}
|
|
@@ -2,22 +2,24 @@ 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'
|
|
6
5
|
import { batchPickingResolver } from './batch-picking'
|
|
6
|
+
import { activateBulkPickingResolver } from './bulk-activate-picking'
|
|
7
7
|
import { completeBatchPickingResolver } from './complete-batch-picking'
|
|
8
8
|
import { completePickingResolver } from './complete-picking'
|
|
9
|
+
import { fetchAndAssignPickingTaskResolver } from './fetch-and-assign-picking-task'
|
|
9
10
|
import { pickingResolver } from './picking'
|
|
10
|
-
import {
|
|
11
|
+
import { replenishmentPickingResolver } from './replenishment-picking'
|
|
11
12
|
import { scanProductBatchPickingResolver } from './scan-product-batch-picking'
|
|
13
|
+
import { scanProductPickingResolver } from './scan-product-picking'
|
|
14
|
+
import { sealToteResolver } from './seal-tote'
|
|
12
15
|
import { undoPickingAssigmentResolver } from './undo-picking-assignment'
|
|
13
16
|
import { undoSerialNumberPickingResolver } from './undo-serial-number-picking'
|
|
14
|
-
import { sealToteResolver } from './seal-tote'
|
|
15
|
-
import { replenishmentPickingResolver } from './replenishment-picking'
|
|
16
17
|
|
|
17
18
|
export const Mutations = {
|
|
18
19
|
...assignPickingInventoriesResolver,
|
|
19
20
|
...undoPickingAssigmentResolver,
|
|
20
21
|
...activatePickingResolver,
|
|
22
|
+
...activateBulkPickingResolver,
|
|
21
23
|
...activateBatchPickingResolver,
|
|
22
24
|
...pickingResolver,
|
|
23
25
|
...scanProductPickingResolver,
|
|
@@ -29,5 +31,5 @@ export const Mutations = {
|
|
|
29
31
|
...fetchAndAssignPickingTaskResolver,
|
|
30
32
|
...undoSerialNumberPickingResolver,
|
|
31
33
|
...sealToteResolver,
|
|
32
|
-
...replenishmentPickingResolver
|
|
34
|
+
...replenishmentPickingResolver,
|
|
33
35
|
}
|
|
@@ -37,54 +37,93 @@ interface WorksheetInterface extends Worksheet {
|
|
|
37
37
|
|
|
38
38
|
export const worksheetResolver = {
|
|
39
39
|
async worksheet(_: any, { name }, context: any) {
|
|
40
|
+
console.time('query for worksheet')
|
|
40
41
|
const { domain }: { domain: Domain } = context.state
|
|
42
|
+
|
|
41
43
|
let worksheet: WorksheetInterface
|
|
44
|
+
|
|
45
|
+
let thisWorksheet = await getRepository(Worksheet).findOne({
|
|
46
|
+
where: {
|
|
47
|
+
domain,
|
|
48
|
+
name
|
|
49
|
+
}
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
let worksheetRelations: string[] = []
|
|
53
|
+
|
|
54
|
+
switch (thisWorksheet?.type) {
|
|
55
|
+
case 'PICKING':
|
|
56
|
+
case 'BATCH_PICKING':
|
|
57
|
+
case 'LOADING':
|
|
58
|
+
case 'PACKING':
|
|
59
|
+
case 'PICKING_REPLENISHMENT':
|
|
60
|
+
case 'SORTING':
|
|
61
|
+
case 'WAREHOUSE_RETURN':
|
|
62
|
+
case 'PUTAWAY_RETURN':
|
|
63
|
+
case 'UNLOADING_RETURN':
|
|
64
|
+
case 'PUTAWAY_REPLENISHMENT':
|
|
65
|
+
case 'VAS':
|
|
66
|
+
worksheetRelations.push(
|
|
67
|
+
'domain',
|
|
68
|
+
'bizplace',
|
|
69
|
+
'bizplace.domain',
|
|
70
|
+
'bufferLocation',
|
|
71
|
+
'bufferLocation.warehouse',
|
|
72
|
+
'arrivalNotice',
|
|
73
|
+
'arrivalNotice.releaseGood',
|
|
74
|
+
'releaseGood',
|
|
75
|
+
'releaseGood.arrivalNotice',
|
|
76
|
+
'releaseGood.shippingOrder',
|
|
77
|
+
'releaseGood.orderPackages',
|
|
78
|
+
'releaseGood.orderProducts',
|
|
79
|
+
'releaseGood.orderProducts.product',
|
|
80
|
+
'replenishment',
|
|
81
|
+
'returnOrder',
|
|
82
|
+
'inventoryCheck',
|
|
83
|
+
'vasOrder',
|
|
84
|
+
'assignee',
|
|
85
|
+
'worksheetDetails',
|
|
86
|
+
'worksheetDetails.targetInventory',
|
|
87
|
+
'worksheetDetails.targetInventory.bizplace',
|
|
88
|
+
'worksheetDetails.targetInventory.product',
|
|
89
|
+
'worksheetDetails.targetInventory.inventory',
|
|
90
|
+
'worksheetDetails.targetInventory.inventory.product',
|
|
91
|
+
'worksheetDetails.targetInventory.inventory.warehouse',
|
|
92
|
+
'worksheetDetails.targetInventory.inventory.location',
|
|
93
|
+
'worksheetDetails.targetVas',
|
|
94
|
+
'creator',
|
|
95
|
+
'updater'
|
|
96
|
+
)
|
|
97
|
+
break
|
|
98
|
+
|
|
99
|
+
case 'UNLOADING':
|
|
100
|
+
worksheetRelations.push(
|
|
101
|
+
'worksheetDetails',
|
|
102
|
+
'worksheetDetails.toLocation',
|
|
103
|
+
'worksheetDetails.targetProduct',
|
|
104
|
+
'worksheetDetails.targetProduct.product',
|
|
105
|
+
'worksheetDetails.targetProduct.releaseGood',
|
|
106
|
+
'worksheetDetails.targetVas.product',
|
|
107
|
+
'worksheetDetails.targetVas.newProduct',
|
|
108
|
+
'worksheetDetails.targetVas.newProductDetail',
|
|
109
|
+
'worksheetDetails.targetVas.orderVasItems',
|
|
110
|
+
'worksheetDetails.targetVas.orderVasItems.vas',
|
|
111
|
+
'worksheetDetails.targetInventory.releaseGood',
|
|
112
|
+
'worksheetDetails.targetInventory.inspectedLocation'
|
|
113
|
+
)
|
|
114
|
+
break
|
|
115
|
+
|
|
116
|
+
default:
|
|
117
|
+
// Default case if the name doesn't match any defined case
|
|
118
|
+
break
|
|
119
|
+
}
|
|
120
|
+
|
|
42
121
|
worksheet = (await getRepository(Worksheet).findOne({
|
|
43
122
|
where: {
|
|
44
123
|
domain,
|
|
45
124
|
name
|
|
46
125
|
},
|
|
47
|
-
relations:
|
|
48
|
-
'domain',
|
|
49
|
-
'bizplace',
|
|
50
|
-
'bizplace.domain',
|
|
51
|
-
'bufferLocation',
|
|
52
|
-
'bufferLocation.warehouse',
|
|
53
|
-
'arrivalNotice',
|
|
54
|
-
'arrivalNotice.releaseGood',
|
|
55
|
-
'releaseGood',
|
|
56
|
-
'releaseGood.arrivalNotice',
|
|
57
|
-
'releaseGood.shippingOrder',
|
|
58
|
-
'releaseGood.orderPackages',
|
|
59
|
-
'releaseGood.orderProducts',
|
|
60
|
-
'releaseGood.orderProducts.product',
|
|
61
|
-
'replenishment',
|
|
62
|
-
'returnOrder',
|
|
63
|
-
'inventoryCheck',
|
|
64
|
-
'vasOrder',
|
|
65
|
-
'assignee',
|
|
66
|
-
'worksheetDetails',
|
|
67
|
-
'worksheetDetails.toLocation',
|
|
68
|
-
'worksheetDetails.targetProduct',
|
|
69
|
-
'worksheetDetails.targetProduct.product',
|
|
70
|
-
'worksheetDetails.targetProduct.releaseGood',
|
|
71
|
-
'worksheetDetails.targetVas',
|
|
72
|
-
'worksheetDetails.targetVas.product',
|
|
73
|
-
'worksheetDetails.targetVas.newProduct',
|
|
74
|
-
'worksheetDetails.targetVas.newProductDetail',
|
|
75
|
-
'worksheetDetails.targetVas.orderVasItems',
|
|
76
|
-
'worksheetDetails.targetVas.orderVasItems.vas',
|
|
77
|
-
'worksheetDetails.targetInventory',
|
|
78
|
-
'worksheetDetails.targetInventory.releaseGood',
|
|
79
|
-
'worksheetDetails.targetInventory.product',
|
|
80
|
-
'worksheetDetails.targetInventory.inventory',
|
|
81
|
-
'worksheetDetails.targetInventory.inventory.product',
|
|
82
|
-
'worksheetDetails.targetInventory.inventory.warehouse',
|
|
83
|
-
'worksheetDetails.targetInventory.inventory.location',
|
|
84
|
-
'worksheetDetails.targetInventory.inspectedLocation',
|
|
85
|
-
'creator',
|
|
86
|
-
'updater'
|
|
87
|
-
]
|
|
126
|
+
relations: worksheetRelations
|
|
88
127
|
})) as WorksheetInterface
|
|
89
128
|
|
|
90
129
|
if (!worksheet) {
|
|
@@ -353,7 +392,7 @@ export const worksheetResolver = {
|
|
|
353
392
|
relations: ['targetProduct']
|
|
354
393
|
})
|
|
355
394
|
}
|
|
356
|
-
|
|
395
|
+
console.timeEnd('query for worksheet')
|
|
357
396
|
return worksheet
|
|
358
397
|
},
|
|
359
398
|
|