@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.
- package/dist/lib/entities/shared.entity.d.ts +6 -1
- package/dist/lib/entities/shared.entity.d.ts.map +1 -1
- package/dist/lib/entities/shared.entity.js +20 -0
- package/dist/lib/entities/shared.entity.js.map +1 -1
- package/dist/lib/import-jobs/import-job-callback.processor.d.ts.map +1 -1
- package/dist/lib/import-jobs/import-job-callback.processor.js +9 -5
- package/dist/lib/import-jobs/import-job-callback.processor.js.map +1 -1
- package/dist/lib/import-jobs/import-job.coordinator.d.ts +2 -1
- package/dist/lib/import-jobs/import-job.coordinator.d.ts.map +1 -1
- package/dist/lib/import-jobs/import-job.coordinator.js +12 -0
- package/dist/lib/import-jobs/import-job.coordinator.js.map +1 -1
- package/dist/lib/import-jobs/import-job.processor.d.ts.map +1 -1
- package/dist/lib/import-jobs/import-job.processor.js +3 -0
- package/dist/lib/import-jobs/import-job.processor.js.map +1 -1
- package/dist/lib/import-jobs/import-timeout.processor.d.ts.map +1 -1
- package/dist/lib/import-jobs/import-timeout.processor.js +3 -1
- package/dist/lib/import-jobs/import-timeout.processor.js.map +1 -1
- package/dist/lib/public-dto.d.ts +1 -1
- package/dist/lib/public-dto.d.ts.map +1 -1
- package/dist/lib/public-dto.js +2 -0
- package/dist/lib/public-dto.js.map +1 -1
- package/dist/lib/remote-components/trade-compliance-workbench/app.css +1 -1
- package/dist/lib/remote-components/trade-compliance-workbench/app.js +5 -5
- package/dist/lib/remote-ui/action-execution.d.ts.map +1 -1
- package/dist/lib/remote-ui/action-execution.js +1 -0
- package/dist/lib/remote-ui/action-execution.js.map +1 -1
- package/dist/lib/remote-ui/app-source.js +80 -24
- package/dist/lib/remote-ui/app-source.js.map +1 -1
- package/dist/lib/remote-ui/components/task-status.d.ts +3 -0
- package/dist/lib/remote-ui/components/task-status.d.ts.map +1 -1
- package/dist/lib/remote-ui/components/task-status.js +59 -4
- package/dist/lib/remote-ui/components/task-status.js.map +1 -1
- package/dist/lib/remote-ui/contract-import.d.ts +3 -1
- package/dist/lib/remote-ui/contract-import.d.ts.map +1 -1
- package/dist/lib/remote-ui/contract-import.js +2 -0
- package/dist/lib/remote-ui/contract-import.js.map +1 -1
- package/dist/lib/remote-ui/contracts.d.ts +3 -1
- package/dist/lib/remote-ui/contracts.d.ts.map +1 -1
- package/dist/lib/remote-ui/import-task-status.d.ts +36 -1
- package/dist/lib/remote-ui/import-task-status.d.ts.map +1 -1
- package/dist/lib/remote-ui/import-task-status.js +107 -2
- package/dist/lib/remote-ui/import-task-status.js.map +1 -1
- package/dist/lib/remote-ui/pages/catalogs.css +91 -0
- package/dist/lib/remote-ui/pages/catalogs.d.ts +18 -0
- package/dist/lib/remote-ui/pages/catalogs.d.ts.map +1 -1
- package/dist/lib/remote-ui/pages/catalogs.js +4 -3
- package/dist/lib/remote-ui/pages/catalogs.js.map +1 -1
- package/dist/lib/remote-ui/pages/contracts.css +42 -6
- package/dist/lib/remote-ui/pages/contracts.d.ts.map +1 -1
- package/dist/lib/remote-ui/pages/contracts.js +10 -2
- package/dist/lib/remote-ui/pages/contracts.js.map +1 -1
- package/dist/lib/remote-ui/polling.d.ts +1 -0
- package/dist/lib/remote-ui/polling.d.ts.map +1 -1
- package/dist/lib/remote-ui/polling.js +6 -1
- package/dist/lib/remote-ui/polling.js.map +1 -1
- package/dist/lib/remote-ui/styles.css +40 -12
- package/dist/lib/types.d.ts +1 -1
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/types.js +1 -1
- package/dist/lib/types.js.map +1 -1
- package/dist/lib/workbench-action-contract.d.ts +1 -1
- package/dist/lib/workbench-action-contract.d.ts.map +1 -1
- package/dist/lib/workbench-action-contract.js +1 -0
- package/dist/lib/workbench-action-contract.js.map +1 -1
- package/dist/lib/workbench-view.provider.d.ts.map +1 -1
- package/dist/lib/workbench-view.provider.js +19 -2
- package/dist/lib/workbench-view.provider.js.map +1 -1
- package/dist/lib/workbench.service.d.ts +19 -1
- package/dist/lib/workbench.service.d.ts.map +1 -1
- package/dist/lib/workbench.service.js +120 -19
- package/dist/lib/workbench.service.js.map +1 -1
- 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,
|
|
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":"AAAA,OAAO,EAAE,oBAAoB,EAA2B,MAAM,iCAAiC,CAAA;AAa/F,MAAM,CAAC,MAAM,4BAA4B,GAAyD;IAChG,OAAO,EAAE,QAAQ;IACjB,yBAAyB,EAAE,QAAQ;IACnC,cAAc,EAAE,QAAQ;IACxB,qBAAqB,EAAE,QAAQ;IAC/B,uBAAuB,EAAE,QAAQ;IACjC,uBAAuB,EAAE,QAAQ;IACjC,yBAAyB,EAAE,QAAQ;IACnC,oBAAoB,EAAE,QAAQ;IAC9B,6BAA6B,EAAE,QAAQ;IACvC,eAAe,EAAE,QAAQ;IACzB,qBAAqB,EAAE,QAAQ;IAC/B,iBAAiB,EAAE,QAAQ;IAC3B,oBAAoB,EAAE,QAAQ;IAC9B,eAAe,EAAE,QAAQ;IACzB,yBAAyB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE;IACrE,wBAAwB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE;IACrE,4BAA4B,EAAE,QAAQ;IACtC,+BAA+B,EAAE,QAAQ;IACzC,2BAA2B,EAAE,QAAQ;IACrC,2CAA2C,EAAE,QAAQ;IACrD,aAAa,EAAE,QAAQ;IACvB,aAAa,EAAE,QAAQ;IACvB,wBAAwB,EAAE,QAAQ;IAClC,oBAAoB,EAAE,QAAQ;IAC9B,oBAAoB,EAAE,QAAQ;IAC9B,gBAAgB,EAAE,QAAQ;IAC1B,oBAAoB,EAAE,QAAQ;IAC9B,mBAAmB,EAAE,QAAQ;IAC7B,mBAAmB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE;IAC9D,sBAAsB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,iBAAiB,EAAE;IACxE,iBAAiB,EAAE,QAAQ;IAC3B,oBAAoB,EAAE,QAAQ;IAC9B,mBAAmB,EAAE,QAAQ;IAC7B,sBAAsB,EAAE,QAAQ;IAChC,cAAc,EAAE,QAAQ;IACxB,kBAAkB,EAAE,QAAQ;CAC7B,CAAA;AAED,MAAM,cAAc,GAAG,IAAI,GAAG,CAAqB;IACjD,uBAAuB;IACvB,yBAAyB;IACzB,yBAAyB;IACzB,2BAA2B;IAC3B,sBAAsB;IACtB,+BAA+B;IAC/B,iBAAiB;IACjB,uBAAuB;IACvB,mBAAmB;IACnB,sBAAsB;IACtB,iCAAiC;IACjC,eAAe;CAChB,CAAC,CAAA;AAEF,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAI,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,oBAAoB,EAOpI;IACC,IAAI,CAAC;QACH,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,aAAa,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;QACvF,MAAM,MAAM,GAAG,4BAA4B,CAAC,SAAS,CAAC,CAAA;QACtD,MAAM,MAAM,GAAG,MAAM,MAAM,EAAE,CAAA;QAC7B,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,CAAA;QAC/E,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAA;QAClB,IAAI,MAAM,CAAC,OAAO,IAAI,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACpD,IAAI,CAAC;gBAAC,MAAM,OAAO,EAAE,CAAA;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;YAAC,CAAC;QAClF,CAAC;QACD,IAAI,MAAM,KAAK,QAAQ;YAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;QAC5G,OAAO,MAAM,CAAA;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,4BAA4B,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QACpG,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,QAAQ;YAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;QACtI,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAoB;IAChD,OAAO,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,EAAE,CAAA;AACtD,CAAC"}
|
|
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,
|
|
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
|
|
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;
|