From c4a9390f0b28470dcdaf0874c64ed9b0792536b2 Mon Sep 17 00:00:00 2001
From: xiangcongshuai <xiangcongshuai@supervision.ltd>
Date: Thu, 24 Oct 2024 15:47:56 +0800
Subject: [PATCH] =?UTF-8?q?feat:ocr2.0=E5=BC=80=E5=8F=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/api/caseDetails/evidence.js               |   8 +
 src/api/promptManagement/index.js             |  17 ++
 src/config/net.config.js                      |   2 +-
 src/icons/svg/pdf.svg                         |   5 +
 src/router/index.js                           |   9 +-
 .../components/AddEvidence/AddFolder.vue      |  11 +-
 .../components/EvidenceConfirm.vue            | 119 ++++++--
 .../components/EvidenceExtract.vue            |  32 ++-
 .../AddEvidence/components/UploadEvidence.vue |  51 +++-
 .../caseDetails/components/CaseEvidence.vue   |  69 ++++-
 .../components/EditEvidence/index.vue         | 130 ++++++---
 .../PromptConfig/add/PromptDebug.vue          |  78 ++++-
 .../PromptConfig/add/PromptInput.vue          |  57 ++--
 .../promptManagement/PromptConfig/add/add.vue |  26 ++
 .../PromptConfig/add/edit.vue                 |  26 ++
 .../PromptConfig/add/index.vue                | 269 ++++++++++++------
 .../promptManagement/PromptConfig/index.vue   |  33 ++-
 src/views/promptManagement/index.vue          |   1 -
 18 files changed, 714 insertions(+), 229 deletions(-)
 create mode 100644 src/icons/svg/pdf.svg
 create mode 100644 src/views/promptManagement/PromptConfig/add/add.vue
 create mode 100644 src/views/promptManagement/PromptConfig/add/edit.vue

diff --git a/src/api/caseDetails/evidence.js b/src/api/caseDetails/evidence.js
index 7a7814f..525efd2 100644
--- a/src/api/caseDetails/evidence.js
+++ b/src/api/caseDetails/evidence.js
@@ -65,4 +65,12 @@ export function caseEvidenceVerify(data) {
     method: 'post',
     data
   })
+}
+/** 重新提取*/
+export function caseEvidenceAnalysis(data) {
+  return request({
+    url: `/caseEvidence/analysis`,
+    method: 'get',
+    params: data
+  })
 }
\ No newline at end of file
diff --git a/src/api/promptManagement/index.js b/src/api/promptManagement/index.js
index 1a0ae07..0e3bd36 100644
--- a/src/api/promptManagement/index.js
+++ b/src/api/promptManagement/index.js
@@ -72,3 +72,20 @@ export function addOrUpdPrompt(data) {
     data
   })
 }
+
+/** 提示词调试 */
+export function promptDebugging(data) {
+  return request({
+    url: `/prompt/promptDebugging`,
+    method: 'post',
+    data
+  })
+}
+/** 详情 */
+export function queryPromptDetails(data) {
+  return request({
+    url: `/prompt/getById`,
+    method: 'post',
+    data
+  })
+}
\ No newline at end of file
diff --git a/src/config/net.config.js b/src/config/net.config.js
index f8258a8..b717749 100644
--- a/src/config/net.config.js
+++ b/src/config/net.config.js
@@ -5,7 +5,7 @@ const network = {
   // 默认的接口地址 如果是开发环境和生产环境走vab-mock-server,当然你也可以选择自己配置成需要的接口地址
   baseURL:
     process.env.NODE_ENV === 'development'
-      ? 'http://192.168.10.25:8097/fu-hsi-server'
+      ? 'http://192.168.10.138:8097/fu-hsi-server'
       : '/fuHsiApi',
   // 配后端数据的接收方式application/json;charset=UTF-8或者application/x-www-form-urlencoded;charset=UTF-8
   contentType: 'application/json;charset=UTF-8',
diff --git a/src/icons/svg/pdf.svg b/src/icons/svg/pdf.svg
new file mode 100644
index 0000000..77933be
--- /dev/null
+++ b/src/icons/svg/pdf.svg
@@ -0,0 +1,5 @@
+<svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M20.7777 6.05V19.5556C20.7777 20.9 19.6777 22 18.3333 22H3.66661C2.32217 22 1.22217 20.9 1.22217 19.5556V2.44444C1.22217 1.1 2.32217 0 3.66661 0H14.7277L20.7777 6.05Z" fill="#D23B41"/>
+<path d="M14.7278 4.82778V0L20.7778 6.05H15.95C15.2778 6.05 14.7278 5.5 14.7278 4.82778Z" fill="#9C171C"/>
+<path d="M14.6153 14.2377C14.3598 14.212 14.105 14.1595 13.8496 14.0287C14.0787 13.9828 14.2816 13.9828 14.5108 13.9828C15.0211 13.9828 15.1194 14.1069 15.1194 14.1857C14.9691 14.2377 14.7919 14.2578 14.6153 14.2377ZM12.0168 13.904C11.4607 14.0287 10.8447 14.212 10.2886 14.4149V14.3623L10.2361 14.3886C10.5172 13.8258 10.7732 13.2428 11.0018 12.6537L11.0219 12.68L11.0476 12.6341C11.3293 13.0662 11.6893 13.4982 12.0688 13.8777H11.9906L12.0168 13.904ZM10.6944 8.96868C10.7207 8.9424 10.7732 8.9424 10.7922 8.9424H10.8716C11.0069 9.37438 10.9975 9.83872 10.8447 10.2648C10.6681 9.85846 10.5899 9.40073 10.6944 8.96868ZM7.5655 16.5489L7.48667 16.5752C7.71456 16.2455 8.03289 15.9887 8.40334 15.8357C8.20045 16.1688 7.91872 16.4242 7.5655 16.5489ZM14.5371 13.2165C13.9999 13.2165 13.4701 13.2953 12.9329 13.3937C12.295 12.8098 11.7616 12.1211 11.3556 11.3575C11.7877 9.93057 11.8139 8.96807 11.4797 8.50973C11.4021 8.40766 11.3023 8.32461 11.1878 8.2669C11.0734 8.20919 10.9472 8.17833 10.8191 8.17668C10.4915 8.1504 10.1835 8.30746 10.0332 8.58246C9.57484 9.34818 10.2361 10.8472 10.5441 11.4626C10.1835 12.5559 9.75206 13.5966 9.18861 14.6178C6.7735 15.6585 6.72095 16.2935 6.72095 16.5226C6.72095 16.8037 6.878 17.0855 7.153 17.2101C7.2575 17.2883 7.40845 17.314 7.53922 17.314C8.17478 17.314 8.91422 16.6008 9.6995 15.2002C10.6944 14.7944 11.6893 14.4668 12.7306 14.2377C13.2636 14.6824 13.9229 14.9481 14.6153 14.9973C15.0473 14.9973 15.8852 14.9973 15.8852 14.1332C15.9114 13.7995 15.7348 13.2428 14.5371 13.2165Z" fill="white"/>
+</svg>
diff --git a/src/router/index.js b/src/router/index.js
index 92f3f20..75e2f3a 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -227,8 +227,15 @@ export const asyncRoutes = [
         path: '/add-prompt',
         name: 'AddPrompt',
         permission: 'p_promptManagement',
-        component: () => import('@/views/promptManagement/PromptConfig/add/index.vue'),
+        component: () => import('@/views/promptManagement/PromptConfig/add/add.vue'),
         meta: { title: '新增提示词', affix: true }
+      },
+      {
+        path: '/edit-prompt/:id',
+        name: 'EditPrompt',
+        permission: 'p_promptManagement',
+        component: () => import('@/views/promptManagement/PromptConfig/add/edit.vue'),
+        meta: { title: '编辑提示词', affix: true }
       }
     ]
   },
diff --git a/src/views/caseDetails/components/AddEvidence/AddFolder.vue b/src/views/caseDetails/components/AddEvidence/AddFolder.vue
index 397e7aa..2e84689 100644
--- a/src/views/caseDetails/components/AddEvidence/AddFolder.vue
+++ b/src/views/caseDetails/components/AddEvidence/AddFolder.vue
@@ -13,7 +13,7 @@
               v-model="addInfo.directoryList"
               style="width: 100%;"
               :options="treeData"
-              :props="{ checkStrictly: true,label:'categoryName',children:'child',value:'id' }"
+              :props="{ label:'categoryName',children:'child',value:'id' }"
               clearable
               @change="selectDirectory"
             />
@@ -39,7 +39,7 @@
             </div>
           </el-form-item>
           <el-form-item label="模版类型" prop="type">
-            <el-input v-model="addInfo['type']" clearable placeholder="请输入" />
+            <el-input v-model="addInfo['type']" readonly placeholder="请输入" />
           </el-form-item>
           <el-form-item label="文件夹名称" prop="directoryName">
             <el-input v-model="addInfo['directoryName']" clearable placeholder="请输入" />
@@ -112,13 +112,18 @@ export default {
       getCaseEvidenceTree({ caseId: this.caseId, caseType: 1 }).then(res => {
         if (res.code === 200) {
           this.treeData = res.data
+          for (let i = this.treeData.length - 1; i >= 0; i--) {
+            if (!this.treeData[i].child) {
+              this.treeData.splice(i, 1)
+            }
+          }
         }
       })
     },
     handleAdd() {
       this.$refs.add.show()
     },
-    selectDirectory(item) {
+    selectDirectory() {
       const nodes = this.$refs.cascaderRef.getCheckedNodes()
       console.log(nodes)
       this.$set(this.addInfo, 'type', nodes[0].data.promptName)
diff --git a/src/views/caseDetails/components/AddEvidence/components/EvidenceConfirm.vue b/src/views/caseDetails/components/AddEvidence/components/EvidenceConfirm.vue
index 20dde08..b411deb 100644
--- a/src/views/caseDetails/components/AddEvidence/components/EvidenceConfirm.vue
+++ b/src/views/caseDetails/components/AddEvidence/components/EvidenceConfirm.vue
@@ -28,12 +28,13 @@
       <div class="mid-content">
         <div class="left">
           <el-scrollbar v-if="selectList.length > 0" class="left-scroll">
-            <vuedraggable v-model="selectList" animation="400" class="img_list">
+            <vuedraggable v-model="selectList" animation="400" class="img_list" @end="handleDragEnd">
               <div v-for="(item,index) in selectList" :key="index" class="img_item" :class="[item.fileId === selectInfo.fileId?'actived':'']">
-                <img v-if="['jpg', 'png'].includes(item.fileType)" :src="getImgUrl(item.fileId)" @click="selectItem(item)">
+                <img v-if="['jpg', 'png'].includes(item.fileType)" :src="getImgUrl(item.fileId)" @click="selectItem(index)">
 
                 </img>
-                <svg-icon v-if="[ 'doc', 'docx'].includes(item.fileType)" class="svg-img" icon-class="docx" />
+                <svg-icon v-if="[ 'doc', 'docx'].includes(item.fileType)" class="svg-img" icon-class="docx" @click="selectItem(index)" />
+                <svg-icon v-if="[ 'pdf'].includes(item.fileType)" class="svg-img" icon-class="pdf" @click="selectItem(index)" />
               </div>
 
             </vuedraggable>
@@ -64,7 +65,7 @@
         </div>
       </div>
       <div class="FormInfo">
-        <el-form ref="form" :model="selectInfo" :rules="rules" label-width="100px" style="margin-top: 10px">
+        <el-form v-if="level === '2'" ref="form" :model="selectInfo.evidenceInfo" :rules="rules" label-width="100px" style="margin-top: 10px">
           <el-row :gutter="10" class="form-content">
             <el-col :span="24">
               <el-form-item label="证据名称" prop="title">
@@ -72,11 +73,58 @@
               </el-form-item>
             </el-col>
           </el-row>
-
-          <el-row v-if="selectInfo.evidenceInfo.property.length > 0" :gutter="10" class="form-content">
+          <el-row :gutter="10" class="form-content">
+            <el-col :span="24">
+              <el-form-item label="提供人" prop="provider">
+                <el-input v-model="selectInfo.evidenceInfo.provider" placeholder="请输入提供人" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row v-if="selectInfo.evidenceInfo.property" :gutter="10" class="form-content">
             <el-col v-for="(item,index) in selectInfo.evidenceInfo.property" :key="index" :span="24">
-              <el-form-item :label="item.attrName">
-                <el-input v-if="item.attrValueType ==='text'" v-model="item.attrValue" placeholder="请输入" />
+              <el-form-item v-if="item.attrValueType" :label="item.attrName">
+                <el-input v-if="item.attrValueType ==='1'" v-model="item.attrValue" placeholder="请输入" />
+                <el-input v-if="item.attrValueType ==='2'" v-model="item.attrValue" type="number" placeholder="请输入" />
+                <el-date-picker
+                  v-if="item.attrValueType ==='3'"
+                  v-model="item.attrValue"
+                  format="yyyy-MM-dd"
+                  value-format="yyyy-MM-dd"
+                  type="date"
+                  placeholder="选择日期"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-form>
+        <el-form v-if="level === '3'" ref="form" :model="evidenceInfo" :rules="rules" label-width="100px" style="margin-top: 10px">
+          <el-row :gutter="10" class="form-content">
+            <el-col :span="24">
+              <el-form-item label="证据名称" prop="title">
+                <el-input v-model="evidenceInfo.title" placeholder="请输入证据名称" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="10" class="form-content">
+            <el-col :span="24">
+              <el-form-item label="提供人" prop="provider">
+                <el-input v-model="evidenceInfo.provider" placeholder="请输入提供人" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row v-if="evidenceInfo.property" :gutter="10" class="form-content">
+            <el-col v-for="(item,index) in evidenceInfo.property" :key="index" :span="24">
+              <el-form-item v-if="item.attrValueType" :label="item.attrName">
+                <el-input v-if="item.attrValueType ==='1'" v-model="item.attrValue" placeholder="请输入" />
+                <el-input v-if="item.attrValueType ==='2'" v-model="item.attrValue" type="number" placeholder="请输入" />
+                <el-date-picker
+                  v-if="item.attrValueType ==='3'"
+                  v-model="item.attrValue"
+                  format="yyyy-MM-dd"
+                  value-format="yyyy-MM-dd"
+                  type="date"
+                  placeholder="选择日期"
+                />
               </el-form-item>
             </el-col>
           </el-row>
@@ -106,6 +154,7 @@ export default {
       caseNo: '',
       caseName: '',
       dataInfo: {},
+      evidenceInfo: undefined,
       navList: [],
       // 证据类型
       evidenceTypeList: JSON.parse(sessionStorage.getItem('evidence_type')),
@@ -118,6 +167,7 @@ export default {
       },
       treeData: [],
       flag: true,
+      level: '',
       selectInfo: {
         evidenceInfo: {
           property: [],
@@ -162,22 +212,19 @@ export default {
     getImgUrl(id) {
       return `${baseURL}${commonDownloadFile}${id}`
     },
-    selectItem(item) {
-      this.selectInfo = item
+    selectItem(index) {
+      this.selectInfo = this.selectList[index]
       this.activedImg = `${baseURL}${commonDownloadFile}${this.selectInfo.fileId}`
     },
     reset() {
-
+      this.getTreeList()
     },
     findNodeById(nodes, id) {
       for (const node of nodes) {
         if (node.id === id) {
-          return node
+          node.fileInfoList = this.selectList
         } else if (node.child) {
-          const foundNode = this.findNodeById(node.child, id)
-          if (foundNode) {
-            return foundNode
-          }
+          this.findNodeById(node.child, id)
         }
       }
       return null
@@ -197,20 +244,21 @@ export default {
       return null
     },
     handleNodeClick(data) {
-      this.selectId = data.id
+      // this.selectId = data.id
       this.navList = []
       this.navList = this.getParentNames(data, this.treeData)
-      const nodeItem = this.findNodeById(this.treeData, this.selectId)
-      if (nodeItem.fileInfoList.length === 0) {
-        const newNodeItem = this.getFileList(nodeItem.child)
-        this.$refs.tree.setCurrentKey(newNodeItem.id)
-        this.selectList = newNodeItem.fileInfoList
-        this.selectInfo = this.selectList[0]
+      const nodeItem = this.getFileList(this.treeData)
+      if (nodeItem.evidenceInfo) {
+        this.level = '3'
+        this.evidenceInfo = nodeItem.evidenceInfo
       } else {
-        this.selectList = nodeItem.fileInfoList
-        this.selectInfo = this.selectList[0]
+        this.level = '2'
       }
+      this.selectList = nodeItem.fileInfoList
+      this.selectInfo = this.selectList[0]
+      this.selectId = nodeItem.id
       this.navList.push(data.directoryName)
+      this.$refs.tree.setCurrentKey(this.selectId)
     },
     checkEvidence(nodes) {
       for (const item of nodes) {
@@ -228,6 +276,9 @@ export default {
         }
       }
     },
+    handleAdd() {
+      this.$refs.add.show()
+    },
     save() {
       this.checkEvidence(this.treeData)
       if (this.flag) {
@@ -249,7 +300,11 @@ export default {
         this.$baseMessage.error('证据不能为空!')
       }
     },
+    handleDragEnd() {
+      this.findNodeById(this.treeData, this.selectId)
+    },
     submit() {
+      console.log('2323', this.selectList)
       this.save()
       this.$emit('submit')
     }
@@ -298,7 +353,7 @@ export default {
                 display: flex;
                 flex: 1;
                 .left {
-                    width: 55%;
+
                     margin-right: 24px;
                     position: relative;
                     // background: #F6F8F9;
@@ -324,12 +379,13 @@ export default {
                 background: #F6F8F9;
                 width: 150px;
                 margin-right: 14px;
+                height: calc(100vh - 408px);
               }
               .act_img {
                 padding: 16px 28px;
                 flex: 1;
                 background: #F6F8F9;
-                height: calc(100vh - 420px);
+                height: calc(100vh - 472px);
                 background-size: 100% 100%;
                 display: flex;
                 align-items: center;
@@ -343,7 +399,7 @@ export default {
               }
             }
             .right {
-              width: 45%;
+              flex: 1;
               position: relative;
               border: 1px solid #DCE3EB;
               display: flex;
@@ -370,6 +426,7 @@ export default {
             background: #F6F8F9;
             border-radius: 8px 8px 8px 8px;
             margin-left: 24px;
+            overflow-y: auto;
             // height: calc(100vh - 350px);
             padding: 0 24px;
             margin-bottom: 72px;
@@ -408,6 +465,10 @@ export default {
                     border-radius: 6px 6px 6px 6px;
                     border: 1px solid #D1D3D6;
                     cursor: move;
+                    img {
+                      width: 98px;
+                     height: 138px;
+                    }
                 }
                 .svg-img {
                   width: 98px;
@@ -519,7 +580,7 @@ export default {
   <style lang="scss" scoped>
 
     ::v-deep .el-textarea__inner {
-    height: calc(100vh - 450px);
+    height: calc(100vh - 472px);
     border: none;
     box-shadow: none;
   }
diff --git a/src/views/caseDetails/components/AddEvidence/components/EvidenceExtract.vue b/src/views/caseDetails/components/AddEvidence/components/EvidenceExtract.vue
index 65b9236..1aa3161 100644
--- a/src/views/caseDetails/components/AddEvidence/components/EvidenceExtract.vue
+++ b/src/views/caseDetails/components/AddEvidence/components/EvidenceExtract.vue
@@ -8,20 +8,20 @@
       <template #status="{row}">
         <div v-if="row.status === '2'" class="status">
           <img src="@/assets/record/success.png" alt="">
-          <span>识别成功</span>
+          <span>处理完毕</span>
         </div>
         <div v-if="row.status === '3'" class="status">
           <img src="@/assets/record/error.png" alt="">
-          <span>识别失败</span>
+          <span>处理失败</span>
+        </div>
+        <div v-if="row.status === '4'">
+          <img src="@/assets/record/success.png" alt="">
+          <span>已核实</span>
         </div>
-        <!-- <div v-if="row.status === '0'">
-          <img src="@/assets/record/error.png" alt="">
-          <span>未识别</span>
-        </div> -->
         <div v-if="row.status === '1' || row.status === '0'" class="status">
           <!-- <img src="@/assets/record/error.png" alt=""> -->
           <div v-loading="true" style="width: 20px;height: 20px;margin-right: 8px;position: relative;top: 12px;" />
-          <span>正在识别</span>
+          <span>处理中</span>
         </div>
       </template>
       <template #opera="{ row, rowIndex}">
@@ -72,10 +72,10 @@ export default {
           { title: '序号', type: 'seq', width: '80px' },
           { title: '证据名称', field: 'evidenceName' },
           { title: '附件名称', field: 'attachmentName' },
-          { title: '模板类型', field: 'templateName',width:'200px'  },
-          { title: '证据类型', field: 'evidenceTypeName',width:'200px'  },
-          { title: '附件大小', field: 'attachmentSize',width:'150px' },
-          { title: '状态', slots: { default: 'status' }, align: 'center' },
+          { title: '模板类型', field: 'templateName', width: '200px' },
+          { title: '证据类型', field: 'evidenceTypeName', width: '200px' },
+          { title: '附件大小', field: 'attachmentSize', width: '150px' },
+          { title: '状态', slots: { default: 'status' }, align: 'center' }
           // { title: '操作', slots: { default: 'opera' }, fixed: 'right', width: '200px' }
         ],
         data: [
@@ -132,6 +132,16 @@ export default {
       this.$router.push({ path: `/case-details/${this.$route.params.id}/${this.$route.query.caseName}`, query: { isEdit: 1, caseNo: this.$route.query.caseNo }})
     },
     next() {
+      let flag = true
+      this.gridOptions.data.forEach(e => {
+        if (e.status !== '2') {
+          flag = false
+        }
+      })
+      if (!flag) {
+        this.$baseMessage.error('有部分文件未识别成功!')
+        return
+      }
       this.$emit('save', this.$route.query.recordId)
     }
   }
diff --git a/src/views/caseDetails/components/AddEvidence/components/UploadEvidence.vue b/src/views/caseDetails/components/AddEvidence/components/UploadEvidence.vue
index 7d072d0..0078098 100644
--- a/src/views/caseDetails/components/AddEvidence/components/UploadEvidence.vue
+++ b/src/views/caseDetails/components/AddEvidence/components/UploadEvidence.vue
@@ -1,5 +1,5 @@
 <template>
-  <div class="UploadEvidence">
+  <div v-loading="loading" class="UploadEvidence">
     <div class="left-tree">
       <el-input
         v-model="filterText"
@@ -48,11 +48,12 @@
         </div>
       </div>
       <div v-if="selectList.length > 0" class="file-content">
-        <vuedraggable v-model="selectList" animation="400" class="file-list">
+        <vuedraggable v-model="selectList" animation="400" class="file-list" @end="handleDragEnd">
           <div v-for="(item,index) in selectList" :key="index" class="file-item" @click="selectItem(index)">
             <div class="main-content">
               <img v-if="item.type === 1" src="@/assets/file/type1.png" alt="">
               <svg-icon v-if="item.type === 3" class="svg-img" icon-class="docx" />
+              <svg-icon v-if="item.type === 4" class="svg-img" icon-class="pdf" />
               <img v-if="item.type === 2" class="file-img" :src="getImgUrl(item.fileId)" alt="">
             </div>
             <div class="footer">{{ item.fileName }}</div>
@@ -92,7 +93,7 @@ export default {
       // 上传配置
       uploadOption: {
         action: `${baseURL}/minio/uploadFile`,
-        accept: '.bmp,.jpg,.png,.doc,.docx'
+        accept: '.bmp,.jpg,.png,.doc,.docx,.pdf'
       },
       token: getAccessToken(),
       filterText: '',
@@ -105,7 +106,8 @@ export default {
       caseName: '',
       selectList: [],
       selectId: '1',
-      treeData: []
+      treeData: [],
+      loading: false
     }
   },
   mounted() {
@@ -118,7 +120,7 @@ export default {
       const isLt5M = file.size / 1024 / 1024 < 5
       const filename = file.name
       const postfix = filename.substring(filename.lastIndexOf('.'))
-      if (!['.jpg', '.png', '.doc', '.docx'].includes(postfix)) {
+      if (!['.jpg', '.png', '.doc', '.docx', '.pdf'].includes(postfix)) {
         this.$message.error('上传的文件格式不符合要求!')
         return false
       }
@@ -139,6 +141,8 @@ export default {
       }
       if (['.doc', '.docx'].includes(postfix)) {
         obj.type = 3
+      } else if (['.pdf'].includes(postfix)) {
+        obj.type = 4
       }
       // const selectItem = this.findSelectNode(this.treeData)
       this.addNodeProperty(this.selectId, obj)
@@ -150,12 +154,16 @@ export default {
         this.$baseMessage.error('请选择文件!')
         return
       }
+      let flag = true
       list.forEach(e => {
         if (e.type === 1) {
-          this.$baseMessage.error('不能删除文件夹!')
-          return
+          flag = false
         }
       })
+      if (!flag) {
+        this.$baseMessage.error('不能删除文件夹!!')
+        return
+      }
       this.delFiles()
     },
     // 删除文件
@@ -288,12 +296,16 @@ export default {
         this.$baseMessage.error('请选择文件!')
         return
       }
+      let flag = true
       list.forEach(e => {
         if (e.type === 1) {
-          this.$baseMessage.error('不能移动文件夹!')
-          return
+          flag = false
         }
       })
+      if (!flag) {
+        this.$baseMessage.error('不能移动文件夹!')
+        return
+      }
       this.$refs.MoveFolderRef.show()
     },
     closed() {
@@ -308,21 +320,39 @@ export default {
         this.$baseMessage.error('请分类!')
         return
       }
+      this.loading = true
       const list = JSON.parse(JSON.stringify(this.treeData))
       list.splice(0, 1)
       ocrAndExtract({
         evidenceFileList: list,
         caseId: this.$route.params.id
       }).then(res => {
+        this.loading = false
         if (res.code === 200) {
           this.$baseMessage.success('新增成功!')
           this.$emit('save', res.data)
         }
+      }).catch(() => {
+        // 处理错误
+        this.loading = false
       })
     },
     addFolder() {
       this.$refs.AddFolderRef.show()
     },
+    changeTreeData(nodes, id) {
+      for (const node of nodes) {
+        if (node.id === id) {
+          node.fileInfoList = this.selectList
+        } else if (node.child) {
+          this.changeTreeData(node.child, id)
+        }
+      }
+      return null
+    },
+    handleDragEnd() {
+      this.changeTreeData(this.treeData, this.selectId)
+    },
     getImgUrl(id) {
       return `${baseURL}${commonDownloadFile}${id}`
     }
@@ -404,10 +434,10 @@ export default {
             flex: 1;
             border: 1px dashed #3763ff;
             padding: 24px;
-            display: flex;
             margin-top: 16px;
             .file-list {
               display: flex;
+              flex-wrap: wrap;
             }
             .file-item {
                 width: 190px;
@@ -415,6 +445,7 @@ export default {
                 position: relative;
                 margin-right: 16px;
                 cursor: pointer;
+                margin-bottom: 16px;
                 .main-content {
                     background: #F5F5F5;
                     height: 188px;
diff --git a/src/views/caseDetails/components/CaseEvidence.vue b/src/views/caseDetails/components/CaseEvidence.vue
index 99245c6..907276b 100644
--- a/src/views/caseDetails/components/CaseEvidence.vue
+++ b/src/views/caseDetails/components/CaseEvidence.vue
@@ -28,9 +28,27 @@
           <span v-if="index !== navList.length -1">></span>
         </div>
       </div>
-      <vxe-grid v-bind="gridOptions" style="margin-top: 10px">
+      <vxe-grid v-bind="gridOptions" style="margin-top: 10px;width: calc(100vw - 630px);">
+        <template #status="{row}">
+          <div v-if="row.processStatus === '2'" class="status">
+            <img src="@/assets/record/success.png" alt="">
+            <span>处理完毕</span>
+          </div>
+          <div v-if="row.processStatus === '3'" class="status">
+            <img src="@/assets/record/error.png" alt="">
+            <span>处理失败</span>
+          </div>
+          <div v-if="row.processStatus === '4'">
+            <span>已核实</span>
+          </div>
+          <div v-if="row.processStatus === '1' || row.processStatus === '0'" class="status">
+            <div v-loading="true" style="width: 20px;height: 20px;margin-right: 8px;position: relative;top: 12px;" />
+            <span>处理中</span>
+          </div>
+        </template>
         <template #opera="{row}">
           <el-button type="text" @click="handelEdit(row)">编辑</el-button>
+          <el-button v-if="row.processStatus === '3'" type="text" @click="handelExtract(row)">重新提取</el-button>
           <el-button type="text" style="color: red" @click="handleDel(row)">删除</el-button>
         </template>
       </vxe-grid>
@@ -58,7 +76,7 @@ import EditEvidence from '@/views/caseDetails/components/edit/EditEvidence.vue'
 import AddFolder from './AddEvidence/AddFolder.vue'
 import { queryEvidenceList, deleteEvidence } from '@/api/caseDetails'
 import { debounce } from '@/utils'
-import { getCaseEvidenceFileTree, getCaseEvidenceDirectoryList } from '@/api/caseDetails/evidence'
+import { getCaseEvidenceFileTree, caseEvidenceAnalysis } from '@/api/caseDetails/evidence'
 import SelectUploadType from './SelectUploadType.vue'
 export default {
   name: 'CaseEvidence',
@@ -84,12 +102,15 @@ export default {
         columns: [
           { title: '序号', type: 'seq', width: 80 },
           { title: '证据名称', field: 'evidenceName' },
-          { title: '证据类型', field: 'evidenceTypeDesc' },
+          { title: '格式', field: 'evidenceFormat', width: 150 },
+          { title: '提供人', field: 'provider', width: 200 },
+          { title: '状态', slots: { default: 'status' }, align: 'center', width: 200 },
+          { title: '证据类型', field: 'evidenceTypeDesc', width: 200 },
           // { title: '证件文件', field: 'confessionMaterial' },
-          { title: '最新时间', field: 'updateTime' },
-          { title: '操作', slots: { default: 'opera' }, fixed: 'right', width: '100px' }
+          { title: '最新时间', field: 'updateTime', width: 200 },
+          { title: '操作', slots: { default: 'opera' }, fixed: 'right', width: '150px' }
         ],
-        data: [{}]
+        data: []
       },
       treeData: [],
       selectId: '',
@@ -189,22 +210,30 @@ export default {
     },
     // 编辑
     handelEdit(row) {
-      if (row.contentType === '2') {
-        this.$router.push({ path: `/edit-evidence/${this.caseId}`, query: { caseName: this.$route.params.caseName, caseNo: this.$route.query.caseNo, evidenceId: row.id }})
-      } else {
-        this.$refs.edit.show(row, true)
+      if (row.evidenceFormat === '文件夹' && !row.fileList) {
+        this.$baseMessage.error('当前文件夹不可编辑!')
+        return
       }
+      this.$router.push({ path: `/edit-evidence/${this.caseId}`, query: { caseName: this.$route.params.caseName, caseNo: this.$route.query.caseNo, evidenceId: row.id }})
     },
     handleSelect(val) {
       val === '1' ? this.$refs.edit.show() : this.$router.push({ path: `/add-evidence/${this.caseId}`, query: { caseName: this.$route.params.caseName, caseNo: this.$route.query.caseNo }})
     },
+    async handelExtract(row) {
+      const { code, msg } = await caseEvidenceAnalysis({
+        evidenceId: row.id
+      })
+      code === 200 ? this.$baseMessage.success(msg || '提取成功!') : this.$baseMessage.error(msg || '提取失败!')
+      this.fetchData()
+    },
     // 删除
     handleDel(row) {
       this.$baseConfirm('你确定要删除当前项吗', null, async() => {
         const { code, msg } = await deleteEvidence({
-          evidenceId: row.id
+          evidenceId: row.id,
+          fileId: row.fileId
         })
-        code === 200 ? this.$baseMessage.success(msg || '删除成功!') : this.$baseMessage.error(msg || '删除成功!')
+        code === 200 ? this.$baseMessage.success(msg || '删除成功!') : this.$baseMessage.error(msg || '删除失败!')
         this.fetchData()
       })
     }
@@ -240,6 +269,22 @@ export default {
   .evidence-main {
     flex: 1;
   }
+  .status {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      img {
+        width: 20px;
+        height: 20px;
+        margin-right: 8px;
+      }
+      ::v-deep {
+        .el-loading-spinner .circular {
+          width: 20px;
+          height: 20px;
+        }
+      }
+    }
   .nav-list {
             display: flex;
             font-size: 16px;
diff --git a/src/views/caseDetails/components/EditEvidence/index.vue b/src/views/caseDetails/components/EditEvidence/index.vue
index b4c0293..1ff16df 100644
--- a/src/views/caseDetails/components/EditEvidence/index.vue
+++ b/src/views/caseDetails/components/EditEvidence/index.vue
@@ -10,12 +10,13 @@
       <div class="mid-content">
         <div class="left">
           <el-scrollbar v-if="selectList.length > 0" class="left-scroll">
-            <vuedraggable v-model="selectList" animation="400" class="img_list">
-              <div v-for="(item,index) in selectList" :key="index" :class="[item.fileId === selectInfo.fileId?'actived':'']">
-                <img v-if="['jpg', 'png'].includes(item.fileType)" class="img_item" :src="getImgUrl(item.fileId)" @click="selectItem(item)">
+            <vuedraggable v-model="selectList" animation="400" class="img_list" @end="handleDragEnd">
+              <div v-for="(item,index) in selectList" :key="index" class="img_item" :class="[item.fileId === selectInfo.fileId?'actived':'']">
+                <img v-if="['jpg', 'png'].includes(item.fileType)" :src="getImgUrl(item.fileId)" @click="selectItem(index)">
 
                 </img>
-                <svg-icon v-if="[ 'doc', 'docx'].includes(item.fileType)" class="svg-img" icon-class="docx" />
+                <svg-icon v-if="[ 'doc', 'docx'].includes(item.fileType)" class="svg-img" icon-class="docx" @click="selectItem(index)" />
+                <svg-icon v-if="[ 'pdf'].includes(item.fileType)" class="svg-img" icon-class="pdf" @click="selectItem(index)" />
               </div>
 
             </vuedraggable>
@@ -46,7 +47,7 @@
         </div>
       </div>
       <div class="FormInfo">
-        <el-form ref="form" :model="selectInfo" :rules="rules" label-width="100px" style="margin-top: 10px">
+        <el-form v-if="level === '2'" ref="form" :model="selectInfo.evidenceInfo" :rules="rules" label-width="100px" style="margin-top: 10px">
           <el-row :gutter="10" class="form-content">
             <el-col :span="24">
               <el-form-item label="证据名称" prop="title">
@@ -54,11 +55,58 @@
               </el-form-item>
             </el-col>
           </el-row>
-
+          <el-row :gutter="10" class="form-content">
+            <el-col :span="24">
+              <el-form-item label="提供人" prop="provider">
+                <el-input v-model="selectInfo.evidenceInfo.provider" placeholder="请输入提供人" />
+              </el-form-item>
+            </el-col>
+          </el-row>
           <el-row v-if="selectInfo.evidenceInfo.property" :gutter="10" class="form-content">
             <el-col v-for="(item,index) in selectInfo.evidenceInfo.property" :key="index" :span="24">
-              <el-form-item :label="item.attrName">
-                <el-input v-if="item.attrValueType ==='text'" v-model="item.attrValue" placeholder="请输入" />
+              <el-form-item v-if="item.attrValueType" :label="item.attrName">
+                <el-input v-if="item.attrValueType ==='1'" v-model="item.attrValue" placeholder="请输入" />
+                <el-input v-if="item.attrValueType ==='2'" v-model="item.attrValue" type="number" placeholder="请输入" />
+                <el-date-picker
+                  v-if="item.attrValueType ==='3'"
+                  v-model="item.attrValue"
+                  format="yyyy-MM-dd"
+                  value-format="yyyy-MM-dd"
+                  type="date"
+                  placeholder="选择日期"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-form>
+        <el-form v-if="level === '3'" ref="form" :model="evidenceInfo" :rules="rules" label-width="100px" style="margin-top: 10px">
+          <el-row :gutter="10" class="form-content">
+            <el-col :span="24">
+              <el-form-item label="证据名称" prop="title">
+                <el-input v-model="evidenceInfo.title" placeholder="请输入证据名称" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="10" class="form-content">
+            <el-col :span="24">
+              <el-form-item label="提供人" prop="provider">
+                <el-input v-model="evidenceInfo.provider" placeholder="请输入提供人" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row v-if="evidenceInfo.property" :gutter="10" class="form-content">
+            <el-col v-for="(item,index) in evidenceInfo.property" :key="index" :span="24">
+              <el-form-item v-if="item.attrValueType" :label="item.attrName">
+                <el-input v-if="item.attrValueType ==='1'" v-model="item.attrValue" placeholder="请输入" />
+                <el-input v-if="item.attrValueType ==='2'" v-model="item.attrValue" type="number" placeholder="请输入" />
+                <el-date-picker
+                  v-if="item.attrValueType ==='3'"
+                  v-model="item.attrValue"
+                  format="yyyy-MM-dd"
+                  value-format="yyyy-MM-dd"
+                  type="date"
+                  placeholder="选择日期"
+                />
               </el-form-item>
             </el-col>
           </el-row>
@@ -83,6 +131,7 @@ export default {
   data() {
     return {
       selectList: [],
+      evidenceInfo: undefined,
       activedImg: '',
       caseNo: '',
       caseName: '',
@@ -93,7 +142,7 @@ export default {
         title: [{ required: true, message: '证据名称不能为空!', trigger: 'blur' }]
       },
       flag: true,
-      treeData: [],
+      level: '',
       selectInfo: {
         evidenceInfo: {
           property: [],
@@ -112,10 +161,11 @@ export default {
     getImgUrl(id) {
       return `${baseURL}${commonDownloadFile}${id}`
     },
-    selectItem(item) {
-      this.selectInfo = item
+    selectItem(index) {
+      this.selectInfo = this.selectList[index]
       this.activedImg = `${baseURL}${commonDownloadFile}${this.selectInfo.fileId}`
     },
+
     reset() {
       this.getTreeList()
     },
@@ -124,7 +174,7 @@ export default {
         if (res.code === 200) {
           this.treeData = res.data
           this.$nextTick(() => {
-            this.handleNodeClick(res.data[0])
+            this.handleNodeClick()
           })
         }
       })
@@ -132,12 +182,9 @@ export default {
     findNodeById(nodes, id) {
       for (const node of nodes) {
         if (node.id === id) {
-          return node
+          node.fileInfoList = this.selectList
         } else if (node.child) {
-          const foundNode = this.findNodeById(node.child, id)
-          if (foundNode) {
-            return foundNode
-          }
+          this.findNodeById(node.child, id)
         }
       }
       return null
@@ -156,20 +203,30 @@ export default {
       }
       return null
     },
-    handleNodeClick(data) {
-      this.selectId = data.id
-      const nodeItem = this.findNodeById(this.treeData, this.selectId)
-      if (nodeItem.fileInfoList.length === 0) {
-        const newNodeItem = this.getFileList(nodeItem.child)
-        this.selectList = newNodeItem.fileInfoList
-        this.selectId = newNodeItem.id
-        this.selectInfo = this.selectList[0]
+    handleNodeClick() {
+      const nodeItem = this.getFileList(this.treeData)
+      if (nodeItem.evidenceInfo) {
+        this.level = '3'
+        this.evidenceInfo = nodeItem.evidenceInfo
       } else {
-        this.selectList = nodeItem.fileInfoList
-        this.selectInfo = this.selectList[0]
-        this.selectId = nodeItem.id
+        this.level = '2'
       }
-      console.log('111', this.selectList, this.selectInfo)
+      this.selectList = nodeItem.fileInfoList
+      this.selectInfo = this.selectList[0]
+      this.selectId = nodeItem.id
+      // this.selectId = data.id
+      // const nodeItem = this.findNodeById(this.treeData, this.selectId)
+      // if (nodeItem.fileInfoList.length === 0) {
+      //   const newNodeItem = this.getFileList(nodeItem.child)
+      //   this.selectList = newNodeItem.fileInfoList
+      //   this.selectId = newNodeItem.id
+      //   this.selectInfo = this.selectList[0]
+      // } else {
+      //   this.selectList = nodeItem.fileInfoList
+      //   this.selectInfo = this.selectList[0]
+      //   this.selectId = nodeItem.id
+      // }
+      
     },
     checkEvidence(nodes) {
       for (const item of nodes) {
@@ -177,7 +234,7 @@ export default {
           for (let i = 0; i < item.fileInfoList.length; i++) {
             if (!item.fileInfoList[i].evidenceInfo.title) {
               this.handleNodeClick(item)
-              this.selectItem(item.fileInfoList[i])
+              this.selectItem(i)
               this.flag = false
               break
             }
@@ -191,7 +248,7 @@ export default {
       this.checkEvidence(this.treeData)
       if (this.flag) {
         caseEvidenceVerify({
-          batchNo: this.$route.query.recordId,
+          evidenceId: this.$route.query.evidenceId,
           caseId: this.$route.params.id,
           evidenceDirectoryList: this.treeData
         }).then(res => {
@@ -208,7 +265,11 @@ export default {
         this.$baseMessage.error('证据不能为空!')
       }
     },
+    handleDragEnd() {
+      this.findNodeById(this.treeData, this.selectId)
+    },
     submit() {
+      console.log('2323', this.selectList, this.treeData)
       this.save()
     }
   }
@@ -260,6 +321,7 @@ export default {
                 background: #F6F8F9;
                 width: 150px;
                 margin-right: 14px;
+                height: calc(100vh - 368px);
               }
               .act_img {
                 padding: 16px 28px;
@@ -348,10 +410,14 @@ export default {
                 .img_item {
                     width: 98px;
                     height: 138px;
-                    // margin-bottom: 16px;
+                    margin-bottom: 16px;
                     border-radius: 6px 6px 6px 6px;
                     border: 1px solid #D1D3D6;
                     cursor: move;
+                    img {
+                      width: 98px;
+                    height: 138px;
+                    }
                 }
             }
             .boder1 {
diff --git a/src/views/promptManagement/PromptConfig/add/PromptDebug.vue b/src/views/promptManagement/PromptConfig/add/PromptDebug.vue
index afed1c8..cb7d119 100644
--- a/src/views/promptManagement/PromptConfig/add/PromptDebug.vue
+++ b/src/views/promptManagement/PromptConfig/add/PromptDebug.vue
@@ -7,21 +7,28 @@
       <div class="left">
         <div class="title">识别结果预览</div>
         <div class="left-content">
-          <div class="top">证据模板:买卖合同</div>
-          <!-- <div class="empty">
+          <div v-if="dataInfo.name" class="top">{{ `证据模板:${dataInfo.name}` }}</div>
+          <div v-if="dataList.length === 0" class="empty">
             <img src="@/assets/common/file_empty.png" alt="">
             <span>暂无结果,请在右侧输入调试内容或上传文档</span>
-          </div> -->
+          </div>
+          <div v-if="dataList.length > 0" class="data-list">
+            <div v-for="(item,index) in dataList" :key="index" class="data-item">
+              <div class="left">{{ item.attrName }}</div>
+              <div class="right">{{ item.attrValue }}</div>
+            </div>
+          </div>
         </div>
       </div>
       <div class="right">
         <div class="right-item">
           <span>调试内容</span>
           <el-input
-            v-model="textarea"
+            v-model="text"
             type="textarea"
             :rows="8"
             placeholder="请输入"
+            @blur="submit"
           />
         </div>
         <div class="right-item">
@@ -35,6 +42,7 @@
             :data="{
               temp: true
             }"
+            :on-remove="remove"
             :on-success="handleSuccess"
             :before-upload="beforeUpload"
           >
@@ -52,6 +60,7 @@
 <script>
 import { baseURL } from '@/config'
 import { getAccessToken } from '@/utils/accessToken'
+import { promptDebugging } from '@/api/promptManagement'
 export default {
   name: 'PromptDebug',
   data() {
@@ -62,7 +71,7 @@ export default {
         width: '1200px',
         hiddenFooter: true
       },
-      textarea: '',
+      text: '',
       // 上传配置
       uploadOption: {
         action: `${baseURL}/minio/uploadFile`,
@@ -71,13 +80,20 @@ export default {
       token: getAccessToken(),
       fileId: '',
       fileList: [],
+      dataList: [],
+      tripleList: [],
       dataInfo: undefined
     }
   },
   methods: {
-    show(data) {
+    show(data, list) {
+      this.fileId = ''
+      this.dataList = []
       this.drawerOption.show = true
       this.dataInfo = data
+      if (list) {
+        this.list = list
+      }
     },
     beforeUpload(file) {
       const isLt5M = file.size / 1024 / 1024 < 5
@@ -95,12 +111,28 @@ export default {
     },
     handleSuccess(res, file) {
       this.fileId = res.data
-      // const obj = {
-      //   name: file.name,
-      //   fileId: res.data
-      // }
-      // this.fileList.push(obj)
-      // this.imgOcrIdentify(res.data)
+      this.submit()
+    },
+    remove() {
+      this.fileId = ''
+    },
+    // 调试
+    submit() {
+      const params = {
+        text: this.text,
+        type: this.dataInfo.type,
+        prompt: this.dataInfo.prompt,
+        extractAttributes: this.dataInfo.extractAttributes,
+        fileId: this.fileId
+      }
+      if (params.type === '2') {
+        params.tripleList = this.list
+      }
+      promptDebugging(params).then(res => {
+        if (res.code === 200) {
+          this.dataList = res.data
+        }
+      })
     }
   }
 }
@@ -146,6 +178,28 @@ export default {
                 line-height: 53px;
                 padding-left: 24px;
             }
+            .data-list {
+              display: flex;
+              flex-direction: column;
+              padding: 24px;
+              overflow: auto;
+              height: calc(100vh - 400px);
+              .data-item {
+                display: flex;
+                margin-bottom: 24px;
+                align-items: center;
+                .left {
+                  width: 120px;
+                  font-size: 16px;
+                  color: #666666;
+                  text-align: right;
+                }
+                .right {
+                  margin-left: 24px;font-size: 16px;
+                  color: #333333;
+                }
+              }
+            }
         }
     }
     .right {
diff --git a/src/views/promptManagement/PromptConfig/add/PromptInput.vue b/src/views/promptManagement/PromptConfig/add/PromptInput.vue
index f9374de..8c2b28d 100644
--- a/src/views/promptManagement/PromptConfig/add/PromptInput.vue
+++ b/src/views/promptManagement/PromptConfig/add/PromptInput.vue
@@ -16,9 +16,6 @@
         @copy="onCopy($event)"
         @click="showList(false)"
       />
-      <div v-if="showWordLimit && maxlength" class="custom-at-limit">
-        {{ inputValueLen }}/{{ maxlength }}
-      </div>
     </div>
     <div :key="`customInput${taskPanelIsInFullScreen}`">
       <el-popover
@@ -34,10 +31,9 @@
           ref="customSelectContent"
           class="custom-select-content custom-scroll"
         >
-
           <div
             v-for="(item, index) in dataList"
-
+         
             :key="index"
             :class="[
               'custom-select-item',
@@ -46,7 +42,7 @@
             @click="handleClickOperatorItem(item)"
           >
             <div class="custom-select-item-content">
-              {{ item.name }}
+              {{ item }}
             </div>
           </div>
         </div>
@@ -67,7 +63,7 @@ export default {
     // 是否显示输入字数统计
     showWordLimit: {
       type: Boolean,
-      default: false
+      default: true
     },
     // 是否禁用
     disabled: {
@@ -79,10 +75,19 @@ export default {
       type: [Number, String],
       default: '3000'
     },
+    // 输入框高度
+    height: {
+      type: String,
+      default: '100px'
+    },
     setRefresh: {
       type: Object,
       default: () => {}
     },
+    dataList: {
+      type: Array,
+      default: () => []
+    },
     // 输入框输入的内容
     value: {
       type: String,
@@ -99,15 +104,9 @@ export default {
       startOffset: 0,
       // @搜索人dom
       searSpan: null,
-      // 筛选人数据
-      dataList: [
-        {
-          name: 'xxxx'
-        },
-        {
-          name: 'dddd'
-        }
-      ],
+
+      // 筛选人数据加载状态
+      searchOperatorLoad: false,
       // @插入位置
       selectionIndex: 0,
       // 当前编辑的dom
@@ -212,9 +211,9 @@ export default {
       // 这里的contenteditable属性设置为false,删除时可以整块删除
       dom.setAttribute('contenteditable', 'false')
       // 将id存储在dom元素的标签上,便于后续数据处理
-      dom.setAttribute('data-id', item.name)
+      dom.setAttribute('data-id', item)
 
-      dom.innerHTML = `{${item.name}}&nbsp;`
+      dom.innerHTML = `{${item}}&nbsp;`
 
       return dom
     },
@@ -376,9 +375,11 @@ export default {
           }
         } else if (event.key === 'Enter') {
           event.preventDefault()
-          this.handleClickOperatorItem(
-            this.dataList[this.selectedIndex]
-          )
+          if (!this.searchOperatorLoad) {
+            this.handleClickOperatorItem(
+              this.dataList[this.selectedIndex]
+            )
+          }
         }
       } else if (event.key === 'Backspace' && this.isSelectAll()) {
         // 如果执行了全选操作并删除,清空输入框内容
@@ -636,10 +637,13 @@ export default {
     },
     // 搜索筛选人
     async remoteMethod() {
+      const query = this.listInputValue
+      this.searchOperatorLoad = true
 
+      this.searchOperatorLoad = false
     },
     handleNameShift(item) {
-      const name = item.name || ''
+      const name = item.realname || ''
       if (!name) return '--'
       if (name.length > 1) {
         return name.slice(0, 1)
@@ -703,7 +707,10 @@ export default {
     line-height: 12px;
   }
   ::v-deep.custom-textarea {
-    height: calc(100vh - 400px);
+    white-space: pre-wrap;
+    height: calc(100vh - 500px);
+    border: 1px solid #dcdfe6;
+    border-radius: 4px;
     background-color: #ffffff;
     padding: 5px 15px;
     color: #606266;
@@ -713,10 +720,6 @@ export default {
     transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);
     position: relative;
     word-break: break-all;
-    .el-textarea__inner {
-    border: none;
-    resize: none;
-  }
     &.show-word-limit {
       padding-bottom: 16px;
     }
diff --git a/src/views/promptManagement/PromptConfig/add/add.vue b/src/views/promptManagement/PromptConfig/add/add.vue
new file mode 100644
index 0000000..74a43ee
--- /dev/null
+++ b/src/views/promptManagement/PromptConfig/add/add.vue
@@ -0,0 +1,26 @@
+<template>
+  <div>
+    <AddEditPrompt />
+  </div>
+</template>
+
+<script>
+import AddEditPrompt from './index.vue'
+export default {
+  name: 'AddPrompt',
+  components: {
+    AddEditPrompt
+  },
+  data() {
+    return {
+
+    }
+  },
+  mounted() {
+
+  },
+  methods: {
+    
+  }
+}
+</script>
diff --git a/src/views/promptManagement/PromptConfig/add/edit.vue b/src/views/promptManagement/PromptConfig/add/edit.vue
new file mode 100644
index 0000000..24708fd
--- /dev/null
+++ b/src/views/promptManagement/PromptConfig/add/edit.vue
@@ -0,0 +1,26 @@
+<template>
+  <div>
+    <AddEditPrompt />
+  </div>
+</template>
+
+<script>
+import AddEditPrompt from './index.vue'
+export default {
+  name: 'EditPrompt',
+  components: {
+    AddEditPrompt
+  },
+  data() {
+    return {
+
+    }
+  },
+  mounted() {
+
+  },
+  methods: {
+
+  }
+}
+</script>
diff --git a/src/views/promptManagement/PromptConfig/add/index.vue b/src/views/promptManagement/PromptConfig/add/index.vue
index 40dbece..08c7d3f 100644
--- a/src/views/promptManagement/PromptConfig/add/index.vue
+++ b/src/views/promptManagement/PromptConfig/add/index.vue
@@ -11,56 +11,85 @@
             </el-select>
           </el-form-item>
           <el-form-item label="提示词类型" prop="type">
-            <el-select v-model="dataInfo['type']" style="width: 100%;" placeholder="请选择提示词类型">
+            <el-select v-model="dataInfo['type']" style="width: 100%;" placeholder="请选择提示词类型" @change="selectType">
               <el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="item.value" />
             </el-select>
           </el-form-item>
           <el-form-item label="提示词名称" prop="name">
             <el-input v-model="dataInfo['name']" clearable placeholder="请输入提示词名称" />
           </el-form-item>
-          <el-form-item v-if="dataInfo.type ==='1'" label="所属目录" prop="evidenceCategoryList">
-            <el-cascader v-model="dataInfo.evidenceCategoryList" style="width: 100%;" :props="defaultProps" :options="treeData" />
+          <el-form-item v-if="dataInfo.type ==='1'" label="所属目录" prop="evidenceCategoryIdList">
+            <el-cascader v-model="dataInfo.evidenceCategoryIdList" style="width: 100%;" :props="defaultProps" :options="treeData" />
           </el-form-item>
           <!-- <el-form-item v-if="dataInfo.type ==='1'" label="类目图标" prop="caseType">
             <div class="select-img">
               <div class="sel-btn" @click="openSelectImg">请选择</div>
             </div>
           </el-form-item> -->
+          <el-form-item v-if="dataInfo.type ==='2'" label="分类" prop="typeList">
+            <el-select v-model="dataInfo['typeList']" multiple style="width: 100%;" placeholder="请选择分类">
+              <el-option
+                v-for="item in typeData"
+                :key="item.id"
+
+                :value="item.id"
+                :label="item.recordType"
+              />
+            </el-select>
+          </el-form-item>
           <el-form-item v-if="dataInfo.type ==='1'" label="提取属性" prop="extractAttributes">
             <div class="params-table">
               <div class="top">
-                <span style="width: 450px;">字典标签</span>
-                <span style="width: 150px;">字典数值</span>
+                <span style="width: 450px;">属性键值</span>
+                <span style="width: 150px;">属性类型</span>
                 <span style="width: 80px;">操作</span>
               </div>
-              <div v-for="(item,index) in dataInfo.extractAttributes" :key="index" class="table-item">
-                <el-input v-model="item.attrName" style="width: 400px;margin-right: 40px;" placeholder="请输入" />
-                <el-select v-model="item.attrValueType" style="width: 120px;margin-right: 40px;" clearable placeholder="请选择">
-                  <el-option v-for="items in extractList" :key="items.value" :label="items.label" :value="items.value" />
-                </el-select>
-                <i class="el-icon-delete" @click="delItem(index)" />
+              <div class="params-table-content">
+                <div v-for="(item,index) in dataInfo.extractAttributes" :key="index" class="table-item">
+                  <el-input v-model="item.attrName" style="width: 400px;margin-right: 40px;" placeholder="请输入" />
+                  <el-select v-model="item.attrValueType" style="width: 120px;margin-right: 40px;" clearable placeholder="请选择">
+                    <el-option v-for="items in extractList" :key="items.value" :label="items.label" :value="items.value" />
+                  </el-select>
+                  <i class="el-icon-delete" @click="delItem(index)" />
+                </div>
               </div>
+
               <div class="add-table" @click="addItem">
                 <i class="el-icon-circle-plus-outline" style="color: #3763FF;font-size: 16px;" />
                 <span>添加数据</span>
               </div>
             </div>
           </el-form-item>
+          <el-form-item v-if="dataInfo.type ==='2'" label="参数配置">
+            <vxe-grid
+              ref="entityTable"
+              v-bind="entityOptions"
+            > <template #templateName_edit="{row}">
+                <el-input v-model="row['templateName']" placeholder="请输入" />
+              </template>
+              <template #value_edit="{row}">
+                <el-input v-model="row['value']" placeholder="请输入" />
+              </template>
+            </vxe-grid>
+          </el-form-item>
+          <el-form-item v-if="dataInfo.type ==='3'" label="提示词规则" prop="rules">
+            <el-input v-model="dataInfo['rules']" :row="4" readonly type="textarea" />
+          </el-form-item>
         </el-form>
       </div>
       <div class="right">
         <div class="right-header">
           <span>提示词配置</span>
           <div class="btn-list">
-            <div class="ai-btn">
+            <!-- <div class="ai-btn">
               <i class="el-icon-refresh" />
               <span>AI自动生成</span>
-            </div>
+            </div> -->
             <div class="btn" @click="handleDebug">调试</div>
           </div>
 
         </div>
-        <div class="content">
+        <div v-if="dataInfo.prompt" class="content">
           <!-- <el-input
             v-model="dataInfo['prompt']"
             type="textarea"
@@ -68,8 +97,10 @@
             placeholder="请输入提示词模板"
           /> -->
           <PromptInput
-            v-model="customInputHTML"
+
+            v-model="dataInfo.prompt"
             placeholder=""
+            :data-list="promptValue[dataInfo.type]"
             @inputText="handleChangeInputText"
             @changeChosen="handleChangeChosen"
           />
@@ -79,7 +110,6 @@
     </div>
     <div class="footer-btns">
       <div class="btn" @click="submit">发布模板</div>
-      <div class="btn" @click="submit">保存</div>
       <div class="reset_btn" @click="reset">重置</div>
 
     </div>
@@ -91,8 +121,9 @@
 import PromptDebug from './PromptDebug.vue'
 import SelectImg from './SelectImg.vue'
 import { getCaseEvidenceTree } from '@/api/caseDetails/evidence'
-import { addOrUpdPrompt } from '@/api/promptManagement'
 import PromptInput from './PromptInput.vue'
+import { addOrUpdPrompt, getChunkClassify, queryPromptDetails } from '@/api/promptManagement'
+import mixin from '@/views/mixin'
 export default {
   name: 'AddPrompt',
   components: {
@@ -102,104 +133,151 @@ export default {
   },
   data() {
     return {
+      // 输入框的文本,可让后端使用,如不使用,也没啥用
+      customInputText: '',
+      // 输入框返回的@人员数据
+      customInputMentions: [],
       dataInfo: {
-        // 输入框的html代码
-        customInputHTML: '',
-        // 输入框的文本,可让后端使用,如不使用,也没啥用
-        customInputText: '',
-        // 输入框返回的@人员数据
-        customInputMentions: [],
-
+        rules: '(问[::](.*?))\s*答[::](.*?)(?=(问[::]|$))',
         caseType: '',
         type: '1',
         name: '',
         evidenceCategoryList: [],
+        typeList: [],
         extractAttributes: [],
-        prompt: '请根据属性定义从源文本中提取属性:\n' +
-                    '\n' +
-                    '示例文本:\n' +
-                    '"\n' +
-                    '甲方:张三公司\n' +
-                    '乙方:\n' +
-                    '数量:5000吨水泥\n' +
-                    '合同金额:8346元\n' +
-                    '支付时间:2022年11月30日\n' +
-                    '履行期限:2022年12月1日至2023年12月1日\n' +
-                    '签订日期:2022年11月23日\n' +
-                    '"\n' +
-                    '\n' +
-                    '示例结果:\n' +
-                    '{\n' +
-                    '    "甲方名称": "张三公司",\n' +
-                    '    "乙方名称": "",\n' +
-                    '    "数量": "5000吨水泥",\n' +
-                    '    "合同金额": "8346.00",\n' +
-                    '    "支付时间": "2022-11-30",\n' +
-                    '    "履行期限": "2022年12月1日至2023年12月1日",\n' +
-                    '    "签订日期": "2022-11-23"\n' +
-                    '}\n' +
-                    '\n' +
-                    '源文本:\n' +
-                    '{ocr_txt}\n' +
-                    '\n' +
-                    '属性定义:\n' +
-                    '{attr_define}\n' +
-                    '\n' +
-                    '### 注意事项:\n' +
-                    '1. 将结果以JSON格式返回。不需要进行解释。\n' +
-                    '2. 如果某字段提取不到,则返回""。\n' +
-                    '3. 日期格式为yyyy-MM-dd,数字格式返回保留两位小数。\n' +
-                    '4. 值为文本类型的数据,尽量使用原文中的文字。\n' +
-                    '5. 只可以使用原文中的文字,不可以自行添加内容。\n' +
-                    '\n' +
-                    '回溯你输出的结果,确保你的输出结果符合json格式。'
+        prompt: ''
       },
       tableList: [{
         name: '',
         type: ''
       }],
+      promptValue: {
+        '1': ['source_text', 'attr_define'],
+        '2': ['headEntityType', 'tailEntityType', 'relation']
+      },
+      // 实体关系配置
+      entityOptions: {
+        ...mixin.data().gridOptions,
+        height: '300px',
+        editConfig: {
+          trigger: 'click',
+          mode: 'cell'
+        },
+        editRules: {
+          result: [{ required: true, message: '不能为空!' }]
+        },
+        columns: [
+          { title: '类型', field: 'type' },
+          { title: '占位符', field: 'templateName' },
+          { title: '实体类型', field: 'value', editRender: { placeholder: '请点击输入...' }, slots: { edit: 'value_edit' }}
+
+        ],
+        data: []
+      },
       rules: {
         caseType: [{ required: true, message: '案件类型不能为空!', trigger: 'blur' }],
         type: [{ required: true, message: '提示词类型不能为空!', trigger: 'blur' }],
         name: [{ required: true, message: '提示词名称不能为空!', trigger: 'blur' }],
-        extractAttributes: [{ required: true, message: '提取属性不能为空!', trigger: 'blur' }]
+        typeList: [{ required: true, message: '分类不能为空!', trigger: 'change' }],
+        extractAttributes: [{ required: true, message: '提取属性不能为空!', trigger: 'change' }]
       },
       defaultProps: {
         children: 'child',
         label: 'categoryName',
-        value: 'id',
-        checkStrictly: true
+        value: 'id'
       },
       treeData: [],
       id: '',
-      extractList: [
-        {
-          label: '输入框',
-          value: 'text'
-        },
-        {
-          label: '日期',
-          value: 'date'
-        }
-      ],
+      extractList: JSON.parse(sessionStorage.getItem('prompt_attribute_valuetype')),
+      typeData: [], // 分类下拉
       // 案件类型数据
       caseTypeOptions: JSON.parse(sessionStorage.getItem('case_type')),
-      typeOptions: JSON.parse(sessionStorage.getItem('prompt_type'))
+      typeOptions: JSON.parse(sessionStorage.getItem('prompt_type')),
+      // 提示词模版
+      promptTextList: JSON.parse(sessionStorage.getItem('prompt_prototype_default_text'))
+
     }
   },
   mounted() {
     this.getTreeList()
+    this.queryChunkClassify()
+
+    this.selectType('1')
+    if (this.$route.params.id) {
+      this.getDetails()
+    }
   },
   methods: {
+    // 获取分类下拉
+    queryChunkClassify() {
+      getChunkClassify().then(res => {
+        this.typeData = res.data
+      })
+    },
+    // 获取详情
+    getDetails() {
+      queryPromptDetails({
+        id: this.$route.params.id
+      }).then(res => {
+        if (res.code === 200) {
+          this.dataInfo = res.data
+          this.entityOptions.data = res.data.tripleList || []
+          this.data.rules = '(问[::](.*?))\s*答[::](.*?)(?=(问[::]|$))'
+        }
+      })
+    },
+    selectType(val) {
+      this.$set(this.dataInfo, 'prompt', null)
+      this.$nextTick(() => {
+        const text = this.getPromptText(val)
+        this.$set(this.dataInfo, 'prompt', text || ' ')
+        console.log('text', this.dataInfo)
+      })
+      if (val === '2') {
+        this.entityOptions.data = [
+          {
+            type: '头节点',
+            templateName: 'headEntityType',
+            value: ''
+          },
+          {
+            type: '关系',
+            templateName: 'relation',
+            value: ''
+          }, {
+            type: '尾节点',
+            templateName: 'tailEntityType',
+            value: ''
+          }
+        ]
+      }
+    },
+    getPromptText(val) {
+      for (const item of this.promptTextList) {
+        if (item.value === val) {
+          return item.label
+        }
+      }
+    },
     // 获取输入框返回的文本
     handleChangeInputText(val) {
       this.customInputText = val
+      console.log('111', val)
     },
     // 获取输入框返回的文本
     handleChangeChosen(val) {
       this.customInputMentions = val
-    }, handleDebug() {
-      this.$refs.PromptDebugRef.show()
+    },
+    handleDebug() {
+      if (this.dataInfo.type === '3') {
+        this.$baseMessage.error('分类不能调试!')
+        return
+      }
+      this.$refs.form.validate(valid => {
+        if (valid) {
+          this.$refs.PromptDebugRef.show(this.dataInfo, this.entityOptions.data)
+        }
+      })
     },
     openSelectImg() {
       this.$refs.SelectImgRef.show()
@@ -209,6 +287,11 @@ export default {
       getCaseEvidenceTree({ caseType: 1 }).then(res => {
         if (res.code === 200) {
           this.treeData = res.data
+          for (let i = this.treeData.length - 1; i >= 0; i--) {
+            if (!this.treeData[i].child) {
+              this.treeData.splice(i, 1)
+            }
+          }
         }
       })
     },
@@ -222,19 +305,37 @@ export default {
       this.dataInfo.extractAttributes.splice(index, 1)
     },
     reset() {
-
+      this.dataInfo = {
+        rules: '(问[::](.*?))\s*答[::](.*?)(?=(问[::]|$))',
+        caseType: '',
+        type: '1',
+        name: '',
+        evidenceCategoryIdList: [],
+        typeList: [],
+        extractAttributes: [],
+        prompt: ''
+      }
+      this.selectType('1')
     },
     submit() {
       this.$refs.form.validate(valid => {
         if (valid) {
           const params = {
-            id: this.id,
+            id: this.$route.params.id,
             ...this.dataInfo,
-            evidenceCategoryId: this.dataInfo.evidenceCategoryList[this.dataInfo.evidenceCategoryList.length - 1 ]
+            evidenceCategoryId: this.dataInfo.evidenceCategoryIdList[this.dataInfo.evidenceCategoryIdList.length - 1 ]
+          }
+          if (params.type === '2') {
+            params.tripleList = this.entityOptions.data
           }
           addOrUpdPrompt(params).then(res => {
             const { code, msg } = res
             code === 200 ? (this.id ? this.$baseMessage.success(msg || '编辑成功!') : this.$baseMessage.success(msg || '新增成功!')) : (this.id ? this.$baseMessage.error(msg || '编辑失败!') : this.$baseMessage.error(msg || '新增失败!'))
+            this.$store.dispatch(
+              'tabsBar/delRoute',
+              this.$route
+            )
+            this.$router.push({ path: '/prompt-config' })
           })
         }
       })
@@ -300,6 +401,10 @@ export default {
                 color: #888888;
               }
             }
+            .params-table-content {
+              max-height: calc(100vh - 800px);
+              overflow-y: auto;
+            }
             .add-table {
               height: 56px;
               display: flex;
@@ -374,7 +479,7 @@ export default {
           }
           .content {
             border-radius: 6px 6px 6px 6px;
-            border: 1px solid #D9D9D9;
+            // border: 1px solid #D9D9D9;
             margin-top: 14px;
             flex: 1;
             // padding: 16px;
diff --git a/src/views/promptManagement/PromptConfig/index.vue b/src/views/promptManagement/PromptConfig/index.vue
index 7e0ec10..42e7917 100644
--- a/src/views/promptManagement/PromptConfig/index.vue
+++ b/src/views/promptManagement/PromptConfig/index.vue
@@ -10,6 +10,9 @@
             <el-button type="text" @click="handleEdit(row)">编辑</el-button>
             <el-button type="text" style="color: red" @click="handleDel(row)">删除</el-button>
           </template>
+          <template #type="{row}">
+            <span>{{ getTypeName(row.type) }}</span>
+          </template>
         </vxe-grid>
         <div style="text-align: center">
           <cs-page
@@ -26,7 +29,7 @@
 
 <script>
 import mixin from '@/views/mixin'
-import { queryPromptList } from '@/api/promptManagement'
+import { queryPromptList,delPrompt } from '@/api/promptManagement'
 
 export default {
   name: 'PromptConfig',
@@ -38,13 +41,14 @@ export default {
         { label: '提示词名称', model: 'name', type: 'input' },
         { label: '提示词类型', model: 'type', type: 'select', option: JSON.parse(sessionStorage.getItem('prompt_type')) }
       ],
+      promptType: JSON.parse(sessionStorage.getItem('prompt_type')),
       // 表格配置
       gridOptions: {
         ...mixin.data().gridOptions,
         columns: [
-          { title: 'ID', field: 'id', width: '300px' },
+         { title: '序号', type: 'seq', width: 80 },
           { title: '提示词名称', field: 'name', width: '300px' },
-          { title: '提示词类型', field: 'type', width: '200px' },
+          { title: '提示词类型', field: 'type', slots: { default: 'type' }, width: '200px' },
           { title: '匹配值', field: 'matchNum', width: '200px' },
           { title: '提示词', field: 'prompt' },
           { title: '操作', slots: { default: 'operate' }, width: '150px' }
@@ -64,17 +68,30 @@ export default {
         this.queryForm.total = res.data.total
       })
     },
+    getTypeName(val) {
+      for (const item of this.promptType) {
+        if (item.value === val) {
+          return item.label
+        }
+      }
+    },
     // 新增
     handleAdd() {
       this.$router.push({ path: `/add-prompt` })
     },
+    // 编辑
+    handleEdit(row) {
+      this.$router.push({ path: `/edit-prompt/${row.id}` })
+    },
     // 删除
     handleDel(row) {
-      // this.$baseConfirm('确定要删除吗?', null, async() => {
-      //   const { code, msg } = await deleteModelIndex(row.id)
-      //   code === 200 ? this.$baseMessage.success(msg || '删除成功!') : this.$baseMessage.error(msg || '删除失败!')
-      //   this.fetchData()
-      // })
+      this.$baseConfirm('确定要删除吗?', null, async() => {
+        const { code, msg } = await delPrompt({
+          id: row.id
+        })
+        code === 200 ? this.$baseMessage.success(msg || '删除成功!') : this.$baseMessage.error(msg || '删除失败!')
+        this.fetchData()
+      })
     },
     // 筛选
     onSearch(data, callback) {
diff --git a/src/views/promptManagement/index.vue b/src/views/promptManagement/index.vue
index dac874e..c1b40d0 100644
--- a/src/views/promptManagement/index.vue
+++ b/src/views/promptManagement/index.vue
@@ -225,7 +225,6 @@ export default {
     // 实体关系全选
     handleChangeAll() {
       const ids = this.$refs.entityTable.getCheckboxRecords().map(item => item.id)
-      console.log(ids, 8888)
       this.$set(this.promptForm, 'entity', ids)
     },
     // 实体关系选择