@things-factory/worksheet-base 4.0.11 → 4.0.16
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/template.js +1 -0
- package/dist-server/constants/template.js.map +1 -1
- package/dist-server/controllers/ecommerce/sellercraft-controller.js +3 -3
- package/dist-server/controllers/ecommerce/sellercraft-controller.js.map +1 -1
- package/dist-server/controllers/inbound/putaway-worksheet-controller.js +24 -5
- package/dist-server/controllers/inbound/putaway-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/inbound/unloading-worksheet-controller.js +67 -28
- package/dist-server/controllers/inbound/unloading-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/index.js +1 -0
- package/dist-server/controllers/index.js.map +1 -1
- package/dist-server/controllers/outbound/loading-worksheet-controller.js +4 -0
- package/dist-server/controllers/outbound/loading-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/packing-worksheet-controller.js +1 -3
- package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/picking-worksheet-controller.js +159 -116
- package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/render-elccl-grn.js +6 -6
- package/dist-server/controllers/render-elccl-grn.js.map +1 -1
- package/dist-server/controllers/render-manifest.js +64 -0
- package/dist-server/controllers/render-manifest.js.map +1 -0
- package/dist-server/controllers/worksheet-controller.js +28 -2
- package/dist-server/controllers/worksheet-controller.js.map +1 -1
- package/dist-server/graphql/resolvers/pallet/index.js +2 -1
- package/dist-server/graphql/resolvers/pallet/index.js.map +1 -1
- package/dist-server/graphql/resolvers/pallet/pallet-outbound.js +1 -1
- package/dist-server/graphql/resolvers/pallet/pallet-outbound.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js +6 -5
- package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/loading-worksheet.js +23 -2
- package/dist-server/graphql/resolvers/worksheet/loading-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +22 -0
- package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/pending-cancellation-release-order.js +6 -3
- package/dist-server/graphql/resolvers/worksheet/pending-cancellation-release-order.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/activate-picking.js +0 -4
- package/dist-server/graphql/resolvers/worksheet/picking/activate-picking.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +30 -5
- 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 +72 -0
- package/dist-server/graphql/resolvers/worksheet/picking/fetch-and-assign-picking-task.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/picking/index.js +2 -1
- package/dist-server/graphql/resolvers/worksheet/picking/index.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/picking.js +4 -4
- package/dist-server/graphql/resolvers/worksheet/picking/picking.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/scan-product-picking.js +4 -4
- package/dist-server/graphql/resolvers/worksheet/picking/scan-product-picking.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js +86 -57
- package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/recommend-putway-location.js +40 -7
- package/dist-server/graphql/resolvers/worksheet/recommend-putway-location.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js +6 -1
- package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/unloading-return-worksheet.js +2 -2
- package/dist-server/graphql/resolvers/worksheet/unloading-return-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet-detail/generate-release-good-worksheet-details.js +48 -44
- package/dist-server/graphql/resolvers/worksheet-detail/generate-release-good-worksheet-details.js.map +1 -1
- package/dist-server/graphql/types/index.js +9 -4
- package/dist-server/graphql/types/index.js.map +1 -1
- package/dist-server/graphql/types/pallet/index.js +6 -3
- package/dist-server/graphql/types/pallet/index.js.map +1 -1
- package/dist-server/graphql/types/pallet/pallet.js +10 -0
- package/dist-server/graphql/types/pallet/pallet.js.map +1 -0
- package/dist-server/graphql/types/worksheet/index.js +7 -1
- package/dist-server/graphql/types/worksheet/index.js.map +1 -1
- package/dist-server/index.js +1 -0
- package/dist-server/index.js.map +1 -1
- package/dist-server/routes.js +4 -0
- package/dist-server/routes.js.map +1 -1
- package/dist-server/utils/inventory-util.js +50 -5
- package/dist-server/utils/inventory-util.js.map +1 -1
- package/package.json +16 -16
- package/server/constants/template.ts +1 -0
- package/server/controllers/ecommerce/sellercraft-controller.ts +3 -3
- package/server/controllers/inbound/putaway-worksheet-controller.ts +29 -8
- package/server/controllers/inbound/unloading-worksheet-controller.ts +83 -29
- package/server/controllers/index.ts +1 -0
- package/server/controllers/outbound/loading-worksheet-controller.ts +20 -0
- package/server/controllers/outbound/packing-worksheet-controller.ts +3 -5
- package/server/controllers/outbound/picking-worksheet-controller.ts +206 -154
- package/server/controllers/render-elccl-grn.ts +8 -6
- package/server/controllers/render-manifest.ts +68 -0
- package/server/controllers/worksheet-controller.ts +41 -2
- package/server/graphql/resolvers/pallet/index.ts +2 -0
- package/server/graphql/resolvers/pallet/pallet-outbound.ts +1 -2
- package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +10 -8
- package/server/graphql/resolvers/worksheet/loading-worksheet.ts +30 -4
- package/server/graphql/resolvers/worksheet/packing-worksheet.ts +28 -3
- package/server/graphql/resolvers/worksheet/pending-cancellation-release-order.ts +13 -7
- package/server/graphql/resolvers/worksheet/picking/activate-picking.ts +1 -6
- package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +35 -4
- package/server/graphql/resolvers/worksheet/picking/fetch-and-assign-picking-task.ts +78 -0
- package/server/graphql/resolvers/worksheet/picking/index.ts +3 -1
- package/server/graphql/resolvers/worksheet/picking/picking.ts +6 -4
- package/server/graphql/resolvers/worksheet/picking/scan-product-picking.ts +7 -4
- package/server/graphql/resolvers/worksheet/picking-worksheet.ts +102 -62
- package/server/graphql/resolvers/worksheet/recommend-putway-location.ts +56 -6
- package/server/graphql/resolvers/worksheet/unloaded-inventories.ts +10 -1
- package/server/graphql/resolvers/worksheet/unloading-return-worksheet.ts +6 -4
- package/server/graphql/resolvers/worksheet-detail/generate-release-good-worksheet-details.ts +102 -76
- package/server/graphql/types/index.ts +9 -4
- package/server/graphql/types/pallet/index.ts +8 -2
- package/server/graphql/types/pallet/pallet.ts +7 -0
- package/server/graphql/types/worksheet/index.ts +8 -2
- package/server/index.ts +1 -0
- package/server/routes.ts +5 -0
- package/server/utils/inventory-util.ts +53 -9
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Equal, getRepository, In, Not, SelectQueryBuilder } from 'typeorm'
|
|
2
|
+
|
|
3
|
+
import { ORDER_STATUS, ORDER_INVENTORY_STATUS, OrderInventory, ReleaseGood } from '@things-factory/sales-base'
|
|
2
4
|
import { Domain } from '@things-factory/shell'
|
|
3
|
-
import { Inventory } from '@things-factory/warehouse-base'
|
|
4
|
-
|
|
5
|
+
import { Inventory, Location } from '@things-factory/warehouse-base'
|
|
6
|
+
|
|
5
7
|
import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../../constants'
|
|
6
8
|
import { Worksheet, WorksheetDetail } from '../../../entities'
|
|
7
9
|
import { fetchExecutingWorksheet } from '../../../utils'
|
|
@@ -9,11 +11,34 @@ import { fetchExecutingWorksheet } from '../../../utils'
|
|
|
9
11
|
export const loadingWorksheetResolver = {
|
|
10
12
|
async loadingWorksheet(_: any, { releaseGoodNo }, context: any) {
|
|
11
13
|
const { domain }: { domain: Domain } = context.state
|
|
12
|
-
|
|
14
|
+
let releaseGood: ReleaseGood = await getRepository(ReleaseGood).findOne({
|
|
13
15
|
where: { domain, name: releaseGoodNo /*status: ORDER_STATUS.LOADING*/ },
|
|
14
16
|
relations: ['bizplace']
|
|
15
17
|
})
|
|
16
18
|
|
|
19
|
+
// Find Release Order based on Bin
|
|
20
|
+
if (!releaseGood) {
|
|
21
|
+
const binLocation: Location = await getRepository(Location).findOne({
|
|
22
|
+
where: { domain, name: releaseGoodNo }
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
const qb: SelectQueryBuilder<OrderInventory> = getRepository(OrderInventory).createQueryBuilder('orderInventory')
|
|
26
|
+
qb.innerJoinAndSelect('orderInventory.releaseGood', 'releaseGood')
|
|
27
|
+
.innerJoinAndSelect('releaseGood.bizplace', 'bizplace')
|
|
28
|
+
.innerJoinAndSelect('bizplace.domain', 'domain')
|
|
29
|
+
.where('orderInventory.domain_id = :domainId', { domainId: domain.id })
|
|
30
|
+
.andWhere('orderInventory.status IN (:...orderInventoryStatus)', { orderInventoryStatus: [ORDER_INVENTORY_STATUS.LOADING, ORDER_INVENTORY_STATUS.LOADED] })
|
|
31
|
+
.andWhere('orderInventory.bin_location_id = :locationId', { locationId: binLocation.id })
|
|
32
|
+
.andWhere('releaseGood.status = :status', { status: ORDER_STATUS.LOADING })
|
|
33
|
+
|
|
34
|
+
const orderInventoryByBin = await qb.getOne()
|
|
35
|
+
|
|
36
|
+
if (orderInventoryByBin?.releaseGood) {
|
|
37
|
+
releaseGoodNo = orderInventoryByBin.releaseGood.name
|
|
38
|
+
releaseGood = orderInventoryByBin.releaseGood
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
17
42
|
if (!releaseGood) throw new Error(`Release good doesn't exists.`)
|
|
18
43
|
|
|
19
44
|
const foundWorksheet: Worksheet = await fetchExecutingWorksheet(
|
|
@@ -40,6 +65,7 @@ export const loadingWorksheetResolver = {
|
|
|
40
65
|
|
|
41
66
|
return {
|
|
42
67
|
worksheetInfo: {
|
|
68
|
+
releaseGood,
|
|
43
69
|
bizplaceName: releaseGood.bizplace.name,
|
|
44
70
|
startedAt: foundWorksheet.startedAt,
|
|
45
71
|
refNo: releaseGood.refNo,
|
|
@@ -1,16 +1,17 @@
|
|
|
1
|
-
import { EntityManager } from 'typeorm'
|
|
1
|
+
import { EntityManager, In, 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 { OrderInventory, ReleaseGood } from '@things-factory/sales-base'
|
|
6
|
+
import { ORDER_INVENTORY_STATUS, OrderInventory, ReleaseGood } from '@things-factory/sales-base'
|
|
7
7
|
import { Domain } from '@things-factory/shell'
|
|
8
|
-
import { Inventory } from '@things-factory/warehouse-base'
|
|
8
|
+
import { Inventory, Location } from '@things-factory/warehouse-base'
|
|
9
9
|
|
|
10
10
|
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'
|
|
14
15
|
|
|
15
16
|
export const packingWorksheetResolver = {
|
|
16
17
|
async packingWorksheet(_: any, { releaseGoodNo }, context: any) {
|
|
@@ -23,7 +24,30 @@ export const packingWorksheetResolver = {
|
|
|
23
24
|
relations: ['bizplace', 'bizplace.domain']
|
|
24
25
|
})
|
|
25
26
|
|
|
27
|
+
// Find Release Order based on Bin
|
|
28
|
+
if (!releaseGood) {
|
|
29
|
+
const binLocation: Location = await tx.getRepository(Location).findOne({
|
|
30
|
+
where: { domain, name: releaseGoodNo }
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
const qb: SelectQueryBuilder<OrderInventory> = tx.getRepository(OrderInventory).createQueryBuilder('orderInventory')
|
|
34
|
+
qb.innerJoinAndSelect('orderInventory.releaseGood', 'releaseGood')
|
|
35
|
+
.innerJoinAndSelect('releaseGood.bizplace', 'bizplace')
|
|
36
|
+
.innerJoinAndSelect('bizplace.domain', 'domain')
|
|
37
|
+
.where('orderInventory.domain_id = :domainId', { domainId: domain.id })
|
|
38
|
+
.andWhere('orderInventory.status IN (:...orderInventoryStatus)', { orderInventoryStatus: [ORDER_INVENTORY_STATUS.PACKING, ORDER_INVENTORY_STATUS.PACKED] })
|
|
39
|
+
.andWhere('orderInventory.bin_location_id = :locationId', { locationId: binLocation.id })
|
|
40
|
+
.andWhere('releaseGood.status = :status', { status: ORDER_STATUS.PACKING })
|
|
41
|
+
|
|
42
|
+
const orderInventoryByBin = await qb.getOne()
|
|
43
|
+
if (orderInventoryByBin?.releaseGood) {
|
|
44
|
+
releaseGoodNo = orderInventoryByBin.releaseGood.name
|
|
45
|
+
releaseGood = orderInventoryByBin.releaseGood
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
26
49
|
if (!releaseGood) throw new Error(`Release good dosen't exist.`)
|
|
50
|
+
|
|
27
51
|
const worksheet: Worksheet = await fetchExecutingWorksheet(
|
|
28
52
|
domain,
|
|
29
53
|
releaseGood.bizplace,
|
|
@@ -110,6 +134,7 @@ export const packingWorksheetResolver = {
|
|
|
110
134
|
|
|
111
135
|
return {
|
|
112
136
|
worksheetInfo: {
|
|
137
|
+
releaseGood,
|
|
113
138
|
bizplaceName: releaseGood.bizplace.name,
|
|
114
139
|
refNo: releaseGood.refNo,
|
|
115
140
|
refNo2: releaseGood.refNo2,
|
|
@@ -1,18 +1,19 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
import {
|
|
1
|
+
import { EntityManager, In } from 'typeorm'
|
|
2
|
+
|
|
3
|
+
import { Role, User } from '@things-factory/auth-base'
|
|
4
4
|
import { Bizplace } from '@things-factory/biz-base'
|
|
5
5
|
import { sendNotification } from '@things-factory/notification'
|
|
6
|
-
import { EntityManager, In } from 'typeorm'
|
|
7
6
|
import {
|
|
7
|
+
DeliveryOrder,
|
|
8
8
|
ORDER_INVENTORY_STATUS,
|
|
9
9
|
ORDER_STATUS,
|
|
10
10
|
ORDER_VAS_STATUS,
|
|
11
11
|
OrderInventory,
|
|
12
|
-
DeliveryOrder,
|
|
13
12
|
OrderVas,
|
|
14
13
|
ReleaseGood
|
|
15
14
|
} from '@things-factory/sales-base'
|
|
15
|
+
import { Domain } from '@things-factory/shell'
|
|
16
|
+
|
|
16
17
|
import { Worksheet, WorksheetDetail } from '../../../entities'
|
|
17
18
|
|
|
18
19
|
export const pendingCancellationReleaseOrder = {
|
|
@@ -46,13 +47,18 @@ export const pendingCancellationReleaseOrder = {
|
|
|
46
47
|
}
|
|
47
48
|
})
|
|
48
49
|
await tx.getRepository(OrderInventory).save(pickedOIs)
|
|
49
|
-
} else if (
|
|
50
|
+
} else if (
|
|
51
|
+
foundRO.status === ORDER_STATUS.PICKING ||
|
|
52
|
+
foundRO.status === ORDER_STATUS.READY_TO_PICK ||
|
|
53
|
+
foundRO.status === ORDER_STATUS.PENDING_WORKSHEET
|
|
54
|
+
) {
|
|
50
55
|
pickingOIs = targetOIs
|
|
51
56
|
.filter(
|
|
52
57
|
(oi: OrderInventory) =>
|
|
53
58
|
oi.status === ORDER_INVENTORY_STATUS.PICKING ||
|
|
54
59
|
oi.status === ORDER_INVENTORY_STATUS.READY_TO_PICK ||
|
|
55
|
-
oi.status === ORDER_INVENTORY_STATUS.PENDING_SPLIT
|
|
60
|
+
oi.status === ORDER_INVENTORY_STATUS.PENDING_SPLIT ||
|
|
61
|
+
oi.status === ORDER_INVENTORY_STATUS.PENDING_WORKSHEET
|
|
56
62
|
)
|
|
57
63
|
.map((targetOI: OrderInventory) => {
|
|
58
64
|
return {
|
|
@@ -7,7 +7,7 @@ import { MarketplaceOrder } from '@things-factory/marketplace-base'
|
|
|
7
7
|
import { ORDER_STATUS, ReleaseGood } from '@things-factory/sales-base'
|
|
8
8
|
import { Domain } from '@things-factory/shell'
|
|
9
9
|
|
|
10
|
-
import { EcommerceController, PickingWorksheetController
|
|
10
|
+
import { EcommerceController, PickingWorksheetController } from '../../../../controllers'
|
|
11
11
|
import { Worksheet } from '../../../../entities'
|
|
12
12
|
|
|
13
13
|
export const activatePickingResolver = {
|
|
@@ -40,11 +40,6 @@ export async function activatePicking(
|
|
|
40
40
|
.getRepository(Sellercraft)
|
|
41
41
|
.findOne({ domain: worksheet.bizplace.domain, status: SellercraftStatus.ACTIVE })
|
|
42
42
|
|
|
43
|
-
if (sellercraft) {
|
|
44
|
-
const sellercraftCtrl: SellercraftController = new SellercraftController(tx, domain, user)
|
|
45
|
-
await sellercraftCtrl.initiateOrderShipment(sellercraft, releaseGood)
|
|
46
|
-
}
|
|
47
|
-
|
|
48
43
|
if (marketplaceStores?.length && !sellercraft) {
|
|
49
44
|
if (marketplaceStores.some(store => store.isAutoUpdateStockQty)) {
|
|
50
45
|
const worksheetDetails = worksheet.worksheetDetails
|
|
@@ -7,6 +7,7 @@ import { MarketplaceStore, MarketplaceTransporter } from '@things-factory/integr
|
|
|
7
7
|
import { Sellercraft, SellercraftStatus } from '@things-factory/integration-sellercraft'
|
|
8
8
|
import { MarketplaceOrder, MarketplaceOrderItem, MarketplaceOrderShipping } from '@things-factory/marketplace-base'
|
|
9
9
|
import { ORDER_INVENTORY_STATUS, ORDER_STATUS, OrderInventory, ReleaseGood } from '@things-factory/sales-base'
|
|
10
|
+
import { PartnerSetting, Setting } from '@things-factory/setting-base'
|
|
10
11
|
import { Domain } from '@things-factory/shell'
|
|
11
12
|
|
|
12
13
|
import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../../../constants'
|
|
@@ -83,6 +84,7 @@ export async function completePicking(
|
|
|
83
84
|
|
|
84
85
|
if (sellercraft) {
|
|
85
86
|
const sellercraftCtrl: SellercraftController = new SellercraftController(tx, domain, user)
|
|
87
|
+
await sellercraftCtrl.initiateOrderShipment(sellercraft, releaseGood)
|
|
86
88
|
await sellercraftCtrl.initiateOrderDocument(sellercraft, releaseGood)
|
|
87
89
|
} else {
|
|
88
90
|
const companyDomain: Domain = releaseGood.bizplace.company.domain
|
|
@@ -187,10 +189,29 @@ export async function completePicking(
|
|
|
187
189
|
|
|
188
190
|
if (releaseGood.packingOption) {
|
|
189
191
|
const packingWSCtrl: PackingWorksheetController = new PackingWorksheetController(tx, domain, user)
|
|
190
|
-
|
|
192
|
+
|
|
193
|
+
const directActivatePackingWorksheet: Setting = await tx.getRepository(Setting).findOne({
|
|
194
|
+
where: { domain: domain, category: 'id-rule', name: 'enable-direct-activate-packing-worksheet' }
|
|
195
|
+
})
|
|
196
|
+
const partnerDirectActivatePackingWorksheetSetting: PartnerSetting = await tx
|
|
197
|
+
.getRepository(PartnerSetting)
|
|
198
|
+
.findOne({
|
|
199
|
+
where: { setting: directActivatePackingWorksheet, domain: domain, partnerDomain: releaseGood.bizplace?.domain }
|
|
200
|
+
})
|
|
201
|
+
|
|
202
|
+
let packingWorksheet: Worksheet = await packingWSCtrl.generatePackingWorksheet(releaseGoodNo)
|
|
203
|
+
|
|
204
|
+
if (directActivatePackingWorksheet != undefined && directActivatePackingWorksheet.value.toLowerCase() == 'true') {
|
|
205
|
+
if (partnerDirectActivatePackingWorksheetSetting != undefined) {
|
|
206
|
+
if (partnerDirectActivatePackingWorksheetSetting.value.toLowerCase() == 'true')
|
|
207
|
+
await packingWSCtrl.activatePacking(packingWorksheet.name)
|
|
208
|
+
} else {
|
|
209
|
+
await packingWSCtrl.activatePacking(packingWorksheet.name)
|
|
210
|
+
}
|
|
211
|
+
}
|
|
191
212
|
} else {
|
|
192
213
|
// Find Existing Loading Worksheet if any
|
|
193
|
-
|
|
214
|
+
let existLoadingWorksheet: Worksheet = await tx.getRepository(Worksheet).findOne({
|
|
194
215
|
where: {
|
|
195
216
|
releaseGood,
|
|
196
217
|
type: WORKSHEET_TYPE.LOADING,
|
|
@@ -212,9 +233,19 @@ export async function completePicking(
|
|
|
212
233
|
const loadingWorksheetDetails: WorksheetDetail[] = loadingWorksheet.worksheetDetails
|
|
213
234
|
await loadingWSCtrl.activateLoading(loadingWorksheet.name, loadingWorksheetDetails)
|
|
214
235
|
} else {
|
|
215
|
-
|
|
216
|
-
|
|
236
|
+
const loadingWSCtrl: LoadingWorksheetController = new LoadingWorksheetController(tx, domain, user)
|
|
237
|
+
let loadingWorksheet: Worksheet = await loadingWSCtrl.updateLoadingWorksheet(
|
|
238
|
+
releaseGoodNo,
|
|
239
|
+
pickedTargetInventories,
|
|
240
|
+
existLoadingWorksheet
|
|
217
241
|
)
|
|
242
|
+
|
|
243
|
+
if (!loadingWorksheet.worksheetDetails?.length) {
|
|
244
|
+
loadingWorksheet = await pickingWSCtrl.findWorksheetById(loadingWorksheet.id)
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
const loadingWorksheetDetails: WorksheetDetail[] = loadingWorksheet.worksheetDetails
|
|
248
|
+
await loadingWSCtrl.activateLoading(loadingWorksheet.name, loadingWorksheetDetails)
|
|
218
249
|
}
|
|
219
250
|
}
|
|
220
251
|
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { EntityManager, getRepository } from 'typeorm'
|
|
2
|
+
|
|
3
|
+
import { User } from '@things-factory/auth-base'
|
|
4
|
+
import { Setting } from '@things-factory/setting-base'
|
|
5
|
+
import { Domain } from '@things-factory/shell'
|
|
6
|
+
|
|
7
|
+
import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../../../constants'
|
|
8
|
+
import { Worksheet } from '../../../../entities'
|
|
9
|
+
import { pickingWorksheet } from '../picking-worksheet'
|
|
10
|
+
import { activatePicking } from './activate-picking'
|
|
11
|
+
|
|
12
|
+
export const fetchAndAssignPickingTaskResolver = {
|
|
13
|
+
async fetchAndAssignPickingTask(_: any, {}, context: any) {
|
|
14
|
+
const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
|
|
15
|
+
const assignee: User = await tx.getRepository(User).findOne(user.id, { relations: ['domains'] })
|
|
16
|
+
if ((assignee?.domains || []).every((userDomain: Domain) => userDomain.id !== domain.id))
|
|
17
|
+
throw new Error('Target user is not belong to current domain')
|
|
18
|
+
|
|
19
|
+
if (!assignee) throw new Error('failed to find target user')
|
|
20
|
+
|
|
21
|
+
let worksheet: Worksheet
|
|
22
|
+
worksheet = await tx.getRepository(Worksheet).findOne({
|
|
23
|
+
relations: ['releaseGood'],
|
|
24
|
+
where: [
|
|
25
|
+
{
|
|
26
|
+
domain,
|
|
27
|
+
type: WORKSHEET_TYPE.PICKING,
|
|
28
|
+
status: WORKSHEET_STATUS.EXECUTING,
|
|
29
|
+
assignee: assignee
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
domain,
|
|
33
|
+
type: WORKSHEET_TYPE.PICKING,
|
|
34
|
+
status: WORKSHEET_STATUS.DEACTIVATED,
|
|
35
|
+
assignee: assignee
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
order: {
|
|
39
|
+
name: 'ASC'
|
|
40
|
+
}
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
if (!worksheet) {
|
|
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
|
+
})
|
|
61
|
+
|
|
62
|
+
await getRepository(Worksheet).update({ id: worksheet.id }, { assignee: assignee })
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (worksheet.status == WORKSHEET_STATUS.DEACTIVATED) await activatePicking(tx, domain, user, worksheet.name)
|
|
66
|
+
|
|
67
|
+
const locationSortingRules: Setting = await tx.getRepository(Setting).findOne({
|
|
68
|
+
where: { domain, name: 'rule-for-picking-product' }
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
const sortingRule = JSON.parse(locationSortingRules.value)
|
|
72
|
+
const locationSortingRule = Object.keys(sortingRule).map(field => {
|
|
73
|
+
return { name: field, desc: sortingRule[field] === 'DESC' }
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
return await pickingWorksheet(domain, worksheet.releaseGood.name, locationSortingRule, tx)
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -2,6 +2,7 @@ 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'
|
|
5
6
|
import { batchPickingResolver } from './batch-picking'
|
|
6
7
|
import { completeBatchPickingResolver } from './complete-batch-picking'
|
|
7
8
|
import { completePickingResolver } from './complete-picking'
|
|
@@ -21,5 +22,6 @@ export const Mutations = {
|
|
|
21
22
|
...batchPickingResolver,
|
|
22
23
|
...completePickingResolver,
|
|
23
24
|
...completeBatchPickingResolver,
|
|
24
|
-
...assignPickingWorkerResolver
|
|
25
|
+
...assignPickingWorkerResolver,
|
|
26
|
+
...fetchAndAssignPickingTaskResolver
|
|
25
27
|
}
|
|
@@ -4,9 +4,9 @@ import { EntityManager } from 'typeorm'
|
|
|
4
4
|
import { PickingWorksheetController } from '../../../../controllers'
|
|
5
5
|
|
|
6
6
|
export const pickingResolver = {
|
|
7
|
-
async picking(_: any, { worksheetDetailName, worksheetType, palletId, locationName, releaseQty }, context: any) {
|
|
7
|
+
async picking(_: any, { worksheetDetailName, worksheetType, palletId, locationName, releaseQty, binLocation, serialNumber }, context: any) {
|
|
8
8
|
const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
|
|
9
|
-
await picking(tx, domain, user, worksheetDetailName, worksheetType, palletId, locationName, releaseQty)
|
|
9
|
+
await picking(tx, domain, user, worksheetDetailName, worksheetType, palletId, locationName, releaseQty, binLocation, serialNumber)
|
|
10
10
|
}
|
|
11
11
|
}
|
|
12
12
|
|
|
@@ -18,8 +18,10 @@ export async function picking(
|
|
|
18
18
|
worksheetType: string,
|
|
19
19
|
palletId: string,
|
|
20
20
|
locationName: string,
|
|
21
|
-
releaseQty: number
|
|
21
|
+
releaseQty: number,
|
|
22
|
+
binLocation?: string,
|
|
23
|
+
serialNumber?: string
|
|
22
24
|
) {
|
|
23
25
|
const worksheetController: PickingWorksheetController = new PickingWorksheetController(tx, domain, user)
|
|
24
|
-
await worksheetController.picking(worksheetDetailName, worksheetType, palletId, locationName, releaseQty)
|
|
26
|
+
await worksheetController.picking(worksheetDetailName, worksheetType, palletId, locationName, releaseQty, binLocation, serialNumber)
|
|
25
27
|
}
|
|
@@ -6,7 +6,7 @@ import { PickingWorksheetController } from '../../../../controllers'
|
|
|
6
6
|
export const scanProductPickingResolver = {
|
|
7
7
|
async scanProductPicking(
|
|
8
8
|
_: any,
|
|
9
|
-
{ worksheetDetailName, worksheetType, productBarcode, cartonId, binLocation },
|
|
9
|
+
{ worksheetDetailName, worksheetType, productBarcode, cartonId, binLocation, serialNumber },
|
|
10
10
|
context: any
|
|
11
11
|
) {
|
|
12
12
|
const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
|
|
@@ -18,7 +18,8 @@ export const scanProductPickingResolver = {
|
|
|
18
18
|
worksheetType,
|
|
19
19
|
productBarcode,
|
|
20
20
|
cartonId,
|
|
21
|
-
binLocation
|
|
21
|
+
binLocation,
|
|
22
|
+
serialNumber
|
|
22
23
|
)
|
|
23
24
|
}
|
|
24
25
|
}
|
|
@@ -31,7 +32,8 @@ export async function scanProductPicking(
|
|
|
31
32
|
worksheetType: string,
|
|
32
33
|
productBarcode: string,
|
|
33
34
|
cartonId: string,
|
|
34
|
-
binLocation?: string
|
|
35
|
+
binLocation?: string,
|
|
36
|
+
serialNumber?: string
|
|
35
37
|
) {
|
|
36
38
|
const worksheetController: PickingWorksheetController = new PickingWorksheetController(tx, domain, user)
|
|
37
39
|
await worksheetController.scanProductPicking(
|
|
@@ -39,6 +41,7 @@ export async function scanProductPicking(
|
|
|
39
41
|
worksheetType,
|
|
40
42
|
productBarcode,
|
|
41
43
|
cartonId,
|
|
42
|
-
binLocation
|
|
44
|
+
binLocation,
|
|
45
|
+
serialNumber
|
|
43
46
|
)
|
|
44
47
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { EntityManager, In, SelectQueryBuilder } from 'typeorm'
|
|
2
2
|
|
|
3
3
|
import { ORDER_INVENTORY_STATUS, OrderInventory, ReleaseGood } from '@things-factory/sales-base'
|
|
4
4
|
import { Domain } from '@things-factory/shell'
|
|
5
|
-
import { Inventory } from '@things-factory/warehouse-base'
|
|
5
|
+
import { Inventory, Location } from '@things-factory/warehouse-base'
|
|
6
6
|
|
|
7
7
|
import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../../constants'
|
|
8
8
|
import { WorksheetDetail } from '../../../entities'
|
|
@@ -10,71 +10,111 @@ import { fetchExecutingWorksheet } from '../../../utils'
|
|
|
10
10
|
|
|
11
11
|
export const pickingWorksheetResolver = {
|
|
12
12
|
async pickingWorksheet(_: any, { releaseGoodNo, locationSortingRules }, context: any) {
|
|
13
|
-
const { domain }: { domain: Domain } = context.state
|
|
14
|
-
const releaseGood: ReleaseGood = await getRepository(ReleaseGood).findOne({
|
|
15
|
-
where: { domain, name: releaseGoodNo /*status: ORDER_STATUS.PICKING*/ },
|
|
16
|
-
relations: ['bizplace', 'bizplace.domain']
|
|
17
|
-
})
|
|
18
|
-
if (!releaseGood) throw new Error(`Couldn't find picking worksheet by order no (${releaseGoodNo})`)
|
|
19
|
-
|
|
20
|
-
const worksheet = await fetchExecutingWorksheet(
|
|
21
|
-
domain,
|
|
22
|
-
releaseGood.bizplace,
|
|
23
|
-
['bizplace'],
|
|
24
|
-
WORKSHEET_TYPE.PICKING,
|
|
25
|
-
releaseGood
|
|
26
|
-
)
|
|
13
|
+
const { domain, tx }: { domain: Domain; tx: EntityManager } = context.state
|
|
27
14
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
.leftJoinAndSelect('T_INV.product', 'PROD')
|
|
32
|
-
.leftJoinAndSelect('INV.location', 'LOC')
|
|
15
|
+
return await pickingWorksheet(domain, releaseGoodNo, locationSortingRules, tx)
|
|
16
|
+
}
|
|
17
|
+
}
|
|
33
18
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
19
|
+
export async function pickingWorksheet(
|
|
20
|
+
domain: Domain,
|
|
21
|
+
releaseGoodNo: String,
|
|
22
|
+
locationSortingRules: any,
|
|
23
|
+
tx: EntityManager
|
|
24
|
+
) {
|
|
25
|
+
let releaseGood: ReleaseGood = await tx.getRepository(ReleaseGood).findOne({
|
|
26
|
+
where: { domain, name: releaseGoodNo /*status: ORDER_STATUS.PICKING*/ },
|
|
27
|
+
relations: ['bizplace', 'bizplace.domain']
|
|
28
|
+
})
|
|
39
29
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
30
|
+
// Find Release Order based on Bin
|
|
31
|
+
if (!releaseGood) {
|
|
32
|
+
const binLocation: Location = await tx.getRepository(Location).findOne({
|
|
33
|
+
where: { domain, name: releaseGoodNo }
|
|
34
|
+
})
|
|
45
35
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
36
|
+
const orderInventoryByBin: OrderInventory = await tx.getRepository(OrderInventory).findOne({
|
|
37
|
+
where: {
|
|
38
|
+
domain,
|
|
39
|
+
binLocation,
|
|
40
|
+
status: In([ORDER_INVENTORY_STATUS.PICKING, ORDER_INVENTORY_STATUS.PICKED])
|
|
41
|
+
},
|
|
42
|
+
order: {
|
|
43
|
+
createdAt: 'ASC'
|
|
54
44
|
},
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
cartonId: inventory?.cartonId,
|
|
62
|
-
batchId: inventory?.batchId,
|
|
63
|
-
batchIdRef: inventory?.batchIdRef,
|
|
64
|
-
product: inventory?.product,
|
|
65
|
-
qty: inventory?.qty,
|
|
66
|
-
releaseQty: targetInventory.releaseQty,
|
|
67
|
-
pickedQty: targetInventory.pickedQty,
|
|
68
|
-
status: pickingWSD.status,
|
|
69
|
-
description: pickingWSD.description,
|
|
70
|
-
targetName: targetInventory.name,
|
|
71
|
-
packingType: inventory?.packingType,
|
|
72
|
-
packingSize: inventory?.packingSize,
|
|
73
|
-
expirationDate: inventory?.expirationDate,
|
|
74
|
-
location: inventory?.location,
|
|
75
|
-
relatedOrderInv: targetInventory
|
|
76
|
-
}
|
|
77
|
-
})
|
|
45
|
+
relations: ['releaseGood', 'releaseGood.bizplace', 'releaseGood.bizplace.domain']
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
if (orderInventoryByBin?.releaseGood) {
|
|
49
|
+
releaseGoodNo = orderInventoryByBin.releaseGood.name
|
|
50
|
+
releaseGood = orderInventoryByBin.releaseGood
|
|
78
51
|
}
|
|
79
52
|
}
|
|
53
|
+
|
|
54
|
+
if (!releaseGood) throw new Error(`Couldn't find picking worksheet by order no (${releaseGoodNo})`)
|
|
55
|
+
|
|
56
|
+
const worksheet = await fetchExecutingWorksheet(
|
|
57
|
+
domain,
|
|
58
|
+
releaseGood.bizplace,
|
|
59
|
+
['bizplace'],
|
|
60
|
+
WORKSHEET_TYPE.PICKING,
|
|
61
|
+
releaseGood,
|
|
62
|
+
tx
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
const qb: SelectQueryBuilder<WorksheetDetail> = tx.createQueryBuilder(WorksheetDetail, 'WSD')
|
|
66
|
+
qb.leftJoinAndSelect('WSD.targetInventory', 'T_INV')
|
|
67
|
+
.leftJoinAndSelect('T_INV.binLocation', 'BIN_LOC')
|
|
68
|
+
.leftJoinAndSelect('T_INV.inventory', 'INV')
|
|
69
|
+
.leftJoinAndSelect('T_INV.product', 'PROD')
|
|
70
|
+
.leftJoinAndSelect('INV.location', 'LOC')
|
|
71
|
+
|
|
72
|
+
if (locationSortingRules?.length > 0) {
|
|
73
|
+
locationSortingRules.forEach((rule: { name: string; desc: boolean }) => {
|
|
74
|
+
qb.addOrderBy(`LOC.${rule.name}`, rule.desc ? 'DESC' : 'ASC')
|
|
75
|
+
})
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
qb.addOrderBy(`PROD.name`, 'ASC')
|
|
79
|
+
|
|
80
|
+
const worksheetDetails: WorksheetDetail[] = await qb
|
|
81
|
+
.where('"WSD"."worksheet_id" = :worksheetId', { worksheetId: worksheet.id })
|
|
82
|
+
.andWhere('"WSD"."status" != :status', { status: WORKSHEET_STATUS.REPLACED })
|
|
83
|
+
.andWhere('"T_INV"."status" != :t_invstatus', { t_invstatus: ORDER_INVENTORY_STATUS.CANCELLED })
|
|
84
|
+
.getMany()
|
|
85
|
+
|
|
86
|
+
return {
|
|
87
|
+
worksheetInfo: {
|
|
88
|
+
bizplaceName: releaseGood.bizplace.name,
|
|
89
|
+
partnerDomainId: releaseGood.bizplace?.domain.id,
|
|
90
|
+
startedAt: worksheet.startedAt,
|
|
91
|
+
refNo: releaseGood.refNo,
|
|
92
|
+
refNo2: releaseGood.refNo2,
|
|
93
|
+
releaseGood
|
|
94
|
+
},
|
|
95
|
+
worksheetDetailInfos: worksheetDetails.map(async (pickingWSD: WorksheetDetail) => {
|
|
96
|
+
const targetInventory: OrderInventory = pickingWSD.targetInventory
|
|
97
|
+
const inventory: Inventory = targetInventory.inventory
|
|
98
|
+
return {
|
|
99
|
+
name: pickingWSD.name,
|
|
100
|
+
palletId: inventory?.palletId,
|
|
101
|
+
cartonId: inventory?.cartonId,
|
|
102
|
+
batchId: inventory?.batchId,
|
|
103
|
+
batchIdRef: inventory?.batchIdRef,
|
|
104
|
+
product: inventory?.product,
|
|
105
|
+
qty: inventory?.qty,
|
|
106
|
+
binLocation: targetInventory?.binLocation || '',
|
|
107
|
+
releaseQty: targetInventory.releaseQty,
|
|
108
|
+
pickedQty: targetInventory.pickedQty,
|
|
109
|
+
status: pickingWSD.status,
|
|
110
|
+
description: pickingWSD.description,
|
|
111
|
+
targetName: targetInventory.name,
|
|
112
|
+
packingType: inventory?.packingType,
|
|
113
|
+
packingSize: inventory?.packingSize,
|
|
114
|
+
expirationDate: inventory?.expirationDate,
|
|
115
|
+
location: inventory?.location,
|
|
116
|
+
relatedOrderInv: targetInventory
|
|
117
|
+
}
|
|
118
|
+
})
|
|
119
|
+
}
|
|
80
120
|
}
|