@fses/workbench-app 0.2.16 → 0.2.18

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 (64) hide show
  1. package/WORKBENCH-CLOSURE.json +18 -12
  2. package/dist/Workspace-JvnSC-w9.js +23186 -0
  3. package/dist/canvas/api/index.js +1 -1
  4. package/dist/{canvasFacade-B2EHgdqA.js → canvasFacade-B8jYm_aO.js} +748 -748
  5. package/dist/cardFactory-DmEBcCf4.js +1460 -0
  6. package/dist/extensions/index.js +1 -1
  7. package/dist/fses-workbench-app.js +5 -5
  8. package/dist/{index-CMM-5ObU.js → index-D-WW3bXH.js} +350 -346
  9. package/dist/internal/personal-workbench/components/workbench/WorkbenchStudio.vue.d.ts +3 -2
  10. package/dist/internal/personal-workbench/fde-skill-cards/runtime/fdeSkillProtocolChartDisplayData.d.ts +0 -5
  11. package/dist/internal/personal-workbench/lib/assistantPersonaProfiles.d.ts +6 -6
  12. package/dist/internal/personal-workbench/lib/cardStyleConfig.d.ts +26 -26
  13. package/dist/internal/personal-workbench/lib/echartsOptionEditorBridge.d.ts +0 -5
  14. package/dist/internal/personal-workbench/lib/historyCardBindingRestore.fixture.d.ts +0 -5
  15. package/dist/internal/personal-workbench/lib/runtimePrimitiveRegistry.d.ts +1 -1
  16. package/dist/internal/personal-workbench/lib/vueRuntimeAdapters.d.ts +18 -6
  17. package/dist/internal/personal-workbench/lib/workbenchCanvasBusinessGapChecklist.d.ts +1 -1
  18. package/dist/internal/personal-workbench/lib/workbenchCardRecommendationFallback.d.ts +1 -1
  19. package/dist/internal/personal-workbench/lib/workbenchCardRecommendationReturnItemUpsert.d.ts +0 -5
  20. package/dist/internal/personal-workbench/lib/workbenchDataBindingBadge.d.ts +0 -5
  21. package/dist/internal/personal-workbench/lib/workbenchImageComposeEntry.d.ts +1 -1
  22. package/dist/internal/personal-workbench/lib/workbenchLayout.d.ts +0 -5
  23. package/dist/runtime/index.js +1 -1
  24. package/dist/style.css +1 -1
  25. package/dist/{useWorkbenchRuntime-DLf_FgC7.js → useWorkbenchRuntime-D_AtkXIX.js} +7938 -7900
  26. package/dist/version.d.ts +1 -1
  27. package/dist/{workbenchCustomComponentRegistry-Bt94Lgko.js → workbenchCustomComponentRegistry-CWUPjCnJ.js} +74 -74
  28. package/node_modules/@byteluck-fe/locale-message/README.md +2 -0
  29. package/node_modules/@byteluck-fe/locale-message/dist/index.d.ts +37 -0
  30. package/node_modules/@byteluck-fe/locale-message/dist/locale-message.js +55 -0
  31. package/node_modules/@byteluck-fe/locale-message/package.json +37 -0
  32. package/node_modules/@fses/ai-chat/dist/components/ContextUsageRing.vue.d.ts +5 -0
  33. package/node_modules/@fses/ai-chat/dist/components/FsesAiChat.vue.d.ts +14 -1
  34. package/node_modules/@fses/ai-chat/dist/composables/types.d.ts +9 -0
  35. package/node_modules/@fses/ai-chat/dist/fses-ai-chat.js +5832 -5670
  36. package/node_modules/@fses/ai-chat/dist/fses-ai-chat.umd.cjs +16 -18
  37. package/node_modules/@fses/ai-chat/dist/index.d.ts +1 -1
  38. package/node_modules/@fses/ai-chat/dist/style.css +1 -1
  39. package/node_modules/@fses/ai-chat/dist/utils/attachment-upload.d.ts +0 -5
  40. package/node_modules/@fses/ai-chat/package.json +6 -5
  41. package/node_modules/@fses/workbench-card/dist/fses-workbench-card-renderers.js +10144 -9914
  42. package/node_modules/@fses/workbench-card/dist/fses-workbench-card.js +1517 -1503
  43. package/node_modules/@fses/workbench-card/dist/fses-workbench-card.umd.cjs +1 -1
  44. package/node_modules/@fses/workbench-card/dist/renderers/chart/chartRendererRegistry.d.ts +97 -97
  45. package/node_modules/@fses/workbench-card/dist/renderers/style.css +1 -1
  46. package/node_modules/@fses/workbench-card/package.json +4 -1
  47. package/node_modules/@fses/workbench-card/src/registry/cardRegistry.ts +99 -98
  48. package/node_modules/@fses/workbench-card/src/registry/compositeCardPatterns.ts +31 -30
  49. package/node_modules/@fses/workbench-card/src/registry/echartsTemplateCategories.ts +24 -23
  50. package/node_modules/@fses/workbench-card/src/registry/echartsTemplateRegistry.generated.js +765 -764
  51. package/node_modules/@fses/workbench-card/src/registry/echartsTemplateRegistry.generated.ts +765 -764
  52. package/node_modules/@fses/workbench-card/src/renderers/WorkbenchBlockRenderer.vue +143 -129
  53. package/node_modules/@fses/workbench-card/src/renderers/chart/ChartRegistry.vue +4 -3
  54. package/node_modules/@fses/workbench-card/src/renderers/chart/EChartsProtocolRenderer.vue +2 -1
  55. package/node_modules/@fses/workbench-card/src/renderers/chart/chartRendererRegistry.ts +99 -98
  56. package/node_modules/@fses/workbench-card/src/renderers/chart/useEchart.ts +30 -29
  57. package/node_modules/@fses/workbench-card/src/renderers/native/nativeBindings.ts +11 -10
  58. package/node_modules/@fses/workbench-card/src/renderers/nested/nestedBlockBindings.ts +102 -101
  59. package/node_modules/@fses/workbench-card/src/renderers/reference-composite/referenceCompositeBindings.ts +364 -363
  60. package/node_modules/@fses/workbench-card/src/renderers/reference-composite/referenceRiskAndStrategyBindings.ts +90 -89
  61. package/node_modules/@fses/workbench-card/src/renderers/useWorkbenchBlockRendererBindings.ts +33 -32
  62. package/package.json +4 -3
  63. package/dist/Workspace-CfKvji6S.js +0 -22896
  64. package/dist/cardFactory-BK3CA-Gn.js +0 -1443
@@ -1,4 +1,5 @@
1
1
  <script setup lang="ts">
2
+ import { getLocaleText } from '@byteluck-fe/locale-message'
2
3
  import { computed, ref, shallowRef, watch } from 'vue';
3
4
  import type { DisplayBlockData, EchartsScriptData, RoleId } from '@fses/workbench-card/types';
4
5
  import { buildDynamicEchartOption, normalizeDynamicEchartFieldMapping } from './dynamicEchartOption';
@@ -153,7 +154,7 @@ watch(
153
154
  result.errorMessage || result.errorCode || 'Data binding refresh failed',
154
155
  );
155
156
  }
156
- throw new Error(result.errorCode || result.errorMessage || '图表数据加载失败');
157
+ throw new Error(result.errorCode || result.errorMessage || getLocaleText('FWC.f1c51787580015248'));
157
158
  }
158
159
  nextOption = buildDynamicEchartOption(data.optionTemplate, {
159
160
  rows: Array.isArray(result.rows) ? result.rows : [],
@@ -162,7 +163,7 @@ watch(
162
163
  }
163
164
  }
164
165
  await prepareWorkbenchChartOption(data, nextOption);
165
- if (!nextOption && !nextScript && !renderError.value) renderError.value = '该图表类型暂未匹配到 ECharts 配置。';
166
+ if (!nextOption && !nextScript && !renderError.value) renderError.value = getLocaleText('FWC.58fd1787579105656');
166
167
  theme.value = chartTheme(data, nextOption);
167
168
  script.value = nextScript;
168
169
  option.value = hideDuplicateEchartsTitle(nextOption, cardTitle);
@@ -189,7 +190,7 @@ watch(
189
190
  theme.value = undefined;
190
191
  script.value = null;
191
192
  option.value = null;
192
- renderError.value = error instanceof Error ? error.message : '图表数据格式错误';
193
+ renderError.value = error instanceof Error ? error.message : getLocaleText('FWC.40d81787580015251');
193
194
  }
194
195
  },
195
196
  { immediate: true, deep: true },
@@ -6,6 +6,7 @@
6
6
  */
7
7
 
8
8
  <script setup lang="ts">
9
+ import { getLocaleText } from '@byteluck-fe/locale-message'
9
10
  import { onBeforeUnmount, ref, watch, type Ref } from 'vue';
10
11
  import type { EChartsOption } from 'echarts';
11
12
  import type { DisplayBlockData, RoleId } from '@fses/workbench-card/types';
@@ -189,7 +190,7 @@ async function renderProtocolChart(data: ProtocolDataPayload | undefined): Promi
189
190
  if (sequence !== renderSequence) return;
190
191
  errorRef.value = error instanceof Error
191
192
  ? error.message
192
- : '协议图表渲染失败';
193
+ : getLocaleText('FWC.c7161787580015253');
193
194
  }
194
195
  }
195
196
 
@@ -1,3 +1,4 @@
1
+ import { getLocaleText } from '@byteluck-fe/locale-message'
1
2
  /**
2
3
  * @fileoverview Chart renderer registry - shared chart renderer keys, prompt labels, and intent detection helpers.
3
4
  * @author seadon
@@ -45,201 +46,201 @@ export const CHART_RENDERER_DEFINITIONS = [
45
46
  {
46
47
  key: 'network',
47
48
  title: '网络关系图',
48
- subtitle: '适合展示节点关系、权限关系和影响链路。',
49
- label: '网络图',
50
- aliases: ['网络图', '关系网络', 'network'],
49
+ subtitle: getLocaleText('FWC.220a1787579151842'),
50
+ label: getLocaleText('FWC.29361787581560553'),
51
+ aliases: [getLocaleText('FWC.29361787581560553'), getLocaleText('FWC.b4701787581333612'), 'network'],
51
52
  defaultResourceKey: (roleId) => `${roleId}.network_graph`,
52
53
  },
53
54
  {
54
55
  key: 'drilldownTree',
55
- title: '层级下钻树图',
56
- subtitle: '适合表达层级拆解与后续下钻结构。',
57
- label: '下钻树图',
58
- aliases: ['下钻树图', 'drilldownTree'],
56
+ title: getLocaleText('FWC.19721787580566799'),
57
+ subtitle: getLocaleText('FWC.5a9f1787579239410'),
58
+ label: getLocaleText('FWC.d6821787581115752'),
59
+ aliases: [getLocaleText('FWC.d6821787581115752'), 'drilldownTree'],
59
60
  defaultResourceKey: (roleId) => `${roleId}.drilldown_tree`,
60
61
  },
61
62
  {
62
63
  key: 'pareto',
63
- title: '关键少数帕累托图',
64
- subtitle: '适合识别关键少数与累计占比。',
65
- label: '帕累托图',
66
- aliases: ['帕累托图', 'pareto'],
64
+ title: getLocaleText('FWC.ec6a1787580015258'),
65
+ subtitle: getLocaleText('FWC.e8541787579337181'),
66
+ label: getLocaleText('FWC.a10d1787581115230'),
67
+ aliases: [getLocaleText('FWC.a10d1787581115230'), 'pareto'],
67
68
  defaultResourceKey: (roleId) => `${roleId}.pareto`,
68
69
  },
69
70
  {
70
71
  key: 'stackedBar',
71
72
  title: '堆叠柱状图',
72
- subtitle: '适合同时查看构成叠加和总量对比。',
73
+ subtitle: getLocaleText('FWC.8b3c1787579239416'),
73
74
  label: '堆叠柱状图',
74
- aliases: ['堆叠柱状图', '堆叠柱形图', 'stackedBar'],
75
+ aliases: ['堆叠柱状图', getLocaleText('FWC.1fbe1787581070492'), 'stackedBar'],
75
76
  defaultResourceKey: (roleId) => `${roleId}.stacked_bar`,
76
77
  },
77
78
  {
78
79
  key: 'area',
79
- title: '经营面积图',
80
- subtitle: '适合查看趋势累计和阶段面积变化。',
81
- label: '面积图',
82
- aliases: ['面积图', 'area'],
80
+ title: getLocaleText('FWC.ddd91787581070501'),
81
+ subtitle: getLocaleText('FWC.ef5b1787579239421'),
82
+ label: getLocaleText('FWC.1ecf1787581477809'),
83
+ aliases: [getLocaleText('FWC.1ecf1787581477809'), 'area'],
83
84
  defaultResourceKey: (roleId) => `${roleId}.area_trend`,
84
85
  },
85
86
  {
86
87
  key: 'boxplot',
87
- title: '经营分布箱线图',
88
- subtitle: '适合查看分布、离散和异常值。',
89
- label: '箱线图',
90
- aliases: ['箱线图', 'boxplot'],
88
+ title: getLocaleText('FWC.bc971787580397609'),
89
+ subtitle: getLocaleText('FWC.c0551787579337188'),
90
+ label: getLocaleText('FWC.669f1787581477771'),
91
+ aliases: [getLocaleText('FWC.669f1787581477771'), 'boxplot'],
91
92
  defaultResourceKey: (roleId) => `${roleId}.boxplot`,
92
93
  },
93
94
  {
94
95
  key: 'geoGlobe',
95
- title: '3D 地球经营卡',
96
- subtitle: '适合展示全球节点、飞线和跨区域状态。',
97
- label: '3D地球',
98
- aliases: ['3D地球', '地球卡', 'geoGlobe'],
96
+ title: getLocaleText('FWC.0f851787580015265'),
97
+ subtitle: getLocaleText('FWC.c9961787579168989'),
98
+ label: getLocaleText('FWC.673d1787581333620'),
99
+ aliases: [getLocaleText('FWC.673d1787581333620'), getLocaleText('FWC.07311787581560574'), 'geoGlobe'],
99
100
  defaultResourceKey: (roleId) => `${roleId}.geo_globe`,
100
101
  },
101
102
  {
102
103
  key: 'donut',
103
- title: '经营结构环形图',
104
- subtitle: '适合展示构成占比与中心核心指标。',
105
- label: '环形图',
106
- aliases: ['环形图', 'donut'],
104
+ title: getLocaleText('FWC.16891787580397616'),
105
+ subtitle: getLocaleText('FWC.48991787579239427'),
106
+ label: getLocaleText('FWC.77471787581453523'),
107
+ aliases: [getLocaleText('FWC.77471787581453523'), 'donut'],
107
108
  defaultResourceKey: 'sales.region_mix',
108
109
  },
109
110
  {
110
111
  key: 'pie',
111
- title: '经营结构饼图',
112
- subtitle: '适合快速判断经营贡献与构成占比。',
113
- label: '饼图',
114
- aliases: ['饼图', 'pie'],
112
+ title: getLocaleText('FWC.427d1787580567360'),
113
+ subtitle: getLocaleText('FWC.8b5a1787579239433'),
114
+ label: getLocaleText('FWC.03ce1787581593924'),
115
+ aliases: [getLocaleText('FWC.03ce1787581593924'), 'pie'],
115
116
  defaultResourceKey: 'sales.region_mix',
116
117
  },
117
118
  {
118
119
  key: 'radar',
119
- title: '多维能力雷达图',
120
- subtitle: '适合横向比较收入、效率、风险等多个维度。',
121
- label: '雷达图',
122
- aliases: ['雷达图', 'radar'],
120
+ title: getLocaleText('FWC.89cb1787580397623'),
121
+ subtitle: getLocaleText('FWC.d97e1787579139130'),
122
+ label: getLocaleText('FWC.a9ce1787581453630'),
123
+ aliases: [getLocaleText('FWC.a9ce1787581453630'), 'radar'],
123
124
  defaultResourceKey: (roleId) => `${roleId}.radar_profile`,
124
125
  },
125
126
  {
126
127
  key: 'bubble',
127
- title: '经营分布气泡图',
128
- subtitle: '同时呈现两个指标和影响规模。',
129
- label: '气泡图',
130
- aliases: ['气泡图', 'bubble'],
128
+ title: getLocaleText('FWC.1cc71787580397629'),
129
+ subtitle: getLocaleText('FWC.4c121787579337194'),
130
+ label: getLocaleText('FWC.feb91787581461765'),
131
+ aliases: [getLocaleText('FWC.feb91787581461765'), 'bubble'],
131
132
  defaultResourceKey: (roleId) => `${roleId}.bubble_distribution`,
132
133
  },
133
134
  {
134
135
  key: 'scatter',
135
- title: '经营分布散点图',
136
- subtitle: '适合识别投入产出分布和离群点。',
137
- label: '散点图',
138
- aliases: ['散点图', 'scatter'],
136
+ title: getLocaleText('FWC.01841787580397636'),
137
+ subtitle: getLocaleText('FWC.1e261787579282037'),
138
+ label: getLocaleText('FWC.4af01787581453671'),
139
+ aliases: [getLocaleText('FWC.4af01787581453671'), 'scatter'],
139
140
  defaultResourceKey: (roleId) => `${roleId}.scatter_distribution`,
140
141
  },
141
142
  {
142
143
  key: 'funnel',
143
- title: '流程漏斗图',
144
- subtitle: '适合展示从入口到闭环的转化效率。',
145
- label: '漏斗图',
146
- aliases: ['漏斗图', 'funnel'],
144
+ title: getLocaleText('FWC.c2191787581070508'),
145
+ subtitle: getLocaleText('FWC.2d321787579240370'),
146
+ label: getLocaleText('FWC.f1ae1787581477594'),
147
+ aliases: [getLocaleText('FWC.f1ae1787581477594'), 'funnel'],
147
148
  defaultResourceKey: (roleId) => (roleId === 'sales_leader' ? 'sales.funnel' : `${roleId}.process_funnel`),
148
149
  },
149
150
  {
150
151
  key: 'gauge',
151
- title: '经营健康度仪表盘',
152
- subtitle: '适合表达单一核心状态的当前水位。',
153
- label: '仪表盘',
154
- aliases: ['仪表盘', 'gauge'],
152
+ title: getLocaleText('FWC.b3a01787580015271'),
153
+ subtitle: getLocaleText('FWC.5be61787579241138'),
154
+ label: getLocaleText('FWC.24e21787581477651'),
155
+ aliases: [getLocaleText('FWC.24e21787581477651'), 'gauge'],
155
156
  defaultResourceKey: (roleId) => `${roleId}.health_gauge`,
156
157
  },
157
158
  {
158
159
  key: 'map',
159
- title: '区域经营地图',
160
- subtitle: '适合展示区域贡献与风险热区分布。',
161
- label: '地图',
162
- aliases: ['地图', 'map'],
160
+ title: getLocaleText('FWC.17af1787580567848'),
161
+ subtitle: getLocaleText('FWC.88a01787579242144'),
162
+ label: getLocaleText('FWC.80e61787581593965'),
163
+ aliases: [getLocaleText('FWC.80e61787581593965'), 'map'],
163
164
  defaultResourceKey: 'sales.region_map',
164
165
  },
165
166
  {
166
167
  key: 'sankey',
167
- title: '经营流向桑基图',
168
- subtitle: '适合展示经营来源到结果项之间的流向关系。',
169
- label: '桑基图',
170
- aliases: ['桑基图', 'sankey'],
168
+ title: getLocaleText('FWC.5e501787580397643'),
169
+ subtitle: getLocaleText('FWC.2cc41787579139135'),
170
+ label: getLocaleText('FWC.b9681787581477697'),
171
+ aliases: [getLocaleText('FWC.b9681787581477697'), 'sankey'],
171
172
  defaultResourceKey: (roleId) => `${roleId}.sankey_flow`,
172
173
  },
173
174
  {
174
175
  key: 'tree',
175
- title: '经营拆解树图',
176
- subtitle: '适合展示主题、责任域与下钻层级。',
177
- label: '树图',
178
- aliases: ['树图', 'tree'],
176
+ title: getLocaleText('FWC.a1391787580568370'),
177
+ subtitle: getLocaleText('FWC.a5421787579243027'),
178
+ label: getLocaleText('FWC.29f21787581594443'),
179
+ aliases: [getLocaleText('FWC.29f21787581594443'), 'tree'],
179
180
  defaultResourceKey: (roleId) => `${roleId}.tree_breakdown`,
180
181
  },
181
182
  {
182
183
  key: 'gantt',
183
- title: '任务排期甘特图',
184
- subtitle: '适合展示跨团队任务时间安排与风险节点。',
185
- label: '甘特图',
186
- aliases: ['甘特图', 'gantt'],
184
+ title: getLocaleText('FWC.5f5b1787580397649'),
185
+ subtitle: getLocaleText('FWC.e97d1787579151847'),
186
+ label: getLocaleText('FWC.37e61787581477734'),
187
+ aliases: [getLocaleText('FWC.37e61787581477734'), 'gantt'],
187
188
  defaultResourceKey: (roleId) => `${roleId}.gantt_schedule`,
188
189
  },
189
190
  {
190
191
  key: 'kline',
191
- title: '经营指数 K 线图',
192
- subtitle: '适合展示开高低收与波动趋势。',
193
- label: 'K线图',
194
- aliases: ['K线图', 'k线图', 'kline', 'candlestick'],
192
+ title: getLocaleText('FWC.5aff1787579902646'),
193
+ subtitle: getLocaleText('FWC.1f3a1787579337200'),
194
+ label: getLocaleText('FWC.ef301787581560583'),
195
+ aliases: [getLocaleText('FWC.ef301787581560583'), getLocaleText('FWC.ee861787581560617'), 'kline', 'candlestick'],
195
196
  defaultResourceKey: (roleId) => `${roleId}.business_index_kline`,
196
197
  },
197
198
  {
198
199
  key: 'candlestick',
199
- title: '经营指数 K 线图',
200
- subtitle: '适合展示开高低收与波动趋势。',
201
- label: 'K线图',
200
+ title: getLocaleText('FWC.5aff1787579902646'),
201
+ subtitle: getLocaleText('FWC.1f3a1787579337200'),
202
+ label: getLocaleText('FWC.ef301787581560583'),
202
203
  aliases: ['candlestick'],
203
204
  defaultResourceKey: (roleId) => `${roleId}.business_index_kline`,
204
205
  },
205
206
  {
206
207
  key: 'heatmap',
207
- title: '经营热力图',
208
- subtitle: '适合展示风险、质量或密度分布。',
209
- label: '热力图',
210
- aliases: ['热力图', 'heatmap'],
208
+ title: getLocaleText('FWC.d39c1787581070526'),
209
+ subtitle: getLocaleText('FWC.b6941787579282043'),
210
+ label: getLocaleText('FWC.6c811787581445014'),
211
+ aliases: [getLocaleText('FWC.6c811787581445014'), 'heatmap'],
211
212
  defaultResourceKey: (roleId) => `${roleId}.heatmap_matrix`,
212
213
  },
213
214
  {
214
215
  key: 'waterfall',
215
- title: '经营差异瀑布图',
216
- subtitle: '适合展示预算、偏差与实际的桥接关系。',
217
- label: '瀑布图',
218
- aliases: ['瀑布图', 'waterfall'],
216
+ title: getLocaleText('FWC.ea891787580397656'),
217
+ subtitle: getLocaleText('FWC.6b0f1787579169009'),
218
+ label: getLocaleText('FWC.04671787581444486'),
219
+ aliases: [getLocaleText('FWC.04671787581444486'), 'waterfall'],
219
220
  defaultResourceKey: 'finance.cashflow_trend',
220
221
  },
221
222
  {
222
223
  key: 'mixedBarLine',
223
- title: '经营混合趋势图',
224
- subtitle: '适合同时对比趋势与规模。',
225
- label: '混合图',
226
- aliases: ['混合图', '组合图', '柱线图', 'mixed', 'mixedbarline'],
224
+ title: getLocaleText('FWC.247f1787580397662'),
225
+ subtitle: getLocaleText('FWC.feb91787579518980'),
226
+ label: getLocaleText('FWC.123f1787581560639'),
227
+ aliases: [getLocaleText('FWC.123f1787581560639'), getLocaleText('FWC.e21c1787581560659'), getLocaleText('FWC.f8371787581560628'), 'mixed', 'mixedbarline'],
227
228
  defaultResourceKey: 'sales.trend',
228
229
  },
229
230
  {
230
231
  key: 'line',
231
- title: '经营折线图',
232
- subtitle: '适合观察时间趋势与波动。',
233
- label: '折线图',
234
- aliases: ['折线图', 'line'],
232
+ title: getLocaleText('FWC.31191787581070533'),
233
+ subtitle: getLocaleText('FWC.ad1b1787579518988'),
234
+ label: getLocaleText('FWC.c2221787581443965'),
235
+ aliases: [getLocaleText('FWC.c2221787581443965'), 'line'],
235
236
  defaultResourceKey: 'sales.trend',
236
237
  },
237
238
  {
238
239
  key: 'bar',
239
- title: '经营柱状图',
240
- subtitle: '适合比较各阶段或各区域的规模差异。',
241
- label: '柱状图',
242
- aliases: ['柱状图', '柱形图', 'bar'],
240
+ title: getLocaleText('FWC.e82d1787581070542'),
241
+ subtitle: getLocaleText('FWC.8c321787579201549'),
242
+ label: getLocaleText('FWC.05241787581443478'),
243
+ aliases: [getLocaleText('FWC.05241787581443478'), getLocaleText('FWC.6bad1787581560670'), 'bar'],
243
244
  defaultResourceKey: 'sales.trend',
244
245
  },
245
246
  ] as const satisfies readonly ChartRendererDefinition[];
@@ -252,7 +253,7 @@ export const CHART_RENDERER_PROMPT_LABELS = CHART_RENDERER_DEFINITIONS
252
253
  .filter((item) => ['pie', 'donut', 'radar', 'scatter', 'bubble', 'funnel', 'gauge', 'map', 'sankey', 'tree', 'gantt'].includes(item.key))
253
254
  .map((item) => `${item.key}=${item.label}`)
254
255
  .join(', ')
255
- .concat(', candlestick/kline=K线图');
256
+ .concat(getLocaleText('FWC.92de1787579033650'));
256
257
 
257
258
  /**
258
259
  * Normalizes legacy chart renderer aliases to the keys used by option builders.
@@ -303,7 +304,7 @@ export function detectChartRenderer(text: string, roleId: RoleId) {
303
304
  return {
304
305
  rendererKey: definition.key,
305
306
  title: roleId === 'sales_leader' && definition.key === 'funnel'
306
- ? '销售漏斗图'
307
+ ? getLocaleText('FWC.b73b1787581070550')
307
308
  : definition.title,
308
309
  subtitle: definition.subtitle,
309
310
  resourceKey: resolveChartResourceKey(definition, roleId),
@@ -1,3 +1,4 @@
1
+ import { getLocaleText } from '@byteluck-fe/locale-message'
1
2
  import { nextTick, onBeforeUnmount, shallowRef, watch, type Ref } from 'vue';
2
3
  import * as echarts from 'echarts';
3
4
  import type { ECharts, EChartsOption } from 'echarts';
@@ -97,13 +98,13 @@ const donutHoverCenterBindings = new WeakMap<ECharts, { option: EChartsOption }>
97
98
  const regionMap = {
98
99
  type: 'FeatureCollection',
99
100
  features: [
100
- { type: 'Feature', properties: { name: '东北' }, geometry: { type: 'Polygon', coordinates: [[[118, 42], [134, 42], [134, 53], [118, 53], [118, 42]]] } },
101
- { type: 'Feature', properties: { name: '华北' }, geometry: { type: 'Polygon', coordinates: [[[108, 36], [122, 36], [122, 44], [108, 44], [108, 36]]] } },
102
- { type: 'Feature', properties: { name: '华东' }, geometry: { type: 'Polygon', coordinates: [[[116, 28], [124, 28], [124, 36], [116, 36], [116, 28]]] } },
103
- { type: 'Feature', properties: { name: '华中' }, geometry: { type: 'Polygon', coordinates: [[[108, 28], [116, 28], [116, 36], [108, 36], [108, 28]]] } },
104
- { type: 'Feature', properties: { name: '华南' }, geometry: { type: 'Polygon', coordinates: [[[108, 20], [122, 20], [122, 28], [108, 28], [108, 20]]] } },
105
- { type: 'Feature', properties: { name: '西部' }, geometry: { type: 'Polygon', coordinates: [[[78, 28], [108, 28], [108, 48], [78, 48], [78, 28]]] } },
106
- { type: 'Feature', properties: { name: '海外' }, geometry: { type: 'Polygon', coordinates: [[[124, 18], [136, 18], [136, 26], [124, 26], [124, 18]]] } },
101
+ { type: 'Feature', properties: { name: getLocaleText('FWC.bd281787581616997') }, geometry: { type: 'Polygon', coordinates: [[[118, 42], [134, 42], [134, 53], [118, 53], [118, 42]]] } },
102
+ { type: 'Feature', properties: { name: getLocaleText('FWC.4fb71787581617038') }, geometry: { type: 'Polygon', coordinates: [[[108, 36], [122, 36], [122, 44], [108, 44], [108, 36]]] } },
103
+ { type: 'Feature', properties: { name: getLocaleText('FWC.e76f1787581617857') }, geometry: { type: 'Polygon', coordinates: [[[116, 28], [124, 28], [124, 36], [116, 36], [116, 28]]] } },
104
+ { type: 'Feature', properties: { name: getLocaleText('FWC.7c461787581618518') }, geometry: { type: 'Polygon', coordinates: [[[108, 28], [116, 28], [116, 36], [108, 36], [108, 28]]] } },
105
+ { type: 'Feature', properties: { name: getLocaleText('FWC.f5bb1787581618560') }, geometry: { type: 'Polygon', coordinates: [[[108, 20], [122, 20], [122, 28], [108, 28], [108, 20]]] } },
106
+ { type: 'Feature', properties: { name: getLocaleText('FWC.6ab11787581618603') }, geometry: { type: 'Polygon', coordinates: [[[78, 28], [108, 28], [108, 48], [78, 48], [78, 28]]] } },
107
+ { type: 'Feature', properties: { name: getLocaleText('FWC.b1f61787581618652') }, geometry: { type: 'Polygon', coordinates: [[[124, 18], [136, 18], [136, 26], [124, 26], [124, 18]]] } },
107
108
  ],
108
109
  };
109
110
 
@@ -116,11 +117,11 @@ function ensureMapRegistered() {
116
117
  }
117
118
 
118
119
  function assertRecord(value: unknown, shape: string): asserts value is Record<string, unknown> {
119
- if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error(`图表数据不是对象:${shape}`);
120
+ if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error(getLocaleText('FWC.c0021787579201555', {p0: shape}));
120
121
  }
121
122
 
122
123
  function assertArray(value: unknown, name: string): asserts value is unknown[] {
123
- if (!Array.isArray(value)) throw new Error(`图表字段缺失或格式错误:${name}`);
124
+ if (!Array.isArray(value)) throw new Error(getLocaleText('FWC.088c1787579139141', {p0: name}));
124
125
  }
125
126
 
126
127
  function objectValue(value: unknown, key: string) {
@@ -536,7 +537,7 @@ function categoryLabelsFromProtocolPayload(payload: unknown): string[] {
536
537
  if (!Array.isArray(xAxis)) return [];
537
538
  return xAxis.map((item, index) => {
538
539
  const label = String(item ?? '').trim();
539
- return label || `项 ${index + 1}`;
540
+ return label || getLocaleText('FWC.98ff1787579719338', {p0: index + 1});
540
541
  });
541
542
  }
542
543
 
@@ -1010,7 +1011,7 @@ function fallbackSeriesType(rendererKey: string): 'bar' | 'line' {
1010
1011
  function seriesOption(data: MultiSeriesData, rendererKey = ''): EChartsOption {
1011
1012
  assertArray(data.categories, 'categories');
1012
1013
  assertArray(data.series, 'series');
1013
- const stacked = data.series.some((item) => item.name.includes('上期')) || data.narrative?.includes('堆叠');
1014
+ const stacked = data.series.some((item) => item.name.includes(getLocaleText('FWC.d65c1787581618694'))) || data.narrative?.includes(getLocaleText('FWC.92421787581618741'));
1014
1015
  const layout = buildCartesianResponsiveLayout(data.categories, data.series.length);
1015
1016
  return {
1016
1017
  ...baseOption(paletteColorsFromData(data)),
@@ -1032,7 +1033,7 @@ function seriesOption(data: MultiSeriesData, rendererKey = ''): EChartsOption {
1032
1033
  itemStyle: item.itemStyle,
1033
1034
  smooth: item.type === 'line',
1034
1035
  stack: stacked && item.type === 'bar' ? 'total' : undefined,
1035
- areaStyle: data.unit === '累计指数' && item.type === 'line' ? { opacity: 0.18 } : undefined,
1036
+ areaStyle: data.unit === getLocaleText('FWC.051e1787581333635') && item.type === 'line' ? { opacity: 0.18 } : undefined,
1036
1037
  data: item.data,
1037
1038
  barMaxWidth: 34,
1038
1039
  symbolSize: 7,
@@ -1122,7 +1123,7 @@ function radarOption(data: RadarMetricsData): EChartsOption {
1122
1123
  return {
1123
1124
  ...baseOption(),
1124
1125
  radar: { radius: '68%', indicator: data.axes.map((axis) => ({ name: axis.label, max: data.max })), splitArea: { areaStyle: { color: ['#f8fafc', '#eef2ff'] } } },
1125
- series: [{ type: 'radar', areaStyle: { opacity: 0.18 }, data: [{ name: '评分', value: data.axes.map((axis) => axis.value) }] }],
1126
+ series: [{ type: 'radar', areaStyle: { opacity: 0.18 }, data: [{ name: getLocaleText('FWC.4afb1787581618789'), value: data.axes.map((axis) => axis.value) }] }],
1126
1127
  };
1127
1128
  }
1128
1129
 
@@ -1171,7 +1172,7 @@ function mapOption(data: MapRegionsData): EChartsOption {
1171
1172
  const values = finiteValues(data.regions.map((region) => region.value));
1172
1173
  return {
1173
1174
  ...baseOption(),
1174
- visualMap: { min: Math.min(...values), max: Math.max(...values), left: 0, bottom: 0, text: ['高', '低'], inRange: { color: ['#dbeafe', '#93c5fd', '#1f4fd4'] } },
1175
+ visualMap: { min: Math.min(...values), max: Math.max(...values), left: 0, bottom: 0, text: [getLocaleText('FWC.f33f1787581662762'), getLocaleText('FWC.47591787581662815')], inRange: { color: ['#dbeafe', '#93c5fd', '#1f4fd4'] } },
1175
1176
  series: [{ type: 'map', map: 'workbench-regions', roam: false, label: { show: true, color: '#0f172a' }, data: data.regions.map((region) => ({ name: region.name, value: region.value })) }],
1176
1177
  };
1177
1178
  }
@@ -1253,15 +1254,15 @@ function paretoOption(data: ParetoSeriesData): EChartsOption {
1253
1254
  assertArray(data.categories, 'categories');
1254
1255
  assertArray(data.bars, 'bars');
1255
1256
  assertArray(data.cumulative, 'cumulative');
1256
- const barName = '需求数';
1257
- const cumulativeName = '累计占比(%)';
1257
+ const barName = getLocaleText('FWC.f4161787581560681');
1258
+ const cumulativeName = getLocaleText('FWC.5d5e1787580397679');
1258
1259
  return {
1259
1260
  ...baseOption(),
1260
1261
  legend: { bottom: 0, data: [barName, cumulativeName] },
1261
1262
  xAxis: { type: 'category', data: data.categories, axisTick: { show: false } },
1262
1263
  yAxis: [
1263
1264
  { type: 'value', name: barName, splitLine: { lineStyle: { color: '#eef2f7' } } },
1264
- { type: 'value', name: '累计占比', min: 0, max: 100, axisLabel: { formatter: '{value}%' } },
1265
+ { type: 'value', name: getLocaleText('FWC.94431787581333676'), min: 0, max: 100, axisLabel: { formatter: '{value}%' } },
1265
1266
  ],
1266
1267
  tooltip: { trigger: 'axis', confine: true, formatter: paretoTooltipFormatter },
1267
1268
  series: [{ name: barName, type: 'bar', barMaxWidth: 34, data: data.bars }, { name: cumulativeName, type: 'line', yAxisIndex: 1, smooth: true, data: data.cumulative }],
@@ -1276,12 +1277,12 @@ function paretoTooltipFormatter(params: unknown): string {
1276
1277
  const marker = typeof item.marker === 'string' ? item.marker : '';
1277
1278
  const name = String(item.seriesName ?? '');
1278
1279
  const value = typeof item.value === 'number' ? item.value : Number(item.value);
1279
- if (name.includes('累计占比')) {
1280
- return `${marker}累计占比:${formatParetoPercent(value)}`;
1280
+ if (name.includes(getLocaleText('FWC.94431787581333676'))) {
1281
+ return getLocaleText('FWC.a2b21787579127467', {p0: marker,p1: formatParetoPercent(value)});
1281
1282
  }
1282
1283
  return `${marker}${name}:${Number.isFinite(value) ? value : ''}`;
1283
1284
  });
1284
- return [title, ...lines, `前 ${dataIndex + 1} 项累计占全部的比例`].filter(Boolean).join('<br/>');
1285
+ return [title, ...lines, getLocaleText('FWC.be1d1787579139903', {p0: dataIndex + 1})].filter(Boolean).join('<br/>');
1285
1286
  }
1286
1287
 
1287
1288
  function formatParetoPercent(value: number): string {
@@ -1292,13 +1293,13 @@ function formatParetoPercent(value: number): string {
1292
1293
  function networkOption(data: NetworkGraphData): EChartsOption {
1293
1294
  assertArray(data.nodes, 'nodes');
1294
1295
  assertArray(data.links, 'links');
1295
- const categoryNames: string[] = Array.from(new Set(data.nodes.map((node) => node.category || '默认')));
1296
+ const categoryNames: string[] = Array.from(new Set(data.nodes.map((node) => node.category || getLocaleText('FWC.6f1e1787581618840'))));
1296
1297
  const categories = categoryNames.map((name) => ({ name }));
1297
1298
  return {
1298
1299
  ...baseOption(),
1299
1300
  tooltip: { trigger: 'item', confine: true },
1300
1301
  legend: { bottom: 0, data: categories.map((item) => item.name) },
1301
- series: [{ type: 'graph', layout: 'force', roam: false, draggable: false, categories, force: { repulsion: 160, edgeLength: 88 }, label: { show: true, formatter: '{b}' }, lineStyle: { color: '#94a3b8', opacity: 0.8 }, data: data.nodes.map((node) => ({ id: node.id, name: node.label, value: node.value, category: node.category || '默认', symbolSize: Math.max(24, Math.min(56, node.value || 28)) })), links: data.links.map((link) => ({ source: link.source, target: link.target, value: link.value || 1 })) }],
1302
+ series: [{ type: 'graph', layout: 'force', roam: false, draggable: false, categories, force: { repulsion: 160, edgeLength: 88 }, label: { show: true, formatter: '{b}' }, lineStyle: { color: '#94a3b8', opacity: 0.8 }, data: data.nodes.map((node) => ({ id: node.id, name: node.label, value: node.value, category: node.category || getLocaleText('FWC.6f1e1787581618840'), symbolSize: Math.max(24, Math.min(56, node.value || 28)) })), links: data.links.map((link) => ({ source: link.source, target: link.target, value: link.value || 1 })) }],
1302
1303
  };
1303
1304
  }
1304
1305
 
@@ -1386,10 +1387,10 @@ async function ensureEchartsMapRegistered(mapName: string, rootPath: string | un
1386
1387
  const resourceUrl = resolveEchartsResourceUrl(`/data/asset/geo/${encodeURIComponent(mapName)}.json`, normalizedRootPath);
1387
1388
  echartsMapLoadPromises.set(cacheKey, window.fetch(resourceUrl)
1388
1389
  .then(async (response) => {
1389
- if (!response.ok) throw new Error(`ECharts 地图资源加载失败:${response.status} ${resourceUrl}`);
1390
+ if (!response.ok) throw new Error(getLocaleText('FWC.7a3d1787578051375', {p0: response.status,p1: resourceUrl}));
1390
1391
  const geoJson = await response.json();
1391
1392
  if (!geoJson || typeof geoJson !== 'object' || !Array.isArray((geoJson as Record<string, unknown>).features)) {
1392
- throw new Error(`ECharts 地图资源格式错误:${mapName}`);
1393
+ throw new Error(getLocaleText('FWC.48531787578636689', {p0: mapName}));
1393
1394
  }
1394
1395
  echarts.registerMap(mapName, geoJson as never);
1395
1396
  })
@@ -1416,7 +1417,7 @@ function createJQueryCompat(rootPath: string, isActive: () => boolean, onError:
1416
1417
  const resourceUrl = resolveEchartsResourceUrl(String(url), rootPath);
1417
1418
  const basePromise = window.fetch(resourceUrl)
1418
1419
  .then((response) => {
1419
- if (!response.ok) throw new Error(`ECharts 示例资源加载失败:${response.status} ${resourceUrl}`);
1420
+ if (!response.ok) throw new Error(getLocaleText('FWC.24d51787578052307', {p0: response.status,p1: resourceUrl}));
1420
1421
  return read(response);
1421
1422
  });
1422
1423
  const handledPromise = basePromise
@@ -1561,7 +1562,7 @@ function runEchartsScript(script: string, rootPath: string | undefined, myChart:
1561
1562
  ) as (scope: EchartsScriptScope) => unknown;
1562
1563
  const option = runner(scope);
1563
1564
  if (!option) return null;
1564
- if (typeof option !== 'object' || Array.isArray(option)) throw new Error('ECharts 示例脚本没有生成 option 对象。');
1565
+ if (typeof option !== 'object' || Array.isArray(option)) throw new Error(getLocaleText('FWC.a2221787578345186'));
1565
1566
  const nextOption = option as EChartsOption;
1566
1567
  if (optionUsesEchartsGl(nextOption) && !objectValue(nextOption, 'backgroundColor')) {
1567
1568
  return removeRuntimeEchartsChrome({ backgroundColor: '#000', ...nextOption });
@@ -1778,11 +1779,11 @@ export function useEchart(
1778
1779
  }
1779
1780
  if (scriptData) {
1780
1781
  const onScriptError = (error: unknown) => {
1781
- errorRef && (errorRef.value = error instanceof Error ? error.message : 'ECharts 示例执行失败');
1782
+ errorRef && (errorRef.value = error instanceof Error ? error.message : getLocaleText('FWC.18d31787579337212'));
1782
1783
  };
1783
1784
  const scriptChart = createScopedChart(chart, scriptData.rootPath, isActive, onScriptError);
1784
1785
  const jquery = createJQueryCompat(scriptData.rootPath || '', isActive, (error) => {
1785
- errorRef && (errorRef.value = error instanceof Error ? error.message : 'ECharts 示例资源加载失败');
1786
+ errorRef && (errorRef.value = error instanceof Error ? error.message : getLocaleText('FWC.b78f1787579244042'));
1786
1787
  });
1787
1788
  const scriptOption = runEchartsScript(scriptData.script, scriptData.rootPath, scriptChart, jquery);
1788
1789
  if (scriptOption && isActive()) {
@@ -1799,7 +1800,7 @@ export function useEchart(
1799
1800
  errorRef && (errorRef.value = '');
1800
1801
  } catch (error) {
1801
1802
  dispose();
1802
- errorRef && (errorRef.value = error instanceof Error ? error.message : '图表渲染失败');
1803
+ errorRef && (errorRef.value = error instanceof Error ? error.message : getLocaleText('FWC.a1e91787580568932'));
1803
1804
  }
1804
1805
  };
1805
1806
 
@@ -1,3 +1,4 @@
1
+ import { getLocaleText } from '@byteluck-fe/locale-message'
1
2
  /**
2
3
  * @fileoverview 原生卡片绑定 - 提供表单、问卷、指标、列表、天气和普通图表 helper。
3
4
  * @author seadon
@@ -108,7 +109,7 @@ export function tableColumnsFromRows(columns: unknown, rows: unknown): string[]
108
109
  && rowColumns.every((column, index) => column === firstColumns[index]);
109
110
  });
110
111
  // 异构对象行无法共享真实列头,统一降级为逐行键值摘要,避免后续行错列或整行空白。
111
- return usesStableColumns ? firstColumns.slice(0, 3) : ['字段', '内容'];
112
+ return usesStableColumns ? firstColumns.slice(0, 3) : [getLocaleText('FWC.65361787581618934'), getLocaleText('FWC.0a901787581619226')];
112
113
  }
113
114
 
114
115
  /**
@@ -124,8 +125,8 @@ export function tableRowCells(row: unknown, columns: string[]): string[] {
124
125
  return cells.slice(0, columns.length).map(tableCellText);
125
126
  }
126
127
  const usesKeyValueFallback = columns.length === 2
127
- && columns[0] === '字段'
128
- && columns[1] === '内容'
128
+ && columns[0] === getLocaleText('FWC.65361787581618934')
129
+ && columns[1] === getLocaleText('FWC.0a901787581619226')
129
130
  && !columns.every((column) => Object.prototype.hasOwnProperty.call(record, column));
130
131
  const entries = Object.entries(record)
131
132
  .filter(([key]) => imageTableColumnVisible(key))
@@ -314,11 +315,11 @@ export function createNativeBindings(context: NativeBindingsContext) {
314
315
  }
315
316
 
316
317
  function taskTypeLabel(type: TaskSummaryData['items'][number]['type']) {
317
- return { form: '表单', survey: '问卷', notice: '公告', document: '公文', workflow: '流程', custom: '定制' }[type] || type;
318
+ return { form: getLocaleText('FWC.e62b1787581619362'), survey: getLocaleText('FWC.a1ef1787581619383'), notice: getLocaleText('FWC.ea991787581619404'), document: getLocaleText('FWC.35761787581619427'), workflow: getLocaleText('FWC.d9821787581619451'), custom: getLocaleText('FWC.8b301787581619473') }[type] || type;
318
319
  }
319
320
 
320
321
  function taskStatusLabel(status: TaskSummaryData['items'][number]['status']) {
321
- return { pending: '待处理', reading: '待阅读', submitted: '已提交', overdue: '逾期', done: '完成' }[status] || status;
322
+ return { pending: getLocaleText('FWC.0cdc1787581560720'), reading: getLocaleText('FWC.7fe41787581560936'), submitted: getLocaleText('FWC.76de1787581559828'), overdue: getLocaleText('FWC.f7991787581611854'), done: getLocaleText('FWC.6cd81787581612159') }[status] || status;
322
323
  }
323
324
 
324
325
  const TABLE_ROWS_PREVIEW_VISUAL_KINDS = new Set([
@@ -774,7 +775,7 @@ export function createNativeBindings(context: NativeBindingsContext) {
774
775
  * @returns Stable business-input hint without claiming successful data binding.
775
776
  */
776
777
  function imageComposeEmptyRankingDetail(block: WorkbenchBlock): string {
777
- return dataBindingNeedsHumanIntervention()(block) ? '需补充业务口径后回填' : '等待数据回填';
778
+ return dataBindingNeedsHumanIntervention()(block) ? getLocaleText('FWC.27ab1787579719378') : getLocaleText('FWC.dc671787580569519');
778
779
  }
779
780
 
780
781
  /**
@@ -877,10 +878,10 @@ export function createNativeBindings(context: NativeBindingsContext) {
877
878
  const overview = metaRecord(block, 'showcaseOverview');
878
879
  const activeTab = activeTabFor(block);
879
880
  return [
880
- { label: '卡片总数', value: numberValue(overview.totalCount), icon: LayoutDashboard },
881
- { label: '验收卡片', value: numberValue(overview.acceptanceCount), icon: CircleCheck },
882
- { label: '能力分类', value: numberValue(overview.categoryCount), icon: UserRound },
883
- { label: '当前分类', value: numberValue(activeTab.count), icon: Bot },
881
+ { label: getLocaleText('FWC.0d2a1787581333759'), value: numberValue(overview.totalCount), icon: LayoutDashboard },
882
+ { label: getLocaleText('FWC.f47d1787581333778'), value: numberValue(overview.acceptanceCount), icon: CircleCheck },
883
+ { label: getLocaleText('FWC.057d1787581333797'), value: numberValue(overview.categoryCount), icon: UserRound },
884
+ { label: getLocaleText('FWC.0dd01787581333816'), value: numberValue(activeTab.count), icon: Bot },
884
885
  ];
885
886
  }
886
887