Przeglądaj źródła

无效应对报告

zhuliu 1 rok temu
rodzic
commit
dcc9a746bf
45 zmienionych plików z 5567 dodań i 129 usunięć
  1. 16 0
      src/api/newApi/patent.js
  2. 271 0
      src/api/newApi/report.js
  3. 5 0
      src/assets/css/main.scss
  4. 12 12
      src/router/index.js
  5. 12 0
      src/utils/common.js
  6. 1 0
      src/utils/model/RichText/index.vue
  7. 1 1
      src/utils/model/menu/mixins.js
  8. 4 2
      src/utils/model/route.vue
  9. 15 7
      src/utils/model/upload/index.vue
  10. 1 1
      src/views/components/import/mixins/index.js
  11. 1 1
      src/views/components/import/task/components/index.vue
  12. 8 3
      src/views/layout/mixins/index.js
  13. 9 1
      src/views/project/patentDetails/components/PatentLeft.vue
  14. 62 8
      src/views/project/patentDetails/components/menu.vue
  15. 85 0
      src/views/project/patentDetails/components/notPatentDetails.vue
  16. 34 7
      src/views/project/patentDetails/index.vue
  17. 89 7
      src/views/report/InvalidResponse/components/Evidence/evidence.vue
  18. 5 2
      src/views/report/InvalidResponse/components/Evidence/index.vue
  19. 15 6
      src/views/report/InvalidResponse/components/ManualImport/manualImport.vue
  20. 42 0
      src/views/report/InvalidResponse/components/dialog/CourtOpinion.vue
  21. 161 0
      src/views/report/InvalidResponse/components/dialog/ReviewCommittee.vue
  22. 174 0
      src/views/report/InvalidResponse/components/dialog/addAndEditPicture.vue
  23. 459 0
      src/views/report/InvalidResponse/components/dialog/addEvidenceReason.vue
  24. 74 0
      src/views/report/InvalidResponse/components/dialog/addFeature.vue
  25. 136 11
      src/views/report/InvalidResponse/components/dialog/addInvalidResponse.vue
  26. 100 0
      src/views/report/InvalidResponse/components/dialog/batchAddMessage.vue
  27. 266 0
      src/views/report/InvalidResponse/components/dialog/claimAndFeatureHistory.vue
  28. 4 1
      src/views/report/InvalidResponse/components/dialog/editEvidence.vue
  29. 118 7
      src/views/report/InvalidResponse/components/dialog/editFlowPath.vue
  30. 92 0
      src/views/report/InvalidResponse/components/dialog/featuresHistory.vue
  31. 137 0
      src/views/report/InvalidResponse/components/dialog/invalidHistory.vue
  32. 1 1
      src/views/report/InvalidResponse/components/draggable/index.vue
  33. 19 6
      src/views/report/InvalidResponse/components/flowPath/flowPath.vue
  34. 30 0
      src/views/report/InvalidResponse/components/pictureManage/index.vue
  35. 300 0
      src/views/report/InvalidResponse/components/pictureManage/pictureManage.vue
  36. 61 0
      src/views/report/InvalidResponse/components/pictureManage/pictureManageDialog.vue
  37. 77 2
      src/views/report/InvalidResponse/components/powerManage/powerManage.vue
  38. 1526 0
      src/views/report/InvalidResponse/components/reasonsAndEvidence/details.vue
  39. 956 28
      src/views/report/InvalidResponse/components/reasonsAndEvidence/reasonsAndEvidence.vue
  40. 1 1
      src/views/report/components/details/components/basicMessage.vue
  41. 39 4
      src/views/report/components/details/index.vue
  42. 130 7
      src/views/report/components/dialog/addAndEditReport.vue
  43. 11 1
      src/views/report/components/index.vue
  44. 1 1
      src/views/report/components/view/card.vue
  45. 6 1
      src/views/report/components/view/table.vue

+ 16 - 0
src/api/newApi/patent.js

@@ -23,4 +23,20 @@ export default {
     getPatentPageMessage(data) {
         return axios.post("/xiaoshi/patent/getPatentPageMessage", data);
     },
+    /**
+     * 根据专利号查询专利
+     * @param {*} params 
+     * @returns 
+     */
+    queryPatentByNo(params) {
+        return axios.get("/xiaoshi/patent/queryPatentByNo", {params});
+    },
+    /**
+     * 根据专利号查询专利(外部)
+     * @param {*} params 
+     * @returns 
+     */
+    queryPatentByNoFromWeb(params) {
+        return axios.get("/xiaoshi/patent/queryPatentByNoFromWeb", {params});
+    },
 }

+ 271 - 0
src/api/newApi/report.js

@@ -293,6 +293,13 @@ export default {
   },
   /**
     * 无效应对
+    * 删除对比文献接口 
+  */
+  deleteCompareLiterature(data) {
+    return axios.post("/xiaoshi/compareLiterature/deleteCompareLiterature", data);
+  },
+  /**
+    * 无效应对
     * 更新对比文献顺序接口 
   */
   updateLiteratureOrder(data) {
@@ -319,6 +326,14 @@ export default {
    addClaim(data) {
     return axios.post("/xiaoshi/patentClaim/addClaim", data);
   },
+
+   /**
+    * 无效应对
+    * 修改权利要求信息接口(复审委决定和法院决定)
+  */
+   updatePatentClaimMessage(data) {
+    return axios.post("/xiaoshi/patentClaim/updateMessage", data);
+  },
   
   /**
     * 无效应对
@@ -348,6 +363,78 @@ export default {
   updateInvalidRequestFile(data) {
     return axios.post("/xiaoshi/reportAffair/updateInvalidRequestFile", data);
   },
+/**
+    * 无效应对
+    * 添加口审记录接口
+  */
+addOralTrail(data) {
+  return axios.post("/xiaoshi/reportAffair/addOralTrail", data);
+},
+/**
+  * 无效应对
+  * 编辑口审记录接口
+*/
+updateOralTrail(data) {
+  return axios.post("/xiaoshi/reportAffair/updateOralTrail", data);
+},
+/**
+    * 无效应对
+    * 添加无效决定书接口
+  */
+addInvalidDecisionFile(data) {
+  return axios.post("/xiaoshi/reportAffair/addInvalidDecisionFile", data);
+},
+/**
+  * 无效应对
+  * 编辑无效决定书接口
+*/
+updateInvalidDecisionFile(data) {
+  return axios.post("/xiaoshi/reportAffair/updateInvalidDecisionFile", data);
+},
+/**
+    * 无效应对
+    * 添加行政诉讼书接口
+  */
+addAdminProceed(data) {
+  return axios.post("/xiaoshi/reportAffair/addAdminProceed", data);
+},
+/**
+  * 无效应对
+  * 编辑行政诉讼书接口
+*/
+updateAdminProceed(data) {
+  return axios.post("/xiaoshi/reportAffair/updateAdminProceed", data);
+},
+/**
+    * 无效应对
+    * 添加陈述意见书接口
+  */
+addStateOpinion(data) {
+  return axios.post("/xiaoshi/reportAffair/addStateOpinion", data);
+},
+/**
+  * 无效应对
+  * 编辑陈述意见书接口
+*/
+updateStateOpinion(data) {
+  return axios.post("/xiaoshi/reportAffair/updateStateOpinion", data);
+},
+/**
+    * 无效应对
+    * 添加行政诉讼判决书接口
+  */
+addAdminProceedJudgment(data) {
+  return axios.post("/xiaoshi/reportAffair/addAdminProceedJudgment", data);
+},
+/**
+  * 无效应对
+  * 编辑行政诉讼判决书接口
+*/
+updateAdminProceedJudgment(data) {
+  return axios.post("/xiaoshi/reportAffair/updateAdminProceedJudgment", data);
+},
+
+
   /**
     * 无效应对
     * 添加无效法条
@@ -355,6 +442,190 @@ export default {
   addInvalidStatutes(data) {
     return axios.post("/xiaoshi/invalidStatutes/addInvalidStatutes", data);
   },
+  /**
+    * 无效应对
+    * 查询无效法条
+  */
+  queryInvalidStatutes(data) {
+    return axios.post("/xiaoshi/invalidStatutes/queryInvalidStatutes", data);
+  },
+  /**
+    * 无效应对
+    * 修改无效法条信息(法院意见)
+  */
+  updateInvalidStatutesMessage(data) {
+    return axios.post("/xiaoshi/invalidStatutes/updateMessage", data);
+  },
+  /**
+    * 无效应对
+    * 添加(修改)证据组合
+  */
+  addProofGroup(data) {
+    return axios.post("/xiaoshi/proofGroup/addProofGroup", data);
+  },
+  /**
+      * 无效应对
+      * 查询证据组合
+    */
+  queryProofGroup(data) {
+    return axios.post("/xiaoshi/proofGroup/queryProofGroup", data);
+  },
+  /**
+      * 无效应对
+      * 删除证据组合
+    */
+  removeProofGroup(data) {
+    return axios.post("/xiaoshi/proofGroup/removeProofGroup", data);
+  },
+   /**
+      * 无效应对
+      * 批量保存(或编辑)第一次无效证据
+    */
+   addEvidenceReason(data) {
+    return axios.post("/xiaoshi/evidenceReason/addEvidenceReason", data);
+  },
+  /**
+      * 无效应对
+      * 查询无效证据
+    */
+  queryEvidenceReason(data) {
+    return axios.post("/xiaoshi/evidenceReason/queryEvidenceReason", data);
+  },
+   /**
+      * 无效应对
+      * 查询特征拆分历史
+    */
+   queryClaimSplitHistory(data) {
+    return axios.post("/xiaoshi/feature/queryClaimSplitHistory", data);
+  },
+  /**
+      * 无效应对
+      * 查询无效记录历史
+    */
+  queryInvalidHistory(data) {
+    return axios.post("/xiaoshi/evidenceReason/queryInvalidHistory", data);
+  },
+
+  /**
+    * 无效应对
+    * 修改权要
+  */
+  alterPatentClaim(data) {
+    return axios.post("/xiaoshi/patentClaimHistory/alterPatentClaim", data);
+  },
+  /**
+    * 无效应对
+    *删除权要
+  */
+  deletePatentClaim(data) {
+    return axios.post("/xiaoshi/patentClaimHistory/deletePatentClaim", data);
+  },
+  /**
+    * 无效应对
+    *编辑权要
+  */
+  editPatentClaimHistory(data) {
+    return axios.post("/xiaoshi/patentClaimHistory/editPatentClaimHistory", data);
+  },
+  /**
+    * 无效应对
+    *查询权要修改历史
+  */
+  queryPatentClaimHistory(data) {
+    return axios.post("/xiaoshi/patentClaimHistory/queryPatentClaimHistory", data);
+  },
 
+  /**
+    * 无效应对
+    *修改特征
+  */
+  updateGroupFeature(data) {
+    return axios.post("/xiaoshi/groupFeature/updateGroupFeature", data);
+  },
+  /**
+    * 无效应对
+    *删除特征
+  */
+  removeGroupFeature(data) {
+    return axios.post("/xiaoshi/groupFeature/removeGroupFeature", data);
+  },
+/**
+    * 无效应对
+    *编辑特征
+  */
+  updateFeature(data) {
+    return axios.post("/xiaoshi/groupFeature/updateFeature", data);
+  },
+  /**
+    * 无效应对
+    *查询特征修改历史
+  */
+  queryFeatureHistory(data) {
+    return axios.post("/xiaoshi/groupFeature/queryFeatureHistory", data);
+  },
+ /**
+    * 无效应对
+    *批量添加或更新特征
+  */
+    addFeatureGroupBatch(data) {
+      return axios.post("/xiaoshi/groupFeature/addFeatureGroupBatch", data);
+    },
+  
+   /**
+    * 无效应对
+    *查询组合详情
+  */
+  queryProofGroupMessage(data) {
+    return axios.post("/xiaoshi/proofGroup/queryMessage", data);
+  },
+   /**
+    * 无效应对
+    *更新组合详情栏位值
+  */
+  updateProofGroupMessage(data) {
+    return axios.post("/xiaoshi/proofGroup/updateMessage", data);
+  },
+ /**
+    * 无效应对
+    *更新特征相关栏位值
+  */
+  updateGroupFeatureMessage(data) {
+    return axios.post("/xiaoshi/groupFeature/updateMessage", data);
+  },
+  /**
+    * 无效应对
+    *更新特征相关栏位值
+  */
+  updateEvidenceReasonMessage(data) {
+    return axios.post("/xiaoshi/evidenceReason/updateMessage", data);
+  },
+  /**
+    * 无效应对
+    *更新报告是否第二次无效
+  */
+  updateIfSecondInvalid(data) {
+    return axios.post("/xiaoshi/reportProject/updateIfSecondInvalid", data);
+  },
 
+  /**
+    * 无效应对
+    *添加或更新报告附图
+  */
+  updateProjectFigure(data) {
+    return axios.post("/xiaoshi/projectFigure/updateProjectFigure", data);
+  },
+  /**
+    * 无效应对
+    *删除报告附图
+  */
+    removeProjectFigures(data) {
+      return axios.post("/xiaoshi/projectFigure/removeProjectFigures", data);
+    },
+ /**
+    * 无效应对
+    *查询报告附图
+  */
+    queryProjectFigures(data) {
+      return axios.post("/xiaoshi/projectFigure/queryProjectFigures", data);
+    },
 };

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

@@ -147,4 +147,9 @@
 }
 .pointerEvents{
   pointer-events: none;
+}
+
+.del{
+  text-decoration: line-through;
+  color: red;
 }

+ 12 - 12
src/router/index.js

@@ -347,7 +347,7 @@ const routes = [
               belong:'AllReport'
             },
             component:() => import('@/views/report/InvalidResponse/components/ManualImport/index.vue'),
-          }
+          },
 
       //     //添加无效证据和理由
       //     {
@@ -360,17 +360,17 @@ const routes = [
       //       },
       //       component:() => import('@/views/report/InvalidResponse/components/invalidIdexRouter.vue'),
       //     },
-      //     //导入证据文献
-      //     {
-      //       path:'/evidenceAndRequestIndex',
-      //       name:'evidenceAndRequestIndex',
-      //       meta:{
-      //         title:'证据详情',
-      //         aside:true,
-      //         showHeader:true,
-      //       },
-      //       component:() => import('@/views/report/InvalidResponse/components/evidenceAndRequestRouter.vue'),
-      //     },
+          //导入证据文献
+          {
+            path:'/evidence',
+            name:'evidence',
+            meta:{
+              title:'证据详情',
+              sign:'evidence',
+              belong:'AllReport'
+            },
+            component:() => import('@/views/report/InvalidResponse/components/Evidence/index.vue'),
+          },
       //     //对比任务
       //     {
       //       path: '/SelectedPatent',

+ 12 - 0
src/utils/common.js

@@ -192,6 +192,18 @@ export default {
     return `/fileManager/downloadFile?fileId=${guid}`
   },
 
+   //查看专利详情
+   checkPatentDetails(patentNo,projectId) {
+      router.push(
+        {
+          path: '/patentDetails/' + patentNo,
+          query: {
+            projectId: projectId,
+          }
+        }
+      )
+  },
+
   //查看显示栏位管理
   async getCustomField(type, patentObj = {}) {
     var params = {

+ 1 - 0
src/utils/model/RichText/index.vue

@@ -284,6 +284,7 @@ async urlToBase64(imageUrl) {
     saveValue(event){
         var a  = event.target.innerHTML
         this.$emit('input',a)
+        this.$emit('blur',a)
     }
   },
 };

+ 1 - 1
src/utils/model/menu/mixins.js

@@ -15,7 +15,7 @@ export const File = {
         var FileUrl = this.$commonJS.checkViewer(guid)
         var isPicture = 1
       } else {
-        let http = '139.224.24.90'
+        let http = this.$c.staticURL
         var url = this.$commonJS.checkViewer(guid)
         var FileUrl = `http://${http}:8012/onlinePreview?url=` + btoa(encodeURIComponent(url + '&fullfilename=test.' + item.type))
         var isPicture = 0

+ 4 - 2
src/utils/model/route.vue

@@ -9,7 +9,7 @@
       <div slot="right">222</div>
     </myView2> -->
     <!-- <avoidDirection></avoidDirection> -->
-    <PatentField></PatentField>
+    <report></report>
   </div>
 </template>
 
@@ -17,11 +17,13 @@
 import myView2 from './myView/index.vue'
 import avoidDirection from '@/views/report/avoid/components/avoidDirection.vue'
 import PatentField from '@/views/project/patentDetails/components/PatentField.vue'
+import report from '@/views/report/InvalidResponse/components/pictureManage/pictureManage.vue'
 export default {
   components: {
     myView2,
     avoidDirection,
-    PatentField
+    PatentField,
+    report
   },
   props: {},
   data() {

+ 15 - 7
src/utils/model/upload/index.vue

@@ -35,12 +35,14 @@
       <div class="fileList" v-if="fileList.length > 0">
         <ul>
           <li v-for="item in fileList" :key="item.guid" @dblclick="ondblclick(item)">
-            <div>
-              <i class="el-icon-document" style="margin-right: 10px"></i
-              ><span class="name" @click="checkFiles(item)">{{
-                item.name ? item.name : item.originalName
-              }}</span>
-            </div>
+            <myTooltip :content="item.name ? item.name : item.originalName">
+              <div class="noWrap">
+                <i class="el-icon-document" style="margin-right: 10px"></i
+                ><span class="name" @click="checkFiles(item)">{{
+                  item.name ? item.name : item.originalName
+                }}</span>
+              </div>
+            </myTooltip>
             <div class="type">{{ item.guid ? "已上传" : "待上传" }}</div>
             <div class="icon" @click="onRemove(item, fileList)">
               <i class="el-icon-close"></i>
@@ -116,8 +118,11 @@
 </template>
 
 <script>
+import myTooltip from '../tooltip/index'
 export default {
-  components: {},
+  components: {
+    myTooltip
+  },
   props: {
     //上传的接口或地址
     action: {
@@ -435,7 +440,9 @@ export default {
         border-radius: 5px;
         display: flex;
         justify-content: space-between;
+
         .type {
+          min-width:75px;
           display: block;
           color: #57a5f7;
         }
@@ -450,6 +457,7 @@ export default {
           cursor: pointer;
         }
         .type {
+          min-width:75px;
           display: none;
         }
         .icon {

+ 1 - 1
src/views/components/import/mixins/index.js

@@ -30,7 +30,7 @@ export default{
                 label: 'name'
             },
             assoImportTaskFieldVOS:[],
-            importContent:[]
+            importContent:['0','1','2','3']
         }
     },
     computed:{

+ 1 - 1
src/views/components/import/task/components/index.vue

@@ -184,7 +184,7 @@ export default {
 //     "message": "WebSocket请求成功"
 // }
         if(code === 900){
-            if(data.doneType == 0){
+            if(data.doneType == -1){
                 const index = this.tableData.findIndex(item=>{return item.id == data.taskId})
                 if (index == -1) {
 

+ 8 - 3
src/views/layout/mixins/index.js

@@ -5,16 +5,21 @@ export const webSocket = {
   methods: {
     connectWebSocket(userId) {
       let webSocket = new WebSocket(`ws://${this.$c.staticURL}:8877/api/xiaoshi/ws/` + userId)
-      // let webSocket = new WebSocket(`ws://139.224.24.90:8871/permission/api/ws/` + userId)
+      // let webSocket = new WebSocket(`ws://192.168.1.18:8877/api/xiaoshi/ws/` + userId)
       Store.commit('SET_WEB_SOCKET', webSocket)
       webSocket.onopen = () => {
         console.log('WebSocket连接成功')
       }
       webSocket.onmessage = async (e) => {
+        if(e.data.indexOf('{') == -1){
+          return false
+      }
         const { code, data, message } = JSON.parse(e.data)
-        if(code == 903){
+        if(code == 903 || code == 600){
           if (data.complete) {
-              this.$message.success(`导入任务完成`)
+              this.$message.success(`导入完成`)
+          }else{
+            console.log(data)
           }
         }
       }

+ 9 - 1
src/views/project/patentDetails/components/PatentLeft.vue

@@ -5,7 +5,7 @@
       style="display: flex;justify-content: space-evenly;height: 50px;line-height: 50px;border-bottom: 1px solid #ccc;">
       <div>总专利数量:{{ total }}</div>
     </div>
-    <div class="list">
+    <div class="list" v-if="[1,2,7].findIndex(item=>{return item == reportType}) == -1">
       <div class="left-patentNo"  v-for="(item,index) in patentList" :key="item.patentNo" :style="{background:(item.patentNo == patentNo)? '#cdd7eb':''}" @click="$emit('getPatentLeft',item.patentNo,index)">
         <div>{{ item.patentNo }}</div>
         <my-tooltip :content="item.title.content" placement="bottom-start">
@@ -13,6 +13,11 @@
         </my-tooltip>
       </div>
     </div>
+    <div class="list" v-else>
+      <div class="left-patentNo"  v-for="(item,index) in patentList" :key="item.name" :style="{background:(item.literatureNo == patentNo)? '#cdd7eb':''}" @click="$emit('getPatentLeft',item,index,true)">
+        <div>{{ item.name }}</div>
+      </div>
+    </div>
     
 
   </div>
@@ -33,6 +38,9 @@ export default {
     },
     patentNo:{
       default:''
+    },
+    reportType:{
+      default:0
     }
   },
   data() {

+ 62 - 8
src/views/project/patentDetails/components/menu.vue

@@ -38,9 +38,9 @@
             </el-tooltip>
           </el-header>
           <el-main style="background: #FFFFFF;">
-            <PatentLeft :patentList="patentList" :patentNo="patentNo" :total="total" @getPatentLeft="getPatentLeft"></PatentLeft>
+            <PatentLeft :patentList="patentList" :reportType="reportType" :patentNo="patentNo" :total="total" @getPatentLeft="getPatentLeft"></PatentLeft>
           </el-main>
-          <el-footer style="text-align: center;">
+          <el-footer style="text-align: center;" v-if="[1,2,7].findIndex(item=>{return item == reportType}) == -1">
             <el-pagination background layout=" prev, pager, next" :current-page.sync="queryParams.current"
               :page-size.sync="queryParams.size" @current-change="handleCurrentChange" :total="total">
             </el-pagination>
@@ -88,8 +88,9 @@
         <template v-if="patentList.length>1">
           <el-tooltip placement="right-end">
           <template slot="content">
-            <div>点击查看上一篇专利</div>
-            <div>专利:{{index!=0? patentList[index-1].patentNo:''}}</div>
+            <div>点击查看上一篇文献</div>
+            <div v-if="[1,2,7].findIndex(item=>{return item == reportType}) == -1">专利:{{index!=0? patentList[index-1].patentNo:''}}</div>
+            <div v-else>文献:{{index!=0? patentList[index-1].name:''}}</div>
             <div>数量:{{currentLocation - 1}}</div>
           </template>
           <div class="articles-Loop">
@@ -100,8 +101,9 @@
         </el-tooltip>
         <el-tooltip placement="right-end">
           <template slot="content">
-            <div>点击查看下一篇专利</div>
-            <div>专利:{{(total - currentLocation!=0 && total!=0)? patentList[index+1].patentNo:''}}</div>
+            <div>点击查看下一篇文献</div>
+            <div v-if="[1,2,7].findIndex(item=>{return item == reportType}) == -1">专利:{{(total - currentLocation!=0 && total!=0)? patentList[index+1].patentNo:''}}</div>
+            <div v-else>文献:{{(total - currentLocation!=0 && total!=0)? patentList[index+1].name:''}}</div>
             <div>数量:{{total - currentLocation}}</div>
           </template>
           <div class="articles-Loop" >
@@ -117,6 +119,7 @@
 </template>
 
 <script>
+import report from '@/api/report';
 import PatentLeft from './PatentLeft.vue';
 export default {
   components: {
@@ -131,6 +134,9 @@ export default {
     projectId:{
       default:0
     },
+    reportType:{
+      default:0
+    },
     taskId:{
       default:null
     },
@@ -180,20 +186,52 @@ export default {
     this.getPatentList()
   },
   methods: {
-    getPatentLeft(patentNo,index){
+    getPatentLeft(patentNo,index,sign){
+      
+      if(sign){
+        this.currentLocation = index + 1
+        this.updatePatentNo(patentNo,sign)
+        return false
+      }
       this.currentLocation = (index + 1) + ((this.queryParams.current - 1) * this.queryParams.size)
       this.updatePatentNo(patentNo)
     },
-    updatePatentNo(patentNo){
+    updatePatentNo(patentNo,sign){
       var search = {
         searchOption:this.searchOption,
         location:this.currentLocation
       }
       this.$s.setSession('search',search)
+      if(sign){
+        this.$emit('getPatentLeft',patentNo,sign)
+        return false
+      }
       this.$emit('getPatentLeft',patentNo)
     },
     getPatentList(){
+      var reportType = [1,2,7]
+      var index = reportType.findIndex(item=>{
+        return item == this.reportType
+      })
+      if(index != -1){
+        var param = {
+          projectId:this.projectId
+        }
+        this.$api.queryCompareLiterature(param).then(response=>{
+            if(response.code == 200){
+                this.patentList = response.data.data.sort((a,b)=>{
+                    return a.sysOrder - b.sysOrder
+                })
+                this.total = this.patentList.length
+                this.index = this.currentLocation - 1
+            }
+        }).catch(error=>{
+            this.patentList = []
+            this.total = 0
+        })
 
+        return false
+      }
       var api = ''
       var current = 5
       if(this.isContract){
@@ -242,6 +280,14 @@ export default {
     prev(){
       this.index -=1
       this.currentLocation -=1
+      var reportType = [1,2,7]
+      var index = reportType.findIndex(item=>{
+        return item == this.reportType
+      })
+      if(index !=-1){
+        this.updatePatentNo(this.patentList[this.index],true)
+        return false
+      }
       this.updatePatentNo(this.patentList[this.index].patentNo)
       if(this.index <= 2 && this.currentLocation>2){
         this.getPatentList()
@@ -251,6 +297,14 @@ export default {
     next(){
       this.index +=1
       this.currentLocation +=1
+      var reportType = [1,2,7]
+      var index = reportType.findIndex(item=>{
+        return item == this.reportType
+      })
+      if(index !=-1){
+        this.updatePatentNo(this.patentList[this.index],true)
+        return false
+      }
       this.updatePatentNo(this.patentList[this.index].patentNo)
       if(this.index >= 7  &&  this.currentLocation<this.total-2){
         this.getPatentList()

+ 85 - 0
src/views/project/patentDetails/components/notPatentDetails.vue

@@ -0,0 +1,85 @@
+<template>
+  <div class="height_100">
+    <el-container>
+        <el-header style="height: auto;">
+        <div style="width:100%">
+          <div>
+            <div style="text-align: start;padding-left: 10px;position: relative;">
+                <img src="@/assets/visual/fixed.png" width="20px" height="20px" v-if="fix === true && value == true" @click="qx" style="" />
+                <img src="@/assets/visual/unfixed.png" width="20px" height="20px" v-if="fix === false && value == true"  @click="gd" style="" />
+            </div>
+            <div style="text-align:center">
+                <span>
+                    {{ evidence.name }}
+                </span>
+            </div>
+          </div>
+        </div>
+      </el-header>
+      <el-main>
+        <div class="height_100" style="width:100%" v-loading="loading">
+            <iframe id="checkIframe" :src="url" frameborder="0" width="100%"></iframe>
+        </div>
+      </el-main>
+    </el-container>
+  </div>
+</template>
+
+<script>
+export default {
+  components: {},
+  props: {
+    evidence:{
+        default:()=>{
+            return {}
+        }
+    }
+  },
+  data() {
+    return {
+        url:'',
+        loading:false,
+        fix:false,
+        value: false,
+    };
+  },
+  watch: {
+    evidence(val){
+        if(val){
+            this.getUrl()
+            this.load()
+        }
+    }
+  },
+  computed: {},
+  created() {},
+  mounted() {
+    if(this.evidence){
+        this.getUrl()
+        this.load()
+    }
+  },
+  methods: {
+    getUrl(){
+        let http = this.$c.staticURL
+        var guid = this.evidence.literatureNo
+        var url = this.$commonJS.checkViewer(guid)
+        this.url = `http://${http}:8012/onlinePreview?url=` + btoa(encodeURIComponent(url + '&fullfilename=test.' + this.evidence.systemFile.type))
+    },
+    load(){
+        var that = this
+        this.$nextTick(()=>{
+            var a = document.getElementById('checkIframe')
+            a.onload = function() {
+                that.loading = true
+            };
+            if(a.contentDocument.readyState == 'complete'){
+                that.loading = false
+            }
+        })
+    }
+  },
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 34 - 7
src/views/project/patentDetails/index.vue

@@ -1,14 +1,16 @@
 <template>
   <div class="height_100 article" :style="{'flex-direction':isRight?'row-reverse':'row'}">
-    <articleMenu @event="event" :value="showView" :menu="menuList" :isRight="isRight" :projectId="projectId" :taskId="taskId" :searchOption="search.searchOption" :patentNo="patentNo" :location="search.location" @getPatentLeft="getPatentLeft" :handlerType="handlerType"></articleMenu>
+    <articleMenu @event="event" :value="showView" :reportType="reportType" :menu="menuList" :isRight="isRight" :projectId="projectId" :taskId="taskId" :searchOption="search.searchOption" :patentNo="patentNo" :location="search.location" @getPatentLeft="getPatentLeft" :handlerType="handlerType"></articleMenu>
     <div class="height_100 content">
         <my-View :showView="showView" >
             <div slot="left" style="width:100%">
+              <notPatentDetails v-if="evidenceType == 1" :projectId="projectId" :evidence="evidenceData"></notPatentDetails>
               <!-- <Patent-Details :patentNo="patentNo" :projectId="projectId" :taskId="taskId"></Patent-Details> -->
-              <component :is='components' :patentNo="patentNo" :projectId="projectId" :taskId="taskId" :reportType="reportType" :isResult="isResult"></component>
+              <component v-else :is='components' :patentNo="patentNo" :projectId="projectId" :taskId="taskId" :reportType="reportType" :isResult="isResult"></component>
             </div>
             <div slot="right" style="width:100%">
-              <Patent-Details :patentNo="patentNo" :projectId="projectId" :taskId="taskId"></Patent-Details>
+              <notPatentDetails v-if="evidenceType == 1" :projectId="projectId" :evidence="evidenceData"></notPatentDetails>
+              <Patent-Details v-else :patentNo="patentNo" :projectId="projectId" :taskId="taskId"></Patent-Details>
             </div>
         </my-View>
     </div>
@@ -21,12 +23,14 @@ import articleMenu from './components/menu.vue'
 import PatentDetails from './components/patentDetails.vue'
 import tortContrast from '@/views/report/tort/components/tortContrast1.vue'
 import teamwork from '@/views/report/components/dialog/teamwork.vue'
+import notPatentDetails from './components/notPatentDetails.vue'
 export default {
   components: {
     articleMenu,
     PatentDetails,
     tortContrast,
     teamwork,
+    notPatentDetails
   },
   props: {},
   data() {
@@ -36,7 +40,8 @@ export default {
       patentNo:this.$route.params.patentNo,
       routeCount:this.$s.getSession('routeCount')||1,
       components:'PatentDetails',
-      menuList:[]
+      menuList:[],
+      evidenceData:{}
     };
   },
   watch: {},
@@ -62,9 +67,20 @@ export default {
     handlerType() {//1外部人员0内部人员(只有外部协同人做协同任务才会传递)
       return this.$route.query.handlerType
     },
+    evidenceType() {//证据文献类型,专利类型:0;非专利:1
+      return this.$route.query.evidenceType
+    },
+    evidence(){
+      return this.$route.query.evidence
+    }
   },
   created() {},
   mounted() {
+    if(this.evidence){
+      this.evidenceData = JSON.parse(this.evidence)
+    }else{
+      this.evidenceData = this.evidence
+    }
     this.getMenuPrice()
     this.getComponents()
   },
@@ -108,17 +124,28 @@ export default {
     coordination(){
       this.$refs.teamwork.open()
     },
-    getPatentLeft(val) {
-      this.patentNo=val
+    getPatentLeft(val,sign) {
+      var evidenceType = null
+      var evidence = {}
+      if(sign){
+        this.evidenceData = val
+        this.patentNo = val.literatureNo
+        evidenceType = val.type
+        evidence=JSON.stringify(val)
+      }else{
+        this.patentNo=val
+      }
       this.routeCount = Number(this.routeCount) + 1
       this.$s.setSession('routeCount',this.routeCount)
       this.$router.push(
         {
-          path: '/patentDetails/' + val,
+          path: '/patentDetails/' + this.patentNo,
           query: {
             projectId: this.projectId,
             taskId: this.taskId,
             reportType: this.reportType,
+            evidenceType:evidenceType,
+            evidence:evidence
           }
         }
       )

+ 89 - 7
src/views/report/InvalidResponse/components/Evidence/evidence.vue

@@ -17,6 +17,7 @@
             
         </el-header>
         <el-main v-DivHeight="getDivHeight">
+            <el-progress style="margin-bottom:10px;" v-if="showPercentage" :text-inside="true" :stroke-width="20" :percentage="percentage>100?100:percentage" :color="customColors"></el-progress>
             <el-table :data="tableData" border :maxHeight="tableHeight" style="width: 100%">
                 <el-table-column prop="sysOrder" label="序号" width="80" align="center">
                     <template slot-scope="scope">
@@ -30,9 +31,9 @@
                 </el-table-column>
                 <el-table-column prop="name" label="专利号/标题" align="center">
                     <template slot-scope="scope">
-                        <div>
+                        <el-link type="primary" @click="checkDetails(scope)">
                             {{scope.row.name}}
-                        </div>
+                        </el-link>
                     </template>
                 </el-table-column>
                 <el-table-column prop="authorName" label="权利人/作者" align="center">
@@ -101,6 +102,7 @@
 </template>
 
 <script>
+import { mapGetters } from "vuex";
 import editEvidence from '../dialog/editEvidence.vue';
 import { getTableHeight } from '@/views/components/mixins'
 import myDraggable from '../draggable'
@@ -113,6 +115,9 @@ export default {
   props: {
     projectId:{
         default:0
+    },
+    reportType:{
+        default:0
     }
   },
   data() {
@@ -125,16 +130,62 @@ export default {
             0:'不适格',
             1:'抵触申请',
             2:'现有技术'
-        }
+        },
+        percentage:0,
+        customColors: [
+            {color: '#f56c6c', percentage: 20},
+            {color: '#e6a23c', percentage: 40},
+            {color: '#5cb87a', percentage: 60},
+            {color: '#1989fa', percentage: 80},
+            {color: '#6f7ad3', percentage: 100}
+        ],
+        showPercentage:false
     };
   },
   watch: {},
-  computed: {},
+  computed: {
+    ...mapGetters(['webSocket', 'userinfo']),
+  },
   created() {},
   mounted() {
+    this.initTask()
     this.getList()
   },
   methods: {
+    initTask() {
+          this.webSocket.onmessage = (e) => {
+            if(e.data.indexOf('{') == -1){
+                return false
+            }
+            const { code, data, message } = JSON.parse(e.data)
+
+            if(code === 600){
+                if(data.doneType == -1){
+                    
+                }
+            }
+          }
+        },
+    //查看详情
+    checkDetails(scope){
+        var index = scope.$index
+        var row = scope.row
+        var search = {
+            location: index + 1
+        }
+        this.$s.setSession('search', search)
+        this.$router.push(
+            {
+            path: '/patentDetails/' + row.literatureNo,
+            query: {
+                projectId: this.projectId,
+                reportType: this.reportType,
+                evidenceType:row.type,
+                evidence:JSON.stringify(row)
+            }
+            }
+        )
+    },
     //获取证据文献
     getList(){
         this.$api.queryCompareLiterature(this.queryParams).then(response=>{
@@ -154,7 +205,7 @@ export default {
                 this.patentImport(2)
                 break;
             case '2'://非专利文献导入
-                this.addLiterature({})
+                this.addLiterature({type:1})
                 break;
             case '3'://批量手动添加
                 this.manualImport()
@@ -187,8 +238,39 @@ export default {
         )
     },
     //删除
-    remove(row){
-
+    remove(scope){
+        var row = scope.row
+        var index = scope.$index
+        var ids=[row.id]
+        this.$confirm('确认删除本条数据吗?', '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+            this.$api.deleteCompareLiterature(ids).then(response=>{
+                if(response.code == 200){
+                    this.$message('删除成功')
+                    this.deleteUpdateOrder(index)
+                }
+            }).catch(error=>{
+                this.$message.error('删除失败')
+            })
+        })
+        
+    },
+    //删除后更新排序
+    deleteUpdateOrder(index){
+        var data = []
+        for(var i = index+1;i<this.tableData.length;i++){
+            var order = this.tableData[i].sysOrder
+            data.push(
+                {
+                    id:this.tableData[i].id,
+                    sysOrder:Number(order) - 1
+                }
+            )
+        }
+        this.updateLiteratureOrder(data)
     },
     //编辑
     edit(row){

+ 5 - 2
src/views/report/InvalidResponse/components/Evidence/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="height_100">
-    <evidence :projectId="projectId"></evidence>
+    <evidence :projectId="projectId" :reportType="reportType"></evidence>
   </div>
 </template>
 
@@ -19,7 +19,10 @@ export default {
   computed: {
     projectId(){
         return this.$route.query.projectId
-    }
+    },
+    reportType(){
+        return this.$route.query.reportType
+    },
   },
   created() {},
   mounted() {},

+ 15 - 6
src/views/report/InvalidResponse/components/ManualImport/manualImport.vue

@@ -82,8 +82,10 @@
                     <template slot-scope="scope">
                         <div class="caozuo">
                             <el-upload
+                                v-if="scope.row.type == 1"
                                 class="margin-right_10"
                                 action="#"
+                                :show-file-list="false"
                                 :auto-upload="false"
                                 :limit="1"
                                 :on-change="(file,fileList)=>upload(file,fileList,scope.row)"
@@ -124,11 +126,11 @@ export default {
   },
   methods: {
     //获取已添加的证据文献
-    getEvidence(){
+    async getEvidence(){
         var params = {
             projectId:this.projectId
         }
-        this.$api.queryCompareLiterature(params).then(response=>{
+        await this.$api.queryCompareLiterature(params).then(response=>{
             if(response.code == 200){
                 this.evidences = response.data.data.sort((a,b)=>{
                     return a.sysOrder - b.sysOrder
@@ -143,16 +145,16 @@ export default {
      * @param {*} row 
      */
     check(row){
-        var num = row.order.replace(/[^d]/g, "");
+        var num = row.order.replace(/[^0-9]/g, "");
         var data = this.evidences.concat(this.tableData)
         var index = data.findIndex(item=>{
             return item.sysOrder == num && item.order!=row.order
         })
-        if(index != -1){
+        if(index == -1){
             row.sysOrder = num
         }else{
             this.$message.warning('已存在该序号文献!')
-            row.order = `D${row.sysOrder}`
+            this.$set(row,'order',`D${row.sysOrder}`)
         }
     },
     //移除
@@ -167,7 +169,7 @@ export default {
         formData.append('files',file.raw)
         this.$api.uploadFile(formData).then(response=>{
             if(response.code == 200){
-                row.fileGuid = response.data[0]
+                row.literatureNo = response.data[0]
             }
         })
     },
@@ -198,6 +200,13 @@ export default {
         var data = this.tableData.filter(item=>{
             return item.name
         })
+        for(var i = 0;i<data.length;i++){
+            if(data[i].name){
+                if(data[i].type == 0){
+                    data[i].literatureNo = data[i].name
+                }
+            }
+        }
         var params = {
             updateBatchLiteratureDTOs:data,
             projectId:this.projectId

+ 42 - 0
src/views/report/InvalidResponse/components/dialog/CourtOpinion.vue

@@ -0,0 +1,42 @@
+<template>
+  <div>
+    <el-dialog  :title="title" :visible.sync="showDialog" width="1000px" :close-on-click-modal="false"  :before-close="handleClose" append-to-body>
+        <span slot="footer" class="dialog-footer">
+          <el-button @click="handleClose">取 消</el-button>
+          <el-button type="primary" :loading="btnLoading" @click="submit" >确 定</el-button>
+        </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  components: {},
+  props: {
+    projectId:{
+        default:0
+    }
+  },
+  data() {
+    return {
+        title:'添加法院意见',
+        showDialog:false,
+        btnLoading:false,
+    };
+  },
+  watch: {},
+  computed: {},
+  created() {},
+  mounted() {},
+  methods: {
+    open(){
+        this.showDialog = true
+    },
+    handleClose(){
+        this.showDialog = false
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 161 - 0
src/views/report/InvalidResponse/components/dialog/ReviewCommittee.vue

@@ -0,0 +1,161 @@
+<template>
+  <div>
+    <el-dialog  :title="title" :visible.sync="showDialog" width="1000px" :close-on-click-modal="false"  :before-close="handleClose" append-to-body>
+        <div style="margin-bottom:10px" v-if="radio != 3">
+            <el-radio-group v-model="radio" @input="change">
+                <el-radio label="4">第一次法院意见</el-radio>
+                <el-radio label="6">第二次法院意见</el-radio>
+            </el-radio-group>
+        </div>
+        <div style="height:calc(100vh - 350px)" v-DivHeight="getDivHeight">
+            <el-table v-loading="loading" :data="tableData" :maxHeight="tableHeight - 50" border :header-cell-style="{'text-align':'center'}" style="width: 100%">
+                <el-table-column prop="sysOrder"  label="序号" width="100" align="center">
+                    <template slot-scope="scope">
+                        <div>
+                            权要{{ scope.row.sysOrder+1 }}
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="content" label="原权要内容" > 
+                    <template slot-scope="scope">
+                        <div>
+                            <span>{{ scope.row.content }}</span> 
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="content" label="第一次修改说明" > 
+                    <template slot-scope="scope">
+                        <div>
+                            <span>{{ scope.row.content }}</span> 
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="content" label="第二次修改说明" > 
+                    <template slot-scope="scope">
+                        <div>
+                            <span>{{ scope.row.content }}</span> 
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="content" :label="column.label" > 
+                    <template slot-scope="scope">
+                        <div>
+                            <span>
+                                <el-select v-model="scope.row[column.value]"  placeholder="请选择">
+                                    <el-option label="维持有效"  value="维持有效"></el-option>
+                                    <el-option label="部分有效"  value="部分有效"></el-option>
+                                    <el-option label="无效"  value="无效"></el-option>
+                                </el-select>
+                            </span> 
+                        </div>
+                    </template>
+                </el-table-column>
+            </el-table>
+        </div>
+        <span slot="footer" class="dialog-footer">
+          <el-button @click="handleClose">取 消</el-button>
+          <el-button type="primary" :loading="btnLoading" @click="submit" >确 定</el-button>
+        </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { getTableHeight } from '@/views/components/mixins'
+export default {
+  components: {},
+  mixins:[getTableHeight],
+  props: {
+    projectId:{
+        default:0
+    }
+  },
+  data() {
+    return {
+        title:'添加复审委决定',
+        showDialog:false,
+        loading:false,
+        btnLoading:false,
+        tableData:[],
+        column:{},
+        radio:'4'
+    };
+  },
+  watch: {},
+  computed: {},
+  created() {},
+  mounted() {
+    // this.getClaims()
+  },
+  methods: {
+    // getClaims(){
+    //     var params = {
+    //         projectId:this.projectId
+    //     }
+    //     this.loading = true
+    //     this.$api.queryClaim(params).then(response=>{
+    //         if(response.code == 200){
+    //             this.tableData = response.data.data
+    //             this.loading = false
+    //         }
+    //     }).catch(error=>{
+    //         this.tableData = []
+    //         this.loading = false
+    //     })
+    // },
+    change(val){
+        if(val == '4'){
+            this.column.label='一审法院决定'
+            this.column.value = 'courtDecision1'
+        }else{
+            this.column.label='二审法院决定'
+            this.column.value = 'courtDecision2'
+        }
+    },
+    open(type,claims){
+        this.radio = type
+        this.tableData = claims
+        var types = {
+            3:{
+                value:'rbDecision',
+                label:'复审委决定'
+            },
+            4:{
+                value:'courtDecision1',
+                label:'一审法院决定'
+            }
+        }
+        this.column = types[type]
+        this.showDialog = true
+    },
+    handleClose(){
+        this.showDialog = false
+    },
+    submit(){
+        var params = this.tableData.map(item=>{
+            return {
+                claimId:item.id,
+                domainFieldDTOs:[
+                    {
+                        field:this.column.value ,
+                        value:item[this.column.value]
+                    }
+                ]
+            }
+        })
+        this.btnLoading = true
+        this.$api.updatePatentClaimMessage(params).then(response=>{
+            if(response.code == 200){
+                this.$emit('save',true)
+                this.handleClose()
+                this.btnLoading = false
+            }
+        }).catch(error=>{
+            this.btnLoading = false
+        })
+    }
+  },
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 174 - 0
src/views/report/InvalidResponse/components/dialog/addAndEditPicture.vue

@@ -0,0 +1,174 @@
+<template>
+  <div>
+    <el-dialog  :title="title" :visible.sync="showDialog" width="1000px" :close-on-click-modal="false"  :before-close="handleClose" append-to-body>
+        <el-form :model="form"  ref="form" label-width="80px" label-position="left">
+            <el-form-item label="附图" prop="fileGuid">
+                <el-upload ref="upload" action="#" :auto-upload="false" :on-change="change" list-type="picture"
+                    :show-file-list="false">
+                    <span style="display:flex;flex-direction:row;flex-wrap:wrap;">
+                        <span class="avatar" v-if="form.fileGuid"
+                            style="margin-left:10px">
+                            <span class="deleteImg">
+                            <span>
+                                <i class="el-icon-zoom-in" @click.stop="handlePictureCardPreview()"></i>
+                                <i class="el-icon-delete" @click.stop="handleRemove()"></i>
+                            </span>
+                            </span>
+                            <el-image ref="image" class="img" :src="$commonJS.checkViewer(form.fileGuid)" :preview-src-list="[$commonJS.checkViewer(form.fileGuid)]"></el-image>
+                        </span>
+                        <i class="el-icon-plus avatar-uploader-icon" v-if="!form.fileGuid"></i>
+                    </span>
+                </el-upload>
+            </el-form-item>
+            <el-form-item label="附图标题" prop="figureTitle">
+                <el-input v-model="form.figureTitle" placeholder="请输入附图标题"></el-input>
+            </el-form-item>
+            <el-form-item label="附图说明" prop="description">
+                <el-input v-model="form.description" placeholder="请输入附图说明"></el-input>
+            </el-form-item>
+        </el-form>
+        <span slot="footer" class="dialog-footer">
+          <el-button @click="handleClose">取 消</el-button>
+          <el-button type="primary" :loading="btnLoading" @click="submit" >确 定</el-button>
+        </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  components: {},
+  props: {
+    projectId:{
+        default:0
+    }
+  },
+  data() {
+    return {
+        title:'',
+        showDialog:false,
+        form:{},
+        btnLoading:false,
+    };
+  },
+  watch: {},
+  computed: {},
+  created() {},
+  mounted() {},
+  methods: {
+    open(form){
+        this.form = JSON.parse(JSON.stringify(form))
+        if(this.form.id){
+            this.title = '编辑附图'
+        }else{
+            this.title = '新增附图'
+        }
+        this.showDialog = true
+    },
+    handleClose(){
+        this.showDialog = false
+    },
+    submit(){
+        this.$refs.form.validate((valid) => {
+          if (valid) {
+            this.btnLoading = true
+            var a = ''
+            if(this.form.id){
+                a = '编辑'
+            }else{
+                a = '新增'
+            }
+            this.form.projectId=this.projectId
+            this.$api.updateProjectFigure(this.form).then(response=>{
+                if(response.code == 200){
+                    this.$message.success(`${a}附图成功`)
+                    this.handleClose()
+                    this.btnLoading = false
+                    this.$emit('save',true)
+                }
+            }).catch(error=>{
+                this.$message.error(`${a}附图失败`)
+                this.btnLoading = false
+            })
+          }
+        })
+    },
+    //文件上传
+    change(file,fileList){
+        let formData = new FormData()
+        formData.append('sourceId',this.$constants.sourceId)
+        formData.append('files',file.raw)
+        this.$api.uploadFile(formData).then(response=>{
+            if(response.code == 200){
+                this.$set(this.form,'fileGuid',response.data[0])
+            }
+        })
+    },
+    handleRemove() {
+        this.$set(this.form,'fileGuid','')
+    },
+    handlePictureCardPreview() {
+        this.$refs.image.showViewer = true
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+.avatar-uploader-icon {
+  background-color: #fbfdff;
+  border: 1px dashed #c0ccda;
+  font-size: 28px;
+  color: #8c939d;
+  width: 148px;
+  height: 148px;
+  line-height: 148px;
+  text-align: center;
+}
+
+.avatar {
+  position: relative;
+  width: 148px;
+  height: 148px;
+  display: block;
+}
+
+.avatar:hover .deleteImg {
+  display: block;
+}
+
+.deleteImg {
+  display: none;
+  font-size: 30px;
+  width: 148px;
+  height: 148px;
+  background-color: black;
+  opacity: 0.6;
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 0;
+  margin: auto;
+  z-index: 999;
+}
+
+.avatar .img {
+  width: 148px;
+  height: 148px;
+}
+
+.deleteImg span i {
+  margin-left: 10px;
+  color: #fff;
+}
+
+.deleteImg span {
+  display: flex;
+  align-items: center;
+  /*垂直居中*/
+  justify-content: center;
+  /*水平居中*/
+  width: 100%;
+  height: 100%;
+}
+</style>

+ 459 - 0
src/views/report/InvalidResponse/components/dialog/addEvidenceReason.vue

@@ -0,0 +1,459 @@
+<template>
+  <div>
+    <el-dialog  :title="title" :visible.sync="showDialog" width="1000px" :close-on-click-modal="false"  :before-close="handleClose" append-to-body>
+        <el-form :model="form"  ref="form" label-width="80px" label-position="left">
+            <template v-if="['5','4','8'].indexOf(form.statutesId) ==-1">
+                <el-form-item label="权利要求" prop="claimSort">
+                    权要{{ form.claimSort+1 }}
+                </el-form-item>
+                <el-form-item label="权利内容" prop="claimText">
+                    {{ form.claimText}}
+                </el-form-item>
+            </template>
+           
+            <el-form-item label="无效理由" prop="statutesContent">
+                {{ form.statutesContent }}
+            </el-form-item>
+            <el-form-item label="证据组合" prop="proofGroupDescription">
+                <div v-if="['2','3','4','8'].indexOf(form.statutesId) !=-1">
+                    <div v-if="editProofGroupDescription" style="display:flex;align-items:center;">
+                        <el-input type="textarea" style="width:100%" v-model="descriptions"></el-input>
+                        <el-button type="primary" class="margin-left_10" icon="el-icon-check" circle style="font-size:15px" @click="submitContents()"></el-button>
+                        <el-button type="primary" class="margin-left_10" icon="iconfont icon-fanhui" circle style="font-size:15px" @click="cancelContents()"></el-button>
+                    </div>
+                    <div v-else>
+                        {{ form.proofGroupDescription }}
+                        <span @click="editContents()" ><el-link type="primary"><i class="iconfont icon-bianji" style="font-size:28px"></i></el-link></span>
+                    </div>
+                </div>
+                <div v-else>
+                    {{ form.proofGroupDescription }}
+                </div>
+                
+                
+            </el-form-item>
+            <div>
+                <div  style="display:flex;justify-content:space-between;padding-bottom:10px">
+                    <div>无效证据</div>
+                    <div v-if="!ifSecondInvalid">
+                        <el-button type="primary" size="small" @click="featuresHistory" v-if="['4','8'].indexOf(form.statutesId) ==-1">特征拆分历史</el-button>
+                        <el-button type="primary" size="small" @click="splitClaim" v-if="['4','8'].indexOf(form.statutesId) ==-1">自动拆分</el-button>
+                        <el-button type="primary" size="small" @click="addFeature">添加特征</el-button>
+                    </div>
+                </div>
+                <div style="width:100%">
+                   <el-table :data="features" border style="width: 100%" :span-method="objectSpanMethod" :header-cell-style="{'text-align':'center'}">
+                        <el-table-column prop="featureOrder" label="特征" width="120" align="center">
+                            <template slot-scope="scope">
+                                <div>
+                                    特征{{scope.row.featureOrder}}
+                                </div>
+                            </template>
+                        </el-table-column>
+                        <el-table-column prop="featureOrder" label="特征内容" >
+                            <template slot-scope="scope">
+                                <div v-if="['4','8'].indexOf(form.statutesId) ==-1">
+                                   <div v-if="!ifSecondInvalid">
+                                        <el-input type="textarea" autosize v-model="scope.row.featureText" @blur="change(scope.row)"></el-input>
+                                    </div>
+                                    <div v-else>
+                                        <span :class="getFeatureDel(scope.row)?'del':''">{{ scope.row.featureText }}</span> 
+                                    </div> 
+                                </div>
+                                <div v-else>
+                                    <el-button type="text" size="small" @click="addImage(scope)" v-if="!scope.row.featureText">选择附图</el-button>
+                                    <div v-else style="display:flex;align-items:center">
+                                        <el-image class="img" :src="$commonJS.checkViewer(scope.row.featureText)" :preview-src-list="[$commonJS.checkViewer(scope.row.featureText)]"></el-image>
+                                        <el-button type="text" size="small" @click="delImage(scope.row)"><i class="el-icon-delete" style="font-size:20px"></i></el-button>
+                                    </div>
+                                </div>
+                            </template>
+                        </el-table-column>
+                        <el-table-column prop="literatureId" label="无效证据" v-if="['2','3','4','8'].indexOf(form.statutesId) !=-1">
+                            <template slot-scope="scope" v-if="!getFeatureDel(scope.row)">
+                                <div style="display:flex;align-items:center">
+                                    <el-select v-model="scope.row.literatureId" multiple placeholder="请选择">
+                                        <el-option v-for="item in evidenceList" :key="item.id" :label="`D${item.sysOrder}`" :value="item.id"></el-option>
+                                        <el-option label="公知常识" :value="0"></el-option>
+                                        <el-option label="惯用手段" :value="-1"></el-option>
+                                    </el-select>
+                                    <el-button type="text" size="small" @click="delEvidence(scope)"><i class="el-icon-delete" style="font-size:20px"></i></el-button>
+                                </div>
+                            </template>
+                        </el-table-column>
+                        <el-table-column prop="evidenceText" label="无效证据详情" >
+                            <template slot-scope="scope" v-if="!getFeatureDel(scope.row)">
+                                <div>
+                                    <my-RichText v-model="scope.row.evidenceText" placeholder="请输入"></my-RichText>
+                                </div>
+                            </template>
+                        </el-table-column>
+                        <el-table-column prop="evidenceDescription" label="说明">
+                            <template slot-scope="scope" v-if="!getFeatureDel(scope.row)">
+                                <div>
+                                    <el-input type="textarea" autosize v-model="scope.row.evidenceDescription" placeholder="请输入"></el-input>
+                                </div>
+                            </template>
+                        </el-table-column>
+                        <el-table-column label="操作" prop="featureOrder" width="150" align="center">
+                            <template slot-scope="scope">
+                                <div>
+                                    <el-button type="text" size="small" @click="addEvidence(scope.row)">添加无效证据</el-button>
+                                    <el-button type="text" size="small" @click="chooseHistory(scope.row)">选择历史无效证据</el-button>
+                                    <el-button type="text" size="small" @click="dele(scope)">删除</el-button>
+                                </div>
+                            </template>
+                        </el-table-column>
+                   </el-table>
+                </div>
+            </div>
+        </el-form>
+        <span slot="footer" class="dialog-footer">
+          <el-button @click="handleClose">取 消</el-button>
+          <el-button type="primary" :loading="btnLoading" @click="submit" >确 定</el-button>
+        </span>
+    </el-dialog>
+
+    <invalid-History ref="invalidHistory" @invalidHistory="getInvalidHistory"></invalid-History>
+    <features-History ref="featuresHistory"  @feature="getFeature"></features-History>
+    <pictureManageDialog ref="pictureManageDialog" :projectId="projectId" @check="getPicture"></pictureManageDialog>
+  </div>
+</template>
+
+<script>
+import invalidHistory from './invalidHistory.vue';
+import featuresHistory from './featuresHistory.vue';
+import pictureManageDialog from '../pictureManage/pictureManageDialog.vue';
+export default {
+  components: {
+    invalidHistory,
+    featuresHistory,
+    pictureManageDialog
+  },
+  props: {
+    projectId:{
+        default:0
+    },
+    ifSecondInvalid:{
+        default:false
+    }
+  },
+  data() {
+    return {
+        showDialog:false,
+        btnLoading:false,
+        form:{},
+        title:'添加无效证据',
+        features:[],
+        evidenceList:[],
+        // 计算表格合并行的数量
+        mergeObj: {},
+        // 表格合并行的栏位
+        mergeArr: ['featureOrder',],
+        row:{},
+        descriptions:'',
+        editProofGroupDescription:false,
+    };
+  },
+  watch: {},
+  computed: {
+    provisions(){
+        return this.$store.state.dictMessage.dictMessage.STATUTE || []
+    }
+  },
+  created() {},
+  mounted() {
+    this.getEvidenceList()
+  },
+  methods: {
+    //选择附图
+    addImage(scope){
+        var index = scope.$index
+        var data = {
+            index : index
+        }
+        this.$refs.pictureManageDialog.open(data)
+    },
+    //删除图片
+    delImage(row){
+        this.$set(row,'featureText','')
+        
+    },
+    //获取选择的图片
+    getPicture(val){
+        var index = val.index
+        var data = val.check
+        var order = this.features[index].featureOrder
+        var tableData = []
+        data.forEach(item=>{
+            tableData.push(
+                {
+                    featureText:item,
+                    featureOrder:order
+                }
+            )
+            order = Number(order) + 1
+        })
+        this.features.splice(index,1,...tableData)
+        var feature = JSON.parse(JSON.stringify( this.features))
+        this.features = feature
+        this.getSpanArr(this.features)
+    },
+    //是否有删除特征
+    getFeatureDel(row){
+        if(!row.featureHistories){
+            return false
+        }
+        return row.featureHistories.find(item=>{
+            return item.operateMode == 1
+        })
+    },
+    //编辑证据组合描述
+    editContents(){
+        this.$set(this,'editProofGroupDescription',true)
+        this.$set(this,'descriptions',this.form.proofGroupDescription)
+    },
+    //取消编辑证据组合描述
+    cancelContents(){
+        this.$set(this,'editProofGroupDescription',false)
+    },
+    //提交证据组合描述
+    submitContents(){
+        var params = {
+            projectId:this.projectId,
+            statutesId:this.form.statutesId,
+            claimId:this.form.claimId,
+            descriptions:[this.descriptions],
+            id:this.form.groupId,
+        }
+        this.$api.addProofGroup(params).then(response=>{
+            if(response.code == 200){
+                this.cancelContents()
+                this.$set(this.form,'proofGroupDescription',this.descriptions)
+            }
+        }).catch(error=>{
+        })
+    },
+
+   getEvidenceList(){
+        var params ={
+            projectId:this.projectId
+        }
+        this.$api.queryCompareLiterature(params).then(response=>{
+            if(response.code == 200){
+                this.evidenceList = response.data.data.sort((a,b)=>{
+                    return a.sysOrder - b.sysOrder
+                })
+            }
+        }).catch(error=>{
+            this.evidenceList = []
+        })
+   },
+    //打开弹窗
+    open(form,feature){
+        this.form = form
+        this.features = feature || []
+        this.getSpanArr(this.features)
+        this.showDialog = true
+    },
+    //关闭弹窗
+    handleClose(){
+        this.showDialog = false
+    },
+    //提交
+    submit(){
+        this.$refs.form.validate((valid) => {
+          if (valid) {
+            this.btnLoading = true
+            var params = {
+                groupId:this.form.groupId,
+                evidenceReasonList:this.features,
+                gen:this.ifSecondInvalid?'1':'0'
+            }
+            this.$api.addEvidenceReason(params).then(response=>{
+                if(response.code == 200){
+                    this.$message('添加成功')
+                    this.$emit('save',true)
+                    this.btnLoading = false
+                    this.handleClose()
+                }
+            }).catch(error=>{
+                this.$message.error('添加失败')
+                this.btnLoading = false
+            })
+          }
+        })
+    },
+    //修改特征
+    change(row){
+        row.featureId = null
+    },
+    dele(scope){
+        var index = scope.$index
+        var row = scope.row
+        var num = this.features.filter(item=>{
+            return item.featureOrder == row.featureOrder
+        }).length
+        this.features.splice(index,num)
+        for(var i = index;i<this.features.length;i++){
+            var order = this.features[i].featureOrder
+            this.features[i].featureOrder = Number(order) - 1
+        }
+        var feature = JSON.parse(JSON.stringify( this.features))
+        this.features = feature
+        this.getSpanArr(this.features)
+    },
+    //删除某个特征的证据
+    delEvidence(scope){
+        var index = scope.$index
+        var row = scope.row
+        var num = this.features.filter(item=>{
+            return item.featureOrder == row.featureOrder
+        }).length
+        if(num == 1){
+            this.$set(row,'literatureId',[])
+        }else{
+            this.features.splice(index,1)
+            var feature = JSON.parse(JSON.stringify( this.features))
+            this.features = feature
+            this.getSpanArr(this.features)
+        }
+
+    },
+    //自动拆分特征
+    splitClaim(){
+        var claim = this.form.claimText
+        var arr = claim.match(/\S*?([,|,|;|;|。])/g)
+        var data = []
+        arr.forEach((item,index)=>{
+            var obj = {
+                featureOrder:index+1,
+                featureText:item,
+                literatureId:[]
+            }
+            data.push(obj)
+        })
+        this.features = data
+        this.getSpanArr(this.features)
+    },
+    //添加特征
+    addFeature(){
+        var order = 0
+        if(this.features.length>0){
+            order = this.features[this.features.length - 1].featureOrder
+        }
+        var obj = {
+            featureOrder:Number(order) + 1,
+            literatureId:[]
+        }
+        this.features.push(obj)
+        this.getSpanArr(this.features)
+    },
+    //特征拆分历史
+    featuresHistory(){
+        this.$refs.featuresHistory.open(this.form.claimId)
+    },
+    //获取特征历史的值
+    getFeature(val){
+        this.features = val
+        this.getSpanArr(this.features)
+    },
+    //选择历史无效记录
+    chooseHistory(row){
+        this.row = row
+        if(row.featureId){
+            this.$refs.invalidHistory.open(row.featureId)
+        }else{
+            this.$message.warning('该特征无历史无效记录')
+        }
+    },
+    //获取历史无效记录的值
+    getInvalidHistory(data){
+        if(data.length == 0){
+            return false
+        }
+        var index = this.features.findLastIndex(item=>{
+            return item.featureOrder == this.row.featureOrder
+        })
+        var obj = {
+            featureId: this.row.featureId,
+            featureOrder : this.row.featureOrder,
+            featureText : this.row.featureText,
+        }
+        var features = []
+        for(var i = 0;i<data.length;i++){
+            var obj2 = {
+                ...obj,
+                ...data[i],
+                literatureId:data[i].literatures.map(item=>item.id)
+            }
+            features.push(obj2)
+        }
+        if(this.features[index].literatureId && this.features[index].literatureId.length>0){
+            this.features.splice(index+1,0,...features)
+        }else{
+            this.features.splice(index,1,...features)
+        }
+        
+        var feature = JSON.parse(JSON.stringify( this.features))
+        this.features = feature
+        this.getSpanArr(this.features)
+    },
+    //添加无效证据
+    addEvidence(row){
+        var index = this.features.findLastIndex(item=>{
+            return item.featureOrder == row.featureOrder
+        })
+        var obj = {
+            featureId: row.featureId,
+            featureOrder : row.featureOrder,
+            featureText : row.featureText,
+            literatureId:[]
+        }
+        this.features.splice(index+1,0,obj)
+        var feature = JSON.parse(JSON.stringify( this.features))
+        this.features = feature
+        this.getSpanArr(this.features)
+    },
+      //获取每个元素所需合并的行数
+    getSpanArr(data) {
+        this.scopeRow = []
+        this.mergeArr.forEach((key, index1) => {
+        let count = 0;
+        this.mergeObj[key] = [];
+        data.forEach((item, index) => {
+            if (index === 0) {
+            this.mergeObj[key].push(1);
+            } else {
+            if (item[key] === data[index - 1][key]) {
+                this.mergeObj[key][count] += 1;
+                this.mergeObj[key].push(0);
+            } else {
+                count = index;
+                this.mergeObj[key].push(1);
+            }
+            }
+        })
+        })
+    },
+        // 表格合并行
+    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
+        if (!row) {
+        return false
+        }
+
+        if (this.mergeArr.indexOf(column.property) !== -1) {
+
+        if (this.mergeObj[column.property][rowIndex]) {
+            return [this.mergeObj[column.property][rowIndex], 1]
+        } else {
+            return [0, 0];
+        }
+
+        }
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 74 - 0
src/views/report/InvalidResponse/components/dialog/addFeature.vue

@@ -0,0 +1,74 @@
+<template>
+  <div>
+    <el-dialog  :title="title" :visible.sync="showDialog" width="1000px" :close-on-click-modal="false"  :before-close="handleClose" append-to-body>
+        <el-form :model="form"  ref="form" label-width="80px" label-position="left">
+            <el-form-item label="特征内容" prop="featureText">
+                <el-input type="textarea" autosize v-model="form.featureText" placeholder="请输入特征内容"></el-input>
+            </el-form-item>
+            <el-form-item label="说明" prop="common">
+                <el-input type="textarea" autosize v-model="form.common" placeholder="请输入说明"></el-input>
+            </el-form-item>
+        </el-form>
+        <span slot="footer" class="dialog-footer">
+          <el-button @click="handleClose">取 消</el-button>
+          <el-button type="primary" :loading="btnLoading" @click="submit" >确 定</el-button>
+        </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  components: {},
+  props: {
+    projectId:{
+        default:0
+    },
+    ifSecondInvalid:{
+        default:false
+    }
+  },
+  data() {
+    return {
+        title:'添加特征',
+        showDialog:false,
+        form:{},
+        btnLoading:false
+    };
+  },
+  watch: {},
+  computed: {},
+  created() {},
+  mounted() {},
+  methods: {
+    open(form){
+        this.form = form
+        this.showDialog = true
+    },
+    handleClose(){
+        this.showDialog = false
+    },
+    submit(){
+        this.$refs.form.validate((valid) => {
+          if (valid) {
+            this.btnLoading = true
+            this.form.gen = this.ifSecondInvalid?2:1,
+            this.$api.addFeatureGroupBatch(this.form).then(response=>{
+                if(response.code == 200){
+                    this.$message.success('特征添加成功')
+                    this.$emit('save',true)
+                    this.handleClose()
+                    this.btnLoading = false
+                }
+            }).catch(error=>{
+                this.$message.error('特征添加失败')
+                this.btnLoading = false
+            })
+          }
+        })
+    }
+  },
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 136 - 11
src/views/report/InvalidResponse/components/dialog/addInvalidResponse.vue

@@ -2,7 +2,7 @@
   <div>
     <el-dialog  :title="title" :visible.sync="showDialog" width="600px" :close-on-click-modal="false"  :before-close="handleClose" append-to-body>
         <el-form :model="form" :rules="rules" ref="form" label-width="80px" label-position="left">
-            <template v-if="type == 1">
+            <template  v-if="type == 1">
                 <div>
                     <el-form-item  label="无效理由" prop="name">
                         <el-select v-model="form.statutesId" placeholder="请选择" style="width:100%">
@@ -15,17 +15,65 @@
                             </el-option>
                         </el-select>
                     </el-form-item>
-                    <el-form-item  label="权要" prop="name">
+                    <el-form-item v-if="['5','4','8'].indexOf(form.statutesId) !=-1" label="涉及内容" prop="name">
+                        <div v-if="form.statutesId == 5">说明书</div>
+                        <div v-else>附图</div>
+                    </el-form-item>
+                    <el-form-item v-else label="权要" prop="name">
                         <el-select v-model="form.claimIds" multiple placeholder="请选择" style="width:100%">
                             <el-option
                                 v-for="item in claims"
                                 :key="item.sysOrder"
                                 :label="`权要${Number(item.sysOrder)+1}`"
-                                :value="item.sysOrder+''"
+                                :value="item.id"
+                            >
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+                </div>
+            </template>
+            <template v-if="type == 2">
+                <div>
+                    <el-form-item  label="无效理由" prop="name">
+                        <el-select v-model="form.statutesId" @change="changeStatutes" placeholder="请选择" style="width:100%">
+                            <el-option
+                                v-for="item in provisions"
+                                :key="item.value"
+                                :label="item.label"
+                                :value="item.value"
                             >
                             </el-option>
                         </el-select>
                     </el-form-item>
+                    <el-form-item v-if="['5','4','8'].indexOf(form.statutesId) ==-1" label="权要" prop="name">
+                        <el-select v-model="form.claimId" placeholder="请选择" style="width:100%">
+                            <el-option
+                                v-for="item in hasClaims"
+                                :key="item.claimSort"
+                                :label="`权要${Number(item.claimSort)+1}`"
+                                :value="item.claimId"
+                            >
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+                    <div class="proofGroup">
+                        <div style="display:flex;justify-content:space-between;padding-bottom:10px">
+                            <div>证据组合</div>
+                            <div>
+                                <el-button type="primary" size="small" @click="add">添加</el-button>
+                            </div>
+                        </div>
+                        <div style="width:100%">
+                            <table class="table">
+                                <tr v-for="item in form.proofGroups" :key="item.sysOrder">
+                                    <td>组合{{ item.sysOrder }}</td>
+                                    <td>
+                                        <el-input type="textarea" style="width:100%" v-model="item.descriptions"></el-input>
+                                    </td>
+                                </tr>
+                            </table>
+                        </div>
+                    </div>
                 </div>
             </template>
         </el-form>
@@ -44,6 +92,11 @@ export default {
   props: {
     projectId:{
         default:0
+    },
+    tableData:{
+        default:()=>{
+            return []
+        }
     }
   },
   data() {
@@ -55,6 +108,7 @@ export default {
         claims:[],
         rules:{},
         btnLoading:false,
+        hasClaims:[]
     };
   },
   watch: {},
@@ -65,9 +119,33 @@ export default {
   },
   created() {},
   mounted() {
-    this.getClaims()
+    // this.getClaims()
   },
   methods: {
+    
+    //切换无效法条
+    changeStatutes(val){
+        var obj = {}
+        for(var i =0;i<this.tableData.length;i++){
+            if(this.tableData[i].statutesId == val){
+                obj[this.tableData[i].claimSort] = this.tableData[i]
+            }
+        }
+        this.hasClaims = Object.values(obj)
+    },
+    //添加证据组合
+    add(){
+        var order = 0
+        if(this.form.proofGroups && this.form.proofGroups.length>0){
+            order = this.form.proofGroups[this.form.proofGroups.length-1].sysOrder
+        }
+        this.form.proofGroups.push(
+            {
+                sysOrder:Number(order) + 1,
+                content:''
+            }
+        )
+    },
     //获取权要
     getClaims(){
         var params = {
@@ -82,10 +160,11 @@ export default {
         })
     },
     //打开弹窗
-    open(type,title,data){
+    open(type,title,data,claims){
         this.type = type
         this.title = title
         this.form = data
+        this.claims = claims
         this.showDialog = true
     },
     //关闭弹窗
@@ -94,16 +173,31 @@ export default {
     },
     //提交
     submit(){
-        this.btnLoading = true
-        switch(this.type){
-            case '1':
-                this.addInvalidStatutes()
-                break;
-        }
+        this.$refs.form.validate((valid) => {
+          if (valid) {
+            this.btnLoading = true
+            switch(this.type){
+                case '1':
+                    this.addInvalidStatutes()
+                    break;
+                case '2':
+                    this.addProofGroup()
+                    break;
+            }
+          }
+        })
+        
     },
     //添加无效理由
     addInvalidStatutes(){
         this.form.projectId = this.projectId
+        if(this.form.statutesId == 5){
+            this.form.relatedContent = 0
+        }else if(this.form.statutesId == 4 || this.form.statutesId == 8){
+            this.form.relatedContent = 2
+        }else{
+            this.form.relatedContent = 1
+        }
         this.$api.addInvalidStatutes(this.form).then(response=>{
             if(response.code == 200){
                 this.btnLoading = false
@@ -113,9 +207,40 @@ export default {
         }).catch(error=>{
             this.btnLoading = false
         })
+    },
+    //添加证据组合
+    addProofGroup(){
+        this.form.descriptions = this.form.proofGroups.map(item=>item.descriptions)
+        this.form.projectId = this.projectId
+        this.$api.addProofGroup(this.form).then(response=>{
+            if(response.code == 200){
+                this.btnLoading = false
+                this.handleClose()
+                this.$emit('save',true)
+            }
+        }).catch(error=>{
+            this.btnLoading = false
+        })
     }
   },
 };
 </script>
 <style lang="scss" scoped>
+.proofGroup{
+    font-family: var(--fm);
+    color: var(--color2);
+    font-weight: bold;
+}
+.table {
+  width: 100%;
+  border-top: 1px solid #ebeef5;
+  border-left: 1px solid #ebeef5;
+  border-spacing: 0;
+}
+
+.table td {
+  padding: 10px 30px;
+  border-bottom: 1px solid #ebeef5;
+  border-right: 1px solid #ebeef5;
+}
 </style>

+ 100 - 0
src/views/report/InvalidResponse/components/dialog/batchAddMessage.vue

@@ -0,0 +1,100 @@
+<template>
+  <div>
+    <el-dialog  :title="title" :visible.sync="showDialog" width="1000px" :close-on-click-modal="false"  :before-close="handleClose" append-to-body>
+        <el-form :model="form"  ref="form" label-width="80px" label-position="left">
+            <el-form-item label="内容" prop="content">
+                <div>
+                    <my-RichText v-model="form.content" placeholder="请输入内容"></my-RichText>
+                </div>
+            </el-form-item>
+            <el-form-item label="选择特征" prop="featureIds">
+                <div>
+                    <el-select v-model="form.featureIds" multiple placeholder="请选择" style="width:100%">
+                        <el-option v-for="item in features" :key="item.featureId" :label="`特征${item.featureOrder}`" :value="item.featureId"></el-option>
+                    </el-select>
+                </div>
+            </el-form-item>
+        </el-form>
+        <span slot="footer" class="dialog-footer">
+          <el-button @click="handleClose">取 消</el-button>
+          <el-button type="primary" :loading="btnLoading" @click="submit" >确 定</el-button>
+        </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  components: {},
+  props: {
+    ifSecondInvalid:{
+        default:false
+    }
+  },
+  data() {
+    return {
+        title:'批量添加',
+        showDialog:false,
+        btnLoading:false,
+        form:{},
+        features:[],
+        field:null,
+        titles:{
+            invalidReasonDetail1:'无效理由详情',
+            presentOpinions1:'答辩意见',
+            rbOpinions:'复审委意见',
+            rbDecisionKey:'复审委要点提炼',
+        }
+    };
+  },
+  watch: {},
+  computed: {},
+  created() {},
+  mounted() {},
+  methods: {
+    open(type,features){
+        this.field = type
+        this.features = features
+        var str = '批量添加'
+        this.title = str + `${this.ifSecondInvalid?'第二次':''} `+ this.titles[type]
+        this.showDialog = true
+    },
+    handleClose(){
+        this.showDialog = false
+    },
+    submit(){
+        var ids = []
+        for(var i=0;i<this.form.featureIds.length;i++){
+            var data = this.features.find(item=>{
+                return item.featureId == this.form.featureIds[i]
+            }).featureHistories.filter(item1=>{
+                if(this.ifSecondInvalid){
+                    return item1
+                }else{
+                    return item1.featureGen!=2
+                }
+                
+            })
+            var id = data[data.length-1].featureGroupId
+            ids.push(id)
+        }
+        var params = {
+            ids:ids,
+            fieldList:[{ 
+                field:this.field,
+                value:this.form.content,
+            }]
+        }
+        this.$api.updateGroupFeatureMessage(params).then(response=>{
+            if(response.code == 200){
+                this.$message.success('编辑成功')
+            }
+        }).catch(error=>{
+            this.$message.error('编辑失败')
+        })
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 266 - 0
src/views/report/InvalidResponse/components/dialog/claimAndFeatureHistory.vue

@@ -0,0 +1,266 @@
+<template>
+  <div>
+    <el-dialog  :title="title" :visible.sync="showDialog" width="1000px" :close-on-click-modal="false"  :before-close="handleClose" append-to-body>
+        <div>
+            <el-table :data="tableData" border style="width:100%">
+                <el-table-column prop="typeContent" label="修改历史"></el-table-column>
+                <el-table-column label="内容">
+                    <template slot-scope="scope">
+                        <div>
+                            <div v-if="scope.row.edit">
+                                <el-input type="textarea" autosize v-model="scope.row.content" placeholder="请输入"></el-input>
+                            </div>
+                            <div v-else>
+                                {{ scope.row.content }}
+                            </div>
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column label="说明">
+                    <template slot-scope="scope">
+                        <div>
+                            <div v-if="scope.row.edit">
+                                <el-input type="textarea" autosize v-model="scope.row.description" placeholder="请输入"></el-input>
+                            </div>
+                            <div v-else>
+                                {{ scope.row.description }}
+                            </div>
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column label="操作">
+                    <template slot-scope="scope">
+                        <div>
+                            <div v-if="scope.row.edit">
+                                <el-button type="text" size="small" @click="save(scope.row)"> 保存 </el-button>
+                                <el-button type="text" size="small" @click="cancel(scope.row)"> 取消 </el-button>
+                            </div>
+                            <div v-else>
+                                <el-button type="text" size="small" v-if="scope.$index!=0 && scope.$index==tableData.length-1" @click="edit(scope.row)"> 编辑 </el-button>
+                                <el-button type="text" size="small" v-if="scope.$index==tableData.length-1" @click="add(scope)"> 添加第{{ ifSecondInvalid?'2':'1' }}次权要修改 </el-button>
+                            </div>
+                            
+                        </div>
+                    </template>
+                </el-table-column>
+            </el-table>
+
+        </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  components: {},
+  props: {
+    ifSecondInvalid:{
+        default:false
+    }
+  },
+  data() {
+    return {
+        title:'权要修改历史',
+        showDialog:false,
+        type:null,
+        form:{},
+        tableData:[],
+        loading:false,
+    };
+  },
+  watch: {},
+  computed: {},
+  created() {},
+  mounted() {},
+  methods: {
+    open(row,type){
+        this.form = row
+        if(type == 1){
+            this.title = '权要修改历史'
+        }else if(type == 2){
+            this.title = '特征修改历史'
+        }
+        this.type = type
+        this.getData()
+        this.showDialog = true
+    },
+    handleClose(){
+        this.showDialog = false
+    },
+    //判断哪个类型
+    getData(){
+        if(this.type == 1){
+            this.queryPatentClaimHistory()
+        }else if(this.type == 2){
+            this.queryFeatureHistory()
+        }
+    },
+    //修改权利要求
+    editClaimHistory(row){
+        var api = 'alterPatentClaim'
+        var params = {
+            claimId:this.form.claimId,
+            content:row.content,
+            description:row.description,
+            ifFirst:!this.ifSecondInvalid
+        }
+        if(row.claimHistoryId){
+            api = 'editPatentClaimHistory'
+            params.patentClaimHistoryId = row.claimHistoryId
+        }
+        this.$api[api](params).then(response=>{
+            if(response.code == 200){
+                this.getData()
+                this.updateMessage()
+            }
+        }).catch(error=>{
+            
+        })
+    },
+    //查询权利要求历史
+    queryPatentClaimHistory() {
+        var params = {
+            claimId:this.form.claimId
+        }
+        this.loading = true
+        this.$api.queryPatentClaimHistory(params).then(response=>{
+            if(response.code == 200){
+                var data = response.data.data
+                var tableData = []
+                if(data.originalClaimVO){
+                    tableData.push(
+                        {
+                            claimId:data.originalClaimVO.claimId,
+                            content:data.originalClaimVO.content,
+                            description:data.originalClaimVO.comment,
+                            typeContent:'原权要'
+                        }
+                    )
+                }
+                if(data.firstClaimVO){
+                    if(data.firstClaimVO.content){
+                        tableData.push(
+                            {
+                                claimId:data.firstClaimVO.claimId,
+                                claimHistoryId:data.firstClaimVO.claimHistoryId,
+                                content:data.firstClaimVO.content,
+                                description:data.firstClaimVO.comment,
+                                typeContent:'第一次修改后的权要'
+                            }
+                        )
+                    }
+                }
+                if(data.secondClaimVO){
+                    if(data.secondClaimVO.content){
+                        tableData.push(
+                            {
+                                claimId:data.secondClaimVO.claimId,
+                                claimHistoryId:data.secondClaimVO.claimHistoryId,
+                                content:data.secondClaimVO.content,
+                                description:data.secondClaimVO.comment,
+                                typeContent:'第二次修改后的权要'
+                            }
+                        )
+                    }
+                }
+                this.tableData = tableData
+                this.loading = false
+            }
+        }).catch(error=>{
+            this.tableData = []
+            this.loading = false
+        })
+    },
+    //修改特征
+    editFeatureHistory(row){
+        var api = 'updateGroupFeature'
+        var params = {
+            featureId:row.featureId,
+            featureContent:row.content,
+            common:row.description,
+            ifFirstEdit:!this.ifSecondInvalid
+        }
+        if(row.featureGroupId){
+            api = 'updateFeature'
+        }
+        this.$api[api](params).then(response=>{
+            if(response.code == 200){
+                this.getData()
+                this.updateMessage()
+            }
+        }).catch(error=>{
+            
+        })
+    },
+    updateMessage(){
+        this.$emit('save',true)
+    },
+    //查询特征修改历史
+    queryFeatureHistory(){
+        var params = {
+            featureGroupId:this.form.featureGroupId
+        }
+        this.loading = true
+        this.$api.queryFeatureHistory(params).then(response=>{
+            if(response.code == 200){
+                var types={
+                    0:'原特征',
+                    1:'第一次修改后特征',
+                    2:'第二次修改后特征'
+                }
+                this.tableData = response.data.data.map(item=>{
+                    if(item.featureContent){
+                        return {
+                            featureId:item.featureId,
+                            content:item.featureContent,
+                            description:item.common,
+                            featureGroupId:item.featureGroupId,
+                            typeId:item.featureGen,
+                            typeContent:types[item.featureGen]
+                        }
+                    }
+                    
+                })
+                this.loading = false
+            }
+        }).catch(error=>{
+            this.tableData = []
+            this.loading = false
+        })
+    },
+    save(row){
+        if(this.type == 1){
+            this.editClaimHistory(row)
+        }else if(this.type == 2){
+            this.editFeatureHistory(row)
+        }
+    },
+    edit(row){
+        row.editContent = row
+        this.$set(row,'edit',true)
+    },
+    cancel(row){
+        row = row.editContent
+        this.$set(row,'edit',false)
+    },
+    add(scope){
+        var index = 1
+        if(this.ifSecondInvalid){
+            index = 2
+        }
+        var row = scope.row
+        var obj = {
+            featureId:row.featureId,
+            typeContent:`第${index}次修改后${this.type==1?'权要':'特征'}`,
+            content:'',
+            description:'',
+            edit:true
+        }
+        this.tableData.splice(index+1,0,obj)
+    }
+
+  },
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 4 - 1
src/views/report/InvalidResponse/components/dialog/editEvidence.vue

@@ -25,7 +25,7 @@
             <template v-else>
                 <div>
                     <el-form-item  label="专利号" prop="name">
-                        <el-input  v-model="form.name" autocomplete="off" placeholder="请输入专利号"></el-input>
+                        <el-input  v-model="form.literatureNo" autocomplete="off" placeholder="请输入专利号"></el-input>
                     </el-form-item>
                 </div>
             </template>
@@ -93,6 +93,9 @@ export default {
             this.form.projectId = this.projectId
             this.btnLoading = true
             if(this.form.id){
+                if(this.form.type == 1){
+                    this.form.literatureNo = this.form.fileGuid
+                }
                 var a = {
                     updateBatchLiteratureDTOs:[this.form],
                     projectId:this.projectId

+ 118 - 7
src/views/report/InvalidResponse/components/dialog/editFlowPath.vue

@@ -7,10 +7,13 @@
           </el-form-item>
           <template v-if="type.type==0">
             <el-form-item  label="地点">
-              <el-input  v-model="form.address" autocomplete="off" placeholder="请输入地点"></el-input>
+              <el-input  v-model="form.position" autocomplete="off" placeholder="请输入地点"></el-input>
             </el-form-item>
             <el-form-item  label="参与人">
-              <el-input  v-model="form.participants" autocomplete="off" placeholder="请输入参与人"></el-input>
+              <el-input  v-model="form.participator" autocomplete="off" placeholder="请输入参与人"></el-input>
+            </el-form-item>
+            <el-form-item  label="口审笔录描述">
+              <el-input  v-model="form.recordDescription" autocomplete="off" placeholder="请输入参与人"></el-input>
             </el-form-item>
           </template>
           <template v-if="type.type ==1">
@@ -20,6 +23,22 @@
                 </el-form-item>
             </div>
           </template>
+          <template v-if="type.type ==3">
+            <div>
+                <el-form-item label="决定书号码">
+                    <el-input v-model="form.fileNo" autocomplete="off" placeholder="请输入参与人"></el-input>
+                </el-form-item>
+                <el-form-item label="法律依据">
+                    <el-input v-model="form.legalBase" autocomplete="off" placeholder="请输入参与人"></el-input>
+                </el-form-item>
+                <el-form-item label="决定要点">
+                    <el-input v-model="form.decisionKey" autocomplete="off" placeholder="请输入参与人"></el-input>
+                </el-form-item>
+                <el-form-item label="结论">
+                    <el-input v-model="form.conclusion" autocomplete="off" placeholder="请输入参与人"></el-input>
+                </el-form-item>
+            </div>
+          </template>
           <el-form-item label="附件:">
             <template>
               <div> 
@@ -61,7 +80,7 @@
                 type:'0',
                 title:'口审记录',
                 time:'口审时间',
-                timeField:'invalidRequestDate'
+                timeField:'oralTrailTime'
             },
             1:{
                 type:'1',
@@ -73,19 +92,25 @@
                 type:'2',
                 title:'陈述意见书',
                 time:'陈述答复时间',
-                timeField:'invalidRequestDate'
+                timeField:'stateReplyTime'
             },
             3:{
                 type:'3',
                 title:'无效决定书',
                 time:'无效决定时间',
-                timeField:'invalidRequestDate'
+                timeField:'invalidDecisionTime'
             },
             4:{
                 type:'4',
                 title:'行政诉讼书',
                 time:'发起诉讼时间',
-                timeField:'invalidRequestDate'
+                timeField:'proceedingTime'
+            },
+            5:{
+                type:'5',
+                title:'行政诉讼判决书',
+                time:'法院判决时间',
+                timeField:'judgmentTime'
             },
         },
         rules: {
@@ -114,17 +139,29 @@
                     }
                     this.form.projectId = this.projectId
                     this.form.fileGuids = guids
+                    if(!this.projectId){
+                      this.$emit('save',this.form)
+                      this.handleClose()
+                      return false
+                    }
                     switch(this.type.type){
                         case '0':
+                            this.addOralTrail()
                             break;
                         case '1':
                             this.addInvalidProcess()
                             break;
                         case '2':
+                            this.addStateOpinion()
                             break;
                         case '3':
+                            this.addInvalidDecisionFile()
                             break;
                         case '4':
+                            this.addAdminProceed()
+                            break;
+                        case '5':
+                            this.addAdminProceedJudgment()
                             break;
                     }
                 } else {
@@ -148,7 +185,81 @@
             }
           }) 
         },
-
+        // 上传口审记录
+        addOralTrail() {
+          var api = ''
+          if(this.form.id){
+            api = 'updateOralTrail'
+          }else{
+            api = 'addOralTrail'
+          }
+          this.$api[api](this.form).then(response=>{
+            if(response.code == 200){
+              this.$emit('save',true)
+              this.handleClose()
+            }
+          }) 
+        },
+        // 上传无效决定书
+        addInvalidDecisionFile() {
+          var api = ''
+          if(this.form.id){
+            api = 'updateInvalidDecisionFile'
+          }else{
+            api = 'addInvalidDecisionFile'
+          }
+          this.$api[api](this.form).then(response=>{
+            if(response.code == 200){
+              this.$emit('save',true)
+              this.handleClose()
+            }
+          }) 
+        },
+        // 上传行政诉讼书
+        addAdminProceed() {
+          var api = ''
+          if(this.form.id){
+            api = 'updateAdminProceed'
+          }else{
+            api = 'addAdminProceed'
+          }
+          this.$api[api](this.form).then(response=>{
+            if(response.code == 200){
+              this.$emit('save',true)
+              this.handleClose()
+            }
+          }) 
+        },
+        // 上传行陈述意见书
+        addStateOpinion() {
+          var api = ''
+          if(this.form.id){
+            api = 'updateStateOpinion'
+          }else{
+            api = 'addStateOpinion'
+          }
+          this.$api[api](this.form).then(response=>{
+            if(response.code == 200){
+              this.$emit('save',true)
+              this.handleClose()
+            }
+          }) 
+        },
+        // 上传行陈述意见书
+        addAdminProceedJudgment() {
+          var api = ''
+          if(this.form.id){
+            api = 'updateAdminProceedJudgment'
+          }else{
+            api = 'addAdminProceedJudgment'
+          }
+          this.$api[api](this.form).then(response=>{
+            if(response.code == 200){
+              this.$emit('save',true)
+              this.handleClose()
+            }
+          }) 
+        },
         // 关闭弹窗
         handleClose() {
             this.showDialog=false

+ 92 - 0
src/views/report/InvalidResponse/components/dialog/featuresHistory.vue

@@ -0,0 +1,92 @@
+<template>
+  <div>
+    <el-dialog  :title="title" :visible.sync="showDialog" width="600px" :close-on-click-modal="false"  :before-close="handleClose" append-to-body>
+        <div class="infinite-list" style="overflow:auto;height:calc(100vh - 350px)">
+            <div v-for="(item,index) in featuresHistory" :key="index" class="infinite-list-item">
+                <div style="margin-bottom:10px;">
+                    <el-radio-group v-model="radio" @input="getFeature(item)">
+                        <el-radio :label="index">组合{{ index+1 }}</el-radio>
+                    </el-radio-group>
+                </div>
+                <div>
+                    <el-table
+                        :data="item.featureSplitContent"
+                        border
+                        style="width: 100%"
+                    >
+                        <el-table-column  prop="sysOrder" label="特征" width="180">
+                            <template slot-scope="scope">
+                                <div>
+                                    特征{{ scope.row.sysOrder }}
+                                </div>
+                            </template>
+                        </el-table-column>
+                        <el-table-column prop="featureText"  label="特征内容" ></el-table-column>
+                    </el-table>
+                </div>
+            </div>
+        </div>
+    </el-dialog>
+    
+  </div>
+</template>
+
+<script>
+export default {
+  components: {},
+  props: {},
+  data() {
+    return {
+        radio:'',
+        showDialog:false,
+        title:'特征拆分历史',
+        claimId:'',
+        featuresHistory:[]
+    };
+  },
+  watch: {},
+  computed: {},
+  created() {},
+  mounted() {},
+  methods: {
+    open(claimId){
+        this.claimId = claimId
+        this.radio = ''
+        this.getFeatureHistory()
+        this.showDialog = true
+    },
+    handleClose(){
+        this.showDialog = false
+    },
+    getFeatureHistory () {
+        if(this.featuresHistory.length>0){
+            return false
+        }
+        var params = {
+            claimId:this.claimId
+        }
+        this.$api.queryClaimSplitHistory(params).then(response=>{
+            if(response.code == 200){
+                this.featuresHistory = response.data.data
+            }
+        }).catch(error=>{
+
+        })
+    },
+    getFeature(val){
+        var data = val.featureSplitContent.map(item=>{
+            return {
+                featureId:item.id,
+                featureOrder:item.sysOrder,
+                featureText:item.featureText,
+                literatureId:[]
+            }
+        })
+        this.$emit('feature',data)
+        this.handleClose()
+    }
+  },
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 137 - 0
src/views/report/InvalidResponse/components/dialog/invalidHistory.vue

@@ -0,0 +1,137 @@
+<template>
+  <div>
+    <el-dialog  :title="title" :visible.sync="showDialog" width="600px" :close-on-click-modal="false"  :before-close="handleClose" append-to-body>
+        <div style="height:calc(100vh - 350px)">
+            <div style="height:calc(100% - 30px)">
+                <el-table :data="tableData" max-height="calc(100% - 0)" border style="width: 100%;">
+                    <el-table-column label="#" width="60" type="index" align="center">
+                        <template slot-scope="scope">
+                            <div v-if="refresh">
+                                <el-checkbox :label="scope.row.id" @change="changeSelect(scope.row)" :checked="checkList.filter(item=>{return item.id == scope.row.id}).length>0">
+                                    <span>{{ (scope.$index + 1) + ((queryParams.current - 1) * queryParams.size) }}</span>
+                                </el-checkbox>
+                            </div>
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="" label="无效证据">
+                        <template slot-scope="scope">
+                            <div>
+                                <span v-for="(item,index) in scope.row.literatures" :key="item.id">
+                                    <span v-if="item.id <= 0">{{ item.name }}</span>
+                                    <span v-else>D{{ item.sysOrder }}</span>
+                                    <span v-if="index < scope.row.literatures.length-1"> + </span>
+                                </span>
+                            </div>
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="evidenceText" label="无效证据详情">
+                        <template slot-scope="scope">
+                            <div>
+                                <div v-html="scope.row.evidenceText"></div>
+                            </div>
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="evidenceDescription" label="说明"></el-table-column>
+                </el-table>
+            </div>
+            
+            <div class="pagination">
+                <el-pagination background layout="total, sizes, prev, pager, next, jumper"
+                    :current-page.sync="queryParams.current" :page-size.sync="queryParams.size"
+                    @current-change="handleCurrentChange" @size-change="getInvalidHistory" :total="total">
+                </el-pagination>
+            </div>
+            
+        </div>
+        
+        <span slot="footer" class="dialog-footer">
+          <el-button @click="handleClose">取 消</el-button>
+          <el-button type="primary" @click="submit" >确 定</el-button>
+        </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  components: {},
+  props: {},
+  data() {
+    return {
+        title:'无效记录历史',
+        showDialog:false,
+        loading:false,
+        tableData:[],
+        checkList:[],
+        refresh:true,
+        queryParams:{
+            current:1,
+            size:10
+        },
+        total:0,
+        featureId:''
+    };
+  },
+  watch: {},
+  computed: {},
+  created() {},
+  mounted() {},
+  methods: {
+    open(featureId){
+        this.showDialog = true
+        this.featureId = featureId
+        this.checkList = []
+        this.getInvalidHistory()
+        this.refreshCheck()
+    },
+    refreshCheck(){
+        this.refresh = false
+        this.$nextTick(()=>{
+            this.refresh = true
+        })
+    },
+    handleClose(){
+        this.showDialog = false
+    },
+    changeSelect(row){
+        var index = this.checkList.findIndex(item=>{
+            return item.id == row.id
+        })
+        if(index == -1){
+            this.checkList.push(row)
+        }else{
+            this.checkList.splice(index,1)
+        }
+    },
+    //确认
+    submit(){
+        this.$emit('invalidHistory',this.checkList)
+        this.handleClose()
+    },
+    handleCurrentChange(val){
+        this.queryParams.current = val
+        this.getInvalidHistory()
+    },
+    //获取历史无效记录
+    getInvalidHistory(){
+        var params = {
+            ...this.queryParams,
+            featureId:this.featureId
+        }
+        this.loading = true
+        this.$api.queryInvalidHistory(params).then(response=>{
+            if(response.code == 200){
+                this.tableData = response.data.data
+                this.loading = false
+            }
+        }).catch(error=>{
+            this.tableData = []
+            this.loading = false
+        })
+        
+    }
+  },
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 1 - 1
src/views/report/InvalidResponse/components/draggable/index.vue

@@ -1,7 +1,7 @@
 <template>
 
     <el-popover
-        placement="top-start"
+        placement="bottom"
         title="排序"
         width="200"
         ref="draggablePopover"

+ 19 - 6
src/views/report/InvalidResponse/components/flowPath/flowPath.vue

@@ -15,6 +15,7 @@
           <el-dropdown-item command="0">添加口审记录</el-dropdown-item>
           <el-dropdown-item command="3">添加无效决定书</el-dropdown-item>
           <el-dropdown-item command="4">添加行政诉讼书</el-dropdown-item>
+          <el-dropdown-item command="5">添加行政诉讼判决书</el-dropdown-item>
         </el-dropdown-menu>
       </el-dropdown>
     </div>
@@ -23,7 +24,7 @@
         <el-timeline-item v-for="item in timelineList" :timestamp="item.occurredTime" :key="item.id" placement="top">
           <el-card>
             <div>
-              <span>{{ timeType[item.affairType] }}:</span><span>{{ item.occurredTime.slice(0,10) }}</span>
+              <span>{{ timeType[item.affairType] }}:</span><span>{{ item.occurredTime}}</span>
               <div style="float: right;">
                   <span style="margin-right: 10px;"  @click="edit(item)"><el-link>编辑</el-link></span>
                   <span  @click="dele(item)"><el-link>删除</el-link></span>
@@ -31,16 +32,22 @@
             </div>
             
             <div v-if="item.affairType==0">
-              <p><span>地点:</span><span>{{ item.oralExam.address }}</span></p>
-              <p><span>参与人:</span><span>{{ item.oralExam.participants }}</span></p>
+              <p><span>地点:</span><span>{{ item.oralTrailVO.position }}</span></p>
+              <p><span>参与人:</span><span>{{ item.oralTrailVO.participator }}</span></p>
             </div>
             <div v-if="item.affairType==1">
               <p><span>发文日:</span><span>{{ item.invalidRequestFileVO.invalidFileSendDate }}</span></p>
             </div>
+            <div v-if="item.affairType==3">
+              <p><span>决定书号码:</span><span>{{ item.invalidDecisionFileVO.fileNo }}</span></p>
+              <p><span>法律依据:</span><span>{{ item.invalidDecisionFileVO.legalBase }}</span></p>
+              <p><span>决定要点:</span><span>{{ item.invalidDecisionFileVO.decisionKey }}</span></p>
+              <p><span>结论:</span><span>{{ item.invalidDecisionFileVO.conclusion }}</span></p>
+            </div>
             <div>
-              备注:{{ item.description }}
+              <p>备注:{{ item.description }}</p> 
             </div>
-            <div v-if="item.affairType!=0" style="margin-top: 10px;">
+            <div style="margin-top: 10px;">
               <div v-if="item.systemFileList" class="upload-file">
                 <div v-for="(file, index) in item.systemFileList" :key="index" style="margin:0;display:flex;justify-content:space-around;">
                   <p style="margin:0;width:calc(100% - 40px);overflow: hidden;white-space: nowrap;text-overflow:ellipsis;cursor: pointer;">{{file.originalName}}</p> 
@@ -78,6 +85,7 @@ export default {
         '0': '口审时间',
         '3': '无效决定时间',
         '4': '发起诉讼时间',
+        '5': '法院判决时间',
       },
     }
   },
@@ -118,7 +126,12 @@ export default {
     // 编辑
     edit(item) {
       var field= {
-        1:'invalidRequestFileVO'
+        0:'oralTrailVO',
+        1:'invalidRequestFileVO',
+        2:'stateOpinionVO',
+        3:'invalidDecisionFileVO',
+        4:'adminProceedVO',
+        5:'judgementVO'
       }
       var form = {
         id:item.id,

+ 30 - 0
src/views/report/InvalidResponse/components/pictureManage/index.vue

@@ -0,0 +1,30 @@
+<template>
+    <div class="height_100">
+      <picture-Manage :projectId="projectId"></picture-Manage>
+    </div>
+</template>
+  
+<script>
+  import pictureManage from './pictureManage.vue';
+  export default {
+    components: {
+        pictureManage
+    },
+    props: {},
+    data() {
+      return {
+      };
+    },
+    watch: {},
+    computed: {
+      projectId(){
+          return this.$route.query.projectId
+      }
+    },
+    created() {},
+    mounted() {},
+    methods: {},
+  };
+  </script>
+  <style lang="scss" scoped>
+  </style>

+ 300 - 0
src/views/report/InvalidResponse/components/pictureManage/pictureManage.vue

@@ -0,0 +1,300 @@
+<template>
+  <div class="height_100">
+    <el-container>
+      <el-header>
+        <div class="head">
+          <el-button type="primary" size="small" @click="add" class="margin-right_10">添加</el-button>
+        </div>
+      </el-header>
+      <el-main v-DivHeight="getDivHeight">
+        <el-table v-if="refresh" v-loading="loading"  :data="tableData" :maxHeight="tableHeight - 45"  border :header-cell-style="{ 'text-align': 'center' }"  style="width: 100%">
+          <el-table-column  type="index" label="序号" width="100" align="center">
+            <template slot-scope="scope">
+                <div v-if="refreshCheck">
+                    <el-checkbox :label="scope.row.fileGuid" @change="changeCheck(scope.row)" :checked="checkList.indexOf(scope.row.fileGuid) != -1">
+                        <span>{{ scope.$index + 1 }}</span>
+                    </el-checkbox>
+                </div>
+                <div v-else>
+                    <span>{{ scope.$index + 1 }}</span>
+                </div>
+            </template>
+          </el-table-column>
+          <el-table-column prop="content" label="附图">
+            <template slot-scope="scope">
+              <div v-if="scope.row.isEdit">
+                <el-upload ref="upload" action="#" :auto-upload="false" :on-change="(file,fileList)=>change(file,fileList,scope.row)" list-type="picture"
+                :show-file-list="false">
+                    <span style="display:flex;flex-direction:row;flex-wrap:wrap;">
+                    <span class="avatar" v-if="scope.row.fileGuid"
+                        style="margin-left:10px">
+                        <span class="deleteImg">
+                        <span>
+                            <i class="el-icon-zoom-in" @click.stop="handlePictureCardPreview(scope)"></i>
+                            <i class="el-icon-delete" @click.stop="handleRemove(scope.row)"></i>
+                        </span>
+                        </span>
+                        <el-image :ref="'image'+scope.$index" class="img" :src="$commonJS.checkViewer(scope.row.fileGuid)" :preview-src-list="[$commonJS.checkViewer(scope.row.fileGuid)]"></el-image>
+                    </span>
+                    <i class="el-icon-plus avatar-uploader-icon" v-if="!scope.row.fileGuid"></i>
+                </span>
+            </el-upload>
+
+                
+              </div>
+              <div v-else >
+                <el-image style="width:200px" :src="$commonJS.checkViewer(scope.row.fileGuid)" fit="contain"></el-image>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column prop="figureTitle" label="标题">
+            <template slot-scope="scope">
+              <div v-if="scope.row.isEdit">
+                <el-input v-model="scope.row.figureTitle" placeholder="请输入附图标题"></el-input>
+              </div>
+              <div v-else>{{ scope.row.figureTitle }}</div>
+            </template>
+          </el-table-column>
+          <el-table-column prop="description" label="说明">
+            <template slot-scope="scope">
+              <div v-if="scope.row.isEdit">
+                <el-input v-model="scope.row.description" placeholder="请输入附图说明"></el-input>
+              </div>
+              <div v-else>{{ scope.row.description }}</div>
+            </template>
+          </el-table-column>
+
+          <el-table-column label="操作" width="200" align="center">
+            <template slot-scope="scope">
+              <div>
+                <div v-if="scope.row.isEdit">
+                     <el-button type="text" @click="cancel(scope)">取消</el-button>
+                     <el-button type="text" @click="save(scope.row)">保存</el-button>
+                </div>
+               <div v-else>
+                    <el-button type="text" @click="del(scope)">删除</el-button>
+                    <el-button type="text" @click="edit(scope.row)">编辑</el-button>
+               </div>
+              </div>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-main>
+    </el-container>
+    <addAndEditPicture ref="addAndEditPicture" :projectId="projectId" @save="getList"></addAndEditPicture>
+  </div>
+</template>
+  
+<script>
+import { getTableHeight } from "@/views/components/mixins";
+import addAndEditPicture from '../dialog/addAndEditPicture.vue';
+export default {
+  components: {
+    addAndEditPicture
+  },
+  mixins: [getTableHeight],
+  props: {
+    projectId: {
+      default: 0,
+    },
+    refreshCheck:{
+        default:false
+    }
+  },
+  data() {
+    return {
+        refresh:true,
+      tableData: [],
+      loading: false,
+      checkList:[]
+    };
+  },
+  watch: {
+    refreshCheck(){
+        this.checkList = []
+    }
+  },
+  computed: {},
+  created() {},
+  mounted() {
+    this.getList();
+  },
+  methods: {
+    changeCheck(row){
+        var index = this.checkList.indexOf(row.fileGuid)
+        if(index == -1){
+            this.checkList.push(row.fileGuid)
+        }else{
+            this.checkList.splice(index,1)
+        }
+    },
+    toParent(){
+        this.$emit('check',this.checkList)
+    },
+    //获取附图
+    getList() {
+      var params = {
+        projectId: this.projectId,
+      };
+      this.loading = true;
+      this.$api.queryProjectFigures(params).then(response=>{
+        if(response.code == 200){
+            this.tableData = response.data.data
+            this.loading = false
+        }
+      }).catch(error=>{
+        this.tableData = []
+        this.loading = false
+      })
+     
+    },
+    //编辑
+    edit(row) {
+        // this.$set(row,'old',row)
+        // this.$set(row,'isEdit',true)
+        this.$refs.addAndEditPicture.open(row)
+    },
+    //保存
+    save(row) {},
+    //取消编辑
+    cancel(scope) {
+        var row = scope.row
+        var index = scope.$index
+        if(row.id){
+            row = row.old
+            this.$set(row,'isEdit',false)
+        }else{
+            this.tableData.splice(index, 1);
+        }
+        
+    },
+    //删除当前一行
+    del(scope) {
+        this.$confirm('确认删除本条数据吗?', '提示', {
+            confirmButtonText: '确定',
+            cancelButtonText: '取消',
+            type: 'warning'
+        }).then(() => {
+            var index = scope.$index;
+            var row = scope.row
+            if(row.id){
+                var ids = [row.id]
+                this.$api.removeProjectFigures(ids).then(response=>{
+                    if(response.code == 200){
+                        this.$message.success('删除成功')
+                        // this.tableData.splice(index, 1);
+                        this.getList()
+                    }
+                }).catch(error=>{
+                    this.$message.error('删除失败')
+                })
+            }else{
+                this.tableData.splice(index, 1);
+            }
+        })
+    
+    },
+    //在下方新增一行
+    add() {
+        this.$refs.addAndEditPicture.open({})
+    //   this.tableData.push(
+    //     { 
+    //         isEdit:true
+    //     }
+    //   )
+    },
+    RefreshTable(){
+        this.refresh = false
+        this.$nextTick(()=>{
+            this.refresh = true
+        })
+    },
+    //文件上传
+    change(file,fileList,row){
+        let formData = new FormData()
+        formData.append('sourceId',this.$constants.sourceId)
+        formData.append('files',file.raw)
+        this.$api.uploadFile(formData).then(response=>{
+            if(response.code == 200){
+                // row.fileGuid = response.data[0]
+                this.$set(row,'fileGuid',response.data[0])
+                this.RefreshTable()
+            }
+        })
+    },
+    handleRemove(row) {
+        this.$set(row,'fileGuid','')
+    },
+    handlePictureCardPreview(scope) {
+        this.$refs['image'+scope.$index].showViewer = true
+    },
+
+  },
+};
+</script>
+  <style lang="scss" scoped>
+.head {
+  width: 100%;
+  display: flex;
+  flex-direction: row-reverse;
+}
+</style>
+<style lang="scss" scoped>
+.avatar-uploader-icon {
+  background-color: #fbfdff;
+  border: 1px dashed #c0ccda;
+  font-size: 28px;
+  color: #8c939d;
+  width: 148px;
+  height: 148px;
+  line-height: 148px;
+  text-align: center;
+}
+
+.avatar {
+  position: relative;
+  width: 148px;
+  height: 148px;
+  display: block;
+}
+
+.avatar:hover .deleteImg {
+  display: block;
+}
+
+.deleteImg {
+  display: none;
+  font-size: 30px;
+  width: 148px;
+  height: 148px;
+  background-color: black;
+  opacity: 0.6;
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 0;
+  margin: auto;
+  z-index: 999;
+}
+
+.avatar .img {
+  width: 148px;
+  height: 148px;
+}
+
+.deleteImg span i {
+  margin-left: 10px;
+  color: #fff;
+}
+
+.deleteImg span {
+  display: flex;
+  align-items: center;
+  /*垂直居中*/
+  justify-content: center;
+  /*水平居中*/
+  width: 100%;
+  height: 100%;
+}
+</style>

+ 61 - 0
src/views/report/InvalidResponse/components/pictureManage/pictureManageDialog.vue

@@ -0,0 +1,61 @@
+<template>
+  <div>
+    <el-dialog  :title="title" :visible.sync="showDialog" width="900px" :close-on-click-modal="false"  :before-close="handleClose" append-to-body>
+        <div style="height:calc(100vh - 350px)">
+            <pictureManage ref="pictureManage" :refreshCheck="refresh" :projectId="projectId" @check="getCheck"></pictureManage>
+        </div>
+        <span slot="footer" class="dialog-footer">
+          <el-button @click="handleClose">取 消</el-button>
+          <el-button type="primary" @click="submit" >确 定</el-button>
+        </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import pictureManage from './pictureManage.vue';
+export default {
+  components: {
+    pictureManage
+  },
+  props: {
+    projectId:{
+        default:0
+    }
+  },
+  data() {
+    return {
+        title:'选择附图',
+        showDialog:false,
+        refresh:false,
+        form:{},
+        
+    };
+  },
+  watch: {},
+  computed: {},
+  created() {},
+  mounted() {},
+  methods: {
+    open(data){
+        this.refresh = true
+        this.form = data
+        this.showDialog = true
+    },
+    handleClose(){
+        this.refresh = false
+        this.showDialog = false
+    },
+    submit(){
+        this.$refs.pictureManage.toParent()
+        this.handleClose()
+    },
+    getCheck(val){
+        this.form.check = val
+        this.$emit('check',this.form)
+    }
+  },
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 77 - 2
src/views/report/InvalidResponse/components/powerManage/powerManage.vue

@@ -20,11 +20,32 @@
                 <el-table-column prop="content" label="原权要内容" > 
                     <template slot-scope="scope">
                         <div>
-                            <el-input type="textarea" v-model="scope.row.content" v-if="isEdit" @blur="changeClaimOptionType($event,scope.row)"></el-input>
+                            <el-input type="textarea" autosize v-model="scope.row.content" v-if="isEdit" @blur="changeClaimOptionType($event,scope.row)"></el-input>
                             <span v-else>{{ scope.row.content }}</span> 
                         </div>
                     </template>
                 </el-table-column>
+                <el-table-column prop="content" label="修改后权要内容" > 
+                    <template slot-scope="scope">
+                        <div>
+                            <span v-html="getModifyClaim(scope.row)"></span>
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="content" label="第一次修改说明" v-if="firstModify"> 
+                    <template slot-scope="scope">
+                        <div>
+                            <span v-html="getModifyDescription(scope.row,1)"></span>
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="content" label="第二次修改说明" v-if="firstModify"> 
+                    <template slot-scope="scope">
+                        <div>
+                            <span v-html="getModifyDescription(scope.row,2)"></span>
+                        </div>
+                    </template>
+                </el-table-column>
                 <el-table-column prop="parentOrder" label="父权要" align="center"> 
                     <template slot-scope="scope">
                         <div>
@@ -99,7 +120,9 @@ export default {
                 value:0,
                 label:'附属权利要求'
             }
-        ]
+        ],
+        firstModify:false,
+        secondModify:false
     };
   },
   watch: {},
@@ -109,6 +132,34 @@ export default {
     this.getList()
   },
   methods: {
+    //获取修改后权要
+    getModifyClaim(row){
+        if(row.patentClaimHistoryList){
+            var obj = row.patentClaimHistoryList.find(item=>{
+                return item.operateType == 0
+            })
+            if(obj){
+                return obj.content
+            }
+        }
+        return ''
+    },
+    //获取权要修改说明
+    getModifyDescription(row,type){
+        if(row.patentClaimHistoryList){
+            var obj = row.patentClaimHistoryList.find(item=>{
+                if(type == 1){
+                    return item.ifFirst
+                }else if(type == 2){
+                    return !item.ifFirst
+                }
+            })
+            if(obj){
+                return obj.comment
+            }
+        }
+        return ''
+    },
     //获取权要
     getList(){
         var params = {
@@ -117,6 +168,30 @@ export default {
         this.loading = true
         this.$api.queryClaim(params).then(response=>{
             if(response.code == 200){
+                var data = response.data.data
+                var first = false
+                var second = false
+                for(var i = 0;i<data.length;i++){
+                    
+                    if(data[i].patentClaimHistoryList){
+                        var history = data[i].patentClaimHistoryList
+                        if(!first){
+                            first = history.find(item=>{
+                                return item.ifFirst
+                            })
+                        }
+                        if(!second){
+                            second = history.find(item=>{
+                                return !item.ifFirst
+                            })
+                        }
+                    }
+                    if(first && second){
+                        break;
+                    }
+                }
+                this.firstModify = first
+                this.secondModify = second
                 this.tableData = response.data.data
                 this.loading = false
             }

Plik diff jest za duży
+ 1526 - 0
src/views/report/InvalidResponse/components/reasonsAndEvidence/details.vue


Plik diff jest za duży
+ 956 - 28
src/views/report/InvalidResponse/components/reasonsAndEvidence/reasonsAndEvidence.vue


+ 1 - 1
src/views/report/components/details/components/basicMessage.vue

@@ -10,7 +10,7 @@
               </el-form-item>
               <el-form-item v-else label="标的专利:" prop="signPatentNo">
                 <div class="box">
-                  <el-link type="primary">
+                  <el-link type="primary" @click="$commonJS.checkPatentDetails(form.signPatentNo,projectId)">
                     <span v-html="$commonJS.getColumnData(form, { type: 'String', value: 'signPatentNo' })"></span>
                   </el-link>
                 </div>

+ 39 - 4
src/views/report/components/details/index.vue

@@ -13,7 +13,7 @@
         </el-menu>
       </el-aside>
       <el-main>
-        <component :is='componentName' :projectId="projectId" :patentNo="patentNo" :reportType="reportType"></component>
+        <component :is='componentName' :projectId="projectId" :patentNo="patentNo" :reportType="reportType" :ifSecondInvalid="reportMessage.ifSecondInvalid" @refreshData="getReportMessage"></component>
       </el-main>
     </el-container>
 
@@ -43,7 +43,8 @@ export default {
       ],
       comments: {},
       isCollapse: true,
-      width: '200px'
+      width: '200px',
+      reportMessage:{},
     };
   },
   watch: {},
@@ -62,10 +63,29 @@ export default {
     },
   },
   created() { },
-  mounted() {
+  async mounted() {
+    await this.getReportMessage()
     this.getMenu()
+    
   },
   methods: {
+    async getReportMessage() {
+      let params = {
+        searchQuery: `id=${this.projectId}`,//检索条件
+        orderDTOList: [],
+      }
+      await this.$api.queryReportProject(params).then(res => {
+        if (res.code == 200) {
+          if (res.data.data.length > 0) {
+            this.reportMessage = res.data.data[0]
+          } else {
+            this.reportMessage = {}
+          }
+        }
+      }).catch(error => {
+        this.reportMessage = {}
+      })
+    },
     getCollapse() {
       this.isCollapse = !this.isCollapse
       this.width = this.isCollapse ? '200px' : '64px'
@@ -123,7 +143,15 @@ export default {
           label: '权利要求管理',
           name: "powerManage",
           path: 'report/InvalidResponse/components/powerManage/powerManage.vue',
-          reportType: [7]
+          reportType: [7],
+          ifWaiGuan:1
+        },
+        {
+          label: '附图管理',
+          name: "pictureManage",
+          path: 'report/InvalidResponse/components/pictureManage/pictureManage.vue',
+          reportType: [7],
+          ifWaiGuan:3
         },
         {
           label: '无效理由和证据',
@@ -158,6 +186,13 @@ export default {
         menus = menus.concat(arr)
       }
       var menu = menus.filter(item => {
+        if(item.ifWaiGuan){
+          if(this.reportMessage.patentType == 3){
+            return item.reportType.indexOf(Number(this.reportType)) != -1 && item.ifWaiGuan == 3
+          }else{
+            return item.reportType.indexOf(Number(this.reportType)) != -1 && item.ifWaiGuan!=3
+          }
+        }
         return item.reportType.indexOf(Number(this.reportType)) != -1
       })
       this.menuList.splice(1, 0, ...menu)

+ 130 - 7
src/views/report/components/dialog/addAndEditReport.vue

@@ -16,8 +16,13 @@
                     style="width: 100%;"></el-autocomplete>
                 </el-form-item>
                 <el-form-item v-else label="标的专利" prop="signPatentNo">
-                  <el-input v-model="form.signPatentNo" autocomplete="off" placeholder="请输入标的专利"
-                    @change="getPatentNo"></el-input>
+                  <div style="display:flex;align-items:center">
+                    <el-input v-model="form.signPatentNo" autocomplete="off" placeholder="请输入标的专利" @change="getPatentNo" @blur="checkPatent(form.signPatentNo)"></el-input>
+                    <span v-if="patentLoading"> 
+                      <i class="el-icon-loading"></i>
+                    </span>
+                  </div>
+                 
                 </el-form-item>
               </div>
             </template>
@@ -201,13 +206,23 @@
             </el-row>
           </div>
         </template>
-        <!-- <template v-if="form.reportType == 7">
+        <template v-if="form.reportType == 7 && !form.id">
           <div>
             <el-form-item label="无效请求书">
-              <el-input v-model="form.associateReportName" autocomplete="off" placeholder="请输入关联报告"></el-input>
+              <div v-if="form.flowPath">
+                <div v-if="form.flowPath.systemFileList && form.flowPath.systemFileList.length>0">
+                  <div v-for="item in form.flowPath.systemFileList" :key="item.guid">
+                    {{ item.name }}
+                  </div>
+                </div>
+              </div>
+              <div v-else>
+                <el-button type="text" size="small" @click="addFlowPath">添加无效请求书</el-button>
+
+              </div>
             </el-form-item>
           </div>
-        </template> -->
+        </template>
         <el-form-item :label="(!form.id && form.status == 3) ? '上传报告文档' : '上传附件'">
           <myUpload :file-list="form.systemFileList" @on-change="onchangeFile" @on-remove="onRemove" style="height: 180px;" :autoUpload="true"></myUpload>
         </el-form-item>
@@ -218,7 +233,7 @@
       <div slot="footer" v-if="$reportPermission(form.id, [0, 1])">
         <el-button @click="handleClose(false)">取 消</el-button>
         <!-- <el-button type="primary" @click="ifNext" v-if="form.reportType == 7 && !form.id">下一步</el-button> -->
-        <el-button type="primary" @click="submit">确 定</el-button>
+        <el-button type="primary" :loading="patentLoading" @click="submit">确 定</el-button>
       </div>
     </el-dialog>
 
@@ -257,6 +272,9 @@
       destroy-on-close :before-close="close2" top="10vh">
       <ClientTable :choseClient="true" @getClient="getClient"></ClientTable>
     </el-dialog>
+    
+    <!-- 添加无效请求书 -->
+    <addFlowPath ref="addFlowPath" @save="getFlowPath"></addFlowPath>
   </div>
 </template>
 
@@ -264,10 +282,13 @@
 import { mapGetters } from 'vuex'
 import addMatter from './addMatter.vue'
 import ClientTable from '@/views/client'
+import addFlowPath from '@/views/report/InvalidResponse/components/dialog/editFlowPath.vue'
+import task from '@/api/task'
 export default {
   components: {
     addMatter,
     ClientTable,
+    addFlowPath
   },
   props: {},
   data() {
@@ -318,6 +339,8 @@ export default {
         headId: [{ required: true, message: '请选择负责人', trigger: 'change' },],
         entrustId: [{ required: true, message: '请选择委托方', trigger: 'change' },],
       },
+      patentLoading:false,
+      taskId:null,
       //加载
       loading: false,
       //加载时显示的文字
@@ -435,8 +458,22 @@ export default {
   mounted() {
     //获取所有部门列表
     this.getDepartment()
+    this.initTask()
   },
   methods: {
+    initTask() {
+          this.webSocket.onmessage = (e) => {
+            if(e.data.indexOf('{') == -1){
+                return false
+            }
+            const { code, data, message } = JSON.parse(e.data)
+            if (code === 903) {
+              if (data.complete && data.taskId == this.taskId) {
+                this.patentLoading = false
+              }
+            } 
+          }
+        },
     /**
    * 人员
    */
@@ -774,6 +811,52 @@ export default {
         }
       // }
     },
+    //校验专利是否存在
+    checkPatent(){
+      var params = {
+        patentNo:this.form.signPatentNo
+      }
+      this.$api.queryPatentByNo(params).then(response=>{
+        if(response.code == 200){
+          if(response.data){
+            this.$set(this.form,'inventionName',response.data.title[0].text_content)
+          }else{
+            this.checkPatent2()
+          }
+        }
+      })
+    },
+    //外部检索专利是否存在
+    checkPatent2(){
+      var params = {
+        patentNo:this.form.signPatentNo
+      }
+      this.$api.queryPatentByNoFromWeb(params).then(response=>{
+        if(response.code == 200){
+          if(response.data){
+            this.patentImport()
+          }else{
+            this.$message.warning('该专利不存在')
+          }
+        }
+      }).catch(error=>{
+        this.$message.warning('该专利不存在')
+      })
+    },
+    //导入专利
+    patentImport(){
+      var params = {
+          "type": "2",
+          "searchCondition": this.form.signPatentNo,
+          "importContent": 1111,
+      }
+      this.$api.addImportTask(params).then(response=>{
+        if(response.code == 200){
+          this.taskId = response.data
+          this.patentLoading = true
+        }
+      })
+    },
 
     //修改需要复制的选项
     changeCopyIds(val) {
@@ -919,8 +1002,9 @@ export default {
           this.$message.success('报告创建成功')
           this.$emit('getList', '新增成功')
           // response.data是创建成功后返回的报告id
-          this.handleClose(response.data)
           this.splitClaim(response.data)
+          this.saveFlowPath(response.data)
+          this.handleClose(response.data)
         }
       }).catch(error => {
         // 如果报告未创建成功,则赋值
@@ -947,6 +1031,7 @@ export default {
               this.$message.success('报告创建成功并发送审核')
               this.$emit('getList', true)
               this.handleCloseTask()
+              this.saveFlowPath2(response.data)
               this.handleClose()
             }
           }).catch(error => {
@@ -979,6 +1064,44 @@ export default {
         }
       })
     },
+    //获取无效请求书信息
+    getFlowPath(val){
+      this.$set(this.form,'flowPath',val)
+    },
+    addFlowPath(){
+      this.$refs.addFlowPath.open(1,
+        {
+          systemFileList:[]
+        }
+      )
+    },
+    saveFlowPath(taskId){
+      let params = {
+        current:1,
+        size:10,
+        searchQuery: `id=${taskId[0]}`,//检索条件
+        orderDTOList:[],//排序信息
+      }
+      this.$api.queryProjectTask(params).then(response => {
+        if (response.code == 200) {
+          var data = response.data.data
+          var projectId = data[0].projectId
+          this.saveFlowPath(projectId)
+        }
+      }).catch(error => {
+      })
+    },
+    saveFlowPath(projectId){
+      if(!this.form.flowPath || this.form.id){
+        return false
+      }
+      var form = JSON.parse(JSON.stringify(this.form.flowPath))
+      form.projectId = projectId
+      this.$api.addInvalidRequestFile(form).then(response=>{
+        if(response.code == 200){
+        }
+      }) 
+    }
 
   },
 

+ 11 - 1
src/views/report/components/index.vue

@@ -524,7 +524,7 @@ export default {
           this.toInvalidIndex(row)
           break;
         case '14'://导入无效证据
-          this.toInvalidResponset(row)
+          this.toInvalidEvidence(row)
           break;
         case '15'://录入产品信息
           this.toInformationEntry(row)
@@ -534,6 +534,16 @@ export default {
           break
       }
     },
+    //无效证据
+    toInvalidEvidence(row){
+      this.$router.push({
+        path:'/evidence',
+        query:{
+          projectId:row.id,
+          reportType:row.reportType
+        }
+      })
+    },
     // 报告文档
     handleFile(row) {
       this.$refs.reportFileDrawer.open(row.id)

+ 1 - 1
src/views/report/components/view/card.vue

@@ -24,7 +24,7 @@
                   <el-dropdown-item command="10" v-if="[3].includes(item.reportType)&&[2].includes(item.status) && $reportPermission(item.id,[0,1])"> 相关对比文件</el-dropdown-item>
                   <el-dropdown-item command="11" v-if="[2].includes(item.status) && $reportPermission(item.id,[0,1])"> 完成报告</el-dropdown-item>
                   <el-dropdown-item command="12" v-if="[3].includes(item.status) && $reportPermission(item.id,[0,1])">添加追踪报告</el-dropdown-item>
-                  <el-dropdown-item command="13" v-if="(item.reportType == 7 && [2,3].includes(item.status)) && $reportPermission(item.id,[0,1])">添加无效理由和证据</el-dropdown-item>
+                  <!-- <el-dropdown-item command="13" v-if="(item.reportType == 7 && [2,3].includes(item.status)) && $reportPermission(item.id,[0,1])">添加无效理由和证据</el-dropdown-item> -->
                   <el-dropdown-item command="14" v-if="(item.reportType == 7 && [2,3].includes(item.status)) && $reportPermission(item.id,[0,1])">证据文献</el-dropdown-item>
                   <el-dropdown-item command="7" divided style="color: red;" v-if=" $reportPermission(item.id,[0,1])">删除 </el-dropdown-item>
                 </el-dropdown-menu>

+ 6 - 1
src/views/report/components/view/table.vue

@@ -18,6 +18,11 @@
                 <span  v-html="$commonJS.getColumnData(scope.row,item)"></span>
               </el-link>
             </div>
+            <div v-else-if="['signPatentNo'].includes(item.value)">
+              <el-link type="primary" @click="$commonJS.checkPatentDetails(scope.row.signPatentNo,scope.row.id)">
+                <span  v-html="$commonJS.getColumnData(scope.row,item)"></span>
+              </el-link>
+            </div>
             <div v-else-if="['eventNames','cronNames'].includes(item.value)" v-html="$commonJS.getColumnData(scope.row,item)"></div>
             <div v-else v-html="$commonJS.getColumnData(scope.row,item)"></div>
           </template>
@@ -40,7 +45,7 @@
               <el-dropdown-item command="10" v-if="[3].includes(scope.row.reportType)&&[2,3].includes(scope.row.status) && $reportPermission(scope.row.id,[0,1])"> 相关对比文件</el-dropdown-item>
               <el-dropdown-item command="11" v-if="[2].includes(scope.row.status) && $reportPermission(scope.row.id,[0,1])"> 完成报告</el-dropdown-item>
               <el-dropdown-item command="12" v-if="[3].includes(scope.row.status) && $reportPermission(scope.row.id,[0,1])">添加追踪报告</el-dropdown-item>
-              <el-dropdown-item command="13" v-if="(scope.row.reportType == 7 && [2,3].includes(scope.row.status)) && $reportPermission(scope.row.id,[0,1])">添加无效理由和证据</el-dropdown-item>
+              <!-- <el-dropdown-item command="13" v-if="(scope.row.reportType == 7 && [2,3].includes(scope.row.status)) && $reportPermission(scope.row.id,[0,1])">添加无效理由和证据</el-dropdown-item> -->
               <el-dropdown-item command="14" v-if="(scope.row.reportType == 7 && [2,3].includes(scope.row.status)) && $reportPermission(scope.row.id,[0,1])">证据文献</el-dropdown-item>
               <el-dropdown-item command="7" divided style="color: red;" v-if=" $reportPermission(scope.row.id,[0,1])">删除 </el-dropdown-item>
             </el-dropdown-menu>