@chenchaolong/plugin-trade-compliance-workbench 1.0.0 → 1.0.2
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 +46 -1
- package/dist/assets/branding/yuneec-logo.png +0 -0
- package/dist/assets/templates/CI.xlsx +0 -0
- package/dist/assets/templates/CUSTOMS_DECLARATION.xlsx +0 -0
- package/dist/assets/templates/PI.xlsx +0 -0
- package/dist/assets/templates/PL.xlsx +0 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/lib/adapters/file-storage.d.ts +4 -2
- package/dist/lib/adapters/file-storage.d.ts.map +1 -1
- package/dist/lib/adapters/file-storage.js +25 -10
- package/dist/lib/adapters/file-storage.js.map +1 -1
- package/dist/lib/adapters/hsbianma.provider.d.ts +1 -0
- package/dist/lib/adapters/hsbianma.provider.d.ts.map +1 -1
- package/dist/lib/adapters/hsbianma.provider.js +32 -3
- package/dist/lib/adapters/hsbianma.provider.js.map +1 -1
- package/dist/lib/adapters/translation.provider.d.ts +3 -0
- package/dist/lib/adapters/translation.provider.d.ts.map +1 -1
- package/dist/lib/adapters/translation.provider.js +15 -6
- package/dist/lib/adapters/translation.provider.js.map +1 -1
- package/dist/lib/constants.d.ts +3 -2
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +3 -2
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/demo-data.definitions.d.ts +28 -0
- package/dist/lib/demo-data.definitions.d.ts.map +1 -0
- package/dist/lib/demo-data.definitions.js +236 -0
- package/dist/lib/demo-data.definitions.js.map +1 -0
- package/dist/lib/demo-data.entity.d.ts +9 -0
- package/dist/lib/demo-data.entity.d.ts.map +1 -0
- package/dist/lib/demo-data.entity.js +24 -0
- package/dist/lib/demo-data.entity.js.map +1 -0
- package/dist/lib/demo-data.ids.d.ts +4 -0
- package/dist/lib/demo-data.ids.d.ts.map +1 -0
- package/dist/lib/demo-data.ids.js +19 -0
- package/dist/lib/demo-data.ids.js.map +1 -0
- package/dist/lib/demo-data.service.d.ts +26 -0
- package/dist/lib/demo-data.service.d.ts.map +1 -0
- package/dist/lib/demo-data.service.js +124 -0
- package/dist/lib/demo-data.service.js.map +1 -0
- package/dist/lib/domain/default-settings.d.ts +1 -0
- package/dist/lib/domain/default-settings.d.ts.map +1 -1
- package/dist/lib/domain/default-settings.js +1 -0
- package/dist/lib/domain/default-settings.js.map +1 -1
- package/dist/lib/domain/risk-notice.d.ts +59 -0
- package/dist/lib/domain/risk-notice.d.ts.map +1 -0
- package/dist/lib/domain/risk-notice.js +30 -0
- package/dist/lib/domain/risk-notice.js.map +1 -0
- package/dist/lib/entities/catalog.entity.d.ts.map +1 -1
- package/dist/lib/entities/catalog.entity.js +4 -2
- package/dist/lib/entities/catalog.entity.js.map +1 -1
- package/dist/lib/entities/customer.entity.d.ts +9 -2
- package/dist/lib/entities/customer.entity.d.ts.map +1 -1
- package/dist/lib/entities/customer.entity.js +29 -1
- package/dist/lib/entities/customer.entity.js.map +1 -1
- package/dist/lib/entities/index.d.ts +2 -2
- package/dist/lib/entities/index.d.ts.map +1 -1
- package/dist/lib/entities/index.js +2 -2
- package/dist/lib/entities/index.js.map +1 -1
- package/dist/lib/entities/procurement.entity.d.ts +6 -4
- package/dist/lib/entities/procurement.entity.d.ts.map +1 -1
- package/dist/lib/entities/procurement.entity.js +9 -1
- package/dist/lib/entities/procurement.entity.js.map +1 -1
- package/dist/lib/entities/settings.entity.d.ts +12 -2
- package/dist/lib/entities/settings.entity.d.ts.map +1 -1
- package/dist/lib/entities/settings.entity.js +40 -0
- package/dist/lib/entities/settings.entity.js.map +1 -1
- package/dist/lib/entities/shared.entity.d.ts +10 -5
- package/dist/lib/entities/shared.entity.d.ts.map +1 -1
- package/dist/lib/entities/shared.entity.js +22 -1
- package/dist/lib/entities/shared.entity.js.map +1 -1
- package/dist/lib/remote-components/trade-compliance-workbench/app.css +1 -0
- package/dist/lib/remote-components/trade-compliance-workbench/app.js +63 -277
- package/dist/lib/remote-ui/analytics-contracts.d.ts +106 -0
- package/dist/lib/remote-ui/analytics-contracts.d.ts.map +1 -0
- package/dist/lib/remote-ui/analytics-contracts.js +4 -0
- package/dist/lib/remote-ui/analytics-contracts.js.map +1 -0
- package/dist/lib/remote-ui/app-source.d.ts +2 -0
- package/dist/lib/remote-ui/app-source.d.ts.map +1 -0
- package/dist/lib/remote-ui/app-source.js +753 -0
- package/dist/lib/remote-ui/app-source.js.map +1 -0
- package/dist/lib/remote-ui/bridge.d.ts +36 -0
- package/dist/lib/remote-ui/bridge.d.ts.map +1 -0
- package/dist/lib/remote-ui/bridge.js +159 -0
- package/dist/lib/remote-ui/bridge.js.map +1 -0
- package/dist/lib/remote-ui/components/data-grid.d.ts +34 -0
- package/dist/lib/remote-ui/components/data-grid.d.ts.map +1 -0
- package/dist/lib/remote-ui/components/data-grid.js +59 -0
- package/dist/lib/remote-ui/components/data-grid.js.map +1 -0
- package/dist/lib/remote-ui/components/forms.d.ts +63 -0
- package/dist/lib/remote-ui/components/forms.d.ts.map +1 -0
- package/dist/lib/remote-ui/components/forms.js +117 -0
- package/dist/lib/remote-ui/components/forms.js.map +1 -0
- package/dist/lib/remote-ui/components/layout.d.ts +34 -0
- package/dist/lib/remote-ui/components/layout.d.ts.map +1 -0
- package/dist/lib/remote-ui/components/layout.js +89 -0
- package/dist/lib/remote-ui/components/layout.js.map +1 -0
- package/dist/lib/remote-ui/contract-import.d.ts +82 -0
- package/dist/lib/remote-ui/contract-import.d.ts.map +1 -0
- package/dist/lib/remote-ui/contract-import.js +102 -0
- package/dist/lib/remote-ui/contract-import.js.map +1 -0
- package/dist/lib/remote-ui/contracts.d.ts +257 -0
- package/dist/lib/remote-ui/contracts.d.ts.map +1 -0
- package/dist/lib/remote-ui/contracts.js +12 -0
- package/dist/lib/remote-ui/contracts.js.map +1 -0
- package/dist/lib/remote-ui/customer-contract-contracts.d.ts +227 -0
- package/dist/lib/remote-ui/customer-contract-contracts.d.ts.map +1 -0
- package/dist/lib/remote-ui/customer-contract-contracts.js +10 -0
- package/dist/lib/remote-ui/customer-contract-contracts.js.map +1 -0
- package/dist/lib/remote-ui/model.d.ts +31 -0
- package/dist/lib/remote-ui/model.d.ts.map +1 -0
- package/dist/lib/remote-ui/model.js +248 -0
- package/dist/lib/remote-ui/model.js.map +1 -0
- package/dist/lib/remote-ui/pages/analytics.d.ts +12 -0
- package/dist/lib/remote-ui/pages/analytics.d.ts.map +1 -0
- package/dist/lib/remote-ui/pages/analytics.js +123 -0
- package/dist/lib/remote-ui/pages/analytics.js.map +1 -0
- package/dist/lib/remote-ui/pages/catalogs.d.ts +225 -0
- package/dist/lib/remote-ui/pages/catalogs.d.ts.map +1 -0
- package/dist/lib/remote-ui/pages/catalogs.js +572 -0
- package/dist/lib/remote-ui/pages/catalogs.js.map +1 -0
- package/dist/lib/remote-ui/pages/contracts.d.ts +80 -0
- package/dist/lib/remote-ui/pages/contracts.d.ts.map +1 -0
- package/dist/lib/remote-ui/pages/contracts.js +396 -0
- package/dist/lib/remote-ui/pages/contracts.js.map +1 -0
- package/dist/lib/remote-ui/pages/files.d.ts +31 -0
- package/dist/lib/remote-ui/pages/files.d.ts.map +1 -0
- package/dist/lib/remote-ui/pages/files.js +64 -0
- package/dist/lib/remote-ui/pages/files.js.map +1 -0
- package/dist/lib/remote-ui/pages/home.d.ts +71 -0
- package/dist/lib/remote-ui/pages/home.d.ts.map +1 -0
- package/dist/lib/remote-ui/pages/home.js +136 -0
- package/dist/lib/remote-ui/pages/home.js.map +1 -0
- package/dist/lib/remote-ui/pages/procurement.d.ts +36 -0
- package/dist/lib/remote-ui/pages/procurement.d.ts.map +1 -0
- package/dist/lib/remote-ui/pages/procurement.js +370 -0
- package/dist/lib/remote-ui/pages/procurement.js.map +1 -0
- package/dist/lib/remote-ui/pages/sales.d.ts +12 -0
- package/dist/lib/remote-ui/pages/sales.d.ts.map +1 -0
- package/dist/lib/remote-ui/pages/sales.js +106 -0
- package/dist/lib/remote-ui/pages/sales.js.map +1 -0
- package/dist/lib/remote-ui/pages/settings.d.ts +34 -0
- package/dist/lib/remote-ui/pages/settings.d.ts.map +1 -0
- package/dist/lib/remote-ui/pages/settings.js +259 -0
- package/dist/lib/remote-ui/pages/settings.js.map +1 -0
- package/dist/lib/remote-ui/procurement-contracts.d.ts +177 -0
- package/dist/lib/remote-ui/procurement-contracts.d.ts.map +1 -0
- package/dist/lib/remote-ui/procurement-contracts.js +2 -0
- package/dist/lib/remote-ui/procurement-contracts.js.map +1 -0
- package/dist/lib/remote-ui/sales-contracts.d.ts +133 -0
- package/dist/lib/remote-ui/sales-contracts.d.ts.map +1 -0
- package/dist/lib/remote-ui/sales-contracts.js +2 -0
- package/dist/lib/remote-ui/sales-contracts.js.map +1 -0
- package/dist/lib/remote-ui/settings-contracts.d.ts +114 -0
- package/dist/lib/remote-ui/settings-contracts.d.ts.map +1 -0
- package/dist/lib/remote-ui/settings-contracts.js +6 -0
- package/dist/lib/remote-ui/settings-contracts.js.map +1 -0
- package/dist/lib/remote-ui/upload-policy.d.ts +18 -0
- package/dist/lib/remote-ui/upload-policy.d.ts.map +1 -0
- package/dist/lib/remote-ui/upload-policy.js +56 -0
- package/dist/lib/remote-ui/upload-policy.js.map +1 -0
- package/dist/lib/runtime-validation.d.ts +61 -0
- package/dist/lib/runtime-validation.d.ts.map +1 -0
- package/dist/lib/runtime-validation.js +243 -0
- package/dist/lib/runtime-validation.js.map +1 -0
- package/dist/lib/sales-file.service.d.ts +54 -6
- package/dist/lib/sales-file.service.d.ts.map +1 -1
- package/dist/lib/sales-file.service.js +278 -33
- package/dist/lib/sales-file.service.js.map +1 -1
- package/dist/lib/trade-compliance.config.d.ts +32 -0
- package/dist/lib/trade-compliance.config.d.ts.map +1 -1
- package/dist/lib/trade-compliance.config.js +16 -4
- package/dist/lib/trade-compliance.config.js.map +1 -1
- package/dist/lib/types.d.ts +253 -1
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/types.js +24 -0
- package/dist/lib/types.js.map +1 -1
- package/dist/lib/workbench-view.provider.d.ts +675 -38
- package/dist/lib/workbench-view.provider.d.ts.map +1 -1
- package/dist/lib/workbench-view.provider.js +411 -40
- package/dist/lib/workbench-view.provider.js.map +1 -1
- package/dist/lib/workbench.middleware.d.ts +70 -19
- package/dist/lib/workbench.middleware.d.ts.map +1 -1
- package/dist/lib/workbench.middleware.js +5 -1
- package/dist/lib/workbench.middleware.js.map +1 -1
- package/dist/lib/workbench.plugin.d.ts.map +1 -1
- package/dist/lib/workbench.plugin.js +6 -4
- package/dist/lib/workbench.plugin.js.map +1 -1
- package/dist/lib/workbench.service.d.ts +629 -48
- package/dist/lib/workbench.service.d.ts.map +1 -1
- package/dist/lib/workbench.service.js +1818 -300
- package/dist/lib/workbench.service.js.map +1 -1
- package/package.json +15 -4
- package/scripts/seed-demo-data.mjs +138 -0
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { Decimal } from 'decimal.js';
|
|
2
|
+
import { load } from 'cheerio';
|
|
3
|
+
import { AnalyticsModes, BankAccountTypes, DomainError, DomainErrorCodes, EnglishNameSources, HsCodeSources, HsCodeStatuses, PurchaseAnalyticsDimensions, SalesAnalyticsDimensions, ProfitRuleStatuses, PurchaseOrderLineSourceTypes, RefundRateSources, RefundValidationMethods, SettingsTypes, VatRateSources } from './types.js';
|
|
4
|
+
export function parseSettingsType(value) {
|
|
5
|
+
return parseExplicitEnum(value, SettingsTypes, '设置类型');
|
|
6
|
+
}
|
|
7
|
+
export function parseRestoreSettingsInput(input) {
|
|
8
|
+
const settingsType = parseSettingsType(input.settingsType);
|
|
9
|
+
if (settingsType === 'rate')
|
|
10
|
+
invalid('月度汇率不支持恢复系统默认', { settingsType });
|
|
11
|
+
const expectedRevision = parseExpectedRevision(input.expectedRevision);
|
|
12
|
+
if (settingsType === 'bank')
|
|
13
|
+
return { settingsType, bankType: parseBankAccountType(input.bankType), expectedRevision };
|
|
14
|
+
return { settingsType, expectedRevision };
|
|
15
|
+
}
|
|
16
|
+
export function parseExpectedRevision(value, allowZero = false) {
|
|
17
|
+
const revision = finiteInteger(value, '预期修订号');
|
|
18
|
+
if (revision < (allowZero ? 0 : 1))
|
|
19
|
+
invalid(allowZero ? '预期修订号不能小于 0' : '预期修订号必须大于 0', { value });
|
|
20
|
+
return revision;
|
|
21
|
+
}
|
|
22
|
+
export function parseProfitRuleStatus(value) {
|
|
23
|
+
return parseExplicitEnum(value, ProfitRuleStatuses, '利润率规则状态');
|
|
24
|
+
}
|
|
25
|
+
export function parseBankAccountType(value) {
|
|
26
|
+
return parseExplicitEnum(value, BankAccountTypes, '银行账户类型');
|
|
27
|
+
}
|
|
28
|
+
export function parseAnalyticsQuery(input) {
|
|
29
|
+
const mode = parseExplicitEnum(input.mode, AnalyticsModes, '分析模式');
|
|
30
|
+
assertOnlyKeys(input, ['mode', 'dimension', 'filters', 'page', 'pageSize'], '分析查询');
|
|
31
|
+
const rawFilters = record(input.filters, '分析筛选条件');
|
|
32
|
+
const page = positiveInteger(input.page, '页码', 1);
|
|
33
|
+
const pageSize = positiveInteger(input.pageSize, '每页数量', 20);
|
|
34
|
+
if (mode === 'PURCHASE') {
|
|
35
|
+
const dimension = parseExplicitEnum(input.dimension, PurchaseAnalyticsDimensions, '采购分析维度');
|
|
36
|
+
assertOnlyKeys(rawFilters, ['orderDate', 'supplier', 'productName', 'hsCode', 'unpaidOnly', 'unrefundedOnly'], '采购分析筛选字段无效');
|
|
37
|
+
const filters = parseAnalyticsCommonFilters(rawFilters);
|
|
38
|
+
Object.assign(filters, optionalTextProperty(rawFilters, 'supplier'));
|
|
39
|
+
const unpaidOnly = analyticsBooleanFilter(rawFilters, 'unpaidOnly');
|
|
40
|
+
if (unpaidOnly !== undefined)
|
|
41
|
+
filters.unpaidOnly = unpaidOnly;
|
|
42
|
+
const unrefundedOnly = analyticsBooleanFilter(rawFilters, 'unrefundedOnly');
|
|
43
|
+
if (unrefundedOnly !== undefined)
|
|
44
|
+
filters.unrefundedOnly = unrefundedOnly;
|
|
45
|
+
return { mode, dimension, filters, page, pageSize };
|
|
46
|
+
}
|
|
47
|
+
const dimension = parseExplicitEnum(input.dimension, SalesAnalyticsDimensions, '销售分析维度');
|
|
48
|
+
assertOnlyKeys(rawFilters, ['orderDate', 'customer', 'productName', 'hsCode', 'unreceivedOnly'], '销售分析筛选字段无效');
|
|
49
|
+
const filters = parseAnalyticsCommonFilters(rawFilters);
|
|
50
|
+
Object.assign(filters, optionalTextProperty(rawFilters, 'customer'));
|
|
51
|
+
const unreceivedOnly = analyticsBooleanFilter(rawFilters, 'unreceivedOnly');
|
|
52
|
+
if (unreceivedOnly !== undefined)
|
|
53
|
+
filters.unreceivedOnly = unreceivedOnly;
|
|
54
|
+
return { mode, dimension, filters, page, pageSize };
|
|
55
|
+
}
|
|
56
|
+
function parseAnalyticsCommonFilters(rawFilters) {
|
|
57
|
+
const filters = {};
|
|
58
|
+
if ('orderDate' in rawFilters) {
|
|
59
|
+
const range = record(rawFilters.orderDate, '下单日期范围');
|
|
60
|
+
assertOnlyKeys(range, ['from', 'to'], '下单日期范围');
|
|
61
|
+
const orderDate = { ...optionalDateProperty(range, 'from'), ...optionalDateProperty(range, 'to') };
|
|
62
|
+
if (orderDate.from && orderDate.to && orderDate.from > orderDate.to)
|
|
63
|
+
invalid('下单日期开始日期不能晚于结束日期', orderDate);
|
|
64
|
+
filters.orderDate = orderDate;
|
|
65
|
+
}
|
|
66
|
+
for (const key of ['productName', 'hsCode'])
|
|
67
|
+
Object.assign(filters, optionalTextProperty(rawFilters, key));
|
|
68
|
+
return filters;
|
|
69
|
+
}
|
|
70
|
+
function analyticsBooleanFilter(source, key) {
|
|
71
|
+
if (!(key in source))
|
|
72
|
+
return undefined;
|
|
73
|
+
if (typeof source[key] !== 'boolean')
|
|
74
|
+
invalid(`${key}必须是布尔值`, { value: source[key] });
|
|
75
|
+
return source[key];
|
|
76
|
+
}
|
|
77
|
+
export function parseExchangeRateInput(input) {
|
|
78
|
+
const year = finiteInteger(input.year, '汇率年份');
|
|
79
|
+
const month = finiteInteger(input.month, '汇率月份');
|
|
80
|
+
if (year < 2000 || year > 9999)
|
|
81
|
+
invalid('汇率年份必须在 2000 至 9999 之间', { field: 'year', value: input.year });
|
|
82
|
+
if (month < 1 || month > 12)
|
|
83
|
+
invalid('汇率月份必须在 1 至 12 之间', { field: 'month', value: input.month });
|
|
84
|
+
const rate = decimal(input.usdToCnyRate, '美元兑人民币汇率');
|
|
85
|
+
if (rate.lte(0))
|
|
86
|
+
invalid('美元兑人民币汇率必须大于 0', { field: 'usdToCnyRate', value: input.usdToCnyRate });
|
|
87
|
+
if (input.sourceType != null && input.sourceType !== 'MANUAL')
|
|
88
|
+
invalid('汇率来源必须是 MANUAL', { value: input.sourceType });
|
|
89
|
+
return { year, month, usdToCnyRate: rate.toString(), sourceType: 'MANUAL' };
|
|
90
|
+
}
|
|
91
|
+
export function validateBankSettingsInput(input) {
|
|
92
|
+
const bankType = parseBankAccountType(input.bankType);
|
|
93
|
+
const result = { bankType, beneficiary: '', bankName: '', bankAddress: '', cnapsCode: '', accountNo: '', swiftCode: '' };
|
|
94
|
+
for (const [field, label] of [['beneficiary', 'Beneficiary'], ['bankName', 'Bank Name'], ['bankAddress', 'Bank Address'], ['cnapsCode', 'CNAPS Code'], ['accountNo', 'Account No.'], ['swiftCode', 'Swift Code']]) {
|
|
95
|
+
if (typeof input[field] !== 'string' || !input[field].trim())
|
|
96
|
+
invalid(`${label}为必填项`, { field });
|
|
97
|
+
result[field] = input[field].trim();
|
|
98
|
+
}
|
|
99
|
+
return result;
|
|
100
|
+
}
|
|
101
|
+
export function validateProfitSettingsInput(input) {
|
|
102
|
+
if ('ruleVersion' in input)
|
|
103
|
+
invalid('利润率公式版本固定,不允许编辑', { value: input.ruleVersion });
|
|
104
|
+
const status = parseProfitRuleStatus(input.status);
|
|
105
|
+
const minimumOrderProfitRate = decimal(input.minimumOrderProfitRate, '最低整单利润率');
|
|
106
|
+
const exchangeCostMinimum = decimal(input.exchangeCostMinimum, '换汇成本下限');
|
|
107
|
+
const exchangeCostMaximum = decimal(input.exchangeCostMaximum, '换汇成本上限');
|
|
108
|
+
if (minimumOrderProfitRate.lt(0))
|
|
109
|
+
invalid('最低整单利润率不能小于 0', { value: input.minimumOrderProfitRate });
|
|
110
|
+
if (exchangeCostMinimum.gt(exchangeCostMaximum))
|
|
111
|
+
invalid('换汇成本下限不能大于上限', { minimum: input.exchangeCostMinimum, maximum: input.exchangeCostMaximum });
|
|
112
|
+
return { status, minimumOrderProfitRate: minimumOrderProfitRate.toString(), exchangeCostMinimum: exchangeCostMinimum.toString(), exchangeCostMaximum: exchangeCostMaximum.toString() };
|
|
113
|
+
}
|
|
114
|
+
const RiskNoticeAllowedTags = new Set(['h1', 'h2', 'h3', 'h4', 'p', 'strong', 'b', 'ul', 'ol', 'li', 'br']);
|
|
115
|
+
export function sanitizeRiskNoticeContent(value) {
|
|
116
|
+
if (typeof value !== 'string')
|
|
117
|
+
invalid('风险提示内容必须是字符串', { value });
|
|
118
|
+
const $ = load(value, null, false);
|
|
119
|
+
$('script, style, img').remove();
|
|
120
|
+
const elements = $('*').toArray();
|
|
121
|
+
for (const element of elements)
|
|
122
|
+
$(element).removeAttr(Object.keys($(element).attr() ?? {}).join(' '));
|
|
123
|
+
for (const element of elements.reverse()) {
|
|
124
|
+
const tagName = String($(element).prop('tagName')).toLowerCase();
|
|
125
|
+
if (!RiskNoticeAllowedTags.has(tagName))
|
|
126
|
+
$(element).replaceWith($(element).contents());
|
|
127
|
+
}
|
|
128
|
+
return $.html().replace(/<\/?b>/g, match => match.startsWith('</') ? '</strong>' : '<strong>');
|
|
129
|
+
}
|
|
130
|
+
export function validateTaxRates(input, context = {}) {
|
|
131
|
+
return {
|
|
132
|
+
vatRate: taxRate(input.vatRate, 'vatRate', '增值税率', context),
|
|
133
|
+
refundRate: taxRate(input.refundRate, 'refundRate', '退税率', context)
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
export function validatePurchaseLineDiscriminators(input) {
|
|
137
|
+
const result = {};
|
|
138
|
+
if ('sourceType' in input)
|
|
139
|
+
result.sourceType = parseOptionalExplicitEnum(input.sourceType, PurchaseOrderLineSourceTypes, '采购商品来源类型');
|
|
140
|
+
if ('englishNameSource' in input)
|
|
141
|
+
result.englishNameSource = parseOptionalExplicitEnum(input.englishNameSource, EnglishNameSources, '英文名称来源');
|
|
142
|
+
if ('vatRateSource' in input)
|
|
143
|
+
result.vatRateSource = parseOptionalExplicitEnum(input.vatRateSource, VatRateSources, '增值税率来源');
|
|
144
|
+
if ('hsCodeStatus' in input)
|
|
145
|
+
result.hsCodeStatus = parseOptionalExplicitEnum(input.hsCodeStatus, HsCodeStatuses, '海关编码状态');
|
|
146
|
+
if ('hsCodeSource' in input)
|
|
147
|
+
result.hsCodeSource = parseOptionalExplicitEnum(input.hsCodeSource, HsCodeSources, '海关编码来源');
|
|
148
|
+
if ('refundRateSource' in input)
|
|
149
|
+
result.refundRateSource = parseOptionalExplicitEnum(input.refundRateSource, RefundRateSources, '退税率来源');
|
|
150
|
+
if ('refundValidationMethod' in input)
|
|
151
|
+
result.refundValidationMethod = parseOptionalExplicitEnum(input.refundValidationMethod, RefundValidationMethods, '退税校验方式');
|
|
152
|
+
return result;
|
|
153
|
+
}
|
|
154
|
+
function taxRate(value, field, label, context) {
|
|
155
|
+
if (value == null)
|
|
156
|
+
throw new DomainError(DomainErrorCodes.SALES_LINE_TAX_DATA_REQUIRED, `销售商品缺少${label}`, { missingFields: [field], ...context });
|
|
157
|
+
let parsed;
|
|
158
|
+
try {
|
|
159
|
+
parsed = new Decimal(value);
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
return invalidTaxRate(field, label, value, context);
|
|
163
|
+
}
|
|
164
|
+
if (!parsed.isFinite() || parsed.lt(0) || parsed.gt(1))
|
|
165
|
+
return invalidTaxRate(field, label, value, context);
|
|
166
|
+
return parsed.toString();
|
|
167
|
+
}
|
|
168
|
+
function invalidTaxRate(field, label, value, context) {
|
|
169
|
+
throw new DomainError(DomainErrorCodes.INVALID_TAX_RATE, `${label}必须是 0 至 1 之间的有限数值`, { field, value, ...context });
|
|
170
|
+
}
|
|
171
|
+
function parseExplicitEnum(value, allowed, label) {
|
|
172
|
+
if (typeof value !== 'string' || !allowed.some(item => item === value))
|
|
173
|
+
invalid(`${label}无效`, { value, allowed });
|
|
174
|
+
return value;
|
|
175
|
+
}
|
|
176
|
+
function parseOptionalExplicitEnum(value, allowed, label) {
|
|
177
|
+
if (value == null)
|
|
178
|
+
return null;
|
|
179
|
+
return parseExplicitEnum(value, allowed, label);
|
|
180
|
+
}
|
|
181
|
+
function finiteInteger(value, label) {
|
|
182
|
+
const parsed = typeof value === 'number' ? value : typeof value === 'string' && value.trim() ? Number(value) : Number.NaN;
|
|
183
|
+
if (!Number.isFinite(parsed) || !Number.isInteger(parsed))
|
|
184
|
+
invalid(`${label}必须是有限整数`, { value });
|
|
185
|
+
return parsed;
|
|
186
|
+
}
|
|
187
|
+
function positiveInteger(value, label, fallback) {
|
|
188
|
+
if (value == null)
|
|
189
|
+
return fallback;
|
|
190
|
+
const parsed = finiteInteger(value, label);
|
|
191
|
+
if (parsed < 1)
|
|
192
|
+
invalid(`${label}必须大于 0`, { value });
|
|
193
|
+
return parsed;
|
|
194
|
+
}
|
|
195
|
+
function record(value, label) {
|
|
196
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
197
|
+
invalid(`${label}必须是对象`, { value });
|
|
198
|
+
return value;
|
|
199
|
+
}
|
|
200
|
+
function optionalTextProperty(value, key) {
|
|
201
|
+
const item = value[key];
|
|
202
|
+
if (item == null || item === '')
|
|
203
|
+
return {};
|
|
204
|
+
if (typeof item !== 'string')
|
|
205
|
+
invalid(`${key}必须是字符串`, { value: item });
|
|
206
|
+
const text = item.trim();
|
|
207
|
+
return text ? { [key]: text } : {};
|
|
208
|
+
}
|
|
209
|
+
function optionalDateProperty(value, key) {
|
|
210
|
+
const property = optionalTextProperty(value, key);
|
|
211
|
+
const date = property[key];
|
|
212
|
+
if (date && !isCalendarDate(date))
|
|
213
|
+
invalid(`${key}必须是 YYYY-MM-DD 格式的有效日期`, { value: date });
|
|
214
|
+
return property;
|
|
215
|
+
}
|
|
216
|
+
function isCalendarDate(value) {
|
|
217
|
+
const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(value);
|
|
218
|
+
if (!match)
|
|
219
|
+
return false;
|
|
220
|
+
const year = Number(match[1]);
|
|
221
|
+
const month = Number(match[2]);
|
|
222
|
+
const day = Number(match[3]);
|
|
223
|
+
const date = new Date(Date.UTC(year, month - 1, day));
|
|
224
|
+
return date.getUTCFullYear() === year && date.getUTCMonth() === month - 1 && date.getUTCDate() === day;
|
|
225
|
+
}
|
|
226
|
+
function assertOnlyKeys(value, allowed, label) {
|
|
227
|
+
const unknown = Object.keys(value).filter(key => !allowed.includes(key));
|
|
228
|
+
if (unknown.length)
|
|
229
|
+
invalid(`${label}包含未知字段`, { unknown });
|
|
230
|
+
}
|
|
231
|
+
function decimal(value, label) {
|
|
232
|
+
try {
|
|
233
|
+
const parsed = new Decimal(value);
|
|
234
|
+
if (parsed.isFinite())
|
|
235
|
+
return parsed;
|
|
236
|
+
}
|
|
237
|
+
catch { }
|
|
238
|
+
return invalid(`${label}必须是有限数值`, { value });
|
|
239
|
+
}
|
|
240
|
+
function invalid(message, details) {
|
|
241
|
+
throw new DomainError(DomainErrorCodes.INVALID_INPUT, message, details);
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=runtime-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-validation.js","sourceRoot":"","sources":["../../src/lib/runtime-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,29 +1,77 @@
|
|
|
1
1
|
import { DataSource } from 'typeorm';
|
|
2
|
+
import { Decimal } from 'decimal.js';
|
|
2
3
|
import { GeneratedSalesFile } from './entities/index.js';
|
|
3
4
|
import { TradeComplianceWorkbenchService } from './workbench.service.js';
|
|
4
5
|
import { TranslationProvider } from './adapters/translation.provider.js';
|
|
5
6
|
import { TradeComplianceFileStorage } from './adapters/file-storage.js';
|
|
6
|
-
import { type
|
|
7
|
+
import { type NegativeLineProfitWarning, type RequestScope, type SalesFileGenerationInput, type SalesFilePreflightResult, type SalesFileTranslationFailure, type SalesFileType } from './types.js';
|
|
8
|
+
export declare const MAX_EDITED_WORKBOOK_BYTES: number;
|
|
9
|
+
export declare const MAX_EDITED_WORKBOOK_ZIP_ENTRIES = 2048;
|
|
10
|
+
export declare const MAX_EDITED_WORKBOOK_ZIP_UNCOMPRESSED_BYTES: number;
|
|
11
|
+
export declare const OLD_SALES_FILE_CLEANUP_DELAY_MS = 30000;
|
|
7
12
|
export declare class SalesFileService {
|
|
8
13
|
private readonly dataSource;
|
|
9
14
|
private readonly workbench;
|
|
10
15
|
private readonly storage;
|
|
11
16
|
private readonly translator;
|
|
12
17
|
constructor(dataSource: DataSource, workbench: TradeComplianceWorkbenchService, storage: TradeComplianceFileStorage, translator: TranslationProvider);
|
|
13
|
-
|
|
18
|
+
preflight(scope: RequestScope, input: SalesFileGenerationInput): Promise<SalesFilePreflightResult>;
|
|
19
|
+
generate(scope: RequestScope, input: SalesFileGenerationInput): Promise<{
|
|
20
|
+
translationFailures: SalesFileTranslationFailure[];
|
|
14
21
|
customerContractId: string;
|
|
15
22
|
purchaseOrderId: string;
|
|
23
|
+
salesOrderNoSnapshot: string;
|
|
16
24
|
fileType: SalesFileType;
|
|
17
|
-
|
|
18
|
-
|
|
25
|
+
documentNo: string | null;
|
|
26
|
+
fileName: string;
|
|
27
|
+
storageFileId: string;
|
|
28
|
+
editVersion: number;
|
|
29
|
+
templateVersion: string;
|
|
30
|
+
templateChecksum: string;
|
|
31
|
+
generationSnapshotVersion: string;
|
|
32
|
+
generationSnapshot: Record<string, unknown>;
|
|
33
|
+
generationWarnings: Array<Record<string, unknown>> | null;
|
|
34
|
+
pricingProfitRate: string;
|
|
35
|
+
complianceProfitRate: string;
|
|
36
|
+
exchangeCost: string | null;
|
|
37
|
+
profitRuleSnapshot: Record<string, unknown>;
|
|
38
|
+
bankType: import("./types.js").BankAccountType | null;
|
|
39
|
+
bankSnapshot: Record<string, unknown> | null;
|
|
40
|
+
generatedById: string | null;
|
|
41
|
+
generatedAt: Date;
|
|
42
|
+
lastEditedById: string | null;
|
|
43
|
+
lastEditedAt: Date | null;
|
|
44
|
+
deletedAt: Date | null;
|
|
45
|
+
deletedById: string | null;
|
|
46
|
+
deleteOperation: import("./types.js").DeleteOperation | null;
|
|
47
|
+
createdById: string | null;
|
|
48
|
+
updatedById: string | null;
|
|
49
|
+
updatedAt: Date;
|
|
50
|
+
createdAt: Date;
|
|
51
|
+
id: string;
|
|
52
|
+
tenantId: string;
|
|
53
|
+
organizationId: string;
|
|
54
|
+
}>;
|
|
55
|
+
private evaluate;
|
|
19
56
|
download(scope: RequestScope, id: string): Promise<{
|
|
20
57
|
item: GeneratedSalesFile;
|
|
21
58
|
buffer: Buffer<ArrayBufferLike>;
|
|
22
59
|
}>;
|
|
23
|
-
saveEditedWorkbook(scope: RequestScope, id: string, buffer: Buffer
|
|
60
|
+
saveEditedWorkbook(scope: RequestScope, id: string, buffer: Buffer, expected: {
|
|
61
|
+
editVersion: number;
|
|
62
|
+
expectedStorageFileId: string;
|
|
63
|
+
}): Promise<GeneratedSalesFile>;
|
|
64
|
+
private scheduleOldBlobCleanup;
|
|
24
65
|
private translateDynamicFields;
|
|
25
66
|
private fillWorkbook;
|
|
67
|
+
private readCompanyLogo;
|
|
26
68
|
private required;
|
|
27
69
|
}
|
|
28
|
-
export declare function
|
|
70
|
+
export declare function negativeProfitWarnings(complianceLines: Array<{
|
|
71
|
+
profitCny: Decimal;
|
|
72
|
+
}>, derivedLines: Array<{
|
|
73
|
+
purchaseOrderLineId: string;
|
|
74
|
+
productName: string;
|
|
75
|
+
}>): NegativeLineProfitWarning[];
|
|
76
|
+
export declare function renderSalesWorkbook(type: SalesFileType, data: any, logo?: Buffer): Promise<Buffer>;
|
|
29
77
|
//# sourceMappingURL=sales-file.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sales-file.service.d.ts","sourceRoot":"","sources":["../../src/lib/sales-file.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAU,MAAM,SAAS,CAAA;AAM5C,OAAO,EAA4F,kBAAkB,EAAiF,MAAM,qBAAqB,CAAA;AACjO,OAAO,EAAE,+BAA+B,EAAE,MAAM,wBAAwB,CAAA;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAA;AACxE,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAA;AAGvE,OAAO,
|
|
1
|
+
{"version":3,"file":"sales-file.service.d.ts","sourceRoot":"","sources":["../../src/lib/sales-file.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAU,MAAM,SAAS,CAAA;AAM5C,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,EAA4F,kBAAkB,EAAiF,MAAM,qBAAqB,CAAA;AACjO,OAAO,EAAE,+BAA+B,EAAE,MAAM,wBAAwB,CAAA;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAA;AACxE,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAA;AAGvE,OAAO,EAAuD,KAAK,yBAAyB,EAAE,KAAK,YAAY,EAAE,KAAK,wBAAwB,EAAE,KAAK,wBAAwB,EAAE,KAAK,2BAA2B,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAA;AAKvP,eAAO,MAAM,yBAAyB,QAAmB,CAAA;AACzD,eAAO,MAAM,+BAA+B,OAAO,CAAA;AACnD,eAAO,MAAM,0CAA0C,QAAoB,CAAA;AAC3E,eAAO,MAAM,+BAA+B,QAAS,CAAA;AAUrD,qBACa,gBAAgB;IAEL,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC/C,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAHU,UAAU,EAAE,UAAU,EAC1C,SAAS,EAAE,+BAA+B,EAC1C,OAAO,EAAE,0BAA0B,EACnC,UAAU,EAAE,mBAAmB;IAG5C,SAAS,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAWlG,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YA2BrD,QAAQ;IAyDhB,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM;;;;IAKxC,kBAAkB,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,qBAAqB,EAAE,MAAM,CAAA;KAAE;IAqB1I,OAAO,CAAC,sBAAsB;YAKhB,sBAAsB;YAetB,YAAY;YAIZ,eAAe;YAKf,QAAQ;CAKvB;AA6BD,wBAAgB,sBAAsB,CAAC,eAAe,EAAE,KAAK,CAAC;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC;IAAE,mBAAmB,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,yBAAyB,EAAE,CAE7L;AA6CD,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAaxG"}
|