Kaynağa Gözat

辅助撰写申请文档

zhuliu 1 hafta önce
ebeveyn
işleme
36ff2ea537

+ 3 - 0
src/api/index.js

@@ -28,6 +28,8 @@ import reportAffair from "./newApi/reportAffair";
 import technicalDisclosure from './newApi/technicalDisclosure';
 import AI from './newApi/AI'
 
+import assistWritingInstruction from "./newApi/assistWritingInstruction";
+
 export default {
   ...client,
   ...user,
@@ -55,4 +57,5 @@ export default {
   ...reportAffair,
   ...technicalDisclosure,
   ...AI,
+  ...assistWritingInstruction
 }

+ 29 - 0
src/api/newApi/assistWritingInstruction.js

@@ -0,0 +1,29 @@
+import axios from "@/utils/axios";
+export default {
+    /**
+     * 查询辅助撰写说明书会话详情
+     */
+    assistWriteDetail(data) {
+        return axios.post("/xiaoshi/confessionSession/detail", data);
+    },
+    /**
+     * 生成申请文档内容
+     */
+    generatePatentResult(data) {
+        return axios.post("/xiaoshi/dify/generatePatentResult", data);
+    },
+
+    /**
+     * 修改申请文档内容
+     */
+    updatePatentResult(data) {
+        return axios.post("/xiaoshi/confessionSession/updatePatentResult", data);
+    },
+
+    /**
+     * 生成专利申请文档
+     */
+    exportPatentResult(data) {
+        return axios.post("/xiaoshi/confessionSession/exportPatentResult", data);
+    },
+}

+ 71 - 1
src/components/xiaoshi_AI/index.vue

@@ -644,9 +644,79 @@ export default {
     //格式化AI答复
     formateAIAnswer(chat){
         let answer = chat.answer
+        const segments = [];
+        let inThink = false;
+
+        var signs = [
+            {
+                start:/<think>/,
+                end:/<\/think>/
+            },
+            {
+                start:/<details style="color:gray;background-color: #f8f8f8;padding: 8px;border-radius: 4px;" open> <summary> Thinking... <\/summary>/,
+                end:/<\/details>/
+            },
+        ]
+        
+        while (answer.length > 0) {
+            if (inThink) {
+                // 在think块中,查找
+                let endMatch = null
+                for(let i = 0;i<signs.length;i++){
+                    let item = signs[i]
+                    endMatch = item.end.exec(answer)
+                    if(endMatch){
+                        break;
+                    }
+                }
+                if (endMatch) {
+                    // 找到结束标签
+                    const content = answer.substring(0, endMatch.index);
+                    if (content) {
+                        segments.push({ type: 'think', content:content });
+                    }
+                    answer = answer.substring(endMatch.index + endMatch[0].length);
+                    inThink = false;
+                } else {
+                    // 没有找到结束标签,剩余所有内容都是think
+                    segments.push({ type: 'think', content: answer });
+                    answer = '';
+                }
+            } else {
+                // 不在think块中,查找
+                let startMatch = null
+                for(let i = 0;i<signs.length;i++){
+                    let item = signs[i]
+                    startMatch = item.start.exec(answer)
+                    if(startMatch){
+                        break;
+                    }
+                }
+                if (startMatch) {
+                    // 找到开始标签,前面的内容是text
+                    const content = answer.substring(0, startMatch.index);
+                    if (content) {
+                        segments.push({ type: 'text', content:content });
+                    }
+                    answer = answer.substring(startMatch.index + startMatch[0].length);
+                    inThink = true;
+                } else {
+                    // 没有找到开始标签,剩余所有内容都是text
+                    segments.push({ type: 'text', content: answer });
+                    answer = '';
+                }
+            }
+        }
+        
+        return segments;
+
+
+
+
+
         let len = answer.length
 
-        let signs = [
+        var signs = [
             {
                 start:'<think>',
                 end:'</think>'

+ 12 - 1
src/router/index.js

@@ -570,12 +570,23 @@ const routes = [
             path: '/generateInstruction',
             name: 'generateInstruction',
             meta: {
-              title: '生成说明书',
+              title: '辅助撰写申请文档-测试',
               sign: 'generateInstruction',
               belong: 'AI',
             },
             component: () => import('@/views/AITools/assistWritingInstruction/index.vue'),
           },
+           //生成说明书
+           {
+            path: '/generateInstruction1',
+            name: 'generateInstruction1',
+            meta: {
+              title: '辅助撰写说明书',
+              sign: 'generateInstruction1',
+              belong: 'AI',
+            },
+            component: () => import('@/views/AITools/assistWritingInstruction/index1.vue'),
+          },
         ]
       },
       //任务模块

Dosya farkı çok büyük olduğundan ihmal edildi
+ 1553 - 411
src/views/AITools/assistWritingInstruction/assistWritingInstruction.vue


Dosya farkı çok büyük olduğundan ihmal edildi
+ 536 - 0
src/views/AITools/assistWritingInstruction/assistWritingInstruction1.vue


+ 6 - 2
src/views/AITools/assistWritingInstruction/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="height_100">
-    <assistWritingInstruction></assistWritingInstruction>
+    <assistWritingInstruction :confessionSessionId="confessionSessionId"></assistWritingInstruction>
   </div>
 </template>
 
@@ -16,7 +16,11 @@ export default {
     };
   },
   watch: {},
-  computed: {},
+  computed: {
+    confessionSessionId(){
+      return this.$route.query.confessionSessionId || null
+    },
+  },
   created() {},
   mounted() {},
   methods: {},

+ 27 - 0
src/views/AITools/assistWritingInstruction/index1.vue

@@ -0,0 +1,27 @@
+<template>
+  <div class="height_100">
+    <assistWritingInstruction></assistWritingInstruction>
+  </div>
+</template>
+
+<script>
+import assistWritingInstruction from './assistWritingInstruction1.vue';
+export default {
+  components: {
+    assistWritingInstruction
+  },
+  props: {},
+  data() {
+    return {
+    };
+  },
+  watch: {},
+  computed: {
+  },
+  created() {},
+  mounted() {},
+  methods: {},
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 1 - 1
src/views/AITools/assistWritingInstruction/mixins/index.js

@@ -157,7 +157,7 @@ export default {
         },
         formattedText(text) {
             // 将<br>替换为<p>标签
-            let html = text.replace(/<br>/gi, '</p><p>').replace(/^<p>|<\/p>$/gi, '')
+            let html = text.replace(/\n/gi, '</p><p>').replace(/<br>/gi, '</p><p>').replace(/^<p>|<\/p>$/gi, '')
             return html;
         },
         cancelRun(){

+ 93 - 10
src/views/AITools/technicalDisclosure/technicalDisclosure.vue

@@ -30,7 +30,7 @@
             <el-button type="primary" size="mini" v-if="!editTechnical" @click="changeEditTechnical()">编辑模式</el-button>
             <el-button type="primary" size="mini" v-else @click="changeEditTechnical()">返回预览模式</el-button>
             <el-button type="info" size="mini" @click="$message.info('敬请期待')">查新检索</el-button>
-            <el-button type="info" size="mini" @click="$message.info('敬请期待')">辅助撰写说明书</el-button>
+            <el-button type="primary" size="mini" @click="toWriteInstruction">辅助撰写申请文档</el-button>
 
           </div>
         </div>
@@ -367,16 +367,32 @@
           <span>技术交底书解析</span>
         </div>
         <div class="content">
-          <el-upload
-              class="upload-demo"
+          <div v-if="uploadFile.show" class="file_show">
+              <myTooltip :content="uploadFile.filename">
+                  <div class="noWrap file_name">
+                      <i class="el-icon-document" style="margin-right: 10px"></i>
+                      <span class="name">{{uploadFile.filename}}</span>
+                  </div>
+              </myTooltip>
+              <div class="type">
+                <el-progress :percentage="uploadFile.percentage"></el-progress>
+              </div>
+          </div>
+          <div  v-else>
+            <el-upload
               ref="uploadConfession"
+              class="upload-demo"
+              drag
               action="#"
               :auto-upload="false"
-              :show-file-list="false"
+              :limit="1"
               :on-change="onChangeConfession"
-              :limit="1">
-              <el-button type="primary" size="mini">上传技术交底书</el-button>
-          </el-upload>
+              style="width: 100%"
+          >
+              <i class="el-icon-upload"></i>
+              <div class="el-upload__text"><em>上传技术交底书</em></div>
+            </el-upload>
+          </div>
         </div>
       </div>
     </template>
@@ -479,7 +495,12 @@ export default {
         editTechnical:false,
         showHistory:false,
         AIModel:'chat',
-        styleShow:'style1'
+        styleShow:'style2',
+        uploadFile:{
+          show:false,
+          filename:'',
+          percentage:0
+        }
     };
   },
   watch: {
@@ -493,6 +514,20 @@ export default {
     
   },
   methods: {
+    //去辅助撰写申请文档
+    toWriteInstruction(){
+      if(!this.currentConversation.discoveryResult){
+        this.$message.warning('请先提取技术交底书内容')
+        return
+      }
+      const router = this.$router.resolve({
+          path: '/generateInstruction',
+          query:{
+            confessionSessionId:this.currentConversation.id
+          }
+      })
+      window.open(router.href,'_blank')
+    },
     slotDataFunction(val){
       let obj = {}
       try{
@@ -692,10 +727,20 @@ export default {
             type: 'warning',
             duration:0
         });
-        this.$api.uploadFile(formData).then(response=>{
+        this.uploadFile = {
+          show:true,
+          filename:file.name,
+          percentage:0
+        }
+        this.$api.uploadFile(formData,(percent)=>{
+          this.uploadFile.percentage = percent
+        }).then(response=>{
           if(response.code == 200){
               let guid = response.data[0]
-              this.$refs.uploadConfession.clearFiles()
+              if(this.$refs.uploadConfession){
+                this.$refs.uploadConfession.clearFiles()
+              }
+              
               var params = {
                 fileGuid:guid,
                 type:4
@@ -704,6 +749,11 @@ export default {
                 if(response.code == 200){
                   message.close()
                   this.$message.success('文件上传成功')
+                  this.uploadFile = {
+                    show:false,
+                    filename:'',
+                    percentage:0
+                  }
                   
                   //查询技术交底书会话记录
                   this.queryConfessionSession(false,true)
@@ -1195,4 +1245,37 @@ export default {
       }
     }
   }
+  .technicalDisclosure{
+    .file_title{
+        font-weight: bold;
+        i{
+            color: red !important;
+        }
+    }
+    .file_show{
+        line-height: 50px;
+        .file_name{
+            width: calc(100% - 90px);
+        }
+    }
+    
+    .upload-demo{
+        .el-upload{
+        width: 100% !important;  
+        }
+    
+        .el-upload-dragger {
+            width: 100% !important;
+            height:100px !important;
+            display: flex;
+            align-items: center;
+            .el-icon-upload{
+                font-size: 40px !important;
+                margin: 0 25px !important;
+            }
+        }
+    }
+      
+    
+}
 </style>

+ 2 - 1
src/views/layout/components/UserBar.vue

@@ -11,7 +11,8 @@
             <el-dropdown-item command="/technicalDisclosure">技术交底书解析</el-dropdown-item>
             <!-- <el-dropdown-item command="/claimsExplain">权利要求解释及有益效果</el-dropdown-item> -->
             <el-dropdown-item command="/OADefense">OA答辩</el-dropdown-item>
-            <el-dropdown-item command="/generateInstruction">辅助撰写说明书</el-dropdown-item>
+            <el-dropdown-item command="/generateInstruction1">辅助撰写说明书</el-dropdown-item>
+            <el-dropdown-item command="/generateInstruction">辅助撰写申请文档-测试</el-dropdown-item>
           </el-dropdown-menu>
         </el-dropdown>
       </span>