@things-factory/worksheet-base 4.0.24 → 4.0.28
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/ecommerce-controller.js +10 -3
- package/dist-server/controllers/ecommerce/ecommerce-controller.js.map +1 -1
- package/dist-server/controllers/ecommerce/sellercraft-controller.js +5 -3
- package/dist-server/controllers/ecommerce/sellercraft-controller.js.map +1 -1
- package/dist-server/controllers/inbound/putaway-returning-worksheet-controller.js +24 -4
- package/dist-server/controllers/inbound/putaway-returning-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/inbound/unloading-worksheet-controller.js +98 -140
- package/dist-server/controllers/inbound/unloading-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/packing-worksheet-controller.js +2 -6
- package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/picking-worksheet-controller.js +4 -4
- package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/render-grn.js +7 -2
- package/dist-server/controllers/render-grn.js.map +1 -1
- package/dist-server/controllers/render-manual-do.js +4 -3
- package/dist-server/controllers/render-manual-do.js.map +1 -1
- package/dist-server/controllers/render-orientage-do.js +3 -3
- package/dist-server/controllers/render-orientage-do.js.map +1 -1
- package/dist-server/controllers/render-orientage-grn.js +4 -4
- package/dist-server/controllers/render-orientage-grn.js.map +1 -1
- package/dist-server/controllers/render-ro-do.js +1 -0
- package/dist-server/controllers/render-ro-do.js.map +1 -1
- package/dist-server/controllers/worksheet-controller.js +5 -5
- package/dist-server/controllers/worksheet-controller.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-multiple-release-good-worksheet.js +14 -0
- package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-multiple-release-good-worksheet.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-release-good-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/generate-worksheet/index.js +2 -1
- package/dist-server/graphql/resolvers/worksheet/generate-worksheet/index.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +8 -4
- package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/activate-picking.js +6 -4
- package/dist-server/graphql/resolvers/worksheet/picking/activate-picking.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +4 -7
- package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/fetch-and-assign-picking-task.js +64 -54
- package/dist-server/graphql/resolvers/worksheet/picking/fetch-and-assign-picking-task.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/putaway-returning-worksheet.js +5 -1
- package/dist-server/graphql/resolvers/worksheet/putaway-returning-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/putaway-worksheet.js +6 -2
- package/dist-server/graphql/resolvers/worksheet/putaway-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/return-worksheet.js +3 -1
- package/dist-server/graphql/resolvers/worksheet/return-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/sorting-worksheet.js +2 -1
- package/dist-server/graphql/resolvers/worksheet/sorting-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/unloading/index.js +4 -5
- package/dist-server/graphql/resolvers/worksheet/unloading/index.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/unloading/undo-unloading.js +4 -4
- package/dist-server/graphql/resolvers/worksheet/unloading/undo-unloading.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js +4 -2
- package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/worksheet.js +28 -1
- package/dist-server/graphql/resolvers/worksheet/worksheet.js.map +1 -1
- package/dist-server/graphql/types/worksheet/index.js +7 -8
- package/dist-server/graphql/types/worksheet/index.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/package.json +16 -16
- package/server/controllers/ecommerce/ecommerce-controller.ts +18 -4
- package/server/controllers/ecommerce/sellercraft-controller.ts +11 -5
- package/server/controllers/inbound/putaway-returning-worksheet-controller.ts +28 -6
- package/server/controllers/inbound/unloading-worksheet-controller.ts +130 -152
- package/server/controllers/outbound/packing-worksheet-controller.ts +2 -7
- package/server/controllers/outbound/picking-worksheet-controller.ts +4 -4
- package/server/controllers/render-grn.ts +7 -2
- package/server/controllers/render-manual-do.ts +7 -4
- package/server/controllers/render-orientage-do.ts +7 -5
- package/server/controllers/render-orientage-grn.ts +9 -7
- package/server/controllers/render-ro-do.ts +1 -0
- package/server/controllers/worksheet-controller.ts +5 -5
- package/server/graphql/resolvers/worksheet/generate-worksheet/generate-multiple-release-good-worksheet.ts +22 -0
- package/server/graphql/resolvers/worksheet/generate-worksheet/generate-release-good-worksheet.ts +3 -1
- package/server/graphql/resolvers/worksheet/generate-worksheet/index.ts +2 -0
- package/server/graphql/resolvers/worksheet/packing-worksheet.ts +9 -5
- package/server/graphql/resolvers/worksheet/picking/activate-picking.ts +7 -4
- package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +4 -8
- package/server/graphql/resolvers/worksheet/picking/fetch-and-assign-picking-task.ts +67 -56
- package/server/graphql/resolvers/worksheet/picking-worksheet.ts +1 -0
- package/server/graphql/resolvers/worksheet/putaway-returning-worksheet.ts +9 -3
- package/server/graphql/resolvers/worksheet/putaway-worksheet.ts +9 -3
- package/server/graphql/resolvers/worksheet/return-worksheet.ts +7 -3
- package/server/graphql/resolvers/worksheet/sorting-worksheet.ts +5 -2
- package/server/graphql/resolvers/worksheet/unloading/index.ts +3 -5
- package/server/graphql/resolvers/worksheet/unloading/undo-unloading.ts +9 -6
- package/server/graphql/resolvers/worksheet/unloading-worksheet.ts +7 -3
- package/server/graphql/resolvers/worksheet/worksheet.ts +29 -1
- package/server/graphql/types/worksheet/index.ts +8 -9
- package/server/graphql/types/worksheet/worksheet-info.ts +1 -0
- package/dist-server/graphql/resolvers/worksheet/unloading/undo-product-scan-unload.js +0 -15
- package/dist-server/graphql/resolvers/worksheet/unloading/undo-product-scan-unload.js.map +0 -1
- package/server/graphql/resolvers/worksheet/unloading/undo-product-scan-unload.ts +0 -23
|
@@ -1,19 +1,21 @@
|
|
|
1
|
+
import FormData from 'form-data'
|
|
2
|
+
import fetch from 'node-fetch'
|
|
3
|
+
import { getRepository, IsNull, Not } from 'typeorm'
|
|
4
|
+
|
|
1
5
|
import { Attachment, STORAGE } from '@things-factory/attachment-base'
|
|
2
6
|
import { Partner } from '@things-factory/auth-base'
|
|
3
7
|
import { Bizplace, ContactPoint } from '@things-factory/biz-base'
|
|
4
8
|
import { config } from '@things-factory/env'
|
|
9
|
+
import { ProductDetail } from '@things-factory/product-base'
|
|
5
10
|
import {
|
|
6
11
|
ArrivalNotice,
|
|
7
12
|
GoodsReceivalNote,
|
|
8
|
-
OrderProduct,
|
|
9
13
|
ORDER_PRODUCT_STATUS,
|
|
10
|
-
ORDER_STATUS
|
|
14
|
+
ORDER_STATUS,
|
|
15
|
+
OrderProduct
|
|
11
16
|
} from '@things-factory/sales-base'
|
|
12
|
-
import { Product, ProductDetail } from '@things-factory/product-base'
|
|
13
17
|
import { Domain } from '@things-factory/shell'
|
|
14
|
-
|
|
15
|
-
import fetch from 'node-fetch'
|
|
16
|
-
import { getRepository, IsNull, Not } from 'typeorm'
|
|
18
|
+
|
|
17
19
|
import { TEMPLATE_TYPE } from '../constants'
|
|
18
20
|
import { Worksheet } from '../entities'
|
|
19
21
|
import { DateTimeConverter } from '../utils/datetime-util'
|
|
@@ -134,7 +136,7 @@ export async function renderOrientageGRN({ grnNo }, context: any) {
|
|
|
134
136
|
pack_qty: item.packQty ? item.packQty : 0,
|
|
135
137
|
actual_pack_qty: item.actualPackQty ? item.actualPackQty : 0,
|
|
136
138
|
container_no: foundGAN.containerNo ? foundGAN.containerNo : '',
|
|
137
|
-
aux_value_3:
|
|
139
|
+
aux_value_3: matchedProductDetail?.auxValue3 ? matchedProductDetail.auxValue3 : '',
|
|
138
140
|
product_volume: matchedProductDetail
|
|
139
141
|
? matchedProductDetail?.volume
|
|
140
142
|
? matchedProductDetail.volume
|
|
@@ -138,6 +138,7 @@ export async function renderRODO({ doNo }, context: any) {
|
|
|
138
138
|
product_batch: inventory.batchId,
|
|
139
139
|
product_qty: targetInventory.releaseQty,
|
|
140
140
|
product_weight: targetInventory.releaseWeight,
|
|
141
|
+
product_gross_weight: inventory.product.grossWeight,
|
|
141
142
|
product_uom_value: targetInventory.releaseUomValue,
|
|
142
143
|
product_uom: inventory.uom,
|
|
143
144
|
remark: targetInventory.remark,
|
|
@@ -387,7 +387,7 @@ export class WorksheetController {
|
|
|
387
387
|
type: string,
|
|
388
388
|
additionalProps: Partial<Worksheet> = {}
|
|
389
389
|
): Promise<Worksheet> {
|
|
390
|
-
let refOrderType: string = this.getRefOrderField(refOrder)
|
|
390
|
+
let refOrderType: string = await this.getRefOrderField(refOrder)
|
|
391
391
|
const bizplace: Bizplace = await this.extractBizplaceFromRefOrder(refOrder)
|
|
392
392
|
|
|
393
393
|
const worksheet: Partial<Worksheet> = {
|
|
@@ -676,7 +676,7 @@ export class WorksheetController {
|
|
|
676
676
|
'worksheetDetails.targetVas'
|
|
677
677
|
])
|
|
678
678
|
|
|
679
|
-
|
|
679
|
+
let worksheetDetails: WorksheetDetail[] = worksheet.worksheetDetails
|
|
680
680
|
|
|
681
681
|
worksheetDetails
|
|
682
682
|
.filter((wsd: WorksheetDetail) => wsd.status !== ORDER_INVENTORY_STATUS.REPLACED)
|
|
@@ -687,7 +687,7 @@ export class WorksheetController {
|
|
|
687
687
|
await this.trxMgr.getRepository(WorksheetDetail).save(worksheetDetails)
|
|
688
688
|
|
|
689
689
|
if (worksheetType === WORKSHEET_TYPE.UNLOADING) {
|
|
690
|
-
|
|
690
|
+
let targetProducts: OrderProduct[] = worksheet.worksheetDetails.map((wsd: WorksheetDetail) => {
|
|
691
691
|
let targetProduct: OrderProduct = wsd.targetProduct
|
|
692
692
|
targetProduct.status = ORDER_PRODUCT_STATUS.TERMINATED
|
|
693
693
|
targetProduct.updater = this.user
|
|
@@ -696,7 +696,7 @@ export class WorksheetController {
|
|
|
696
696
|
|
|
697
697
|
await this.updateOrderTargets(targetProducts)
|
|
698
698
|
} else if (worksheetType === WORKSHEET_TYPE.VAS) {
|
|
699
|
-
|
|
699
|
+
let targetVASs: OrderVas[] = worksheet.worksheetDetails.map((wsd: WorksheetDetail) => {
|
|
700
700
|
let targetVAS: OrderVas = wsd.targetVas
|
|
701
701
|
targetVAS.status = ORDER_VAS_STATUS.TERMINATED
|
|
702
702
|
targetVAS.updater = this.user
|
|
@@ -712,7 +712,7 @@ export class WorksheetController {
|
|
|
712
712
|
worksheetType === WORKSHEET_TYPE.WAREHOUSE_RETURN ||
|
|
713
713
|
worksheetType === WORKSHEET_TYPE.UNLOADING_RETURN
|
|
714
714
|
) {
|
|
715
|
-
|
|
715
|
+
let targetInventories: OrderInventory[] = worksheet.worksheetDetails
|
|
716
716
|
.filter((wsd: WorksheetDetail) => wsd.status !== ORDER_INVENTORY_STATUS.REPLACED)
|
|
717
717
|
.map((wsd: WorksheetDetail) => {
|
|
718
718
|
let targetInventory: OrderInventory = wsd.targetInventory
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { EntityManager } from 'typeorm'
|
|
2
|
+
|
|
3
|
+
import { User } from '@things-factory/auth-base'
|
|
4
|
+
import { OrderInventory } from '@things-factory/sales-base'
|
|
5
|
+
import { Domain } from '@things-factory/shell'
|
|
6
|
+
|
|
7
|
+
import { PickingWorksheetController } from '../../../../controllers/'
|
|
8
|
+
import { Worksheet, WorksheetDetail } from '../../../../entities'
|
|
9
|
+
|
|
10
|
+
import { generatePickingWorksheet } from './generate-release-good-worksheet'
|
|
11
|
+
|
|
12
|
+
export const generateMultipleReleaseGoodWorksheetResolver = {
|
|
13
|
+
async generateMultipleReleaseGoodWorksheet(_: any, { releaseGoodNos }, context: any) {
|
|
14
|
+
const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
|
|
15
|
+
|
|
16
|
+
for (let idx = 0; idx < releaseGoodNos.length; idx++) {
|
|
17
|
+
await generatePickingWorksheet(tx, domain, user, releaseGoodNos[idx])
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
return true
|
|
21
|
+
}
|
|
22
|
+
}
|
package/server/graphql/resolvers/worksheet/generate-worksheet/generate-release-good-worksheet.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import { EntityManager } from 'typeorm'
|
|
2
|
+
|
|
1
3
|
import { User } from '@things-factory/auth-base'
|
|
2
4
|
import { OrderInventory } from '@things-factory/sales-base'
|
|
3
5
|
import { Domain } from '@things-factory/shell'
|
|
4
|
-
|
|
6
|
+
|
|
5
7
|
import { PickingWorksheetController } from '../../../../controllers/'
|
|
6
8
|
import { Worksheet, WorksheetDetail } from '../../../../entities'
|
|
7
9
|
|
|
@@ -4,6 +4,7 @@ import { generateCycleCountWorksheetResolver } from './generate-cycle-count-work
|
|
|
4
4
|
import { generatePartialPutawayWorksheetResolver } from './generate-partial-putaway-worksheet'
|
|
5
5
|
import { generatePutawayWorksheetResolver } from './generate-putaway-worksheet'
|
|
6
6
|
import { generateReleaseGoodWorksheetResolver } from './generate-release-good-worksheet'
|
|
7
|
+
import { generateMultipleReleaseGoodWorksheetResolver } from './generate-multiple-release-good-worksheet'
|
|
7
8
|
import { generateVasOrderWorksheetResolver } from './generate-vas-order-worksheet'
|
|
8
9
|
import { generateReturnOrderWorksheetResolver } from './generate-return-order-worksheet'
|
|
9
10
|
import { generatePartialPutawayReturnWorksheetResolver } from './generate-partial-putaway-return-worksheet'
|
|
@@ -15,6 +16,7 @@ export const Mutations = {
|
|
|
15
16
|
...generatePartialPutawayWorksheetResolver,
|
|
16
17
|
...generatePutawayWorksheetResolver,
|
|
17
18
|
...generateReleaseGoodWorksheetResolver,
|
|
19
|
+
...generateMultipleReleaseGoodWorksheetResolver,
|
|
18
20
|
...generateVasOrderWorksheetResolver,
|
|
19
21
|
...generateReturnOrderWorksheetResolver,
|
|
20
22
|
...generatePartialPutawayReturnWorksheetResolver
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { EntityManager,
|
|
1
|
+
import { EntityManager, SelectQueryBuilder } from 'typeorm'
|
|
2
2
|
|
|
3
3
|
import { User } from '@things-factory/auth-base'
|
|
4
4
|
import { Sellercraft, SellercraftStatus } from '@things-factory/integration-sellercraft'
|
|
5
5
|
import { MarketplaceOrder, MarketplaceOrderItem, MarketplaceOrderShipping } from '@things-factory/marketplace-base'
|
|
6
|
-
import { ORDER_INVENTORY_STATUS, OrderInventory, ReleaseGood } from '@things-factory/sales-base'
|
|
6
|
+
import { ORDER_INVENTORY_STATUS, ORDER_STATUS, OrderInventory, ReleaseGood } from '@things-factory/sales-base'
|
|
7
7
|
import { Domain } from '@things-factory/shell'
|
|
8
8
|
import { Inventory, Location } from '@things-factory/warehouse-base'
|
|
9
9
|
|
|
@@ -11,7 +11,6 @@ import { WORKSHEET_TYPE } from '../../../constants'
|
|
|
11
11
|
import { SellercraftController } from '../../../controllers'
|
|
12
12
|
import { Worksheet, WorksheetDetail } from '../../../entities'
|
|
13
13
|
import { fetchExecutingWorksheet } from '../../../utils'
|
|
14
|
-
import { ORDER_STATUS } from '@things-factory/sales-base'
|
|
15
14
|
|
|
16
15
|
export const packingWorksheetResolver = {
|
|
17
16
|
async packingWorksheet(_: any, { releaseGoodNo }, context: any) {
|
|
@@ -30,12 +29,16 @@ export const packingWorksheetResolver = {
|
|
|
30
29
|
where: { domain, name: releaseGoodNo }
|
|
31
30
|
})
|
|
32
31
|
|
|
33
|
-
const qb: SelectQueryBuilder<OrderInventory> = tx
|
|
32
|
+
const qb: SelectQueryBuilder<OrderInventory> = tx
|
|
33
|
+
.getRepository(OrderInventory)
|
|
34
|
+
.createQueryBuilder('orderInventory')
|
|
34
35
|
qb.innerJoinAndSelect('orderInventory.releaseGood', 'releaseGood')
|
|
35
36
|
.innerJoinAndSelect('releaseGood.bizplace', 'bizplace')
|
|
36
37
|
.innerJoinAndSelect('bizplace.domain', 'domain')
|
|
37
38
|
.where('orderInventory.domain_id = :domainId', { domainId: domain.id })
|
|
38
|
-
.andWhere('orderInventory.status IN (:...orderInventoryStatus)', {
|
|
39
|
+
.andWhere('orderInventory.status IN (:...orderInventoryStatus)', {
|
|
40
|
+
orderInventoryStatus: [ORDER_INVENTORY_STATUS.PACKING, ORDER_INVENTORY_STATUS.PACKED]
|
|
41
|
+
})
|
|
39
42
|
.andWhere('orderInventory.bin_location_id = :locationId', { locationId: binLocation.id })
|
|
40
43
|
.andWhere('releaseGood.status = :status', { status: ORDER_STATUS.PACKING })
|
|
41
44
|
|
|
@@ -138,6 +141,7 @@ export const packingWorksheetResolver = {
|
|
|
138
141
|
bizplaceName: releaseGood.bizplace.name,
|
|
139
142
|
refNo: releaseGood.refNo,
|
|
140
143
|
refNo2: releaseGood.refNo2,
|
|
144
|
+
refNo3: releaseGood.refNo3,
|
|
141
145
|
partnerDomainId: releaseGood.bizplace?.domain.id,
|
|
142
146
|
startedAt: worksheet.startedAt,
|
|
143
147
|
shippingProvider: shippingProvider ? shippingProvider : '',
|
|
@@ -52,11 +52,14 @@ export async function activatePicking(
|
|
|
52
52
|
where: { orderNo: releaseGood.refNo, domain: companyDomain },
|
|
53
53
|
relations: ['marketplaceStore']
|
|
54
54
|
})
|
|
55
|
-
const marketplaceStore: MarketplaceStore = marketplaceOrder.marketplaceStore
|
|
56
55
|
|
|
57
|
-
if (
|
|
58
|
-
const
|
|
59
|
-
|
|
56
|
+
if (marketplaceOrder) {
|
|
57
|
+
const marketplaceStore: MarketplaceStore = marketplaceOrder.marketplaceStore
|
|
58
|
+
|
|
59
|
+
if (marketplaceStore.isAutoUpdateShipment) {
|
|
60
|
+
const ecommerceCtrl: EcommerceController = new EcommerceController(tx, domain, user)
|
|
61
|
+
await ecommerceCtrl.createOrderComment(marketplaceStore, marketplaceOrder, ORDER_STATUS.PICKING)
|
|
62
|
+
}
|
|
60
63
|
}
|
|
61
64
|
}
|
|
62
65
|
}
|
|
@@ -45,7 +45,7 @@ export async function completePicking(
|
|
|
45
45
|
releaseGoodNo: string
|
|
46
46
|
): Promise<void> {
|
|
47
47
|
const pickingWSCtrl: PickingWorksheetController = new PickingWorksheetController(tx, domain, user)
|
|
48
|
-
|
|
48
|
+
let releaseGood: ReleaseGood = await tx.getRepository(ReleaseGood).findOne({
|
|
49
49
|
where: { domain, name: releaseGoodNo },
|
|
50
50
|
relations: [
|
|
51
51
|
'bizplace',
|
|
@@ -53,6 +53,7 @@ export async function completePicking(
|
|
|
53
53
|
'bizplace.company',
|
|
54
54
|
'bizplace.company.domain',
|
|
55
55
|
'orderInventories',
|
|
56
|
+
'orderInventories.inventory',
|
|
56
57
|
'orderInventories.product'
|
|
57
58
|
]
|
|
58
59
|
})
|
|
@@ -84,13 +85,13 @@ export async function completePicking(
|
|
|
84
85
|
|
|
85
86
|
if (sellercraft) {
|
|
86
87
|
const sellercraftCtrl: SellercraftController = new SellercraftController(tx, domain, user)
|
|
87
|
-
await sellercraftCtrl.initiateOrderShipment(sellercraft, releaseGood)
|
|
88
|
+
releaseGood = await sellercraftCtrl.initiateOrderShipment(sellercraft, releaseGood)
|
|
88
89
|
await sellercraftCtrl.initiateOrderDocument(sellercraft, releaseGood)
|
|
89
90
|
} else {
|
|
90
91
|
const companyDomain: Domain = releaseGood.bizplace.company.domain
|
|
91
92
|
let marketplaceOrder: MarketplaceOrder = await tx.getRepository(MarketplaceOrder).findOne({
|
|
92
93
|
where: { orderNo: releaseGood.refNo, domain: companyDomain },
|
|
93
|
-
relations: ['marketplaceStore']
|
|
94
|
+
relations: ['marketplaceStore', 'marketplaceOrderItems', 'marketplaceOrderItems.marketplaceOrderShipping']
|
|
94
95
|
})
|
|
95
96
|
const marketplaceStore: MarketplaceStore = marketplaceOrder.marketplaceStore
|
|
96
97
|
let eTraxOption: boolean
|
|
@@ -100,11 +101,6 @@ export async function completePicking(
|
|
|
100
101
|
await ecommerceCtrl.createOrderComment(marketplaceStore, marketplaceOrder, ORDER_STATUS.PACKING)
|
|
101
102
|
}
|
|
102
103
|
|
|
103
|
-
marketplaceOrder = await tx.getRepository(MarketplaceOrder).findOne({
|
|
104
|
-
where: { orderNo: releaseGood.refNo },
|
|
105
|
-
relations: ['marketplaceStore', 'marketplaceOrderItems', 'marketplaceOrderItems.marketplaceOrderShipping']
|
|
106
|
-
})
|
|
107
|
-
|
|
108
104
|
if (!marketplaceOrder)
|
|
109
105
|
throw new Error('Failed to find ecommerce order, kindly contact our support team regarding this issue')
|
|
110
106
|
eTraxOption = marketplaceOrder?.marketplaceStore.eTrax
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { EntityManager, getRepository } from 'typeorm'
|
|
2
2
|
|
|
3
3
|
import { User } from '@things-factory/auth-base'
|
|
4
|
+
import { ReleaseGood, OrderInventory } from '@things-factory/sales-base'
|
|
4
5
|
import { Setting } from '@things-factory/setting-base'
|
|
5
6
|
import { Domain } from '@things-factory/shell'
|
|
6
7
|
|
|
@@ -10,69 +11,79 @@ import { pickingWorksheet } from '../picking-worksheet'
|
|
|
10
11
|
import { activatePicking } from './activate-picking'
|
|
11
12
|
|
|
12
13
|
export const fetchAndAssignPickingTaskResolver = {
|
|
13
|
-
async fetchAndAssignPickingTask(_: any, {}, context: any) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
async fetchAndAssignPickingTask(_: any, { }, context: any) {
|
|
15
|
+
try {
|
|
16
|
+
const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
|
|
17
|
+
const assignee: User = await tx.getRepository(User).findOne(user.id, { relations: ['domains'] })
|
|
18
|
+
if ((assignee?.domains || []).every((userDomain: Domain) => userDomain.id !== domain.id))
|
|
19
|
+
throw new Error('Target user is not belong to current domain')
|
|
18
20
|
|
|
19
|
-
|
|
21
|
+
if (!assignee) throw new Error('failed to find target user')
|
|
20
22
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}
|
|
41
|
-
})
|
|
23
|
+
let worksheet: any
|
|
24
|
+
let worksheetQb = await tx.getRepository(Worksheet).createQueryBuilder('ws')
|
|
25
|
+
.select('ws.id')
|
|
26
|
+
.addSelect('ws.name')
|
|
27
|
+
.addSelect('ws.status')
|
|
28
|
+
.addSelect('ws.release_good_id')
|
|
29
|
+
.where('(ws.domain_id = :domain_id AND ws.type = :type AND ws.assignee_id =:assignee AND (ws.status = :status1 OR ws.status = :status2))', { domain_id: domain.id, type: WORKSHEET_TYPE.PICKING, assignee: assignee.id, status1: WORKSHEET_STATUS.EXECUTING, status2: WORKSHEET_STATUS.DEACTIVATED })
|
|
30
|
+
.andWhere(qb => {
|
|
31
|
+
const subQuery = qb
|
|
32
|
+
.subQuery()
|
|
33
|
+
.select('COUNT(*) AS totalPS')
|
|
34
|
+
.from(OrderInventory, 'OrderInventory')
|
|
35
|
+
.where('OrderInventory.release_good_id = ws.release_good_id')
|
|
36
|
+
.andWhere(`OrderInventory.status = 'PENDING_SPLIT'`)
|
|
37
|
+
.groupBy('OrderInventory.release_good_id')
|
|
38
|
+
.having('COUNT(*) > 0')
|
|
39
|
+
.getQuery()
|
|
40
|
+
return 'NOT EXISTS ' + subQuery
|
|
41
|
+
})
|
|
42
42
|
|
|
43
|
-
|
|
44
|
-
worksheet = await tx.getRepository(Worksheet).findOne({
|
|
45
|
-
relations: ['releaseGood'],
|
|
46
|
-
where: [
|
|
47
|
-
{
|
|
48
|
-
domain,
|
|
49
|
-
type: WORKSHEET_TYPE.PICKING,
|
|
50
|
-
status: WORKSHEET_STATUS.EXECUTING,
|
|
51
|
-
assignee: null
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
domain,
|
|
55
|
-
type: WORKSHEET_TYPE.PICKING,
|
|
56
|
-
status: WORKSHEET_STATUS.DEACTIVATED,
|
|
57
|
-
assignee: null
|
|
58
|
-
}
|
|
59
|
-
]
|
|
60
|
-
})
|
|
43
|
+
worksheet = await worksheetQb.getRawOne();
|
|
61
44
|
|
|
62
|
-
|
|
63
|
-
|
|
45
|
+
if (!worksheet) {
|
|
46
|
+
let worksheetQb = await tx.getRepository(Worksheet).createQueryBuilder('ws')
|
|
47
|
+
.select('ws.id')
|
|
48
|
+
.addSelect('ws.name')
|
|
49
|
+
.addSelect('ws.status')
|
|
50
|
+
.addSelect('ws.release_good_id')
|
|
51
|
+
.where('(ws.domain_id = :domain_id AND ws.type = :type AND ws.assignee_id IS NULL AND (ws.status = :status1 OR ws.status = :status2))', { domain_id: domain.id, type: WORKSHEET_TYPE.PICKING, status1: WORKSHEET_STATUS.EXECUTING, status2: WORKSHEET_STATUS.DEACTIVATED })
|
|
52
|
+
.andWhere(qb => {
|
|
53
|
+
const subQuery = qb
|
|
54
|
+
.subQuery()
|
|
55
|
+
.select('COUNT(*) AS totalPS')
|
|
56
|
+
.from(OrderInventory, 'OrderInventory')
|
|
57
|
+
.where('OrderInventory.release_good_id = ws.release_good_id')
|
|
58
|
+
.andWhere(`OrderInventory.status = 'PENDING_SPLIT'`)
|
|
59
|
+
.groupBy('OrderInventory.release_good_id')
|
|
60
|
+
.having('COUNT(*) > 0')
|
|
61
|
+
.getQuery()
|
|
62
|
+
return 'NOT EXISTS ' + subQuery
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
worksheet = await worksheetQb.getRawOne();
|
|
66
|
+
|
|
67
|
+
if (!worksheet) throw new Error('no suitable worksheet found')
|
|
68
|
+
await getRepository(Worksheet).update({ id: worksheet.id }, { assignee: assignee })
|
|
69
|
+
}
|
|
64
70
|
|
|
65
|
-
|
|
71
|
+
if (worksheet.ws_status == WORKSHEET_STATUS.DEACTIVATED) await activatePicking(tx, domain, user, worksheet.ws_name)
|
|
66
72
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
73
|
+
const locationSortingRules: Setting = await tx.getRepository(Setting).findOne({
|
|
74
|
+
where: { domain, name: 'rule-for-picking-product' }
|
|
75
|
+
})
|
|
70
76
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
77
|
+
const sortingRule = JSON.parse(locationSortingRules.value)
|
|
78
|
+
const locationSortingRule = Object.keys(sortingRule).map(field => {
|
|
79
|
+
return { name: field, desc: sortingRule[field] === 'DESC' }
|
|
80
|
+
})
|
|
75
81
|
|
|
76
|
-
|
|
82
|
+
const releaseGood: ReleaseGood = await tx.getRepository(ReleaseGood).findOne(worksheet.release_good_id)
|
|
83
|
+
|
|
84
|
+
return await pickingWorksheet(domain, releaseGood.name, locationSortingRule, tx)
|
|
85
|
+
} catch (error) {
|
|
86
|
+
throw error
|
|
87
|
+
}
|
|
77
88
|
}
|
|
78
89
|
}
|
|
@@ -90,6 +90,7 @@ export async function pickingWorksheet(
|
|
|
90
90
|
startedAt: worksheet.startedAt,
|
|
91
91
|
refNo: releaseGood.refNo,
|
|
92
92
|
refNo2: releaseGood.refNo2,
|
|
93
|
+
refNo3: releaseGood.refNo3,
|
|
93
94
|
releaseGood
|
|
94
95
|
},
|
|
95
96
|
worksheetDetailInfos: worksheetDetails.map(async (pickingWSD: WorksheetDetail) => {
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import { Domain } from '@things-factory/shell'
|
|
2
1
|
import { getRepository } from 'typeorm'
|
|
2
|
+
|
|
3
3
|
import { Bizplace } from '@things-factory/biz-base'
|
|
4
|
-
import {
|
|
4
|
+
import { OrderInventory, ReturnOrder } from '@things-factory/sales-base'
|
|
5
|
+
import { Domain } from '@things-factory/shell'
|
|
5
6
|
import { Inventory } from '@things-factory/warehouse-base'
|
|
6
|
-
|
|
7
|
+
|
|
7
8
|
import { WORKSHEET_TYPE } from '../../../constants'
|
|
8
9
|
import { Worksheet, WorksheetDetail } from '../../../entities'
|
|
10
|
+
import { fetchExecutingWorksheet } from '../../../utils'
|
|
9
11
|
|
|
10
12
|
export const putawayReturningWorksheetResolver = {
|
|
11
13
|
async putawayReturningWorksheet(_: any, { returnOrderNo }, context: any) {
|
|
@@ -32,6 +34,7 @@ export const putawayReturningWorksheetResolver = {
|
|
|
32
34
|
[
|
|
33
35
|
'bizplace',
|
|
34
36
|
'returnOrder',
|
|
37
|
+
'bufferLocation',
|
|
35
38
|
'worksheetDetails',
|
|
36
39
|
'worksheetDetails.targetInventory',
|
|
37
40
|
'worksheetDetails.targetInventory.inventory',
|
|
@@ -49,7 +52,10 @@ export const putawayReturningWorksheetResolver = {
|
|
|
49
52
|
bizplaceName: returnOrder.bizplace.name,
|
|
50
53
|
partnerDomainId: customerBizplace?.domain.id,
|
|
51
54
|
customerCompanyDomainId: customerCompanyDomain.id,
|
|
55
|
+
bufferLocation: worksheet?.bufferLocation.name,
|
|
52
56
|
refNo: returnOrder.refNo,
|
|
57
|
+
refNo2: returnOrder.refNo2,
|
|
58
|
+
refNo3: returnOrder.refNo3,
|
|
53
59
|
startedAt: worksheet.startedAt
|
|
54
60
|
},
|
|
55
61
|
worksheetDetailInfos: worksheet.worksheetDetails.map(async (putawayWSD: WorksheetDetail) => {
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getRepository } from 'typeorm'
|
|
2
|
+
|
|
2
3
|
import { Bizplace } from '@things-factory/biz-base'
|
|
4
|
+
import { ArrivalNotice, OrderInventory } from '@things-factory/sales-base'
|
|
3
5
|
import { Domain } from '@things-factory/shell'
|
|
4
|
-
import { getRepository } from 'typeorm'
|
|
5
|
-
import { fetchExecutingWorksheet } from '../../../utils'
|
|
6
6
|
import { Inventory } from '@things-factory/warehouse-base'
|
|
7
|
+
|
|
7
8
|
import { WORKSHEET_TYPE } from '../../../constants'
|
|
8
9
|
import { Worksheet, WorksheetDetail } from '../../../entities'
|
|
10
|
+
import { fetchExecutingWorksheet } from '../../../utils'
|
|
9
11
|
|
|
10
12
|
export const putawayWorksheetResolver = {
|
|
11
13
|
async putawayWorksheet(_: any, { arrivalNoticeNo }, context: any) {
|
|
@@ -31,6 +33,7 @@ export const putawayWorksheetResolver = {
|
|
|
31
33
|
[
|
|
32
34
|
'bizplace',
|
|
33
35
|
'arrivalNotice',
|
|
36
|
+
'bufferLocation',
|
|
34
37
|
'worksheetDetails',
|
|
35
38
|
'worksheetDetails.targetInventory',
|
|
36
39
|
'worksheetDetails.targetInventory.inventory',
|
|
@@ -48,7 +51,10 @@ export const putawayWorksheetResolver = {
|
|
|
48
51
|
bizplaceName: customerBizplace.name,
|
|
49
52
|
partnerDomainId: customerBizplace?.domain.id,
|
|
50
53
|
customerCompanyDomainId: customerCompanyDomain.id,
|
|
54
|
+
bufferLocation: worksheet?.bufferLocation.name,
|
|
51
55
|
refNo: arrivalNotice.refNo,
|
|
56
|
+
refNo2: arrivalNotice.refNo2,
|
|
57
|
+
refNo3: arrivalNotice.refNo3,
|
|
52
58
|
startedAt: worksheet.startedAt
|
|
53
59
|
},
|
|
54
60
|
worksheetDetailInfos: worksheet.worksheetDetails.map(async (putawayWSD: WorksheetDetail) => {
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import { Domain } from '@things-factory/shell'
|
|
2
1
|
import { getRepository } from 'typeorm'
|
|
3
|
-
|
|
4
|
-
import { Inventory } from '@things-factory/warehouse-base'
|
|
2
|
+
|
|
5
3
|
import { OrderInventory, ReleaseGood } from '@things-factory/sales-base'
|
|
4
|
+
import { Domain } from '@things-factory/shell'
|
|
5
|
+
import { Inventory } from '@things-factory/warehouse-base'
|
|
6
|
+
|
|
6
7
|
import { WORKSHEET_TYPE } from '../../../constants'
|
|
7
8
|
import { Worksheet, WorksheetDetail } from '../../../entities'
|
|
9
|
+
import { fetchExecutingWorksheet } from '../../../utils'
|
|
8
10
|
|
|
9
11
|
export const returnWorksheetResolver = {
|
|
10
12
|
async returnWorksheet(_: any, { releaseGoodNo }, context: any) {
|
|
@@ -41,6 +43,8 @@ export const returnWorksheetResolver = {
|
|
|
41
43
|
partnerDomainId: worksheet?.bizplace.domain.id,
|
|
42
44
|
customerCompanyDomainId: customerCompanyDomain.id,
|
|
43
45
|
refNo: releaseGood.refNo,
|
|
46
|
+
refNo2: releaseGood.refNo2,
|
|
47
|
+
refNo3: releaseGood.refNo3,
|
|
44
48
|
startedAt: worksheet.startedAt
|
|
45
49
|
},
|
|
46
50
|
worksheetDetailInfos: worksheet.worksheetDetails.map((returnWSD: WorksheetDetail) => {
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import { OrderInventory, ORDER_STATUS, ORDER_INVENTORY_STATUS, ReleaseGood } from '@things-factory/sales-base'
|
|
2
|
-
import { Domain } from '@things-factory/shell'
|
|
3
1
|
import { getRepository, SelectQueryBuilder } from 'typeorm'
|
|
2
|
+
|
|
3
|
+
import { ORDER_INVENTORY_STATUS, ORDER_STATUS, OrderInventory, ReleaseGood } from '@things-factory/sales-base'
|
|
4
|
+
import { Domain } from '@things-factory/shell'
|
|
5
|
+
|
|
4
6
|
import { WORKSHEET_TYPE } from '../../../constants'
|
|
5
7
|
import { fetchExecutingBatchWorksheet } from '../../../utils'
|
|
6
8
|
|
|
@@ -55,6 +57,7 @@ export const sortingWorksheetResolver = {
|
|
|
55
57
|
startedAt: worksheet.startedAt,
|
|
56
58
|
refNo: releaseGood.refNo,
|
|
57
59
|
refNo2: releaseGood.refNo2,
|
|
60
|
+
refNo3: releaseGood.refNo3,
|
|
58
61
|
releaseGood
|
|
59
62
|
},
|
|
60
63
|
worksheetDetailInfos: items.map((item: any) => {
|
|
@@ -1,18 +1,16 @@
|
|
|
1
1
|
import { activateUnloadingResolver } from './activate-unloading'
|
|
2
|
-
import { unloadResolver } from './unload'
|
|
3
|
-
import { scanProductUnloadResolver } from './scan-product-unload'
|
|
4
|
-
import { undoUnloadingResolver } from './undo-unloading'
|
|
5
|
-
import { undoProductScanUnloadResolver } from './undo-product-scan-unload'
|
|
6
2
|
import { completeProductScanUnloadResolver } from './complete-product-scan-unload'
|
|
7
3
|
import { completeUnloadingResolver } from './complete-unloading'
|
|
8
4
|
import { completeUnloadingPartiallyResolver } from './complete-unloading-partially'
|
|
5
|
+
import { scanProductUnloadResolver } from './scan-product-unload'
|
|
6
|
+
import { undoUnloadingResolver } from './undo-unloading'
|
|
7
|
+
import { unloadResolver } from './unload'
|
|
9
8
|
|
|
10
9
|
export const Mutations = {
|
|
11
10
|
...activateUnloadingResolver,
|
|
12
11
|
...scanProductUnloadResolver,
|
|
13
12
|
...unloadResolver,
|
|
14
13
|
...undoUnloadingResolver,
|
|
15
|
-
...undoProductScanUnloadResolver,
|
|
16
14
|
...completeProductScanUnloadResolver,
|
|
17
15
|
...completeUnloadingResolver,
|
|
18
16
|
...completeUnloadingPartiallyResolver
|
|
@@ -1,12 +1,14 @@
|
|
|
1
|
+
import { EntityManager } from 'typeorm'
|
|
2
|
+
|
|
1
3
|
import { User } from '@things-factory/auth-base'
|
|
2
4
|
import { Domain } from '@things-factory/shell'
|
|
3
|
-
|
|
5
|
+
|
|
4
6
|
import { UnloadingWorksheetController } from '../../../../controllers'
|
|
5
7
|
|
|
6
8
|
export const undoUnloadingResolver = {
|
|
7
|
-
async undoUnloading(_: any, {
|
|
9
|
+
async undoUnloading(_: any, { orderType, orderNo, inventoryIds }, context: any) {
|
|
8
10
|
const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
|
|
9
|
-
await undoUnloading(tx, domain, user,
|
|
11
|
+
await undoUnloading(tx, domain, user, orderType, orderNo, inventoryIds)
|
|
10
12
|
}
|
|
11
13
|
}
|
|
12
14
|
|
|
@@ -14,9 +16,10 @@ async function undoUnloading(
|
|
|
14
16
|
tx: EntityManager,
|
|
15
17
|
domain: Domain,
|
|
16
18
|
user: User,
|
|
17
|
-
|
|
18
|
-
|
|
19
|
+
orderType: string,
|
|
20
|
+
orderNo: string,
|
|
21
|
+
inventoryIds: [string]
|
|
19
22
|
): Promise<void> {
|
|
20
23
|
const worksheetController: UnloadingWorksheetController = new UnloadingWorksheetController(tx, domain, user)
|
|
21
|
-
await worksheetController.undoUnload(
|
|
24
|
+
await worksheetController.undoUnload(orderType, orderNo, inventoryIds)
|
|
22
25
|
}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getRepository } from 'typeorm'
|
|
2
|
+
|
|
2
3
|
import { Bizplace } from '@things-factory/biz-base'
|
|
4
|
+
import { ArrivalNotice, OrderProduct } from '@things-factory/sales-base'
|
|
3
5
|
import { Domain } from '@things-factory/shell'
|
|
4
|
-
|
|
5
|
-
import { fetchExecutingWorksheet } from '../../../utils'
|
|
6
|
+
|
|
6
7
|
import { WORKSHEET_TYPE } from '../../../constants'
|
|
7
8
|
import { Worksheet, WorksheetDetail } from '../../../entities'
|
|
9
|
+
import { fetchExecutingWorksheet } from '../../../utils'
|
|
8
10
|
|
|
9
11
|
export const unloadingWorksheetResolver = {
|
|
10
12
|
async unloadingWorksheet(_: any, { arrivalNoticeNo }, context: any) {
|
|
@@ -64,6 +66,8 @@ export const unloadingWorksheetResolver = {
|
|
|
64
66
|
bufferLocation: worksheet.bufferLocation.name,
|
|
65
67
|
startedAt: worksheet.startedAt,
|
|
66
68
|
refNo: arrivalNotice.refNo,
|
|
69
|
+
refNo2: arrivalNotice?.refNo2,
|
|
70
|
+
refNo3: arrivalNotice?.refNo3,
|
|
67
71
|
looseItem: arrivalNotice.looseItem,
|
|
68
72
|
orderVas: vasWorksheet ? vasWorksheet.worksheetDetails : null
|
|
69
73
|
},
|
|
@@ -18,7 +18,8 @@ interface WorksheetInterface extends Worksheet {
|
|
|
18
18
|
export const worksheetResolver = {
|
|
19
19
|
async worksheet(_: any, { name }, context: any) {
|
|
20
20
|
const { domain }: { domain: Domain } = context.state
|
|
21
|
-
|
|
21
|
+
let worksheet: WorksheetInterface
|
|
22
|
+
worksheet = (await getRepository(Worksheet).findOne({
|
|
22
23
|
where: {
|
|
23
24
|
domain,
|
|
24
25
|
name
|
|
@@ -60,6 +61,33 @@ export const worksheetResolver = {
|
|
|
60
61
|
]
|
|
61
62
|
})) as WorksheetInterface
|
|
62
63
|
|
|
64
|
+
if (!worksheet) {
|
|
65
|
+
worksheet = (await getRepository(Worksheet).findOne({
|
|
66
|
+
where: {
|
|
67
|
+
domain,
|
|
68
|
+
arrivalNotice: name
|
|
69
|
+
},
|
|
70
|
+
relations: [
|
|
71
|
+
'domain',
|
|
72
|
+
'bizplace',
|
|
73
|
+
'bizplace.domain',
|
|
74
|
+
'worksheetDetails',
|
|
75
|
+
'worksheetDetails.targetProduct',
|
|
76
|
+
'worksheetDetails.targetProduct.product',
|
|
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
|
+
]
|
|
88
|
+
})) as WorksheetInterface
|
|
89
|
+
}
|
|
90
|
+
|
|
63
91
|
let pWorksheetPickingItemSorting = getRepository(Setting).findOne({
|
|
64
92
|
where: { domain, category: 'location', name: 'rule-for-worksheet-release-goods-item' }
|
|
65
93
|
})
|