@chenchaolong/plugin-trade-compliance-workbench 1.0.1 → 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.
Files changed (194) 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-ui/analytics-contracts.d.ts +106 -0
  75. package/dist/lib/remote-ui/analytics-contracts.d.ts.map +1 -0
  76. package/dist/lib/remote-ui/analytics-contracts.js +4 -0
  77. package/dist/lib/remote-ui/analytics-contracts.js.map +1 -0
  78. package/dist/lib/remote-ui/app-source.d.ts +2 -0
  79. package/dist/lib/remote-ui/app-source.d.ts.map +1 -0
  80. package/dist/lib/remote-ui/app-source.js +753 -0
  81. package/dist/lib/remote-ui/app-source.js.map +1 -0
  82. package/dist/lib/remote-ui/bridge.d.ts +36 -0
  83. package/dist/lib/remote-ui/bridge.d.ts.map +1 -0
  84. package/dist/lib/remote-ui/bridge.js +159 -0
  85. package/dist/lib/remote-ui/bridge.js.map +1 -0
  86. package/dist/lib/remote-ui/components/data-grid.d.ts +34 -0
  87. package/dist/lib/remote-ui/components/data-grid.d.ts.map +1 -0
  88. package/dist/lib/remote-ui/components/data-grid.js +59 -0
  89. package/dist/lib/remote-ui/components/data-grid.js.map +1 -0
  90. package/dist/lib/remote-ui/components/forms.d.ts +63 -0
  91. package/dist/lib/remote-ui/components/forms.d.ts.map +1 -0
  92. package/dist/lib/remote-ui/components/forms.js +117 -0
  93. package/dist/lib/remote-ui/components/forms.js.map +1 -0
  94. package/dist/lib/remote-ui/components/layout.d.ts +34 -0
  95. package/dist/lib/remote-ui/components/layout.d.ts.map +1 -0
  96. package/dist/lib/remote-ui/components/layout.js +89 -0
  97. package/dist/lib/remote-ui/components/layout.js.map +1 -0
  98. package/dist/lib/remote-ui/contract-import.d.ts +82 -0
  99. package/dist/lib/remote-ui/contract-import.d.ts.map +1 -0
  100. package/dist/lib/remote-ui/contract-import.js +102 -0
  101. package/dist/lib/remote-ui/contract-import.js.map +1 -0
  102. package/dist/lib/remote-ui/contracts.d.ts +257 -0
  103. package/dist/lib/remote-ui/contracts.d.ts.map +1 -0
  104. package/dist/lib/remote-ui/contracts.js +12 -0
  105. package/dist/lib/remote-ui/contracts.js.map +1 -0
  106. package/dist/lib/remote-ui/customer-contract-contracts.d.ts +227 -0
  107. package/dist/lib/remote-ui/customer-contract-contracts.d.ts.map +1 -0
  108. package/dist/lib/remote-ui/customer-contract-contracts.js +10 -0
  109. package/dist/lib/remote-ui/customer-contract-contracts.js.map +1 -0
  110. package/dist/lib/remote-ui/model.d.ts +31 -0
  111. package/dist/lib/remote-ui/model.d.ts.map +1 -0
  112. package/dist/lib/remote-ui/model.js +248 -0
  113. package/dist/lib/remote-ui/model.js.map +1 -0
  114. package/dist/lib/remote-ui/pages/analytics.d.ts +12 -0
  115. package/dist/lib/remote-ui/pages/analytics.d.ts.map +1 -0
  116. package/dist/lib/remote-ui/pages/analytics.js +123 -0
  117. package/dist/lib/remote-ui/pages/analytics.js.map +1 -0
  118. package/dist/lib/remote-ui/pages/catalogs.d.ts +225 -0
  119. package/dist/lib/remote-ui/pages/catalogs.d.ts.map +1 -0
  120. package/dist/lib/remote-ui/pages/catalogs.js +572 -0
  121. package/dist/lib/remote-ui/pages/catalogs.js.map +1 -0
  122. package/dist/lib/remote-ui/pages/contracts.d.ts +80 -0
  123. package/dist/lib/remote-ui/pages/contracts.d.ts.map +1 -0
  124. package/dist/lib/remote-ui/pages/contracts.js +396 -0
  125. package/dist/lib/remote-ui/pages/contracts.js.map +1 -0
  126. package/dist/lib/remote-ui/pages/files.d.ts +31 -0
  127. package/dist/lib/remote-ui/pages/files.d.ts.map +1 -0
  128. package/dist/lib/remote-ui/pages/files.js +64 -0
  129. package/dist/lib/remote-ui/pages/files.js.map +1 -0
  130. package/dist/lib/remote-ui/pages/home.d.ts +71 -0
  131. package/dist/lib/remote-ui/pages/home.d.ts.map +1 -0
  132. package/dist/lib/remote-ui/pages/home.js +136 -0
  133. package/dist/lib/remote-ui/pages/home.js.map +1 -0
  134. package/dist/lib/remote-ui/pages/procurement.d.ts +36 -0
  135. package/dist/lib/remote-ui/pages/procurement.d.ts.map +1 -0
  136. package/dist/lib/remote-ui/pages/procurement.js +370 -0
  137. package/dist/lib/remote-ui/pages/procurement.js.map +1 -0
  138. package/dist/lib/remote-ui/pages/sales.d.ts +12 -0
  139. package/dist/lib/remote-ui/pages/sales.d.ts.map +1 -0
  140. package/dist/lib/remote-ui/pages/sales.js +106 -0
  141. package/dist/lib/remote-ui/pages/sales.js.map +1 -0
  142. package/dist/lib/remote-ui/pages/settings.d.ts +34 -0
  143. package/dist/lib/remote-ui/pages/settings.d.ts.map +1 -0
  144. package/dist/lib/remote-ui/pages/settings.js +259 -0
  145. package/dist/lib/remote-ui/pages/settings.js.map +1 -0
  146. package/dist/lib/remote-ui/procurement-contracts.d.ts +177 -0
  147. package/dist/lib/remote-ui/procurement-contracts.d.ts.map +1 -0
  148. package/dist/lib/remote-ui/procurement-contracts.js +2 -0
  149. package/dist/lib/remote-ui/procurement-contracts.js.map +1 -0
  150. package/dist/lib/remote-ui/sales-contracts.d.ts +133 -0
  151. package/dist/lib/remote-ui/sales-contracts.d.ts.map +1 -0
  152. package/dist/lib/remote-ui/sales-contracts.js +2 -0
  153. package/dist/lib/remote-ui/sales-contracts.js.map +1 -0
  154. package/dist/lib/remote-ui/settings-contracts.d.ts +114 -0
  155. package/dist/lib/remote-ui/settings-contracts.d.ts.map +1 -0
  156. package/dist/lib/remote-ui/settings-contracts.js +6 -0
  157. package/dist/lib/remote-ui/settings-contracts.js.map +1 -0
  158. package/dist/lib/remote-ui/upload-policy.d.ts +18 -0
  159. package/dist/lib/remote-ui/upload-policy.d.ts.map +1 -0
  160. package/dist/lib/remote-ui/upload-policy.js +56 -0
  161. package/dist/lib/remote-ui/upload-policy.js.map +1 -0
  162. package/dist/lib/runtime-validation.d.ts +61 -0
  163. package/dist/lib/runtime-validation.d.ts.map +1 -0
  164. package/dist/lib/runtime-validation.js +243 -0
  165. package/dist/lib/runtime-validation.js.map +1 -0
  166. package/dist/lib/sales-file.service.d.ts +54 -6
  167. package/dist/lib/sales-file.service.d.ts.map +1 -1
  168. package/dist/lib/sales-file.service.js +278 -33
  169. package/dist/lib/sales-file.service.js.map +1 -1
  170. package/dist/lib/trade-compliance.config.d.ts +32 -0
  171. package/dist/lib/trade-compliance.config.d.ts.map +1 -1
  172. package/dist/lib/trade-compliance.config.js +16 -4
  173. package/dist/lib/trade-compliance.config.js.map +1 -1
  174. package/dist/lib/types.d.ts +253 -1
  175. package/dist/lib/types.d.ts.map +1 -1
  176. package/dist/lib/types.js +24 -0
  177. package/dist/lib/types.js.map +1 -1
  178. package/dist/lib/workbench-view.provider.d.ts +675 -38
  179. package/dist/lib/workbench-view.provider.d.ts.map +1 -1
  180. package/dist/lib/workbench-view.provider.js +411 -40
  181. package/dist/lib/workbench-view.provider.js.map +1 -1
  182. package/dist/lib/workbench.middleware.d.ts +70 -19
  183. package/dist/lib/workbench.middleware.d.ts.map +1 -1
  184. package/dist/lib/workbench.middleware.js +5 -1
  185. package/dist/lib/workbench.middleware.js.map +1 -1
  186. package/dist/lib/workbench.plugin.d.ts.map +1 -1
  187. package/dist/lib/workbench.plugin.js +6 -4
  188. package/dist/lib/workbench.plugin.js.map +1 -1
  189. package/dist/lib/workbench.service.d.ts +629 -48
  190. package/dist/lib/workbench.service.d.ts.map +1 -1
  191. package/dist/lib/workbench.service.js +1818 -300
  192. package/dist/lib/workbench.service.js.map +1 -1
  193. package/package.json +15 -4
  194. package/scripts/seed-demo-data.mjs +138 -0
@@ -0,0 +1,117 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { getConfiguredUploadPolicy, validateUploadFile } from '../upload-policy.js';
4
+ export function Modal({ open, title, size = 'normal', children, footer, onClose }) {
5
+ const titleId = React.useId();
6
+ const dialogRef = React.useRef(null);
7
+ React.useEffect(() => {
8
+ if (!open)
9
+ return;
10
+ const dialog = dialogRef.current;
11
+ const previouslyFocused = document.activeElement instanceof HTMLElement ? document.activeElement : null;
12
+ const firstFocusable = focusableElements(dialog)[0];
13
+ (firstFocusable ?? dialog)?.focus();
14
+ return () => previouslyFocused?.focus();
15
+ }, [open]);
16
+ if (!open)
17
+ return null;
18
+ return (_jsx("div", { className: "tcw-modal-backdrop", role: "presentation", children: _jsxs("section", { ref: dialogRef, className: `tcw-modal tcw-modal--${size}`, role: "dialog", "aria-modal": "true", "aria-labelledby": titleId, tabIndex: -1, onKeyDown: (event) => handleModalKeyDown(event, dialogRef.current, onClose), children: [_jsxs("header", { children: [_jsx("h2", { id: titleId, children: title }), _jsx("button", { type: "button", className: "tcw-icon-button", title: "\u5173\u95ED", "aria-label": "\u5173\u95ED", onClick: onClose, children: _jsx("i", { className: "ri-close-line", "aria-hidden": "true" }) })] }), _jsx("div", { className: "tcw-modal-body", children: children }), footer && _jsx("footer", { children: footer })] }) }));
19
+ }
20
+ export function FieldGrid({ children, columns = 2 }) {
21
+ return _jsx("div", { className: `tcw-field-grid tcw-field-grid--${columns}`, children: children });
22
+ }
23
+ export function FormField({ label, required, full, hint, children }) {
24
+ return _jsxs("label", { className: `tcw-form-field${full ? ' tcw-form-field--full' : ''}`, children: [_jsxs("span", { children: [required && _jsx("b", { children: "*" }), label] }), children, hint && _jsx("small", { children: hint })] });
25
+ }
26
+ export function ReviewSplit({ editor, source, editorTitle = '识别内容', sourceTitle = '源文件内容' }) {
27
+ return _jsxs("div", { className: "tcw-review-split", children: [_jsxs("section", { children: [_jsx("h3", { children: editorTitle }), editor] }), _jsxs("section", { children: [_jsx("h3", { children: sourceTitle }), source] })] });
28
+ }
29
+ export function UploadZone({ accept, disabled, onFile, onError }) {
30
+ const uploadPolicy = getConfiguredUploadPolicy();
31
+ const selectFile = (file) => {
32
+ try {
33
+ validateUploadFile(file, accept);
34
+ onFile(file);
35
+ }
36
+ catch (error) {
37
+ const message = error instanceof Error ? error.message : '文件校验失败';
38
+ if (onError)
39
+ onError(message);
40
+ else
41
+ throw error;
42
+ }
43
+ };
44
+ const onDragOver = (event) => {
45
+ event.preventDefault();
46
+ if (!disabled)
47
+ event.dataTransfer.dropEffect = 'copy';
48
+ };
49
+ const onDrop = (event) => {
50
+ event.preventDefault();
51
+ if (disabled)
52
+ return;
53
+ const file = event.dataTransfer.files?.[0];
54
+ if (file)
55
+ selectFile(file);
56
+ };
57
+ return (_jsxs("label", { className: `tcw-upload-zone${disabled ? ' is-disabled' : ''}`, "aria-disabled": disabled, onDragOver: onDragOver, onDrop: onDrop, children: [_jsx("i", { className: "ri-upload-cloud-2-line", "aria-hidden": "true" }), _jsx("strong", { children: "\u70B9\u51FB\u6216\u62D6\u62FD\u6587\u4EF6\u5230\u6B64\u5904\u4E0A\u4F20" }), _jsxs("span", { children: ["\u652F\u6301 PDF\u3001Word\u3001Excel \u548C\u5E38\u89C1\u56FE\u7247\u683C\u5F0F\uFF0C\u5355\u4E2A\u6587\u4EF6\u4E0D\u8D85\u8FC7 ", uploadPolicy.maxUploadMb, " MB"] }), _jsx("input", { type: "file", accept: accept, disabled: disabled, onChange: (event) => { const file = event.target.files?.[0]; if (file)
58
+ selectFile(file); } })] }));
59
+ }
60
+ export function resolveModalKeyboardAction({ key, shiftKey, activeIndex, focusableCount }) {
61
+ if (key === 'Escape')
62
+ return 'close';
63
+ if (key !== 'Tab' || focusableCount < 1)
64
+ return 'none';
65
+ if (shiftKey && activeIndex <= 0)
66
+ return 'last';
67
+ if (!shiftKey && activeIndex >= focusableCount - 1)
68
+ return 'first';
69
+ return 'none';
70
+ }
71
+ function handleModalKeyDown(event, dialog, onClose) {
72
+ const focusables = focusableElements(dialog);
73
+ const activeIndex = focusables.indexOf(document.activeElement);
74
+ const action = resolveModalKeyboardAction({ key: event.key, shiftKey: event.shiftKey, activeIndex, focusableCount: focusables.length });
75
+ if (action === 'close') {
76
+ event.preventDefault();
77
+ onClose();
78
+ return;
79
+ }
80
+ if (event.key === 'Tab' && !focusables.length) {
81
+ event.preventDefault();
82
+ dialog?.focus();
83
+ return;
84
+ }
85
+ if (action === 'first' || action === 'last') {
86
+ event.preventDefault();
87
+ focusables[action === 'first' ? 0 : focusables.length - 1]?.focus();
88
+ }
89
+ }
90
+ function focusableElements(container) {
91
+ if (!container)
92
+ return [];
93
+ return Array.from(container.querySelectorAll('button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])'));
94
+ }
95
+ export function ConfirmDialog({ open, title, message, confirmText = '确认', cancelText = '取消', danger, confirmDisabled, onCancel, onConfirm }) {
96
+ return (_jsx(Modal, { open: open, title: title, onClose: onCancel, footer: _jsxs(_Fragment, { children: [_jsx("button", { type: "button", className: "tcw-button tcw-button--secondary", onClick: onCancel, children: cancelText }), _jsx("button", { type: "button", className: `tcw-button tcw-button--${danger ? 'danger' : 'primary'}`, disabled: confirmDisabled, onClick: onConfirm, children: confirmText })] }), children: _jsxs("div", { className: `tcw-confirm-message${danger ? ' is-danger' : ''}`, children: [_jsx("i", { className: danger ? 'ri-error-warning-line' : 'ri-question-line', "aria-hidden": "true" }), _jsx("p", { children: message })] }) }));
97
+ }
98
+ export function LoadingBlocker({ visible, label = '处理中,请稍候' }) {
99
+ if (!visible)
100
+ return null;
101
+ return _jsxs("div", { className: "tcw-loading-blocker", role: "status", "aria-live": "polite", children: [_jsx("span", { className: "tcw-spinner", "aria-hidden": "true" }), _jsx("strong", { children: label })] });
102
+ }
103
+ export function Toast({ message, tone = 'success', onClose }) {
104
+ if (!message)
105
+ return null;
106
+ return _jsxs("div", { className: `tcw-toast tcw-toast--${tone}`, role: tone === 'error' ? 'alert' : 'status', children: [_jsx("i", { className: toastIcon(tone), "aria-hidden": "true" }), _jsx("span", { children: message }), onClose && _jsx("button", { type: "button", title: "\u5173\u95ED", "aria-label": "\u5173\u95ED", onClick: onClose, children: _jsx("i", { className: "ri-close-line" }) })] });
107
+ }
108
+ function toastIcon(tone) {
109
+ if (tone === 'success')
110
+ return 'ri-checkbox-circle-line';
111
+ if (tone === 'error')
112
+ return 'ri-close-circle-line';
113
+ if (tone === 'warning')
114
+ return 'ri-error-warning-line';
115
+ return 'ri-information-line';
116
+ }
117
+ //# sourceMappingURL=forms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forms.js","sourceRoot":"","sources":["../../../../src/lib/remote-ui/components/forms.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import React, { type ReactNode } from 'react';
2
+ import type { WorkbenchRoute } from '../contracts.js';
3
+ export type Breadcrumb = {
4
+ label: string;
5
+ route?: WorkbenchRoute;
6
+ };
7
+ export type ExpandableMenu = 'procurement' | 'sales';
8
+ export type ExpandedMenus = Record<ExpandableMenu, boolean>;
9
+ type ShellProps = {
10
+ route: WorkbenchRoute;
11
+ breadcrumbs: Breadcrumb[];
12
+ expandedMenus: ExpandedMenus;
13
+ title: string;
14
+ subtitle?: string;
15
+ commands?: ReactNode;
16
+ busy?: boolean;
17
+ children: ReactNode;
18
+ onRouteChange: (route: WorkbenchRoute) => void;
19
+ onToggleMenu: (menu: ExpandableMenu) => void;
20
+ onRefresh: () => void;
21
+ };
22
+ export declare function WorkbenchShell({ route, breadcrumbs, expandedMenus, title, subtitle, commands, busy, children, onRouteChange, onToggleMenu, onRefresh }: ShellProps): import("react/jsx-runtime").JSX.Element;
23
+ export declare function RouteSubnavigation({ section, route, onRouteChange }: {
24
+ section: ExpandableMenu;
25
+ route: WorkbenchRoute;
26
+ onRouteChange: (route: WorkbenchRoute) => void;
27
+ }): import("react/jsx-runtime").JSX.Element;
28
+ export declare function buildBreadcrumbs(route: WorkbenchRoute): Breadcrumb[];
29
+ export declare function PageCommand({ children, icon, tone, ...props }: React.ButtonHTMLAttributes<HTMLButtonElement> & {
30
+ icon?: string;
31
+ tone?: 'primary' | 'secondary' | 'danger';
32
+ }): import("react/jsx-runtime").JSX.Element;
33
+ export {};
34
+ //# sourceMappingURL=layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../../src/lib/remote-ui/components/layout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAC7C,OAAO,KAAK,EAAW,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAE9D,MAAM,MAAM,UAAU,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,cAAc,CAAA;CAAE,CAAA;AAClE,MAAM,MAAM,cAAc,GAAG,aAAa,GAAG,OAAO,CAAA;AACpD,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,CAAA;AAE3D,KAAK,UAAU,GAAG;IAChB,KAAK,EAAE,cAAc,CAAA;IACrB,WAAW,EAAE,UAAU,EAAE,CAAA;IACzB,aAAa,EAAE,aAAa,CAAA;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,QAAQ,EAAE,SAAS,CAAA;IACnB,aAAa,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAA;IAC9C,YAAY,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAA;IAC5C,SAAS,EAAE,MAAM,IAAI,CAAA;CACtB,CAAA;AAsBD,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,UAAU,2CA4ElK;AAED,wBAAgB,kBAAkB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE;IAAE,OAAO,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,cAAc,CAAC;IAAC,aAAa,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAA;CAAE,2CAiBvK;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,cAAc,GAAG,UAAU,EAAE,CAqBpE;AAED,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAgB,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAA;CAAE,2CAEvL"}
@@ -0,0 +1,89 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ const navigation = [
4
+ { page: 'home', label: '首页', icon: 'ri-home-5-line', route: { type: 'page', page: 'home' } },
5
+ { page: 'controlled-goods', label: '管控商品目录', icon: 'ri-shield-check-line', route: { type: 'page', page: 'controlled-goods' } },
6
+ { page: 'sanctioned-companies', label: '公司制裁目录', icon: 'ri-building-2-line', route: { type: 'page', page: 'sanctioned-companies' } },
7
+ { page: 'procurement', label: '采购合规管理', icon: 'ri-file-list-3-line', route: { type: 'procurement', level: 'suppliers' }, expandable: 'procurement' },
8
+ { page: 'customer-contract-review', label: '客户合同审核', icon: 'ri-file-search-line', route: { type: 'page', page: 'customer-contract-review' } },
9
+ { page: 'sales', label: '销售合规管理', icon: 'ri-shopping-bag-3-line', route: { type: 'sales', level: 'customers' }, expandable: 'sales' },
10
+ { page: 'sales-files', label: '销售文件管理', icon: 'ri-file-excel-2-line', route: { type: 'page', page: 'sales-files' } },
11
+ { page: 'analytics', label: '数据分析', icon: 'ri-pie-chart-line', route: { type: 'page', page: 'analytics' } },
12
+ { page: 'settings', label: '系统设置', icon: 'ri-settings-3-line', route: { type: 'page', page: 'settings' } }
13
+ ];
14
+ export function WorkbenchShell({ route, breadcrumbs, expandedMenus, title, subtitle, commands, busy, children, onRouteChange, onToggleMenu, onRefresh }) {
15
+ const selected = selectedPage(route);
16
+ return (_jsxs("div", { className: "tcw-app-frame", children: [_jsxs("aside", { className: "tcw-sidebar", children: [_jsxs("div", { className: "tcw-brand", children: [_jsx("span", { className: "tcw-brand-mark", "aria-hidden": "true", children: "G" }), _jsx("strong", { children: "\u5916\u8D38\u5408\u89C4\u5DE5\u4F5C\u53F0" })] }), _jsx("nav", { className: "tcw-navigation", "aria-label": "\u5916\u8D38\u5408\u89C4\u5DE5\u4F5C\u53F0\u5BFC\u822A", children: navigation.map((item) => {
17
+ const active = selected === item.page;
18
+ const expanded = item.expandable ? expandedMenus[item.expandable] : false;
19
+ return (_jsxs(React.Fragment, { children: [_jsxs("div", { className: `tcw-nav-row${active ? ' is-active' : ''}`, children: [_jsxs("button", { type: "button", className: "tcw-nav-item", "aria-label": `进入${item.label}`, "aria-current": active ? 'page' : undefined, onClick: () => onRouteChange(item.route), children: [_jsx("i", { className: item.icon, "aria-hidden": "true" }), _jsx("span", { children: item.label })] }), item.expandable && (_jsx("button", { type: "button", className: "tcw-nav-toggle", "aria-label": `${expanded ? '折叠' : '展开'}${item.label}`, "aria-expanded": expanded, onClick: () => onToggleMenu(item.expandable), children: _jsx("i", { className: `ri-arrow-${expanded ? 'up' : 'down'}-s-line`, "aria-hidden": "true" }) }))] }), item.expandable && expanded && _jsx(RouteSubnavigation, { section: item.expandable, route: route, onRouteChange: onRouteChange })] }, item.page));
20
+ }) })] }), _jsxs("main", { className: "tcw-main", children: [_jsxs("header", { className: "tcw-topbar", children: [_jsx("nav", { className: "tcw-breadcrumbs", "aria-label": "\u9762\u5305\u5C51", children: breadcrumbs.map((crumb, index) => {
21
+ const terminal = index === breadcrumbs.length - 1;
22
+ return (_jsxs(React.Fragment, { children: [index > 0 && _jsx("i", { className: "ri-arrow-right-s-line", "aria-hidden": "true" }), !terminal && crumb.route
23
+ ? _jsx("button", { type: "button", "data-breadcrumb": "true", onClick: () => onRouteChange(crumb.route), children: crumb.label })
24
+ : _jsx("span", { "aria-current": terminal ? 'page' : undefined, children: crumb.label })] }, `${crumb.label}-${index}`));
25
+ }) }), _jsx("button", { type: "button", className: "tcw-icon-button", title: "\u5237\u65B0", "aria-label": "\u5237\u65B0", disabled: busy, onClick: onRefresh, children: _jsx("i", { className: "ri-refresh-line", "aria-hidden": "true" }) })] }), _jsxs("div", { className: "tcw-content", children: [_jsxs("div", { className: "tcw-page-heading", children: [_jsxs("div", { children: [_jsx("h1", { children: title }), subtitle && _jsx("p", { children: subtitle })] }), commands && _jsx("div", { className: "tcw-page-commands", children: commands })] }), children] })] })] }));
26
+ }
27
+ export function RouteSubnavigation({ section, route, onRouteChange }) {
28
+ const entries = section === 'procurement' ? procurementEntries(route) : salesEntries(route);
29
+ return (_jsx("div", { className: "tcw-subnavigation", children: entries.map((entry) => (_jsx("button", { type: "button", className: entry.current ? 'is-current' : '', disabled: !entry.route, onClick: () => entry.route && onRouteChange(entry.route), children: entry.label }, entry.level))) }));
30
+ }
31
+ export function buildBreadcrumbs(route) {
32
+ if (route.type === 'page') {
33
+ if (route.page === 'home')
34
+ return [{ label: '首页' }];
35
+ return [{ label: '首页', route: { type: 'page', page: 'home' } }, { label: pageLabel(route.page) }];
36
+ }
37
+ if (route.type === 'procurement') {
38
+ const crumbs = [
39
+ { label: '首页', route: { type: 'page', page: 'home' } },
40
+ route.level === 'suppliers' ? { label: '采购合规管理' } : { label: '采购合规管理', route: { type: 'procurement', level: 'suppliers' } }
41
+ ];
42
+ if (route.level === 'orders')
43
+ crumbs.push({ label: '采购订单' });
44
+ if (route.level === 'lines')
45
+ crumbs.push({ label: '采购订单', route: { type: 'procurement', level: 'orders', supplierId: route.supplierId } }, { label: '采购商品' });
46
+ return crumbs;
47
+ }
48
+ const crumbs = [
49
+ { label: '首页', route: { type: 'page', page: 'home' } },
50
+ route.level === 'customers' ? { label: '销售合规管理' } : { label: '销售合规管理', route: { type: 'sales', level: 'customers' } }
51
+ ];
52
+ if (route.level === 'orders')
53
+ crumbs.push({ label: '销售订单' });
54
+ if (route.level === 'lines')
55
+ crumbs.push({ label: '销售订单', route: { type: 'sales', level: 'orders', customerId: route.customerId } }, { label: '销售商品' });
56
+ return crumbs;
57
+ }
58
+ export function PageCommand({ children, icon, tone = 'primary', ...props }) {
59
+ return _jsxs("button", { type: "button", className: `tcw-button tcw-button--${tone}`, ...props, children: [icon && _jsx("i", { className: icon, "aria-hidden": "true" }), children] });
60
+ }
61
+ function procurementEntries(route) {
62
+ const supplierId = route.type === 'procurement' && route.level !== 'suppliers' ? route.supplierId : null;
63
+ const orderId = route.type === 'procurement' && route.level === 'lines' ? route.orderId : null;
64
+ return [
65
+ { level: 'suppliers', label: '供应商列表', current: route.type === 'procurement' && route.level === 'suppliers', route: { type: 'procurement', level: 'suppliers' } },
66
+ { level: 'orders', label: '采购订单', current: route.type === 'procurement' && route.level === 'orders', route: supplierId ? { type: 'procurement', level: 'orders', supplierId } : null },
67
+ { level: 'lines', label: '采购商品', current: route.type === 'procurement' && route.level === 'lines', route: supplierId && orderId ? { type: 'procurement', level: 'lines', supplierId, orderId } : null }
68
+ ];
69
+ }
70
+ function salesEntries(route) {
71
+ const customerId = route.type === 'sales' && route.level !== 'customers' ? route.customerId : null;
72
+ const orderKey = route.type === 'sales' && route.level === 'lines' ? route.orderKey : null;
73
+ return [
74
+ { level: 'customers', label: '客户列表', current: route.type === 'sales' && route.level === 'customers', route: { type: 'sales', level: 'customers' } },
75
+ { level: 'orders', label: '销售订单', current: route.type === 'sales' && route.level === 'orders', route: customerId ? { type: 'sales', level: 'orders', customerId } : null },
76
+ { level: 'lines', label: '销售商品', current: route.type === 'sales' && route.level === 'lines', route: customerId && orderKey ? { type: 'sales', level: 'lines', customerId, orderKey } : null }
77
+ ];
78
+ }
79
+ function pageLabel(page) {
80
+ return navigation.find((item) => item.page === page)?.label ?? page;
81
+ }
82
+ function selectedPage(route) {
83
+ if (route.type === 'procurement')
84
+ return 'procurement';
85
+ if (route.type === 'sales')
86
+ return 'sales';
87
+ return route.page;
88
+ }
89
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../../src/lib/remote-ui/components/layout.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ export type ContractDocumentType = 'PURCHASE_CONTRACT' | 'CUSTOMER_CONTRACT';
2
+ export type ContractImportTaskStatus = 'QUEUED' | 'EXTRACTING' | 'AI_PARSING' | 'VALIDATING' | 'AWAITING_REVIEW' | 'PERSISTING' | 'SUCCEEDED' | 'FAILED' | 'TIMED_OUT';
3
+ export type ContractImportTask = {
4
+ id: string;
5
+ documentType: ContractDocumentType;
6
+ status: ContractImportTaskStatus;
7
+ sourceFileId?: string | null;
8
+ sourceFileName?: string | null;
9
+ resultPayload?: Record<string, unknown> | null;
10
+ executionCommand?: ContractImportCommand | null;
11
+ commandDispatchedAt?: string | null;
12
+ retryOfTaskId?: string | null;
13
+ errorCode?: string | null;
14
+ errorMessage?: string | null;
15
+ updatedAt?: string | null;
16
+ };
17
+ export type ContractImportCommand = {
18
+ commandKey: string;
19
+ payload: Record<string, unknown>;
20
+ };
21
+ export type ContractImportCompletion = {
22
+ task: ContractImportTask;
23
+ };
24
+ export type ContractImportStartData = {
25
+ task: ContractImportTask;
26
+ commands: ContractImportCommand[];
27
+ polling: {
28
+ intervalMs: number;
29
+ timeoutMs: number;
30
+ };
31
+ };
32
+ export type ContractImportStart = {
33
+ success?: boolean;
34
+ message?: string;
35
+ data?: ContractImportStartData;
36
+ };
37
+ export type CustomerContractReanalysisRun = {
38
+ id: string;
39
+ status: 'PENDING' | 'RUNNING' | 'SUCCEEDED' | 'FAILED' | 'TIMED_OUT';
40
+ errorCode?: string | null;
41
+ errorMessage?: string | null;
42
+ commandDispatchedAt?: string | null;
43
+ };
44
+ export type CustomerContractReanalysisResult = {
45
+ run: CustomerContractReanalysisRun;
46
+ review?: unknown;
47
+ task?: ContractImportTask;
48
+ };
49
+ export type CustomerContractReanalysisStart = CustomerContractReanalysisResult & {
50
+ commands: ContractImportCommand[];
51
+ polling: {
52
+ intervalMs: number;
53
+ timeoutMs: number;
54
+ };
55
+ };
56
+ export declare class ContractImportError extends Error {
57
+ readonly task: ContractImportTask;
58
+ constructor(message: string, task: ContractImportTask);
59
+ }
60
+ export declare function runContractImportOrchestration({ start, invokeClientCommand, markCommandDispatched, pollTask, wait, now }: {
61
+ start: ContractImportStart;
62
+ invokeClientCommand: (commandKey: string, payload: Record<string, unknown>) => Promise<unknown>;
63
+ markCommandDispatched: (taskId: string) => Promise<unknown>;
64
+ pollTask: (taskId: string) => Promise<ContractImportCompletion>;
65
+ wait?: (milliseconds: number) => Promise<void>;
66
+ now?: () => number;
67
+ }): Promise<ContractImportCompletion>;
68
+ export declare function findResumableContractImport(items: ContractImportTask[], documentType: ContractDocumentType): ContractImportTask | null;
69
+ export declare function findRecoverableContractImport(items: ContractImportTask[], documentType: ContractDocumentType): ContractImportTask | null;
70
+ export declare function runCustomerContractReanalysis({ start, invokeClientCommand, markCommandDispatched, markFailed, poll, wait, now }: {
71
+ start: CustomerContractReanalysisStart;
72
+ invokeClientCommand: (commandKey: string, payload: Record<string, unknown>) => Promise<unknown>;
73
+ markCommandDispatched: (runId: string) => Promise<unknown>;
74
+ markFailed: (runId: string, failure: {
75
+ errorCode: 'COMMAND_DISPATCH_FAILED' | 'POLLING_FAILED' | 'AI_REANALYSIS_TIMEOUT';
76
+ errorMessage: string;
77
+ }) => Promise<unknown>;
78
+ poll: (runId: string) => Promise<CustomerContractReanalysisResult>;
79
+ wait?: (milliseconds: number) => Promise<void>;
80
+ now?: () => number;
81
+ }): Promise<CustomerContractReanalysisResult>;
82
+ //# sourceMappingURL=contract-import.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-import.d.ts","sourceRoot":"","sources":["../../../src/lib/remote-ui/contract-import.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,102 @@
1
+ const PROCESSING_STATUSES = new Set(['QUEUED', 'EXTRACTING', 'AI_PARSING', 'VALIDATING', 'PERSISTING']);
2
+ const MAX_TIMEOUT_MS = 20 * 60 * 1000;
3
+ export class ContractImportError extends Error {
4
+ constructor(message, task) {
5
+ super(message);
6
+ this.task = task;
7
+ this.name = 'ContractImportError';
8
+ }
9
+ }
10
+ export async function runContractImportOrchestration({ start, invokeClientCommand, markCommandDispatched, pollTask, wait = delay, now = Date.now }) {
11
+ if (start.success === false)
12
+ throw new Error(start.message || '合同解析启动失败');
13
+ if (!start.data?.task || !start.data.polling)
14
+ throw new Error('上传响应缺少合同解析任务信息');
15
+ let task = start.data.task;
16
+ if (task.status === 'AWAITING_REVIEW' || task.status === 'SUCCEEDED')
17
+ return { task };
18
+ assertNotFailed(task);
19
+ if (!task.commandDispatchedAt) {
20
+ let marked = false;
21
+ for (const command of start.data.commands) {
22
+ await invokeClientCommand(command.commandKey, command.payload);
23
+ if (!marked) {
24
+ await markCommandDispatched(task.id);
25
+ marked = true;
26
+ }
27
+ }
28
+ }
29
+ const deadline = now() + Math.min(MAX_TIMEOUT_MS, Math.max(1, start.data.polling.timeoutMs));
30
+ const intervalMs = Math.max(1, start.data.polling.intervalMs);
31
+ while (now() < deadline) {
32
+ await wait(intervalMs);
33
+ task = (await pollTask(task.id)).task;
34
+ if (task.status === 'AWAITING_REVIEW' || task.status === 'SUCCEEDED')
35
+ return { task };
36
+ assertNotFailed(task);
37
+ if (!PROCESSING_STATUSES.has(task.status))
38
+ throw new Error(`不支持的合同导入任务状态:${task.status}`);
39
+ }
40
+ throw new ContractImportError('合同解析超过 20 分钟,请重新解析', { ...task, status: 'TIMED_OUT', errorMessage: '合同解析超过 20 分钟,请重新解析' });
41
+ }
42
+ export function findResumableContractImport(items, documentType) {
43
+ return newest(items.filter(task => task.documentType === documentType && (task.status === 'AWAITING_REVIEW' || PROCESSING_STATUSES.has(task.status))));
44
+ }
45
+ export function findRecoverableContractImport(items, documentType) {
46
+ const retriedTaskIds = new Set(items.map(task => task.retryOfTaskId).filter((id) => Boolean(id)));
47
+ return newest(items.filter(task => task.documentType === documentType && (task.status === 'FAILED' || task.status === 'TIMED_OUT') && !retriedTaskIds.has(task.id)));
48
+ }
49
+ export async function runCustomerContractReanalysis({ start, invokeClientCommand, markCommandDispatched, markFailed, poll, wait = delay, now = Date.now }) {
50
+ if (!start.run || !start.polling)
51
+ throw new Error('重新分析响应缺少任务信息');
52
+ if (start.run.status === 'SUCCEEDED')
53
+ return start;
54
+ assertReanalysisNotFailed(start.run);
55
+ let failureCode = 'COMMAND_DISPATCH_FAILED';
56
+ try {
57
+ if (!start.run.commandDispatchedAt) {
58
+ let marked = false;
59
+ for (const command of start.commands) {
60
+ await invokeClientCommand(command.commandKey, command.payload);
61
+ if (!marked) {
62
+ await markCommandDispatched(start.run.id);
63
+ marked = true;
64
+ }
65
+ }
66
+ }
67
+ failureCode = 'POLLING_FAILED';
68
+ const deadline = now() + Math.min(MAX_TIMEOUT_MS, Math.max(1, start.polling.timeoutMs));
69
+ const intervalMs = Math.max(1, start.polling.intervalMs);
70
+ while (now() < deadline) {
71
+ await wait(intervalMs);
72
+ const result = await poll(start.run.id);
73
+ if (result.run.status === 'SUCCEEDED')
74
+ return result;
75
+ if (result.run.status === 'FAILED' || result.run.status === 'TIMED_OUT')
76
+ throw new PersistedReanalysisFailure(result.run.errorMessage || 'AI 重新分析失败');
77
+ if (result.run.status !== 'PENDING' && result.run.status !== 'RUNNING')
78
+ throw new Error(`不支持的重新分析状态:${result.run.status}`);
79
+ }
80
+ }
81
+ catch (error) {
82
+ if (error instanceof PersistedReanalysisFailure)
83
+ throw error;
84
+ const errorMessage = error instanceof Error ? error.message : String(error);
85
+ await markFailed(start.run.id, { errorCode: failureCode, errorMessage });
86
+ throw error;
87
+ }
88
+ const timeoutMessage = 'AI 重新分析超过 20 分钟';
89
+ await markFailed(start.run.id, { errorCode: 'AI_REANALYSIS_TIMEOUT', errorMessage: timeoutMessage });
90
+ throw new Error(timeoutMessage);
91
+ }
92
+ class PersistedReanalysisFailure extends Error {
93
+ }
94
+ function assertNotFailed(task) {
95
+ if (task.status === 'FAILED' || task.status === 'TIMED_OUT')
96
+ throw new ContractImportError(task.errorMessage || (task.status === 'TIMED_OUT' ? '合同解析超时,请重新解析' : '合同解析失败,请重新解析'), task);
97
+ }
98
+ function assertReanalysisNotFailed(run) { if (run.status === 'FAILED' || run.status === 'TIMED_OUT')
99
+ throw new Error(run.errorMessage || 'AI 重新分析失败'); }
100
+ function newest(items) { return [...items].sort((left, right) => String(right.updatedAt ?? '').localeCompare(String(left.updatedAt ?? '')))[0] ?? null; }
101
+ function delay(milliseconds) { return new Promise(resolve => setTimeout(resolve, milliseconds)); }
102
+ //# sourceMappingURL=contract-import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-import.js","sourceRoot":"","sources":["../../../src/lib/remote-ui/contract-import.ts"],"names":[],"mappings":"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"}