@chenchaolong/plugin-trade-compliance-workbench 1.0.1 → 1.0.3

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.
Files changed (196) hide show
  1. package/README.md +46 -1
  2. package/dist/assets/branding/yuneec-logo.png +0 -0
  3. package/dist/assets/templates/CI.xlsx +0 -0
  4. package/dist/assets/templates/CUSTOMS_DECLARATION.xlsx +0 -0
  5. package/dist/assets/templates/PI.xlsx +0 -0
  6. package/dist/assets/templates/PL.xlsx +0 -0
  7. package/dist/index.d.ts +14 -0
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/lib/adapters/file-storage.d.ts +4 -2
  10. package/dist/lib/adapters/file-storage.d.ts.map +1 -1
  11. package/dist/lib/adapters/file-storage.js +25 -10
  12. package/dist/lib/adapters/file-storage.js.map +1 -1
  13. package/dist/lib/adapters/hsbianma.provider.d.ts +1 -0
  14. package/dist/lib/adapters/hsbianma.provider.d.ts.map +1 -1
  15. package/dist/lib/adapters/hsbianma.provider.js +32 -3
  16. package/dist/lib/adapters/hsbianma.provider.js.map +1 -1
  17. package/dist/lib/adapters/translation.provider.d.ts +3 -0
  18. package/dist/lib/adapters/translation.provider.d.ts.map +1 -1
  19. package/dist/lib/adapters/translation.provider.js +15 -6
  20. package/dist/lib/adapters/translation.provider.js.map +1 -1
  21. package/dist/lib/constants.d.ts +1 -0
  22. package/dist/lib/constants.d.ts.map +1 -1
  23. package/dist/lib/constants.js +1 -0
  24. package/dist/lib/constants.js.map +1 -1
  25. package/dist/lib/demo-data.definitions.d.ts +28 -0
  26. package/dist/lib/demo-data.definitions.d.ts.map +1 -0
  27. package/dist/lib/demo-data.definitions.js +236 -0
  28. package/dist/lib/demo-data.definitions.js.map +1 -0
  29. package/dist/lib/demo-data.entity.d.ts +9 -0
  30. package/dist/lib/demo-data.entity.d.ts.map +1 -0
  31. package/dist/lib/demo-data.entity.js +24 -0
  32. package/dist/lib/demo-data.entity.js.map +1 -0
  33. package/dist/lib/demo-data.ids.d.ts +4 -0
  34. package/dist/lib/demo-data.ids.d.ts.map +1 -0
  35. package/dist/lib/demo-data.ids.js +19 -0
  36. package/dist/lib/demo-data.ids.js.map +1 -0
  37. package/dist/lib/demo-data.service.d.ts +26 -0
  38. package/dist/lib/demo-data.service.d.ts.map +1 -0
  39. package/dist/lib/demo-data.service.js +124 -0
  40. package/dist/lib/demo-data.service.js.map +1 -0
  41. package/dist/lib/domain/default-settings.d.ts +1 -0
  42. package/dist/lib/domain/default-settings.d.ts.map +1 -1
  43. package/dist/lib/domain/default-settings.js +1 -0
  44. package/dist/lib/domain/default-settings.js.map +1 -1
  45. package/dist/lib/domain/risk-notice.d.ts +59 -0
  46. package/dist/lib/domain/risk-notice.d.ts.map +1 -0
  47. package/dist/lib/domain/risk-notice.js +30 -0
  48. package/dist/lib/domain/risk-notice.js.map +1 -0
  49. package/dist/lib/entities/catalog.entity.d.ts.map +1 -1
  50. package/dist/lib/entities/catalog.entity.js +4 -2
  51. package/dist/lib/entities/catalog.entity.js.map +1 -1
  52. package/dist/lib/entities/customer.entity.d.ts +9 -2
  53. package/dist/lib/entities/customer.entity.d.ts.map +1 -1
  54. package/dist/lib/entities/customer.entity.js +29 -1
  55. package/dist/lib/entities/customer.entity.js.map +1 -1
  56. package/dist/lib/entities/index.d.ts +2 -2
  57. package/dist/lib/entities/index.d.ts.map +1 -1
  58. package/dist/lib/entities/index.js +2 -2
  59. package/dist/lib/entities/index.js.map +1 -1
  60. package/dist/lib/entities/procurement.entity.d.ts +6 -4
  61. package/dist/lib/entities/procurement.entity.d.ts.map +1 -1
  62. package/dist/lib/entities/procurement.entity.js +9 -1
  63. package/dist/lib/entities/procurement.entity.js.map +1 -1
  64. package/dist/lib/entities/settings.entity.d.ts +12 -2
  65. package/dist/lib/entities/settings.entity.d.ts.map +1 -1
  66. package/dist/lib/entities/settings.entity.js +40 -0
  67. package/dist/lib/entities/settings.entity.js.map +1 -1
  68. package/dist/lib/entities/shared.entity.d.ts +10 -5
  69. package/dist/lib/entities/shared.entity.d.ts.map +1 -1
  70. package/dist/lib/entities/shared.entity.js +22 -1
  71. package/dist/lib/entities/shared.entity.js.map +1 -1
  72. package/dist/lib/remote-components/trade-compliance-workbench/app.css +1 -0
  73. package/dist/lib/remote-components/trade-compliance-workbench/app.js +63 -277
  74. package/dist/lib/remote-components/trade-compliance-workbench/editor-source.mjs +2 -1
  75. package/dist/lib/remote-components/trade-compliance-workbench/editor.js +171 -128
  76. package/dist/lib/remote-ui/analytics-contracts.d.ts +106 -0
  77. package/dist/lib/remote-ui/analytics-contracts.d.ts.map +1 -0
  78. package/dist/lib/remote-ui/analytics-contracts.js +4 -0
  79. package/dist/lib/remote-ui/analytics-contracts.js.map +1 -0
  80. package/dist/lib/remote-ui/app-source.d.ts +2 -0
  81. package/dist/lib/remote-ui/app-source.d.ts.map +1 -0
  82. package/dist/lib/remote-ui/app-source.js +796 -0
  83. package/dist/lib/remote-ui/app-source.js.map +1 -0
  84. package/dist/lib/remote-ui/bridge.d.ts +36 -0
  85. package/dist/lib/remote-ui/bridge.d.ts.map +1 -0
  86. package/dist/lib/remote-ui/bridge.js +159 -0
  87. package/dist/lib/remote-ui/bridge.js.map +1 -0
  88. package/dist/lib/remote-ui/components/data-grid.d.ts +34 -0
  89. package/dist/lib/remote-ui/components/data-grid.d.ts.map +1 -0
  90. package/dist/lib/remote-ui/components/data-grid.js +59 -0
  91. package/dist/lib/remote-ui/components/data-grid.js.map +1 -0
  92. package/dist/lib/remote-ui/components/forms.d.ts +63 -0
  93. package/dist/lib/remote-ui/components/forms.d.ts.map +1 -0
  94. package/dist/lib/remote-ui/components/forms.js +117 -0
  95. package/dist/lib/remote-ui/components/forms.js.map +1 -0
  96. package/dist/lib/remote-ui/components/layout.d.ts +25 -0
  97. package/dist/lib/remote-ui/components/layout.d.ts.map +1 -0
  98. package/dist/lib/remote-ui/components/layout.js +66 -0
  99. package/dist/lib/remote-ui/components/layout.js.map +1 -0
  100. package/dist/lib/remote-ui/contract-import.d.ts +82 -0
  101. package/dist/lib/remote-ui/contract-import.d.ts.map +1 -0
  102. package/dist/lib/remote-ui/contract-import.js +102 -0
  103. package/dist/lib/remote-ui/contract-import.js.map +1 -0
  104. package/dist/lib/remote-ui/contracts.d.ts +257 -0
  105. package/dist/lib/remote-ui/contracts.d.ts.map +1 -0
  106. package/dist/lib/remote-ui/contracts.js +12 -0
  107. package/dist/lib/remote-ui/contracts.js.map +1 -0
  108. package/dist/lib/remote-ui/customer-contract-contracts.d.ts +227 -0
  109. package/dist/lib/remote-ui/customer-contract-contracts.d.ts.map +1 -0
  110. package/dist/lib/remote-ui/customer-contract-contracts.js +10 -0
  111. package/dist/lib/remote-ui/customer-contract-contracts.js.map +1 -0
  112. package/dist/lib/remote-ui/model.d.ts +31 -0
  113. package/dist/lib/remote-ui/model.d.ts.map +1 -0
  114. package/dist/lib/remote-ui/model.js +248 -0
  115. package/dist/lib/remote-ui/model.js.map +1 -0
  116. package/dist/lib/remote-ui/pages/analytics.d.ts +12 -0
  117. package/dist/lib/remote-ui/pages/analytics.d.ts.map +1 -0
  118. package/dist/lib/remote-ui/pages/analytics.js +123 -0
  119. package/dist/lib/remote-ui/pages/analytics.js.map +1 -0
  120. package/dist/lib/remote-ui/pages/catalogs.d.ts +225 -0
  121. package/dist/lib/remote-ui/pages/catalogs.d.ts.map +1 -0
  122. package/dist/lib/remote-ui/pages/catalogs.js +572 -0
  123. package/dist/lib/remote-ui/pages/catalogs.js.map +1 -0
  124. package/dist/lib/remote-ui/pages/contracts.d.ts +80 -0
  125. package/dist/lib/remote-ui/pages/contracts.d.ts.map +1 -0
  126. package/dist/lib/remote-ui/pages/contracts.js +396 -0
  127. package/dist/lib/remote-ui/pages/contracts.js.map +1 -0
  128. package/dist/lib/remote-ui/pages/files.d.ts +31 -0
  129. package/dist/lib/remote-ui/pages/files.d.ts.map +1 -0
  130. package/dist/lib/remote-ui/pages/files.js +64 -0
  131. package/dist/lib/remote-ui/pages/files.js.map +1 -0
  132. package/dist/lib/remote-ui/pages/home.d.ts +71 -0
  133. package/dist/lib/remote-ui/pages/home.d.ts.map +1 -0
  134. package/dist/lib/remote-ui/pages/home.js +136 -0
  135. package/dist/lib/remote-ui/pages/home.js.map +1 -0
  136. package/dist/lib/remote-ui/pages/procurement.d.ts +36 -0
  137. package/dist/lib/remote-ui/pages/procurement.d.ts.map +1 -0
  138. package/dist/lib/remote-ui/pages/procurement.js +370 -0
  139. package/dist/lib/remote-ui/pages/procurement.js.map +1 -0
  140. package/dist/lib/remote-ui/pages/sales.d.ts +12 -0
  141. package/dist/lib/remote-ui/pages/sales.d.ts.map +1 -0
  142. package/dist/lib/remote-ui/pages/sales.js +106 -0
  143. package/dist/lib/remote-ui/pages/sales.js.map +1 -0
  144. package/dist/lib/remote-ui/pages/settings.d.ts +34 -0
  145. package/dist/lib/remote-ui/pages/settings.d.ts.map +1 -0
  146. package/dist/lib/remote-ui/pages/settings.js +259 -0
  147. package/dist/lib/remote-ui/pages/settings.js.map +1 -0
  148. package/dist/lib/remote-ui/procurement-contracts.d.ts +177 -0
  149. package/dist/lib/remote-ui/procurement-contracts.d.ts.map +1 -0
  150. package/dist/lib/remote-ui/procurement-contracts.js +2 -0
  151. package/dist/lib/remote-ui/procurement-contracts.js.map +1 -0
  152. package/dist/lib/remote-ui/sales-contracts.d.ts +133 -0
  153. package/dist/lib/remote-ui/sales-contracts.d.ts.map +1 -0
  154. package/dist/lib/remote-ui/sales-contracts.js +2 -0
  155. package/dist/lib/remote-ui/sales-contracts.js.map +1 -0
  156. package/dist/lib/remote-ui/settings-contracts.d.ts +114 -0
  157. package/dist/lib/remote-ui/settings-contracts.d.ts.map +1 -0
  158. package/dist/lib/remote-ui/settings-contracts.js +6 -0
  159. package/dist/lib/remote-ui/settings-contracts.js.map +1 -0
  160. package/dist/lib/remote-ui/upload-policy.d.ts +18 -0
  161. package/dist/lib/remote-ui/upload-policy.d.ts.map +1 -0
  162. package/dist/lib/remote-ui/upload-policy.js +56 -0
  163. package/dist/lib/remote-ui/upload-policy.js.map +1 -0
  164. package/dist/lib/runtime-validation.d.ts +61 -0
  165. package/dist/lib/runtime-validation.d.ts.map +1 -0
  166. package/dist/lib/runtime-validation.js +243 -0
  167. package/dist/lib/runtime-validation.js.map +1 -0
  168. package/dist/lib/sales-file.service.d.ts +54 -6
  169. package/dist/lib/sales-file.service.d.ts.map +1 -1
  170. package/dist/lib/sales-file.service.js +278 -33
  171. package/dist/lib/sales-file.service.js.map +1 -1
  172. package/dist/lib/trade-compliance.config.d.ts +32 -0
  173. package/dist/lib/trade-compliance.config.d.ts.map +1 -1
  174. package/dist/lib/trade-compliance.config.js +16 -4
  175. package/dist/lib/trade-compliance.config.js.map +1 -1
  176. package/dist/lib/types.d.ts +253 -1
  177. package/dist/lib/types.d.ts.map +1 -1
  178. package/dist/lib/types.js +24 -0
  179. package/dist/lib/types.js.map +1 -1
  180. package/dist/lib/workbench-view.provider.d.ts +675 -38
  181. package/dist/lib/workbench-view.provider.d.ts.map +1 -1
  182. package/dist/lib/workbench-view.provider.js +418 -42
  183. package/dist/lib/workbench-view.provider.js.map +1 -1
  184. package/dist/lib/workbench.middleware.d.ts +70 -19
  185. package/dist/lib/workbench.middleware.d.ts.map +1 -1
  186. package/dist/lib/workbench.middleware.js +5 -1
  187. package/dist/lib/workbench.middleware.js.map +1 -1
  188. package/dist/lib/workbench.plugin.d.ts.map +1 -1
  189. package/dist/lib/workbench.plugin.js +6 -4
  190. package/dist/lib/workbench.plugin.js.map +1 -1
  191. package/dist/lib/workbench.service.d.ts +629 -48
  192. package/dist/lib/workbench.service.d.ts.map +1 -1
  193. package/dist/lib/workbench.service.js +1818 -300
  194. package/dist/lib/workbench.service.js.map +1 -1
  195. package/package.json +15 -4
  196. 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 BankAccountType, type RequestScope, type SalesFileType } from './types.js';
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
- generate(scope: RequestScope, input: {
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
- bankType?: BankAccountType;
18
- }): Promise<GeneratedSalesFile>;
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): Promise<GeneratedSalesFile>;
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 renderSalesWorkbook(type: SalesFileType, data: any): Promise<Buffer>;
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,EAAiC,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAA;AAKvH,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,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE;QAAE,kBAAkB,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,aAAa,CAAC;QAAC,QAAQ,CAAC,EAAE,eAAe,CAAA;KAAE;IA+CjJ,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM;;;;IAKxC,kBAAkB,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;YAQ1D,sBAAsB;YAetB,YAAY;YAIZ,QAAQ;CAKvB;AAqBD,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAWzF"}
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"}