@chenchaolong/plugin-trade-compliance-workbench 1.0.23 → 1.0.25

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 (72) hide show
  1. package/dist/lib/entities/shared.entity.d.ts +6 -1
  2. package/dist/lib/entities/shared.entity.d.ts.map +1 -1
  3. package/dist/lib/entities/shared.entity.js +20 -0
  4. package/dist/lib/entities/shared.entity.js.map +1 -1
  5. package/dist/lib/import-jobs/import-job-callback.processor.d.ts.map +1 -1
  6. package/dist/lib/import-jobs/import-job-callback.processor.js +9 -5
  7. package/dist/lib/import-jobs/import-job-callback.processor.js.map +1 -1
  8. package/dist/lib/import-jobs/import-job.coordinator.d.ts +2 -1
  9. package/dist/lib/import-jobs/import-job.coordinator.d.ts.map +1 -1
  10. package/dist/lib/import-jobs/import-job.coordinator.js +12 -0
  11. package/dist/lib/import-jobs/import-job.coordinator.js.map +1 -1
  12. package/dist/lib/import-jobs/import-job.processor.d.ts.map +1 -1
  13. package/dist/lib/import-jobs/import-job.processor.js +3 -0
  14. package/dist/lib/import-jobs/import-job.processor.js.map +1 -1
  15. package/dist/lib/import-jobs/import-timeout.processor.d.ts.map +1 -1
  16. package/dist/lib/import-jobs/import-timeout.processor.js +3 -1
  17. package/dist/lib/import-jobs/import-timeout.processor.js.map +1 -1
  18. package/dist/lib/public-dto.d.ts +1 -1
  19. package/dist/lib/public-dto.d.ts.map +1 -1
  20. package/dist/lib/public-dto.js +2 -0
  21. package/dist/lib/public-dto.js.map +1 -1
  22. package/dist/lib/remote-components/trade-compliance-workbench/app.css +1 -1
  23. package/dist/lib/remote-components/trade-compliance-workbench/app.js +5 -5
  24. package/dist/lib/remote-ui/action-execution.d.ts.map +1 -1
  25. package/dist/lib/remote-ui/action-execution.js +1 -0
  26. package/dist/lib/remote-ui/action-execution.js.map +1 -1
  27. package/dist/lib/remote-ui/app-source.js +80 -24
  28. package/dist/lib/remote-ui/app-source.js.map +1 -1
  29. package/dist/lib/remote-ui/components/task-status.d.ts +3 -0
  30. package/dist/lib/remote-ui/components/task-status.d.ts.map +1 -1
  31. package/dist/lib/remote-ui/components/task-status.js +59 -4
  32. package/dist/lib/remote-ui/components/task-status.js.map +1 -1
  33. package/dist/lib/remote-ui/contract-import.d.ts +3 -1
  34. package/dist/lib/remote-ui/contract-import.d.ts.map +1 -1
  35. package/dist/lib/remote-ui/contract-import.js +2 -0
  36. package/dist/lib/remote-ui/contract-import.js.map +1 -1
  37. package/dist/lib/remote-ui/contracts.d.ts +3 -1
  38. package/dist/lib/remote-ui/contracts.d.ts.map +1 -1
  39. package/dist/lib/remote-ui/import-task-status.d.ts +36 -1
  40. package/dist/lib/remote-ui/import-task-status.d.ts.map +1 -1
  41. package/dist/lib/remote-ui/import-task-status.js +107 -2
  42. package/dist/lib/remote-ui/import-task-status.js.map +1 -1
  43. package/dist/lib/remote-ui/pages/catalogs.css +91 -0
  44. package/dist/lib/remote-ui/pages/catalogs.d.ts +18 -0
  45. package/dist/lib/remote-ui/pages/catalogs.d.ts.map +1 -1
  46. package/dist/lib/remote-ui/pages/catalogs.js +4 -3
  47. package/dist/lib/remote-ui/pages/catalogs.js.map +1 -1
  48. package/dist/lib/remote-ui/pages/contracts.css +42 -6
  49. package/dist/lib/remote-ui/pages/contracts.d.ts.map +1 -1
  50. package/dist/lib/remote-ui/pages/contracts.js +10 -2
  51. package/dist/lib/remote-ui/pages/contracts.js.map +1 -1
  52. package/dist/lib/remote-ui/polling.d.ts +1 -0
  53. package/dist/lib/remote-ui/polling.d.ts.map +1 -1
  54. package/dist/lib/remote-ui/polling.js +6 -1
  55. package/dist/lib/remote-ui/polling.js.map +1 -1
  56. package/dist/lib/remote-ui/styles.css +40 -12
  57. package/dist/lib/types.d.ts +1 -1
  58. package/dist/lib/types.d.ts.map +1 -1
  59. package/dist/lib/types.js +1 -1
  60. package/dist/lib/types.js.map +1 -1
  61. package/dist/lib/workbench-action-contract.d.ts +1 -1
  62. package/dist/lib/workbench-action-contract.d.ts.map +1 -1
  63. package/dist/lib/workbench-action-contract.js +1 -0
  64. package/dist/lib/workbench-action-contract.js.map +1 -1
  65. package/dist/lib/workbench-view.provider.d.ts.map +1 -1
  66. package/dist/lib/workbench-view.provider.js +19 -2
  67. package/dist/lib/workbench-view.provider.js.map +1 -1
  68. package/dist/lib/workbench.service.d.ts +19 -1
  69. package/dist/lib/workbench.service.d.ts.map +1 -1
  70. package/dist/lib/workbench.service.js +120 -19
  71. package/dist/lib/workbench.service.js.map +1 -1
  72. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"action-execution.d.ts","sourceRoot":"","sources":["../../../src/lib/remote-ui/action-execution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AAC/F,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAE9C,MAAM,MAAM,YAAY,CAAC,CAAC,GAAG,OAAO,IAAI;IACtC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,IAAI,CAAC,EAAE,CAAC,CAAA;IACR,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AAED,KAAK,wBAAwB,GAAG,QAAQ,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAA;AAEhF,eAAO,MAAM,4BAA4B,EAAE,MAAM,CAAC,kBAAkB,EAAE,wBAAwB,CAqC7F,CAAA;AAiBD,wBAAsB,sBAAsB,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAqC,EAAE,EAAE;IACvI,SAAS,EAAE,kBAAkB,CAAA;IAC7B,MAAM,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAA;IACtC,OAAO,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACnC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;IAC5C,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,MAAM,CAAA;CACrD,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAiB3B"}
1
+ {"version":3,"file":"action-execution.d.ts","sourceRoot":"","sources":["../../../src/lib/remote-ui/action-execution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AAC/F,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAE9C,MAAM,MAAM,YAAY,CAAC,CAAC,GAAG,OAAO,IAAI;IACtC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,IAAI,CAAC,EAAE,CAAC,CAAA;IACR,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AAED,KAAK,wBAAwB,GAAG,QAAQ,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAA;AAEhF,eAAO,MAAM,4BAA4B,EAAE,MAAM,CAAC,kBAAkB,EAAE,wBAAwB,CAsC7F,CAAA;AAiBD,wBAAsB,sBAAsB,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAqC,EAAE,EAAE;IACvI,SAAS,EAAE,kBAAkB,CAAA;IAC7B,MAAM,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAA;IACtC,OAAO,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACnC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;IAC5C,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,MAAM,CAAA;CACrD,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAiB3B"}
@@ -31,6 +31,7 @@ export const ACTION_NOTIFICATION_POLICIES = {
31
31
  download_sales_file: { tone: 'success', fallback: '销售文件下载成功' },
32
32
  download_import_issues: { tone: 'success', fallback: '导入问题 Excel 下载成功' },
33
33
  retry_import_task: 'silent',
34
+ delete_import_task: 'silent',
34
35
  download_source_file: 'silent',
35
36
  preview_source_file: 'silent',
36
37
  save_edited_sales_file: 'silent',
@@ -1 +1 @@
1
- {"version":3,"file":"action-execution.js","sourceRoot":"","sources":["../../../src/lib/remote-ui/action-execution.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"action-execution.js","sourceRoot":"","sources":["../../../src/lib/remote-ui/action-execution.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import React from 'react';
3
3
  import { createRoot } from 'react-dom/client';
4
4
  import { createRemoteBridge } from './bridge.js';
@@ -20,7 +20,7 @@ import { SalesFilesPage } from './pages/files.js';
20
20
  import { AnalyticsPage, AnalyticsPrototypeBoard } from './pages/analytics.js';
21
21
  import { SettingsPage } from './pages/settings.js';
22
22
  import { ContractImportError, findRecoverableContractImport, findResumableContractImports, runContractImportOrchestration, runCustomerContractReanalysis, taskTransition } from './contract-import.js';
23
- import { importTaskFromStart, importTaskProgressPercent, isLocalUploadPlaceholder, mergeImportTaskItems } from './import-task-status.js';
23
+ import { createTaskChatSynchronizer, importTaskFromStart, importTaskProgressPercent, isLocalUploadPlaceholder, mergeImportTaskItems, removeImportTaskItem } from './import-task-status.js';
24
24
  import { compareTaskBusinessOrder, createPendingResultQueue, createPollingTaskTracker, isAbortError, isPollingObservationTimeout, submitAndRefreshTaskState } from './polling.js';
25
25
  import { ACTION_NOTIFICATION_POLICIES, executeWorkbenchAction } from './action-execution.js';
26
26
  import './styles.css';
@@ -77,6 +77,7 @@ function App() {
77
77
  const [salesFilesPrototypeState, setSalesFilesPrototypeState] = React.useState(undefined);
78
78
  const [data, setData] = React.useState(() => normalizeWorkbenchData(null));
79
79
  const importTaskItemsRef = React.useRef([]);
80
+ const deletedImportTaskIdsRef = React.useRef(new Set());
80
81
  const [busy, setBusy] = React.useState(false);
81
82
  const [actionBusy, setActionBusy] = React.useState(false);
82
83
  const [catalogCommand, setCatalogCommand] = React.useState(null);
@@ -92,7 +93,18 @@ function App() {
92
93
  const presentNextReviewRef = React.useRef(() => undefined);
93
94
  const reviewPresentationTimerRef = React.useRef(null);
94
95
  const blobUrlOwnerRef = React.useRef(createBlobUrlOwner());
95
- const openedObserverConversationIdsRef = React.useRef(new Set());
96
+ const taskChatSynchronizerRef = React.useRef(null);
97
+ if (!taskChatSynchronizerRef.current)
98
+ taskChatSynchronizerRef.current = createTaskChatSynchronizer({
99
+ setContext: async (task, relatedRecords) => {
100
+ await bridge.invokeClientCommand('assistant.context.set', {
101
+ key: 'tradeComplianceTask', context: { task, relatedRecords }
102
+ });
103
+ },
104
+ sendMessage: async (text, clientMessageId) => {
105
+ await bridge.invokeClientCommand('assistant.chat.send_message', { text, clientMessageId });
106
+ }
107
+ });
96
108
  const changeRouteRef = React.useRef(() => undefined);
97
109
  const [procurementContext, setProcurementContext] = React.useState({ supplier: null, order: null, metrics: null });
98
110
  const [purchaseImportTask, setPurchaseImportTask] = React.useState(null);
@@ -124,7 +136,7 @@ function App() {
124
136
  }, [setToast]);
125
137
  const upsertLocalImportTask = React.useCallback((task) => {
126
138
  setData(current => {
127
- const items = mergeImportTaskItems(current.importTasks.items, [task]);
139
+ const items = mergeImportTaskItems(current.importTasks.items, [task], deletedImportTaskIdsRef.current);
128
140
  return {
129
141
  ...current,
130
142
  importTasks: {
@@ -137,6 +149,30 @@ function App() {
137
149
  };
138
150
  });
139
151
  }, []);
152
+ const removeLocalImportTask = React.useCallback((taskId) => {
153
+ setData(current => {
154
+ const removed = current.importTasks.items.some(item => asRecord(item).id === taskId);
155
+ const items = removeImportTaskItem(current.importTasks.items, taskId);
156
+ return {
157
+ ...current,
158
+ importTasks: {
159
+ ...current.importTasks,
160
+ items,
161
+ total: Math.max(items.length, numberValue(current.importTasks.total, items.length) - (removed ? 1 : 0))
162
+ }
163
+ };
164
+ });
165
+ }, []);
166
+ const selectImportTaskForChat = React.useCallback(async (task) => {
167
+ const synchronizer = taskChatSynchronizerRef.current;
168
+ synchronizer.beginSelection(task.id);
169
+ const payload = asRecord(unwrapResponse(await bridge.requestData({ parameters: { collection: 'importTask', taskId: task.id } })));
170
+ if (!synchronizer.isSelected(task.id))
171
+ return;
172
+ const fullTask = asRecord(payload.task);
173
+ const selectedTask = typeof fullTask.id === 'string' ? { ...task, ...fullTask } : task;
174
+ await synchronizer.sync(selectedTask, payload);
175
+ }, []);
140
176
  const loadImportTasksFallback = React.useCallback(async (normalized) => {
141
177
  try {
142
178
  const payload = asRecord(unwrapResponse(await bridge.requestData(importTasksCollectionRequest())));
@@ -234,7 +270,7 @@ function App() {
234
270
  const normalized = normalizeWorkbenchData(response);
235
271
  const importTasks = await loadImportTasksFallback(normalized);
236
272
  bridge.configure({ uploadPolicy: normalized.uploadPolicy });
237
- setData(current => mergeWorkbenchDataWithLocalTasks(current, { ...normalized, importTasks }));
273
+ setData(current => mergeWorkbenchDataWithLocalTasks(current, { ...normalized, importTasks }, deletedImportTaskIdsRef.current));
238
274
  await loadRoute(routeRef.current);
239
275
  }
240
276
  }
@@ -267,7 +303,7 @@ function App() {
267
303
  sanctionBatches: normalized.sanctionBatches,
268
304
  importTasks: {
269
305
  ...importTasks,
270
- items: mergeImportTaskItems(current.importTasks.items, importTasks.items),
306
+ items: mergeImportTaskItems(current.importTasks.items, importTasks.items, deletedImportTaskIdsRef.current),
271
307
  total: Math.max(numberValue(importTasks.total, 0), importTasks.items.length, current.importTasks.items.length)
272
308
  },
273
309
  customerContractAnalyses: normalized.customerContractAnalyses
@@ -300,6 +336,11 @@ function App() {
300
336
  React.useEffect(() => {
301
337
  importTaskItemsRef.current = data.importTasks.items;
302
338
  }, [data.importTasks.items]);
339
+ React.useEffect(() => {
340
+ const selectedTask = data.importTasks.items.find(task => taskChatSynchronizerRef.current?.isSelected(task.id));
341
+ if (selectedTask)
342
+ void taskChatSynchronizerRef.current.sync(selectedTask).catch(notifyTaskStatusActionError);
343
+ }, [data.importTasks.items, notifyTaskStatusActionError]);
303
344
  React.useEffect(() => () => {
304
345
  if (taskRecoveryTimerRef.current != null)
305
346
  window.clearInterval(taskRecoveryTimerRef.current);
@@ -322,7 +363,7 @@ function App() {
322
363
  contextRef.current = nextContext;
323
364
  const normalized = normalizeWorkbenchData(nextContext.payload);
324
365
  bridge.configure({ uploadPolicy: normalized.uploadPolicy });
325
- setData(current => mergeWorkbenchDataWithLocalTasks(current, normalized));
366
+ setData(current => mergeWorkbenchDataWithLocalTasks(current, normalized, deletedImportTaskIdsRef.current));
326
367
  void load(nextContext);
327
368
  },
328
369
  onHostEvent() {
@@ -563,17 +604,6 @@ function App() {
563
604
  void running.catch(handleBackgroundImportTrackingError);
564
605
  }
565
606
  }, [data.importTasks.items, handleBackgroundImportTrackingError, importCompletions, orchestrateImport]);
566
- React.useEffect(() => {
567
- for (const task of data.importTasks.items) {
568
- const conversationId = task.observerConversationId;
569
- if (!conversationId || openedObserverConversationIdsRef.current.has(conversationId))
570
- continue;
571
- openedObserverConversationIdsRef.current.add(conversationId);
572
- void bridge.invokeClientCommand('workbench.navigation.open', {
573
- target: 'assistant.conversation', conversationId
574
- }).catch(() => openedObserverConversationIdsRef.current.delete(conversationId));
575
- }
576
- }, [data.importTasks.items]);
577
607
  React.useEffect(() => {
578
608
  const tasks = data.importTasks.items;
579
609
  for (const resumable of findResumableContractImports(tasks)) {
@@ -629,6 +659,25 @@ function App() {
629
659
  throw error;
630
660
  }
631
661
  }, [loadTaskState, notifyTaskRecoveryRefreshError]);
662
+ const deleteImportTask = React.useCallback(async (task) => {
663
+ const result = asActionResult(unwrapResponse(await bridge.executeAction('delete_import_task', { taskId: task.id })));
664
+ if (result.success === false)
665
+ throw actionResponseError(result, '任务删除失败');
666
+ catalogTaskTrackerRef.current.abort(task.id);
667
+ contractTaskTrackerRef.current.abort(task.id);
668
+ removeLocalImportTask(task.id);
669
+ if (taskChatSynchronizerRef.current?.isSelected(task.id)) {
670
+ taskChatSynchronizerRef.current.clear();
671
+ await bridge.invokeClientCommand('assistant.context.set', {
672
+ key: 'tradeComplianceTask', clear: true
673
+ }).catch(() => undefined);
674
+ await bridge.invokeClientCommand('assistant.chat.send_message', {
675
+ text: `任务“${task.sourceFileName || documentTypeLabel(task.documentType)}”已取消并删除。`,
676
+ clientMessageId: `trade-task:${task.id}:deleted`
677
+ }).catch(() => undefined);
678
+ }
679
+ await loadTaskState();
680
+ }, [loadTaskState, removeLocalImportTask]);
632
681
  const openImportTaskFromStatus = React.useCallback(async (task) => {
633
682
  if (task.status === 'FAILED' || task.status === 'TIMED_OUT') {
634
683
  if (task.documentType === 'PURCHASE_CONTRACT' || task.documentType === 'CUSTOMER_CONTRACT')
@@ -1038,7 +1087,7 @@ function App() {
1038
1087
  changeRouteRef.current = changeRoute;
1039
1088
  const page = routePage(route);
1040
1089
  const meta = route.type === 'procurement' ? procurementPageMeta[route.level] : pageMeta[page];
1041
- const taskStatusItems = React.useMemo(() => buildTaskStatusItems(data.importTasks.items, openImportTaskFromStatus), [data.importTasks.items, openImportTaskFromStatus]);
1090
+ const taskStatusItems = React.useMemo(() => buildTaskStatusItems(data.importTasks.items, openImportTaskFromStatus, selectImportTaskForChat, deleteImportTask), [data.importTasks.items, deleteImportTask, openImportTaskFromStatus, selectImportTaskForChat]);
1042
1091
  const contractCommands = page === 'procurement' && route.type === 'procurement'
1043
1092
  ? route.level === 'suppliers'
1044
1093
  ? _jsx(ContractUploadCommand, { label: "\u4E0A\u4F20\u91C7\u8D2D\u5408\u540C", busy: busy || actionBusy, onFile: file => executeFileAction('upload_purchase_contract', file, { documentType: 'PURCHASE_CONTRACT' }), onError: message => setToast({ message, tone: 'error' }) })
@@ -1047,7 +1096,7 @@ function App() {
1047
1096
  ? _jsx(ContractUploadCommand, { label: "\u4E0A\u4F20\u5BA2\u6237\u5408\u540C", busy: busy || actionBusy, onFile: file => executeFileAction('upload_customer_contract', file, { documentType: 'CUSTOMER_CONTRACT' }), onError: message => setToast({ message, tone: 'error' }) })
1048
1097
  : undefined;
1049
1098
  if (analyticsPrototypeVisible)
1050
- return (_jsx(WorkbenchShell, { route: route, breadcrumbs: buildBreadcrumbs(route), title: meta.title, topbarActions: _jsx(TaskStatusMenu, { items: taskStatusItems, busy: busy || actionBusy, onActionError: notifyTaskStatusActionError }), onRouteChange: changeRoute, onRefresh: () => void load(), children: _jsx(AnalyticsPrototypeBoard, { onClose: () => setAnalyticsPrototypeVisible(false) }) }));
1099
+ return (_jsxs(_Fragment, { children: [_jsx(WorkbenchShell, { route: route, breadcrumbs: buildBreadcrumbs(route), title: meta.title, topbarActions: _jsx(TaskStatusMenu, { items: taskStatusItems, busy: busy || actionBusy, onActionError: notifyTaskStatusActionError }), onRouteChange: changeRoute, onRefresh: () => void load(), children: _jsx(AnalyticsPrototypeBoard, { onClose: () => setAnalyticsPrototypeVisible(false) }) }), _jsx(LoadingBlocker, { visible: busy || actionBusy, label: actionBusy ? '操作处理中' : '数据加载中' }), _jsx(ToastStack, { items: toasts, onClose: closeToast })] }));
1051
1100
  return (_jsxs(_Fragment, { children: [_jsxs(WorkbenchShell, { route: route, breadcrumbs: buildBreadcrumbs(route), title: meta.title, subtitle: page === 'home' ? undefined : meta.subtitle, topbarActions: _jsx(TaskStatusMenu, { items: taskStatusItems, busy: busy || actionBusy, onActionError: notifyTaskStatusActionError }), commands: (page === 'controlled-goods' || page === 'sanctioned-companies') ? _jsx(CatalogCommands, { busy: busy || actionBusy, onUpload: () => setCatalogCommand('upload'), onCreate: () => setCatalogCommand('create') }) : contractCommands, busy: busy || actionBusy, onRouteChange: changeRoute, onRefresh: () => void load(), children: [page === 'home' && _jsx(HomePage, {}), page === 'controlled-goods' && _jsx(ControlledGoodsPage, { collection: data.controlledGoods, batches: data.controlledBatches.items, busy: busy || actionBusy, onAction: executeAction, onFileAction: executeCatalogFileAction, onRefresh: load, onQuery: (query) => queryCatalog('controlledGoods', query), onIssueQuery: queryImportIssues, importCompletion: importCompletions.CONTROLLED_CATALOG, importFailure: importFailures.CONTROLLED_CATALOG, onRetryImport: retryImport, command: catalogCommand, onCommandHandled: () => setCatalogCommand(null), onNotify: setToast }), page === 'sanctioned-companies' && _jsx(SanctionedCompaniesPage, { collection: data.sanctionedCompanies, batches: data.sanctionBatches.items, busy: busy || actionBusy, onAction: executeAction, onFileAction: executeCatalogFileAction, onRefresh: load, onQuery: (query) => queryCatalog('sanctionedCompanies', query), onIssueQuery: queryImportIssues, importCompletion: importCompletions.SANCTION_CATALOG, importFailure: importFailures.SANCTION_CATALOG, onRetryImport: retryImport, command: catalogCommand, onCommandHandled: () => setCatalogCommand(null), onNotify: setToast }), page === 'procurement' && route.type === 'procurement' && _jsx(ProcurementPage, { route: route, suppliers: data.suppliers, purchaseOrders: data.purchaseOrders, purchaseLines: data.purchaseLines, supplier: procurementContext.supplier, order: procurementContext.order, metrics: procurementContext.metrics, importTask: purchaseImportTask, reviewDraft: purchaseReviewDraft, busy: busy || actionBusy, onQuery: queryProcurement, onAction: executeAction, onFileAction: executeFileAction, onRouteChange: changeRoute, onRetryImport: retryContractImport, onReviewClose: closePurchaseReview, onNotify: setToast }), page === 'customer-contract-review' && _jsx(CustomerContractsPage, { collection: data.customerContracts, busy: busy || actionBusy, importReviewState: customerImportState, onQuery: queryCustomerContracts, onAction: executeAction, onFileAction: executeFileAction, onReanalyze: reanalyzeCustomerContract, onLoadReview: loadCustomerContractReview, onReviewClose: closeCustomerReview, reanalysisState: customerReanalysisState, onRetryImport: retryContractImport, onNotify: setToast }), page === 'sales' && route.type === 'sales' && _jsx(SalesPage, { route: route, customers: data.salesCustomers, orders: data.salesOrders, lines: data.salesLines, busy: busy || actionBusy, onQuery: querySales, onAction: executeAction, onRouteChange: changeRoute, onOpenFiles: openSalesFiles, onNotify: setToast }), page === 'sales-files' && _jsx(SalesFilesPage, { orders: data.salesFileOrders, history: data.generatedFiles, activeOrder: activeSalesFileOrder, visualPrototypeState: salesFilesPrototypeState, onPrototypeStateClose: () => setSalesFilesPrototypeState(undefined), banks: data.settings.banks, busy: busy || actionBusy, onQuery: querySalesFiles, onAction: executeSalesFileAction, onOpenSalesOrder: selectSalesFileOrder, onDownload: file => executeAction('download_sales_file', { id: file.id }).then(() => undefined), onEdit: async (file) => setEditingSalesFile(file), onNotify: setToast }), page === 'analytics' && _jsx(AnalyticsPage, { data: data.analytics, committedQuery: analyticsCommittedQuery, busy: busy || actionBusy, error: analyticsError, onQuery: queryAnalytics, onExportXlsx: exportAnalytics }), page === 'settings' && _jsx(SettingsPage, { data: data.settings, busy: busy || actionBusy, onSave: saveSettings, onRestoreDefault: restoreSettings, onDeleteRate: deleteSettingsRate, onRateQuery: queryMonthlyRates, onUploadLogo: uploadCompanyLogo, onDiscardLogo: discardCompanyLogo, onNotify: setToast }), !['home', 'controlled-goods', 'sanctioned-companies', 'procurement', 'customer-contract-review', 'sales', 'sales-files', 'analytics', 'settings'].includes(page) && _jsxs("section", { className: "tcw-page-placeholder", "data-page": page, children: [_jsx(InfoNotice, { children: "\u9875\u9762\u57FA\u7840\u7ED3\u6784\u5DF2\u5C31\u7EEA\uFF0C\u4E1A\u52A1\u5185\u5BB9\u5C06\u5728\u5BF9\u5E94\u9875\u9762\u6A21\u5757\u4E2D\u52A0\u8F7D\u3002" }), _jsx("div", { className: "tcw-placeholder-body", "aria-label": `${meta.title}页面内容` })] })] }), _jsx(LoadingBlocker, { visible: busy || actionBusy, label: actionBusy ? '操作处理中' : '数据加载中' }), _jsx(ToastStack, { items: toasts, onClose: closeToast }), editingSalesFile && _jsx(SalesFileEditor, { file: editingSalesFile, onNotify: setToast, onClose: () => setEditingSalesFile(null), onSaved: () => { setEditingSalesFile(null); if (activeSalesFileOrder)
1052
1101
  void querySalesFiles('generatedFiles', { page: 1, pageSize: 20, filters: {}, parameters: { customerContractId: activeSalesFileOrder.customerContractId, purchaseOrderId: activeSalesFileOrder.purchaseOrderId } }); } })] }));
1053
1102
  }
@@ -1058,8 +1107,9 @@ function routePage(route) {
1058
1107
  return 'sales';
1059
1108
  return route.page;
1060
1109
  }
1061
- function buildTaskStatusItems(tasks, onOpen) {
1110
+ function buildTaskStatusItems(tasks, onOpen, onSelect, onDelete) {
1062
1111
  return [...tasks]
1112
+ .filter(task => ['QUEUED', 'EXTRACTING', 'AI_PARSING', 'VALIDATING', 'PERSISTING', 'AWAITING_REVIEW', 'FAILED', 'TIMED_OUT'].includes(task.status))
1063
1113
  .sort((left, right) => String(right.updatedAt ?? right.queuedAt ?? right.createdAt ?? '').localeCompare(String(left.updatedAt ?? left.queuedAt ?? left.createdAt ?? '')))
1064
1114
  .map(task => {
1065
1115
  const tone = taskTone(task.status);
@@ -1072,6 +1122,9 @@ function buildTaskStatusItems(tasks, onOpen) {
1072
1122
  tone,
1073
1123
  updatedAt: formatTaskTime(task.updatedAt ?? task.queuedAt ?? task.createdAt),
1074
1124
  progressPercent: importTaskProgressPercent(task),
1125
+ onSelect: () => onSelect(task),
1126
+ deleteLabel: taskTone(task.status) === 'running' ? '取消并删除任务' : '删除任务',
1127
+ onDelete: () => onDelete(task),
1075
1128
  ...((task.status === 'AWAITING_REVIEW' || task.status === 'FAILED' || task.status === 'TIMED_OUT') ? { actionLabel: task.status === 'AWAITING_REVIEW' ? '审核' : '重试', onAction: () => onOpen(task) } : {})
1076
1129
  };
1077
1130
  });
@@ -1089,7 +1142,7 @@ function taskTone(status) {
1089
1142
  }
1090
1143
  function taskStatusLabel(status) {
1091
1144
  const labels = {
1092
- QUEUED: '排队中', EXTRACTING: '提取中', AI_PARSING: 'AI 解析中', VALIDATING: '校验中', AWAITING_REVIEW: '待审核', PERSISTING: '入库中', SUCCEEDED: '已完成', FAILED: '失败', TIMED_OUT: '超时'
1145
+ QUEUED: '排队中', EXTRACTING: '提取中', AI_PARSING: 'AI 解析中', VALIDATING: '校验中', AWAITING_REVIEW: '待审核', PERSISTING: '入库中', SUCCEEDED: '已完成', FAILED: '失败', TIMED_OUT: '超时', CANCELED: '已取消'
1093
1146
  };
1094
1147
  return labels[status] ?? status;
1095
1148
  }
@@ -1107,8 +1160,8 @@ function formatTaskTime(value) {
1107
1160
  return value;
1108
1161
  return new Intl.DateTimeFormat('zh-CN', { timeZone: 'Asia/Shanghai', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false }).format(date).replace(/\//g, '/');
1109
1162
  }
1110
- function mergeWorkbenchDataWithLocalTasks(current, incoming) {
1111
- const items = mergeImportTaskItems(current.importTasks.items, incoming.importTasks.items);
1163
+ function mergeWorkbenchDataWithLocalTasks(current, incoming, deletedIds) {
1164
+ const items = mergeImportTaskItems(current.importTasks.items, incoming.importTasks.items, deletedIds);
1112
1165
  return {
1113
1166
  ...incoming,
1114
1167
  importTasks: {
@@ -1166,6 +1219,9 @@ function actionResponseError(result, fallback) {
1166
1219
  function asRecord(value) {
1167
1220
  return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
1168
1221
  }
1222
+ function stringArray(value) {
1223
+ return Array.isArray(value) ? value.filter((item) => typeof item === 'string' && Boolean(item.trim())) : [];
1224
+ }
1169
1225
  function summaryRequestParameters(value) {
1170
1226
  const parameters = { ...asRecord(value) };
1171
1227
  delete parameters.collection;