فهرست منبع

Merge branch 'product-shaoyin' into product

zhuliu 1 سال پیش
والد
کامیت
aa52ef66fd

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

@@ -805,4 +805,61 @@ updateSupplyEvidence(data) {
     return axios.post("/xiaoshi/searchRecord/querySearchRecords", data);
   },
 
+
+  /**
+    * 官方无效-韶音
+    * 添加无效理由
+  */
+  addInvalidReason(data) {
+    return axios.post("/xiaoshi/invalidStatutes/addInvalidReason", data);
+  },
+  /**
+    * 官方无效-韶音
+    * 修改无效理由
+  */
+  editInvalidReason(data) {
+    return axios.post("/xiaoshi/invalidStatutes/editInvalidReason", data);
+  },
+  /**
+    * 官方无效-韶音
+    * 删除无效理由
+  */
+  delInvalidReason(data) {
+    return axios.post("/xiaoshi/invalidStatutes/delInvalidReason", data);
+  },
+  /**
+    * 官方无效-韶音
+    * 新增特征
+  */
+  addFeature(data) {
+    return axios.post("/xiaoshi/invalidStatutes/addFeature", data);
+  },
+  /**
+    * 官方无效-韶音
+    * 编辑特征内容
+  */
+  editFeature(data) {
+    return axios.post("/xiaoshi/invalidStatutes/editFeature", data);
+  },
+  /**
+    * 官方无效-韶音
+    * 删除特征内容
+  */
+  delFeature(data) {
+    return axios.post("/xiaoshi/invalidStatutes/delFeature", data);
+  },
+  /**
+    * 官方无效-韶音
+    * 查询无效理由与证据-三性/非三性
+  */
+  getInvalidReasonClaims(data) {
+    return axios.post("/xiaoshi/invalidStatutes/getInvalidReasonClaims", data);
+  },
+  /**
+    * 官方无效-韶音
+    * 查权利要求接口
+  */
+  getVersionClaims(data) {
+    return axios.post("/xiaoshi/patentClaim/getVersionClaims", data);
+  },
 };

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

@@ -6,6 +6,13 @@
   border-bottom:1px solid red ;
 }
 
+@keyframes shake {
+  0% { transform: translateX(0); }
+  25% { transform: translateX(-5px); }
+  50% { transform: translateX(5px); }
+  75% { transform: translateX(-5px); }
+  100% { transform: translateX(5px); }
+}
 
 //弹窗
 .el-dialog__wrapper{
@@ -33,6 +40,12 @@
     }
   }
 }
+.el-dialog__wrapper:has(.shakeDialog){
+  pointer-events: none;
+  .shakeDialog{
+    pointer-events: auto;
+  }
+}
 
   //抽屉
   .el-drawer{

+ 4 - 1
src/utils/direct/index.js

@@ -1,5 +1,7 @@
 // 引入拖拽js
 import { startDrag } from './drag.js'
+//引入抖动
+import shake from './shake.js'
  
 /**
  * 为el-dialog弹框增加拖拽功能
@@ -164,7 +166,8 @@ const directives = {
     SelectLazyLoading,
     disabled,
     DivHeight, 
-    equal_heights
+    equal_heights,
+    shake
 };
 // 这种写法可以批量注册指令
 export default {

+ 59 - 0
src/utils/direct/shake.js

@@ -0,0 +1,59 @@
+
+import Vue from 'vue'
+const toggleShake = (el, binding) => {
+    if (binding.value) {
+        Vue.nextTick(() => {
+            const shakeTimes = binding.value.times || 1; // 震动次数
+            const shakeDistance = binding.value.distance || 2; // 震动距离
+            const shakeDuration = binding.value.duration || '0.5s'; // 震动持续时间
+            el.style.animation = 'shake '+ shakeDuration
+            el.style.animationIterationCount = shakeTimes 
+            setTimeout(() => {
+                el.style.animation = '';
+                el.style.animationIterationCount=''
+            }, 1000);
+            // 使用定时器实现震动效果
+            // let counter = 0;
+        
+            // const shake = () => {
+            //     if (counter++ < shakeTimes) {
+            //     const rand = Math.random() * shakeDistance;
+            //     const x = el.offsetLeft + rand - rand;
+            //     const y = el.offsetTop + rand;
+            //     el.style.position = 'absolute';
+            //     el.style.transform = `translate3d(${rand}px, ${rand}px, 0)`;
+            //     setTimeout(() => {
+            //         el.style.transform = '';
+            //         shake();
+            //     }, shakeDuration);
+            //     }
+            // };
+ 
+            // shake();
+        })
+    }
+}
+
+export default{
+    bind:function(el, binding, vnode){
+        if(!binding.value){
+            return
+        }
+        if(!binding.value.shake){
+            return
+        }
+        toggleShake(el, binding)
+    },
+    update: function (el, binding) {
+        if(!binding.value){
+            return
+        }
+        if(!binding.value.shake){
+            return
+        }
+        toggleShake(el, binding)
+    },
+    unbind: function (el, binding) {
+        el.style.position='';
+    }
+}

+ 222 - 21
src/views/report/InvalidResponse/components/powerManage/powerManage.vue

@@ -3,18 +3,36 @@
     <el-container>
         <el-header>
             <div class="head">
-                <el-button type="primary" size="small" @click="refreshData" class="margin-right_10">刷新</el-button>
-                <el-button type="primary" size="small" v-if="isEdit" @click="cancel" class="margin-right_10">取消编辑</el-button>
-                <el-button type="primary" size="small" v-if="isEdit" @click="save" class="margin-right_10">保存</el-button>
-                <el-button type="primary" size="small" v-else @click="edit" class="margin-right_10">编辑</el-button>
+                <div class="headLeft">
+                    <el-button type="primary" size="small" @click="refreshData" class="margin-right_10">刷新</el-button>
+                    <el-button type="primary" size="small" v-if="isEdit" @click="cancel" class="margin-right_10">取消编辑</el-button>
+                    <el-button type="primary" size="small" v-if="isEdit" @click="save" class="margin-right_10">保存</el-button>
+                    <el-button type="primary" size="small" v-else @click="edit" class="margin-right_10">编辑</el-button>
+                    <el-dropdown :hide-on-click="false" @visible-change="visibleChange">
+                        <el-button type="primary" size="small" class="el-dropdown-link">
+                            显示栏位管理<i class="el-icon-arrow-down el-icon--right"></i>
+                        </el-button>
+                        <el-dropdown-menu slot="dropdown">
+                            <el-checkbox-group v-model="checkList" @change="editColumn">
+                                <el-dropdown-item v-for="item in column" :key="item.field">
+                                    <el-checkbox  :label="item.field">{{ item.name }}</el-checkbox>
+                                </el-dropdown-item>
+                            </el-checkbox-group>
+                            
+                        </el-dropdown-menu>
+                        </el-dropdown>
+                </div>
+                
             </div>
         </el-header>
         <el-main v-DivHeight="getDivHeight">
-            <el-table v-loading="loading" :data="tableData" :maxHeight="tableHeight - 45" border :header-cell-style="{'text-align':'center'}" style="width: 100%">
+            <el-table v-loading="loading" :data="tableData" :maxHeight="tableHeight - 45" border :header-cell-style="{'text-align':'center'}" style="width: 100%"
+            @cell-dblclick="cellDblclick">
                 <el-table-column prop="sysOrder"  label="序号" width="100" align="center">
                     <template slot-scope="scope">
                         <div>
                             权要{{ scope.row.sysOrder+1 }}
+                            <!-- <span v-if="!getClaimDel(scope.row)"><el-button type="text" size="small" @click="delClaim(scope.row)">删除</el-button></span> -->
                         </div>
                     </template>
                 </el-table-column>
@@ -26,27 +44,50 @@
                         </div>
                     </template>
                 </el-table-column>
-                <el-table-column prop="content" label="修改后权要内容" > 
+                <el-table-column  v-for="item in column.filter(item=>!item.ifHidden)" :key="item.field" :prop="item.field" :label="item.name" :width="item.width || 'auto'"  align="center">
                     <template slot-scope="scope">
-                        <div>
-                            <span v-html="getModifyClaim(scope.row)"></span>
+                        <div v-if="item.field == 'historyContent1'">
+                            <my-RichText v-if="editMessage && editMessage.field == item.field && editMessage.row.sysOrder == scope.row.sysOrder" :autoFocus="true" :value="getModifyClaim(scope.row,1)" @blur="(value)=>changeMessage(item.field,scope.row,value)"></my-RichText>
+                            <div v-else v-html="getModifyClaim(scope.row,1)"></div>
+                        </div>
+                        <div v-if="item.field == 'historyDescription1'">
+                            <my-RichText v-if="editMessage && editMessage.field == item.field && editMessage.row.sysOrder == scope.row.sysOrder" :autoFocus="true" :value="getModifyDescription(scope.row,1)" @blur="(value)=>changeMessage(item.field,scope.row,value)"></my-RichText>
+                            <div v-else v-html="getModifyDescription(scope.row,1)"></div>
+                        </div>
+                        <div v-if="item.field == 'historyContent2'">
+                            <my-RichText v-if="editMessage && editMessage.field == item.field && editMessage.row.sysOrder == scope.row.sysOrder" :autoFocus="true" :value="getModifyClaim(scope.row,2)" @blur="(value)=>changeMessage(item.field,scope.row,value)"></my-RichText>
+                            <div v-else v-html="getModifyClaim(scope.row,2)"></div>
+                        </div>
+                        <div v-if="item.field == 'historyDescription2'">
+                            <my-RichText v-if="editMessage && editMessage.field == item.field && editMessage.row.sysOrder == scope.row.sysOrder" :autoFocus="true" :value="getModifyDescription(scope.row,2)" @blur="(value)=>changeMessage(item.field,scope.row,value)"></my-RichText>
+                            <div v-else v-html="getModifyDescription(scope.row,2)"></div>
                         </div>
                     </template>
                 </el-table-column>
-                <el-table-column prop="content" label="第一次修改说明" v-if="firstModify"> 
+                <!-- <el-table-column prop="1" label="修改后权要内容" > 
                     <template slot-scope="scope">
                         <div>
-                            <span v-html="getModifyDescription(scope.row,1)"></span>
+                            <my-RichText v-if="editMessage && editMessage.field == '1' && editMessage.row.sysOrder == scope.row.sysOrder" :autoFocus="true" :value="getModifyClaim(scope.row)" @blur="(value)=>changeMessage('1',scope.row,value)"></my-RichText>
+                            <div v-else v-html="getModifyClaim(scope.row)"></div>
                         </div>
                     </template>
                 </el-table-column>
-                <el-table-column prop="content" label="第二次修改说明" v-if="secondModify"> 
+                <el-table-column prop="2" label="修改说明"> 
                     <template slot-scope="scope">
                         <div>
-                            <span v-html="getModifyDescription(scope.row,2)"></span>
+                            <my-RichText v-if="editMessage && editMessage.field == '2' && editMessage.row.sysOrder == scope.row.sysOrder" :autoFocus="true" :value="getModifyDescription(scope.row,1)" @blur="(value)=>changeMessage('2',scope.row,value)"></my-RichText>
+                            <div v-else v-html="getModifyDescription(scope.row,1)"></div>
                         </div>
                     </template>
                 </el-table-column>
+                <el-table-column prop="3" label="第二次修改说明" v-if="secondModify"> 
+                    <template slot-scope="scope">
+                        <div>
+                            <my-RichText v-if="editMessage && editMessage.field == '3' && editMessage.row.sysOrder == scope.row.sysOrder" :autoFocus="true" :value="getModifyDescription(scope.row,2)" @blur="(value)=>changeMessage('3',scope.row,value)"></my-RichText>
+                            <div v-else v-html="getModifyDescription(scope.row,2)"></div>
+                        </div>
+                    </template>
+                </el-table-column> -->
                 <el-table-column prop="parentOrder" label="父权要" align="center" width="100"> 
                     <template slot-scope="scope">
                         <div>
@@ -113,6 +154,8 @@ export default {
   data() {
     return {
         tableData:[],
+        checkList:[],
+        currentCheckList:[],
         loading:false,
         isEdit:false,
         claimType:[
@@ -126,16 +169,70 @@ export default {
             }
         ],
         firstModify:false,
-        secondModify:false
+        secondModify:false,
+        editMessage:{
+            field:'',
+            row:{}
+        },
+        column:[]
     };
   },
   watch: {},
   computed: {},
   created() {},
-  mounted() {
+  async mounted() {
+    this.column = await this.$commonJS.getCustomField('claimManage')
+    this.checkList = this.column.map(item=>{
+        if(!item.ifHidden){
+           return item.field 
+        }
+    })
     this.getList()
   },
   methods: {
+    editColumn(){
+        for (var i = 0; i < this.column.length; i++) {
+                this.column[i].order = i
+            if (this.checkList.includes(this.column[i].field)) {
+                this.column[i].ifHidden = false
+            } else {
+                this.column[i].ifHidden = true
+            }
+        }
+        
+    },
+    visibleChange(val){
+        if(val){
+            this.currentCheckList = JSON.parse(JSON.stringify(this.checkList))
+            return
+        }
+        var sign = false
+        if(this.checkList.length != this.currentCheckList.length){
+            sign = true
+        }else{
+            for(var i = 0;i<this.checkList.length;i++){
+                var value = this.checkList[i]
+                var index = this.currentCheckList.indexOf(value)
+                if(index == -1){
+                    sign = true
+                    break
+                }
+            }
+        }
+        
+        if(!sign){
+            return
+        }
+        var params = {
+            tableName: 'claimManage',
+            value: this.column,
+        }
+        this.$api.setTableColumns(params).then((response) => {
+            if (response.code == 200) {
+            }
+        }).catch(error => {
+        })
+    },
      //是否有删除权要
      getClaimDel(row){
         if(row.patentClaimHistoryList){
@@ -147,6 +244,88 @@ export default {
         }
         
     },
+    //添加权要删除历史
+    delClaim(row){
+        var params = {
+            claimId:row.id,
+            ifFirst:!this.secondModify
+        }
+        this.$api.deletePatentClaim(params).then(response=>{
+            if(response.code == 200){
+                this.getList()
+            }
+        }).catch(response=>{
+
+        })
+    },
+     //双击单元格进行编辑
+     cellDblclick(row, column, cell, event){
+       this.editMessage = {
+            field:column.property,
+            row:JSON.parse(JSON.stringify(row))
+        }
+     },
+    changeMessage(field,row,value){
+        var api = 'alterPatentClaim'
+        var params = {
+            claimId:row.id,
+            content:'',
+            description:'',
+        }
+        var obj = null
+        switch(field){
+            case 'historyContent1'://第一次修改后权利要求
+                obj = this.getModifyClaim(row,1,'object')
+                params.content = value
+                params.isFirst = true
+                if(obj){
+                    params.description = obj.description
+                }
+                break;
+            case 'historyContent2'://第一次修改后权利要求
+                obj = this.getModifyClaim(row,2,'object')
+                params.content = value
+                params.isFirst = false
+                if(obj){
+                    params.description = obj.description
+                }
+                break;
+            case 'historyDescription1'://第一次修改说明
+                obj = this.getModifyDescription(row,1,'object')
+                params.description = value
+                params.isFirst = true
+                if(obj){
+                    params.content = obj.content
+                }
+                break;
+            case 'historyDescription2'://第二次修改说明
+                obj = this.getModifyDescription(row,2,'object')
+                params.description = value
+                params.isFirst = false
+                if(obj){
+                    params.content = obj.content
+                }
+                break;
+        }
+        if(obj){
+            params.patentClaimHistoryId = obj.id
+            api = 'editPatentClaimHistory'
+        }
+        
+        this.$api[api](params).then(response=>{
+            if(response.code == 200){
+                this.$message.success('编辑成功')
+                this.getList()
+                this.editMessage = {
+                    field:'',
+                    row:{}
+                }
+            }
+        }).catch(error=>{
+            
+        })
+        
+    },
     //导入数据
     refreshData(){
       this.$confirm('重置权利要求', '提示', {
@@ -172,29 +351,45 @@ export default {
       
     },
     //获取修改后权要
-    getModifyClaim(row){
+    getModifyClaim(row,type,dataType='string'){
         if(row.patentClaimHistoryList){
             var obj = row.patentClaimHistoryList.find(item=>{
-                return item.operateType == 0
+                if(type == 1){
+                    return item.operateType != 2 && item.ifFirst
+                }else if(type == 2){
+                  return item.operateType != 2 && !item.ifFirst
+                }
             })
             if(obj){
-                return obj.content
+                if(dataType == 'string'){
+                   return obj.content 
+                }else if(dataType == 'object'){
+                    return obj
+                }
+            }else{
+                return ''
             }
         }
         return ''
     },
     //获取权要修改说明
-    getModifyDescription(row,type){
+    getModifyDescription(row,type,dataType='string'){
         if(row.patentClaimHistoryList){
             var obj = row.patentClaimHistoryList.find(item=>{
                 if(type == 1){
-                    return item.ifFirst && item.description
+                    return item.operateType != 2 && item.ifFirst
                 }else if(type == 2){
-                    return !item.ifFirst && item.description
+                    return item.operateType != 2 && !item.ifFirst
                 }
             })
             if(obj){
-                return obj.description
+                if(dataType == 'string'){
+                   return obj.description 
+                }else if(dataType == 'object'){
+                    return obj
+                }
+            }else{
+                return ''
             }
         }
         return ''
@@ -353,6 +548,12 @@ export default {
 .head{
     width:100%;
     display: flex;
+    justify-content: space-between;
+    align-items: center;
+}
+.headLeft{
+    width:100%;
+    display: flex;
     flex-direction: row-reverse;
 }
 </style>

+ 209 - 0
src/views/report/InvalidResponse/components/reasonsAndEvidence/common copy.js

@@ -0,0 +1,209 @@
+
+import { getTableHeight } from '@/views/components/mixins'
+import editDialog from './components/editDialog.vue';
+export default {
+    components: {
+      editDialog
+    },
+    mixins:[getTableHeight],
+    props: {
+        projectId:{
+            default:null
+        },
+    },
+    data() {
+      return {
+          tableData:[],
+          claims:[],
+          shake:{
+            shake:false,
+          },
+        //   column:column,
+          loading:false,
+          editField:'',
+          editMessage:'',
+          
+      };
+    },
+    watch: {},
+    computed: {
+        provisions(){
+            return this.$store.state.dictMessage.dictMessage.STATUTE || []
+        }
+      },
+    created() {},
+    mounted() {
+      this.init()
+      this.getClaims()
+    },
+    methods: {
+      //显示栏位管理
+      showField(){},
+      //获取数据
+      async init(){
+         var params = {
+            id:this.projectId,
+            statueType:this.statueType
+         }
+         this.loading = true
+         this.$api.queryFinalInvalidStatues(params).then(res=>{
+            if(res.code == 200){
+                this.tableData = res.data
+                var arr = this.tableData.filter(item=>{
+                    return item.invalidStatue.courtOpinions2
+                })
+                if(arr&& arr.length > 0){
+                    this.column.find(item=>{
+                        return item.field == 'invalidStatue.courtOpinions2'
+                    }).ifHidden = false
+                }
+                this.loading = false
+            }
+         }).catch(error=>{
+            this.tableData = []
+            this.loading = false
+         })
+      },
+      getClaims(){
+        var params = {
+            projectId:this.projectId
+        }
+        this.$api.queryClaim(params).then(response=>{
+            if(response.code == 200){
+                this.claims = response.data.data
+            }
+        }).catch(error=>{
+            this.claims = []
+        })
+      },
+      //同步
+      synchronization(){
+        var params = {
+            id:this.projectId
+        }
+        this.$api.importFinalInvalidStatues(params).then(res=>{
+            if(res.code == 200){
+                this.init()
+            }
+        })
+      },
+      getData(row,field,value){
+        var fieldArray = this.getFieldArray(field)
+        let current = row;  
+        // 遍历路径中的每一部分,直到最后一个属性的父对象  
+        for (let i = 0; i < fieldArray.length - 1; i++) {  
+            // 确保当前对象有下一个属性,否则创建一个空对象(或你需要的任何默认值)  
+            if (!current.hasOwnProperty(fieldArray[i])) {  
+                current[fieldArray[i]] = {};  
+            }  
+            current = current[fieldArray[i]];  
+        }  
+        
+        // 给最后一个属性赋值  
+        current[fieldArray[fieldArray.length - 1]] = value;  
+      },
+      //获取栏位数据
+      getColumnData(row,fieldObj){
+        var field = fieldObj.field
+        if(fieldObj.type == 'array'){
+          
+          return
+        }
+        const parts = this.getFieldArray(field) 
+        let current = row;  
+          
+        for (let i = 0; i < parts.length; i++) {  
+            if (current && current.hasOwnProperty(parts[i])) {  
+                current = current[parts[i]];  
+            } else {  
+                // 如果路径中的某一部分不存在,则返回undefined或自定义的默认值  
+                return ''; // 或者你可以返回null、默认值等  
+            }  
+        }  
+        if(this.editField!=field+row.id && parts[parts.length-1] == 'statuteId'){
+            var obj = this.provisions.find(item=>{
+                return item.value == current
+            })
+            if(obj){
+                return obj.simpleLabel || obj.label
+            }
+        }
+        return current+''; 
+      },
+      getFieldArray(field){
+        return field.split('.')
+      },
+
+      //双击单元格进行编辑
+      cellDblclick(row, column, cell, event){
+        var key = column.property
+        var item = this.column.find(item=>{
+            return item.field == key
+        })
+        this.edit(item,row)
+      },
+       //编辑
+       async edit(item,row){
+          if(item.field && row){
+            if(this.editField){
+                return
+            }
+              if(!item.editable){
+                  this.$message.warning('该栏位不可编辑')
+                  return
+              }
+              
+            //   if((row.invalidStatue.statuteId == '4' || row.invalidStatue.statuteId == '5') && item.field == 'invalidStatue.claimText'){
+            //     this.$message.warning('该栏位不可编辑')
+            //     return
+            //   }
+              this.editField = item.field + row.id
+              this.editMessage = this.getColumnData(row,item.field)
+              return
+          }
+      },
+      //单击单元格取消编辑
+      cellClick(row, column, cell, event){
+        
+        if(this.editField){
+            var parts = this.getFieldArray(this.editField)
+            if(!(parts.length>1 && parts[parts.length - 1]!='claimText'+row.id)){
+              return  
+            }
+            
+        }
+        this.editField = null
+      },
+      //修改数据
+      changeMessage(field,row,value){
+          if(value == this.editMessage){
+              this.editField = null
+              return
+          }
+          const parts = this.getFieldArray(field) 
+          var part = parts[parts.length-1]
+          var params = {
+              invalidStatueId:row.invalidStatue.id,
+              proofGroupId:row.id,
+              editField:part,   
+              fieldContent: value 
+          }
+          this.$api.editFinalInvalidStatues(params).then(res=>{
+            if(res.code == 200){
+                this.$message.success('编辑成功')
+                this.editField = null
+                if(parts.length>1){
+                    this.init()
+                }else{
+                  this.getData(row,field,value)  
+                }
+                
+            }
+          }).catch(error=>{
+            
+          })
+          
+         
+      },
+    },
+  };

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 404 - 78
src/views/report/InvalidResponse/components/reasonsAndEvidence/common.js


+ 123 - 0
src/views/report/InvalidResponse/components/reasonsAndEvidence/components/addStatute.vue

@@ -0,0 +1,123 @@
+<template>
+  <div>
+    <el-dialog title="添加无效理由" :visible.sync="dialog.showDialog" width="600px" :close-on-click-modal="false"  :before-close="handleClose" append-to-body>
+        <el-form :model="form" ref="form" label-width="80px" label-position="left">
+            <template >
+                <div>
+                    <el-form-item  label="法条" prop="name">
+                        <el-select v-model="form.statuteId" placeholder="请选择" style="width:100%">
+                            <el-option
+                                v-for="item in provisionsList"
+                                :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">
+                        <div></div>
+                        <!-- <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.claimId" placeholder="请选择" style="width:100%">
+                            <el-option
+                                v-for="item in claims"
+                                :key="item.sysOrder"
+                                :label="`权要${Number(item.sysOrder)+1}`"
+                                :value="item.id"
+                            >
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+                </div>
+            </template>
+        </el-form>
+        
+        <span slot="footer" class="dialog-footer">
+          <el-button @click="handleClose">取 消</el-button>
+          <el-button type="primary" :loading="dialog.btnLoading" @click="submit" >确 定</el-button>
+        </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  components: {},
+  props: {
+    projectId:{},
+    statueType:{},
+    claims:{
+        type:Array,
+        default:()=>{
+            return []
+        }
+    }
+  },
+  data() {
+    return {
+        dialog:{
+            showDialog:false,
+            btnLoading:false
+        },
+        form:{},
+        provisionsList : []
+    };
+  },
+  watch: {},
+  computed: {
+    provisions(){
+        return this.$store.state.dictMessage.dictMessage.STATUTE || []
+    }
+  },
+  created() {},
+  mounted() {},
+  methods: {
+    open(){
+        this.form = {}
+        const provisions = ['2','3','4']
+        if(this.statueType == 1){//三性
+            this.provisionsList = this.provisions.filter(item=>{
+                return provisions.indexOf(item.value)!=-1
+            })
+        }else{
+            this.provisionsList = this.provisions.filter(item=>{
+                return provisions.indexOf(item.value)==-1
+            })
+        }
+        this.dialog.showDialog = true
+    },
+    handleClose(){
+        this.dialog.showDialog = false
+    },
+    submit(){
+        var params = {
+            projectId:this.projectId,
+            statuteId:this.form.statuteId,
+        }
+        var obj = this.claims.find(item=>{
+            return item.id == this.form.claimId
+        })
+        if(obj){
+            params.claimSort = obj.sysOrder
+            params.claimText = obj.content
+        }
+        this.dialog.btnLoading = true
+        this.$api.addInvalidReason(params).then(response=>{
+            if(response.code == 200){
+                this.$emit('save',response.data)
+                this.dialog.btnLoading = false
+                this.handleClose()
+            }
+        }).catch(error=>{
+            this.dialog.btnLoading = false
+        })
+        
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 126 - 0
src/views/report/InvalidResponse/components/reasonsAndEvidence/components/editDialog.vue

@@ -0,0 +1,126 @@
+<template>
+    <el-dialog :title="title" v-draggable v-shake="{shake:shake}" custom-class="shakeDialog" :visible.sync="visible" width="500px" :before-close="close" :modal="false" :close-on-click-modal="false" :modal-append-to-body="false">
+        <div>
+            <template v-if="type == 1">
+                <el-select clearable  v-model="data.value" placeholder="请选择" style="width:100%">
+                    <el-option
+                        v-for="(item,index) in data.options"
+                        :key="index"
+                        :label="(typeof prop.label == 'string')? item[prop.label] : prop.label(item)"
+                        :value="(typeof prop.value == 'string')? item[prop.value] : prop.value(item)"
+                    >
+                    </el-option>
+                </el-select>
+            </template>
+            <template v-if="type == 2">
+                <my-RichText :autoFocus="true" v-model="data.value"></my-RichText>
+            </template>
+            <template v-if="type == 3">
+                <div v-for="(item,index1) in data.value" :key="index1" style="display:flex;align-items:center;margin-bottom:10px">
+                    <div style="width:120px">
+                        <el-select v-model="item.evidence.id" multiple placeholder="请选择" style="width:100%">
+                            <el-option
+                                v-for="(item,index) in data.options"
+                                :key="index"
+                                :label="(typeof prop.label == 'string')? item[prop.label] : prop.label(item)"
+                                :value="(typeof prop.value == 'string')? item[prop.value] : prop.value(item)"
+                            >
+                            </el-option>
+                        </el-select>
+                    </div>
+                    <div style="width:100%;margin:0 10px">
+                        <my-RichText :autoFocus="false" v-model="item.description" placeholder="请输入"></my-RichText>
+                    </div>
+                    <div style="width:100px;display:flex;align-items:center;">
+                        <el-button icon="el-icon-plus" size="small" circle @click="add(index1)"></el-button>
+                        <el-button icon="el-icon-delete" size="small" circle @click="del(index1)"></el-button>
+                    </div>
+                </div>
+            </template>
+        </div>
+        <div slot="footer" class="dialog-footer">
+            <el-button @click="close">取 消</el-button>
+            <el-button type="primary" :loading="btnLoading" @click="submit">确 定</el-button>
+        </div>
+    </el-dialog>
+</template>
+
+<script>
+export default {
+  components: {},
+  props: {
+    shake:{
+        type:Boolean,
+        default:false
+    }
+  },
+  data() {
+    return {
+        title:'',
+        type:'',//1是选择框,2是输入框,3是数组
+        prop:{
+            label:'label',
+            value:'value'
+        },
+        data:{
+            options:[],
+            value:''
+        },
+        visible:false,
+        btnLoading:false
+    };
+  },
+  watch: {},
+  computed: {},
+  created() {},
+  mounted() {},
+  methods: {
+    open(title,type,data,prop){
+        this.title = title
+        this.type = type || 1
+        this.data = data || {
+            options:[],
+            value:''
+        }
+        this.prop = prop || {label:'label',value:'value'}
+
+        if(type == 3){
+            if(!data.value || data.value.length==0){
+                data.value = []
+                this.add(-1)
+            }
+        }
+        this.visible = true
+    },
+    close(){
+        this.visible = false
+        this.$emit('close',true)
+    },
+    closeDialog(){
+        this.btnLoading = false
+        this.visible = false
+    },
+    submit(){
+        this.btnLoading = true
+        this.$emit('submit',this.data.value)
+    },
+    add(index){
+        var obj = {
+            evidence:{
+            },
+            description:''
+        }
+        if(index==-1){
+            this.data.value.push(obj)    
+            return  
+        }
+        this.data.value.splice(index+1,0,obj)
+    },
+    del(index){
+        this.data.value.splice(index,1)
+    }
+  },
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 189 - 0
src/views/report/InvalidResponse/components/reasonsAndEvidence/details_1 备份.vue

@@ -0,0 +1,189 @@
+
+<template>
+    <div class="height_100">
+      <el-container>
+        <!-- <el-header>
+              <div class="head">
+                  <el-button type="primary" size="small"  @click="synchronization" class="margin-right_10">同步</el-button>
+              </div>
+          </el-header> -->
+          <el-main v-DivHeight="getDivHeight" class="Evidence_details">
+            <el-table :data="tableData" border v-loading="loading" :maxHeight="tableHeight" @cell-dblclick="cellDblclick" @cell-click="cellClick">
+                <el-table-column  v-for="item in column.filter(item=>!item.ifHidden)"
+                :render-header="$commonJS.renderHeaderMethods" :key="item.field" :prop="item.field" :label="item.label" :width="item.width || 'auto'"
+                align="center">
+                    <template slot-scope="scope">
+                        <div>
+                            <!-- @input="(value)=>getData(scope.row,item.field,value)" -->
+                            <div v-if="editField==(item.field+scope.row.id)">
+                                <el-select clearable v-if="item.field == 'invalidStatue.courtOpinions1' || item.field == 'invalidStatue.courtOpinions2'" :value="getColumnData(scope.row,item.field)" @change="(value)=>changeMessage(item.field,scope.row,value)" placeholder="请选择">
+                                    <el-option label="基于原权要维持有效"  value="基于原权要维持有效"></el-option>
+                                    <el-option label="基于修改后权要维持有效"  value="基于修改后权要维持有效"></el-option>
+                                    <el-option label="全部无效"  value="全部无效"></el-option>
+                                </el-select>
+                                <el-select clearable v-else-if="item.field == 'invalidStatue.statuteId'" :value="getColumnData(scope.row,item.field)" @change="(value)=>changeMessage(item.field,scope.row,value)" placeholder="请选择" style="width:100%">
+                                    <el-option
+                                        v-for="item in provisions"
+                                        :key="item.value"
+                                        :label="item.label"
+                                        :value="item.value"
+                                    >
+                                    </el-option>
+                                </el-select>
+                                <my-RichText v-else :autoFocus="true" :value="getColumnData(scope.row,item.field)" @blur="(value)=>changeMessage(item.field,scope.row,value)"></my-RichText>
+                            </div>
+                            
+                            <div class="text" v-else v-html="getColumnData(scope.row,item.field)"></div>
+                        </div>
+                        
+                    </template>
+                </el-table-column>
+            </el-table>
+          </el-main>
+      </el-container>
+  
+      
+    </div>
+</template>
+<script>
+import common from './common';
+const column = [
+    {
+        field:'invalidStatue.statuteId',
+        label:'法条',
+        editable:true,
+        width:100
+    },
+    {
+        field:'invalidStatue.claimText',
+        label:'权利要求',
+        editable:true,
+        width:180
+    },
+    {
+        field:'invalidReason',
+        label:'具体理由',
+        editable:true
+    },
+    {
+        field:'presentOpinions',
+        label:'权利人答复',
+        editable:true
+    },
+    {
+        field:'rbDecision',
+        label:'合议组认定',
+        editable:true,
+        width:180
+    },
+    {
+        field:'invalidStatue.courtOpinions1',
+        label:'一审',
+        editable:true,
+        width:100
+    },
+    {
+        field:'invalidStatue.courtOpinions2',
+        label:'二审',
+        editable:true,
+        width:100,
+        ifHidden:true
+    }
+]
+export default {
+  components: {},
+  mixins:[common],
+  props: {},
+  data() {
+    return {
+        // tableData:[],
+        column:column,
+        // loading:false,
+        // editField:'',
+        // editMessage:''
+        statueType:0
+    };
+  },
+  watch: {},
+  computed: {},
+  created() {},
+  mounted() {
+    // this.init()
+  },
+//   methods: {
+//     async init(){
+//         var url = './非三性表格.html'
+//         this.loading = true
+//         await fetch(url).then(res =>  res.text() ).then(data => {
+//             var html = data  
+//             const parser = new DOMParser();  
+//             // 解析包含 HTML 实体的字符串  
+//             const doc = parser.parseFromString(html, "text/html");  
+//             var trList =  doc.body.getElementsByTagName('tr')
+//             var head = trList[0]
+//             var headList = head.getElementsByTagName('td')
+
+//             var tableData = []
+//             for(var i = 1;i<trList.length;i++){
+//                 var bodyList = trList[i].getElementsByTagName('td')
+//                 var obj = {
+//                     id:i
+//                 }
+//                 for(var j = 0;j<bodyList.length;j++){
+//                     obj[headList[j].innerText] = bodyList[j].innerHTML
+//                 }
+//                 tableData.push(obj)
+//             }
+//             this.tableData = tableData
+//             this.loading = false
+//         })
+//     },
+//      //编辑
+//      async edit(item,row){
+//         if(item.field && row){
+//             if(!item.editable){
+//                 this.$message.warning('该栏位不可编辑')
+//                 return
+//             }
+//             if(this.editField){
+//                 return
+//             }
+//             this.editField = item.field + row.id
+//             this.editMessage = row[item.field]
+//             return
+//         }
+//     },
+//     changeMessage(field,row,value){
+       
+//         if(value == this.editMessage){
+//             this.editField = null
+//             this.$message('没有发生修改')
+//             return
+//         }
+//         var params = {
+//             editField:field,   
+//             fieldContent: value 
+//         }
+        
+//         // this.editField = null
+//         this.$message('修改了')
+//     },
+//   },
+};
+</script>
+<style lang="scss" scoped>
+.head{
+    width:100%;
+    display: flex;
+    flex-direction: row-reverse;
+}
+.text{
+    text-align: left;
+}
+</style>
+<style lang="scss">
+.Evidence_details .el-table .el-table__cell {  
+    vertical-align: top;  
+    /* 其他样式... */  
+}  
+</style>

+ 74 - 94
src/views/report/InvalidResponse/components/reasonsAndEvidence/details_1.vue

@@ -2,88 +2,95 @@
 <template>
     <div class="height_100">
       <el-container>
-        <!-- <el-header>
+        <el-header>
               <div class="head">
-                  <el-button type="primary" size="small"  @click="synchronization" class="margin-right_10">同步</el-button>
+                  <el-button type="primary" size="small"  @click="showField" class="margin-right_10">显示栏位管理</el-button>
+                  <el-button type="primary" size="small"  @click="addInvalidStatueDialog()" class="margin-right_10">添加</el-button>
               </div>
-          </el-header> -->
+          </el-header>
           <el-main v-DivHeight="getDivHeight" class="Evidence_details">
-            <el-table :data="tableData" border v-loading="loading" :maxHeight="tableHeight" @cell-dblclick="cellDblclick" @cell-click="cellClick">
+            <el-table :data="tableData" border v-loading="loading" :maxHeight="tableHeight - 35" @cell-dblclick="cellDblclick" @cell-click="cellClick" :cell-style="cellStyle">
                 <el-table-column  v-for="item in column.filter(item=>!item.ifHidden)"
-                :render-header="$commonJS.renderHeaderMethods" :key="item.field" :prop="item.field" :label="item.label" :width="item.width || 'auto'"
+                :render-header="$commonJS.renderHeaderMethods" :key="item.field" :prop="item.field" :label="item.name" :width="item.width || 'auto'"
                 align="center">
                     <template slot-scope="scope">
                         <div>
-                            <!-- @input="(value)=>getData(scope.row,item.field,value)" -->
-                            <div v-if="editField==(item.field+scope.row.id)">
-                                <el-select clearable v-if="item.field == 'invalidStatue.courtOpinions1' || item.field == 'invalidStatue.courtOpinions2'" :value="getColumnData(scope.row,item.field)" @change="(value)=>changeMessage(item.field,scope.row,value)" placeholder="请选择">
+                            <div v-if="editMessage.field && editMessage.field.field == item.field && editMessage.data.proofGroupId == scope.row.proofGroupId">
+                                <el-select clearable v-if="item.field == 'courtOpinions1' || item.field == 'courtOpinions2'" :value="getColumnData(scope.row,item)" @change="(value)=>changeMessage(item,scope.row,value)" placeholder="请选择">
                                     <el-option label="基于原权要维持有效"  value="基于原权要维持有效"></el-option>
                                     <el-option label="基于修改后权要维持有效"  value="基于修改后权要维持有效"></el-option>
                                     <el-option label="全部无效"  value="全部无效"></el-option>
                                 </el-select>
-                                <el-select clearable v-else-if="item.field == 'invalidStatue.statuteId'" :value="getColumnData(scope.row,item.field)" @change="(value)=>changeMessage(item.field,scope.row,value)" placeholder="请选择" style="width:100%">
-                                    <el-option
-                                        v-for="item in provisions"
-                                        :key="item.value"
-                                        :label="item.label"
-                                        :value="item.value"
-                                    >
-                                    </el-option>
-                                </el-select>
-                                <my-RichText v-else :autoFocus="true" :value="getColumnData(scope.row,item.field)" @blur="(value)=>changeMessage(item.field,scope.row,value)"></my-RichText>
+                                <my-RichText v-else :autoFocus="true" :value="getColumnData(scope.row,item)" @blur="(value)=>changeMessage(item,scope.row,value)"></my-RichText>
                             </div>
                             
-                            <div class="text" v-else v-html="getColumnData(scope.row,item.field)"></div>
+                            <div class="text" v-else v-html="getColumnData(scope.row,item)"></div>
+                            
                         </div>
                         
                     </template>
                 </el-table-column>
+                <el-table-column label="操作" align="center" width="120px">
+                    <template slot-scope="scope">
+                        <div>
+                            <el-button type="text" size="small" @click="delInvalidStatue(scope)">删除</el-button>
+                        </div>
+                    </template>
+                </el-table-column>
             </el-table>
           </el-main>
       </el-container>
-  
-      
+ 
+      <addStatute ref="addStatute" :claims="claims" :projectId="projectId" :statueType='statueType' @save="save"></addStatute>
+      <fields ref="field" :type="type" @getFieldList="getFieldList"></fields>
     </div>
 </template>
 <script>
 import common from './common';
 const column = [
     {
-        field:'invalidStatue.statuteId',
+        field:'invalidReasonDTO.statuteId',
+        type:'string',
         label:'法条',
-        editable:true,
+        editable:false,
         width:100
     },
     {
-        field:'invalidStatue.claimText',
+        field:'invalidReasonDTO.claimText',
+        type:'string',
         label:'权利要求',
         editable:true,
-        width:180
+        width:120
     },
     {
         field:'invalidReason',
+        type:'string',
         label:'具体理由',
         editable:true
     },
     {
         field:'presentOpinions',
+        type:'string',
         label:'权利人答复',
         editable:true
     },
     {
         field:'rbDecision',
+        type:'string',
         label:'合议组认定',
         editable:true,
         width:180
     },
     {
-        field:'invalidStatue.courtOpinions1',
+        field:'courtOpinions1',
+        type:'string',
         label:'一审',
         editable:true,
         width:100
     },
     {
-        field:'invalidStatue.courtOpinions2',
+        field:'courtOpinions2',
+        type:'string',
         label:'二审',
         editable:true,
         width:100,
@@ -91,86 +98,43 @@ const column = [
     }
 ]
 export default {
-  components: {},
+  components: {
+    
+  },
   mixins:[common],
   props: {},
   data() {
     return {
-        // tableData:[],
-        column:column,
-        // loading:false,
-        // editField:'',
-        // editMessage:''
-        statueType:0
+        column:[],
+        statueType:2,
+        type:'finalInvalidReason',
     };
   },
   watch: {},
-  computed: {},
+  computed: {
+    
+  },
   created() {},
   mounted() {
-    // this.init()
+    
+  },
+  methods: {
+
+
   },
-//   methods: {
-//     async init(){
-//         var url = './非三性表格.html'
-//         this.loading = true
-//         await fetch(url).then(res =>  res.text() ).then(data => {
-//             var html = data  
-//             const parser = new DOMParser();  
-//             // 解析包含 HTML 实体的字符串  
-//             const doc = parser.parseFromString(html, "text/html");  
-//             var trList =  doc.body.getElementsByTagName('tr')
-//             var head = trList[0]
-//             var headList = head.getElementsByTagName('td')
 
-//             var tableData = []
-//             for(var i = 1;i<trList.length;i++){
-//                 var bodyList = trList[i].getElementsByTagName('td')
-//                 var obj = {
-//                     id:i
-//                 }
-//                 for(var j = 0;j<bodyList.length;j++){
-//                     obj[headList[j].innerText] = bodyList[j].innerHTML
-//                 }
-//                 tableData.push(obj)
-//             }
-//             this.tableData = tableData
-//             this.loading = false
-//         })
-//     },
-//      //编辑
-//      async edit(item,row){
-//         if(item.field && row){
-//             if(!item.editable){
-//                 this.$message.warning('该栏位不可编辑')
-//                 return
-//             }
-//             if(this.editField){
-//                 return
-//             }
-//             this.editField = item.field + row.id
-//             this.editMessage = row[item.field]
-//             return
-//         }
-//     },
-//     changeMessage(field,row,value){
-       
-//         if(value == this.editMessage){
-//             this.editField = null
-//             this.$message('没有发生修改')
-//             return
-//         }
-//         var params = {
-//             editField:field,   
-//             fieldContent: value 
-//         }
-        
-//         // this.editField = null
-//         this.$message('修改了')
-//     },
-//   },
 };
 </script>
+<style lang="scss">
+    .reasonAndEvidence {
+        min-width: 80px ;
+        border: 1px solid #ACA9A9;
+    }
+    .link{
+        color: #409EFF;
+        cursor: pointer;
+    }
+</style>
 <style lang="scss" scoped>
 .head{
     width:100%;
@@ -180,6 +144,22 @@ export default {
 .text{
     text-align: left;
 }
+.menuList :first-child{
+  padding-top: 0px;
+}
+.menuList :hover{
+  color: #5c67ff;
+}
+
+.menuListLi{
+  text-align: center;
+  border-bottom: 1px solid #e6e6e6;
+  padding: 10px 0 3px 0;
+  cursor: pointer;
+}
+.menuListLi :first-child{
+  padding-right: 5px;
+}
 </style>
 <style lang="scss">
 .Evidence_details .el-table .el-table__cell {  

+ 207 - 0
src/views/report/InvalidResponse/components/reasonsAndEvidence/details_2 备份.vue

@@ -0,0 +1,207 @@
+
+<template>
+    <div class="height_100">
+      <el-container>
+        <!-- <el-header>
+              <div class="head">
+                  <el-button type="primary" size="small"  @click="synchronization" class="margin-right_10">同步</el-button>
+              </div>
+          </el-header> -->
+          <el-main v-DivHeight="getDivHeight" class="Evidence_details">
+            <el-table :data="tableData" border v-loading="loading" :maxHeight="tableHeight" @cell-dblclick="cellDblclick" @cell-click="cellClick">
+                <el-table-column  v-for="item in column.filter(item=>!item.ifHidden)"
+                :render-header="$commonJS.renderHeaderMethods" :key="item.field" :prop="item.field" :label="item.label" :width="item.width || 'auto'"
+                align="center">
+                    <template slot-scope="scope">
+                        <div>
+                            <!-- @input="(value)=>getData(scope.row,item.field,value)" -->
+                            <div v-if="editField==(item.field+scope.row.id)">
+                                <el-select clearable v-if="item.field == 'invalidStatue.courtOpinions1' || item.field == 'invalidStatue.courtOpinions2'" :value="getColumnData(scope.row,item.field)" @change="(value)=>changeMessage(item.field,scope.row,value)" placeholder="请选择">
+                                    <el-option label="基于原权要维持有效"  value="基于原权要维持有效"></el-option>
+                                    <el-option label="基于修改后权要维持有效"  value="基于修改后权要维持有效"></el-option>
+                                    <el-option label="全部无效"  value="全部无效"></el-option>
+                                </el-select>
+                                <el-select clearable v-else-if="item.field == 'invalidStatue.statuteId'" :value="getColumnData(scope.row,item.field)" @change="(value)=>changeMessage(item.field,scope.row,value)" placeholder="请选择" style="width:100%">
+                                    <el-option
+                                        v-for="item in provisions"
+                                        :key="item.value"
+                                        :label="item.label"
+                                        :value="item.value"
+                                    >
+                                    </el-option>
+                                </el-select>
+                                <my-RichText v-else :autoFocus="true" :value="getColumnData(scope.row,item.field)" @blur="(value)=>changeMessage(item.field,scope.row,value)"></my-RichText>
+                            </div>
+                            
+                            <div class="text" v-else v-html="getColumnData(scope.row,item.field)"></div>
+                        </div>
+                        
+                    </template>
+                </el-table-column>
+            </el-table>
+          </el-main>
+      </el-container>
+  
+      
+    </div>
+</template>
+<script>
+import common from './common';
+const column = [
+    {
+        field:'invalidStatue.statuteId',
+        label:'法条',
+        editable:true,
+        width:100
+    },
+    {
+        field:'invalidStatue.claimText',
+        label:'权利要求',
+        editable:true,
+        width:180
+    },
+    {
+        field:'invalidReason',
+        label:'证据公开',
+        editable:true
+    },
+    {
+        field:'presentOpinions',
+        label:'权利人答复',
+        editable:true
+    },
+    {
+        field:'rbDecision',
+        label:'合议组认定',
+        editable:true,
+        width:180
+    },
+    {
+        field:'invalidStatue.courtOpinions1',
+        label:'一审',
+        editable:true,
+        width:100
+    },
+    {
+        field:'invalidStatue.courtOpinions2',
+        label:'二审',
+        editable:true,
+        width:100,
+        ifHidden:true
+    }
+]
+export default {
+  components: {},
+  mixins:[common],  
+  props: {},
+  data() {
+    return {
+        // tableData:[],
+        column:column,
+        // loading:false,
+        // editField:'',
+        // editMessage:'',
+        statueType:1
+    };
+  },
+  watch: {},
+  computed: {},
+  created() {},
+  mounted() {
+    // this.init()
+  },
+//   methods: {
+//     async init(){
+//         var url = './三性表格.html'
+//         this.loading = true
+//         await fetch(url).then(res =>  res.text() ).then(data => {
+//             var html = data  
+//             const parser = new DOMParser();  
+//             // 解析包含 HTML 实体的字符串  
+//             const doc = parser.parseFromString(html, "text/html"); 
+//             var trList =  doc.body.getElementsByTagName('tr')
+//             var head = trList[0]
+//             var headList = head.getElementsByTagName('td')
+//             var sign = true
+//             var num = 0
+//             var tableData = []
+//             for(var i = 1;i<trList.length;i++){
+//                 var bodyList = trList[i].getElementsByTagName('td')
+//                 var obj = {
+//                     id:i
+//                 }
+//                 for(var j = 0;j<bodyList.length;j++){
+//                     obj[headList[j].innerText] = bodyList[j].innerHTML
+//                     if(sign){
+//                        if(headList[j].innerText == '一审'){
+//                             num = 1
+//                         }
+//                         if(headList[j].innerText == '二审'){
+//                             num = 2
+//                         } 
+//                     }
+                    
+//                 }
+//                 if(sign){
+//                     if(num == 0){
+//                         var arr = this.column.filter(item=>{
+//                             return item.field == '一审' || item.field == '二审'
+//                         })
+//                         arr.forEach(item=>{
+//                             item.ifHidden = true
+//                         })
+//                     }
+//                     else if(num == 1){
+//                         this.column.find(item=>{
+//                             return item.field == '二审'
+//                         }).ifHidden = true
+//                     }  
+//                 }
+                
+//                 sign = false
+//                 tableData.push(obj)
+//             }
+//             this.tableData = tableData
+//             this.loading = false
+//         })
+//     },
+//      //编辑
+//      async edit(item,row){
+//         if(item.field && row){
+//             if(!item.editable){
+//                 this.$message.warning('该栏位不可编辑')
+//                 return
+//             }
+//             this.editField = item.field + row.id
+//             this.editMessage = row[item.field]
+//             return
+//         }
+//     },
+//     changeMessage(field,row,value){
+//         this.editField = null
+//         if(value == this.editMessage){
+//             this.$message('没有发生修改')
+//             return
+//         }
+//         this.$message('修改了')
+//     },
+
+//   },
+};
+</script>
+<style lang="scss" scoped>
+.head{
+    width:100%;
+    display: flex;
+    flex-direction: row-reverse;
+}
+.text{
+    text-align: left;
+}
+</style>
+<style lang="scss">
+    .Evidence_details .el-table .el-table__cell {  
+        vertical-align: top;  
+        /* 其他样式... */  
+    }  
+</style>

+ 213 - 117
src/views/report/InvalidResponse/components/reasonsAndEvidence/details_2.vue

@@ -2,88 +2,118 @@
 <template>
     <div class="height_100">
       <el-container>
-        <!-- <el-header>
+        <el-header>
               <div class="head">
-                  <el-button type="primary" size="small"  @click="synchronization" class="margin-right_10">同步</el-button>
+                  <el-button type="primary" size="small"  @click="showField" class="margin-right_10">显示栏位管理</el-button>
+                  <el-button type="primary" size="small"  @click="addInvalidStatueDialog()" class="margin-right_10">添加</el-button>
               </div>
-          </el-header> -->
+          </el-header>
           <el-main v-DivHeight="getDivHeight" class="Evidence_details">
-            <el-table :data="tableData" border v-loading="loading" :maxHeight="tableHeight" @cell-dblclick="cellDblclick" @cell-click="cellClick">
-                <el-table-column  v-for="item in column.filter(item=>!item.ifHidden)"
-                :render-header="$commonJS.renderHeaderMethods" :key="item.field" :prop="item.field" :label="item.label" :width="item.width || 'auto'"
+            <el-table :data="tableData" border v-loading="loading" :maxHeight="tableHeight - 35" @cell-dblclick="cellDblclick" @cell-click="cellClick" :span-method="objectSpanMethod" :cell-style="cellStyle">
+                <el-table-column  v-for="item in column.filter(item=>!item.ifHidden)" :key="item.field" :prop="item.field" :label="item.name" :width="item.width || 'auto'"
                 align="center">
                     <template slot-scope="scope">
                         <div>
-                            <!-- @input="(value)=>getData(scope.row,item.field,value)" -->
-                            <div v-if="editField==(item.field+scope.row.id)">
-                                <el-select clearable v-if="item.field == 'invalidStatue.courtOpinions1' || item.field == 'invalidStatue.courtOpinions2'" :value="getColumnData(scope.row,item.field)" @change="(value)=>changeMessage(item.field,scope.row,value)" placeholder="请选择">
+                            <div v-if="editMessage.field && editMessage.field.field == item.field && editMessage.data.proofGroupId == scope.row.proofGroupId">
+                                <el-select clearable v-if="item.field == 'courtOpinions1' || item.field == 'courtOpinions2'" :value="getColumnData(scope.row,item)" @change="(value)=>changeMessage(item,scope.row,value)" placeholder="请选择">
                                     <el-option label="基于原权要维持有效"  value="基于原权要维持有效"></el-option>
                                     <el-option label="基于修改后权要维持有效"  value="基于修改后权要维持有效"></el-option>
                                     <el-option label="全部无效"  value="全部无效"></el-option>
                                 </el-select>
-                                <el-select clearable v-else-if="item.field == 'invalidStatue.statuteId'" :value="getColumnData(scope.row,item.field)" @change="(value)=>changeMessage(item.field,scope.row,value)" placeholder="请选择" style="width:100%">
-                                    <el-option
-                                        v-for="item in provisions"
-                                        :key="item.value"
-                                        :label="item.label"
-                                        :value="item.value"
-                                    >
-                                    </el-option>
-                                </el-select>
-                                <my-RichText v-else :autoFocus="true" :value="getColumnData(scope.row,item.field)" @blur="(value)=>changeMessage(item.field,scope.row,value)"></my-RichText>
+                                <my-RichText v-else :autoFocus="true" :value="getColumnData(scope.row,item)" @blur="(value)=>changeMessage(item,scope.row,value)"></my-RichText>
                             </div>
                             
-                            <div class="text" v-else v-html="getColumnData(scope.row,item.field)"></div>
+                            <div class="text" v-else >
+                                <span v-html="getColumnData(scope.row,item)"></span>
+                                <span v-if=" item.field == 'invalidReasonDTO.claimSort'">
+                                        <el-popover
+                                                popper-class="reasonAndEvidence"
+                                                placement="bottom"
+                                                width="100"
+                                                trigger="click"
+                                            >
+                                                <div class="menuList">
+                                                    <div class="menuListLi" @click="delInvalidStatue(scope)">删除</div>
+                                                </div>
+                                                <i slot="reference" class="el-icon-caret-bottom"></i>
+                                            </el-popover>
+                                    </span>
+                            </div>
                         </div>
                         
                     </template>
                 </el-table-column>
+                <el-table-column label="操作" align="center" width="200px">
+                    <template slot-scope="scope">
+                        <div>
+                            <el-button type="text" size="small" @click="delFeature(scope)">删除</el-button>
+                            <el-button type="text" size="small" @click="addFeature(scope,'up')">在上方新增</el-button>
+                            <el-button type="text" size="small" @click="addFeature(scope,'down')">在下方新增</el-button>
+                        </div>
+                    </template>
+                </el-table-column>
             </el-table>
           </el-main>
       </el-container>
-  
-      
+ 
+      <addStatute ref="addStatute" :claims="claims" :projectId="projectId" :statueType='statueType' @save="save"></addStatute>
+      <fields ref="field" :type="type" @getFieldList="getFieldList"></fields>
     </div>
 </template>
 <script>
 import common from './common';
+
 const column = [
     {
-        field:'invalidStatue.statuteId',
+        field:'invalidReasonDTO.statuteId',
+        type:'string',
         label:'法条',
-        editable:true,
+        editable:false,
         width:100
     },
     {
-        field:'invalidStatue.claimText',
+        field:'invalidReasonDTO.claimSort',
+        type:'string',
         label:'权利要求',
+        editable:false,
+        width:120
+    },
+    {
+        field:'featureContent',
+        type:'string',
+        label:'特征',
         editable:true,
         width:180
     },
     {
         field:'invalidReason',
+        type:'string',
         label:'证据公开',
         editable:true
     },
     {
         field:'presentOpinions',
+        type:'string',
         label:'权利人答复',
         editable:true
     },
     {
         field:'rbDecision',
+        type:'string',
         label:'合议组认定',
         editable:true,
         width:180
     },
     {
-        field:'invalidStatue.courtOpinions1',
+        field:'courtOpinions1',
+        type:'string',
         label:'一审',
         editable:true,
         width:100
     },
     {
-        field:'invalidStatue.courtOpinions2',
+        field:'courtOpinions2',
+        type:'string',
         label:'二审',
         editable:true,
         width:100,
@@ -91,104 +121,154 @@ const column = [
     }
 ]
 export default {
-  components: {},
-  mixins:[common],  
+  components: {
+    
+  },
+  mixins:[common],
   props: {},
   data() {
     return {
-        // tableData:[],
-        column:column,
-        // loading:false,
-        // editField:'',
-        // editMessage:'',
-        statueType:1
+        column:[],
+        statueType:1,
+        // 计算表格合并行的数量
+        mergeObj: {},
+        // 表格合并行的栏位
+        mergeArr: ['invalidReasonDTO.claimSort','invalidReasonDTO.statuteId'],
+        type:'finalInvalidReasonInThree',
     };
   },
   watch: {},
-  computed: {},
+  computed: {
+    
+  },
   created() {},
   mounted() {
-    // this.init()
   },
-//   methods: {
-//     async init(){
-//         var url = './三性表格.html'
-//         this.loading = true
-//         await fetch(url).then(res =>  res.text() ).then(data => {
-//             var html = data  
-//             const parser = new DOMParser();  
-//             // 解析包含 HTML 实体的字符串  
-//             const doc = parser.parseFromString(html, "text/html"); 
-//             var trList =  doc.body.getElementsByTagName('tr')
-//             var head = trList[0]
-//             var headList = head.getElementsByTagName('td')
-//             var sign = true
-//             var num = 0
-//             var tableData = []
-//             for(var i = 1;i<trList.length;i++){
-//                 var bodyList = trList[i].getElementsByTagName('td')
-//                 var obj = {
-//                     id:i
-//                 }
-//                 for(var j = 0;j<bodyList.length;j++){
-//                     obj[headList[j].innerText] = bodyList[j].innerHTML
-//                     if(sign){
-//                        if(headList[j].innerText == '一审'){
-//                             num = 1
-//                         }
-//                         if(headList[j].innerText == '二审'){
-//                             num = 2
-//                         } 
-//                     }
-                    
-//                 }
-//                 if(sign){
-//                     if(num == 0){
-//                         var arr = this.column.filter(item=>{
-//                             return item.field == '一审' || item.field == '二审'
-//                         })
-//                         arr.forEach(item=>{
-//                             item.ifHidden = true
-//                         })
-//                     }
-//                     else if(num == 1){
-//                         this.column.find(item=>{
-//                             return item.field == '二审'
-//                         }).ifHidden = true
-//                     }  
-//                 }
-                
-//                 sign = false
-//                 tableData.push(obj)
-//             }
-//             this.tableData = tableData
-//             this.loading = false
-//         })
-//     },
-//      //编辑
-//      async edit(item,row){
-//         if(item.field && row){
-//             if(!item.editable){
-//                 this.$message.warning('该栏位不可编辑')
-//                 return
-//             }
-//             this.editField = item.field + row.id
-//             this.editMessage = row[item.field]
-//             return
-//         }
-//     },
-//     changeMessage(field,row,value){
-//         this.editField = null
-//         if(value == this.editMessage){
-//             this.$message('没有发生修改')
-//             return
-//         }
-//         this.$message('修改了')
-//     },
+  methods: {
+
+    //获取每个元素所需合并的行数
+    getSpanArr(data) {
+        var mergeObj = {}
+        this.mergeArr.forEach((key, index1) => {
+            let count = 0;
+            mergeObj[key] = [];
+            if(key == 'invalidReasonDTO.claimSort'){
+                data.forEach((item, index) => {
+                    if (index === 0) {
+                        mergeObj[key].push(1);
+                    } else {
+                    if (item.invalidReasonDTO.claimSort === data[index - 1].invalidReasonDTO.claimSort && item.invalidReasonDTO.statuteId === data[index - 1].invalidReasonDTO.statuteId) {
+                        mergeObj[key][count] += 1;
+                        mergeObj[key].push(0);
+                    } else {
+                        count = index;
+                        mergeObj[key].push(1);
+                    }
+                    }
+                })
+            }
+            else{
+                data.forEach((item, index) => {
+                    if (index === 0) {
+                        mergeObj[key].push(1);
+                    } else {
+                    if (item[key] === data[index - 1][key]) {
+                        mergeObj[key][count] += 1;
+                        mergeObj[key].push(0);
+                    } else {
+                        count = index;
+                        mergeObj[key].push(1);
+                    }
+                    }
+                })
+            }
+            
+        })
+        this.mergeObj = mergeObj
+        return this.mergeObj
+    },
+        // 表格合并行
+    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];
+            }
+        }
+    },
+    
+    
+    delFeature(scope){
+        this.$confirm('确认删除本条数据吗?', '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(async () => {
+            var row = scope.row
+            var index = scope.$index
+            var arr = this.tableData.filter(item=>{
+                return item.invalidReasonDTO.invalidStatueId == row.invalidReasonDTO.invalidStatueId
+            })
+            this.loading = true
+            if(arr.length == 1){
+                var params = {
+                    ...row
+                }
+                var keys = ['featureContent','presentOpinions','rbDecision','featureContent','courtOpinions1','courtOpinions2']
+                keys.forEach(item=>{
+                    params[item] = ''
+                })
+                this.$api.editFeature(params).then(response=>{
+                    if(response.code == 200){
+                        this.$message.success('删除成功')
+                        this.tableData.splice(index,1,params)
+                        this.loading = false
+                    }
+                }).catch(error=>{
+                    this.loading = false
+                })
+                return
+            }
+            
+            var params = {
+                proofGroupId:row.proofGroupId
+            }
+           
+            this.$api.delFeature(params).then(response=>{
+                if(response.code == 200){
+                    this.$message.success('删除成功')
+                    this.loading = false
+                    this.tableData.splice(index,1)
+                    this.getSpanArr(this.tableData)
+                }
+            }).catch(error=>{
+                this.loading = false
+            })
+        })
+        
+
+        
+    },
+   
+
+  },
 
-//   },
 };
 </script>
+<style lang="scss">
+    .reasonAndEvidence {
+        min-width: 80px ;
+        border: 1px solid #ACA9A9;
+    }
+    .link{
+        color: #409EFF;
+        cursor: pointer;
+    }
+</style>
 <style lang="scss" scoped>
 .head{
     width:100%;
@@ -198,10 +278,26 @@ export default {
 .text{
     text-align: left;
 }
+.menuList :first-child{
+  padding-top: 0px;
+}
+.menuList :hover{
+  color: #5c67ff;
+}
+
+.menuListLi{
+  text-align: center;
+  border-bottom: 1px solid #e6e6e6;
+  padding: 10px 0 3px 0;
+  cursor: pointer;
+}
+.menuListLi :first-child{
+  padding-right: 5px;
+}
 </style>
 <style lang="scss">
-    .Evidence_details .el-table .el-table__cell {  
-        vertical-align: top;  
-        /* 其他样式... */  
-    }  
+.Evidence_details .el-table .el-table__cell {  
+    vertical-align: top;  
+    /* 其他样式... */  
+}  
 </style>

+ 6 - 6
src/views/report/components/details/index.vue

@@ -186,12 +186,12 @@ export default {
           reportType: [7],
           ifWaiGuan:3
         },
-        {
-          label: '无效理由和证据',
-          name: "reasonsAndEvidence",
-          path: 'report/InvalidResponse/components/reasonsAndEvidence/reasonsAndEvidence.vue',
-          reportType: [7]
-        },
+        // {
+        //   label: '无效理由和证据',
+        //   name: "reasonsAndEvidence",
+        //   path: 'report/InvalidResponse/components/reasonsAndEvidence/reasonsAndEvidence.vue',
+        //   reportType: [7]
+        // },
         {
           label: '无效理由和证据-三性',
           name: "reasonsAndEvidence2",