3 次代碼提交 185f9a0e98 ... a80ff9cb2c

作者 SHA1 備註 提交日期
  zhuliu a80ff9cb2c OA答辩优化 3 周之前
  zhuliu 41275069d1 一键全部生成 3 周之前
  zhuliu 3830334b29 1 3 周之前
共有 3 個文件被更改,包括 187 次插入77 次删除
  1. 5 0
      src/assets/css/main.scss
  2. 83 69
      src/views/AITools/OADefense/OADefense1.vue
  3. 99 8
      src/views/AITools/OADefense/mixins/index1.js

+ 5 - 0
src/assets/css/main.scss

@@ -272,4 +272,9 @@
       opacity: 1;
       transform: translate(-50%, -50%) scale(1.2);
   }
+}
+
+.link{
+  color: #409EFF;
+  cursor: pointer;
 }

+ 83 - 69
src/views/AITools/OADefense/OADefense1.vue

@@ -1,6 +1,6 @@
 <template>
     <div class="height_100 OADefense">
-      <conversationRecords v-show="showMenu" name="OA答辩" :show_add="false" :conversation="currentConversation" :confessionSessionList="confessionSessionList" @addConversation="addConversation" @changeConversation="changeConversation" @updateConversation="queryConfessionSession" ></conversationRecords>
+      <conversationRecords v-show="showMenu" name="OA答辩" :show_add="false" :conversation="currentConversation" :confessionSessionList="confessionSessionList" @addConversation="addConversation" @changeConversation="changeConversation1" @updateConversation="queryConfessionSession" ></conversationRecords>
       
       <myView style="height: 100%;width: 100%;" position="row">
        <!-- 左侧文件展示 -->
@@ -12,11 +12,11 @@
                         <i v-show="!showMenu" class="el-icon-s-unfold" @click="showMenu = !showMenu"></i>
                     </div>
                     <div style="font-weight:600">OA答辩</div>
-                    <el-button size="mini" class="margin-left_10" type="primary" @click="addConversation">添加新OA答辩</el-button>
+                    <el-button v-if="!add" size="mini" class="margin-left_10" type="primary" @click="addConversation">新OA</el-button>
                     <!-- <el-button v-if="notice_file.guid && !loading" class="margin-left_10" type="primary" size="mini" @click="regenerate">重新生成</el-button> -->
                 </div>
                 <div class="head_right">
-                    <el-select v-model="current_guid" size="mini" placeholder="请选择">
+                    <el-select v-if="!add" v-model="current_guid" size="mini" placeholder="请选择">
                         <el-option v-if="notice_file.guid" :label="`审查意见通知书-${notice_file.originalName || notice_file.name}`" :value="notice_file.guid" @click.native="handleOptionClick(notice_file,1)"></el-option>
                         <el-option v-if="app_file.guid" :label="`申请文件-${app_file.appNo}`" :value="app_file.guid" @click.native="handleOptionClick(app_file,2)"></el-option>
                         <el-option v-if="modify_file.guid" :label="`修改对照页`" :value="modify_file.guid" @click.native="handleOptionClick(modify_file,4)"></el-option>
@@ -48,7 +48,7 @@
                             <div class="upload-group-title">
                                 <div>上传文件(可拖动上传,<i class="el-icon-star-on red"></i>必须上传)</div>
                                 <div>
-                                    <el-button size="mini" class="margin-right_10" type="primary" @click="batch_upload">批量上传</el-button>
+                                    <!-- <el-button size="mini" class="margin-right_10" type="primary" @click="batch_upload">批量上传</el-button> -->
                                 </div>
                             </div>
                             <div class="upload-box-container">
@@ -80,15 +80,16 @@
                                         </div>
                                     </el-upload>
                                 </div>
-                                <!-- 本申请文件 -->
+                                
+                                <!-- 修改对照页 -->
                                 <div>
-                                    <div v-if="relevant_file.app_file.showPercentage || relevant_file.app_file.guid" class="upload-box">
-                                        <div class="upload-placeholder">本申请文件</div>
-                                        <div class="file-info"><span v-if="!relevant_file.app_file.showPercentage">已上传:</span><span class="file-name">{{relevant_file.app_file.name ? relevant_file.app_file.name : relevant_file.app_file.originalName}}</span></div>
-                                        <div v-if="relevant_file.app_file.showPercentage" class="progressShow">
-                                            <el-progress :percentage="relevant_file.app_file.percentage"></el-progress>
+                                    <div v-if="relevant_file.modify_file.showPercentage || relevant_file.modify_file.guid" class="upload-box">
+                                        <div class="upload-placeholder">上一次OA修改对照页</div>
+                                        <div class="file-info"><span v-if="!relevant_file.modify_file.showPercentage">已上传:</span><span class="file-name">{{relevant_file.modify_file.name ? relevant_file.modify_file.name : relevant_file.modify_file.originalName}}</span></div>
+                                        <div v-if="relevant_file.modify_file.showPercentage" class="progressShow">
+                                            <el-progress :percentage="relevant_file.modify_file.percentage"></el-progress>
                                         </div>
-                                        <span class="clear-btn" @click="relevant_file.app_file = {}">× 清除</span>
+                                        <span class="clear-btn" @click="relevant_file.modify_file = {}">× 清除</span>
                                     </div>
                                     <el-upload
                                         v-else
@@ -99,27 +100,29 @@
                                         :auto-upload="false"
                                         :show-file-list='false'
                                         :limit="1"
-                                        :on-change="(file)=>onChange(file,'relevant_file.app_file')"
+                                        :on-change="(file)=>onChange(file,'relevant_file.modify_file')"
                                         style="width: 100%"
                                     >
                                         <div class="el-upload__text">
-                                            <div class="upload-placeholder">本申请文件</div>
+                                            <div class="upload-placeholder">上一次OA修改对照页</div>
                                             <div class="upload-placeholder">点击或拖拽上传</div>
-                                            <div class="red file-info margin-top_0">注:本申请未被公开则需要上传</div>
+                                            <div class="red file-info margin-top_0">
+                                                注:不是第一次OA并且想在上一次OA基础上答辩则需要上传
+                                            </div>
                                         </div>
                                     </el-upload>
                                 </div>
-                                <!-- 修改对照页 -->
+                                <!-- 本申请文件 -->
                                 <div>
-                                    <div v-if="relevant_file.modify_file.showPercentage || relevant_file.modify_file.guid" class="upload-box">
-                                        <div class="upload-placeholder">上一次OA修改对照页</div>
-                                        <div class="file-info"><span v-if="!relevant_file.modify_file.showPercentage">已上传:</span><span class="file-name">{{relevant_file.modify_file.name ? relevant_file.modify_file.name : relevant_file.modify_file.originalName}}</span></div>
-                                        <div v-if="relevant_file.modify_file.showPercentage" class="progressShow">
-                                            <el-progress :percentage="relevant_file.modify_file.percentage"></el-progress>
+                                    <div v-if="relevant_file.app_file.showPercentage || relevant_file.app_file.guid" class="upload-box">
+                                        <div class="upload-placeholder">本申请文件</div>
+                                        <div class="file-info"><span v-if="!relevant_file.app_file.showPercentage">已上传:</span><span class="file-name">{{relevant_file.app_file.name ? relevant_file.app_file.name : relevant_file.app_file.originalName}}</span></div>
+                                        <div v-if="relevant_file.app_file.showPercentage" class="progressShow">
+                                            <el-progress :percentage="relevant_file.app_file.percentage"></el-progress>
                                         </div>
-                                        <span class="clear-btn" @click="relevant_file.modify_file = {}">× 清除</span>
+                                        <span class="clear-btn" @click="relevant_file.app_file = {}">× 清除</span>
                                     </div>
-                                    <el-upload
+                                    <!-- <el-upload
                                         v-else
                                         ref="upload_file"
                                         class="upload-demo"
@@ -128,17 +131,15 @@
                                         :auto-upload="false"
                                         :show-file-list='false'
                                         :limit="1"
-                                        :on-change="(file)=>onChange(file,'relevant_file.modify_file')"
+                                        :on-change="(file)=>onChange(file,'relevant_file.app_file')"
                                         style="width: 100%"
                                     >
                                         <div class="el-upload__text">
-                                            <div class="upload-placeholder">上一次OA修改对照页</div>
+                                            <div class="upload-placeholder">本申请文件</div>
                                             <div class="upload-placeholder">点击或拖拽上传</div>
-                                            <div class="red file-info margin-top_0">
-                                                注:不是第一次OA并且想在上一次OA基础上答辩则需要上传
-                                            </div>
+                                            <div class="red file-info margin-top_0">注:本申请未被公开则需要上传</div>
                                         </div>
-                                    </el-upload>
+                                    </el-upload> -->
                                 </div>
                                 <!-- 对比文件 -->
                                 <template v-if="relevant_file.contrast_file">
@@ -151,7 +152,7 @@
                                             </div>
                                             <span class="clear-btn" @click="contrast_file.file = {}">× 清除</span>
                                         </div>
-                                        <el-upload
+                                        <!-- <el-upload
                                             v-else
                                             ref="upload_file"
                                             class="upload-demo"
@@ -168,15 +169,18 @@
                                                 <div class="upload-placeholder">点击或拖拽上传</div>
                                                 <div class="red file-info margin-top_0">注:非专利文献需要上传</div>
                                             </div>
-                                        </el-upload>
+                                        </el-upload> -->
                                     </div>
                                 </template>
-                                <div class="upload-box addFile" @click="add_contrast_file">
+                                <!-- <div class="upload-box addFile" @click="add_contrast_file">
                                     <div>
                                         <i class="el-icon-plus addIcon"></i>
                                     </div>
                                     <div class="addText">添加对比文件</div>
-                                </div>
+                                </div> -->
+                            </div>
+                            <div style="padding:10px 0;">
+                                有其他文件需要上传,点击<span class="link" @click="batch_upload">批量上传</span>进行上传
                             </div>
                         </div>
                         <div>
@@ -196,12 +200,12 @@
                                 </span>
                             </p> -->
                             <p>
-                                <span class="file_title">是否进行权要修改:</span>
+                                <span class="file_title">权修改:</span>
                                 <span>
                                     <el-radio-group v-model="changeClaim.changeClaim">
+                                        <el-radio :label="3">AI推荐</el-radio>
                                         <el-radio :label="1">是</el-radio>
                                         <el-radio :label="2">否</el-radio>
-                                        <el-radio :label="3">AI推荐</el-radio>
                                     </el-radio-group>   
                                 </span>
                             </p>
@@ -211,6 +215,15 @@
                                     <el-input type="textarea" v-model="changeClaim.claimChangeSuggestion" :rows="6" placeholder="请输入修改建议或者修改后的权利要求"></el-input>
                                 </div>
                             </div>
+                            <div>
+                                <span class="file_title">一键全部生成:</span>
+                                <span>
+                                    <el-radio-group v-model="onceAllGenerate">
+                                        <el-radio :label="1">是</el-radio>
+                                        <el-radio :label="2">否</el-radio>
+                                    </el-radio-group>   
+                                </span>
+                            </div>
                         </div>
                     </div>
                     <hr >
@@ -289,11 +302,17 @@
                                     <svg-icon class="xiaoshiIcon" iconClass="小世AI" iconName="小世AI"></svg-icon>
                                 </div>
                                 <div class="typing-indicator" v-if="message.loading">
-                                    <div class="message-content" >
-                                        <div class="typing-dot"></div>
-                                        <div class="typing-dot"></div>
-                                        <div class="typing-dot"></div>
+                                    <div>
+                                        <div v-if="message.operation == 1">正在获取并校验本申请相关文件内容</div>
+                                        <div v-if="message.operation == 2">正在解析审查意见通知书内容</div>
+                                        <div v-if="message.operation == 3">正在生成权利要求修改建议</div>
+                                        <div v-if="message.operation == 4">正在生成具体的权利要求修改方案</div>
+                                        <div v-if="message.operation == 5">正在获取答辩点</div>
+                                        <div v-if="message.operation == 6">正在生成陈述意见书</div>
                                     </div>
+                                    <div class="typing-dot"></div>
+                                    <div class="typing-dot"></div>
+                                    <div class="typing-dot"></div>
                                 </div>
                                 <div class="message-content" v-else>
                                     <div class="message-title">AI助手</div>
@@ -343,25 +362,6 @@
                                             <div>
                                                 <div v-if="message.answer.reason">审查意见:{{message.answer.reason}}</div>
                                                 <div v-if="message.answer.nearNo">最接近的现有技术:{{message.answer.nearNo}}</div>
-                                                <!-- <div v-if="message.answer.examiner_opinion && message.answer.examiner_opinion.length">
-                                                    <div v-for="(item,index) in message.answer.examiner_opinion" :key="index">
-                                                        <p>
-                                                            <b>权利要求{{ item.claim_order.join(',') }}</b>
-                                                        </p>
-                                                        <div>
-                                                            <ul>
-                                                                <li v-for="(data,ind) in item.data" :key="`权利要求${ item.claim_order.join(',') }_${ind}`">
-                                                                    <p>
-                                                                        <span v-if="data.feature">针对于特征<b>{{ data.feature }}</b>,</span>
-                                                                        <span>审查员认为<b>{{ data.evidence }}</b>,</span>
-                                                                        <span>根据审查员描述,小世认为审查员描述的<b class="red">{{ data.result }}</b></span>
-                                                                    </p>
-                                                                </li>
-                                                            </ul>
-                                                        </div>
-                                                    </div>
-                                                    
-                                                </div> -->
                                                 <div>
                                                     <span v-if="message.answer.cause">{{ message.answer.cause }}
                                                         所以
@@ -377,19 +377,15 @@
                                                         <span v-else><b>不需要修改权利要求</b></span>
                                                     </span>
                                                 </div>
-                                                <!-- <div v-if="message.answer.changeClaim">
-                                                    <div v-if="message.answer.changeClaim==1">小世AI建议修改权利要求</div>
-                                                    <div v-else>小世AI建议不修改权利要求</div>
-                                                </div> -->
                                             </div>
-                                            <div class="btn_box" v-if="index == messageList.length-1">
+                                            <!-- <div class="btn_box" v-if="index == messageList.length-1">
                                                 <el-button v-if="message.answer.changeClaim == 1" type="primary" size="small" @click="sendMessage(message,3)">获取修改意见</el-button>
                                                 <template v-if="message.answer.changeClaim == 2">
                                                     <el-button v-if="message.answer.novelty_innovative" type="primary" size="small" @click="sendMessage(message,5)">获取答辩点</el-button>
                                                     <el-button v-else type="primary" size="small" @click="sendMessage(message,6)">生成答复意见</el-button>
                                                 </template>
                                                 <el-button type="primary" size="small" @click="editMessage(message)">修改</el-button>
-                                            </div>
+                                            </div> -->
                                         </div>
                                         <div v-else>
                                             <div>系统错误</div>
@@ -404,7 +400,7 @@
                                             您好,您修改的结果为:
                                             <div>
                                                 <div v-if="message.answer.nearNo">最接近的现有技术:{{message.answer.nearNo}}</div>
-                                                <div v-if="message.answer.changeClaim">是否修改权利要求:{{message.answer.changeClaim==1?'是':'否'}}</div>
+                                                <div v-if="message.answer.changeClaim">权利要求修改:{{message.answer.changeClaim==1?'是':'否'}}</div>
                                             </div>
                                             <div class="btn_box" v-if="index == messageList.length-1">
                                                 <el-button v-if="message.answer.changeClaim == 1" type="primary" size="small" @click="sendMessage(message,3)">获取修改意见</el-button>
@@ -421,11 +417,11 @@
                                         <div v-if="message.answer">
                                             已分析审查意见通知书等相关文件,建议如下:
                                             <div v-html="renderMarkdown(message.answer)"></div>
-                                            您可以在左侧查看审查意见通知书等文件详细内容,以便更好地理解修改建议的依据。
+                                            <!-- 您可以在左侧查看审查意见通知书等文件详细内容,以便更好地理解修改建议的依据。
                                             <div class="btn_box" v-if="index == messageList.length-1">
                                                 <el-button type="primary" size="small" @click="sendMessage(message,4)">生成修改方案</el-button>
                                                 <el-button size="small" plain @click="editMessage(message)">自行修改</el-button>
-                                            </div>
+                                            </div> -->
                                         </div>
                                         <div v-else>
                                             <div>系统错误</div>
@@ -491,6 +487,12 @@
                                     </div>
                                     <div v-if="message.operation == 6">
                                         <div v-html="renderMarkdown(message.answer)"></div>
+                                        <div class="typing-indicator" v-if="loading">
+                                            <div>AI撰写中</div>
+                                            <div class="typing-dot"></div>
+                                            <div class="typing-dot"></div>
+                                            <div class="typing-dot"></div>
+                                        </div>
                                         <div v-if="!loading && index == messageList.length-1">
                                             <el-button type="primary" size="small" @click="editMessage(message)">重新生成</el-button>
                                             <el-button type="primary" size="small" @click="generateFile">生成文档</el-button>
@@ -619,7 +621,7 @@ export default {
             near_index:null,
             nearNo:'',
             novelty_innovative:false,
-            changeClaim:1,
+            changeClaim:3,
             claim:"",
             claimChangeSuggestion:''
         },
@@ -654,7 +656,8 @@ export default {
         current_guid:'',//左侧当前显示的文件
         messageList:[],
         currentEditData:{},
-        difyQuery:''
+        difyQuery:'',
+        onceAllGenerate:2,
       };
     },
     watch: {
@@ -1004,6 +1007,10 @@ export default {
             })
         },
       run(){
+        if(!this.notice_file.guid){
+            this.$message.warning('审查意见通知书必须要上传!!!')
+            return
+        }
         this.$set(this,'result_file',{})
         var params = {
             fileGuid:this.notice_file.guid,
@@ -1060,6 +1067,7 @@ export default {
         this.$set(this,'notice_file',{})
         this.$set(this,'loading_text','')
         this.$set(this,'loading',false)
+        this.$set(this,'onceAllGenerate',2)
         this.clearConversation()
 
       },
@@ -1069,7 +1077,7 @@ export default {
             near_index:null,
             nearNo:'',
             novelty_innovative:false,
-            changeClaim:1,
+            changeClaim:3,
             claim:'',
             claimChangeSuggestion:''
         })
@@ -1154,6 +1162,10 @@ export default {
             })
         },
       //切换会话
+      changeConversation1(obj){
+        this.$set(this,'onceAllGenerate',2)
+        this.changeConversation(obj)
+      },
       async changeConversation(obj,sign){
         if(!sign){
             let isNext = await this.loading_change()
@@ -1615,6 +1627,7 @@ export default {
             }
             .typing-indicator {
                 display: flex;
+                align-items: center;
                 padding: 10px;
                 background-color: #f0f5ff;
                 border-radius: 10px;
@@ -1708,6 +1721,7 @@ export default {
             height:calc(100% - 20px - 30px);
             overflow: hidden;
             position: relative;
+            line-height: 1.8rem !important;
             .userEdit{
                 position: absolute;
                 bottom: 0;

+ 99 - 8
src/views/AITools/OADefense/mixins/index1.js

@@ -6,15 +6,31 @@ export default {
     data() {
         return {
             controller:null,
-            hasFiles:null
+            hasFiles:null,
+            retryCount:0,
+            allGenerateMessage:null,
         }
     },
+    watch:{
+        onceAllGenerate(value){
+            if(value == 2){
+                this.closeAllGenerateMessage()
+            }
+        },
+    },
     computed:{
         userinfo(){
             return this.$s.getObj('userinfo')
         }
     },
     methods: {
+        closeAllGenerateMessage(){
+            if(!this.allGenerateMessage){
+                return
+            }
+            this.allGenerateMessage.close()
+            this.allGenerateMessage = null
+        },
         async sendMessage(message,operation=1,question){
             if(!question){
                 switch(operation){
@@ -38,6 +54,15 @@ export default {
                         break;
                 }
             }
+            if(operation == 1){
+                if(this.onceAllGenerate == 1){
+                    this.allGenerateMessage = this.$message({
+                        message: '一键全部生成中,请勿退出或刷新该页面',
+                        type: 'warning',
+                        duration:0
+                    });
+                }
+            }
             // 添加对话记录
             var params = {
                 confessionSessionId:this.currentConversation.id,
@@ -62,6 +87,8 @@ export default {
                     // }
                     chatRecord = response.data
                 }
+            }).catch(error=>{
+                this.closeAllGenerateMessage()
             })
             return chatRecord
         },
@@ -123,7 +150,10 @@ export default {
               body:JSON.stringify(params)
             });
             
-            if (!response.ok) throw new Error('AI API 调用失败');
+            if (!response.ok){
+                this.closeAllGenerateMessage()
+                throw new Error('AI API 调用失败');
+            }
             const reader = response.body.getReader();
             const decoder = new TextDecoder('utf-8');
             let noFinishMessage = ''
@@ -146,12 +176,6 @@ export default {
                     //     params.answer =  params.answer.replace('undefined','')
                     // }
                     // this.addChatRecord(params)
-                    if(params.operation == 1){
-                        if(answer_code == 203){
-                            this.sendMessage(null,2)
-                        }
-                    }
-
                     if(params.operation == 3){
                         this.changeClaim.claimChangeSuggestion = params.answer
                         // this.updateContent()
@@ -160,6 +184,16 @@ export default {
                         this.changeClaim.claim = params.answer
                         // this.updateContent()
                     }
+                    if(params.operation == 1){
+                        if(answer_code == 203){
+                            this.sendMessage(null,2)
+                        }
+                    }else{
+                        //一键全部生成
+                        this.nextGenerate(params)
+                    }
+
+                    
                     break;
                 } 
                 const chunk = decoder.decode(value);
@@ -305,6 +339,63 @@ export default {
             }
         },
 
+        //一键全部生成
+        nextGenerate(message){
+            let current_operation = message.operation + ''
+            let allowOperation = ['2','3']
+            if(this.onceAllGenerate != 1 && allowOperation.indexOf(current_operation) == -1){
+                return
+            }
+            if(this.retryCount > 3){
+                this.retryCount = 0
+                this.$set(this,'onceAllGenerate',2)
+                return
+            }
+            if(!message.answer){
+                this.retryCount += 1
+                this.sendMessage(message,current_operation,'重新生成')
+                return
+            }
+            if(this.retryCount>0){
+                this.retryCount = 0
+            }
+            let operation = ''
+            switch(current_operation){
+                case '2':
+                    if(message.answer.changeClaim == 1){
+                        operation = 3
+                    }else if(message.answer.changeClaim == 2){
+                        if(message.answer.novelty_innovative){
+                            operation = 5
+                        }else{
+                            operation = 6 
+                        }
+                    }
+                    break
+                case '3':
+                    operation = 4
+                    break
+                case '4':
+                    if(this.changeClaim.novelty_innovative){
+                        operation = 5
+                    }else{
+                        operation = 6
+                    }
+                    break
+                case '5':
+                    operation = 6
+                    break
+                case '6':
+                    this.$set(this,'onceAllGenerate',2)
+                    break
+
+            }
+            if(!operation){
+                return
+            }
+            this.sendMessage(message,operation)
+        },
+
         //更新会话的content
         async updateContent(operation,data){
             let content = {