af-mobile-client-vue3 1.4.54 → 1.4.56

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 (47) hide show
  1. package/build/vite/optimize.ts +36 -36
  2. package/package.json +1 -1
  3. package/public/favicon.svg +4 -4
  4. package/scripts/verifyCommit.js +19 -19
  5. package/src/components/common/MateChat/apiService.ts +134 -103
  6. package/src/components/common/MateChat/components/MateChatContent.vue +281 -0
  7. package/src/components/common/MateChat/components/MateChatHeader.vue +298 -253
  8. package/src/components/common/MateChat/components/PasswordDialog.vue +97 -0
  9. package/src/components/common/MateChat/composables/useChatHistoryCache.ts +117 -0
  10. package/src/components/common/MateChat/composables/useChatMessagesCache.ts +72 -0
  11. package/src/components/common/MateChat/composables/useMateChat.ts +372 -0
  12. package/src/components/common/MateChat/composables/usePasswordManager.ts +38 -0
  13. package/src/components/common/MateChat/index.vue +443 -0
  14. package/src/components/common/MateChat/types.ts +241 -0
  15. package/src/components/data/UserDetail/types.ts +1 -1
  16. package/src/components/data/XFormGroup/doc/DeviceForm.vue +1 -1
  17. package/src/components/data/XFormGroup/doc/UserForm.vue +1 -1
  18. package/src/components/data/XReportGrid/XAddReport/index.ts +1 -1
  19. package/src/components/data/XReportGrid/XReportDemo.vue +33 -33
  20. package/src/components/data/XReportGrid/XReportDrawer/index.ts +1 -1
  21. package/src/components/data/XReportGrid/print.js +184 -184
  22. package/src/components/data/XTag/index.vue +10 -10
  23. package/src/components/layout/TabBarLayout/index.vue +40 -40
  24. package/src/hooks/useCommon.ts +9 -9
  25. package/src/plugins/AppData.ts +38 -38
  26. package/src/router/invoiceRoutes.ts +33 -33
  27. package/src/services/api/common.ts +109 -109
  28. package/src/services/api/manage.ts +8 -8
  29. package/src/services/api/search.ts +16 -16
  30. package/src/services/restTools.ts +56 -56
  31. package/src/utils/authority-utils.ts +84 -84
  32. package/src/utils/crypto.ts +39 -39
  33. package/src/utils/runEvalFunction.ts +13 -13
  34. package/src/utils/timeUtil.ts +27 -27
  35. package/src/views/component/EvaluateRecordView/index.vue +40 -40
  36. package/src/views/component/MateChat/MateChatView.vue +10 -51
  37. package/src/views/component/XCellDetailView/index.vue +217 -217
  38. package/src/views/component/XReportFormIframeView/index.vue +47 -47
  39. package/src/views/component/XReportFormView/index.vue +13 -13
  40. package/src/views/component/XSignatureView/index.vue +50 -50
  41. package/src/views/component/notice.vue +46 -46
  42. package/src/views/component/topNav.vue +36 -36
  43. package/src/views/invoiceShow/index.vue +61 -61
  44. package/src/views/user/login/index.vue +22 -22
  45. package/vite.config.ts +2 -1
  46. package/src/components/common/MateChat/MateChat.vue +0 -248
  47. package/src/components/common/MateChat/useMateChat.ts +0 -212
@@ -1,212 +0,0 @@
1
- import type { ChatBizResult, ChatStreamCallbacks } from './apiService'
2
- import { showToast } from 'vant'
3
- import { ref } from 'vue'
4
- import { chatBiz, chatCompletionsStream } from './apiService'
5
-
6
- /**
7
- * MateChat 组件内部使用的消息结构
8
- */
9
- export interface MateChatMessage {
10
- from: 'user' | 'model' | 'service'
11
- content: string
12
- loading?: boolean
13
- }
14
-
15
- /**
16
- * 封装 MateChat 核心对话逻辑的组合式函数
17
- * - 负责 startPage / inputValue / messages 等状态
18
- * - 根据 useStream 决定使用非流式(chatBiz)还是流式(chatCompletionsStream)
19
- */
20
- export function useMateChat(options?: { useStream?: boolean }) {
21
- const startPage = ref(true)
22
- const inputValue = ref('')
23
- const messages = ref<MateChatMessage[]>([])
24
- const useStream = options?.useStream === true
25
-
26
- /**
27
- * 新建会话:回到起始页并清空历史消息
28
- */
29
- function newConversation() {
30
- startPage.value = true
31
- messages.value = []
32
- }
33
-
34
- /**
35
- * 发送一条消息
36
- * - 推入用户消息
37
- * - 添加一条 loading 的模型消息
38
- * - 根据 useStream 调用对应的接口
39
- */
40
- async function onSubmit(evt: string) {
41
- if (!evt.trim()) {
42
- return
43
- }
44
-
45
- inputValue.value = ''
46
- startPage.value = false
47
-
48
- // 用户发送消息
49
- messages.value.push({
50
- from: 'user',
51
- content: evt,
52
- })
53
-
54
- // 添加 loading 状态的 model 消息
55
- const loadingMessageIndex = messages.value.length
56
- messages.value.push({
57
- from: 'model',
58
- content: '',
59
- loading: true,
60
- })
61
-
62
- if (!useStream) {
63
- // 非流式:一次性拿到完整结果
64
- try {
65
- const result: ChatBizResult = await chatBiz(evt)
66
-
67
- if (result.type === 'transfer') {
68
- // 移除 loading 消息
69
- messages.value.splice(loadingMessageIndex, 1)
70
- // 添加人工客服消息
71
- messages.value.push({
72
- from: 'service',
73
- content: '您好,客服xxx工号xxx为你服务。功能开发中,敬请期待。',
74
- })
75
- }
76
- else {
77
- // 正常消息:替换 loading 为模型回复
78
- messages.value[loadingMessageIndex] = {
79
- from: 'model',
80
- content: result.content,
81
- loading: false,
82
- }
83
- }
84
- }
85
- catch (error: any) {
86
- // 处理错误
87
- console.error('聊天请求失败:', error)
88
- messages.value[loadingMessageIndex] = {
89
- from: 'model',
90
- content: '抱歉,服务暂时不可用,请稍后再试。',
91
- loading: false,
92
- }
93
- showToast(error?.message || '请求失败,请稍后再试')
94
- }
95
-
96
- return
97
- }
98
-
99
- // 流式:使用 FastGPT SSE,增量更新最后一条模型消息内容,并在前缀为 {"msgType":"transfer"} 时转人工
100
- const transferPrefix = '{"msgType":"transfer"'
101
- let checkedTransfer = false
102
- let transferHandled = false
103
- let prefixBuffer = ''
104
-
105
- const callbacks: ChatStreamCallbacks = {
106
- onMessage(chunk) {
107
- if (transferHandled) {
108
- return
109
- }
110
-
111
- // 尚未判断是否为转人工前缀
112
- if (!checkedTransfer) {
113
- const trimmed = chunk.trimStart()
114
- if (!trimmed) {
115
- // 纯空白,等待下一帧
116
- return
117
- }
118
-
119
- // 第一个有效字符不是 { ,本次不会是转人工 JSON,后续直接按普通文本处理
120
- if (!prefixBuffer && trimmed[0] !== '{') {
121
- checkedTransfer = true
122
- const msg = messages.value[loadingMessageIndex]
123
- if (!msg) {
124
- return
125
- }
126
- msg.content += chunk
127
- msg.loading = true
128
- return
129
- }
130
-
131
- // 有可能是 JSON,累积前缀做精准匹配
132
- prefixBuffer += trimmed
133
-
134
- // 如果当前前缀还是 transferPrefix 的前缀,继续等后续 chunk
135
- if (transferPrefix.startsWith(prefixBuffer)) {
136
- // 还没完整匹配上整个标识,继续等待
137
- if (prefixBuffer.length < transferPrefix.length) {
138
- return
139
- }
140
- }
141
-
142
- if (prefixBuffer.startsWith(transferPrefix)) {
143
- // 确认是转人工:移除 loading 模型气泡,插入客服气泡
144
- messages.value.splice(loadingMessageIndex, 1)
145
- messages.value.push({
146
- from: 'service',
147
- content: '您好,客服xxx工号xxx为你服务。功能开发中,敬请期待。',
148
- })
149
- transferHandled = true
150
- checkedTransfer = true
151
- return
152
- }
153
-
154
- // 前缀与约定不匹配,当作普通内容处理,并不再尝试转人工识别
155
- checkedTransfer = true
156
- const msg = messages.value[loadingMessageIndex]
157
- if (!msg) {
158
- return
159
- }
160
- msg.content += prefixBuffer
161
- msg.loading = true
162
- prefixBuffer = ''
163
- return
164
- }
165
-
166
- // 已经判断过不会转人工,正常流式追加内容
167
- const msg = messages.value[loadingMessageIndex]
168
- if (!msg) {
169
- return
170
- }
171
- msg.content += chunk
172
- msg.loading = true
173
- },
174
- onComplete() {
175
- if (transferHandled) {
176
- return
177
- }
178
- const msg = messages.value[loadingMessageIndex]
179
- if (!msg) {
180
- return
181
- }
182
- msg.loading = false
183
- },
184
- onError(error) {
185
- console.error('聊天请求失败:', error)
186
- const msg = messages.value[loadingMessageIndex]
187
- if (!msg) {
188
- return
189
- }
190
- msg.content = '抱歉,服务暂时不可用,请稍后再试。'
191
- msg.loading = false
192
- showToast((error as any)?.message || '请求失败,请稍后再试')
193
- },
194
- }
195
-
196
- try {
197
- await chatCompletionsStream(evt, callbacks)
198
- }
199
- catch (error: any) {
200
- // 兜底错误处理(理论上 callbacks.onError 已经处理)
201
- console.error('聊天流式请求异常:', error)
202
- }
203
- }
204
-
205
- return {
206
- startPage,
207
- inputValue,
208
- messages,
209
- newConversation,
210
- onSubmit,
211
- }
212
- }