Quellcode durchsuchen

完善对话日志

yawuga vor 1 Woche
Ursprung
Commit
462e9536a9
2 geänderte Dateien mit 143 neuen und 217 gelöschten Zeilen
  1. 0 26
      src/api/base/dialogueLog.js
  2. 143 191
      src/views/base/dialogueLog/index.vue

+ 0 - 26
src/api/base/dialogueLog.js

@@ -16,29 +16,3 @@ export function getDialogueLog(id) {
     method: 'get'
   })
 }
-
-// 新增对话日志
-export function addDialogueLog(data) {
-  return request({
-    url: '/base/dialogueLog',
-    method: 'post',
-    data: data
-  })
-}
-
-// 修改对话日志
-export function updateDialogueLog(data) {
-  return request({
-    url: '/base/dialogueLog',
-    method: 'put',
-    data: data
-  })
-}
-
-// 删除对话日志
-export function delDialogueLog(id) {
-  return request({
-    url: '/base/dialogueLog/' + id,
-    method: 'delete'
-  })
-}

+ 143 - 191
src/views/base/dialogueLog/index.vue

@@ -1,34 +1,28 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
-      <el-form-item label="机器人编号,用于后续上传上位平台或多机器人汇聚识别" prop="robotCode">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="80px">
+      <el-form-item label="会话ID" prop="sessionId">
         <el-input
-          v-model="queryParams.robotCode"
-          placeholder="请输入机器人编号,用于后续上传上位平台或多机器人汇聚识别"
+          v-model="queryParams.sessionId"
+          placeholder="请输入会话ID"
           clearable
+          class="search-input"
           @keyup.enter="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="会话ID" prop="sessionId">
+      <el-form-item label="关键字" prop="keyword">
         <el-input
-          v-model="queryParams.sessionId"
-          placeholder="请输入会话ID"
+          v-model="queryParams.keyword"
+          placeholder="请输入用户问题关键字"
           clearable
+          class="search-input"
           @keyup.enter="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="提问时间" prop="askTime">
-        <el-date-picker clearable
-          v-model="queryParams.askTime"
-          type="date"
-          value-format="YYYY-MM-DD"
-          placeholder="请选择提问时间">
-        </el-date-picker>
-      </el-form-item>
       <el-form-item label="命中方式" prop="hitType">
-        <el-select v-model="queryParams.hitType" placeholder="请选择命中方式" clearable>
+        <el-select v-model="queryParams.hitType" placeholder="请选择命中方式" clearable class="search-select">
           <el-option
-            v-for="dict in hit_type"
+            v-for="dict in dialogue_hit_type"
             :key="dict.value"
             :label="dict.label"
             :value="dict.value"
@@ -36,9 +30,9 @@
         </el-select>
       </el-form-item>
       <el-form-item label="来源场景" prop="sceneType">
-        <el-select v-model="queryParams.sceneType" placeholder="请选择来源场景" clearable>
+        <el-select v-model="queryParams.sceneType" placeholder="请选择来源场景" clearable class="search-select">
           <el-option
-            v-for="dict in scene_type"
+            v-for="dict in dialogue_scene_type"
             :key="dict.value"
             :label="dict.label"
             :value="dict.value"
@@ -46,15 +40,26 @@
         </el-select>
       </el-form-item>
       <el-form-item label="结果状态" prop="resultStatus">
-        <el-select v-model="queryParams.resultStatus" placeholder="请选择结果状态" clearable>
+        <el-select v-model="queryParams.resultStatus" placeholder="请选择结果状态" clearable class="search-select">
           <el-option
-            v-for="dict in result_status"
+            v-for="dict in common_result_status"
             :key="dict.value"
             :label="dict.label"
             :value="dict.value"
           />
         </el-select>
       </el-form-item>
+      <el-form-item label="提问时间">
+        <el-date-picker
+          v-model="daterangeAskTime"
+          value-format="YYYY-MM-DD"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          class="search-date"
+        />
+      </el-form-item>
       <el-form-item>
         <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
         <el-button icon="Refresh" @click="resetQuery">重置</el-button>
@@ -62,35 +67,6 @@
     </el-form>
 
     <el-row :gutter="10" class="mb8">
-      <el-col :span="1.5">
-        <el-button
-          type="primary"
-          plain
-          icon="Plus"
-          @click="handleAdd"
-          v-hasPermi="['base:dialogueLog:add']"
-        >新增</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="success"
-          plain
-          icon="Edit"
-          :disabled="single"
-          @click="handleUpdate"
-          v-hasPermi="['base:dialogueLog:edit']"
-        >修改</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="danger"
-          plain
-          icon="Delete"
-          :disabled="multiple"
-          @click="handleDelete"
-          v-hasPermi="['base:dialogueLog:remove']"
-        >删除</el-button>
-      </el-col>
       <el-col :span="1.5">
         <el-button
           type="warning"
@@ -103,42 +79,41 @@
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="dialogueLogList" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="主键ID" align="center" prop="id" />
-      <el-table-column label="机器人编号,用于后续上传上位平台或多机器人汇聚识别" align="center" prop="robotCode" />
-      <el-table-column label="会话ID" align="center" prop="sessionId" />
-      <el-table-column label="提问时间" align="center" prop="askTime" width="180">
+    <el-table v-loading="loading" :data="dialogueLogList">
+      <el-table-column label="提问时间" align="center" prop="askTime" width="170">
         <template #default="scope">
-          <span>{{ parseTime(scope.row.askTime, '{y}-{m}-{d}') }}</span>
+          <span>{{ parseTime(scope.row.askTime) }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="用户问题" align="center" prop="question" />
-      <el-table-column label="回答摘要" align="center" prop="answerSummary" />
-      <el-table-column label="命中方式" align="center" prop="hitType">
+      <el-table-column label="会话ID" align="center" prop="sessionId" width="150" show-overflow-tooltip />
+      <el-table-column label="用户问题" align="left" prop="question" min-width="220" show-overflow-tooltip />
+      <el-table-column label="回答摘要" align="left" prop="answerSummary" min-width="260" show-overflow-tooltip>
         <template #default="scope">
-          <dict-tag :options="hit_type" :value="scope.row.hitType"/>
+          <span>{{ scope.row.answerSummary || formatSummary(scope.row.answer) }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="来源场景" align="center" prop="sceneType">
+      <el-table-column label="命中方式" align="center" prop="hitType" width="110">
         <template #default="scope">
-          <dict-tag :options="scene_type" :value="scope.row.sceneType"/>
+          <dict-tag :options="dialogue_hit_type" :value="scope.row.hitType"/>
         </template>
       </el-table-column>
-      <el-table-column label="结果状态" align="center" prop="resultStatus">
+      <el-table-column label="来源场景" align="center" prop="sceneType" width="110">
         <template #default="scope">
-          <dict-tag :options="result_status" :value="scope.row.resultStatus"/>
+          <dict-tag :options="dialogue_scene_type" :value="scope.row.sceneType"/>
         </template>
       </el-table-column>
-      <el-table-column label="失败原因或错误信息" align="center" prop="errorMsg" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+      <el-table-column label="结果状态" align="center" prop="resultStatus" width="110">
         <template #default="scope">
-          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['base:dialogueLog:edit']">修改</el-button>
-          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['base:dialogueLog:remove']">删除</el-button>
+          <dict-tag :options="common_result_status" :value="scope.row.resultStatus"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" fixed="right" width="100">
+        <template #default="scope">
+          <el-button link type="primary" icon="View" @click="handleDetail(scope.row)">详情</el-button>
         </template>
       </el-table-column>
     </el-table>
-    
+
     <pagination
       v-show="total>0"
       :total="total"
@@ -147,16 +122,39 @@
       @pagination="getList"
     />
 
-    <!-- 添加或修改对话日志对话框 -->
-    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
-      <el-form ref="dialogueLogRef" :model="form" :rules="rules" label-width="100px">
-        <el-row>
-        </el-row>
-      </el-form>
+    <el-dialog title="对话日志详情" v-model="detailOpen" width="820px" append-to-body>
+      <el-descriptions :column="2" border>
+        <el-descriptions-item label="机器人编号">{{ detail.robotCode || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="会话ID">{{ detail.sessionId || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="提问时间">{{ parseTime(detail.askTime) || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="命中方式">
+          <dict-tag :options="dialogue_hit_type" :value="detail.hitType"/>
+        </el-descriptions-item>
+        <el-descriptions-item label="来源场景">
+          <dict-tag :options="dialogue_scene_type" :value="detail.sceneType"/>
+        </el-descriptions-item>
+        <el-descriptions-item label="结果状态">
+          <dict-tag :options="common_result_status" :value="detail.resultStatus"/>
+        </el-descriptions-item>
+        <el-descriptions-item label="用户问题" :span="2">{{ detail.question || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="回答摘要" :span="2">{{ detail.answerSummary || '-' }}</el-descriptions-item>
+        <el-descriptions-item label="错误信息" :span="2">{{ detail.errorMsg || '-' }}</el-descriptions-item>
+      </el-descriptions>
+      <div class="detail-block">
+        <div class="detail-block-title">机器人回答</div>
+        <pre class="detail-content">{{ detail.answer || '-' }}</pre>
+      </div>
+      <div class="detail-block">
+        <div class="detail-block-title">原始请求</div>
+        <pre class="detail-content">{{ detail.rawRequest || '-' }}</pre>
+      </div>
+      <div class="detail-block">
+        <div class="detail-block-title">原始响应</div>
+        <pre class="detail-content">{{ detail.rawResponse || '-' }}</pre>
+      </div>
       <template #footer>
         <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
+          <el-button @click="detailOpen = false">关 闭</el-button>
         </div>
       </template>
     </el-dialog>
@@ -164,82 +162,43 @@
 </template>
 
 <script setup name="DialogueLog">
-import { listDialogueLog, getDialogueLog, delDialogueLog, addDialogueLog, updateDialogueLog } from "@/api/base/dialogueLog"
+import { listDialogueLog, getDialogueLog } from "@/api/base/dialogueLog"
 
 const { proxy } = getCurrentInstance()
-const { scene_type, result_status, hit_type } = useDict('scene_type', 'result_status', 'hit_type')
+const { dialogue_scene_type, common_result_status, dialogue_hit_type } = useDict('dialogue_scene_type', 'common_result_status', 'dialogue_hit_type')
 
 const dialogueLogList = ref([])
-const open = ref(false)
 const loading = ref(true)
 const showSearch = ref(true)
-const ids = ref([])
-const single = ref(true)
-const multiple = ref(true)
 const total = ref(0)
-const title = ref("")
 
-const data = reactive({
-  form: {},
-  queryParams: {
-    pageNum: 1,
-    pageSize: 10,
-    robotCode: undefined,
-    sessionId: undefined,
-    askTime: undefined,
-    question: undefined,
-    answer: undefined,
-    answerSummary: undefined,
-    hitType: undefined,
-    sceneType: undefined,
-    resultStatus: undefined,
-    errorMsg: undefined,
-    rawRequest: undefined,
-    rawResponse: undefined,
-  },
-  rules: {
-  }
+const daterangeAskTime = ref([])
+
+const queryParams = ref({
+  pageNum: 1,
+  pageSize: 10,
+  sessionId: undefined,
+  keyword: undefined,
+  hitType: undefined,
+  sceneType: undefined,
+  resultStatus: undefined
 })
 
-const { queryParams, form, rules } = toRefs(data)
+const detailOpen = ref(false)
+const detail = ref({})
 
 /** 查询对话日志列表 */
 function getList() {
   loading.value = true
-  listDialogueLog(queryParams.value).then(response => {
-    dialogueLogList.value = response.rows
-    total.value = response.total
+  const params = proxy.addDateRange(queryParams.value, daterangeAskTime.value, 'AskTime')
+  listDialogueLog(params).then(response => {
+    dialogueLogList.value = response.rows || []
+    total.value = response.total || 0
+  }).finally(() => {
     loading.value = false
   })
 }
 
-/** 取消按钮 */
-function cancel() {
-  open.value = false
-  reset()
-}
-
-/** 表单重置 */
-function reset() {
-  form.value = {
-    id: null,
-    robotCode: null,
-    sessionId: null,
-    askTime: null,
-    question: null,
-    answer: null,
-    answerSummary: null,
-    hitType: null,
-    sceneType: null,
-    resultStatus: null,
-    errorMsg: null,
-    rawRequest: null,
-    rawResponse: null,
-    createTime: null
-  }
-  proxy.resetForm("dialogueLogRef")
-}
-
 /** 搜索按钮操作 */
 function handleQuery() {
   queryParams.value.pageNum = 1
@@ -248,73 +207,66 @@ function handleQuery() {
 
 /** 重置按钮操作 */
 function resetQuery() {
+  daterangeAskTime.value = []
   proxy.resetForm("queryRef")
   handleQuery()
 }
 
-/** 多选框选中数据 */
-function handleSelectionChange(selection) {
-  ids.value = selection.map(item => item.id)
-  single.value = selection.length != 1
-  multiple.value = !selection.length
-}
-
-/** 新增按钮操作 */
-function handleAdd() {
-  reset()
-  open.value = true
-  title.value = "添加对话日志"
-}
-
-/** 修改按钮操作 */
-function handleUpdate(row) {
-  reset()
-  const _id = row.id || ids.value
-  getDialogueLog(_id).then(response => {
-    form.value = response.data
-    open.value = true
-    title.value = "修改对话日志"
+/** 详情按钮操作 */
+function handleDetail(row) {
+  getDialogueLog(row.id).then(response => {
+    detail.value = response.data || row
+    detailOpen.value = true
   })
 }
 
-/** 提交按钮 */
-function submitForm() {
-  proxy.$refs["dialogueLogRef"].validate(valid => {
-    if (valid) {
-      if (form.value.id != null) {
-        updateDialogueLog(form.value).then(() => {
-          proxy.$modal.msgSuccess("修改成功")
-          open.value = false
-          getList()
-        })
-      } else {
-        addDialogueLog(form.value).then(() => {
-          proxy.$modal.msgSuccess("新增成功")
-          open.value = false
-          getList()
-        })
-      }
-    }
-  })
-}
-
-/** 删除按钮操作 */
-function handleDelete(row) {
-  const _ids = row.id || ids.value
-  proxy.$modal.confirm('是否确认删除对话日志编号为"' + _ids + '"的数据项?').then(function() {
-    return delDialogueLog(_ids)
-  }).then(() => {
-    getList()
-    proxy.$modal.msgSuccess("删除成功")
-  }).catch(() => {})
+/** 摘要兜底方法 */
+function formatSummary(content) {
+  if (!content) return '-'
+  return content.length > 80 ? content.substring(0, 80) + '...' : content
 }
 
 /** 导出按钮操作 */
 function handleExport() {
-  proxy.download('base/dialogueLog/export', {
-    ...queryParams.value
-  }, `dialogueLog_${new Date().getTime()}.xlsx`)
+  proxy.$modal.confirm('确认导出当前查询条件下的对话日志数据吗?').then(() => {
+    const params = proxy.addDateRange(queryParams.value, daterangeAskTime.value, 'AskTime')
+    proxy.download('base/dialogueLog/export', {
+      ...params
+    }, `对话日志_${new Date().getTime()}.xlsx`)
+  }).catch(() => {})
 }
 
 getList()
 </script>
+
+<style scoped>
+.search-input,
+.search-select {
+  width: 220px;
+}
+.search-date {
+  width: 260px;
+}
+.detail-block {
+  margin-top: 16px;
+}
+.detail-block-title {
+  margin-bottom: 8px;
+  font-weight: 600;
+  color: #303133;
+}
+.detail-content {
+  min-height: 80px;
+  max-height: 260px;
+  overflow: auto;
+  padding: 12px;
+  margin: 0;
+  line-height: 1.6;
+  color: #303133;
+  background: #f8fafc;
+  border: 1px solid #ebeef5;
+  border-radius: 6px;
+  white-space: pre-wrap;
+  word-break: break-all;
+}
+</style>