vue2-client 1.8.91 → 1.8.93
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/package.json +1 -1
- package/src/base-client/components/common/XTable/XTable.vue +9 -1
- package/src/pages/DynamicStatistics/DataTabs.vue +3 -2
- package/src/pages/DynamicStatistics/DynamicTable.vue +39 -10
- package/src/pages/DynamicStatistics/EvaluationArea.vue +10 -5
- package/src/pages/DynamicStatistics/FavoriteList.vue +51 -51
- package/src/pages/DynamicStatistics/QuestionHistoryAndFavorites.vue +108 -31
- package/src/pages/DynamicStatistics/SearchBar.vue +18 -20
- package/src/pages/DynamicStatistics/index.vue +58 -54
- package/src/pages/system/ticket/submitTicketSuccess.vue +1 -1
- package/src/services/api/entity.js +18 -18
- package/src/utils/waterMark.js +31 -31
package/CHANGELOG.md
CHANGED
package/package.json
CHANGED
|
@@ -157,6 +157,8 @@ export default {
|
|
|
157
157
|
selectedRowKeys: [],
|
|
158
158
|
// 表格选择Row集合
|
|
159
159
|
selectedRows: [],
|
|
160
|
+
// 禁止表格选择Row集合
|
|
161
|
+
selectedDisableRows: [],
|
|
160
162
|
// 业务标题
|
|
161
163
|
title: '',
|
|
162
164
|
// 数据列
|
|
@@ -218,7 +220,13 @@ export default {
|
|
|
218
220
|
rowSelection () {
|
|
219
221
|
return {
|
|
220
222
|
selectedRowKeys: this.selectedRowKeys,
|
|
221
|
-
onChange: this.onSelectChange
|
|
223
|
+
onChange: this.onSelectChange,
|
|
224
|
+
getCheckboxProps: record => ({
|
|
225
|
+
props: {
|
|
226
|
+
disabled: this.selectedDisableRows.includes(record[this.rowKey]), // Column configuration not to be checked
|
|
227
|
+
name: record.name,
|
|
228
|
+
},
|
|
229
|
+
}),
|
|
222
230
|
}
|
|
223
231
|
},
|
|
224
232
|
...mapState('setting', ['compatible'])
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<a-row class="data-content">
|
|
3
3
|
<a-row>
|
|
4
|
-
<DynamicTable :table-data="pane.content"></DynamicTable>
|
|
4
|
+
<DynamicTable v-if="pane.key" :title="pane.title" :table-data="pane.content"></DynamicTable>
|
|
5
5
|
</a-row>
|
|
6
6
|
<a-row>
|
|
7
7
|
<ChartSelector :rawData="pane.content" v-if="pane?.content?.length"/>
|
|
8
8
|
</a-row>
|
|
9
|
-
<EvaluationArea :uuid="pane.key" v-if="pane.key"/>
|
|
9
|
+
<EvaluationArea :uuid="pane.key" v-if="pane.key && pane.content"/>
|
|
10
10
|
</a-row>
|
|
11
11
|
</template>
|
|
12
12
|
|
|
@@ -30,6 +30,7 @@ export default {
|
|
|
30
30
|
}
|
|
31
31
|
},
|
|
32
32
|
mounted () {
|
|
33
|
+
this.pane = {}
|
|
33
34
|
},
|
|
34
35
|
methods: {
|
|
35
36
|
show (obj) {
|
|
@@ -1,14 +1,35 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div class="table-main">
|
|
3
|
-
<
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
</
|
|
3
|
+
<template v-if="title">
|
|
4
|
+
<a-table
|
|
5
|
+
v-if="tableData"
|
|
6
|
+
:scroll="{ x: scrollXWidth, y: scrollYHeight }"
|
|
7
|
+
size="middle"
|
|
8
|
+
:columns="tableColumns"
|
|
9
|
+
:dataSource="tableData"
|
|
10
|
+
:rowKey="record => record.id">
|
|
11
|
+
</a-table>
|
|
12
|
+
<a-result
|
|
13
|
+
v-else
|
|
14
|
+
status="error"
|
|
15
|
+
title="请求失败"
|
|
16
|
+
sub-title="这通常是因为网络波动或程序故障导致的"
|
|
17
|
+
>
|
|
18
|
+
|
|
19
|
+
<div class="desc">
|
|
20
|
+
<p style="font-size: 16px;">
|
|
21
|
+
<strong>我如何解决这个问题:</strong>
|
|
22
|
+
</p>
|
|
23
|
+
<p>
|
|
24
|
+
<a-icon :style="{ color: 'red' }" type="close-circle" /> 尝试重新发起请求
|
|
25
|
+
</p>
|
|
26
|
+
<p>
|
|
27
|
+
<a-icon :style="{ color: 'red' }" type="close-circle" /> 调整提问方式
|
|
28
|
+
</p>
|
|
29
|
+
</div>
|
|
30
|
+
</a-result>
|
|
31
|
+
</template>
|
|
32
|
+
</div></template>
|
|
12
33
|
|
|
13
34
|
<script>
|
|
14
35
|
|
|
@@ -26,9 +47,13 @@ export default {
|
|
|
26
47
|
this.initData()
|
|
27
48
|
},
|
|
28
49
|
props: {
|
|
50
|
+
title: {
|
|
51
|
+
type: String,
|
|
52
|
+
default: undefined
|
|
53
|
+
},
|
|
29
54
|
tableData: {
|
|
30
55
|
type: Array,
|
|
31
|
-
default: () =>
|
|
56
|
+
default: () => null
|
|
32
57
|
}
|
|
33
58
|
},
|
|
34
59
|
watch: {
|
|
@@ -42,8 +67,12 @@ export default {
|
|
|
42
67
|
methods: {
|
|
43
68
|
async initData () {
|
|
44
69
|
try {
|
|
70
|
+
if (!this.tableData) {
|
|
71
|
+
return
|
|
72
|
+
}
|
|
45
73
|
// 从数据第一项推断列信息
|
|
46
74
|
if (this.tableData.length === 0) {
|
|
75
|
+
this.tableColumns = []
|
|
47
76
|
return
|
|
48
77
|
}
|
|
49
78
|
const sample = this.tableData[0]
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
<p>您对这次搜索结果满意吗?</p>
|
|
5
5
|
<a-button-group>
|
|
6
6
|
<a-space>
|
|
7
|
-
<a-button type="primary" icon="like" @click="submitEvaluation(
|
|
8
|
-
<a-button type="danger" icon="dislike" @click="submitEvaluation(
|
|
7
|
+
<a-button type="primary" icon="like" @click="submitEvaluation(0)">满意</a-button>
|
|
8
|
+
<a-button type="danger" icon="dislike" @click="submitEvaluation(1)">不满意</a-button>
|
|
9
|
+
<a-button type="default" icon="frown" @click="submitEvaluation(2)">待改进</a-button>
|
|
9
10
|
</a-space>
|
|
10
11
|
</a-button-group>
|
|
11
12
|
</div>
|
|
@@ -35,12 +36,16 @@ export default {
|
|
|
35
36
|
const content = Object.assign(item, {
|
|
36
37
|
evaluation: result
|
|
37
38
|
})
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
// 保存到数据库中
|
|
40
|
+
post('/api/af-system/logic/openapi/updateCommonData', {
|
|
41
|
+
type: 'ai-question',
|
|
42
|
+
content: this.uuid,
|
|
43
|
+
newContent: content
|
|
41
44
|
}).then(res => {
|
|
42
45
|
this.action = true
|
|
43
46
|
this.$message.success('评论成功')
|
|
47
|
+
indexedDB.delete(key)
|
|
48
|
+
indexedDB.add(key, content)
|
|
44
49
|
})
|
|
45
50
|
})
|
|
46
51
|
}
|
|
@@ -1,51 +1,51 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div>
|
|
3
|
-
<a-list v-show="!loading" size="small" :data-source="data">
|
|
4
|
-
<a-list-item slot="renderItem" slot-scope="item">
|
|
5
|
-
<div>
|
|
6
|
-
<p><a @click="$emit('openFavorites', item.uuid)">{{ item.question }} </a></p>
|
|
7
|
-
<p>{{ item.date }}</p>
|
|
8
|
-
</div>
|
|
9
|
-
<a class="delete_item">
|
|
10
|
-
<a-icon type="close" @click="$emit('saveToFavorites', item.uuid)"/>
|
|
11
|
-
</a>
|
|
12
|
-
</a-list-item>
|
|
13
|
-
</a-list>
|
|
14
|
-
</div>
|
|
15
|
-
</template>
|
|
16
|
-
|
|
17
|
-
<script>
|
|
18
|
-
import { indexedDB } from '@vue2-client/utils/indexedDB'
|
|
19
|
-
|
|
20
|
-
export default {
|
|
21
|
-
name: 'FavoriteList',
|
|
22
|
-
data () {
|
|
23
|
-
return {
|
|
24
|
-
data: [],
|
|
25
|
-
loading: false
|
|
26
|
-
}
|
|
27
|
-
},
|
|
28
|
-
mounted () {
|
|
29
|
-
this.loadData()
|
|
30
|
-
},
|
|
31
|
-
methods: {
|
|
32
|
-
loadData () {
|
|
33
|
-
console.warn(123)
|
|
34
|
-
indexedDB.getAll((data) => {
|
|
35
|
-
const realData = data.filter(item => item.data && item.data.uuid)
|
|
36
|
-
.map(item => item.data)
|
|
37
|
-
this.data = realData
|
|
38
|
-
})
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
</script>
|
|
43
|
-
<style lang="less" scoped>
|
|
44
|
-
.delete_item {
|
|
45
|
-
margin-left: 8px;
|
|
46
|
-
color: #333;
|
|
47
|
-
}
|
|
48
|
-
p {
|
|
49
|
-
margin: 0
|
|
50
|
-
}
|
|
51
|
-
</style>
|
|
1
|
+
<template>
|
|
2
|
+
<div>
|
|
3
|
+
<a-list v-show="!loading" size="small" :data-source="data">
|
|
4
|
+
<a-list-item slot="renderItem" slot-scope="item">
|
|
5
|
+
<div>
|
|
6
|
+
<p><a @click="$emit('openFavorites', item.uuid)">{{ item.question }} </a></p>
|
|
7
|
+
<p>{{ item.date }}</p>
|
|
8
|
+
</div>
|
|
9
|
+
<a class="delete_item">
|
|
10
|
+
<a-icon type="close" @click="$emit('saveToFavorites', item.uuid)"/>
|
|
11
|
+
</a>
|
|
12
|
+
</a-list-item>
|
|
13
|
+
</a-list>
|
|
14
|
+
</div>
|
|
15
|
+
</template>
|
|
16
|
+
|
|
17
|
+
<script>
|
|
18
|
+
import { indexedDB } from '@vue2-client/utils/indexedDB'
|
|
19
|
+
|
|
20
|
+
export default {
|
|
21
|
+
name: 'FavoriteList',
|
|
22
|
+
data () {
|
|
23
|
+
return {
|
|
24
|
+
data: [],
|
|
25
|
+
loading: false
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
mounted () {
|
|
29
|
+
this.loadData()
|
|
30
|
+
},
|
|
31
|
+
methods: {
|
|
32
|
+
loadData () {
|
|
33
|
+
console.warn(123)
|
|
34
|
+
indexedDB.getAll((data) => {
|
|
35
|
+
const realData = data.filter(item => item.data && item.data.uuid)
|
|
36
|
+
.map(item => item.data)
|
|
37
|
+
this.data = realData
|
|
38
|
+
})
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
</script>
|
|
43
|
+
<style lang="less" scoped>
|
|
44
|
+
.delete_item {
|
|
45
|
+
margin-left: 8px;
|
|
46
|
+
color: #333;
|
|
47
|
+
}
|
|
48
|
+
p {
|
|
49
|
+
margin: 0
|
|
50
|
+
}
|
|
51
|
+
</style>
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<a-list item-layout="horizontal" :data-source="questions">
|
|
6
6
|
<a-list-item
|
|
7
7
|
slot="renderItem"
|
|
8
|
-
:class="item.uuid === currentuuid ? 'question-history-active' : 'question-history-inactive'"
|
|
8
|
+
:class="item.sql ? (item.uuid === currentuuid ? 'question-history-active' : 'question-history-inactive') : (item.uuid === currentuuid ? 'question-history-active-bug' : 'question-history-inactive-bug')"
|
|
9
9
|
slot-scope="item,index"
|
|
10
10
|
@click="handleOpenFavorite(item)">
|
|
11
11
|
<a-list-item-meta
|
|
@@ -13,26 +13,36 @@
|
|
|
13
13
|
:description="item.date"
|
|
14
14
|
/>
|
|
15
15
|
<a-space>
|
|
16
|
-
<a-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
<a-tooltip title="查看元数据">
|
|
17
|
+
<a-icon
|
|
18
|
+
v-if="item.data"
|
|
19
|
+
type="eye"
|
|
20
|
+
@click.stop="openMetaDataModal(item)"/>
|
|
21
|
+
</a-tooltip>
|
|
22
22
|
<span> </span>
|
|
23
|
-
<a-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
<
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
23
|
+
<a-tooltip title="删除对话">
|
|
24
|
+
<a-icon
|
|
25
|
+
type="delete"
|
|
26
|
+
theme="filled"
|
|
27
|
+
class="delClass"
|
|
28
|
+
@click.stop="delQuestion(item,index)"/>
|
|
29
|
+
</a-tooltip>
|
|
30
|
+
<span> </span>
|
|
31
|
+
<a-tooltip :title="item.isFavorite ? '取消收藏' : '收藏'" v-if="item.sql">
|
|
32
|
+
<a-icon
|
|
33
|
+
type="star"
|
|
34
|
+
:class="item.isFavorite ? 'startActive' : 'startInactive'"
|
|
35
|
+
@click.stop="toFavorites(item,index)"
|
|
36
|
+
:theme=" item.isFavorite ? 'filled': 'twoTone'"
|
|
37
|
+
two-tone-color="#FFD700"/>
|
|
38
|
+
</a-tooltip>
|
|
39
|
+
<a-tooltip title="重新查询" v-else>
|
|
40
|
+
<a-icon
|
|
41
|
+
@click.stop="reTrySearch(item, index)"
|
|
42
|
+
type="sync"
|
|
43
|
+
class="reSearch"
|
|
44
|
+
title="重新查询"/>
|
|
45
|
+
</a-tooltip>
|
|
36
46
|
</a-space>
|
|
37
47
|
</a-list-item>
|
|
38
48
|
</a-list>
|
|
@@ -49,6 +59,13 @@
|
|
|
49
59
|
:description="item.date"
|
|
50
60
|
/>
|
|
51
61
|
<a-space>
|
|
62
|
+
<a-tooltip title="查看元数据">
|
|
63
|
+
<a-icon
|
|
64
|
+
v-if="item.data"
|
|
65
|
+
type="eye"
|
|
66
|
+
@click.stop="openMetaDataModal(item)"/>
|
|
67
|
+
</a-tooltip>
|
|
68
|
+
<span> </span>
|
|
52
69
|
<a-icon
|
|
53
70
|
type="star"
|
|
54
71
|
:class="item.isFavorite ? 'startActive' : 'startInactive'"
|
|
@@ -60,6 +77,42 @@
|
|
|
60
77
|
</a-list>
|
|
61
78
|
</a-tab-pane>
|
|
62
79
|
</a-tabs>
|
|
80
|
+
<a-modal
|
|
81
|
+
width="1200px"
|
|
82
|
+
title="元数据"
|
|
83
|
+
@cancel="handleCancel"
|
|
84
|
+
:visible="metaDataModalVisible"
|
|
85
|
+
>
|
|
86
|
+
<a-descriptions :column="2" bordered>
|
|
87
|
+
<a-descriptions-item label="uuid">
|
|
88
|
+
{{ item.uuid }}
|
|
89
|
+
</a-descriptions-item>
|
|
90
|
+
<a-descriptions-item label="问题">
|
|
91
|
+
{{ item.question }}
|
|
92
|
+
</a-descriptions-item>
|
|
93
|
+
<a-descriptions-item label="类型">
|
|
94
|
+
{{ item.queryType }}
|
|
95
|
+
</a-descriptions-item>
|
|
96
|
+
<a-descriptions-item label="filterTable">
|
|
97
|
+
{{ item.filterTable }}
|
|
98
|
+
</a-descriptions-item>
|
|
99
|
+
<a-descriptions-item label="relationTable">
|
|
100
|
+
{{ item.relationTable }}
|
|
101
|
+
</a-descriptions-item>
|
|
102
|
+
<a-descriptions-item label="similarTable">
|
|
103
|
+
{{ item.similarTable }}
|
|
104
|
+
</a-descriptions-item>
|
|
105
|
+
<a-descriptions-item label="prompt">
|
|
106
|
+
{{ item.prompt }}
|
|
107
|
+
</a-descriptions-item>
|
|
108
|
+
<a-descriptions-item label="sql">
|
|
109
|
+
{{ item.sql }}
|
|
110
|
+
</a-descriptions-item>
|
|
111
|
+
<a-descriptions-item label="查询日期">
|
|
112
|
+
{{ item.date }}
|
|
113
|
+
</a-descriptions-item>
|
|
114
|
+
</a-descriptions>
|
|
115
|
+
</a-modal>
|
|
63
116
|
</a-card>
|
|
64
117
|
</template>
|
|
65
118
|
|
|
@@ -78,7 +131,10 @@ export default {
|
|
|
78
131
|
return {
|
|
79
132
|
activeKey: '1',
|
|
80
133
|
questions: [], // 你的问题历史
|
|
81
|
-
favorites: [] // 你的收藏问题
|
|
134
|
+
favorites: [], // 你的收藏问题
|
|
135
|
+
// 元数据窗口
|
|
136
|
+
metaDataModalVisible: false,
|
|
137
|
+
item: {}
|
|
82
138
|
}
|
|
83
139
|
},
|
|
84
140
|
mounted () {
|
|
@@ -86,6 +142,8 @@ export default {
|
|
|
86
142
|
},
|
|
87
143
|
methods: {
|
|
88
144
|
loadData () {
|
|
145
|
+
this.questions = []
|
|
146
|
+
this.favorites = []
|
|
89
147
|
indexedDB.getAll((data) => {
|
|
90
148
|
// 遍历data,将question和favorites分别赋值给questions和favorites
|
|
91
149
|
for (const datum of data) {
|
|
@@ -103,7 +161,8 @@ export default {
|
|
|
103
161
|
handleOpenFavorite (item) {
|
|
104
162
|
this.$emit('handleOpenFavorite', item)
|
|
105
163
|
},
|
|
106
|
-
reTrySearch (item) {
|
|
164
|
+
reTrySearch (item, index) {
|
|
165
|
+
this.delQuestion(item, index)
|
|
107
166
|
this.$emit('handleSearch', item.question, null, item.uuid)
|
|
108
167
|
},
|
|
109
168
|
add (question) {
|
|
@@ -119,14 +178,22 @@ export default {
|
|
|
119
178
|
return
|
|
120
179
|
}
|
|
121
180
|
this.questions.push(question)
|
|
181
|
+
this.handleOpenFavorite(question)
|
|
122
182
|
indexedDB.add('question-' + question.uuid, question)
|
|
183
|
+
this.loadData()
|
|
123
184
|
},
|
|
124
185
|
updateQuestion (question) {
|
|
125
186
|
const questionKey = 'question-' + question.uuid
|
|
126
187
|
indexedDB.delete(questionKey)
|
|
127
188
|
indexedDB.add(questionKey, question)
|
|
128
189
|
},
|
|
129
|
-
|
|
190
|
+
openMetaDataModal (item) {
|
|
191
|
+
this.item = item
|
|
192
|
+
this.metaDataModalVisible = true
|
|
193
|
+
},
|
|
194
|
+
handleCancel () {
|
|
195
|
+
this.metaDataModalVisible = false
|
|
196
|
+
},
|
|
130
197
|
toFavorites (question, index) {
|
|
131
198
|
this.questions[index].isFavorite = !this.questions[index].isFavorite
|
|
132
199
|
if (this.questions[index].isFavorite) {
|
|
@@ -138,7 +205,7 @@ export default {
|
|
|
138
205
|
this.$message.success('收藏成功')
|
|
139
206
|
} else {
|
|
140
207
|
// 根据 uuid 删除 favorites 中的对应项
|
|
141
|
-
this.favorites = this.favorites.filter(item => item.uuid !== question.uuid)
|
|
208
|
+
this.favorites = this.favorites.filter(item => item.uuid !== question.uuid).sort((a, b) => new Date(b.date) - new Date(a.date))
|
|
142
209
|
// 删除收藏的储存
|
|
143
210
|
const key = 'favorites-' + question.uuid
|
|
144
211
|
indexedDB.delete(key)
|
|
@@ -153,9 +220,6 @@ export default {
|
|
|
153
220
|
// 删除收藏
|
|
154
221
|
const favoritesKey = 'favorites-' + item.uuid
|
|
155
222
|
indexedDB.delete(favoritesKey)
|
|
156
|
-
// 删除收藏数组中的对应项
|
|
157
|
-
this.favorites = this.favorites.filter(favorite => favorite.uuid !== item.uuid)
|
|
158
|
-
this.$message.success('删除成功')
|
|
159
223
|
},
|
|
160
224
|
delFavorites (item, index) {
|
|
161
225
|
this.favorites.splice(index, 1)
|
|
@@ -189,15 +253,28 @@ export default {
|
|
|
189
253
|
height: 100%;
|
|
190
254
|
border-radius: 8px;
|
|
191
255
|
|
|
256
|
+
.question-history-active-bug {
|
|
257
|
+
border-left: 4px solid #FF0036;
|
|
258
|
+
border-radius: 4px;
|
|
259
|
+
padding: 18px 18px 18px 14px;
|
|
260
|
+
background-color: rgba(#ff0000, 0.04);
|
|
261
|
+
}
|
|
262
|
+
|
|
192
263
|
.question-history-active {
|
|
193
264
|
border-left: 4px solid #1890FF;
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
265
|
+
border-radius: 4px;
|
|
266
|
+
padding: 18px 18px 18px 14px;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
.question-history-inactive-bug {
|
|
270
|
+
border-radius: 4px;
|
|
271
|
+
padding : 18px;
|
|
272
|
+
background-color: rgba(#ff0000, 0.04);
|
|
197
273
|
}
|
|
198
274
|
|
|
199
275
|
.question-history-inactive {
|
|
200
|
-
|
|
276
|
+
border-radius: 4px;
|
|
277
|
+
padding : 18px;
|
|
201
278
|
}
|
|
202
279
|
|
|
203
280
|
.ant-list-item-meta /deep/ {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div class="search-bar">
|
|
3
|
-
<a-select default-value="all" class="select" @change="handleChange">
|
|
3
|
+
<a-select default-value="all" class="select" @change="handleChange" :dropdownMatchSelectWidth="false">
|
|
4
4
|
<a-select-option v-for="d in selectOption" :key="d.value">
|
|
5
5
|
{{ d.text }}
|
|
6
6
|
</a-select-option>
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
|
|
41
41
|
<script>
|
|
42
42
|
import FavoriteList from './FavoriteList.vue'
|
|
43
|
-
import { post } from '@vue2-client/services/api'
|
|
43
|
+
import { get, post } from '@vue2-client/services/api'
|
|
44
44
|
import { debounce } from 'ant-design-vue/lib/vc-table/src/utils'
|
|
45
45
|
|
|
46
46
|
export default {
|
|
@@ -59,29 +59,28 @@ export default {
|
|
|
59
59
|
favoriteListVisible: false,
|
|
60
60
|
loading: false,
|
|
61
61
|
dataSourceResults: [],
|
|
62
|
-
selectOption: [
|
|
63
|
-
|
|
64
|
-
{ value: '合同', text: '合同类' },
|
|
65
|
-
{ value: '项目', text: '项目类' },
|
|
66
|
-
{ value: '人员', text: '人员类' },
|
|
67
|
-
]
|
|
62
|
+
selectOption: [],
|
|
63
|
+
queryType: 'all',
|
|
68
64
|
}
|
|
69
65
|
},
|
|
70
66
|
computed: {
|
|
71
67
|
},
|
|
68
|
+
created () {
|
|
69
|
+
this.selectOption = [
|
|
70
|
+
{ value: 'all', text: '全部' }
|
|
71
|
+
]
|
|
72
|
+
get('/ai/question_types', {}).then(res => {
|
|
73
|
+
for (const item of res) {
|
|
74
|
+
this.selectOption.push({ value: item, text: item })
|
|
75
|
+
}
|
|
76
|
+
})
|
|
77
|
+
},
|
|
72
78
|
mounted () {
|
|
73
79
|
this.init()
|
|
74
80
|
},
|
|
75
81
|
methods: {
|
|
76
82
|
handleChange (value) {
|
|
77
|
-
|
|
78
|
-
this.searchInput = ''
|
|
79
|
-
} else {
|
|
80
|
-
this.searchInput = value
|
|
81
|
-
}
|
|
82
|
-
this.dataSourceResults = []
|
|
83
|
-
this.fetchFunction(this.searchInput)
|
|
84
|
-
this.$refs.autoComplete.focus()
|
|
83
|
+
this.queryType = value
|
|
85
84
|
},
|
|
86
85
|
fetchFunction (value) {
|
|
87
86
|
this.dataSourceResults = []
|
|
@@ -101,7 +100,6 @@ export default {
|
|
|
101
100
|
this.dataSourceResults = res.map(item => JSON.parse(item.f_json).question)
|
|
102
101
|
.filter((item, index, arr) => arr.indexOf(item) === index)
|
|
103
102
|
.map(item => ({ category: item }))
|
|
104
|
-
console.warn(this.dataSourceResults)
|
|
105
103
|
}
|
|
106
104
|
}).finally(() => {
|
|
107
105
|
this.searching = false
|
|
@@ -112,7 +110,7 @@ export default {
|
|
|
112
110
|
onSearch (value) {
|
|
113
111
|
this.loading = true
|
|
114
112
|
// 触发父组件的搜索事件,传递搜索输入的值
|
|
115
|
-
this.$emit('search', value, () => {
|
|
113
|
+
this.$emit('search', value, this.queryType, () => {
|
|
116
114
|
this.loading = false
|
|
117
115
|
})
|
|
118
116
|
},
|
|
@@ -180,13 +178,13 @@ export default {
|
|
|
180
178
|
font-size: 16px;
|
|
181
179
|
}
|
|
182
180
|
.select {
|
|
183
|
-
width:
|
|
181
|
+
width: 160px;
|
|
184
182
|
height: 48px;
|
|
185
183
|
padding-right: 6px;
|
|
186
184
|
font-size: 16px;
|
|
187
185
|
text-align: center;
|
|
188
186
|
:deep(.ant-select-selection-selected-value) {
|
|
189
|
-
width:
|
|
187
|
+
width: 120px;
|
|
190
188
|
height: 48px;
|
|
191
189
|
line-height: 48px;
|
|
192
190
|
}
|
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
<a-spin :spinning="loading" tip="正在努力加载..." wrapperClassName="spingclass">
|
|
30
30
|
<!-- 数据展示Tabs -->
|
|
31
31
|
<data-tabs
|
|
32
|
+
v-show="!loading"
|
|
32
33
|
ref="tabs"
|
|
33
34
|
@tab-change="handleTabChange"
|
|
34
35
|
@remove-cache="remove"
|
|
@@ -47,6 +48,7 @@ import DataTabs from './DataTabs.vue'
|
|
|
47
48
|
import { formatDate } from '@vue2-client/utils/util'
|
|
48
49
|
import QuestionHistoryAndFavorites from './QuestionHistoryAndFavorites.vue'
|
|
49
50
|
import { post } from '@vue2-client/services/api'
|
|
51
|
+
import { indexedDB } from '@/utils/indexedDB'
|
|
50
52
|
|
|
51
53
|
export default {
|
|
52
54
|
name: 'DynamicStatistics',
|
|
@@ -65,13 +67,36 @@ export default {
|
|
|
65
67
|
},
|
|
66
68
|
methods: {
|
|
67
69
|
// 处理搜索逻辑,这里简化为直接赋值,实际应调用API
|
|
68
|
-
async handleSearch (value, callback, uuid) {
|
|
69
|
-
this.loading = true
|
|
70
|
+
async handleSearch (value, queryType, callback, uuid) {
|
|
70
71
|
if (!value) {
|
|
71
72
|
this.$message.warn('请先输入查询的数据')
|
|
72
73
|
callback()
|
|
73
74
|
return
|
|
74
75
|
}
|
|
76
|
+
const that = this
|
|
77
|
+
indexedDB.getAll((data) => {
|
|
78
|
+
let evaluation = true
|
|
79
|
+
for (const datum of data) {
|
|
80
|
+
if (datum.key.includes('question')) {
|
|
81
|
+
const item = datum.data
|
|
82
|
+
console.warn(item)
|
|
83
|
+
if (item.evaluation === undefined && item.sql) {
|
|
84
|
+
evaluation = false
|
|
85
|
+
break
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (evaluation) {
|
|
90
|
+
that.handleSearchMain(value, queryType, callback, uuid)
|
|
91
|
+
} else {
|
|
92
|
+
that.$message.warn('请先对已发起的对话进行评价!')
|
|
93
|
+
callback()
|
|
94
|
+
return false
|
|
95
|
+
}
|
|
96
|
+
})
|
|
97
|
+
},
|
|
98
|
+
handleSearchMain (value, queryType, callback, uuid) {
|
|
99
|
+
this.loading = true
|
|
75
100
|
if (!uuid) {
|
|
76
101
|
uuid = this.uuid()
|
|
77
102
|
}
|
|
@@ -79,74 +104,51 @@ export default {
|
|
|
79
104
|
this.$refs.qhaf.add({
|
|
80
105
|
uuid: uuid,
|
|
81
106
|
question: value,
|
|
107
|
+
queryType: queryType,
|
|
82
108
|
isFavorite: false,
|
|
83
109
|
date: formatDate('now')
|
|
84
110
|
})
|
|
85
|
-
|
|
111
|
+
let url = '/ai/question/'
|
|
112
|
+
if (queryType !== 'all') {
|
|
113
|
+
url = url + queryType + '/'
|
|
114
|
+
}
|
|
115
|
+
post(url, {
|
|
86
116
|
messages: [{
|
|
87
117
|
content: value,
|
|
88
118
|
role: 'user'
|
|
89
119
|
}]
|
|
90
120
|
}).then(res => {
|
|
91
121
|
this.loading = false
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
// name: '张三3',
|
|
107
|
-
// year: '2015',
|
|
108
|
-
// money: Math.floor(Math.random() * 100) + 1,
|
|
109
|
-
// age: Math.floor(Math.random() * 100) + 1
|
|
110
|
-
// },
|
|
111
|
-
// {
|
|
112
|
-
// name: '张三3',
|
|
113
|
-
// year: '2016',
|
|
114
|
-
// money: Math.floor(Math.random() * 100) + 1,
|
|
115
|
-
// age: Math.floor(Math.random() * 100) + 1
|
|
116
|
-
// },
|
|
117
|
-
// {
|
|
118
|
-
// name: '张三3',
|
|
119
|
-
// year: '2017',
|
|
120
|
-
// money: Math.floor(Math.random() * 100) + 1,
|
|
121
|
-
// age: Math.floor(Math.random() * 100) + 1
|
|
122
|
-
// }
|
|
123
|
-
// ]
|
|
122
|
+
const sql = res.sql ? res.sql.replace(/'/g, "''") : null
|
|
123
|
+
const questionInfo = {
|
|
124
|
+
uuid: uuid,
|
|
125
|
+
question: value,
|
|
126
|
+
queryType: queryType,
|
|
127
|
+
filterTable: res.filter_table,
|
|
128
|
+
prompt: res.prompt,
|
|
129
|
+
relationTable: res.relation_table,
|
|
130
|
+
similarTable: res.similar_table,
|
|
131
|
+
sql: sql,
|
|
132
|
+
date: formatDate('now'),
|
|
133
|
+
data: res.result,
|
|
134
|
+
isFavorite: false
|
|
135
|
+
}
|
|
124
136
|
// 保存到数据库中
|
|
125
137
|
post('/api/af-system/logic/openapi/addCommonData', {
|
|
126
138
|
type: 'ai-question',
|
|
127
|
-
content:
|
|
128
|
-
uuid: uuid,
|
|
129
|
-
question: value,
|
|
130
|
-
date: formatDate('now')
|
|
131
|
-
}
|
|
139
|
+
content: questionInfo
|
|
132
140
|
})
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
this.$message.warning(res)
|
|
137
|
-
}
|
|
141
|
+
this.addTab(questionInfo, false)
|
|
142
|
+
}).catch(e => {
|
|
143
|
+
this.$message.warning(e)
|
|
138
144
|
}).finally(() => {
|
|
139
145
|
callback()
|
|
146
|
+
this.loading = false
|
|
140
147
|
})
|
|
141
148
|
},
|
|
142
|
-
addTab (
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
question: question,
|
|
146
|
-
data: searchResults,
|
|
147
|
-
isFavorite: isFavorite,
|
|
148
|
-
date: formatDate('now')
|
|
149
|
-
}
|
|
149
|
+
addTab (questionInfo) {
|
|
150
|
+
const { uuid } = questionInfo
|
|
151
|
+
this.cacheSearchArray[uuid] = questionInfo
|
|
150
152
|
this.currentuuid = uuid
|
|
151
153
|
this.$refs.tabs.show(this.cacheSearchArray[uuid])
|
|
152
154
|
this.$refs.qhaf.add(this.cacheSearchArray[uuid])
|
|
@@ -163,7 +165,7 @@ export default {
|
|
|
163
165
|
},
|
|
164
166
|
// 处理从对话历史/收藏夹打开收藏项
|
|
165
167
|
handleOpenFavorite (item) {
|
|
166
|
-
this.addTab(item
|
|
168
|
+
this.addTab(item)
|
|
167
169
|
},
|
|
168
170
|
uuid () {
|
|
169
171
|
const tempUrl = URL.createObjectURL(new Blob())
|
|
@@ -253,6 +255,8 @@ export default {
|
|
|
253
255
|
|
|
254
256
|
.spingclass {
|
|
255
257
|
height: 100%;
|
|
258
|
+
background-color: #fff;
|
|
259
|
+
transition: none;
|
|
256
260
|
}
|
|
257
261
|
|
|
258
262
|
:deep(.ant-spin-container) {
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
<a-col :span="17"><span>{{ details.resultrecord }}</span></a-col>
|
|
65
65
|
</a-row>
|
|
66
66
|
</a-tab-pane>
|
|
67
|
-
<a-tab-pane key="2" tab="工单确认"
|
|
67
|
+
<a-tab-pane key="2" tab="工单确认" v-show="this.details.status === 4">
|
|
68
68
|
<a-row class="item">
|
|
69
69
|
<a-form :label-col="{ span: 5 }" :wrapper-col="{ span: 12 }">
|
|
70
70
|
<!-- 是否完成 -->
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { post } from '@vue2-client/services/api/restTools'
|
|
2
|
-
|
|
3
|
-
const entityApi = {
|
|
4
|
-
// 根据ID查询数据
|
|
5
|
-
getById: (entityName, id, data = {}, serviceName = process.env.VUE_APP_SYSTEM_NAME) => {
|
|
6
|
-
return post(`/api/${serviceName}/entity/query/${entityName}/${id}`, data)
|
|
7
|
-
},
|
|
8
|
-
// 根据ID集合查询所有数据
|
|
9
|
-
findAllByIds: (entityName, data, serviceName = process.env.VUE_APP_SYSTEM_NAME) => {
|
|
10
|
-
return post(`/api/${serviceName}/entity/query/${entityName}`, data)
|
|
11
|
-
},
|
|
12
|
-
// 查询实体的总数量
|
|
13
|
-
getCount: (entityName, serviceName = process.env.VUE_APP_SYSTEM_NAME) => {
|
|
14
|
-
return post(`/api/${serviceName}/entity/queryCount/${entityName}`, {})
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export { entityApi }
|
|
1
|
+
import { post } from '@vue2-client/services/api/restTools'
|
|
2
|
+
|
|
3
|
+
const entityApi = {
|
|
4
|
+
// 根据ID查询数据
|
|
5
|
+
getById: (entityName, id, data = {}, serviceName = process.env.VUE_APP_SYSTEM_NAME) => {
|
|
6
|
+
return post(`/api/${serviceName}/entity/query/${entityName}/${id}`, data)
|
|
7
|
+
},
|
|
8
|
+
// 根据ID集合查询所有数据
|
|
9
|
+
findAllByIds: (entityName, data, serviceName = process.env.VUE_APP_SYSTEM_NAME) => {
|
|
10
|
+
return post(`/api/${serviceName}/entity/query/${entityName}`, data)
|
|
11
|
+
},
|
|
12
|
+
// 查询实体的总数量
|
|
13
|
+
getCount: (entityName, serviceName = process.env.VUE_APP_SYSTEM_NAME) => {
|
|
14
|
+
return post(`/api/${serviceName}/entity/queryCount/${entityName}`, {})
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export { entityApi }
|
package/src/utils/waterMark.js
CHANGED
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @description: createWaterMark.js 加水印功能
|
|
3
|
-
*/
|
|
4
|
-
let waterMarkDOM
|
|
5
|
-
|
|
6
|
-
const clearWaterMark = () => {
|
|
7
|
-
if (waterMarkDOM) waterMarkDOM.remove()
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* @description: 创建水印
|
|
11
|
-
* @param waterMarkName 水印内容
|
|
12
|
-
*/
|
|
13
|
-
export default function createWaterMark (waterMarkName) {
|
|
14
|
-
clearWaterMark()
|
|
15
|
-
if (!waterMarkName) {
|
|
16
|
-
return
|
|
17
|
-
}
|
|
18
|
-
const width = window.parseInt(document.body.clientWidth)
|
|
19
|
-
const canvasWidth = width / window.parseInt(width / 320)
|
|
20
|
-
const fontFamily = window.getComputedStyle(document.body)['font-family']
|
|
21
|
-
const fragment = document.createDocumentFragment()
|
|
22
|
-
waterMarkDOM = document.createElement('div')
|
|
23
|
-
waterMarkDOM.className = 'water-mark-wrap'
|
|
24
|
-
let spanStr = ''
|
|
25
|
-
for (let i = 0; i < 100; i++) {
|
|
26
|
-
spanStr += `<span class="water-word" style=width:${canvasWidth}px;height:200px;font: ${fontFamily}>${waterMarkName}</span>`
|
|
27
|
-
}
|
|
28
|
-
waterMarkDOM.innerHTML = spanStr
|
|
29
|
-
fragment.appendChild(waterMarkDOM)
|
|
30
|
-
document.body.appendChild(fragment)
|
|
31
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* @description: createWaterMark.js 加水印功能
|
|
3
|
+
*/
|
|
4
|
+
let waterMarkDOM
|
|
5
|
+
|
|
6
|
+
const clearWaterMark = () => {
|
|
7
|
+
if (waterMarkDOM) waterMarkDOM.remove()
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* @description: 创建水印
|
|
11
|
+
* @param waterMarkName 水印内容
|
|
12
|
+
*/
|
|
13
|
+
export default function createWaterMark (waterMarkName) {
|
|
14
|
+
clearWaterMark()
|
|
15
|
+
if (!waterMarkName) {
|
|
16
|
+
return
|
|
17
|
+
}
|
|
18
|
+
const width = window.parseInt(document.body.clientWidth)
|
|
19
|
+
const canvasWidth = width / window.parseInt(width / 320)
|
|
20
|
+
const fontFamily = window.getComputedStyle(document.body)['font-family']
|
|
21
|
+
const fragment = document.createDocumentFragment()
|
|
22
|
+
waterMarkDOM = document.createElement('div')
|
|
23
|
+
waterMarkDOM.className = 'water-mark-wrap'
|
|
24
|
+
let spanStr = ''
|
|
25
|
+
for (let i = 0; i < 100; i++) {
|
|
26
|
+
spanStr += `<span class="water-word" style=width:${canvasWidth}px;height:200px;font: ${fontFamily}>${waterMarkName}</span>`
|
|
27
|
+
}
|
|
28
|
+
waterMarkDOM.innerHTML = spanStr
|
|
29
|
+
fragment.appendChild(waterMarkDOM)
|
|
30
|
+
document.body.appendChild(fragment)
|
|
31
|
+
}
|