@chenchaolong/plugin-trade-compliance-workbench 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,49 +1,682 @@
1
- (function () {
2
- const root = document.getElementById('root')
1
+ ;(function () {
2
+ const CHANNEL = 'xpertai.remote_component'
3
+ const VERSION = 1
3
4
  const h = React.createElement
5
+ let instanceId = null
6
+ let requestSequence = 0
7
+ const pending = new Map()
8
+
9
+ injectStyles()
10
+
11
+ function isObject(value) {
12
+ return value && typeof value === 'object' && !Array.isArray(value)
13
+ }
14
+
15
+ function post(type, body, transfer) {
16
+ if (!instanceId && type !== 'ready') return
17
+ parent.postMessage(Object.assign({ channel: CHANNEL, protocolVersion: VERSION, instanceId, type }, body || {}), '*', transfer || [])
18
+ }
19
+
20
+ function request(type, body, transfer) {
21
+ const requestId = String(++requestSequence)
22
+ return new Promise((resolve, reject) => {
23
+ pending.set(requestId, { resolve, reject })
24
+ post(type, Object.assign({ requestId }, body || {}), transfer)
25
+ setTimeout(() => {
26
+ if (!pending.has(requestId)) return
27
+ pending.delete(requestId)
28
+ reject(new Error('请求超时'))
29
+ }, 30000)
30
+ })
31
+ }
32
+
33
+ function reportResize() {
34
+ const height = Math.max(document.body.scrollHeight, document.documentElement.scrollHeight, 720)
35
+ post('resize', { height })
36
+ }
37
+
38
+ async function toFilePayload(file) {
39
+ const buffer = await file.arrayBuffer()
40
+ return {
41
+ payload: {
42
+ name: file.name,
43
+ type: file.type,
44
+ size: file.size,
45
+ lastModified: file.lastModified,
46
+ buffer
47
+ },
48
+ transfer: [buffer]
49
+ }
50
+ }
51
+
52
+ function executeAction(actionKey, targetId, input, parameters) {
53
+ return request('executeAction', { actionKey, targetId, input, parameters })
54
+ }
55
+
56
+ async function executeFileAction(actionKey, file, input, parameters) {
57
+ const filePayload = await toFilePayload(file)
58
+ return request('executeFileAction', { actionKey, file: filePayload.payload, input, parameters }, filePayload.transfer)
59
+ }
60
+
61
+ function notify(level, message) {
62
+ post('notify', { level, message })
63
+ }
64
+
65
+ async function dispatchAssistantCommands(payload) {
66
+ const commands = collectAssistantCommands(payload)
67
+ let dispatched = 0
68
+ for (const command of commands) {
69
+ const response = await request('invokeClientCommand', {
70
+ commandKey: command.commandKey,
71
+ payload: command.payload
72
+ })
73
+ const result = getResponsePayload(response)
74
+ if (result && result.success === false) {
75
+ throw new Error(resolveMessage(result.message) || '智能体消息发送失败')
76
+ }
77
+ dispatched += 1
78
+ }
79
+ return dispatched
80
+ }
4
81
 
5
82
  function App() {
6
- const tabs = ['管控商品管理', '商品管理', '报关资料生成']
7
- return h('div', { style: styles.shell },
8
- h('header', { style: styles.header },
9
- h('div', null,
10
- h('h1', { style: styles.title }, 'Trade Compliance Workbench'),
11
- h('p', { style: styles.subtitle }, '外贸合规工作台:管控商品、供应商商品和报关资料生成')
83
+ const [context, setContext] = React.useState(null)
84
+ const [data, setData] = React.useState(normalizeData(null))
85
+ const [activePage, setActivePage] = React.useState('controlled-goods-page')
86
+ const [selectedReviewId, setSelectedReviewId] = React.useState(null)
87
+ const [busy, setBusy] = React.useState(false)
88
+ const [notice, setNotice] = React.useState('')
89
+ const [query, setQuery] = React.useState('')
90
+ const [form, setForm] = React.useState({ productName: '', hsCode: '', keywords: '', controlNote: '', enabled: true })
91
+
92
+ React.useEffect(() => {
93
+ window.__tradeComplianceSetContext = (nextContext) => {
94
+ setContext(nextContext)
95
+ setData(normalizeData(nextContext && nextContext.payload))
96
+ setTimeout(() => reload(nextContext), 0)
97
+ }
98
+ window.__tradeComplianceHostEvent = () => reload()
99
+ post('ready')
100
+ return () => {
101
+ window.__tradeComplianceSetContext = null
102
+ window.__tradeComplianceHostEvent = null
103
+ }
104
+ }, [])
105
+
106
+ React.useEffect(reportResize, [data, activePage, selectedReviewId, busy, notice])
107
+
108
+ const reviewItems = data.reviewItems
109
+ const pendingItems = reviewItems.filter((item) => (item.reviewStatus || 'pending') === 'pending')
110
+ const selectedReview = reviewItems.find((item) => item.id === selectedReviewId) || pendingItems[0] || reviewItems[0] || null
111
+ const filteredControlledGoods = filterItems(data.controlledGoods, query, ['productName', 'hsCode', 'controlNote'])
112
+ const filteredProducts = filterItems(data.products, query, ['supplierName', 'productName', 'model', 'enrichedHsCode', 'englishName'])
113
+ const filteredWorkbooks = filterItems(data.workbookGenerations, query, ['fileName', 'invoiceNo', 'contractNo', 'sourceFileName'])
114
+
115
+ async function reload(nextContext) {
116
+ const activeContext = nextContext || context
117
+ if (!activeContext) return
118
+ setBusy(true)
119
+ try {
120
+ const response = await request('requestData', { query: { page: 1, pageSize: 100, search: query, parameters: {} } })
121
+ setData(normalizeData(getResponsePayload(response)))
122
+ } catch (error) {
123
+ showNotice('刷新失败:' + getErrorMessage(error), 'error')
124
+ } finally {
125
+ setBusy(false)
126
+ }
127
+ }
128
+
129
+ async function handleFile(actionKey, file) {
130
+ if (!file || busy) return
131
+ setBusy(true)
132
+ try {
133
+ const response = await executeFileAction(actionKey, file, { name: file.name, fileName: file.name }, {})
134
+ assertActionSuccess(response)
135
+ const dispatched = await dispatchAssistantCommands(getResponsePayload(response))
136
+ showNotice(dispatched ? '文件已发送给智能体解析,识别结果会进入待审核列表。' : '文件已提交,识别结果会进入待审核列表。', 'success')
137
+ await reload()
138
+ } catch (error) {
139
+ showNotice(getErrorMessage(error), 'error')
140
+ } finally {
141
+ setBusy(false)
142
+ }
143
+ }
144
+
145
+ async function saveControlledGoods(event) {
146
+ event.preventDefault()
147
+ if (!form.productName.trim() || busy) return
148
+ setBusy(true)
149
+ try {
150
+ const response = await executeAction('save_controlled_goods', null, {
151
+ productName: form.productName.trim(),
152
+ hsCode: form.hsCode.trim() || undefined,
153
+ keywords: form.keywords.split(/[,\s,、]+/).map((item) => item.trim()).filter(Boolean),
154
+ controlNote: form.controlNote.trim() || undefined,
155
+ enabled: form.enabled
156
+ }, {})
157
+ assertActionSuccess(response)
158
+ setForm({ productName: '', hsCode: '', keywords: '', controlNote: '', enabled: true })
159
+ showNotice('管控商品已保存。', 'success')
160
+ await reload()
161
+ } catch (error) {
162
+ showNotice(getErrorMessage(error), 'error')
163
+ } finally {
164
+ setBusy(false)
165
+ }
166
+ }
167
+
168
+ async function confirmReview(item) {
169
+ if (!item || !item.id || busy) return
170
+ setBusy(true)
171
+ try {
172
+ const confirmedData = Object.assign({}, item.defaultData || {}, item.extractedData || {}, item.confirmedData || {})
173
+ const response = await executeAction('confirm_review_item', item.id, { itemId: item.id, confirmedData }, {})
174
+ assertActionSuccess(response)
175
+ showNotice('审核项已确认。', 'success')
176
+ await reload()
177
+ } catch (error) {
178
+ showNotice(getErrorMessage(error), 'error')
179
+ } finally {
180
+ setBusy(false)
181
+ }
182
+ }
183
+
184
+ async function generateWorkbook() {
185
+ if (busy) return
186
+ const salesItem = reviewItems.find((item) => item.type === 'customs_workbook')
187
+ setBusy(true)
188
+ try {
189
+ const base = Object.assign({}, salesItem && salesItem.defaultData, salesItem && salesItem.extractedData, salesItem && salesItem.confirmedData)
190
+ const invoiceNo = base.invoiceNo || ('INV-' + new Date().toISOString().slice(0, 10).replace(/-/g, ''))
191
+ const response = await executeAction('generate_customs_workbook', null, {
192
+ invoiceNo,
193
+ contractNo: base.contractNo,
194
+ sourceFileName: base.sourceFileName,
195
+ fileName: invoiceNo + '-销售发票.xlsx',
196
+ workbookData: base
197
+ }, {})
198
+ assertActionSuccess(response)
199
+ showNotice('销售发票已生成并写入历史。', 'success')
200
+ await reload()
201
+ } catch (error) {
202
+ showNotice(getErrorMessage(error), 'error')
203
+ } finally {
204
+ setBusy(false)
205
+ }
206
+ }
207
+
208
+ function showNotice(message, level) {
209
+ setNotice((level === 'error' ? '错误:' : '') + message)
210
+ notify(level || 'info', message)
211
+ setTimeout(() => setNotice(''), 4000)
212
+ }
213
+
214
+ return h('div', { className: 'tcw-shell' },
215
+ h('header', { className: 'tcw-header' },
216
+ h('div', { className: 'tcw-title-block' },
217
+ h('span', { className: 'tcw-kicker' }, '外贸合规工作台'),
218
+ h('h1', null, 'Trade Compliance Workbench'),
219
+ h('p', null, '管控商品维护、供应商商品审核、销售发票生成')
220
+ ),
221
+ h('div', { className: 'tcw-header-actions' },
222
+ h('input', {
223
+ className: 'tcw-search',
224
+ value: query,
225
+ placeholder: '搜索商品、供应商、海关编码',
226
+ onChange: (event) => setQuery(event.target.value)
227
+ }),
228
+ h('button', { className: 'tcw-btn tcw-btn-soft', disabled: busy, onClick: () => reload() }, busy ? '处理中' : '刷新')
12
229
  )
13
230
  ),
14
- h('nav', { style: styles.tabs }, tabs.map((tab, index) =>
15
- h('button', { key: tab, style: index === 0 ? styles.activeTab : styles.tab }, tab)
16
- )),
17
- h('main', { style: styles.grid },
18
- h('section', { style: styles.panel },
19
- h('h2', { style: styles.panelTitle }, '待审核列表'),
20
- h('div', { style: styles.row }, '数字计算机 | 8471501010 | 明确命中 | 待确认'),
21
- h('div', { style: styles.row }, '服务器 | HPC-8208 | 疑似管控 | 待确认'),
22
- h('div', { style: styles.row }, 'INV-2026-001 | 报关资料 | 待生成')
231
+ notice ? h('div', { className: 'tcw-notice' }, notice) : null,
232
+ h('section', { className: 'tcw-metrics' },
233
+ metric('待审核', pendingItems.length),
234
+ metric('管控商品', data.controlledGoods.length),
235
+ metric('供应商商品', data.products.length),
236
+ metric('发票历史', data.workbookGenerations.length)
237
+ ),
238
+ h('nav', { className: 'tcw-tabs' }, [
239
+ tab('controlled-goods-page', '管控商品管理'),
240
+ tab('products-page', '商品管理'),
241
+ tab('workbooks-page', '生成销售发票')
242
+ ]),
243
+ h('main', { className: 'tcw-main' },
244
+ h('section', { className: 'tcw-content' },
245
+ activePage === 'controlled-goods-page' ? renderControlledGoodsPage() : null,
246
+ activePage === 'products-page' ? renderProductsPage() : null,
247
+ activePage === 'workbooks-page' ? renderWorkbooksPage() : null
248
+ ),
249
+ renderReviewDrawer(selectedReview)
250
+ )
251
+ )
252
+
253
+ function tab(key, label) {
254
+ return h('button', {
255
+ key,
256
+ className: key === activePage ? 'tcw-tab active' : 'tcw-tab',
257
+ onClick: () => setActivePage(key)
258
+ }, label)
259
+ }
260
+
261
+ function renderControlledGoodsPage() {
262
+ return h('div', { className: 'tcw-page controlled-goods-page' },
263
+ h('div', { className: 'tcw-page-head' },
264
+ h('div', null, h('h2', null, '管控商品管理'), h('p', null, '上传目录文件识别管控商品,也可以人工维护规则。')),
265
+ uploadButton('upload_controlled_goods_file', '上传管控商品文件', 'accept-pdf-doc-xls')
266
+ ),
267
+ h('form', { className: 'tcw-form', onSubmit: saveControlledGoods },
268
+ field('商品名称', h('input', { value: form.productName, onChange: updateForm('productName'), placeholder: '例如:高性能服务器' })),
269
+ field('海关编码', h('input', { value: form.hsCode, onChange: updateForm('hsCode'), placeholder: '例如:8471501010' })),
270
+ field('关键词', h('input', { value: form.keywords, onChange: updateForm('keywords'), placeholder: '逗号或空格分隔' })),
271
+ field('管控说明', h('input', { value: form.controlNote, onChange: updateForm('controlNote'), placeholder: '许可证、两用物项、禁限说明' })),
272
+ h('label', { className: 'tcw-check' }, h('input', { type: 'checkbox', checked: form.enabled, onChange: (event) => setForm(Object.assign({}, form, { enabled: event.target.checked })) }), '启用'),
273
+ h('button', { className: 'tcw-btn tcw-btn-primary', disabled: busy || !form.productName.trim(), type: 'submit' }, '保存')
23
274
  ),
24
- h('aside', { style: styles.panel },
25
- h('h2', { style: styles.panelTitle }, '详情抽屉'),
26
- h('p', null, '展示原始证据、识别值、默认值、人工确认值和管控命中依据。'),
27
- h('button', { style: styles.primary }, '确认当前记录')
275
+ table(['商品名称', '海关编码', '关键词', '状态', '管控说明'], filteredControlledGoods, (item) => [
276
+ value(item.productName),
277
+ value(item.hsCode),
278
+ Array.isArray(item.keywords) ? item.keywords.join('') : '-',
279
+ status(item.enabled === false ? '停用' : '启用', item.enabled === false ? 'muted' : 'ok'),
280
+ value(item.controlNote)
281
+ ], '暂无管控商品,先上传目录或手动新增。')
282
+ )
283
+ }
284
+
285
+ function renderProductsPage() {
286
+ const groups = groupBy(filteredProducts, (item) => value(item.supplierName, '未识别供应商'))
287
+ return h('div', { className: 'tcw-page products-page' },
288
+ h('div', { className: 'tcw-page-head' },
289
+ h('div', null, h('h2', null, '商品管理'), h('p', null, '上传供应商合同后,商品信息按供应商归类并进入审核。')),
290
+ uploadButton('upload_supplier_contract', '上传供应商合同', 'accept-doc-xls-pdf')
291
+ ),
292
+ Object.keys(groups).length === 0
293
+ ? empty('暂无供应商商品,上传供应商合同后在这里审核。')
294
+ : Object.keys(groups).sort().map((supplier) =>
295
+ h('section', { className: 'tcw-supplier-block', key: supplier },
296
+ h('div', { className: 'tcw-supplier-head' }, h('strong', null, supplier), h('span', null, groups[supplier].length + ' 个商品')),
297
+ table(['商品', '型号', '海关编码', '退税率', '英文品名', '管控状态'], groups[supplier], (item) => [
298
+ value(item.productName),
299
+ value(item.model),
300
+ value(item.enrichedHsCode || item.contractHsCode),
301
+ value(item.taxRefundRate),
302
+ value(item.englishName),
303
+ status(controlStatusText(item.controlledStatus), controlStatusLevel(item.controlledStatus))
304
+ ])
305
+ )
306
+ )
307
+ )
308
+ }
309
+
310
+ function renderWorkbooksPage() {
311
+ const salesReviews = reviewItems.filter((item) => item.type === 'customs_workbook')
312
+ return h('div', { className: 'tcw-page workbooks-page' },
313
+ h('div', { className: 'tcw-page-head' },
314
+ h('div', null, h('h2', null, '生成销售发票'), h('p', null, '上传购销合同识别发票字段,审核后生成固定模板 Excel。')),
315
+ h('div', { className: 'tcw-button-row' },
316
+ uploadButton('upload_sales_contract', '上传购销合同', 'accept-doc-xls-pdf'),
317
+ h('button', { className: 'tcw-btn tcw-btn-primary', disabled: busy, onClick: generateWorkbook }, '生成销售发票')
318
+ )
319
+ ),
320
+ h('div', { className: 'tcw-split' },
321
+ h('section', null,
322
+ h('h3', null, '购销合同识别历史'),
323
+ table(['文件/标题', '审核状态', '发票号', '合同号'], salesReviews, (item) => [
324
+ value(item.title),
325
+ status(reviewStatusText(item.reviewStatus), item.reviewStatus === 'confirmed' ? 'ok' : 'warn'),
326
+ value(readMerged(item).invoiceNo),
327
+ value(readMerged(item).contractNo)
328
+ ], '暂无购销合同上传记录。')
329
+ ),
330
+ h('section', null,
331
+ h('h3', null, '已生成销售发票'),
332
+ table(['文件名', '发票号', '合同号', '模板工作表', '状态'], filteredWorkbooks, (item) => [
333
+ value(item.fileName),
334
+ value(item.invoiceNo),
335
+ value(item.contractNo),
336
+ Array.isArray(item.sheetNames) ? item.sheetNames.join('、') : '-',
337
+ status(value(item.status, 'generated'), 'ok')
338
+ ], '暂无销售发票生成历史。')
339
+ )
28
340
  )
29
341
  )
342
+ }
343
+
344
+ function renderReviewDrawer(item) {
345
+ return h('aside', { className: 'tcw-drawer' },
346
+ h('div', { className: 'tcw-drawer-head' },
347
+ h('div', null, h('h2', null, '对比审核'), h('p', null, item ? item.title : '暂无待审核信息')),
348
+ item ? status(reviewStatusText(item.reviewStatus), item.reviewStatus === 'confirmed' ? 'ok' : 'warn') : null
349
+ ),
350
+ !item ? empty('上传文件或等待智能体识别后,审核项会显示在这里。') : [
351
+ h('div', { className: 'tcw-review-list', key: 'list' },
352
+ reviewItems.slice(0, 8).map((review) =>
353
+ h('button', {
354
+ className: review.id === item.id ? 'tcw-review-chip active' : 'tcw-review-chip',
355
+ key: review.id || review.title,
356
+ onClick: () => setSelectedReviewId(review.id || null)
357
+ }, h('span', null, reviewTypeText(review.type)), h('strong', null, review.title))
358
+ )
359
+ ),
360
+ compareBlock('识别值', item.extractedData),
361
+ compareBlock('默认值', item.defaultData),
362
+ compareBlock('人工确认值', item.confirmedData),
363
+ h('div', { className: 'tcw-evidence', key: 'evidence' },
364
+ h('span', null, '来源证据'),
365
+ h('strong', null, value(item.sourceLocation || readMerged(item).sourceFileName))
366
+ ),
367
+ h('button', { className: 'tcw-btn tcw-btn-primary tcw-wide', key: 'confirm', disabled: busy || item.reviewStatus === 'confirmed', onClick: () => confirmReview(item) }, item.reviewStatus === 'confirmed' ? '已确认' : '确认当前记录')
368
+ ]
369
+ )
370
+ }
371
+
372
+ function uploadButton(actionKey, label, inputClass) {
373
+ const id = actionKey + '-input'
374
+ return h('label', { className: 'tcw-upload' },
375
+ h('input', {
376
+ id,
377
+ className: inputClass,
378
+ type: 'file',
379
+ disabled: busy,
380
+ onChange: (event) => {
381
+ const file = event.target.files && event.target.files[0]
382
+ event.target.value = ''
383
+ handleFile(actionKey, file)
384
+ }
385
+ }),
386
+ h('span', null, label)
387
+ )
388
+ }
389
+
390
+ function updateForm(key) {
391
+ return (event) => setForm(Object.assign({}, form, { [key]: event.target.value }))
392
+ }
393
+ }
394
+
395
+ function metric(label, valueText) {
396
+ return h('div', { className: 'tcw-metric' }, h('span', null, label), h('strong', null, valueText))
397
+ }
398
+
399
+ function field(label, child) {
400
+ return h('label', { className: 'tcw-field' }, h('span', null, label), child)
401
+ }
402
+
403
+ function table(headers, rows, mapRow, emptyText) {
404
+ if (!rows || rows.length === 0) return empty(emptyText || '暂无数据。')
405
+ return h('div', { className: 'tcw-table-wrap' },
406
+ h('table', { className: 'tcw-table' },
407
+ h('thead', null, h('tr', null, headers.map((item) => h('th', { key: item }, item)))),
408
+ h('tbody', null, rows.map((row, index) => h('tr', { key: row.id || index }, mapRow(row).map((cell, cellIndex) => h('td', { key: cellIndex }, cell)))))
409
+ )
410
+ )
411
+ }
412
+
413
+ function compareBlock(label, data) {
414
+ const entries = Object.entries(isObject(data) ? data : {})
415
+ return h('section', { className: 'tcw-compare', key: label },
416
+ h('h3', null, label),
417
+ entries.length === 0 ? h('p', null, '暂无') : entries.slice(0, 12).map(([key, val]) =>
418
+ h('div', { className: 'tcw-kv', key }, h('span', null, key), h('strong', null, stringify(val)))
419
+ )
30
420
  )
31
421
  }
32
422
 
33
- const styles = {
34
- shell: { fontFamily: 'Inter, system-ui, sans-serif', padding: 24, color: '#172033', background: '#f7f8fb', minHeight: '100vh' },
35
- header: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 18 },
36
- title: { margin: 0, fontSize: 24 },
37
- subtitle: { margin: '6px 0 0', color: '#64748b' },
38
- tabs: { display: 'flex', gap: 8, marginBottom: 18 },
39
- tab: { border: '1px solid #d7dde8', background: '#fff', padding: '8px 12px', borderRadius: 6 },
40
- activeTab: { border: '1px solid #0f766e', background: '#e6fffb', color: '#0f766e', padding: '8px 12px', borderRadius: 6 },
41
- grid: { display: 'grid', gridTemplateColumns: '1.4fr .8fr', gap: 16 },
42
- panel: { background: '#fff', border: '1px solid #e2e8f0', borderRadius: 8, padding: 16 },
43
- panelTitle: { margin: '0 0 12px', fontSize: 16 },
44
- row: { padding: 12, border: '1px solid #edf2f7', borderRadius: 6, marginBottom: 8 },
45
- primary: { background: '#0f766e', color: '#fff', border: 0, borderRadius: 6, padding: '8px 12px' }
423
+ function status(text, level) {
424
+ return h('span', { className: 'tcw-status ' + (level || 'muted') }, text)
425
+ }
426
+
427
+ function empty(text) {
428
+ return h('div', { className: 'tcw-empty' }, text)
429
+ }
430
+
431
+ function normalizeData(payload) {
432
+ const body = payload && payload.summary ? payload.summary : payload || {}
433
+ return {
434
+ reviewItems: Array.isArray(body.reviewItems) ? body.reviewItems : [],
435
+ controlledGoods: Array.isArray(body.controlledGoods) ? body.controlledGoods : [],
436
+ products: Array.isArray(body.products) ? body.products : [],
437
+ workbookGenerations: Array.isArray(body.workbookGenerations) ? body.workbookGenerations : []
438
+ }
439
+ }
440
+
441
+ function getResponsePayload(response) {
442
+ if (!response) return null
443
+ if (Object.prototype.hasOwnProperty.call(response, 'payload')) return response.payload
444
+ if (Object.prototype.hasOwnProperty.call(response, 'data')) return response.data
445
+ if (response.result) return response.result
446
+ return response
447
+ }
448
+
449
+ function assertActionSuccess(response) {
450
+ const payload = getResponsePayload(response)
451
+ if (payload && payload.success === false) {
452
+ throw new Error(resolveMessage(payload.message) || '操作失败')
453
+ }
454
+ }
455
+
456
+ function collectAssistantCommands(payload) {
457
+ if (!payload || typeof payload !== 'object') return []
458
+ const commands = []
459
+ if (Array.isArray(payload.messages)) {
460
+ payload.messages.forEach((message) => {
461
+ const command = normalizeAssistantCommand(message)
462
+ if (command) commands.push(command)
463
+ })
464
+ }
465
+ const directCommand = normalizeAssistantCommand(payload)
466
+ if (directCommand) commands.push(directCommand)
467
+ return commands
468
+ }
469
+
470
+ function normalizeAssistantCommand(value) {
471
+ if (!value || typeof value !== 'object' || value.commandKey !== 'assistant.chat.send_message' || !value.payload) {
472
+ return null
473
+ }
474
+ const text = typeof value.payload.text === 'string' && value.payload.text.trim() ? value.payload.text : ''
475
+ if (!text) return null
476
+ return {
477
+ commandKey: value.commandKey,
478
+ payload: Object.assign({}, value.payload, { text })
479
+ }
480
+ }
481
+
482
+ function resolveMessage(message) {
483
+ if (!message) return ''
484
+ if (typeof message === 'string') return message
485
+ if (typeof message.zh_Hans === 'string') return message.zh_Hans
486
+ if (typeof message.en_US === 'string') return message.en_US
487
+ return ''
488
+ }
489
+
490
+ function getErrorMessage(error) {
491
+ return error && error.message ? error.message : String(error || '操作失败')
492
+ }
493
+
494
+ function filterItems(items, query, keys) {
495
+ const keyword = String(query || '').trim().toLowerCase()
496
+ if (!keyword) return items
497
+ return items.filter((item) => keys.some((key) => String(item && item[key] || '').toLowerCase().includes(keyword)))
498
+ }
499
+
500
+ function groupBy(items, keyFn) {
501
+ return items.reduce((acc, item) => {
502
+ const key = keyFn(item)
503
+ acc[key] = acc[key] || []
504
+ acc[key].push(item)
505
+ return acc
506
+ }, {})
507
+ }
508
+
509
+ function readMerged(item) {
510
+ return Object.assign({}, item && item.defaultData, item && item.extractedData, item && item.confirmedData)
511
+ }
512
+
513
+ function value(input, fallback) {
514
+ if (input === 0) return '0'
515
+ return input == null || input === '' ? (fallback || '-') : String(input)
516
+ }
517
+
518
+ function stringify(input) {
519
+ if (input == null || input === '') return '-'
520
+ if (typeof input === 'object') return JSON.stringify(input)
521
+ return String(input)
522
+ }
523
+
524
+ function reviewTypeText(type) {
525
+ if (type === 'controlled_goods') return '管控'
526
+ if (type === 'supplier_product') return '商品'
527
+ if (type === 'customs_workbook') return '发票'
528
+ return value(type)
529
+ }
530
+
531
+ function reviewStatusText(statusText) {
532
+ if (statusText === 'confirmed') return '已确认'
533
+ if (statusText === 'rejected') return '已驳回'
534
+ if (statusText === 'needs_revision') return '需修订'
535
+ return '待审核'
536
+ }
537
+
538
+ function controlStatusText(statusText) {
539
+ if (statusText === 'controlled') return '管控'
540
+ if (statusText === 'suspected') return '疑似管控'
541
+ if (statusText === 'not_controlled') return '非管控'
542
+ return '未检查'
543
+ }
544
+
545
+ function controlStatusLevel(statusText) {
546
+ if (statusText === 'controlled') return 'danger'
547
+ if (statusText === 'suspected') return 'warn'
548
+ if (statusText === 'not_controlled') return 'ok'
549
+ return 'muted'
46
550
  }
47
551
 
48
- ReactDOM.render(h(App), root)
552
+ function injectStyles() {
553
+ const style = document.createElement('style')
554
+ style.textContent = `
555
+ :root {
556
+ color-scheme: light;
557
+ --tcw-bg: #f4f6f8;
558
+ --tcw-card: #ffffff;
559
+ --tcw-card-soft: #f8fafb;
560
+ --tcw-text: #17202e;
561
+ --tcw-muted: #5d6b7a;
562
+ --tcw-border: #dbe2ea;
563
+ --tcw-primary: #176b87;
564
+ --tcw-primary-dark: #0f5167;
565
+ --tcw-success: #1b7f4c;
566
+ --tcw-warning: #a35f00;
567
+ --tcw-danger: #b42318;
568
+ }
569
+ * { box-sizing: border-box; }
570
+ body { margin: 0; background: var(--tcw-bg); color: var(--tcw-text); font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; }
571
+ button, input { font: inherit; letter-spacing: 0; }
572
+ .tcw-shell { display: grid; gap: 14px; min-height: 100vh; padding: 18px; }
573
+ .tcw-header { display: grid; grid-template-columns: minmax(0, 1fr) minmax(360px, 520px); gap: 16px; align-items: end; }
574
+ .tcw-title-block { display: grid; gap: 5px; }
575
+ .tcw-kicker { color: var(--tcw-primary); font-size: 12px; font-weight: 800; }
576
+ .tcw-title-block h1 { margin: 0; font-size: 24px; line-height: 1.25; }
577
+ .tcw-title-block p, .tcw-page-head p, .tcw-drawer-head p { margin: 0; color: var(--tcw-muted); font-size: 13px; }
578
+ .tcw-header-actions { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 8px; }
579
+ .tcw-search, .tcw-field input { width: 100%; min-height: 36px; border: 1px solid var(--tcw-border); border-radius: 6px; background: var(--tcw-card); color: var(--tcw-text); padding: 8px 10px; }
580
+ .tcw-btn, .tcw-upload { display: inline-flex; align-items: center; justify-content: center; gap: 6px; min-height: 36px; border: 1px solid var(--tcw-border); border-radius: 6px; background: var(--tcw-card); color: var(--tcw-text); padding: 8px 12px; cursor: pointer; white-space: nowrap; }
581
+ .tcw-btn:disabled, .tcw-upload:has(input:disabled) { cursor: not-allowed; opacity: .55; }
582
+ .tcw-btn-primary { border-color: var(--tcw-primary); background: var(--tcw-primary); color: #fff; }
583
+ .tcw-btn-primary:hover:not(:disabled) { background: var(--tcw-primary-dark); }
584
+ .tcw-btn-soft { background: var(--tcw-card-soft); }
585
+ .tcw-wide { width: 100%; }
586
+ .tcw-upload { border-style: dashed; border-color: color-mix(in srgb, var(--tcw-primary) 42%, var(--tcw-border)); color: var(--tcw-primary); font-weight: 700; }
587
+ .tcw-upload input { display: none; }
588
+ .tcw-notice { border: 1px solid color-mix(in srgb, var(--tcw-primary) 26%, var(--tcw-border)); border-radius: 6px; background: color-mix(in srgb, var(--tcw-primary) 8%, var(--tcw-card)); padding: 10px 12px; color: var(--tcw-primary-dark); font-size: 13px; }
589
+ .tcw-metrics { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 10px; }
590
+ .tcw-metric { display: grid; gap: 4px; border: 1px solid var(--tcw-border); border-radius: 8px; background: var(--tcw-card); padding: 12px; }
591
+ .tcw-metric span { color: var(--tcw-muted); font-size: 12px; }
592
+ .tcw-metric strong { font-size: 22px; line-height: 1; }
593
+ .tcw-tabs { display: flex; gap: 8px; border-bottom: 1px solid var(--tcw-border); }
594
+ .tcw-tab { min-height: 38px; border: 0; border-bottom: 3px solid transparent; background: transparent; color: var(--tcw-muted); padding: 8px 12px; cursor: pointer; font-weight: 800; }
595
+ .tcw-tab.active { border-color: var(--tcw-primary); color: var(--tcw-primary); }
596
+ .tcw-main { display: grid; grid-template-columns: minmax(0, 1fr) minmax(320px, 390px); gap: 14px; align-items: start; }
597
+ .tcw-content, .tcw-drawer, .tcw-supplier-block { border: 1px solid var(--tcw-border); border-radius: 8px; background: var(--tcw-card); }
598
+ .tcw-content { min-width: 0; padding: 14px; }
599
+ .tcw-page { display: grid; gap: 14px; }
600
+ .tcw-page-head, .tcw-drawer-head, .tcw-supplier-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; }
601
+ .tcw-page-head h2, .tcw-drawer-head h2, .tcw-split h3 { margin: 0 0 5px; font-size: 17px; line-height: 1.35; }
602
+ .tcw-button-row { display: flex; flex-wrap: wrap; gap: 8px; justify-content: flex-end; }
603
+ .tcw-form { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)) auto auto; gap: 10px; align-items: end; border: 1px solid var(--tcw-border); border-radius: 8px; background: var(--tcw-card-soft); padding: 12px; }
604
+ .tcw-field { display: grid; gap: 5px; min-width: 0; }
605
+ .tcw-field span { color: var(--tcw-muted); font-size: 12px; font-weight: 700; }
606
+ .tcw-check { display: inline-flex; align-items: center; gap: 6px; min-height: 36px; color: var(--tcw-muted); font-size: 13px; }
607
+ .tcw-table-wrap { overflow: auto; border: 1px solid var(--tcw-border); border-radius: 8px; }
608
+ .tcw-table { width: 100%; min-width: 760px; border-collapse: collapse; font-size: 12px; }
609
+ .tcw-table th, .tcw-table td { border-bottom: 1px solid var(--tcw-border); padding: 10px; text-align: left; vertical-align: top; }
610
+ .tcw-table th { background: var(--tcw-card-soft); color: var(--tcw-muted); font-size: 11px; font-weight: 900; }
611
+ .tcw-table tr:last-child td { border-bottom: 0; }
612
+ .tcw-empty { display: grid; place-items: center; min-height: 110px; border: 1px dashed var(--tcw-border); border-radius: 8px; background: var(--tcw-card-soft); color: var(--tcw-muted); padding: 18px; text-align: center; }
613
+ .tcw-supplier-block { display: grid; gap: 10px; padding: 12px; }
614
+ .tcw-supplier-head strong { font-size: 15px; }
615
+ .tcw-supplier-head span { color: var(--tcw-muted); font-size: 12px; }
616
+ .tcw-split { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; align-items: start; }
617
+ .tcw-drawer { position: sticky; top: 12px; display: grid; gap: 12px; padding: 14px; }
618
+ .tcw-review-list { display: grid; gap: 7px; max-height: 220px; overflow: auto; }
619
+ .tcw-review-chip { display: grid; grid-template-columns: 42px minmax(0, 1fr); gap: 8px; width: 100%; border: 1px solid var(--tcw-border); border-radius: 6px; background: var(--tcw-card-soft); padding: 8px; cursor: pointer; text-align: left; }
620
+ .tcw-review-chip.active { border-color: var(--tcw-primary); background: color-mix(in srgb, var(--tcw-primary) 7%, var(--tcw-card)); }
621
+ .tcw-review-chip span { color: var(--tcw-primary); font-size: 12px; font-weight: 900; }
622
+ .tcw-review-chip strong { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 12px; }
623
+ .tcw-compare { display: grid; gap: 6px; border-top: 1px solid var(--tcw-border); padding-top: 10px; }
624
+ .tcw-compare h3 { margin: 0; font-size: 13px; }
625
+ .tcw-kv { display: grid; grid-template-columns: minmax(92px, .38fr) minmax(0, 1fr); gap: 8px; border: 1px solid var(--tcw-border); border-radius: 6px; background: var(--tcw-card-soft); padding: 7px 8px; }
626
+ .tcw-kv span { color: var(--tcw-muted); font-size: 11px; }
627
+ .tcw-kv strong { overflow-wrap: anywhere; font-size: 12px; font-weight: 700; }
628
+ .tcw-evidence { display: grid; gap: 4px; border: 1px solid color-mix(in srgb, var(--tcw-primary) 24%, var(--tcw-border)); border-radius: 6px; background: color-mix(in srgb, var(--tcw-primary) 6%, var(--tcw-card)); padding: 10px; }
629
+ .tcw-evidence span { color: var(--tcw-muted); font-size: 11px; font-weight: 800; }
630
+ .tcw-evidence strong { overflow-wrap: anywhere; font-size: 12px; }
631
+ .tcw-status { display: inline-flex; width: fit-content; align-items: center; border-radius: 999px; padding: 3px 8px; font-size: 11px; font-weight: 900; }
632
+ .tcw-status.ok { background: #e8f7ef; color: var(--tcw-success); }
633
+ .tcw-status.warn { background: #fff4df; color: var(--tcw-warning); }
634
+ .tcw-status.danger { background: #fde8e6; color: var(--tcw-danger); }
635
+ .tcw-status.muted { background: #eef2f6; color: var(--tcw-muted); }
636
+ @media (max-width: 980px) {
637
+ .tcw-header, .tcw-main, .tcw-form, .tcw-split { grid-template-columns: 1fr; }
638
+ .tcw-metrics { grid-template-columns: repeat(2, minmax(0, 1fr)); }
639
+ .tcw-drawer { position: static; }
640
+ }
641
+ `
642
+ document.head.appendChild(style)
643
+ }
644
+
645
+ window.addEventListener('message', (event) => {
646
+ const message = event.data
647
+ if (!isObject(message) || message.channel !== CHANNEL || message.protocolVersion !== VERSION) return
648
+ if (message.type === 'init') {
649
+ instanceId = message.instanceId
650
+ if (window.XpertRemoteUI && typeof window.XpertRemoteUI.applyTheme === 'function') {
651
+ window.XpertRemoteUI.applyTheme(message.theme)
652
+ }
653
+ if (window.__tradeComplianceSetContext) {
654
+ window.__tradeComplianceSetContext({
655
+ manifest: message.manifest,
656
+ payload: message.payload,
657
+ initialQuery: message.initialQuery || {},
658
+ locale: message.locale,
659
+ theme: message.theme
660
+ })
661
+ }
662
+ setTimeout(reportResize, 0)
663
+ return
664
+ }
665
+ if (message.instanceId !== instanceId) return
666
+ if (message.type === 'hostEvent') {
667
+ if (window.__tradeComplianceHostEvent) window.__tradeComplianceHostEvent(message.event)
668
+ return
669
+ }
670
+ if (message.requestId && pending.has(message.requestId)) {
671
+ const item = pending.get(message.requestId)
672
+ pending.delete(message.requestId)
673
+ if (message.type === 'error') {
674
+ item.reject(new Error(message.message || '远程请求失败'))
675
+ } else {
676
+ item.resolve(message)
677
+ }
678
+ }
679
+ })
680
+
681
+ ReactDOM.render(h(App), document.getElementById('root'))
49
682
  })()
@@ -1,5 +1,5 @@
1
1
  import type { XpertExtensionViewManifest, XpertRemoteComponentEntry, XpertRemoteComponentViewSchema, XpertResolvedViewHostContext, XpertViewActionRequest, XpertViewActionResult, XpertViewDataResult, XpertViewQuery } from '@xpert-ai/contracts';
2
- import { IXpertViewExtensionProvider } from '@xpert-ai/plugin-sdk';
2
+ import { IXpertViewExtensionProvider, XpertViewFileActionFile } from '@xpert-ai/plugin-sdk';
3
3
  import { TradeComplianceWorkbenchService } from './trade-compliance-workbench.service.js';
4
4
  export declare class TradeComplianceWorkbenchViewProvider implements IXpertViewExtensionProvider {
5
5
  private readonly service;
@@ -9,5 +9,6 @@ export declare class TradeComplianceWorkbenchViewProvider implements IXpertViewE
9
9
  getRemoteComponentEntry(_context: XpertResolvedViewHostContext, viewKey: string, component: XpertRemoteComponentViewSchema['component']): Promise<XpertRemoteComponentEntry>;
10
10
  getViewData(context: XpertResolvedViewHostContext, _viewKey: string, _query: XpertViewQuery): Promise<XpertViewDataResult>;
11
11
  executeViewAction(context: XpertResolvedViewHostContext, _viewKey: string, actionKey: string, request: XpertViewActionRequest): Promise<XpertViewActionResult>;
12
+ executeViewFileAction(context: XpertResolvedViewHostContext, viewKey: string, actionKey: string, request: XpertViewActionRequest, file: XpertViewFileActionFile): Promise<XpertViewActionResult>;
12
13
  }
13
14
  //# sourceMappingURL=trade-compliance-workbench-view.provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"trade-compliance-workbench-view.provider.d.ts","sourceRoot":"","sources":["../../src/lib/trade-compliance-workbench-view.provider.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAEV,0BAA0B,EAC1B,yBAAyB,EACzB,8BAA8B,EAC9B,4BAA4B,EAC5B,sBAAsB,EACtB,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACf,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,2BAA2B,EAG5B,MAAM,sBAAsB,CAAA;AAW7B,OAAO,EAAE,+BAA+B,EAAE,MAAM,yCAAyC,CAAA;AAQzF,qBAEa,oCAAqC,YAAW,2BAA2B;IAC1E,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,+BAA+B;IAErE,QAAQ,CAAC,OAAO,EAAE,4BAA4B;IAI9C,gBAAgB,CAAC,QAAQ,EAAE,4BAA4B,EAAE,IAAI,EAAE,MAAM,GAAG,0BAA0B,EAAE;IAsF9F,uBAAuB,CAC3B,QAAQ,EAAE,4BAA4B,EACtC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,8BAA8B,CAAC,WAAW,CAAC,GACrD,OAAO,CAAC,yBAAyB,CAAC;IAwB/B,WAAW,CACf,OAAO,EAAE,4BAA4B,EACrC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,mBAAmB,CAAC;IAoBzB,iBAAiB,CACrB,OAAO,EAAE,4BAA4B,EACrC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,qBAAqB,CAAC;CAsBlC"}
1
+ {"version":3,"file":"trade-compliance-workbench-view.provider.d.ts","sourceRoot":"","sources":["../../src/lib/trade-compliance-workbench-view.provider.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAEV,0BAA0B,EAC1B,yBAAyB,EACzB,8BAA8B,EAC9B,4BAA4B,EAC5B,sBAAsB,EACtB,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACf,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,2BAA2B,EAG3B,uBAAuB,EACxB,MAAM,sBAAsB,CAAA;AAW7B,OAAO,EAAE,+BAA+B,EAAE,MAAM,yCAAyC,CAAA;AAQzF,qBAEa,oCAAqC,YAAW,2BAA2B;IAC1E,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,+BAA+B;IAErE,QAAQ,CAAC,OAAO,EAAE,4BAA4B;IAI9C,gBAAgB,CAAC,QAAQ,EAAE,4BAA4B,EAAE,IAAI,EAAE,MAAM,GAAG,0BAA0B,EAAE;IA6F9F,uBAAuB,CAC3B,QAAQ,EAAE,4BAA4B,EACtC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,8BAA8B,CAAC,WAAW,CAAC,GACrD,OAAO,CAAC,yBAAyB,CAAC;IAwB/B,WAAW,CACf,OAAO,EAAE,4BAA4B,EACrC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,mBAAmB,CAAC;IAoBzB,iBAAiB,CACrB,OAAO,EAAE,4BAA4B,EACrC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,qBAAqB,CAAC;IAuD3B,qBAAqB,CACzB,OAAO,EAAE,4BAA4B,EACrC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,sBAAsB,EAC/B,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;CAoGlC"}
@@ -66,6 +66,12 @@ let TradeComplianceWorkbenchViewProvider = class TradeComplianceWorkbenchViewPro
66
66
  enabled: false
67
67
  }
68
68
  },
69
+ clientCommands: [
70
+ {
71
+ key: 'assistant.chat.send_message',
72
+ label: text('Send to Assistant Chat', '发送到 Assistant 对话')
73
+ }
74
+ ],
69
75
  actions: [
70
76
  { key: 'refresh', label: text('Refresh', '刷新'), icon: 'ri-refresh-line', placement: 'toolbar', actionType: 'refresh' },
71
77
  {
@@ -94,6 +100,7 @@ let TradeComplianceWorkbenchViewProvider = class TradeComplianceWorkbenchViewPro
94
100
  },
95
101
  { key: 'confirm_review_item', label: text('Confirm Item', '确认单条'), icon: 'ri-check-line', actionType: 'invoke' },
96
102
  { key: 'confirm_review_items', label: text('Confirm Selected', '批量确认'), icon: 'ri-check-double-line', actionType: 'invoke' },
103
+ { key: 'save_controlled_goods', label: text('Save Controlled Goods', '保存管控商品'), icon: 'ri-save-line', actionType: 'invoke' },
97
104
  { key: 'generate_customs_workbook', label: text('Generate Workbook', '生成报关资料'), icon: 'ri-file-excel-line', actionType: 'invoke' }
98
105
  ]
99
106
  }
@@ -155,12 +162,140 @@ let TradeComplianceWorkbenchViewProvider = class TradeComplianceWorkbenchViewPro
155
162
  if (actionKey === 'refresh') {
156
163
  return { success: true, message: text('Refreshed', '已刷新'), refresh: true };
157
164
  }
165
+ if (actionKey === 'save_controlled_goods') {
166
+ const productName = readString(request.input, 'productName');
167
+ if (!productName) {
168
+ return failure('productName is required', '缺少商品名称');
169
+ }
170
+ return success(await this.service.saveControlledGoods(scope, {
171
+ productName,
172
+ hsCode: readString(request.input, 'hsCode'),
173
+ keywords: readStringArray(request.input, 'keywords'),
174
+ controlNote: readString(request.input, 'controlNote'),
175
+ enabled: readBoolean(request.input, 'enabled') ?? true,
176
+ sourceFileName: readString(request.input, 'sourceFileName'),
177
+ sourceLocation: readString(request.input, 'sourceLocation')
178
+ }));
179
+ }
180
+ if (actionKey === 'generate_customs_workbook') {
181
+ const now = new Date();
182
+ const invoiceNo = readString(request.input, 'invoiceNo') ?? `INV-${now.toISOString().slice(0, 10).replace(/-/g, '')}`;
183
+ const result = await this.service.recordWorkbookGeneration(scope, {
184
+ sourceFileName: readString(request.input, 'sourceFileName') ?? readString(request.input, 'contractName'),
185
+ invoiceNo,
186
+ contractNo: readString(request.input, 'contractNo'),
187
+ fileName: readString(request.input, 'fileName') ?? `${invoiceNo}-销售发票.xlsx`,
188
+ sheetNames: ['销售发票'],
189
+ workbookData: readRecord(request.input, 'workbookData') ?? {
190
+ invoiceNo,
191
+ contractNo: readString(request.input, 'contractNo'),
192
+ generatedFrom: 'trade-compliance-workbench'
193
+ }
194
+ });
195
+ return success(result);
196
+ }
158
197
  return {
159
198
  success: true,
160
199
  message: text('Action accepted', '操作已接收'),
161
200
  refresh: true
162
201
  };
163
202
  }
203
+ async executeViewFileAction(context, viewKey, actionKey, request, file) {
204
+ if (viewKey !== TRADE_COMPLIANCE_VIEW_KEY) {
205
+ return failure('Unsupported view', '不支持的视图');
206
+ }
207
+ const scope = scopeFromContext(context);
208
+ const fileName = getFileDisplayName(file, request.input);
209
+ if (actionKey === 'upload_controlled_goods_file') {
210
+ const result = await this.service.createReviewBatch(scope, {
211
+ type: 'controlled_goods_file',
212
+ sourceFileName: fileName,
213
+ metadata: { fileName, size: getFileSize(file), mimeType: getFileMimeType(file) },
214
+ items: [{
215
+ type: 'controlled_goods',
216
+ title: `管控商品文件:${fileName}`,
217
+ extractedData: { sourceFileName: fileName },
218
+ defaultData: { enabled: true },
219
+ fields: [
220
+ { key: 'productName', label: '商品名称', required: true },
221
+ { key: 'hsCode', label: '海关编码' },
222
+ { key: 'controlNote', label: '管控说明' }
223
+ ],
224
+ sourceLocation: fileName
225
+ }]
226
+ });
227
+ return parsingStarted(buildAssistantCommand({
228
+ action: 'parse_controlled_goods_file',
229
+ file,
230
+ fileName,
231
+ role: 'controlled_goods_file',
232
+ batchId: result.batch.id,
233
+ text: buildControlledGoodsParsePrompt(fileName, result.batch.id)
234
+ }));
235
+ }
236
+ if (actionKey === 'upload_supplier_contract') {
237
+ const result = await this.service.createReviewBatch(scope, {
238
+ type: 'supplier_contract',
239
+ sourceFileName: fileName,
240
+ metadata: { fileName, size: getFileSize(file), mimeType: getFileMimeType(file) },
241
+ items: [{
242
+ type: 'supplier_product',
243
+ title: `供应商合同:${fileName}`,
244
+ extractedData: { sourceFileName: fileName },
245
+ defaultData: { controlledStatus: 'unchecked' },
246
+ fields: [
247
+ { key: 'supplierName', label: '供应商', required: true },
248
+ { key: 'productName', label: '商品名称', required: true },
249
+ { key: 'model', label: '型号' },
250
+ { key: 'enrichedHsCode', label: '海关编码' },
251
+ { key: 'taxRefundRate', label: '退税率' },
252
+ { key: 'englishName', label: '英文品名' },
253
+ { key: 'controlledStatus', label: '管控状态' },
254
+ { key: 'controlNote', label: '管控说明' }
255
+ ],
256
+ sourceLocation: fileName
257
+ }]
258
+ });
259
+ return parsingStarted(buildAssistantCommand({
260
+ action: 'parse_supplier_contract',
261
+ file,
262
+ fileName,
263
+ role: 'supplier_contract',
264
+ batchId: result.batch.id,
265
+ text: buildSupplierContractParsePrompt(fileName, result.batch.id)
266
+ }));
267
+ }
268
+ if (actionKey === 'upload_sales_contract') {
269
+ const result = await this.service.createReviewBatch(scope, {
270
+ type: 'sales_contract',
271
+ sourceFileName: fileName,
272
+ metadata: { fileName, size: getFileSize(file), mimeType: getFileMimeType(file) },
273
+ items: [{
274
+ type: 'customs_workbook',
275
+ title: `购销合同:${fileName}`,
276
+ extractedData: { sourceFileName: fileName },
277
+ defaultData: { currency: 'USD' },
278
+ fields: [
279
+ { key: 'invoiceNo', label: '发票号' },
280
+ { key: 'contractNo', label: '合同号' },
281
+ { key: 'buyerName', label: '买方' },
282
+ { key: 'sellerName', label: '卖方' },
283
+ { key: 'items', label: '商品明细' }
284
+ ],
285
+ sourceLocation: fileName
286
+ }]
287
+ });
288
+ return parsingStarted(buildAssistantCommand({
289
+ action: 'parse_sales_contract',
290
+ file,
291
+ fileName,
292
+ role: 'sales_contract',
293
+ batchId: result.batch.id,
294
+ text: buildSalesContractParsePrompt(fileName, result.batch.id)
295
+ }));
296
+ }
297
+ return failure('Unsupported file action', '不支持的文件操作');
298
+ }
164
299
  };
165
300
  TradeComplianceWorkbenchViewProvider = __decorate([
166
301
  Injectable(),
@@ -189,6 +324,14 @@ function success(data) {
189
324
  refresh: true
190
325
  };
191
326
  }
327
+ function parsingStarted(data) {
328
+ return {
329
+ success: true,
330
+ message: text('Parsing request sent to assistant', '已发送给智能体解析'),
331
+ data,
332
+ refresh: false
333
+ };
334
+ }
192
335
  function failure(en_US, zh_Hans) {
193
336
  return {
194
337
  success: false,
@@ -209,4 +352,133 @@ function readStringArray(input, key) {
209
352
  const value = typeof input === 'object' && input != null ? Reflect.get(input, key) : undefined;
210
353
  return Array.isArray(value) ? value.filter((item) => typeof item === 'string') : [];
211
354
  }
355
+ function readBoolean(input, key) {
356
+ const value = typeof input === 'object' && input != null ? Reflect.get(input, key) : undefined;
357
+ return typeof value === 'boolean' ? value : undefined;
358
+ }
359
+ function getFileDisplayName(file, input) {
360
+ return readString(input, 'name') ?? readString(input, 'fileName') ?? getFileName(file) ?? 'uploaded-document';
361
+ }
362
+ function getFileName(file) {
363
+ const record = file;
364
+ return typeof record.name === 'string'
365
+ ? record.name
366
+ : typeof record.originalname === 'string'
367
+ ? record.originalname
368
+ : typeof record.originalName === 'string'
369
+ ? record.originalName
370
+ : undefined;
371
+ }
372
+ function getFileMimeType(file) {
373
+ const record = file;
374
+ return typeof record.mimetype === 'string'
375
+ ? record.mimetype
376
+ : typeof record.type === 'string'
377
+ ? record.type
378
+ : undefined;
379
+ }
380
+ function getFileSize(file) {
381
+ const record = file;
382
+ return typeof record.size === 'number' ? record.size : undefined;
383
+ }
384
+ function buildAssistantCommand(input) {
385
+ const assistantFile = viewFileToAssistantFile(input.file, input.fileName, input.role);
386
+ const files = assistantFile.id || assistantFile.fileAssetId || assistantFile.fileId || assistantFile.storageFileId ? [assistantFile] : [];
387
+ return {
388
+ commandKey: 'assistant.chat.send_message',
389
+ payload: {
390
+ text: input.text,
391
+ clientMessageId: `trade-compliance:${input.action}:${input.batchId ?? Date.now()}`,
392
+ files,
393
+ attachments: files.map(toChatAttachment).filter((item) => Boolean(item)),
394
+ references: [toChatReference(assistantFile, input.fileName, input.role)],
395
+ followUpMode: 'queue',
396
+ state: {
397
+ tradeComplianceWorkbench: {
398
+ action: input.action,
399
+ batchId: input.batchId,
400
+ sourceFileName: input.fileName
401
+ }
402
+ }
403
+ },
404
+ batchId: input.batchId,
405
+ role: input.role
406
+ };
407
+ }
408
+ function viewFileToAssistantFile(file, fileName, role) {
409
+ const record = file;
410
+ const fileAssetId = readOptionalFileString(record, 'fileAssetId') ?? readOptionalFileString(record, 'fileId');
411
+ const fileId = fileAssetId;
412
+ const storageFileId = readOptionalFileString(record, 'storageFileId');
413
+ return {
414
+ id: fileAssetId ?? storageFileId,
415
+ fileId,
416
+ fileAssetId,
417
+ storageFileId,
418
+ name: fileName,
419
+ originalName: fileName,
420
+ mimeType: getFileMimeType(file),
421
+ mimetype: getFileMimeType(file),
422
+ size: getFileSize(file),
423
+ role
424
+ };
425
+ }
426
+ function readOptionalFileString(record, key) {
427
+ const value = record[key];
428
+ return typeof value === 'string' && value.trim() ? value.trim() : undefined;
429
+ }
430
+ function toChatAttachment(file) {
431
+ const id = file.fileAssetId ?? file.fileId ?? file.id ?? file.storageFileId;
432
+ if (!id)
433
+ return null;
434
+ return {
435
+ type: 'file',
436
+ id,
437
+ name: file.name,
438
+ mime_type: file.mimeType ?? 'application/octet-stream'
439
+ };
440
+ }
441
+ function toChatReference(file, fileName, role) {
442
+ return {
443
+ type: 'quote',
444
+ label: fileName,
445
+ source: 'Trade Compliance Workbench uploaded document',
446
+ text: [
447
+ `role=${role}`,
448
+ `name=${fileName}`,
449
+ `fileId=${file.fileAssetId ?? file.fileId ?? file.storageFileId ?? '-'}`,
450
+ `mimeType=${file.mimeType ?? '-'}`,
451
+ `size=${file.size ?? '-'}`
452
+ ].join('\n')
453
+ };
454
+ }
455
+ function buildControlledGoodsParsePrompt(fileName, batchId) {
456
+ return [
457
+ `请解析我刚上传的管控商品文件《${fileName}》。`,
458
+ '目标:识别文件中的管控商品、关键词、海关编码、管控说明、来源页码或条款。',
459
+ `请调用工具 trade_compliance_save_controlled_goods_extraction 保存待审核结果,batchId 可记录为 ${batchId ?? '-'}。`,
460
+ '每个 items 条目的 type 必须是 controlled_goods;extractedData 中请包含 productName、hsCode、keywords、controlNote;sourceLocation 记录证据位置。',
461
+ '不要只回复文字,必须调用工具把识别结果写入插件。'
462
+ ].join('\n');
463
+ }
464
+ function buildSupplierContractParsePrompt(fileName, batchId) {
465
+ return [
466
+ `请解析我刚上传的供应商合同《${fileName}》。`,
467
+ '目标:识别供应商信息和商品信息,商品信息包括商品名称、型号、描述、数量、单位、含税单价、含税金额、合同里的海关编码。',
468
+ '对每个商品调用 trade_compliance_enrich_product 获取或推断海关编码、退税率、英文品名。',
469
+ '再结合已有管控商品记录调用 trade_compliance_match_controlled_goods 判断是否为管控商品。',
470
+ `最后调用 trade_compliance_save_supplier_contract_extraction 保存待审核结果,batchId 可记录为 ${batchId ?? '-'}。`,
471
+ '每个 items 条目的 type 必须是 supplier_product;extractedData/defaultData 中请包含 supplierName、supplierCreditCode、supplierAddress、productName、model、description、quantity、unit、taxInclusiveUnitPrice、taxInclusiveTotalAmount、contractHsCode、enrichedHsCode、taxRefundRate、englishName、controlledStatus、controlNote。',
472
+ '不要只回复文字,必须调用工具把识别结果写入插件。'
473
+ ].join('\n');
474
+ }
475
+ function buildSalesContractParsePrompt(fileName, batchId) {
476
+ return [
477
+ `请解析我刚上传的购销合同《${fileName}》。`,
478
+ '目标:识别销售发票和报关资料所需字段,包括发票号、合同号、买方、卖方、币种、贸易术语、付款方式、商品明细、数量、单价、金额、包装、毛重、净重等。',
479
+ `请调用 trade_compliance_save_sales_contract_extraction 保存待审核结果,batchId 可记录为 ${batchId ?? '-'}。`,
480
+ '每个 items 条目的 type 必须是 customs_workbook;extractedData 中请包含 invoiceNo、contractNo、buyerName、sellerName、currency、items 等字段。',
481
+ '不要只回复文字,必须调用工具把识别结果写入插件。'
482
+ ].join('\n');
483
+ }
212
484
  //# sourceMappingURL=trade-compliance-workbench-view.provider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"trade-compliance-workbench-view.provider.js","sourceRoot":"","sources":["../../src/lib/trade-compliance-workbench-view.provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"trade-compliance-workbench-view.provider.js","sourceRoot":"","sources":["../../src/lib/trade-compliance-workbench-view.provider.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chenchaolong/plugin-trade-compliance-workbench",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Trade Compliance Workbench app plugin for controlled goods review, supplier product management, and customs workbook generation.",
5
5
  "author": {
6
6
  "name": "XpertAI",
@@ -35,7 +35,7 @@
35
35
  "scripts": {
36
36
  "build": "tsc -p tsconfig.lib.json && node scripts/copy-assets.mjs",
37
37
  "lint": "echo \"(todo) add lint\"",
38
- "test": "tsc -p tsconfig.spec.json --noEmit"
38
+ "test": "tsc -p tsconfig.spec.json --noEmit && node scripts/verify-remote-app.mjs"
39
39
  },
40
40
  "xpert": {
41
41
  "plugin": {