|
@@ -47,35 +47,37 @@
|
|
|
</template>
|
|
|
<template v-else>
|
|
|
<div class="py-3">
|
|
|
- {{ item.content.summary }}
|
|
|
+ {{ item.content.response }}
|
|
|
</div>
|
|
|
<m-card v-if="item.showSql" shadow="never" :body-style="{ background: '#f5f5f5', color: '#777' }">
|
|
|
{{ item.content.sql }}
|
|
|
</m-card>
|
|
|
<div class="mt-3">
|
|
|
- <el-popover
|
|
|
- placement="bottom"
|
|
|
- width="200"
|
|
|
- trigger="click"
|
|
|
- >
|
|
|
- <m-form :ref="`form${i}`" label-width="60px" :items="formItems(item.content.columns)" v-model="item.model"></m-form>
|
|
|
- <div style="text-align: right; margin: 0">
|
|
|
- <m-button type="primary" size="mini" @click="onRender($refs[`form${i}`], item)">生成图表</m-button>
|
|
|
+ <template v-if="item.content.columns.length">
|
|
|
+ <el-popover
|
|
|
+ placement="bottom"
|
|
|
+ width="200"
|
|
|
+ trigger="click"
|
|
|
+ >
|
|
|
+ <m-form :ref="`form${i}`" label-width="60px" :items="formItems(item.content.columns)" v-model="item.model"></m-form>
|
|
|
+ <div style="text-align: right; margin: 0">
|
|
|
+ <m-button type="primary" size="mini" @click="onRender($refs[`form${i}`], item)">生成图表</m-button>
|
|
|
+ </div>
|
|
|
+ <m-button type="primary" text slot="reference">我要作图</m-button>
|
|
|
+ </el-popover>
|
|
|
+ <m-table
|
|
|
+ clearHeader
|
|
|
+ size="small"
|
|
|
+ shadow="never"
|
|
|
+ :headers="item.content.columns"
|
|
|
+ :items="item.content.rows"
|
|
|
+ ></m-table>
|
|
|
+ <div v-if="!item.dataValidation" class="mt-3">
|
|
|
+ 您认为结果是否正确
|
|
|
+ <m-button class="ml-3" size="mini" type="success" icon="mdi mdi-thumb-up" circle @click="onAddTrain(item, true)"></m-button>
|
|
|
+ <m-button size="mini" type="info" icon="mdi mdi-thumb-down" circle @click="onAddTrain(item, true)"></m-button>
|
|
|
</div>
|
|
|
- <m-button type="primary" text slot="reference">我要作图</m-button>
|
|
|
- </el-popover>
|
|
|
- <m-table
|
|
|
- clearHeader
|
|
|
- size="small"
|
|
|
- shadow="never"
|
|
|
- :headers="item.content.columns"
|
|
|
- :items="item.content.rows"
|
|
|
- ></m-table>
|
|
|
- <div v-if="!item.dataValidation" class="mt-3">
|
|
|
- 您认为结果是否正确
|
|
|
- <m-button class="ml-3" size="mini" type="success" icon="mdi mdi-thumb-up" circle @click="onAddTrain(item, true)"></m-button>
|
|
|
- <m-button size="mini" type="info" icon="mdi mdi-thumb-down" circle @click="onAddTrain(item, true)"></m-button>
|
|
|
- </div>
|
|
|
+ </template>
|
|
|
</div>
|
|
|
</template>
|
|
|
</div>
|
|
@@ -83,9 +85,24 @@
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="box-input">
|
|
|
+ <div class="pa-3 text-center" v-if="conversationId">
|
|
|
+ <m-button type="orange" size="small" icon="mdi mdi-chat-plus-outline" @click="onNew"> 发起新对话</m-button>
|
|
|
+ </div>
|
|
|
<el-input placeholder="请输入内容" v-model="inputTxt" @keydown.enter.native="onSubmit">
|
|
|
<m-button slot="append" icon="el-icon-s-promotion" @click="onSubmit" :loading="!isAlready"></m-button>
|
|
|
</el-input>
|
|
|
+ <div class="mt-1">
|
|
|
+ <el-tag
|
|
|
+ v-for="chip in chips"
|
|
|
+ :key="chip.value"
|
|
|
+ :type="routingMode === chip.value ? undefined : 'info'"
|
|
|
+ class="mr-2 cursor-pointer"
|
|
|
+ size="small"
|
|
|
+ @click="onClickChoose(chip)"
|
|
|
+ >
|
|
|
+ {{ chip.text }}
|
|
|
+ </el-tag>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</el-tab-pane>
|
|
@@ -99,10 +116,16 @@ import {
|
|
|
submitTrainingCorrect,
|
|
|
submitTrainingError
|
|
|
} from '@/api/dataOps'
|
|
|
+import { mapGetters } from 'vuex'
|
|
|
export default {
|
|
|
name: 'privateChartEditParams',
|
|
|
data () {
|
|
|
return {
|
|
|
+ routingMode: undefined,
|
|
|
+ chips: [
|
|
|
+ { text: '聊天模式', value: 'chat_direct' },
|
|
|
+ { text: '数据库模式', value: 'database_direct' }
|
|
|
+ ],
|
|
|
loading: false,
|
|
|
activeName: 'third',
|
|
|
isAlready: true,
|
|
@@ -110,10 +133,28 @@ export default {
|
|
|
items: [{
|
|
|
type: 2,
|
|
|
content: '我是您的AI取数助手,请问有什么可以帮到您'
|
|
|
- }]
|
|
|
+ }],
|
|
|
+ abortController: null,
|
|
|
+ conversationId: undefined
|
|
|
}
|
|
|
},
|
|
|
+ computed: {
|
|
|
+ ...mapGetters(['userInfo'])
|
|
|
+ },
|
|
|
methods: {
|
|
|
+ onNew () {
|
|
|
+ this.abortController.abort('')
|
|
|
+ this.abortController = null
|
|
|
+ this.items.splice(1, this.items.length - 1)
|
|
|
+ this.conversationId = undefined
|
|
|
+ },
|
|
|
+ onClickChoose (item) {
|
|
|
+ if (this.routingMode === item.value) {
|
|
|
+ this.routingMode = undefined
|
|
|
+ return
|
|
|
+ }
|
|
|
+ this.routingMode = item.value
|
|
|
+ },
|
|
|
formItems (items) {
|
|
|
return [
|
|
|
{
|
|
@@ -161,21 +202,37 @@ export default {
|
|
|
}
|
|
|
}
|
|
|
this.items.push(ask)
|
|
|
+ this.$nextTick(() => {
|
|
|
+ const container = this.$refs.container
|
|
|
+ // 滚动到底部 - IE11 兼容写法
|
|
|
+ container.scrollTop = container.scrollHeight
|
|
|
+ })
|
|
|
try {
|
|
|
+ this.abortController = new AbortController()
|
|
|
const { data } = await getAsk({
|
|
|
- question: content
|
|
|
+ question: content,
|
|
|
+ user_id: this.userInfo.employeeCode,
|
|
|
+ routing_mode: this.routingMode,
|
|
|
+ conversation_id: this.conversationId
|
|
|
+ }, {
|
|
|
+ signal: this.abortController.signal
|
|
|
})
|
|
|
- const { columns, ...obj } = data
|
|
|
+ const { records, ...obj } = data
|
|
|
+
|
|
|
+ const { rows, columns } = records ?? {}
|
|
|
ask.content = {
|
|
|
...obj,
|
|
|
- columns: columns.map(e => ({ label: e, prop: e, value: e }))
|
|
|
+ rows,
|
|
|
+ columns: columns ? columns.map(e => ({ label: e, prop: e, value: e })) : {}
|
|
|
}
|
|
|
+ this.conversationId = data.conversation_id
|
|
|
this.$nextTick(() => {
|
|
|
const container = this.$refs.container
|
|
|
// 滚动到底部 - IE11 兼容写法
|
|
|
container.scrollTop = container.scrollHeight
|
|
|
})
|
|
|
} catch (error) {
|
|
|
+ console.log(error)
|
|
|
ask.content = error
|
|
|
} finally {
|
|
|
this.isAlready = true
|
|
@@ -229,7 +286,7 @@ export default {
|
|
|
}
|
|
|
.box {
|
|
|
overflow: hidden;
|
|
|
- $height: 60px;
|
|
|
+ $height: 150px;
|
|
|
&-msg {
|
|
|
height: calc(100% - #{$height});
|
|
|
overflow-y: auto;
|
|
@@ -275,8 +332,8 @@ export default {
|
|
|
&-input {
|
|
|
height: $height;
|
|
|
display: flex;
|
|
|
- align-items: center;
|
|
|
justify-content: center;
|
|
|
+ flex-direction: column;
|
|
|
}
|
|
|
}
|
|
|
::v-deep .el-tabs__content {
|