@things-factory/worksheet-base 4.3.752 → 4.3.755
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 +97 -27
- package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/sorting-worksheet-controller.js +117 -24
- package/dist-server/controllers/outbound/sorting-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/render-ro-do.js +324 -96
- package/dist-server/controllers/render-ro-do.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/find-sorting-release-orders-by-task-no.js +35 -1
- package/dist-server/graphql/resolvers/worksheet/find-sorting-release-orders-by-task-no.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/index.js +1 -1
- package/dist-server/graphql/resolvers/worksheet/index.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/loading/index.js +3 -1
- package/dist-server/graphql/resolvers/worksheet/loading/index.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/loading/validate-qc-seals.js +79 -0
- package/dist-server/graphql/resolvers/worksheet/loading/validate-qc-seals.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js +1 -1
- package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js.map +1 -1
- package/dist-server/graphql/types/worksheet/index.js +5 -1
- package/dist-server/graphql/types/worksheet/index.js.map +1 -1
- package/dist-server/graphql/types/worksheet/validate-qc-seals-result.js +12 -0
- package/dist-server/graphql/types/worksheet/validate-qc-seals-result.js.map +1 -0
- 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 +21 -21
- package/server/controllers/outbound/picking-worksheet-controller.ts +105 -31
- package/server/controllers/outbound/sorting-worksheet-controller.ts +137 -25
- package/server/controllers/render-ro-do.ts +378 -136
- package/server/graphql/resolvers/worksheet/find-sorting-release-orders-by-task-no.ts +49 -3
- package/server/graphql/resolvers/worksheet/index.ts +3 -2
- package/server/graphql/resolvers/worksheet/loading/index.ts +5 -0
- package/server/graphql/resolvers/worksheet/loading/validate-qc-seals.ts +91 -0
- package/server/graphql/resolvers/worksheet/unloading-worksheet.ts +1 -1
- package/server/graphql/types/worksheet/index.ts +5 -1
- package/server/graphql/types/worksheet/validate-qc-seals-result.ts +9 -0
- package/server/graphql/types/worksheet/worksheet-info.ts +1 -0
|
@@ -2,6 +2,7 @@ import { activateLoadingResolver } from './activate-loading'
|
|
|
2
2
|
import { loadingResolver } from './loading'
|
|
3
3
|
import { undoLoadingResolver } from './undo-loading'
|
|
4
4
|
import { completeLoadingResolver } from './complete-loading'
|
|
5
|
+
import { validateQcSealsResolver } from './validate-qc-seals'
|
|
5
6
|
|
|
6
7
|
export const Mutations = {
|
|
7
8
|
...activateLoadingResolver,
|
|
@@ -9,3 +10,7 @@ export const Mutations = {
|
|
|
9
10
|
...undoLoadingResolver,
|
|
10
11
|
...completeLoadingResolver
|
|
11
12
|
}
|
|
13
|
+
|
|
14
|
+
export const Query = {
|
|
15
|
+
...validateQcSealsResolver
|
|
16
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { EntityManager, IsNull } from 'typeorm'
|
|
2
|
+
import { Domain } from '@things-factory/shell'
|
|
3
|
+
import { User } from '@things-factory/auth-base'
|
|
4
|
+
import { OrderTote, OrderToteSeal, ReleaseGood } from '@things-factory/sales-base'
|
|
5
|
+
import { Setting } from '@things-factory/setting-base'
|
|
6
|
+
|
|
7
|
+
export const validateQcSealsResolver = {
|
|
8
|
+
async validateQcSeals(
|
|
9
|
+
_: any,
|
|
10
|
+
{ releaseGoodNo },
|
|
11
|
+
context: any
|
|
12
|
+
): Promise<{ valid: boolean; error?: string; minimumSealNumber?: number }> {
|
|
13
|
+
const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
|
|
14
|
+
|
|
15
|
+
try {
|
|
16
|
+
const releaseGood: ReleaseGood = await tx.getRepository(ReleaseGood).findOne({
|
|
17
|
+
where: { domain, name: releaseGoodNo },
|
|
18
|
+
relations: ['bizplace', 'bizplace.domain']
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
if (!releaseGood) {
|
|
22
|
+
return { valid: false, error: 'Release good not found', minimumSealNumber: 0 }
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Check enable-tote-scanning setting
|
|
26
|
+
let enableToteScanningSetting: Setting = await tx.getRepository(Setting).findOne({
|
|
27
|
+
where: {
|
|
28
|
+
domain: domain,
|
|
29
|
+
category: 'id-rule',
|
|
30
|
+
name: 'enable-tote-scanning'
|
|
31
|
+
}
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
// Check minimum-seal-number setting (needed for banner display)
|
|
35
|
+
let minimumSealNumberSetting: Setting = await tx.getRepository(Setting).findOne({
|
|
36
|
+
where: {
|
|
37
|
+
domain: domain,
|
|
38
|
+
category: 'id-rule',
|
|
39
|
+
name: 'minimum-seal-number'
|
|
40
|
+
}
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
const minimumSealNumber = parseInt(minimumSealNumberSetting?.value || '0', 10)
|
|
44
|
+
|
|
45
|
+
if (enableToteScanningSetting) {
|
|
46
|
+
// enable-tote-scanning is numeric: 0 = disabled, >= 1 = enabled
|
|
47
|
+
const enableToteScanningValue = parseInt(enableToteScanningSetting.value || '0', 10)
|
|
48
|
+
|
|
49
|
+
if (enableToteScanningValue >= 1) {
|
|
50
|
+
// Check if there are unsealed totes (closedDate is null)
|
|
51
|
+
const foundNotSealedOrderTote = await tx
|
|
52
|
+
.getRepository(OrderTote)
|
|
53
|
+
.findOne({ where: { releaseGood, closedDate: IsNull() } })
|
|
54
|
+
|
|
55
|
+
if (foundNotSealedOrderTote) {
|
|
56
|
+
return {
|
|
57
|
+
valid: false,
|
|
58
|
+
error: `Please seal the tote(s) before proceeding. Minimum ${minimumSealNumber} seal(s) required.`,
|
|
59
|
+
minimumSealNumber
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// If minimum-seal-number > 0, validate seal counts per tote
|
|
64
|
+
if (minimumSealNumber > 0) {
|
|
65
|
+
// Get all order totes for this release good
|
|
66
|
+
const orderTotes: OrderTote[] = await tx.getRepository(OrderTote).find({
|
|
67
|
+
where: { releaseGood },
|
|
68
|
+
relations: ['orderToteSeals']
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
// Validate each tote has at least minimum-seal-number seals
|
|
72
|
+
for (const orderTote of orderTotes) {
|
|
73
|
+
const sealCount = orderTote.orderToteSeals?.length || 0
|
|
74
|
+
if (sealCount < minimumSealNumber) {
|
|
75
|
+
return {
|
|
76
|
+
valid: false,
|
|
77
|
+
error: `Tote ${orderTote.name} has ${sealCount} seal(s), but minimum ${minimumSealNumber} seal(s) required`,
|
|
78
|
+
minimumSealNumber
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return { valid: true, minimumSealNumber }
|
|
87
|
+
} catch (error) {
|
|
88
|
+
return { valid: false, error: error.message || 'Validation failed', minimumSealNumber: 0 }
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -112,7 +112,7 @@ export async function findUnloadingWorksheetByArrivalNoticeNo(arrivalNoticeNo, c
|
|
|
112
112
|
remark: targetProduct.remark,
|
|
113
113
|
issue: worksheetDetail.issue,
|
|
114
114
|
status: worksheetDetail.status,
|
|
115
|
-
manufactureDate: targetProduct.manufactureDate ? new Date(targetProduct.manufactureDate) : null
|
|
115
|
+
manufactureDate: targetProduct.manufactureDate && !isNaN(new Date(targetProduct.manufactureDate).getTime()) ? new Date(targetProduct.manufactureDate).toISOString().split('T')[0] : null
|
|
116
116
|
}
|
|
117
117
|
})
|
|
118
118
|
}
|
|
@@ -22,6 +22,7 @@ import { ProductApproval } from './product-approval'
|
|
|
22
22
|
import { ReleaseGoodWorksheet } from './release-good-worksheet'
|
|
23
23
|
import { ReturnOrderWorksheet } from './return-order-worksheet'
|
|
24
24
|
import { SellercraftDocument } from './sellercraft-document'
|
|
25
|
+
import { ValidateQcSealsResult } from './validate-qc-seals-result'
|
|
25
26
|
import { VasOrderWorksheet } from './vas-order-worksheet'
|
|
26
27
|
import { WebspertDocument } from './webspert-document'
|
|
27
28
|
import { Worksheet } from './worksheet'
|
|
@@ -864,6 +865,8 @@ export const Query = /* GraphQL */ `
|
|
|
864
865
|
findSortingReleaseOrdersByTaskNo(taskNo: String!): FindReleaseOrdersByTaskNo @privilege(category: "worksheet", privilege: "query") @transaction
|
|
865
866
|
|
|
866
867
|
findReleaseOrdersByTaskNo(taskNo: String!): FindReleaseOrdersByTaskNo @privilege(category: "worksheet", privilege: "query") @transaction
|
|
868
|
+
|
|
869
|
+
validateQcSeals(releaseGoodNo: String!): ValidateQcSealsResult @privilege(category: "worksheet", privilege: "query") @transaction
|
|
867
870
|
`
|
|
868
871
|
|
|
869
872
|
export const Types = /* GraphQL */ [
|
|
@@ -898,5 +901,6 @@ export const Types = /* GraphQL */ [
|
|
|
898
901
|
DeliveryOrderRO,
|
|
899
902
|
GenerateBatchPickInfo,
|
|
900
903
|
MultipleReleaseGoodWorksheet,
|
|
901
|
-
LocationFilter
|
|
904
|
+
LocationFilter,
|
|
905
|
+
ValidateQcSealsResult
|
|
902
906
|
]
|