Explorar o código

稳定性分析

zhuliu hai 1 ano
pai
achega
d3cdeb9168

+ 8 - 0
src/views/project/patentCollection/components/mixins/index.js

@@ -95,6 +95,10 @@ export const handleData = {
             // prop = !change ? "content" : "contentOut"
             // obj.type = 'Object'
             var arr = row.title
+            if(!arr){
+              text = ''
+              break
+            }
             if(!change){
               var obj = arr.find(item=>{
                 return item.if_origin
@@ -117,6 +121,10 @@ export const handleData = {
             // prop = !change2 ? "content" : "contentOut"
             // obj.type = 'Object'
             var arr = row.abstractStr
+            if(!arr){
+              text = ''
+              break
+            }
             if(!change2){
               var obj = arr.find(item=>{
                 return item.if_origin

+ 529 - 0
src/views/report/analysisAndOpinion/components/comparisonPlan/comparisonPlan.vue

@@ -0,0 +1,529 @@
+<template>
+    <div class="height_100 plan">
+        <el-container>
+            <el-header>
+                <div style="display:flex; justify-content:flex-end;align-items: center;height: 50px;">
+                    <el-button type="danger" @click="delPlan(0)" v-if="checkList.length>0 && $reportPermission(reportId,[0,1])">删除</el-button>
+                </div>
+            </el-header>
+            <el-main>
+                <el-table
+                    v-if="show"
+                    :data="tableData"
+                    border
+                    class="table"
+                    height="750"
+                    :span-method="objectSpanMethod"
+                    :row-class-name="tableRowClassName"
+                    v-loading="loading"
+                    style="min-width: 100%; overflow:auto">
+                    <el-table-column prop="right" label="权要"  align="center"  width="200px" :filters="rightList" :filter-method="filterHandler">
+                        <template slot-scope="scope">  
+                            <span>{{scope.row.right}}</span>
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="resultant" label="对比组合" align="center" width="300px" >
+
+                    <template slot-scope="scope" >
+                        <div >
+                            <el-checkbox-group v-model="checkList">
+                                <el-checkbox :label="scope.row.PlanId" >
+                                    <p ><span>{{ scope.row.resultant}} </span><span v-if="$reportPermission(reportId,[0,1])"><el-link style="color:red;margin-left:10px" @click.prevent="delPlan(scope.row.PlanId)">删除</el-link></span></p>
+                                </el-checkbox>
+                            </el-checkbox-group>
+                        </div>
+                    
+                    </template>
+                    </el-table-column>
+                    <el-table-column prop="assoRecordsFeatures" label="特征"  align="center"  width="200px">
+                    <template slot-scope="scope">
+                        <div class="innerTable"  style="width:calc(100% + 20px);margin-left:-10px">
+                            <el-tooltip class="item" effect="dark" :content="scope.row.features.content" placement="top">
+                                <span>特征{{scope.row.features.featuresOrder}}</span>
+                            </el-tooltip>  
+                        </div>
+                    </template>
+                    </el-table-column>
+                    <el-table-column prop="PublicKnowledge" label="公识"  align="center"  width="100px">
+                    <template slot-scope="scope">  
+                        <div class="innerTable"  style="width:calc(100% + 20px);margin-left:-10px">
+                                <span  v-if="scope.row.compareRecords"></span>
+                                <span v-else>公识 </span>
+                        </div>
+                    </template>
+                    </el-table-column>
+                    <el-table-column prop="patentNo" label="对比专利"  align="center"  width="200px">
+                    <template slot-scope="scope">  
+                        <div class="innerTable" style="width:calc(100% + 20px);margin-left:-10px">
+                                <span  v-if="scope.row.compareRecords"> {{scope.row.compareRecords.patentNo}}</span>
+                                <span v-else ></span>
+                        </div>
+                    </template>
+                    </el-table-column>
+                    <el-table-column prop="content" label="对比内容"  align="center" min-width="200px">
+                    <template slot-scope="scope">  
+                        <div class="innerTable" style="width:calc(100% + 20px);margin-left:-10px">
+                            <span  v-if="scope.row.compareRecords">
+                                {{scope.row.compareRecords.content}}<img v-if="scope.row.compareRecords.filePath" :src="$p + scope.row.compareRecords.filePath" width="100px" @click="showImage(scope.row.compareRecords.filePath)" />
+                            </span>
+                            <span v-else></span>
+                        </div>
+                    </template>
+                    </el-table-column>
+                    <el-table-column prop="contrastResult" label="对比结论/理由"  align="center"  width="300px">
+                        <template slot-scope="scope">  
+                            <span v-html="scope.row.contrastResult"></span>
+                        </template>
+                    </el-table-column>
+                </el-table>
+            </el-main>
+        </el-container>
+    </div>
+</template>
+
+<script>
+import { downLoad2 } from "@/utils";
+export default {
+    props:['reportId','row'],
+    components:{
+    },
+    data() {
+        return {
+          btnLoading:false,
+          loadingTemplate: false,
+          reportType:this.row.type,
+          reportTemplateId:'',
+          show:true,
+          showList:true,
+          checkList2:[],
+          imageUrl:'',
+          showFile :false,
+          checkList:[],
+          rightList:[],
+          resultant:[],
+          tableData1:[],
+            tableData:[],
+            loading:false,
+            mergeObj: {},
+            mergeArr: [ 'right',"resultant",'contrastResult','patentNo','content'],
+        }
+    },
+    mounted() {
+        this.getContrastPlan()
+    },
+    watch:{
+      checkList2(val){
+        if(val.length>0){
+          this.showList = false
+        }else{
+          this.showList = true
+        }
+      },
+      reportId(val){
+
+      }
+    },
+    methods: {
+      //导出报告
+      exportReport(row){
+        this.reportTemplate = true
+      },
+      getReportTemplateId(val){
+        this.reportTemplateId = val
+      },
+      close1(){
+        this.reportTemplateId = ''
+        this.reportTemplate = false
+      },
+      submitExport(){
+      if (this.reportTemplateId) {
+        this.loadingTemplate=true
+        var a = {
+          reportId : this.reportId,
+          templeId :this.reportTemplateId
+        }
+        this.$api.exportReport(a).then(response => {
+          if (response.code == 200) {
+            this.$message.success('导出成功')
+            downLoad2(response.data)
+            this.reportTemplateId = ''
+            this.reportTemplate = false
+            this.loadingTemplate=false
+          } else{
+            this.$message.error('导出失败,请重试')
+            this.loadingTemplate=false
+          }
+        }).catch(error => {
+          this.$message.error('导出失败,请重试')
+            this.loadingTemplate=false
+        })
+      }else{
+        this.$alert('请选择报告模板', '提示', {
+          confirmButtonText: '确定',
+          callback: action => {
+            
+          }
+        });
+      }
+      
+    },
+      getInfo(val){
+       //console.log(this.checkList2)
+        var a = this.checkList2.findIndex(item=>{
+          //console.log(item,val)
+          return item == val
+        })
+        //console.log(a)
+        if(a==-1){
+          //console.log(1)
+          this.checkList2.push(val)
+        }else{
+          this.checkList2.splice(a,1)
+        }
+        this.$forceUpdate()
+        //console.log(val,this.checkList2)
+      },
+      checkPatentList(){
+        var a = this.checkList2.map(item=>{
+          return item.value
+        })
+        this.tableData = []
+       this.tableData = this.tableData1.filter(item=>{
+          return a.includes(item.resultant)
+        })
+        this.getSpanArr(this.tableData)
+        // this.checkList2 = []
+        // this.$refs.tree.setCheckedNodes([])
+        this.show = false
+        this.$nextTick(()=>{
+          this.show = true
+        })
+        // //console.log(this.tableData)
+      },
+      getChecked(){
+        this.$refs.tree.setCheckedNodes(this.checkList2)
+      },
+      reset(){
+        this.checkList2 = []
+        this.$refs.tree.setCheckedNodes([])
+        this.tableData = []
+        this.tableData = JSON.parse(JSON.stringify(this.tableData1))
+        this.getSpanArr(this.tableData)
+        //console.log(this.checkList2)
+        this.show = false
+        this.$nextTick(()=>{
+          this.show = true
+        })
+      },
+      getPatentList(){},
+       //查看图片
+    showImage(url){
+      this.imageUrl =this.$p + url
+      this.showFile = true
+    },
+    filterHandler(value, row, column) {
+        const property = column['property'];
+        return row[property] === value;
+      },
+      // 表格隔行变色
+      tableRowClassName({ row, rowIndex }) {
+        // if (rowIndex % 2 === 0) {
+        //   return 'success-row1'
+        // } else  {
+        //   return ''
+        // }
+      },
+      delPlan(id) {
+        if(id){
+          a = [id]
+        } else {
+          var a = this.checkList
+        }
+        
+        //console.log(this.checkList)
+        this.$confirm('此操作将永久删除, 是否继续?', '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          this.$api.deleteCompareScenarios(a).then(response=>{
+            if(response.code == 200){
+              this.$message({
+                type: 'success',
+                message: '删除成功!'
+              });
+              this.rightList = []
+              this.resultant = []
+              this.getContrastPlan()
+              this.checkList = []
+            }
+            
+          })
+          
+        }).catch(() => {        
+        });
+        
+      },
+        getContrastPlan(){
+            this.$api.selectCompareScenarios({reportID:this.reportId}).then(response=>{
+                if(response.code == 200){
+                  var data = []
+                  
+                 
+                    //console.log(response.data)
+                    response.data.forEach((item,index)=>{
+                      var a = this.rightList.findIndex(i=>{
+                        return i.value == item.right
+                      })
+                      if(a==-1){
+                        this.rightList.push({
+                          text:item.right,
+                          value:item.right
+                        })
+                      }
+                      this.resultant.push({
+                          text:'对比组合'+(index+1),
+                          patentNoList:[],
+                          value:'对比组合'+(index+1)
+                      })
+                      var i = 0
+                      item.patentNoIndex=[]
+                      item.assoRecordsFeatures.forEach((item1)=>{
+                        if(item1.compareRecords.patentNo){
+                          
+                          var b = this.resultant[index].patentNoList.findIndex(i=>{
+                            return i == item1.compareRecords.patentNo
+                          })
+                          if(b == -1){
+                            this.resultant[index].patentNoList.push(item1.compareRecords.patentNo)
+                          }
+                          
+                        }
+                        var c = item.featuresList.findIndex(i=>{
+                          return i.id == item1.features.id
+                        })
+                        if(c!=-1){
+                          item1.compareRecords = null
+                        }
+                        
+                      })
+                      item.assoRecordsFeatures.forEach((item1,ele)=>{
+                        
+                           if(ele == 0){
+                            item.patentNoIndex.push(ele)
+                          }else{
+                            if(item1.compareRecords&&item.assoRecordsFeatures[ele-1].compareRecords){
+                              if(item1.compareRecords.patentNo == item.assoRecordsFeatures[ele-1].compareRecords.patentNo && item1.compareRecords.content == item.assoRecordsFeatures[ele-1].compareRecords.content){
+                             
+                              item.patentNoIndex[item.patentNoIndex.length-1]+=1
+                            }else{
+                              item.patentNoIndex.push(ele)
+                            }
+                            }else{
+                              item.patentNoIndex.push(ele)
+                            }
+                            
+                          }
+                          
+                          
+                        //   item1.rightList = item
+                        // data.push(item1)
+                        
+                        
+                      })
+                     
+                      item.resultant = '对比组合'+(index+1)
+                      // item.featuresList.forEach(i=>{
+                      //   item.assoRecordsFeatures.push({
+                      //     featureId:i.id,
+                      //     features:i
+                      //   })
+                      // })
+                      item.assoRecordsFeatures.sort((a,b)=>{
+                        return a.featureId - b.featureId
+                      })
+                    })
+
+                    this.tableData = []
+                    response.data.forEach(item=>{
+                      item.assoRecordsFeatures.forEach((item1,index)=>{
+                        item1.contrastResult= item.contrastResult
+                        item1.featuresIDList= item.featuresIDList
+                        item1.featuresList= item.featuresList
+                        item1.PlanId= item.id
+                        item1.reportId= item.reportId
+                        item1.right= item.right
+                        item1.rightId= item.rightId
+                        item1.signPatentNo= item.signPatentNo
+                        item1.resultant = item.resultant
+                        this.tableData.push(item1)
+                      })
+                    })
+                  this.tableData.sort((a,b)=>{
+                    return a.right.slice(2,a.right.length) - b.right.slice(2,b.right.length)
+                  })
+                    // console.log(data)
+                    
+                    // // response.data = data
+                    // this.tableData = data
+                    
+                  //  debugger
+                   this.getSpanArr(this.tableData)
+                    // this.tableData = data
+                    this.tableData1 = JSON.parse(JSON.stringify(this.tableData))
+                    
+                }
+            })
+        },
+        getSpanArr(data) {
+            this.mergeArr.forEach((key, index1) => {
+                let count = 0;
+                this.mergeObj[key] = [];
+                data.forEach((item, index) => {
+                  // item.assoRecordsFeatures.forEach(i=>{
+                  //   if(i.compareRecords){
+                  //     this.mergeObj[key].push(0)
+                  //   }else{
+                  //     this.mergeObj[key].push(2)
+                  //   }
+                  // })
+                    if(key == 'right' || key == 'resultant'){
+                      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);
+                          }
+                      }
+                    }else if(key == 'patentNo' || key=='content'){
+                      if (index === 0) {
+                          this.mergeObj[key].push(1);
+                      }else{
+                        if(item.compareRecords&&data[index - 1].compareRecords){
+                          if (item.compareRecords[key] === data[index - 1].compareRecords[key] && item.PlanId == data[index-1].PlanId) {
+                            this.mergeObj[key][count] += 1;
+                            this.mergeObj[key].push(0);
+                          }else{
+                              count = index;
+                              this.mergeObj[key].push(1);
+                            }
+                        }else{
+                          count = index;
+                              this.mergeObj[key].push(1);
+                        }
+                        
+                      }
+                    }
+                    // else{
+                      
+                    //   item.assoRecordsFeatures.forEach((i,index2)=>{
+                    //     if(index == 0){
+                    //        if(i.compareRecords){
+                    //         if(index2 == 0){
+                    //           this.mergeObj[key].push(1);
+                    //         }else{
+                    //           if(i[key] === item.assoRecordsFeatures[index2-1][key]){
+                    //             this.mergeObj[key][count] += 1;
+                    //             this.mergeObj[key].push(0);
+                    //           }else{
+                    //             count = index2;
+                    //             this.mergeObj[key].push(1);
+                    //           }
+                    //         }
+                    //         // else{
+                    //         //   count = index;
+                    //         //   this.mergeObj[key].push(1);
+                    //         // }
+                    //       }
+                    //     }else{
+                    //       if(item.resultant === data[index - 1].resultant){
+                    //         if(i.compareRecords){
+                    //           if(index2 == 0){
+                    //             this.mergeObj[key].push(1);
+                    //           }else{
+                    //             if(i[key] === item.assoRecordsFeatures[index2-1][key]){
+                    //               this.mergeObj[key][count] += 1;
+                    //               this.mergeObj[key].push(0);
+                    //             }else{
+                    //               count = index2;
+                    //               this.mergeObj[key].push(1);
+                    //             }
+                    //           }
+                    //           // else{
+                    //           //   count = index;
+                    //           //   this.mergeObj[key].push(1);
+                    //           // }
+                    //         }
+                    //       }
+                    //     }
+                         
+                    //     })
+
+                    // }
+
+
+              
+                })
+            })
+            this.mergeObj.contrastResult = this.mergeObj.resultant
+            // data.forEach((item,index)=>{
+            //   if (index === 0) {
+            //         this.mergeObj[key].push(1);
+            //   }
+            // })
+        },
+        objectSpanMethod({ row, column, rowIndex, columnIndex }) {
+// console.log(this.mergeArr,column.property,rowIndex,this.mergeObj)
+            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>
+.plan .el-table--enable-row-hover .el-table__body tr:hover>td{
+  background-color: #ffffff !important;
+}
+.el-popover{
+  min-width: 0;
+}
+.success-row1 {
+  background-color:#eaf3fb !important; 
+}
+.success-row1:first-child td:first-child{
+  background-color: #FFF;
+}
+</style>
+<style lang="scss" scoped>
+.innerTable p{
+  // min-width:200px;
+  padding: 10px 0;
+  display: flex;
+  justify-content: center;
+  align-items:center;
+  height: 130px;
+  line-break:normal;
+  overflow: auto;
+  border-bottom:1px solid #EBEEF5;
+}
+
+.innerTable p:nth-child(1){
+  border-bottom: 1px solid #EBEEF5;
+}
+.innerTable p:last-child{
+  border-bottom: none;
+}
+.table{
+  cursor: pointer;
+}
+</style>

+ 0 - 0
src/views/report/analysisAndOpinion/components/comparisonPlan/index.vue


+ 107 - 0
src/views/report/analysisAndOpinion/components/comparisonResults/components/chooseContrastPlan.vue

@@ -0,0 +1,107 @@
+<template>
+  <div>
+    <div style="background:white;padding:20px;background:#99CCFF;margin-top:20px">
+          <p style="margin-top:0">选择对比方案</p>
+          <el-divider></el-divider>
+          <el-select v-model="ruleForm.type" placeholder="请选择" @change="changeRight" style="padding:20px 0 0 0">
+              <el-option v-for="item in rightList.filter(item=>typeArr.includes(item.type))" :key="item.rightId" :value="item.rightId" :label="item.pRightName"></el-option>
+          </el-select>
+        <el-table
+          ref="table"
+          :data="tableData2"
+          :span-method="objectSpanMethod"
+          :row-class-name="tableRowClassName"
+          :height="tableHeight"
+          border
+          style="min-width: 100%; margin-top: 20px;overflow:auto;">
+        >
+        <el-table-column
+          prop="pRightName"
+          label="标的权利项"
+          align="center"
+          width="200px">
+          <template slot-scope="scope">  
+            <el-tooltip class="item" effect="dark" :content="scope.row.pContent" placement="top">
+              <span>{{scope.row.pRightName}}</span>
+            </el-tooltip>       
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="content"
+          label="标的权利要求特征"
+          align="center"
+          width="300px">
+          <template slot-scope="scope" >       
+                  {{scope.row.content}}
+          </template>
+        </el-table-column>
+        <el-table-column
+        prop="content"
+        label="公识"
+        align="center"
+        width="100px">
+        <template slot-scope="scope" >     
+          <el-checkbox-group v-model="checkRecord">  
+          <el-checkbox :label="scope.row.id+scope.row.content" @change="getFunInfo(scope.row)">
+                  {{''}}
+              </el-checkbox>
+            </el-checkbox-group>
+        </template>
+      </el-table-column>
+        <el-table-column v-for="(item, index) in tableHeader" :key="index" show-overflow-tooltip align="center" :min-width="item.length > 7 ? '190' : '170'">
+          <template slot="header">
+            <span>
+                <el-link type="primary"  @click="editContrast(item.patentNo)">{{item.patentNo}}(D{{ index+1 }})</el-link>
+            </span>
+            <el-tag style="font-size:12px;border-radius:50%;" v-if="item.remark">{{item.remark}}</el-tag>
+            <i class="el-icon-arrow-down el-icon--right" @click="getVal(item)"></i>
+          </template>
+          <template slot-scope="scope">
+            <el-checkbox-group v-model="checkRecord">
+              <div class="innerTable" v-if="scope.row[item.patentNo]" style="width:calc(100% + 20px);margin-left:-10px;word-wrap:break-word;">
+                 <p v-for="(inc,index) in scope.row[item.patentNo]">
+                  <el-checkbox :label="item.patentNo+scope.row[item.patentNo+'_Id'][index]" @change="getFunInfo(scope.row,item.patentNo,index)" v-if="scope.row[item.patentNo]">
+                  <!-- <el-input style="width:calc(100% + 20px);margin-left:-10px;word-wrap:break-word;" v-model="i"></el-input>  -->
+                  <span>[{{ inc.fields }}]{{inc.content}}<el-image ref="image" :preview-src-list="imgList" v-if="inc.filePath" :src="inc.filePath"  style="vertical-align:middle;width:100px" @click.prevent="showImage(inc.filePath)"></el-image></span> 
+                  </el-checkbox>
+                </p>
+              </div>
+             </el-checkbox-group>
+          </template>
+        </el-table-column>
+        </el-table>
+        <div style="display:flex; justify-content: space-between;align-items:center;padding-top:20px">
+          <p>对比结论/原因:</p>
+          <div style="width:calc(100% - 200px);">
+            <myRichText v-model="ruleForm.result" placeholder="请输入对比结论/理由(可粘贴图片)"></myRichText>
+          </div>
+          <div >
+            <el-button type="primary" @click="save">保存</el-button>
+          </div>
+        </div>
+      </div>
+  </div>
+</template>
+
+<script>
+import mixins from './mixins'
+export default {
+    mixins:[mixins],
+  components: {},
+  props: {},
+  data() {
+    return {
+        tableData2:[],
+        rightList:[],
+        ruleForm:{}
+    };
+  },
+  watch: {},
+  computed: {},
+  created() {},
+  mounted() {},
+  methods: {},
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 153 - 0
src/views/report/analysisAndOpinion/components/comparisonResults/components/contrastRecord.vue

@@ -0,0 +1,153 @@
+<template>
+  <div class="height_100">
+    <el-table
+      ref="table"
+      :data="recordData"
+      border
+      :height="tableHeight2"
+      style="min-width: 100%; overflow: auto"
+    >
+      <el-table-column
+        prop="patentNo"
+        label="对比文件"
+        align="center"
+        width="300px"
+      >
+        <template slot-scope="scope">
+          <span>
+            <el-link type="primary" @click="editContrast(scope.row.patentNo)"
+              >{{ scope.row.patentNo }}(D{{ scope.$index + 1 }})</el-link
+            >
+          </span>
+          <el-tag
+            style="font-size: 12px; border-radius: 50%"
+            v-if="scope.row.remark"
+            >{{ scope.row.remark }}</el-tag
+          >
+          <el-popover
+            placement="bottom"
+            width="200"
+            trigger="click"
+            v-if="$reportPermission(reportId, [0, 1])"
+          >
+            <p>
+              将本文件(<span style="color: red">{{ scope.row.patentNo }}</span
+              >)作为:
+            </p>
+            <el-tree
+              ref="tree"
+              :data="tableHeader"
+              :props="{ label: 'patentNo' }"
+              @node-drop="handleDrop"
+              :allow-drop="allowDrop"
+              draggable
+              @check-change="handleCheckChange"
+            >
+              <span class="custom-tree-node" slot-scope="{ node, data }"
+                ><el-radio
+                  v-model="val"
+                  @input="changeRadio(scope.row, data)"
+                  :label="node.label"
+                  >D{{
+                    tableHeader.findIndex(
+                      (item) => item.patentNo == data.patentNo
+                    ) + 1
+                  }}</el-radio
+                ></span
+              >
+            </el-tree>
+            <p style="color: red">备注:选择其中一个文件与其交换位置</p>
+            <i
+              class="el-icon-arrow-down el-icon--right"
+              @click="getVal(scope.row)"
+              slot="reference"
+            ></i>
+          </el-popover>
+        </template>
+      </el-table-column>
+      <el-table-column
+        prop="content"
+        label="对比记录"
+        align="center"
+        min-width="300px"
+      >
+        <template slot-scope="scope">
+          <div v-for="item in scope.row.recordList" :key="JSON.stringify(item)">
+            <p>
+              {{ item.content
+              }}<el-image
+                ref="image"
+                :preview-src-list="imgList"
+                v-if="item.filePath"
+                :src="item.filePath"
+                style="vertical-align: middle; width: 100px"
+                @click="showImage(item.filePath)"
+              ></el-image
+              ><span>【{{ item.fields }}】</span>
+            </p>
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        prop="features"
+        label="对应特征"
+        align="center"
+        min-width="300px"
+      >
+        <template slot-scope="scope">
+          <div
+            v-for="item in scope.row.featuresList.sort((a, b) => {
+              return (
+                a.rightName.slice(2, a.rightName.length) -
+                b.rightName.slice(2, b.rightName.length)
+              );
+            })"
+            :key="JSON.stringify(item)"
+          >
+            <p>
+              <span>
+                <el-tooltip
+                  class="item"
+                  effect="dark"
+                  :content="item.content"
+                  placement="top-start"
+                >
+                  <span>特征{{ item.featuresOrder }}</span>
+                </el-tooltip>
+              </span>
+              <span>
+                <el-tooltip
+                  class="item"
+                  effect="dark"
+                  :content="item.rightContent"
+                  placement="top-start"
+                >
+                  <span>[{{ item.rightName }}]</span>
+                </el-tooltip>
+              </span>
+            </p>
+          </div>
+        </template>
+      </el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script>
+import mixins from './mixins'
+export default {
+  mixins:[mixins],
+  components: {},
+  props: {},
+  data() {
+    return {};
+  },
+  watch: {},
+  computed: {},
+  created() {},
+  mounted() {},
+  methods: {},
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 89 - 0
src/views/report/analysisAndOpinion/components/comparisonResults/components/contrastResult.vue

@@ -0,0 +1,89 @@
+<template>
+  <div class="height_100" v-DivHeight="getDivHeight">
+    <el-table
+      ref="table"
+      :data="tableData"
+      :span-method="objectSpanMethod"
+      :row-class-name="tableRowClassName"
+      :maxHeight="tableHeight"
+      border
+      style="min-width: 100%; overflow: auto"
+    >
+      <el-table-column
+        prop="pRightName"
+        label="标的权利项"
+        align="center"
+        width="200px"
+      >
+        <template slot-scope="scope">
+          <el-tooltip
+            class="item"
+            effect="dark"
+            :content="scope.row.pContent"
+            placement="top"
+          >
+            <span>{{ scope.row.pRightName }}</span>
+          </el-tooltip>
+        </template>
+      </el-table-column>
+      <el-table-column
+        prop="content"
+        label="标的权利要求特征"
+        align="center"
+        width="300px"
+      >
+        <template slot-scope="scope">
+          {{ scope.row.content }}
+        </template>
+      </el-table-column>
+
+      <el-table-column v-for="(item, index) in tableHeader" :key="index" :min-width="item.length > 6 ? '190' : '110'">
+        <template slot="header">
+          <span>
+            <el-link type="primary" @click="editContrast(item.patentNo)">{{ item.patentNo }}(D{{ index + 1 }})</el-link>
+          </span>
+          <el-tag style="font-size: 12px; border-radius: 50%" v-if="item.remark">{{ item.remark }}</el-tag>
+            <i class="el-icon-arrow-down el-icon--right"  @click="getVal(item)"></i>
+        </template>
+        <template slot-scope="scope">
+          <div
+            class=""
+            v-if="scope.row[item.patentNo]"
+            style="width: calc(100% + 20px); margin-left: -10px"
+          >
+            <p v-for="i in scope.row[item.patentNo]">
+              [{{ i.fields }}]{{ i.content }}
+              <el-image
+                ref="image"
+                :preview-src-list="imgList"
+                v-if="i.filePath"
+                :src="i.filePath"
+                style="vertical-align: middle; width: 100px"
+                @click="showImage(i.filePath)"
+              ></el-image>
+            </p>
+          </div>
+        </template>
+      </el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script>
+import mixins from './mixins'
+export default {
+  mixins:[mixins],
+  components: {},
+  props: {},
+  data() {
+    return {};
+  },
+  watch: {},
+  computed: {},
+  created() {},
+  mounted() {},
+  methods: {},
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 61 - 0
src/views/report/analysisAndOpinion/components/comparisonResults/components/mixins/index.js

@@ -0,0 +1,61 @@
+import { getTableHeight } from '@/views/components/mixins'
+export default {
+    mixins:[getTableHeight],
+    props:{
+        //表格数据
+        tableData:{
+            default:()=>{
+                return []
+            }
+        },
+        //显示类型0:全部展示;1:主权要展示
+        showType:{
+            default:0
+        },
+        //表头
+        tableHeader:{
+            default:()=>{
+                return []
+            }
+        }
+    },
+    data() {
+        return {
+            mergeObj: {},
+            mergeArr: ['id', 'pRightName'],
+        }
+    },
+    methods: {
+        tableRowClassName({ row, rowIndex }){},
+        getSpanArr(data) {
+            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]&& item[key] !== 'explainText' ) {
+                    this.mergeObj[key][count] += 1;
+                    this.mergeObj[key].push(0);
+                  } else {
+                    count = index;
+                    this.mergeObj[key].push(1);
+                  }
+                }
+              })
+            })
+          },
+          objectSpanMethod({ row, column, rowIndex, columnIndex }) {
+            if (this.mergeArr.indexOf(column.property) !== -1) {
+                if (this.mergeObj[column.property][rowIndex]) {
+                
+                return [this.mergeObj[column.property][rowIndex], 1]
+              } else {
+                return [0, 0];
+              }
+            }
+          }
+    },
+}

+ 110 - 0
src/views/report/analysisAndOpinion/components/comparisonResults/index.vue

@@ -0,0 +1,110 @@
+<template>
+  <div class="height_100">
+    <el-container>
+        <el-header>
+            <div class="head">
+                <div>
+                    <el-button @click="changeShow(1)" type="primary" :plain="!isSelect">对比结果查看</el-button>
+                    <el-button @click="changeShow(2)" type="primary" :plain="isSelect" v-if=" $reportPermission(reportId,[0,1])">对比方案选择</el-button>
+                </div>
+                <div>
+                    <el-select placeholder="请选择显示类型" v-model="Type" style="margin-left: 10px;" @change="TypeSelect($event)" >
+                        <el-option label="仅显示主权要" value="1"></el-option>
+                        <el-option label="全部显示" value="0"></el-option>
+                    </el-select>
+                </div>
+                <div></div>
+            </div>
+        </el-header>
+        <el-main>
+            <div class="height_100" v-show="!isSelect">
+                <el-container>
+                    <el-header class="basic_header">
+                        <el-tabs v-model="activeName" @tab-click="handleClick" style="width:100%">
+                            <el-tab-pane v-for="item in menu" :key='item.path' :label="item.label" :name="item.path"></el-tab-pane>
+                        </el-tabs>
+                    </el-header>
+                    <el-main>
+                        <component :is='activeName' :tableData="tableData" :showType="Type"></component>
+                    </el-main>
+                </el-container>
+            </div>
+            <div v-show="isSelect">
+                <chooseContrastPlan :tableData="tableData" :showType="Type"></chooseContrastPlan>
+            </div>
+        </el-main>
+    </el-container>
+  </div>
+</template>
+
+<script>
+import chooseContrastPlan from './components/chooseContrastPlan.vue'
+import contrastRecord from './components/contrastRecord.vue'
+import contrastResult from './components/contrastResult.vue'
+export default {
+  components: {
+    chooseContrastPlan,
+    contrastRecord,
+    contrastResult
+  },
+  props: {
+    projectId:{
+        default:0
+    }
+  },
+  data() {
+    return {
+        tableData:[],
+        originalData:[],
+        Type:'0',
+        isSelect:false,
+        activeName:'contrastResult',
+        menu:[
+            {
+                label:'对比结果',
+                path:'contrastResult'
+            },
+            {
+                label:'对比记录',
+                path:'contrastRecord'
+            }
+        ]
+    };
+  },
+  watch: {},
+  computed: {},
+  created() {},
+  mounted() {
+    this.getList()
+  },
+  methods: {
+    //获取对比结果
+    getList(){
+
+    },
+    //切换查看结果和选择对比方案
+    changeShow(type){
+
+    },
+    //切换主权要
+    TypeSelect(val){
+        if(val == 1){
+            this.tableData = this.originalData.filter(item=>{
+                return
+            })
+        }else if(val == 0){
+            this.tableData = this.originalData
+        }
+        
+    }
+  },
+};
+</script>
+<style lang="scss" scoped>
+.head{
+    width: 100%;
+    display: flex;
+    justify-content: space-between;
+}
+
+</style>

+ 0 - 0
src/views/report/analysisAndOpinion/index.vue


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

@@ -21,11 +21,16 @@
 </template>
 
 <script>
+const loadComponent = (value)=>{
+  return import(`@/views/${value}`)
+}
 export default {
   components: {},
   props: {
   },
+  
   data() {
+    
     return {
       activeMenu: 'Table',
       componentName: '',
@@ -165,12 +170,25 @@ export default {
           path: 'report/InvalidResponse/components/Evidence/evidence.vue',
           reportType: [7]
         },
+        //稳定性分析和第三方意见
+        {
+          label: '对比结果',
+          name: "comparisonResult",
+          path: 'report/analysisAndOpinion/components/comparisonResults/index.vue',
+          reportType: [1,2]
+        },
+        {
+          label: '对比方案',
+          name: "comparisonPlan",
+          path: 'report/analysisAndOpinion/components/comparisonPlan/comparisonPlan.vue',
+          reportType: [1,2]
+        },
 
         {
           label: '报告文档',
           name: "reportFile",
           path: 'report/components/reportFile/reportFileTable.vue',
-          reportType: [0, 1, 2, 3, 4, 5]
+          reportType: [0, 1, 2, 3, 4, 5,7]
         },
 
       ]
@@ -180,7 +198,7 @@ export default {
             label: '后续事项',
             name: "remarryMatter",
             path: 'report/components/matter/remarryMatter.vue',
-            reportType: [0, 1, 2, 3, 4, 5]
+            reportType: [0, 1, 2, 3, 4, 5,7]
           },
         ]
         menus = menus.concat(arr)
@@ -200,8 +218,14 @@ export default {
     },
     getComponents() {
       this.menuList.forEach((item, index) => {
-        import(`@/views/${item.path}`).then(res => {
-          this.comments[item.name] = res.default
+        // import(`@/views/${item.path}`).then(res => {
+        //   this.comments[item.name] = res.default
+        //   if (index == 0) {
+        //     this.componentName = this.comments[item.name]
+        //   }
+        // })
+        loadComponent(item.path).then(component => {
+          this.comments[item.name] = component.default
           if (index == 0) {
             this.componentName = this.comments[item.name]
           }