@chenchaolong/plugin-trade-compliance-workbench 1.0.52 → 1.0.54
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/README.md +2 -2
- package/dist/lib/analytics-export.d.ts.map +1 -1
- package/dist/lib/analytics-export.js +1 -3
- package/dist/lib/analytics-export.js.map +1 -1
- package/dist/lib/analytics-query.d.ts.map +1 -1
- package/dist/lib/analytics-query.js +13 -20
- package/dist/lib/analytics-query.js.map +1 -1
- package/dist/lib/catalog-import/confidence.d.ts +1 -0
- package/dist/lib/catalog-import/confidence.d.ts.map +1 -1
- package/dist/lib/catalog-import/confidence.js +12 -0
- package/dist/lib/catalog-import/confidence.js.map +1 -1
- package/dist/lib/catalog-import/docx.parser.d.ts.map +1 -1
- package/dist/lib/catalog-import/docx.parser.js +7 -6
- package/dist/lib/catalog-import/docx.parser.js.map +1 -1
- package/dist/lib/catalog-import/pdf-layout.parser.d.ts.map +1 -1
- package/dist/lib/catalog-import/pdf-layout.parser.js +8 -7
- package/dist/lib/catalog-import/pdf-layout.parser.js.map +1 -1
- package/dist/lib/catalog-import/spreadsheet.parser.d.ts.map +1 -1
- package/dist/lib/catalog-import/spreadsheet.parser.js +12 -13
- package/dist/lib/catalog-import/spreadsheet.parser.js.map +1 -1
- package/dist/lib/demo-data.definitions.js +1 -1
- package/dist/lib/demo-data.definitions.js.map +1 -1
- package/dist/lib/entities/catalog.entity.d.ts +7 -1
- package/dist/lib/entities/catalog.entity.d.ts.map +1 -1
- package/dist/lib/entities/catalog.entity.js +26 -2
- package/dist/lib/entities/catalog.entity.js.map +1 -1
- package/dist/lib/entities/customer.entity.js.map +1 -1
- package/dist/lib/entities/procurement.entity.js.map +1 -1
- package/dist/lib/remote-components/trade-compliance-workbench/app.css +1 -1
- package/dist/lib/remote-components/trade-compliance-workbench/app.js +8 -8
- package/dist/lib/remote-ui/action-execution.d.ts +3 -0
- package/dist/lib/remote-ui/action-execution.d.ts.map +1 -1
- package/dist/lib/remote-ui/action-execution.js +21 -1
- package/dist/lib/remote-ui/action-execution.js.map +1 -1
- package/dist/lib/remote-ui/app-source.js +168 -151
- package/dist/lib/remote-ui/app-source.js.map +1 -1
- package/dist/lib/remote-ui/bridge.d.ts.map +1 -1
- package/dist/lib/remote-ui/components/forms.d.ts +5 -2
- package/dist/lib/remote-ui/components/forms.d.ts.map +1 -1
- package/dist/lib/remote-ui/components/forms.js +4 -4
- package/dist/lib/remote-ui/components/forms.js.map +1 -1
- package/dist/lib/remote-ui/components/layout.d.ts.map +1 -1
- package/dist/lib/remote-ui/components/layout.js +31 -4
- package/dist/lib/remote-ui/components/layout.js.map +1 -1
- package/dist/lib/remote-ui/components/task-status.js +2 -2
- package/dist/lib/remote-ui/components/task-status.js.map +1 -1
- package/dist/lib/remote-ui/contract-import.d.ts +1 -0
- package/dist/lib/remote-ui/contract-import.d.ts.map +1 -1
- package/dist/lib/remote-ui/contract-import.js.map +1 -1
- package/dist/lib/remote-ui/contracts.d.ts +11 -0
- package/dist/lib/remote-ui/contracts.d.ts.map +1 -1
- package/dist/lib/remote-ui/import-task-status.d.ts +5 -2
- package/dist/lib/remote-ui/import-task-status.d.ts.map +1 -1
- package/dist/lib/remote-ui/import-task-status.js +13 -8
- package/dist/lib/remote-ui/import-task-status.js.map +1 -1
- package/dist/lib/remote-ui/pages/analytics-detail-list.d.ts.map +1 -1
- package/dist/lib/remote-ui/pages/analytics-detail-list.js.map +1 -1
- package/dist/lib/remote-ui/pages/catalog-import-history.d.ts +47 -2
- package/dist/lib/remote-ui/pages/catalog-import-history.d.ts.map +1 -1
- package/dist/lib/remote-ui/pages/catalog-import-history.js +128 -8
- package/dist/lib/remote-ui/pages/catalog-import-history.js.map +1 -1
- package/dist/lib/remote-ui/pages/catalogs.css +55 -1
- package/dist/lib/remote-ui/pages/catalogs.d.ts +7 -4
- package/dist/lib/remote-ui/pages/catalogs.d.ts.map +1 -1
- package/dist/lib/remote-ui/pages/catalogs.js +40 -19
- package/dist/lib/remote-ui/pages/catalogs.js.map +1 -1
- package/dist/lib/remote-ui/pages/contracts.d.ts.map +1 -1
- package/dist/lib/remote-ui/pages/contracts.js +0 -16
- package/dist/lib/remote-ui/pages/contracts.js.map +1 -1
- package/dist/lib/remote-ui/pages/files-prototype.css +2 -2
- package/dist/lib/remote-ui/pages/files.d.ts +1 -1
- package/dist/lib/remote-ui/pages/files.d.ts.map +1 -1
- package/dist/lib/remote-ui/pages/files.js +6 -6
- package/dist/lib/remote-ui/pages/files.js.map +1 -1
- package/dist/lib/remote-ui/pages/home.d.ts.map +1 -1
- package/dist/lib/remote-ui/pages/home.js +2 -2
- package/dist/lib/remote-ui/pages/home.js.map +1 -1
- package/dist/lib/remote-ui/pages/procurement.d.ts +6 -1
- package/dist/lib/remote-ui/pages/procurement.d.ts.map +1 -1
- package/dist/lib/remote-ui/pages/procurement.js +77 -16
- package/dist/lib/remote-ui/pages/procurement.js.map +1 -1
- package/dist/lib/remote-ui/procurement-contracts.d.ts +7 -1
- package/dist/lib/remote-ui/procurement-contracts.d.ts.map +1 -1
- package/dist/lib/remote-ui/procurement-contracts.js.map +1 -1
- package/dist/lib/remote-ui/purchase-review-adapter.d.ts +6 -2
- package/dist/lib/remote-ui/purchase-review-adapter.d.ts.map +1 -1
- package/dist/lib/remote-ui/purchase-review-adapter.js +5 -3
- package/dist/lib/remote-ui/purchase-review-adapter.js.map +1 -1
- package/dist/lib/remote-ui/sidebar-state.d.ts +1 -0
- package/dist/lib/remote-ui/sidebar-state.d.ts.map +1 -1
- package/dist/lib/remote-ui/sidebar-state.js +3 -0
- package/dist/lib/remote-ui/sidebar-state.js.map +1 -1
- package/dist/lib/sales-file.service.js +1 -1
- package/dist/lib/sales-file.service.js.map +1 -1
- package/dist/lib/schema-maintenance.d.ts.map +1 -1
- package/dist/lib/schema-maintenance.js +125 -0
- package/dist/lib/schema-maintenance.js.map +1 -1
- package/dist/lib/types.d.ts +3 -0
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/types.js +1 -0
- package/dist/lib/types.js.map +1 -1
- package/dist/lib/workbench-action-contract.d.ts +1 -1
- package/dist/lib/workbench-action-contract.d.ts.map +1 -1
- package/dist/lib/workbench-action-contract.js +3 -1
- package/dist/lib/workbench-action-contract.js.map +1 -1
- package/dist/lib/workbench-view.provider.d.ts +12 -9
- package/dist/lib/workbench-view.provider.d.ts.map +1 -1
- package/dist/lib/workbench-view.provider.js +38 -6
- package/dist/lib/workbench-view.provider.js.map +1 -1
- package/dist/lib/workbench.middleware.d.ts +444 -15
- package/dist/lib/workbench.middleware.d.ts.map +1 -1
- package/dist/lib/workbench.middleware.js +38 -7
- package/dist/lib/workbench.middleware.js.map +1 -1
- package/dist/lib/workbench.service.d.ts +31 -3
- package/dist/lib/workbench.service.d.ts.map +1 -1
- package/dist/lib/workbench.service.js +765 -147
- package/dist/lib/workbench.service.js.map +1 -1
- package/package.json +2 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
export const RISK_OPERATION_ITEMS = [
|
|
3
|
-
{ key: 'catalog-replace', title: '覆盖管控目录', description: '
|
|
3
|
+
{ key: 'catalog-replace', title: '覆盖管控目录', description: '确认目录类型和被覆盖的历史文件。覆盖批次先作为草稿解析和复核,审核发布后生效;原有效目录在发布完成前持续可用。', icon: 'ri-folder-open-line' },
|
|
4
4
|
{ key: 'duplicate-contract', title: '重复上传合同', description: '采购合同和客户合同均不允许覆盖;发现相同合同编码时系统会阻止上传。确需重传时必须先逻辑删除旧合同。', icon: 'ri-upload-cloud-2-line' },
|
|
5
|
-
{ key: 'catalog-impact', title: '覆盖目录', description: '
|
|
5
|
+
{ key: 'catalog-impact', title: '覆盖目录', description: '管控商品目录和公司制裁目录在发布成功后重新计算风险结果,请确认被覆盖文件和记录数量。', icon: 'ri-book-open-line' },
|
|
6
6
|
{ key: 'delete-data', title: '删除业务数据', description: '删除供应商、客户、订单、商品、目录记录或历史文件前,请确认其下游影响。业务删除和目录覆盖均为逻辑删除。', icon: 'ri-delete-bin-line' },
|
|
7
7
|
{ key: 'payments', title: '维护付款/收款/退税', description: '采购和销售金额统一使用人民币;金额超过订单总额或预计退税额时系统将禁止保存。', icon: 'ri-money-cny-circle-line' },
|
|
8
8
|
{ key: 'profit', title: '维护利润率', description: '客户默认利润率会实时影响其全部未单独设置利润率的派生销售订单,历史生成文件不会自动更新。', icon: 'ri-line-chart-line' },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"home.js","sourceRoot":"","sources":["../../../../src/lib/remote-ui/pages/home.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"home.js","sourceRoot":"","sources":["../../../../src/lib/remote-ui/pages/home.tsx"],"names":[],"mappings":"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"}
|
|
@@ -32,7 +32,12 @@ type ProcurementBulkFailure = {
|
|
|
32
32
|
};
|
|
33
33
|
export declare function procurementBulkEntity(collection: ProcurementCollectionKey): ProcurementDeleteEntityType;
|
|
34
34
|
export declare function procurementRouteSelectionKey(route: ProcurementPageProps['route']): string;
|
|
35
|
-
|
|
35
|
+
type PurchaseLineHsBindingResult = {
|
|
36
|
+
code: string;
|
|
37
|
+
englishName?: string | null;
|
|
38
|
+
taxRefundRate?: string | null;
|
|
39
|
+
};
|
|
40
|
+
export declare function bindPurchaseLineHsCodeDraft(line: PurchaseOrderLineDraft, hsCodeOrResult: string | PurchaseLineHsBindingResult, translatedEnglishName?: string | null): PurchaseOrderLineDraft | null;
|
|
36
41
|
export declare function createProcurementSelectionQuery(query: ProcurementPageProps['onQuery'], clearSelection: () => void): (collection: ProcurementCollectionKey, request: Parameters<ProcurementPageProps["onQuery"]>[1]) => Promise<boolean | void>;
|
|
37
42
|
export declare function createProcurementBulkConfirmGuard(): {
|
|
38
43
|
run<T>(operation: () => Promise<T>): Promise<T> | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"procurement.d.ts","sourceRoot":"","sources":["../../../../src/lib/remote-ui/pages/procurement.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAoB,gBAAgB,EAAE,aAAa,EAAE,WAAW,EAAe,kBAAkB,EAAmB,cAAc,EAAE,MAAM,iBAAiB,CAAA;AACvK,OAAO,KAAK,EAGV,uBAAuB,EACvB,wBAAwB,EACxB,2BAA2B,EAC3B,kBAAkB,EAClB,oBAAoB,EACpB,2BAA2B,EAC3B,sBAAsB,EACtB,oBAAoB,EACpB,gBAAgB,EAGhB,WAAW,EACZ,MAAM,6BAA6B,CAAA;AAKpC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAGpE,OAAO,EAAwB,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAA;AACrE,OAAO,6BAA6B,CAAA;AAEpC,YAAY,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAiCvE,eAAO,MAAM,yBAAyB,EAAE;IACtC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC,CAAA;IACrD,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAAA;IAC/D,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC,CAAA;CAwBnE,CAAA;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,kBAAkB,KAAK,IAAI,EAAE,UAAU,SAAM;mBAIhI,gBAAgB,CAAC,MAAM,CAAC,WAAW,WAAW,aAAY,kBAAkB;mBAK5E,WAAW,aAAY,kBAAkB;eAC7C,MAAM,WAAW,WAAW,aAAY,kBAAkB;uBAClD,kBAAkB,WAAW,WAAW;;EAG9D;AAED,wBAAgB,0BAA0B,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,IAAI,CAAC,oBAAoB,EAAE,UAAU,GAAG,cAAc,CAAC;mCAOrF,IAAI;iCAKZ,MAAM,SAAS,2BAA2B;4BAC/C,WAAW;iCACN,gBAAgB;uCACV,MAAM,SAAS,sBAAsB;gCAC5C,oBAAoB;+BACrB,2BAA2B,MAAM,MAAM,YAAY,sBAAsB;EAEvG;
|
|
1
|
+
{"version":3,"file":"procurement.d.ts","sourceRoot":"","sources":["../../../../src/lib/remote-ui/pages/procurement.tsx"],"names":[],"mappings":"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"}
|
|
@@ -89,14 +89,20 @@ export function createProcurementActionApi({ onAction, onFileAction }) {
|
|
|
89
89
|
assertSucceeded(result);
|
|
90
90
|
return result;
|
|
91
91
|
},
|
|
92
|
-
savePurchaseReview: (taskId, draft) => mutate('save_purchase_review', { importTaskId: taskId, draft }),
|
|
92
|
+
savePurchaseReview: (taskId, draft) => mutate('save_purchase_review', { importTaskId: taskId, draft: sanitizePurchaseReviewDraft(draft) }),
|
|
93
93
|
updateSupplier: (input) => mutate('update_supplier', { ...input }),
|
|
94
94
|
updatePurchaseOrder: (input) => mutate('update_purchase_order', { ...input }),
|
|
95
|
-
addPurchaseLine: (purchaseOrderId, input) => mutate('add_purchase_line', { ...input, purchaseOrderId, sourceType: 'MANUAL_ENTRY' }),
|
|
96
|
-
updatePurchaseLine: (input) => mutate('update_purchase_line', { ...input }),
|
|
95
|
+
addPurchaseLine: (purchaseOrderId, input) => mutate('add_purchase_line', { ...sanitizePurchaseLinePolicyFields(input), purchaseOrderId, sourceType: 'MANUAL_ENTRY' }),
|
|
96
|
+
updatePurchaseLine: (input) => mutate('update_purchase_line', { ...sanitizePurchaseLinePolicyFields(input) }),
|
|
97
97
|
deleteEntity: (entityType, id, options) => mutate('delete_entity', { entityType, id }, options)
|
|
98
98
|
};
|
|
99
99
|
}
|
|
100
|
+
function sanitizePurchaseReviewDraft(draft) {
|
|
101
|
+
return { ...draft, lines: draft.lines.map(sanitizePurchaseLinePolicyFields) };
|
|
102
|
+
}
|
|
103
|
+
function sanitizePurchaseLinePolicyFields(line) {
|
|
104
|
+
return { ...line, refundPolicyReference: null, refundPolicyDate: null, refundValidationMethod: null };
|
|
105
|
+
}
|
|
100
106
|
export function procurementBulkEntity(collection) {
|
|
101
107
|
return collection === 'suppliers' ? 'supplier' : collection === 'purchaseOrders' ? 'purchaseOrder' : 'purchaseLine';
|
|
102
108
|
}
|
|
@@ -107,15 +113,54 @@ export function procurementRouteSelectionKey(route) {
|
|
|
107
113
|
return `orders:${route.supplierId}`;
|
|
108
114
|
return `lines:${route.supplierId}:${route.orderId}`;
|
|
109
115
|
}
|
|
110
|
-
export function bindPurchaseLineHsCodeDraft(line,
|
|
111
|
-
const
|
|
112
|
-
|
|
116
|
+
export function bindPurchaseLineHsCodeDraft(line, hsCodeOrResult, translatedEnglishName) {
|
|
117
|
+
const isLookupResult = typeof hsCodeOrResult !== 'string';
|
|
118
|
+
const result = isLookupResult ? hsCodeOrResult : { code: hsCodeOrResult };
|
|
119
|
+
const nextHsCode = normalizeHsCodeValue(result.code);
|
|
120
|
+
if (!nextHsCode)
|
|
121
|
+
return null;
|
|
122
|
+
if (!isLookupResult && normalizeHsCodeValue(line.hsCode) === nextHsCode)
|
|
123
|
+
return null;
|
|
124
|
+
const hsEnglishName = optionalTrimmedString(result.englishName);
|
|
125
|
+
const translatedName = optionalTrimmedString(translatedEnglishName);
|
|
126
|
+
const nextEnglishName = hsEnglishName ?? translatedName;
|
|
127
|
+
const nextRefundRate = normalizeRefundRateValue(result.taxRefundRate);
|
|
128
|
+
const next = {
|
|
129
|
+
...line,
|
|
130
|
+
hsCode: nextHsCode,
|
|
131
|
+
hsCodeStatus: 'MANUALLY_CONFIRMED',
|
|
132
|
+
...(isLookupResult ? { hsCodeSource: 'HS_LOOKUP' } : {}),
|
|
133
|
+
...(nextEnglishName ? { englishName: nextEnglishName, englishNameSource: hsEnglishName ? 'HS_LOOKUP' : 'AI_TRANSLATION' } : {}),
|
|
134
|
+
...(nextRefundRate != null ? { refundRate: nextRefundRate, refundRateSource: 'HS_LOOKUP' } : {})
|
|
135
|
+
};
|
|
136
|
+
if (normalizeHsCodeValue(line.hsCode) === next.hsCode &&
|
|
137
|
+
line.hsCodeStatus === next.hsCodeStatus &&
|
|
138
|
+
line.hsCodeSource === next.hsCodeSource &&
|
|
139
|
+
String(line.englishName ?? '') === String(next.englishName ?? '') &&
|
|
140
|
+
line.englishNameSource === next.englishNameSource &&
|
|
141
|
+
String(line.refundRate ?? '') === String(next.refundRate ?? '') &&
|
|
142
|
+
line.refundRateSource === next.refundRateSource)
|
|
113
143
|
return null;
|
|
114
|
-
return
|
|
144
|
+
return next;
|
|
115
145
|
}
|
|
116
146
|
function normalizeHsCodeValue(value) {
|
|
117
147
|
return String(value ?? '').replace(/\s/g, '').trim();
|
|
118
148
|
}
|
|
149
|
+
function optionalTrimmedString(value) {
|
|
150
|
+
const result = String(value ?? '').trim();
|
|
151
|
+
return result || null;
|
|
152
|
+
}
|
|
153
|
+
function normalizeRefundRateValue(value) {
|
|
154
|
+
const raw = optionalTrimmedString(value);
|
|
155
|
+
if (!raw)
|
|
156
|
+
return null;
|
|
157
|
+
if (raw.endsWith('%')) {
|
|
158
|
+
const percent = Number(raw.slice(0, -1).trim());
|
|
159
|
+
return Number.isFinite(percent) ? String(percent / 100) : null;
|
|
160
|
+
}
|
|
161
|
+
const parsed = Number(raw);
|
|
162
|
+
return Number.isFinite(parsed) ? raw : null;
|
|
163
|
+
}
|
|
119
164
|
export function createProcurementSelectionQuery(query, clearSelection) {
|
|
120
165
|
return async (collection, request) => {
|
|
121
166
|
clearSelection();
|
|
@@ -222,7 +267,7 @@ export function buildProcurementMetrics(orders, lines, currentYear = Number(form
|
|
|
222
267
|
};
|
|
223
268
|
}
|
|
224
269
|
for (const line of lines)
|
|
225
|
-
productAmounts.set(line.productName, (productAmounts.get(line.productName) ?? 0) +
|
|
270
|
+
productAmounts.set(line.productName, (productAmounts.get(line.productName) ?? 0) + purchaseLineMetricAmount(line));
|
|
226
271
|
const currentOrders = orders.filter((item) => item.orderDate.startsWith(currentYearPrefix));
|
|
227
272
|
return {
|
|
228
273
|
totalOrderCount: orders.length,
|
|
@@ -273,8 +318,6 @@ export function validatePurchaseContractReview(draft) {
|
|
|
273
318
|
errors.push(`${prefix}增值税率必须在0到1之间`);
|
|
274
319
|
if (refundRate !== null && (!Number.isFinite(refundRate) || refundRate < 0 || refundRate > 1))
|
|
275
320
|
errors.push(`${prefix}退税率必须在0到1之间`);
|
|
276
|
-
if (line.refundPolicyDate && draft.order.orderDate && line.refundPolicyDate > draft.order.orderDate)
|
|
277
|
-
errors.push(`${prefix}退税政策日期不得晚于下单日期`);
|
|
278
321
|
if (line.amountMismatch && !line.amountMismatchConfirmed)
|
|
279
322
|
errors.push(`${prefix}金额差异必须确认`);
|
|
280
323
|
});
|
|
@@ -516,12 +559,13 @@ export function LineDialog({ state, order, busy, onAction, onClose, onSave, onBi
|
|
|
516
559
|
const errors = validatePurchaseContractReview({ supplier: { name: 'line-review' }, order: order ?? { supplierId: '', contractNo: 'line-review', orderDate: '', contractAmountCny: value.lineAmountTaxIncluded }, lines: [value] })
|
|
517
560
|
.filter((item) => item.startsWith('第1条商品') || item.includes('下单日期'));
|
|
518
561
|
const hsAction = (actionKey, input) => {
|
|
519
|
-
if (actionKey !== 'search_hs_code' && actionKey !== 'get_hs_code_detail')
|
|
562
|
+
if (actionKey !== 'search_hs_code' && actionKey !== 'get_hs_code_detail' && actionKey !== 'translate_purchase_product_name')
|
|
520
563
|
return Promise.resolve({ success: false, message: '采购商品仅支持海关编码查询' });
|
|
521
564
|
return onAction(actionKey, input);
|
|
522
565
|
};
|
|
523
566
|
const bindHsCode = async (result) => {
|
|
524
|
-
const
|
|
567
|
+
const translatedEnglishName = optionalTrimmedString(result.englishName) ? null : await translatePurchaseProductName(hsAction, value.productName);
|
|
568
|
+
const next = bindPurchaseLineHsCodeDraft(value, result, translatedEnglishName);
|
|
525
569
|
if (!next) {
|
|
526
570
|
setHsOpen(false);
|
|
527
571
|
return;
|
|
@@ -534,7 +578,22 @@ export function LineDialog({ state, order, busy, onAction, onClose, onSave, onBi
|
|
|
534
578
|
setValue(next);
|
|
535
579
|
setHsOpen(false);
|
|
536
580
|
};
|
|
537
|
-
return _jsxs(_Fragment, { children: [_jsx(Modal, { open: true, title: state.mode === 'create' ? '新增商品' : '采购商品审核', size: "wide", onClose: onClose, footer: _jsxs(_Fragment, { children: [_jsxs("button", { type: "button", className: "tcw-button tcw-button--secondary", onClick: onClose, children: [_jsx("i", { className: "ri-close-line", "aria-hidden": "true" }), "\u53D6\u6D88"] }), _jsxs("button", { type: "button", className: "tcw-button tcw-button--primary", disabled: busy || errors.length > 0, onClick: () => void onSave(value), children: [_jsx("i", { className: "ri-save-line", "aria-hidden": "true" }), "\u4FDD\u5B58"] })] }), children: _jsxs("div", { className: "tcw-procurement-line-form", children: [_jsxs("div", { className: "tcw-procurement-source-label", children: ["\u6765\u6E90\u7C7B\u578B\uFF1A", sourceTypeLabels[value.sourceType]] }), state.mode === 'review' && errors.length > 0 && _jsx(RiskNotice, { children: errors.join(';') }), _jsxs(FieldGrid, { columns: 2, children: [_jsx(TextField, { label: "\u5546\u54C1\u540D\u79F0", required: true, value: value.productName, onChange: (next) => setValue({ ...value, productName: next }) }), _jsx(TextField, { label: "\u5546\u54C1\u63CF\u8FF0", value: value.productDescription, onChange: (next) => setValue({ ...value, productDescription: next }) }), _jsx(TextField, { label: "\u89C4\u683C\u578B\u53F7", value: value.modelSpecification, onChange: (next) => setValue({ ...value, modelSpecification: next }) }), _jsx(TextField, { label: "\u5355\u4F4D", required: true, value: value.unit, onChange: (next) => setValue({ ...value, unit: next }) }), _jsx(TextField, { label: "\u6570\u91CF", required: true, type: "number", value: value.quantity, onChange: (next) => setValue({ ...value, quantity: next, lineAmountTaxIncluded: String(amount(next) * amount(value.unitPriceTaxIncluded)) }) }), _jsx(TextField, { label: "\u542B\u7A0E\u5355\u4EF7\uFF08\u4EBA\u6C11\u5E01\uFF09", required: true, type: "number", value: value.unitPriceTaxIncluded, onChange: (next) => setValue({ ...value, unitPriceTaxIncluded: next, lineAmountTaxIncluded: String(amount(value.quantity) * amount(next)) }) }), _jsx(TextField, { label: "\u542B\u7A0E\u91D1\u989D\uFF08\u4EBA\u6C11\u5E01\uFF09", required: true, type: "number", value: value.lineAmountTaxIncluded || String(computedAmount), onChange: (next) => setValue({ ...value, lineAmountTaxIncluded: next }) }), _jsx(TextField, { label: "\u589E\u503C\u7A0E\u7387",
|
|
581
|
+
return _jsxs(_Fragment, { children: [_jsx(Modal, { open: true, title: state.mode === 'create' ? '新增商品' : '采购商品审核', size: "wide", onClose: onClose, footer: _jsxs(_Fragment, { children: [_jsxs("button", { type: "button", className: "tcw-button tcw-button--secondary", onClick: onClose, children: [_jsx("i", { className: "ri-close-line", "aria-hidden": "true" }), "\u53D6\u6D88"] }), _jsxs("button", { type: "button", className: "tcw-button tcw-button--primary", disabled: busy || errors.length > 0, onClick: () => void onSave(value), children: [_jsx("i", { className: "ri-save-line", "aria-hidden": "true" }), "\u4FDD\u5B58"] })] }), children: _jsxs("div", { className: "tcw-procurement-line-form", children: [_jsxs("div", { className: "tcw-procurement-source-label", children: ["\u6765\u6E90\u7C7B\u578B\uFF1A", sourceTypeLabels[value.sourceType]] }), state.mode === 'review' && errors.length > 0 && _jsx(RiskNotice, { children: errors.join(';') }), _jsxs(FieldGrid, { columns: 2, children: [_jsx(TextField, { label: "\u5546\u54C1\u540D\u79F0", required: true, value: value.productName, onChange: (next) => setValue({ ...value, productName: next }) }), _jsx(TextField, { label: "\u5546\u54C1\u63CF\u8FF0", value: value.productDescription, onChange: (next) => setValue({ ...value, productDescription: next }) }), _jsx(TextField, { label: "\u89C4\u683C\u578B\u53F7", value: value.modelSpecification, onChange: (next) => setValue({ ...value, modelSpecification: next }) }), _jsx(TextField, { label: "\u5355\u4F4D", required: true, value: value.unit, onChange: (next) => setValue({ ...value, unit: next }) }), _jsx(TextField, { label: "\u6570\u91CF", required: true, type: "number", value: value.quantity, onChange: (next) => setValue({ ...value, quantity: next, lineAmountTaxIncluded: String(amount(next) * amount(value.unitPriceTaxIncluded)) }) }), _jsx(TextField, { label: "\u542B\u7A0E\u5355\u4EF7\uFF08\u4EBA\u6C11\u5E01\uFF09", required: true, type: "number", value: value.unitPriceTaxIncluded, onChange: (next) => setValue({ ...value, unitPriceTaxIncluded: next, lineAmountTaxIncluded: String(amount(value.quantity) * amount(next)) }) }), _jsx(TextField, { label: "\u542B\u7A0E\u91D1\u989D\uFF08\u4EBA\u6C11\u5E01\uFF09", required: true, type: "number", value: value.lineAmountTaxIncluded || String(computedAmount), onChange: (next) => setValue({ ...value, lineAmountTaxIncluded: next }) }), _jsx(TextField, { label: "\u589E\u503C\u7A0E\u7387", type: "number", value: value.vatRate, onChange: (next) => setValue({ ...value, vatRate: next }) }), _jsx(FormField, { label: "\u6D77\u5173\u7F16\u7801", children: _jsxs("div", { className: "tcw-procurement-inline-field", children: [_jsx("input", { value: value.hsCode ?? '', onChange: (event) => setValue(applyManualHsCode(value, event.target.value)) }), _jsxs("button", { type: "button", className: "tcw-button tcw-button--secondary", onClick: () => setHsOpen(true), children: [_jsx("i", { className: "ri-search-line", "aria-hidden": "true" }), "HS\u7F16\u7801\u67E5\u8BE2"] })] }) }), _jsx(TextField, { label: "\u9000\u7A0E\u7387", required: true, type: "number", value: value.refundRate, onChange: (next) => setValue({ ...value, refundRate: next }) }), _jsx(TextField, { label: "\u82F1\u6587\u540D\u79F0", value: value.englishName, onChange: (next) => setValue({ ...value, englishName: next }) })] })] }) }), _jsx(HsCodeLookupDialog, { open: hsOpen, initialQuery: value.hsCode || value.englishName || value.productName, onAction: hsAction, onClose: () => setHsOpen(false), onBind: bindHsCode })] });
|
|
582
|
+
}
|
|
583
|
+
function applyManualHsCode(line, hsCode) {
|
|
584
|
+
const nextHsCode = normalizeHsCodeValue(hsCode);
|
|
585
|
+
return { ...line, hsCode, hsCodeStatus: nextHsCode ? 'MANUALLY_CONFIRMED' : 'UNCONFIRMED', hsCodeSource: nextHsCode ? 'MANUAL' : null };
|
|
586
|
+
}
|
|
587
|
+
async function translatePurchaseProductName(onAction, productName) {
|
|
588
|
+
try {
|
|
589
|
+
const response = await onAction('translate_purchase_product_name', { productName });
|
|
590
|
+
if (response.success === false)
|
|
591
|
+
return null;
|
|
592
|
+
return optionalTrimmedString(response.data?.englishName);
|
|
593
|
+
}
|
|
594
|
+
catch {
|
|
595
|
+
return null;
|
|
596
|
+
}
|
|
538
597
|
}
|
|
539
598
|
export function PurchaseContractReviewDialog({ open, task, draft, busy, onChange, onClose, onSave }) {
|
|
540
599
|
const errors = draft ? validatePurchaseContractReview(draft) : [];
|
|
@@ -542,7 +601,7 @@ export function PurchaseContractReviewDialog({ open, task, draft, busy, onChange
|
|
|
542
601
|
return _jsxs(Modal, { open: open, title: "\u91C7\u8D2D\u5408\u540C\u5BA1\u6838", size: "wide", onClose: onClose, footer: _jsxs(_Fragment, { children: [_jsxs("button", { type: "button", className: "tcw-button tcw-button--secondary", onClick: onClose, children: [_jsx("i", { className: "ri-close-line", "aria-hidden": "true" }), "\u53D6\u6D88"] }), _jsxs("button", { type: "button", className: "tcw-button tcw-button--primary", disabled: busy || !draft || Boolean(duplicate) || errors.length > 0, onClick: () => draft && void onSave(draft), children: [_jsx("i", { className: "ri-check-double-line", "aria-hidden": "true" }), "\u5BA1\u6838\u5E76\u5165\u5E93"] })] }), children: [duplicate && _jsx(RiskNotice, { children: duplicate }), !draft ? _jsx(RiskNotice, { children: task?.errorMessage || '采购合同解析结果不可用' }) : _jsxs("div", { className: "tcw-procurement-review-compact", children: [_jsxs("section", { className: "tcw-procurement-review-editor-pane", children: [_jsx("h3", { children: "\u8BC6\u522B\u5185\u5BB9" }), _jsxs("div", { className: "tcw-procurement-review-editor", children: [errors.length > 0 && _jsx(RiskNotice, { children: errors.join(';') }), _jsx(ReviewSection, { title: "\u4F9B\u5E94\u5546\u4FE1\u606F", children: _jsx(SupplierDraftEditor, { supplier: draft.supplier, onChange: (supplier) => onChange({ ...draft, supplier }) }) }), _jsx(ReviewSection, { title: "\u8BA2\u5355\u4FE1\u606F", children: _jsxs(FieldGrid, { columns: 3, children: [_jsx(TextField, { label: "\u91C7\u8D2D\u5408\u540C\u7F16\u53F7", required: true, value: draft.order.contractNo, onChange: (value) => onChange({ ...draft, order: { ...draft.order, contractNo: value } }) }), _jsx(TextField, { label: "\u4E0B\u5355\u65E5\u671F", type: "date", value: draft.order.orderDate, onChange: (value) => onChange({ ...draft, order: { ...draft.order, orderDate: value } }) }), _jsx(TextField, { label: "\u91C7\u8D2D\u603B\u989D\uFF08\u4EBA\u6C11\u5E01\uFF09", type: "number", value: draft.order.contractAmountCny, onChange: (value) => onChange({ ...draft, order: { ...draft.order, contractAmountCny: value } }) }), _jsx(TextField, { label: "\u5DF2\u4ED8\u6B3E", type: "number", value: draft.order.paidAmountCny, onChange: (value) => onChange({ ...draft, order: { ...draft.order, paidAmountCny: value } }) }), _jsx(TextField, { label: "\u5DF2\u9000\u7A0E", type: "number", value: draft.order.refundedAmountCny, onChange: (value) => onChange({ ...draft, order: { ...draft.order, refundedAmountCny: value } }) })] }) }), _jsx(ReviewSection, { title: `全部商品(${draft.lines.length})`, children: _jsx("div", { className: "tcw-procurement-review-lines", children: draft.lines.map((line, index) => _jsx(ContractLineEditor, { index: index, line: line, onChange: (next) => onChange({ ...draft, lines: draft.lines.map((item, lineIndex) => lineIndex === index ? next : item) }) }, line.id ?? index)) }) })] })] }), _jsxs("section", { className: "tcw-procurement-review-source-pane", children: [_jsx("h3", { children: "\u6E90\u6587\u4EF6\u5185\u5BB9" }), _jsx(SourcePreview, { draft: draft, task: task })] })] })] });
|
|
543
602
|
}
|
|
544
603
|
function ContractLineEditor({ line, index, onChange }) {
|
|
545
|
-
return _jsxs("section", { className: "tcw-procurement-review-line", children: [_jsxs("h4", { children: ["\u5546\u54C1 ", index + 1, " ", _jsx(StatusTag, { tone: "muted", children: sourceTypeLabels[line.sourceType] })] }), _jsxs(FieldGrid, { columns: 3, children: [_jsx(TextField, { label: "\u5546\u54C1\u540D\u79F0", required: true, value: line.productName, onChange: (value) => onChange({ ...line, productName: value }) }), _jsx(TextField, { label: "\u5546\u54C1\u63CF\u8FF0", value: line.productDescription, onChange: (value) => onChange({ ...line, productDescription: value }) }), _jsx(TextField, { label: "\u89C4\u683C\u578B\u53F7", value: line.modelSpecification, onChange: (value) => onChange({ ...line, modelSpecification: value }) }), _jsx(TextField, { label: "\u5355\u4F4D", value: line.unit, onChange: (value) => onChange({ ...line, unit: value }) }), _jsx(TextField, { label: "\u6570\u91CF", type: "number", value: line.quantity, onChange: (value) => onChange({ ...line, quantity: value }) }), _jsx(TextField, { label: "\u542B\u7A0E\u91D1\u989D", type: "number", value: line.lineAmountTaxIncluded, onChange: (value) => onChange({ ...line, lineAmountTaxIncluded: value }) }), _jsx(TextField, { label: "\u6D77\u5173\u7F16\u7801", value: line.hsCode, onChange: (value) => onChange(
|
|
604
|
+
return _jsxs("section", { className: "tcw-procurement-review-line", children: [_jsxs("h4", { children: ["\u5546\u54C1 ", index + 1, " ", _jsx(StatusTag, { tone: "muted", children: sourceTypeLabels[line.sourceType] })] }), _jsxs(FieldGrid, { columns: 3, children: [_jsx(TextField, { label: "\u5546\u54C1\u540D\u79F0", required: true, value: line.productName, onChange: (value) => onChange({ ...line, productName: value }) }), _jsx(TextField, { label: "\u5546\u54C1\u63CF\u8FF0", value: line.productDescription, onChange: (value) => onChange({ ...line, productDescription: value }) }), _jsx(TextField, { label: "\u89C4\u683C\u578B\u53F7", value: line.modelSpecification, onChange: (value) => onChange({ ...line, modelSpecification: value }) }), _jsx(TextField, { label: "\u5355\u4F4D", value: line.unit, onChange: (value) => onChange({ ...line, unit: value }) }), _jsx(TextField, { label: "\u6570\u91CF", type: "number", value: line.quantity, onChange: (value) => onChange({ ...line, quantity: value }) }), _jsx(TextField, { label: "\u542B\u7A0E\u91D1\u989D", type: "number", value: line.lineAmountTaxIncluded, onChange: (value) => onChange({ ...line, lineAmountTaxIncluded: value }) }), _jsx(TextField, { label: "\u6D77\u5173\u7F16\u7801", value: line.hsCode, onChange: (value) => onChange(applyManualHsCode(line, value)) }), line.amountMismatch && _jsx(FormField, { label: "\u91D1\u989D\u5DEE\u5F02\u786E\u8BA4", required: true, children: _jsxs("label", { className: "tcw-procurement-checkbox", children: [_jsx("input", { type: "checkbox", checked: Boolean(line.amountMismatchConfirmed), onChange: (event) => onChange({ ...line, amountMismatchConfirmed: event.target.checked }) }), "\u786E\u8BA4\u4FDD\u7559\u5408\u540C\u539F\u59CB\u91D1\u989D"] }) })] }), _jsxs("details", { className: "tcw-procurement-review-more", children: [_jsx("summary", { children: "\u66F4\u591A\u5546\u54C1\u4FE1\u606F" }), _jsxs(FieldGrid, { columns: 3, children: [_jsx(TextField, { label: "\u82F1\u6587\u540D\u79F0", value: line.englishName, onChange: (value) => onChange({ ...line, englishName: value }) }), _jsx(TextField, { label: "\u542B\u7A0E\u5355\u4EF7", type: "number", value: line.unitPriceTaxIncluded, onChange: (value) => onChange({ ...line, unitPriceTaxIncluded: value }) }), _jsx(TextField, { label: "\u589E\u503C\u7A0E\u7387", type: "number", value: line.vatRate, onChange: (value) => onChange({ ...line, vatRate: value }) }), _jsx(TextField, { label: "\u9000\u7A0E\u7387", type: "number", value: line.refundRate, onChange: (value) => onChange({ ...line, refundRate: value }) })] })] })] });
|
|
546
605
|
}
|
|
547
606
|
function SupplierDraftEditor({ supplier, onChange }) {
|
|
548
607
|
const coreFields = [
|
|
@@ -590,9 +649,12 @@ function orderStatus(row) {
|
|
|
590
649
|
return { value: 'PARTIAL', label: '部分收货', tone: 'warning' };
|
|
591
650
|
return { value: 'PENDING', label: '待收货', tone: 'muted' };
|
|
592
651
|
}
|
|
593
|
-
function balance(metrics, row) { return row.id && metrics.orderBalances[row.id] || { unpaidAmountCny: Math.max(amount(row.contractAmountCny) - amount(row.paidAmountCny), 0), unrefundedAmountCny: Math.max(amount(row.estimatedRefundAmountCny) - amount(row.refundedAmountCny), 0) }; }
|
|
594
652
|
function estimatedLineRefund(line) { const divisor = 1 + rate(line.vatRate); return divisor > 0 ? amount(line.lineAmountTaxIncluded) / divisor * rate(line.refundRate) : 0; }
|
|
595
653
|
function amount(value) { const parsed = Number(value ?? 0); return Number.isFinite(parsed) ? parsed : 0; }
|
|
654
|
+
function purchaseLineMetricAmount(line) {
|
|
655
|
+
const lineAmount = amount(line.lineAmountTaxIncluded);
|
|
656
|
+
return lineAmount > 0 ? lineAmount : amount(line.quantity) * amount(line.unitPriceTaxIncluded);
|
|
657
|
+
}
|
|
596
658
|
function rate(value) { const parsed = amount(value); return parsed > 1 ? parsed / 100 : parsed; }
|
|
597
659
|
function sum(items, read) { return items.reduce((total, item) => total + amount(read(item)), 0); }
|
|
598
660
|
function optionalFiniteAmount(value) {
|
|
@@ -606,7 +668,6 @@ function currency(value) { return `¥${amount(value).toLocaleString('zh-CN', { m
|
|
|
606
668
|
function currencyCompact(value) { return `¥${amount(value).toLocaleString('zh-CN', { maximumFractionDigits: 2 })}`; }
|
|
607
669
|
function number(value) { return amount(value).toLocaleString('zh-CN'); }
|
|
608
670
|
function percent(value) { return `${(rate(value) * 100).toLocaleString('zh-CN', { maximumFractionDigits: 4 })}%`; }
|
|
609
|
-
function booleanOptions() { return [{ value: 'true', label: '是' }, { value: 'false', label: '否' }]; }
|
|
610
671
|
function enumOptions(labels) { return Object.entries(labels).map(([value, label]) => ({ value, label })); }
|
|
611
672
|
function pagination(collection) { const total = collection.total ?? collection.items.length; const pageSize = collection.pageSize ?? PAGE_SIZE; return { page: collection.page ?? 1, pageSize, total, pageCount: Math.max(1, Math.ceil(total / pageSize)) }; }
|
|
612
673
|
function assertSucceeded(result) { if (result.success === false)
|