@things-factory/worksheet-base 4.3.593 → 4.3.596
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-server/constants/worksheet.js +5 -2
- package/dist-server/constants/worksheet.js.map +1 -1
- package/dist-server/controllers/outbound/picking-worksheet-controller.js +20 -15
- package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/returning-worksheet-controller.js +5 -2
- package/dist-server/controllers/outbound/returning-worksheet-controller.js.map +1 -1
- package/dist-server/entities/worksheet.js +9 -5
- package/dist-server/entities/worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js +1 -1
- package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js +9 -6
- package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/fetch-and-assign-picking-task.js +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js +1 -0
- package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/worksheets.js +65 -5
- package/dist-server/graphql/resolvers/worksheet/worksheets.js.map +1 -1
- package/dist-server/graphql/types/worksheet/worksheet-info.js +1 -0
- package/dist-server/graphql/types/worksheet/worksheet-info.js.map +1 -1
- package/dist-server/graphql/types/worksheet/worksheet.js +3 -0
- package/dist-server/graphql/types/worksheet/worksheet.js.map +1 -1
- package/dist-server/index.js +1 -0
- package/dist-server/index.js.map +1 -1
- package/dist-server/utils/worksheet-no-generator.js +11 -0
- package/dist-server/utils/worksheet-no-generator.js.map +1 -1
- package/package.json +13 -13
- package/server/constants/worksheet.ts +5 -2
- package/server/controllers/outbound/picking-worksheet-controller.ts +26 -23
- package/server/controllers/outbound/returning-worksheet-controller.ts +4 -2
- package/server/entities/worksheet.ts +3 -0
- package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +1 -1
- package/server/graphql/resolvers/worksheet/picking/assign-picking-worker.ts +18 -11
- package/server/graphql/resolvers/worksheet/picking/fetch-and-assign-picking-task.ts +1 -1
- package/server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.ts +1 -1
- package/server/graphql/resolvers/worksheet/picking-worksheet.ts +1 -0
- package/server/graphql/resolvers/worksheet/worksheets.ts +94 -13
- package/server/graphql/types/worksheet/worksheet-info.ts +1 -0
- package/server/graphql/types/worksheet/worksheet.ts +3 -0
- package/server/index.ts +1 -0
- package/server/utils/worksheet-no-generator.ts +17 -0
|
@@ -2695,35 +2695,38 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
2695
2695
|
})
|
|
2696
2696
|
|
|
2697
2697
|
worksheet.releaseGood = { ...worksheet.releaseGood, orderProducts, orderPackages, orderConsignments }
|
|
2698
|
+
if (worksheet.type === WORKSHEET_TYPE.PICKING) {
|
|
2699
|
+
if (worksheet.releaseGood?.assignedInventory == false) {
|
|
2700
|
+
worksheetDetails = await this.assignInventoriesForUnassignedOrder(worksheet, tx)
|
|
2701
|
+
worksheet.worksheetDetails = worksheetDetails
|
|
2702
|
+
worksheet.releaseGood.assignedInventory = true
|
|
2703
|
+
} else {
|
|
2704
|
+
worksheetDetails = worksheet.worksheetDetails.filter(x => x.status == 'DEACTIVATED')
|
|
2705
|
+
const targetInventoryIds: OrderInventory[] = worksheetDetails.map(
|
|
2706
|
+
(wsd: WorksheetDetail) => wsd.targetInventory.id
|
|
2707
|
+
)
|
|
2698
2708
|
|
|
2699
|
-
|
|
2700
|
-
|
|
2701
|
-
|
|
2702
|
-
|
|
2703
|
-
|
|
2704
|
-
|
|
2705
|
-
|
|
2706
|
-
|
|
2707
|
-
)
|
|
2709
|
+
await tx.getRepository(OrderInventory).update(
|
|
2710
|
+
{ id: In(targetInventoryIds) },
|
|
2711
|
+
{
|
|
2712
|
+
status: ORDER_INVENTORY_STATUS.PICKING,
|
|
2713
|
+
updater: this.user
|
|
2714
|
+
}
|
|
2715
|
+
)
|
|
2716
|
+
}
|
|
2708
2717
|
|
|
2709
|
-
await tx.getRepository(
|
|
2710
|
-
{ id:
|
|
2718
|
+
await tx.getRepository(ReleaseGood).update(
|
|
2719
|
+
{ id: worksheet.releaseGood.id },
|
|
2711
2720
|
{
|
|
2712
|
-
status:
|
|
2713
|
-
updater: this.user
|
|
2721
|
+
status: ORDER_STATUS.PICKING,
|
|
2722
|
+
updater: this.user,
|
|
2723
|
+
assignedInventory: true
|
|
2714
2724
|
}
|
|
2715
2725
|
)
|
|
2726
|
+
} else {
|
|
2727
|
+
worksheetDetails = worksheet.worksheetDetails
|
|
2716
2728
|
}
|
|
2717
2729
|
|
|
2718
|
-
await tx.getRepository(ReleaseGood).update(
|
|
2719
|
-
{ id: worksheet.releaseGood.id },
|
|
2720
|
-
{
|
|
2721
|
-
status: ORDER_STATUS.PICKING,
|
|
2722
|
-
updater: this.user,
|
|
2723
|
-
assignedInventory: true
|
|
2724
|
-
}
|
|
2725
|
-
)
|
|
2726
|
-
|
|
2727
2730
|
worksheet = await this.activateWorksheet(worksheet, worksheetDetails, [], tx)
|
|
2728
2731
|
releaseGood = worksheet.releaseGood
|
|
2729
2732
|
domain = worksheet.domain
|
|
@@ -2733,7 +2736,7 @@ export class PickingWorksheetController extends VasWorksheetController {
|
|
|
2733
2736
|
|
|
2734
2737
|
const orderSource: string = releaseGood?.source
|
|
2735
2738
|
switch (orderSource) {
|
|
2736
|
-
|
|
2739
|
+
//disable temporary to prevent duplicates call
|
|
2737
2740
|
case ApplicationType.SELLERCRAFT:
|
|
2738
2741
|
// getManager().transaction(async txMgr => {
|
|
2739
2742
|
// const sellercraft: Sellercraft = await txMgr
|
|
@@ -235,7 +235,7 @@ export class ReturningWorksheetController extends VasWorksheetController {
|
|
|
235
235
|
const releaseGood: ReleaseGood = await this.findRefOrder(ReleaseGood, {
|
|
236
236
|
domain: this.domain,
|
|
237
237
|
name: releaseGoodNo,
|
|
238
|
-
status: ORDER_STATUS.PARTIAL_RETURN
|
|
238
|
+
status: In([ORDER_STATUS.PARTIAL_RETURN, ORDER_STATUS.PROCESSING, ORDER_STATUS.PARTIAL_PROCESSING])
|
|
239
239
|
})
|
|
240
240
|
|
|
241
241
|
const worksheet: Worksheet = await this.findWorksheetByRefOrder(releaseGood, WORKSHEET_TYPE.WAREHOUSE_RETURN, [
|
|
@@ -244,6 +244,8 @@ export class ReturningWorksheetController extends VasWorksheetController {
|
|
|
244
244
|
])
|
|
245
245
|
this.checkRecordValidity(worksheet, { status: WORKSHEET_STATUS.EXECUTING })
|
|
246
246
|
|
|
247
|
-
|
|
247
|
+
let status = ORDER_STATUS.DONE
|
|
248
|
+
if(releaseGood.status !== ORDER_STATUS.PARTIAL_RETURN) status = releaseGood.status
|
|
249
|
+
return await this.completeWorksheet(worksheet, status)
|
|
248
250
|
}
|
|
249
251
|
}
|
|
@@ -43,7 +43,7 @@ export const inventoriesByPalletResolver = {
|
|
|
43
43
|
.andWhere('iv.qty > 0')
|
|
44
44
|
.andWhere('iv.transfer_qty <= 0')
|
|
45
45
|
.andWhere('iv.transfer_uom_value <= 0')
|
|
46
|
-
.andWhere('iv.lock_inventory
|
|
46
|
+
.andWhere('iv.lock_inventory is not true')
|
|
47
47
|
.andWhere(
|
|
48
48
|
`location.type ${recallFilters?.value === true ? '' : 'NOT'} IN ('${LOCATION_TYPE.QUARANTINE}', '${
|
|
49
49
|
LOCATION_TYPE.RESERVE
|
|
@@ -19,17 +19,24 @@ export const assignPickingWorkerResolver = {
|
|
|
19
19
|
|
|
20
20
|
if (!assignee) throw new Error('failed to find target user')
|
|
21
21
|
|
|
22
|
-
await Promise.all(
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
22
|
+
await Promise.all(
|
|
23
|
+
worksheetId.map(async worksheetId => {
|
|
24
|
+
const worksheet: Worksheet = await tx.getRepository(Worksheet).findOne(
|
|
25
|
+
{
|
|
26
|
+
id: worksheetId
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
where: [
|
|
30
|
+
{ type: WORKSHEET_TYPE.BATCH_PICKING },
|
|
31
|
+
{ type: WORKSHEET_TYPE.PICKING },
|
|
32
|
+
{ type: WORKSHEET_TYPE.ZONE_PICKING }
|
|
33
|
+
]
|
|
34
|
+
}
|
|
35
|
+
)
|
|
32
36
|
|
|
33
|
-
|
|
37
|
+
if (!worksheet) throw new Error('failed to find target picking worksheet')
|
|
38
|
+
await tx.getRepository(Worksheet).update({ id: worksheet.id }, { assignee: assignee })
|
|
39
|
+
})
|
|
40
|
+
)
|
|
34
41
|
}
|
|
35
42
|
}
|
|
@@ -67,7 +67,7 @@ export const fetchAndAssignPickingTaskResolver = {
|
|
|
67
67
|
INNER JOIN release_goods rg ON rg.id = ws.release_good_id
|
|
68
68
|
WHERE
|
|
69
69
|
ws.domain_id = $1 AND
|
|
70
|
-
ws.type = 'PICKING'
|
|
70
|
+
ws.type = 'PICKING'
|
|
71
71
|
AND ws.status IN ('EXECUTING', 'DEACTIVATED')
|
|
72
72
|
AND ws.assignee_id IS NULL
|
|
73
73
|
/*
|
|
@@ -49,7 +49,7 @@ export const pickingAssignmentStatusByUsersResolver = {
|
|
|
49
49
|
getAssignedWSQb.addSelect("sum(case when ws.status='DEACTIVATED' then 1 else 0 end) as pending")
|
|
50
50
|
getAssignedWSQb.innerJoin('ws.assignee','u')
|
|
51
51
|
getAssignedWSQb.where('ws.domain_id = :id',{id:domain.id})
|
|
52
|
-
getAssignedWSQb.andWhere('ws.type IN (:...type)', {type: [WORKSHEET_TYPE.PICKING, WORKSHEET_TYPE.BATCH_PICKING]})
|
|
52
|
+
getAssignedWSQb.andWhere('ws.type IN (:...type)', {type: [WORKSHEET_TYPE.PICKING, WORKSHEET_TYPE.BATCH_PICKING, WORKSHEET_TYPE.ZONE_PICKING]})
|
|
53
53
|
getAssignedWSQb.andWhere('ws.status IN (:...status)', {status: [WORKSHEET_STATUS.DEACTIVATED, WORKSHEET_STATUS.EXECUTING]})
|
|
54
54
|
getAssignedWSQb.groupBy('ws.assignee_id')
|
|
55
55
|
getAssignedWSQb.addGroupBy('u.name')
|
|
@@ -119,6 +119,7 @@ export async function pickingWorksheet(domain: Domain, orderNo: String, location
|
|
|
119
119
|
|
|
120
120
|
return {
|
|
121
121
|
worksheetInfo: {
|
|
122
|
+
worksheet,
|
|
122
123
|
bizplaceName: releaseGood.bizplace.name,
|
|
123
124
|
partnerDomainId: releaseGood.bizplace?.domain.id,
|
|
124
125
|
startedAt: worksheet.startedAt,
|
|
@@ -1,8 +1,15 @@
|
|
|
1
|
-
import { Brackets, getRepository, SelectQueryBuilder } from 'typeorm'
|
|
1
|
+
import { Brackets, getRepository, SelectQueryBuilder, In, createQueryBuilder } from 'typeorm'
|
|
2
2
|
|
|
3
3
|
import { User } from '@things-factory/auth-base'
|
|
4
4
|
import { getPermittedBizplaceIds } from '@things-factory/biz-base'
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
ArrivalNotice,
|
|
7
|
+
InventoryCheck,
|
|
8
|
+
ReleaseGood,
|
|
9
|
+
ReturnOrder,
|
|
10
|
+
Replenishment,
|
|
11
|
+
OrderInventory
|
|
12
|
+
} from '@things-factory/sales-base'
|
|
6
13
|
import { buildQuery, convertListParams, Domain, ListParam } from '@things-factory/shell'
|
|
7
14
|
|
|
8
15
|
import { WORKSHEET_TYPE } from '../../../constants'
|
|
@@ -428,7 +435,7 @@ export const worksheetsResolver = {
|
|
|
428
435
|
qb.andWhere(`replenishment.name ILIKE '${replenishmentParam.value}'`)
|
|
429
436
|
}
|
|
430
437
|
|
|
431
|
-
if (releaseGoodParam) {
|
|
438
|
+
if (releaseGoodParam && typeParam.value[0] !== WORKSHEET_TYPE.ZONE_PICKING) {
|
|
432
439
|
let removeSymbol = releaseGoodParam.value
|
|
433
440
|
.split('')
|
|
434
441
|
.filter(res => res !== '%')
|
|
@@ -552,7 +559,7 @@ export const worksheetsResolver = {
|
|
|
552
559
|
sort.name != 'releaseRefNo' &&
|
|
553
560
|
sort.name != 'returnOrderNo' &&
|
|
554
561
|
sort.name != 'inventoryCheckStatus' &&
|
|
555
|
-
sort.name != 'executionDate'
|
|
562
|
+
sort.name != 'executionDate'
|
|
556
563
|
) {
|
|
557
564
|
return {
|
|
558
565
|
...acc,
|
|
@@ -622,9 +629,7 @@ export const worksheetsResolver = {
|
|
|
622
629
|
if (params.sortings.some(e => e.name === 'updatedAt')) {
|
|
623
630
|
// overwrite the worksheet status sorting since inventory check status is needed
|
|
624
631
|
sort = {
|
|
625
|
-
'ws.updatedAt': params.sortings[
|
|
626
|
-
params.sortings.findIndex(item => item.name == 'updatedAt')
|
|
627
|
-
].desc
|
|
632
|
+
'ws.updatedAt': params.sortings[params.sortings.findIndex(item => item.name == 'updatedAt')].desc
|
|
628
633
|
? 'DESC'
|
|
629
634
|
: 'ASC'
|
|
630
635
|
}
|
|
@@ -634,12 +639,27 @@ export const worksheetsResolver = {
|
|
|
634
639
|
|
|
635
640
|
let [items, total] = await qb.getManyAndCount()
|
|
636
641
|
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
}
|
|
642
|
+
//zone picking worksheet is not tied to ro
|
|
643
|
+
//therefor extra query to fetch extra detail for zone picking worksheet
|
|
644
|
+
let extraItems
|
|
645
|
+
if (typeParam.value[0] === WORKSHEET_TYPE.ZONE_PICKING) {
|
|
646
|
+
extraItems = await zonePickingExtras(items, releaseGoodParam)
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
if (extraItems) {
|
|
650
|
+
items = extraItems.map(item => {
|
|
651
|
+
return {
|
|
652
|
+
...item
|
|
653
|
+
}
|
|
654
|
+
})
|
|
655
|
+
} else {
|
|
656
|
+
items = items.map(item => {
|
|
657
|
+
return {
|
|
658
|
+
...item,
|
|
659
|
+
orderRemark: item?.releaseGood?.remark ? true : false
|
|
660
|
+
}
|
|
661
|
+
})
|
|
662
|
+
}
|
|
643
663
|
|
|
644
664
|
return { items, total }
|
|
645
665
|
} catch (error) {
|
|
@@ -647,3 +667,64 @@ export const worksheetsResolver = {
|
|
|
647
667
|
}
|
|
648
668
|
}
|
|
649
669
|
}
|
|
670
|
+
|
|
671
|
+
async function zonePickingExtras(worksheets, releaseGoodParam) {
|
|
672
|
+
const wsIds = [...new Set(worksheets.map(ws => ws.id))]
|
|
673
|
+
|
|
674
|
+
if (wsIds.length === 0) {
|
|
675
|
+
throw new Error('No worksheet ID found')
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
const qb = await getRepository(OrderInventory)
|
|
679
|
+
.createQueryBuilder('oi')
|
|
680
|
+
.leftJoinAndSelect('oi.releaseGood', 'releaseGood')
|
|
681
|
+
.leftJoinAndSelect('oi.inventory', 'inventory')
|
|
682
|
+
.where('oi.refWorksheetId IN (:...wsIds)', { wsIds })
|
|
683
|
+
|
|
684
|
+
if (releaseGoodParam) {
|
|
685
|
+
let removeSymbol = releaseGoodParam.value
|
|
686
|
+
.split('')
|
|
687
|
+
.filter(res => res !== '%')
|
|
688
|
+
.join('')
|
|
689
|
+
|
|
690
|
+
let orderInfos = removeSymbol
|
|
691
|
+
.toLowerCase()
|
|
692
|
+
.split(',')
|
|
693
|
+
.map(prod => {
|
|
694
|
+
return "'%" + prod.trim().replace(/'/g, "''") + "%'"
|
|
695
|
+
})
|
|
696
|
+
.join(',')
|
|
697
|
+
|
|
698
|
+
qb.andWhere(`(
|
|
699
|
+
lower(releaseGood.name) like any(array[${orderInfos}])
|
|
700
|
+
or lower(releaseGood.ref_no) like any(array[${orderInfos}])
|
|
701
|
+
)`)
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
let orderInventories: OrderInventory[] = await qb.getMany()
|
|
705
|
+
|
|
706
|
+
//group oi by refWorksheetId
|
|
707
|
+
const groupedOi = orderInventories.reduce((acc, oi) => {
|
|
708
|
+
const worksheetId = oi.refWorksheetId
|
|
709
|
+
if (!acc[worksheetId]) acc[worksheetId] = []
|
|
710
|
+
acc[worksheetId].push(oi)
|
|
711
|
+
return acc
|
|
712
|
+
}, {})
|
|
713
|
+
|
|
714
|
+
//to filter worksheet when outboundOrderInfoFilter is used
|
|
715
|
+
const filteredWorksheets = worksheets.filter(ws => groupedOi[ws.id])
|
|
716
|
+
|
|
717
|
+
//map results to items
|
|
718
|
+
const extraItems = filteredWorksheets.map(ws => {
|
|
719
|
+
const inventories = groupedOi[ws.id] || []
|
|
720
|
+
const releaseGoods = inventories.map(oi => oi.releaseGood)
|
|
721
|
+
return {
|
|
722
|
+
...ws,
|
|
723
|
+
roCounts: new Set(releaseGoods.map(ro => ro.id)).size,
|
|
724
|
+
refNo: Array.from(new Set(releaseGoods.map(ro => ro.refNo))).join(','),
|
|
725
|
+
skuCounts: new Set(inventories.map(oi => oi.inventory?.id)).size
|
|
726
|
+
}
|
|
727
|
+
})
|
|
728
|
+
|
|
729
|
+
return extraItems
|
|
730
|
+
}
|
package/server/index.ts
CHANGED
|
@@ -16,5 +16,6 @@ export * from './controllers/render-orientage-grn'
|
|
|
16
16
|
export * from './controllers/render-orientage-do'
|
|
17
17
|
export * from './controllers/render-ro-do'
|
|
18
18
|
export * from './controllers/ecommerce/ecommerce-controller'
|
|
19
|
+
export * from './controllers/worksheet-controller'
|
|
19
20
|
|
|
20
21
|
export {createOrderPackageAndItems} from './controllers/outbound/picking-worksheet-controller'
|
|
@@ -26,6 +26,9 @@ export class WorksheetNoGenerator {
|
|
|
26
26
|
case WORKSHEET_TYPE.BATCH_PICKING:
|
|
27
27
|
return this.batchPicking()
|
|
28
28
|
|
|
29
|
+
case WORKSHEET_TYPE.ZONE_PICKING:
|
|
30
|
+
return this.zonePicking()
|
|
31
|
+
|
|
29
32
|
case WORKSHEET_TYPE.SORTING:
|
|
30
33
|
return this.sorting()
|
|
31
34
|
|
|
@@ -77,6 +80,9 @@ export class WorksheetNoGenerator {
|
|
|
77
80
|
case WORKSHEET_TYPE.BATCH_PICKING:
|
|
78
81
|
return this.batchPickingDetail()
|
|
79
82
|
|
|
83
|
+
case WORKSHEET_TYPE.ZONE_PICKING:
|
|
84
|
+
return this.zonePickingDetail()
|
|
85
|
+
|
|
80
86
|
case WORKSHEET_TYPE.SORTING:
|
|
81
87
|
return this.sortingDetail()
|
|
82
88
|
|
|
@@ -153,6 +159,13 @@ export class WorksheetNoGenerator {
|
|
|
153
159
|
}${currentDate.getDate()}${currentDate.getHours()}${currentDate.getMinutes()}${currentDate.getSeconds()}${currentDate.getMilliseconds()}`
|
|
154
160
|
}
|
|
155
161
|
|
|
162
|
+
static zonePicking() {
|
|
163
|
+
const currentDate = new Date()
|
|
164
|
+
return `ZP-${currentDate.getFullYear()}${
|
|
165
|
+
currentDate.getMonth() + 1
|
|
166
|
+
}${currentDate.getDate()}${currentDate.getHours()}${currentDate.getMinutes()}${currentDate.getSeconds()}${currentDate.getMilliseconds()}`
|
|
167
|
+
}
|
|
168
|
+
|
|
156
169
|
static sorting() {
|
|
157
170
|
const currentDate = new Date()
|
|
158
171
|
return `SORT-${currentDate.getFullYear()}${
|
|
@@ -220,6 +233,10 @@ export class WorksheetNoGenerator {
|
|
|
220
233
|
return `BP-DETAIL-${uuidv4()}`
|
|
221
234
|
}
|
|
222
235
|
|
|
236
|
+
static zonePickingDetail() {
|
|
237
|
+
return `ZP-DETAIL-${uuidv4()}`
|
|
238
|
+
}
|
|
239
|
+
|
|
223
240
|
static vasDetail() {
|
|
224
241
|
return `VAS-DETAIL-${uuidv4()}`
|
|
225
242
|
}
|