npmapps 1.0.21 → 1.0.23

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 (105) hide show
  1. package/app/Wscats.vue-1.0.26.vsix +0 -0
  2. package/app/febean.vue-format-0.1.8.vsix +0 -0
  3. package/app/wujie-vue3-child/.claude/settings.local.json +8 -0
  4. package/app/wujie-vue3-child/.vscode/extensions.json +3 -0
  5. package/app/wujie-vue3-child/PROJECT_MEMORY.md +427 -0
  6. package/app/wujie-vue3-child/README.md +5 -0
  7. package/app/wujie-vue3-child/index.html +13 -0
  8. package/app/wujie-vue3-child/package-lock.json +5744 -0
  9. package/app/wujie-vue3-child/package.json +28 -0
  10. package/app/wujie-vue3-child/public/vite.svg +1 -0
  11. package/app/wujie-vue3-child/src/App.vue +130 -0
  12. package/app/wujie-vue3-child/src/assets/vue.svg +1 -0
  13. package/app/wujie-vue3-child/src/components/HelloWorld.vue +43 -0
  14. package/app/wujie-vue3-child/src/components/tags-view.vue +193 -0
  15. package/app/wujie-vue3-child/src/components/tags-view1.vue +131 -0
  16. package/app/wujie-vue3-child/src/hooks/useClickOutside.js +11 -0
  17. package/app/wujie-vue3-child/src/hooks/useTableDragSort.js +28 -0
  18. package/app/wujie-vue3-child/src/main.js +15 -0
  19. package/app/wujie-vue3-child/src/router/index.js +104 -0
  20. package/app/wujie-vue3-child/src/store/tagsViewStroe.js +34 -0
  21. package/app/wujie-vue3-child/src/style.css +4 -0
  22. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/README.md +836 -0
  23. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/REFLEX_EXAMPLES.md +728 -0
  24. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentPersonnelSelector.jsx +687 -0
  25. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentPersonnelSelector.module.scss +560 -0
  26. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentSelector.jsx +570 -0
  27. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentSelector.module.scss +330 -0
  28. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentSelectorV2.jsx +378 -0
  29. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentSelectorV2.module.scss +228 -0
  30. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/OptionsSelector.jsx +399 -0
  31. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/OptionsSelector.module.scss +252 -0
  32. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/PersonnelSelector.jsx +585 -0
  33. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/PersonnelSelector.module.scss +331 -0
  34. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/PopoverSelector.jsx +392 -0
  35. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/PopoverSelector.module.scss +39 -0
  36. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/README.md +248 -0
  37. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/SelectorTrigger.jsx +194 -0
  38. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/index.jsx +1459 -0
  39. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/mockData.js +301 -0
  40. package/app/{aiCoach → wujie-vue3-child/src/views/aiCoach}/dialogueSegment/index.jsx +28 -4
  41. package/app/wujie-vue3-child/src/views/aiCoach/index.jsx +32 -0
  42. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/ChartsPanel/index.jsx +121 -0
  43. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/ChartsPanel/index.module.scss +76 -0
  44. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/DonutChart/index.jsx +104 -0
  45. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/PracticeTable/index.jsx +75 -0
  46. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/PracticeTable/index.module.scss +12 -0
  47. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankBarChart/index.jsx +62 -0
  48. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankBarChart/index.module.scss +43 -0
  49. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankingGroup/index.jsx +29 -0
  50. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankingGroup/index.module.scss +5 -0
  51. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankingList/index.jsx +58 -0
  52. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankingList/index.module.scss +85 -0
  53. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/ScriptStatsPanel/index.jsx +92 -0
  54. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/ScriptStatsPanel/index.module.scss +56 -0
  55. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/StatCardsRow/index.jsx +40 -0
  56. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/StatCardsRow/index.module.scss +53 -0
  57. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/echarts/EchartsDonut.jsx +106 -0
  58. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/echarts/EchartsRankBar.jsx +132 -0
  59. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/index.jsx +176 -0
  60. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/index.module.scss +96 -0
  61. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/CoachReport/index.jsx +162 -0
  62. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/CoachReport/index.module.scss +16 -0
  63. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ComprehensiveEvaluation/index.jsx +29 -0
  64. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ComprehensiveEvaluation/index.module.scss +25 -0
  65. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DialogueBubble/index.jsx +106 -0
  66. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DialogueBubble/index.module.scss +164 -0
  67. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DialogueRecord/index.jsx +182 -0
  68. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DialogueRecord/index.module.scss +203 -0
  69. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DimensionDetail/index.jsx +145 -0
  70. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DimensionDetail/index.module.scss +126 -0
  71. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DimensionScores/index.jsx +67 -0
  72. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DimensionScores/index.module.scss +105 -0
  73. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ReportHeader/index.jsx +81 -0
  74. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ReportHeader/index.module.scss +47 -0
  75. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/RoleInfo/index.jsx +64 -0
  76. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/RoleInfo/index.module.scss +85 -0
  77. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ScoreBadge/index.jsx +39 -0
  78. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ScoreBadge/index.module.scss +44 -0
  79. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/SubDimensionItem/index.jsx +83 -0
  80. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/SubDimensionItem/index.module.scss +101 -0
  81. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/index.jsx +50 -0
  82. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/index.module.scss +25 -0
  83. package/app/wujie-vue3-child/src/views/child-to-parent.vue +117 -0
  84. package/app/wujie-vue3-child/src/views/home.vue +53 -0
  85. package/app/wujie-vue3-child/src/views/jsx/btnSelect/btnSelect.vue +169 -0
  86. package/app/wujie-vue3-child/src/views/jsx/btnSelect/index.vue +69 -0
  87. package/app/wujie-vue3-child/src/views/jsx/com.vue +44 -0
  88. package/app/wujie-vue3-child/src/views/jsx/dialog.jsx +66 -0
  89. package/app/wujie-vue3-child/src/views/jsx/index.vue +72 -0
  90. package/app/wujie-vue3-child/src/views/jsx/props.vue +33 -0
  91. package/app/wujie-vue3-child/src/views/parent-to-child.vue +225 -0
  92. package/app/wujie-vue3-child/src/views/phone-code.vue +318 -0
  93. package/app/wujie-vue3-child/src/views/router-jump.vue +123 -0
  94. package/app/wujie-vue3-child/src/views/test.vue +192 -0
  95. package/app/wujie-vue3-child/vite.config.js +15 -0
  96. package/package.json +1 -1
  97. package/app/aiCoach/index.jsx +0 -20
  98. package/npmapps-1.0.20.tgz +0 -0
  99. /package/app/{aiCoach → wujie-vue3-child/src/views/aiCoach}/collapseExpand/index.jsx +0 -0
  100. /package/app/{aiCoach → wujie-vue3-child/src/views/aiCoach}/collapseExpand/index.module.scss +0 -0
  101. /package/app/{aiCoach → wujie-vue3-child/src/views/aiCoach}/dialogueSegment/index.module.scss +0 -0
  102. /package/app/{aiCoach → wujie-vue3-child/src/views/aiCoach}/scriptTable/index.jsx +0 -0
  103. /package/app/{aiCoach → wujie-vue3-child/src/views/aiCoach}/scriptTable/index.module.scss +0 -0
  104. /package/app/{aiCoach → wujie-vue3-child/src/views/aiCoach}/scriptTable/inputColumn/index.jsx +0 -0
  105. /package/app/{aiCoach → wujie-vue3-child/src/views/aiCoach}/scriptTable/inputColumn/index.module.scss +0 -0
@@ -0,0 +1,301 @@
1
+ /**
2
+ * 模拟部门数据
3
+ * @description 生成模拟的部门树形结构数据
4
+ */
5
+
6
+ /**
7
+ * 部门树数据
8
+ * @type {Array<{id: string|number, label: string, children?: Array}>}
9
+ */
10
+ export const mockDepartments = [
11
+ {
12
+ id: 1,
13
+ label: '总行人力资源部',
14
+ children: [
15
+ {
16
+ id: 11,
17
+ label: '招聘中心',
18
+ children: [
19
+ { id: 111, label: '校园招聘组' },
20
+ { id: 112, label: '社会招聘组' },
21
+ { id: 113, label: '招聘运营组' },
22
+ ],
23
+ },
24
+ {
25
+ id: 12,
26
+ label: '培训中心',
27
+ children: [
28
+ { id: 121, label: '管理培训组' },
29
+ { id: 122, label: '业务培训组' },
30
+ { id: 123, label: '新员工培训组' },
31
+ ],
32
+ },
33
+ {
34
+ id: 13,
35
+ label: '薪酬福利部',
36
+ children: [
37
+ { id: 131, label: '薪酬管理组' },
38
+ { id: 132, label: '福利管理组' },
39
+ ],
40
+ },
41
+ ],
42
+ },
43
+ {
44
+ id: 2,
45
+ label: '总行公司银行总部',
46
+ children: [
47
+ { id: 21, label: '公司业务一部' },
48
+ { id: 22, label: '公司业务二部' },
49
+ {
50
+ id: 23,
51
+ label: '机构业务部',
52
+ children: [
53
+ { id: 231, label: '政府机构组' },
54
+ { id: 232, label: '企业机构组' },
55
+ ],
56
+ },
57
+ ],
58
+ },
59
+ {
60
+ id: 3,
61
+ label: '总行零售银行总部',
62
+ children: [
63
+ {
64
+ id: 31,
65
+ label: '个人金融部',
66
+ children: [
67
+ { id: 311, label: '储蓄业务组' },
68
+ { id: 312, label: '理财业务组' },
69
+ { id: 313, label: '信用卡业务组' },
70
+ ],
71
+ },
72
+ {
73
+ id: 32,
74
+ label: '私人银行部',
75
+ children: [
76
+ { id: 321, label: '高净值客户组' },
77
+ { id: 322, label: '财富管理组' },
78
+ ],
79
+ },
80
+ ],
81
+ },
82
+ { id: 4, label: '总行票据业务部' },
83
+ { id: 5, label: '总行资产托管部' },
84
+ {
85
+ id: 6,
86
+ label: '总行国际业务部',
87
+ children: [
88
+ { id: 61, label: '国际结算组' },
89
+ { id: 62, label: '外汇业务组' },
90
+ { id: 63, label: '跨境金融组' },
91
+ ],
92
+ },
93
+ {
94
+ id: 7,
95
+ label: '资金营运中心',
96
+ children: [
97
+ { id: 71, label: '货币市场组' },
98
+ { id: 72, label: '债券投资组' },
99
+ { id: 73, label: '衍生品交易组' },
100
+ ],
101
+ },
102
+ {
103
+ id: 8,
104
+ label: '总行零售公司部',
105
+ children: [
106
+ { id: 81, label: '小微企业部' },
107
+ { id: 82, label: '供应链金融部' },
108
+ ],
109
+ },
110
+ {
111
+ id: 9,
112
+ label: '数字科技部',
113
+ children: [
114
+ {
115
+ id: 91,
116
+ label: '研发中心',
117
+ children: [
118
+ { id: 911, label: '前端开发组' },
119
+ { id: 912, label: '后端开发组' },
120
+ { id: 913, label: '移动端开发组' },
121
+ ],
122
+ },
123
+ {
124
+ id: 92,
125
+ label: '产品中心',
126
+ children: [
127
+ { id: 921, label: '产品设计组' },
128
+ { id: 922, label: '用户体验组' },
129
+ ],
130
+ },
131
+ { id: 93, label: '数据中心' },
132
+ ],
133
+ },
134
+ {
135
+ id: 10,
136
+ label: '风险管理部',
137
+ children: [
138
+ { id: 101, label: '信用风险组' },
139
+ { id: 102, label: '市场风险组' },
140
+ { id: 103, label: '操作风险组' },
141
+ ],
142
+ },
143
+ ]
144
+
145
+ /**
146
+ * 模拟获取部门树数据的接口
147
+ * @param {number} delay - 延迟时间(毫秒),默认500ms
148
+ * @returns {Promise<Array>}
149
+ */
150
+ export const fetchDepartments = (delay = 500) => {
151
+ return new Promise((resolve) => {
152
+ setTimeout(() => {
153
+ resolve(mockDepartments)
154
+ }, delay)
155
+ })
156
+ }
157
+
158
+ /**
159
+ * 根据关键词搜索部门
160
+ * @param {string} keyword - 搜索关键词
161
+ * @param {Array} departments - 部门树数据
162
+ * @returns {Array} 过滤后的部门树
163
+ */
164
+ export const searchDepartments = (keyword, departments = mockDepartments) => {
165
+ if (!keyword) return departments
166
+
167
+ const filterTree = (nodes) => {
168
+ return nodes.reduce((result, node) => {
169
+ const match = node.label.toLowerCase().includes(keyword.toLowerCase())
170
+ const children = node.children ? filterTree(node.children) : []
171
+
172
+ if (match || children.length > 0) {
173
+ result.push({
174
+ ...node,
175
+ children: children.length > 0 ? children : node.children,
176
+ })
177
+ }
178
+
179
+ return result
180
+ }, [])
181
+ }
182
+
183
+ return filterTree(departments)
184
+ }
185
+
186
+ /**
187
+ * 人员数据
188
+ * @type {Array<{id: string|number, name: string, departmentId: number, position: string, phone?: string, email?: string}>}
189
+ */
190
+ export const mockPersonnel = [
191
+ // 总行人力资源部
192
+ { id: 1001, name: '张伟', departmentId: 1, position: '部门总经理', phone: '13800000001', email: 'zhangwei@bank.com' },
193
+ { id: 1002, name: '王芳', departmentId: 11, position: '招聘中心主任', phone: '13800000002', email: 'wangfang@bank.com' },
194
+ { id: 1003, name: '李明', departmentId: 111, position: '校招负责人', phone: '13800000003', email: 'liming@bank.com' },
195
+ { id: 1004, name: '刘洋', departmentId: 111, position: '校招专员', phone: '13800000004', email: 'liuyang@bank.com' },
196
+ { id: 1005, name: '陈静', departmentId: 112, position: '社招负责人', phone: '13800000005', email: 'chenjing@bank.com' },
197
+ { id: 1006, name: '杨帆', departmentId: 112, position: '社招专员', phone: '13800000006', email: 'yangfan@bank.com' },
198
+ { id: 1007, name: '赵雪', departmentId: 113, position: '运营负责人', phone: '13800000007', email: 'zhaoxue@bank.com' },
199
+ { id: 1008, name: '孙涛', departmentId: 12, position: '培训中心主任', phone: '13800000008', email: 'suntao@bank.com' },
200
+ { id: 1009, name: '周敏', departmentId: 121, position: '管培负责人', phone: '13800000009', email: 'zhoumin@bank.com' },
201
+ { id: 1010, name: '吴强', departmentId: 122, position: '业务培训师', phone: '13800000010', email: 'wuqiang@bank.com' },
202
+ { id: 1011, name: '郑丽', departmentId: 123, position: '新员工培训师', phone: '13800000011', email: 'zhengli@bank.com' },
203
+ { id: 1012, name: '钱磊', departmentId: 13, position: '薪酬福利部主任', phone: '13800000012', email: 'qianlei@bank.com' },
204
+ { id: 1013, name: '孙娜', departmentId: 131, position: '薪酬专员', phone: '13800000013', email: 'sunna@bank.com' },
205
+ { id: 1014, name: '李欢', departmentId: 132, position: '福利专员', phone: '13800000014', email: 'lihuan@bank.com' },
206
+
207
+ // 总行公司银行总部
208
+ { id: 2001, name: '黄建国', departmentId: 2, position: '公司银行总经理', phone: '13800000020', email: 'huangjianguo@bank.com' },
209
+ { id: 2002, name: '林志远', departmentId: 21, position: '业务经理', phone: '13800000021', email: 'linzhiyuan@bank.com' },
210
+ { id: 2003, name: '徐文静', departmentId: 22, position: '业务经理', phone: '13800000022', email: 'xuwenjing@bank.com' },
211
+ { id: 2004, name: '马云飞', departmentId: 23, position: '机构业务部主任', phone: '13800000023', email: 'mayunfei@bank.com' },
212
+ { id: 2005, name: '胡晓明', departmentId: 231, position: '政府客户经理', phone: '13800000024', email: 'huxiaoming@bank.com' },
213
+ { id: 2006, name: '唐诗雨', departmentId: 232, position: '企业客户经理', phone: '13800000025', email: 'tangshiyu@bank.com' },
214
+
215
+ // 总行零售银行总部
216
+ { id: 3001, name: '宋志强', departmentId: 3, position: '零售银行总经理', phone: '13800000030', email: 'songzhiqiang@bank.com' },
217
+ { id: 3002, name: '冯丽娟', departmentId: 31, position: '个人金融部主任', phone: '13800000031', email: 'fenglijuan@bank.com' },
218
+ { id: 3003, name: '董浩然', departmentId: 311, position: '储蓄业务主管', phone: '13800000032', email: 'donghaoran@bank.com' },
219
+ { id: 3004, name: '蒋美玲', departmentId: 312, position: '理财经理', phone: '13800000033', email: 'jiangmeiling@bank.com' },
220
+ { id: 3005, name: '韩俊杰', departmentId: 313, position: '信用卡经理', phone: '13800000034', email: 'hanjunjie@bank.com' },
221
+ { id: 3006, name: '曹雪梅', departmentId: 32, position: '私行部主任', phone: '13800000035', email: 'caoxuemei@bank.com' },
222
+ { id: 3007, name: '姚天翔', departmentId: 321, position: '高净值客户经理', phone: '13800000036', email: 'yaotianxiang@bank.com' },
223
+ { id: 3008, name: '谢婷婷', departmentId: 322, position: '财富顾问', phone: '13800000037', email: 'xietingting@bank.com' },
224
+
225
+ // 数字科技部
226
+ { id: 9001, name: '方建华', departmentId: 9, position: '科技部总经理', phone: '13800000090', email: 'fangjianhua@bank.com' },
227
+ { id: 9002, name: '沈俊', departmentId: 91, position: '研发中心主任', phone: '13800000091', email: 'shenjun@bank.com' },
228
+ { id: 9003, name: '邓宇', departmentId: 911, position: '前端架构师', phone: '13800000092', email: 'dengyu@bank.com' },
229
+ { id: 9004, name: '薛凯', departmentId: 911, position: '前端工程师', phone: '13800000093', email: 'xuekai@bank.com' },
230
+ { id: 9005, name: '雷鹏', departmentId: 911, position: '前端工程师', phone: '13800000094', email: 'leipeng@bank.com' },
231
+ { id: 9006, name: '贺新宇', departmentId: 912, position: 'Java架构师', phone: '13800000095', email: 'hexinyu@bank.com' },
232
+ { id: 9007, name: '潘嘉琪', departmentId: 912, position: 'Java工程师', phone: '13800000096', email: 'panjiaqi@bank.com' },
233
+ { id: 9008, name: '汪明哲', departmentId: 913, position: 'iOS工程师', phone: '13800000097', email: 'wangmingzhe@bank.com' },
234
+ { id: 9009, name: '任思琪', departmentId: 92, position: '产品中心主任', phone: '13800000098', email: 'rensiqi@bank.com' },
235
+ { id: 9010, name: '龚佳欣', departmentId: 921, position: '产品经理', phone: '13800000099', email: 'gongjiaxin@bank.com' },
236
+ { id: 9011, name: '傅晨曦', departmentId: 922, position: 'UI设计师', phone: '13800000100', email: 'fuchenxi@bank.com' },
237
+ { id: 9012, name: '程雨欣', departmentId: 93, position: '数据分析师', phone: '13800000101', email: 'chengyuxin@bank.com' },
238
+
239
+ // 风险管理部
240
+ { id: 10001, name: '卢志诚', departmentId: 10, position: '风控总监', phone: '13800000110', email: 'luzhicheng@bank.com' },
241
+ { id: 10002, name: '陆建平', departmentId: 101, position: '信用风险主管', phone: '13800000111', email: 'lujianping@bank.com' },
242
+ { id: 10003, name: '万文涛', departmentId: 102, position: '市场风险分析师', phone: '13800000112', email: 'wanwentao@bank.com' },
243
+ { id: 10004, name: '莫慧敏', departmentId: 103, position: '操作风险专员', phone: '13800000113', email: 'mohuimin@bank.com' },
244
+ ]
245
+
246
+ /**
247
+ * 模拟获取人员列表的接口
248
+ * @param {number} delay - 延迟时间(毫秒),默认500ms
249
+ * @param {number|null} departmentId - 部门ID,为空时返回所有人员
250
+ * @returns {Promise<Array>}
251
+ */
252
+ export const fetchPersonnel = (delay = 500, departmentId = null) => {
253
+ return new Promise((resolve) => {
254
+ setTimeout(() => {
255
+ if (departmentId === null) {
256
+ resolve(mockPersonnel)
257
+ } else {
258
+ // 递归获取部门及其所有子部门的ID
259
+ const getAllDepartmentIds = (deptId) => {
260
+ const ids = [deptId]
261
+ const findChildren = (depts) => {
262
+ for (const dept of depts) {
263
+ if (dept.id === deptId && dept.children) {
264
+ dept.children.forEach(child => {
265
+ ids.push(child.id)
266
+ findChildren([child])
267
+ })
268
+ } else if (dept.children) {
269
+ findChildren(dept.children)
270
+ }
271
+ }
272
+ }
273
+ findChildren(mockDepartments)
274
+ return ids
275
+ }
276
+
277
+ const deptIds = getAllDepartmentIds(departmentId)
278
+ const filteredPersonnel = mockPersonnel.filter(p => deptIds.includes(p.departmentId))
279
+ resolve(filteredPersonnel)
280
+ }
281
+ }, delay)
282
+ })
283
+ }
284
+
285
+ /**
286
+ * 根据关键词搜索人员
287
+ * @param {string} keyword - 搜索关键词
288
+ * @param {Array} personnel - 人员列表数据
289
+ * @returns {Array} 过滤后的人员列表
290
+ */
291
+ export const searchPersonnel = (keyword, personnel = mockPersonnel) => {
292
+ if (!keyword) return personnel
293
+
294
+ const lowerKeyword = keyword.toLowerCase()
295
+ return personnel.filter(person =>
296
+ person.name.toLowerCase().includes(lowerKeyword) ||
297
+ person.position.toLowerCase().includes(lowerKeyword) ||
298
+ (person.phone && person.phone.includes(keyword)) ||
299
+ (person.email && person.email.toLowerCase().includes(lowerKeyword))
300
+ )
301
+ }
@@ -95,6 +95,30 @@ export default defineComponent({
95
95
  },
96
96
  ])
97
97
  const activeNames = ref(['1'])
98
+ const rules = ref({
99
+ qaScripts: {
100
+ problemDesc: [
101
+ { required: true, message: '请输入问题描述',label:'问题描述'},
102
+ ],
103
+ standardScript: [
104
+ { required: true, message: '请输入标准话术',label:'标准话术'},
105
+ ],
106
+ keyword: [
107
+ { required: true, message: '请输入关键词',label:'关键词'},
108
+ ],
109
+ },
110
+ proactiveScript: {
111
+ problemDesc: [
112
+ { required: true, message: '请输入问题描述',label:'问题描述'},
113
+ ],
114
+ standardScript: [
115
+ { required: true, message: '请输入标准话术',label:'标准话术'},
116
+ ],
117
+ keyword: [
118
+ { required: true, message: '请输入关键词',label:'关键词'},
119
+ ],
120
+ }
121
+ })
98
122
  const addScript = (item,props) => {
99
123
  console.log(item,props,'添加话术');
100
124
  item.scripts[props.activeName].push({
@@ -113,12 +137,12 @@ export default defineComponent({
113
137
  scripts={item.scripts}
114
138
  footer={(props) => (
115
139
  <div>
116
- <el-button type="text" size="small" onClick={() => {
140
+ <el-button link size="small" type="primary" onClick={() => {
117
141
  addScript(item,props)
118
142
  }}>
119
143
  十添加话术
120
144
  </el-button>
121
- <el-button type="text" size="small">
145
+ <el-button link size="small" type="primary">
122
146
  Ai生成话术
123
147
  </el-button>
124
148
  </div>
@@ -140,10 +164,10 @@ export default defineComponent({
140
164
  对话环节
141
165
  </div>
142
166
  <div class={[styles.operation]}>
143
- <el-button type="text" size="small">
167
+ <el-button link size="small" type="primary">
144
168
  添加环节
145
169
  </el-button>
146
- <el-button type="text" size="small">
170
+ <el-button link size="small" type="primary">
147
171
  重新生成环节
148
172
  </el-button>
149
173
  </div>
@@ -0,0 +1,32 @@
1
+ import { defineComponent, ref } from 'vue'
2
+ import DialogueSegment from './dialogueSegment/index.jsx'
3
+ import PracticeStatus from './practiceStatus/index.jsx'
4
+ import ReportDetail from './reportDetail/index.jsx'
5
+ import DepartmentPersonnel from './departmentPersonnel/index.jsx'
6
+
7
+ export default defineComponent({
8
+ // 智能教练
9
+ name: 'AiCoach',
10
+
11
+ setup() {
12
+ const activeTab = ref('dialogue-segment')
13
+ return () => {
14
+ return <div style={{padding: '30px'}}>
15
+ <el-tabs v-model={activeTab.value} type="border-card">
16
+ <el-tab-pane label="对话环节" name="dialogue-segment">
17
+ <DialogueSegment />
18
+ </el-tab-pane>
19
+ <el-tab-pane label="练习情况" name="practice-status">
20
+ <PracticeStatus />
21
+ </el-tab-pane>
22
+ <el-tab-pane label="报告详情" name="report-detail">
23
+ <ReportDetail />
24
+ </el-tab-pane>
25
+ <el-tab-pane label="部门人员" name="department-personnel">
26
+ <DepartmentPersonnel />
27
+ </el-tab-pane>
28
+ </el-tabs>
29
+ </div>
30
+ }
31
+ },
32
+ })
@@ -0,0 +1,121 @@
1
+ import { defineComponent, ref } from 'vue'
2
+ import styles from './index.module.scss'
3
+ import DonutChart from '../DonutChart'
4
+ import RankBarChart from '../RankBarChart'
5
+ import EchartsDonut from '../echarts/EchartsDonut.jsx'
6
+ import EchartsRankBar from '../echarts/EchartsRankBar.jsx'
7
+
8
+ /**
9
+ * 练习情况统计(3个面板)
10
+ * - 左:进度统计(环形图 + 图例)
11
+ * - 中:学员练习时长排名(条形排行)
12
+ * - 右:学员最高一次均分排名(条形排行)
13
+ */
14
+ export default defineComponent({
15
+ name: 'PracticeStatusChartsPanel',
16
+ props: {
17
+ useEcharts: {
18
+ type: Boolean,
19
+ default: false,
20
+ },
21
+ progress: {
22
+ type: Array,
23
+ default: () => [],
24
+ },
25
+ durationRank: {
26
+ type: Array,
27
+ default: () => [],
28
+ },
29
+ scoreRank: {
30
+ type: Array,
31
+ default: () => [],
32
+ },
33
+ },
34
+ setup(props) {
35
+ const hiddenLegend = ref([]) // 存储被隐藏的图例名称
36
+
37
+ const toggleLegend = (name) => {
38
+ if (!props.useEcharts) return // 只有 Echarts 模式下支持
39
+ if (hiddenLegend.value.includes(name)) {
40
+ hiddenLegend.value = hiddenLegend.value.filter((n) => n !== name)
41
+ } else {
42
+ hiddenLegend.value.push(name)
43
+ }
44
+ }
45
+
46
+ return () => (
47
+ <div>
48
+ <div class={styles.grid3}>
49
+ <div class={styles.panel}>
50
+ <div class={styles.panelHeader}>
51
+ <div class={styles.panelTitle}>进度统计</div>
52
+ <div class={styles.legend}>
53
+ {props.progress.map((it, idx) => {
54
+ const isHidden = hiddenLegend.value.includes(it.name)
55
+ return (
56
+ <span
57
+ class={[styles.legendItem, isHidden && props.useEcharts ? styles.legendHidden : '']}
58
+ key={`${it.name}-${idx}`}
59
+ onClick={() => toggleLegend(it.name)}
60
+ style={{ cursor: props.useEcharts ? 'pointer' : 'default', opacity: isHidden && props.useEcharts ? 0.5 : 1 }}
61
+ >
62
+ <i class={styles.dot} style={{ background: it.color }} />
63
+ <span>{it.name}</span>
64
+ </span>
65
+ )
66
+ })}
67
+ </div>
68
+ </div>
69
+ <div class={styles.pieWrap}>
70
+ {props.useEcharts ? (
71
+ <EchartsDonut series={props.progress} height={200} hiddenLegend={hiddenLegend.value} />
72
+ ) : (
73
+ <DonutChart series={props.progress} />
74
+ )}
75
+ </div>
76
+ </div>
77
+
78
+ <div class={styles.panel}>
79
+ <div class={styles.panelHeader}>
80
+ <div class={styles.panelTitle}>学员练习时长排名</div>
81
+ </div>
82
+ {props.useEcharts ? (
83
+ <EchartsRankBar
84
+ data={props.durationRank}
85
+ valueFormatter={(v) => `${v.toFixed(1)}`}
86
+ height={300}
87
+ />
88
+ ) : (
89
+ <RankBarChart
90
+ data={props.durationRank}
91
+ valueFormatter={(v) => `${v.toFixed(1)}`}
92
+ height={300}
93
+ />
94
+ )}
95
+ </div>
96
+
97
+ <div class={styles.panel}>
98
+ <div class={styles.panelHeader}>
99
+ <div class={styles.panelTitle}>学员最高一次均分排名</div>
100
+ </div>
101
+ {props.useEcharts ? (
102
+ <EchartsRankBar
103
+ data={props.scoreRank}
104
+ valueFormatter={(v) => `${v}`}
105
+ height={300}
106
+ max={100}
107
+ />
108
+ ) : (
109
+ <RankBarChart
110
+ data={props.scoreRank}
111
+ valueFormatter={(v) => `${v}`}
112
+ height={300}
113
+ />
114
+ )}
115
+ </div>
116
+ </div>
117
+ </div>
118
+ )
119
+ },
120
+ })
121
+
@@ -0,0 +1,76 @@
1
+ .grid3 {
2
+ display: grid;
3
+ grid-template-columns: 1.2fr 1fr 1fr;
4
+ gap: 10px;
5
+ }
6
+
7
+ .chartCard {
8
+ background: #fff;
9
+ border-radius: 8px;
10
+ padding: 16px;
11
+ border: 1px solid #ebeef5;
12
+ }
13
+
14
+ /* Alias for component usage */
15
+ .panel {
16
+ composes: chartCard;
17
+ }
18
+
19
+ .chartHeader {
20
+ display: flex;
21
+ justify-content: space-between;
22
+ align-items: center;
23
+ margin-bottom: 12px;
24
+ }
25
+
26
+ /* Alias for component usage */
27
+ .panelHeader {
28
+ composes: chartHeader;
29
+ }
30
+
31
+ .chartTitle {
32
+ font-size: 14px;
33
+ font-weight: 600;
34
+ color: #303133;
35
+ }
36
+
37
+ /* Alias for component usage */
38
+ .panelTitle {
39
+ composes: chartTitle;
40
+ }
41
+
42
+ .chartLegend {
43
+ display: flex;
44
+ gap: 16px;
45
+ }
46
+
47
+ /* Alias for component usage */
48
+ .legend {
49
+ composes: chartLegend;
50
+ }
51
+
52
+ .legendItem {
53
+ display: flex;
54
+ align-items: center;
55
+ font-size: 12px;
56
+ color: #606266;
57
+ cursor: pointer;
58
+ transition: opacity 0.3s;
59
+ }
60
+
61
+ .legendHidden {
62
+ opacity: 0.5;
63
+ }
64
+
65
+ .dot {
66
+ width: 8px;
67
+ height: 8px;
68
+ border-radius: 50%;
69
+ margin-right: 6px;
70
+ }
71
+
72
+ .pieWrap {
73
+ display: flex;
74
+ justify-content: center;
75
+ align-items: center;
76
+ }