소스 검색

侵权分析协同

zhuhao 1 년 전
부모
커밋
10b8984594

+ 15 - 3
src/api/newApi/report.js

@@ -31,6 +31,12 @@ export default {
   groupReportProject(data) {
     return axios.post("/xiaoshi/reportProject/groupReportProject", data);
   },
+  /**
+   * 报告审核任务 
+   */
+  addReportOpenAuditTask(data) {
+    return axios.post("/xiaoshi/projectTask/addReportOpenAuditTask", data);
+  },
 
   /**
    * 回避设计报告部分
@@ -112,19 +118,25 @@ export default {
     return axios.get("/xiaoshi/projectTask/getPatentNoByTaskId", {params});
   },
   /**
-   * 保存侵权报告协同任务对比结果??
+   * 保存侵权报告协同任务对比结果(协同人处理结果保存)
    */
   addTortTaskResult(data) {
     return axios.post("/xiaoshi/tort/addTortTaskResult", data);
   },
   /**
-   * 查询侵权报告协同任务对比结果
+   * 查询侵权报告协同任务对比结果(协同人处理结果)
    */
   getAllTortTaskResult(params) {
     return axios.get("/xiaoshi/tort/getAllTortTaskResult", {params});
   },
   /**
-   * 侵权报告协同任务确认结果的保存
+   * 查询侵权报告协同任务确认结果(确认协同结果)
+   */
+  getTortFinalResult(params) {
+    return axios.get("/xiaoshi/tort/getTortFinalResult", {params});
+  },
+  /**
+   * 侵权报告协同任务确认结果的保存(确认协同结果保存)
    */
   addFinalTortResult(data) {
     return axios.post("/xiaoshi/tort/addFinalTortResult", data);

+ 2 - 3
src/views/report/components/details/index.vue

@@ -80,8 +80,8 @@ export default {
         },
         {
           label:'对比结果',
-          name:'productMessage',
-          path:'report/components/details/components/splitDetails.vue',
+          name:'productResult',
+          path:'report/components/productResult/productResult.vue',
           reportType:[3,4]
         },
         { 
@@ -107,7 +107,6 @@ export default {
         return item.reportType.indexOf(Number(this.reportType))!=-1
       })
       this.menuList.splice(1, 0, ...menu)
-        console.log(this.menuList);
         this.getComponents()
     },
     getComponents(){

+ 19 - 27
src/views/report/components/dialog/addAndEditReport.vue

@@ -204,18 +204,18 @@
     <el-dialog title="添加审核任务" :visible.sync="showTask" width="500px" @close="handleCloseTask" :append-to-body="true"
       :close-on-click-modal="false">
       <el-form :model="taskForm" :rules="TaskRules" ref="TaskForm" label-width="120px" v-loading="loading">
-        <el-form-item label="任务名称:" prop="taskName">
-          <el-input v-model="taskForm.taskName" type="text" placeholder="输入任务名称" />
+        <el-form-item label="任务名称:" prop="name">
+          <el-input v-model="taskForm.name" type="text" placeholder="输入任务名称" />
         </el-form-item>
-        <el-form-item label="审核人:" prop="personnelId">
-          <el-select style="width:100%;" ref="select1" v-model="taskForm.personnelId" clearable filterable remote
+        <el-form-item label="审核人:" prop="handler">
+          <el-select style="width:100%;" ref="select1" v-model="taskForm.handler" clearable filterable remote
             :remote-method="remoteMethodPerson" v-SelectLazyLoading="lazyLoadingPerson">
-            <el-option v-for="item in personnelList" :key="item.id" :label="item.personnelName" :value="item.id"
+            <el-option v-for="item in personnelList.data" :key="item.id" :label="item.name" :value="item.id"
               placeholder="请选择审核人"></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="完成日期:" prop="endTime">
-          <el-date-picker style="width:100%" v-model="taskForm.endTime" value-format="yyyy-MM-dd HH:mm:ss" type="datetime"
+        <el-form-item label="完成日期:" prop="deadLineTime">
+          <el-date-picker style="width:100%" v-model="taskForm.deadLineTime" value-format="yyyy-MM-dd HH:mm:ss" type="datetime"
             placeholder="选择日期">
           </el-date-picker>
         </el-form-item>
@@ -387,9 +387,9 @@ export default {
       isEndTimes: null,
       // 任务表单校验
       TaskRules: {
-        taskName: [{ required: true, message: '请输入任务名称', trigger: 'blur' },],
-        personnelId: [{ required: true, message: '请选择审核人', trigger: 'change' },],
-        endTime: [{ required: true, validator: isTime, trigger: 'change' }],
+        name: [{ required: true, message: '请输入任务名称', trigger: 'blur' },],
+        handler: [{ required: true, message: '请选择审核人', trigger: 'change' },],
+        deadLineTime: [{ required: true, validator: isTime, trigger: 'change' }],
       },
       /*审核弹窗所需变量end*/
       /*无效应对报告下一步弹窗所需变量start*/
@@ -843,10 +843,10 @@ export default {
               distinguishCancelAndClose: true,
             }).then(() => {//审核打开审核弹窗
               this.showTask = true
-              this.$set(this.taskForm, 'taskName', this.form.name + '审核')
+              this.$set(this.taskForm, 'name', this.form.name + '审核')
             }).catch(action => {//不审核直接创建报告
               // 直接完成传true
-              formData.ifFinish = true
+              // formData.ifFinish = true
               // 调用创建报告公用,接口
               this.addReport(formData, scenarioIds)
             });
@@ -914,22 +914,14 @@ export default {
       this.isEndTime = false
       this.$refs.TaskForm.validate((valid) => {
         if (valid) {
-          let formData = new FormData()
-          if (this.files && this.files.length > 0) {
-            for (var i = 0; i < this.files.length; i++) {
-              formData.append("files", this.files[i]);
-            }
-          }
-          let a = {
-            report: this.form,
-            personIds: [this.taskForm.personnelId],
-            taskName: this.taskForm.taskName,
-            endTime: this.taskForm.endTime,
-            description: this.taskForm.description,
-            type: 0,
+          this.taskForm.handlerType = 0//内部人员0,外部人员1
+          this.taskForm.type = 5//任务类型,5为审核
+          
+          let params = {
+            reportProjectDTO: this.form,
+            projectTaskDTO:this.taskForm,
           }
-          formData.append('taskVO', JSON.stringify(a))
-          this.$api.AddTask(formData).then(response => {
+          this.$api.addReportOpenAuditTask(params).then(response => {
             if (response.code == 200) {
               this.files = []
               this.$message.success('报告创建成功并发送审核')

+ 3 - 3
src/views/report/components/dialog/teamwork.vue

@@ -46,8 +46,8 @@
             <el-input v-model="form.name" type="text" placeholder="输入主题" />
           </el-form-item>
 
-          <el-form-item label="完成日期:" prop="deadlineTime">
-            <el-date-picker style="width:100%" v-model="form.deadlineTime" value-format="yyyy-MM-dd HH:mm:ss"
+          <el-form-item label="完成日期:" prop="deadLineTime">
+            <el-date-picker style="width:100%" v-model="form.deadLineTime" value-format="yyyy-MM-dd HH:mm:ss"
               type="datetime" placeholder="选择日期">
             </el-date-picker>
           </el-form-item>
@@ -135,7 +135,7 @@ export default {
       clientRules: {
         headId: [{ required: true, validator: isCollaborator, trigger: 'change' },],
         name: [{ required: true, message: "请输入主题", trigger: "blur" },],
-        deadlineTime: [
+        deadLineTime: [
           { required: false, validator: isTime, trigger: 'change' }
         ],
       },

+ 105 - 0
src/views/report/components/productResult/patentTable/patentTable.vue

@@ -0,0 +1,105 @@
+<template>
+  <div>
+    <el-dialog title="选择专利" :visible.sync="dialogVisible" width="800px" :before-close="handleClose">
+
+      <el-table :data="tableData" border v-loading="loading"
+        style="min-width: 100%; overflow:auto">
+        <el-table-column width="80" align="center">
+          <template slot-scope="scope">
+            <div>
+              <el-checkbox-group v-model="selected" style="display:inline-block">
+                <el-checkbox :label="scope.row.patentNo" :disabled="scope.row.disabled"
+                  @change="getFunInfo(scope.row.patentNo)">
+                  <span>{{ (scope.$index + 1) + ((queryParams.current - 1) * queryParams.size) }}</span>
+                  <!-- <span v-else>{{ (scope.$index + 1) + ((queryParams.current - 1) * queryParams.size) }}</span> -->
+                </el-checkbox>
+              </el-checkbox-group>
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column prop="patentNo" label="专利号" align="center" width="200px">
+          <template slot-scope="scope">
+            <div>
+              <el-link type="primary" @click="toPatentDetails(scope.row.patentNo)">{{ scope.row.patentNo }}</el-link>
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column prop="name" label="专利标题" align="center" width="300px">
+        </el-table-column>
+        <el-table-column prop="simpleStatus" align="center" label="状态">
+        </el-table-column>
+      </el-table>
+
+      <div class="pagination" v-if="choiceMark">
+        <el-pagination :current-page.sync="queryParams.current" :page-size="queryParams.size"
+          :total="total" @current-change="handleCurrentChange" layout="total, prev, pager, next, jumper"
+          background></el-pagination>
+      </div>
+
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="handleClose">取 消</el-button>
+        <el-button type="primary" @click="handleSure">确 定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { patentDetails } from '../../mixins/index2'
+export default {
+  mixins:[patentDetails],
+  data() {
+    return {
+      // 控制弹窗的打开关闭
+      dialogVisible: false,
+      // 分页信息
+      queryParams: {
+        current: 1,
+        size: 10,
+      },
+      total:0,
+      // 表格信息
+      loading: false,
+      // 表格数据
+      tableData:[],
+    }
+  },
+  mounted() {
+
+  },
+  methods: {
+    open() {
+      this.dialogVisible = true
+    },
+    // 弹窗确定
+    handleSure() {
+      this.handleClose()
+    },
+    // 关闭弹窗
+    handleClose() {
+      this.dialogVisible = false
+    },
+    // 获取勾选的专利的专利号
+    getFunInfo(patentNo) {
+
+    },
+    // 分页信息
+    handleCurrentChange(val) {
+      this.queryParams.current = val,
+      this.getList()
+    },
+    getList() {
+      let params = {
+        
+      }
+      this.$api.query(params).then(res => {
+        if (res.code == 200) {
+          this.tableData=res.data.data
+        }
+      })
+    },
+  },
+}
+</script>
+
+<style lang="scss" scoped></style>

+ 457 - 0
src/views/report/components/productResult/productResult.vue

@@ -0,0 +1,457 @@
+<template>
+  <!-- 侵权分析或FTO对比结果 -->
+  <div class="height_100" style="width: 100%;">
+    <el-container style="width: 100%;">
+
+      <!-- <el-aside style="background:white" :style="{ width: 'calc(100% - ' + width + ')' }"> -->
+      <el-aside class="height_100" style="background:white" :style="{ width: 'calc(100% - ' + width + ')' }">
+        <div style="display:flex; justify-content:flex-end;align-items:center;margin-bottom: 10px;">
+          <el-button @click="taskWork" type="primary" size="small">协同办公</el-button>
+          <el-dropdown size="medium" style="margin:10px 20px 10px 20px">
+            <el-button type="primary" size="small">
+              创建报告<i class="el-icon-arrow-down el-icon--right"></i>
+            </el-button>
+            <el-dropdown-menu slot="dropdown" style="margin-top:0px"
+              v-if="dictMessage.REPORT_TYPE && dictMessage.REPORT_TYPE.length > 0">
+              <!-- 遍历按钮 -->
+              <el-dropdown-item v-for="item in dictMessage.REPORT_TYPE.filter(item => !['3','5','6'].includes(item.value))"
+                :key="item.label" @click.native="handleAnalyse(item.value)"
+                v-if="$permission('/pcs/report/add/' + item.permission)">{{ item.label }}</el-dropdown-item>
+            </el-dropdown-menu>
+          </el-dropdown>
+          <div style="display:flex; justify-content:flex-end;align-items:center" v-if="reportType != 4">
+            <el-button class="changePatent" type="" size="small" :disabled="index == 0" @click="handleLink1()">
+              <span class="p"><i class="el-icon-arrow-up"></i>
+                <span>上一篇</span>
+              </span>
+              <span class="n" v-if="patentList[index - 1]">
+                <span>{{ patentList[index - 1].patentNo }}</span>
+              </span>
+              <span class="n" v-else>无数据</span>
+            </el-button>
+            <div
+              style="width:100px;height:50px;border-radius:5px ;border:1px solid #DCDCDC;display:flex; justify-content:flex-start;margin:0 10px">
+              <div class="t" style="width:50px;text-align:center;line-height:50px;border-right:1px solid #DCDCDC;">{{
+                patentList[index - 1] ? index : '0' }}</div>
+              <div class="t" style="width:50px;text-align:center;line-height:50px">{{
+                patentList[index + 1] ? total - index - 1 : '0' }}</div>
+            </div>
+            <el-button class="changePatent" style="margin-right:10px" type="" size="small"
+              :disabled="index == patentList.length - 1 || patentList.length == 0" @click="handleLink()">
+              <span class="p">
+                <i class="el-icon-arrow-down"></i>
+                <span>下一篇</span>
+              </span>
+              <span class="n" v-if="patentList[index + 1]">
+                <span>{{ patentList[index + 1].patentNo }}</span>
+              </span>
+              <span class="n" v-else>无数据</span>
+            </el-button>
+          </div>
+          <!-- 收缩图标 -->
+          <el-tooltip class="item" effect="dark" :content="(showRight ? '隐藏' : '显示') + '右侧菜单'" placement="top">
+            <i :class="showRight ? 'el-icon-s-unfold' : 'el-icon-s-fold'"
+              style="font-size: 25px; margin-top: 5px;color: #2f2f2f; cursor: pointer"
+              @click="showRight = !showRight"></i>
+          </el-tooltip>
+        </div>
+        <div>
+          <table class="PatentMessage">
+            <tr>
+              <td>公告号</td>
+              <td> <span v-if="patent">{{ patent.patentNo }}</span></td>
+              <td>公告日</td>
+              <td><span v-if="patent">{{ patent.publicDate }}</span></td>
+              <td>专利权人</td>
+              <td><span v-if="patent && patent.applicant"><span
+                    v-for="item in patent.applicant.filter(a => a.dataType === 1)">{{ item.name }}</span></span></td>
+            </tr>
+            <tr>
+              <td>优先权</td>
+              <td><span v-if="patent">{{ patent.priorityNo }}</span></td>
+              <td>案件状态</td>
+              <td> <span v-if="patent && patent.affair">{{ patent.affair[0].status }}</span></td>
+              <td>同族专利</td>
+              <td><span v-if="patent" v-html="getPatentFamily(patent)"></span></td>
+            </tr>
+          </table>
+
+          <!-- 表格专利信息 -->
+          <el-table :data="tableData1" border :span-method="objectSpanMethod" v-loading="loading" height="100%"
+            style="width: 100%; margin-top: 20px;overflow:auto">
+
+            <el-table-column prop="pRightName" label="权要" align="center" >
+              <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">
+                <div style="width:100%;outline: #dcdfe6;white-space:normal; word-break:break-all;text-align:left"
+                  id="preview" v-html="scope.row.content"></div>
+              </template>
+            </el-table-column>
+
+            <el-table-column prop="explainText" align="center" label="解释(可粘贴图片)">
+              <template slot-scope="scope">
+                <div style="width:100%;outline: #dcdfe6;white-space:normal; word-break:break-all;text-align:left"
+                  id="preview" v-html="scope.row.explainText"></div>
+              </template>
+            </el-table-column>
+            <el-table-column prop="targetDescription" align="center" label="标的说明(可粘贴图片)" >
+              <template slot-scope="scope">
+                <div style="width:100%;outline: #dcdfe6;white-space:normal; word-break:break-all;text-align:left"
+                  id="preview" v-html="scope.row.targetDescription"></div>
+              </template>
+            </el-table-column>
+            <el-table-column prop="compareResult" align="center" label="比对结果">
+              <template slot-scope="scope">
+                <div v-if="scope.row">
+                  <span v-if="scope.row.compareResult.toString() != ''">{{
+                    options.filter(item => item.value == scope.row.compareResult)[0].label }}</span>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column prop="compareDescription" align="center" label="比对说明(可粘贴图片)" >
+              <template slot-scope="scope">
+                <div style="width:100%;outline: #dcdfe6;white-space:normal; word-break:break-all;text-align:left"
+                  id="preview" v-html="scope.row.compareDescription"></div>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+      </el-aside>
+      <el-main v-show="showRight == true" :width="width" style="padding:5px">
+
+        <el-select v-model="queryParams.compareResult" clearable @change="change" placeholder="请选择对比结果">
+          <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value">
+          </el-option>
+        </el-select>
+        <div class="infinite-list-wrapper" style="overflow:auto">
+          <ul class="list" v-infinite-scroll="load" infinite-scroll-disabled="disabled">
+            <li v-for="(i, index) in patentList" :key="index" class="list-item" @click="patentChange(i, index)"> {{
+              i.patentNo }}</li>
+          </ul>
+
+        </div>
+      </el-main>
+    </el-container>
+
+    <!-- 选择专利弹窗 -->
+    <el-dialog title="选择专利" :visible.sync="dialogVisible" width="800px" :before-close="handleClose">
+
+      <patentTable :projectId="projectId"
+        @choiceFormSelected="handleChoice"></patentTable>
+
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="handleClose">取 消</el-button>
+        <el-button type="primary" @click="handleSure">确 定</el-button>
+      </span>
+    </el-dialog>
+
+    <!-- 创建报告组件 -->
+    <CreateReport ref="ReportForm"></CreateReport>
+
+    <!-- 协同任务 -->
+    <teamwork ref="teamwork"></teamwork>
+
+    <!-- 专利列表弹窗 -->
+    <patentTable ref="patentTable"></patentTable>
+
+  </div>
+</template>
+
+<script>
+import CreateReport from '@/views/report/components/dialog/addAndEditReport.vue'
+import teamwork from "@/views/report/components/dialog/teamwork.vue"
+import patentTable from "./patentTable/patentTable.vue"
+export default {
+  components: {
+    CreateReport,
+    teamwork,
+    patentTable,
+  },
+  props: ['projectId', 'patentNo', "reportType"],
+  data() {
+    return {
+      // 控制宽度
+      width: '0px',
+      // 获取数据信息的loading
+      loading:false,
+      // 控制右侧的显示与隐藏
+      showRight: false,
+      // 控制专利弹窗显示
+      dialogVisible: false,
+      patentList: [],
+      // 返回的数据
+      tableData: [],
+      // 表格数据源
+      tableData1: [],
+      // 公告号公告日等信息
+      patent: {},
+      // 表格合并信息
+      mergeObj: {},
+      mergeArr: ['pRightName'],
+      // 分页信息
+      queryParams: {
+        size: 10,
+        current: 1,
+      },
+      // 对比结果选择
+      options: [
+        {
+          value: '0',
+          label: '字面相同'
+        }, {
+          value: '1',
+          label: '等同'
+        }, {
+          value: '2',
+          label: '不相同'
+        }, {
+          value: '3',
+          label: '待确定'
+        }
+      ],
+    }
+  },
+  computed: {
+    dictMessage() {
+      var a = this.$store.state.dictMessage.dictMessage
+      if (a.REPORT_TYPE) {
+        a.REPORT_TYPE.forEach(item => {
+          if (['0', '1', '2'].includes(item.value)) {
+            item.permission = 'invalid'
+          } else if (item.value == 3) {
+            item.permission = 'FTO'
+          } else if (item.value == 4) {
+            item.permission = 'tort'
+          } else if (item.value == 5) {
+            item.permission = 'avoidDesign'
+          } else if (item.value == 7) {
+            item.permission = 'reInvalid'
+          }
+        })
+      }
+
+      return a
+    },
+  },
+  watch: {
+    showRight(val) {
+      if (val) {
+        this.width = '200px'
+      } else {
+        this.width = '0px'
+      }
+    },
+  },
+  async mounted() {
+    // await this.getPatentList()
+    if (this.patentList.length > 0) {
+      this.patent = this.patentList[0]
+      this.queryCompareMessage(this.patent.patentNo)
+    }
+
+  },
+  methods: {
+    // 处理同族专利
+    getPatentFamily() { },
+    // 创建报告
+    handleAnalyse(val) { 
+      var form = {
+        reportType: val,
+        signPatentNo:this.patentNo,
+        matterId:  [],
+        scenarioId:  [],
+      }
+      this.$refs.ReportForm.open(form)
+    },
+    // 工作协同
+    taskWork() {
+      if (this.reportType == 4) {
+        //侵权分析
+        this.$refs.teamwork.open()
+      } else {
+        this.$refs.patentTable.open()//选择专利框打开
+      }
+    },
+    // 选择专利弹窗确定
+    handleSure(){},
+    // 选择专利弹窗关闭
+    handleClose(){},
+    // 选择专利弹窗子组件发送的消息
+    handleChoice(val) { },
+    // 显示勾选的信息
+    async load() {
+      this.queryParams.current += 1
+      // await this.getPatentList()
+    },
+
+
+
+
+    // 旧代码
+    //切换专利
+    patentChange(patent, index) {
+      this.patent = patent
+      this.index = index
+      this.queryCompareMessage(this.patent.patentNo)
+    },
+    //上一篇
+    handleLink1() {
+      this.index -= 1
+      this.patent = this.patentList[this.index]
+      this.queryCompareMessage(this.patent.patentNo)
+    },
+    //下一篇
+    async handleLink() {
+      this.index += 1
+      this.patent = this.patentList[this.index]
+      this.queryCompareMessage(this.patent.patentNo)
+      if (index == this.queryParams.size * this.queryParams.current - 1) {
+        await this.getPatentList()
+      }
+    },
+    async change() {
+      this.index = 0
+      this.patentList = []
+      await this.getPatentList()
+      if (this.patentList.length > 0) {
+        this.patent = this.patentList[0]
+        this.queryCompareMessage(this.patent.patentNo)
+      }
+    },
+    // 获取数据信息
+    queryCompareMessage(patentNo) {//patentRightVos
+      this.loading = true
+      let PatentRight = {
+        patentNo: patentNo,
+        projectId: this.projectId,
+      }
+      this.$api.queryCompareMessage(PatentRight).then(res => {
+
+      }).catch(error => {
+        this.loading = false
+      })
+    },
+    //获取每个元素所需合并的行数
+    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 }) {
+      // column.property=“id”  
+      if (this.mergeArr.indexOf(column.property) !== -1) {
+        if (this.mergeObj[column.property][rowIndex]) {
+          return [this.mergeObj[column.property][rowIndex], 1]
+        } else {
+          return [0, 0];
+        }
+      }
+    },
+
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+.changePatent {
+  height: 50px;
+  width: 200px;
+  margin-left: 0 !important;
+  //   margin-bottom: 15px;
+  // margin-top: 10px;
+  text-align: left;
+  font-size: 12px;
+
+  .p {
+    display: block;
+    margin-bottom: 5px;
+    color: black;
+
+    .t {
+      height: 50px;
+      width: 100px;
+      border: 1px solid #797979;
+      padding-left: 10px;
+      color: #1e9fff;
+      font-size: 14px;
+      font-weight: bold;
+    }
+  }
+
+  .n {
+    margin-left: 18px;
+    font-size: 12px;
+    color: #797979;
+  }
+}
+
+.infinite-list-wrapper {
+  // height: 300px;
+  text-align: center;
+}
+
+.infinite-list-wrapper .list {
+  padding: 0;
+  margin: 0;
+  list-style: none;
+}
+
+.infinite-list-wrapper .list-item {
+  cursor: pointer;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  height: 50px;
+  margin: 10px 0;
+  // border:1px solid #ebeef5 ;
+  background: #e8f3fe;
+  // color: #ff8484;
+}
+
+.avatar {
+  position: relative;
+  width: 148px;
+  height: 148px;
+  display: inline-block;
+}
+
+.avatar image {
+  width: 148px;
+  height: 148px;
+}
+
+.PatentMessage {
+  width: 100%;
+  border-top: 1px solid #ebeef5;
+  border-left: 1px solid #ebeef5;
+  border-spacing: 0;
+}
+
+.PatentMessage td {
+  padding: 10px 30px;
+  border-bottom: 1px solid #ebeef5;
+  border-right: 1px solid #ebeef5;
+}
+</style>

+ 58 - 26
src/views/report/components/splitPage/splitPage.vue

@@ -31,18 +31,19 @@
             <el-option label="仅显示主权要" value="1"></el-option>
           </el-select>
         </div>
-        <div style="display:flex;align-items:center">
-          <div>
+        <div style="display:flex;align-items:center;">
+          <div class="margin-right_10">
             <slot name="handleRight"></slot>
           </div>
-          <div v-if="isEdit || isResult!=2">
+          <div v-if="isEdit || isResult != 2">
+
             <el-button @click="save" type="primary">保存</el-button>
           </div>
         </div>
       </el-header>
       <el-main>
         <el-table :data="tableData2" border ref="table" height="calc(100%)" :span-method="objectSpanMethod"
-          v-loading="loading" style="width: 100%">
+          v-loading="loading" style="width: 100%;overflow: auto;" :cell-class-name="isResult==3?checkDel:''">
           <el-table-column prop="pRightName" label="权要" align="center">
             <template slot-scope="scope">
               <!-- <el-tooltip class="item" effect="dark"
@@ -80,34 +81,36 @@
           </el-table-column>
 
           <!-- 父组件传递栏位 -->
-          <el-table-column v-for="(item,index) in columnList" :key="index" :prop="item.value" :label="item.name"
-            align="center">
+          <el-table-column v-for="(item, index) in columnList" :key="index" :prop="item.value" :label="item.name"
+            align="center" min-width="160px">
 
             <template slot-scope="scope">
 
               <div v-if="item.type == 'String'">
                 <div v-if="isEdit || item.disabled">
-                  <myRichText style="text-align:left" :value="getColumnData(scope.row,item)" @input="getValue($event,scope.row,item)"  :placeholder="'请输入' + item.name">
+                  <myRichText style="text-align:left" :value="getColumnData(scope.row, item)"
+                    @input="getValue($event, scope.row, item)" :placeholder="'请输入' + item.name">
                   </myRichText>
                 </div>
-                <div v-else v-html="getColumnData(scope.row,item)"></div>
+                <div v-else v-html="getColumnData(scope.row, item)"></div>
               </div>
 
               <div v-else-if="item.type == 'Array'">
                 <div v-if="isEdit || item.disabled">
-                  <el-select :value="getColumnData(scope.row,item)" @input="getValue($event,scope.row,item)" placeholder="请选择">
+                  <el-select :value="getColumnData(scope.row, item)" @input="getValue($event, scope.row, item)"
+                    placeholder="请选择">
                     <el-option v-for="optionItem in item.options" :key="optionItem.value" :label="optionItem.label"
                       :value="optionItem.value">
                     </el-option>
                   </el-select>
                 </div>
-                <div v-else v-html="getColumnData(scope.row,item)"></div>
+                <div v-else v-html="getColumnData(scope.row, item)"></div>
               </div>
-              <div v-if="item.type == 'btn'">
-                <span v-for="(btn,index) in item.btn" :key="index">
-                  <component :is="btn.type" @click="$emit('changeResult',scope.row)">{{ btn.name }}</component>  
+              <div v-if="item.type == 'btn'" >
+                <span v-for="(btn, index) in item.btn" :key="index">
+                  <component :is="btn.type" @click="$emit('changeResult', scope.row)">{{ btn.name }}</component>
                 </span>
-                
+
               </div>
 
             </template>
@@ -148,7 +151,7 @@ export default {
         return []
       }
     },
-    isResult:'',
+    isResult: '',
   },
   data() {
     return {
@@ -200,44 +203,58 @@ export default {
         if (field.value && field.value.length > 0) {
           try {
             field.value.forEach(item => {
-              if (!str[item]) {
+              if (str[item] != 0 && !str[item]) {
                 throw Error();
               }
               str = str[item]
             })
           }
-          catch(e) {
+          catch (e) {
             return ''
           }
-          
+
+        }
+        if (this.isEdit || field.disabled) {
+
+        } else {
+          if (field.options && field.options.length > 0) {
+            let a = field.options.find(item => {
+              return item.value == str
+            })
+            if (a) {
+              return a.label
+            } else {
+              return ''
+            }
+          }
         }
         return str
       }
-      
+
     },
-    getValue(value,row,field) {
+    getValue(value, row, field) {
       if (typeof field.value == 'string') {
-         row[field.value] = value
+        row[field.value] = value
       } else {
         var str = row
         if (field.value && field.value.length > 0) {
           try {
             field.value.forEach((item, index) => {
               if (index == field.value.length - 1) {
-                str[item] = value
+                this.$set(str, item, value)
                 return
               } else {
                 if (!str[item]) {
-                    str[item] = {}
+                  this.$set(str, item, {})
                 }
               }
               str = str[item]
             })
           }
-          catch(e) {
+          catch (e) {
             return ''
           }
-          
+
         }
       }
     },
@@ -478,8 +495,23 @@ export default {
         data[i].sysOrder = i + 1
       }
     },
+    // 协同对比结果高亮
+    checkDel({ row, rowIndex }) {
+      for (let k in row.finalRecordVO) {
+        if (k != 'id') {
+          if (row.finalRecordVO[k] != row.currentRecordVO[k]) {
+            return 'success-rowCheck'
+          }
+        }
+      }
+    }
+
   },
 }
 </script>
-
+<style>
+.success-rowCheck {
+    background: #e1b0a7;
+  }
+</style>
 <style lang="scss" scoped></style>

+ 90 - 24
src/views/report/tort/components/tortContrast.vue

@@ -38,14 +38,18 @@
 
             <component :is="viewType" style="height: calc(100% - -10px);overflow: auto;" :tableData="tableData"
               :patentNo="patentNo" :projectId="projectId" :reportType="reportType" :columnList="columnList"
-              @splitSelect="splitSelect" @isSave="isSave" :isEdit="taskId ? false : true" :isResult="isResult" @changeResult="changeResult"
-              ></component>
+              @splitSelect="splitSelect" @isSave="isSave" :isEdit="taskId ? false : true" :isResult="isResult"
+              @changeResult="changeResult">
+              <div slot="handleRight" v-if="isResult == 3">
+                <el-button type="primary" @click="agree">全部同意</el-button>
+              </div>
+            </component>
 
           </el-main>
         </el-container>
 
         <div v-show="look" slot="right" style="height: 100%;width:100%;">
-          <!-- <patentDetailsPage :projectId="projectId"></patentDetailsPage> -->
+          <patentDetailsPage :projectId="projectId"></patentDetailsPage>
         </div>
       </myView>
     </div>
@@ -81,12 +85,12 @@ export default {
         {
           name: "标的说明(可粘贴图片)",
           type: "String",
-          value: ['originalRecordVO','targetDescription'],
+          value: ['originalRecordVO', 'targetDescription'],
         },
         {
           name: "比对结果",
           type: "Array",
-          value: ['originalRecordVO','compareResult'],
+          value: ['originalRecordVO', 'compareResult'],
           options: [
             {
               value: 0,
@@ -106,7 +110,7 @@ export default {
         {
           name: "比对说明(可粘贴图片)",
           type: "String",
-          value: ['originalRecordVO','compareDescription'],
+          value: ['originalRecordVO', 'compareDescription'],
         },
       ],
       // 查看详情
@@ -114,7 +118,7 @@ export default {
     }
   },
   mounted() {
-    
+
     this.getColumn()
     this.getList()
   },
@@ -125,17 +129,16 @@ export default {
         2: '查看协同结果',
         3: '确认结果'
       }
-      // var b = 3
-      var  confirmColumn= [
-      {
+      var confirmColumn = [
+        {
           name: "协同标的说明(可粘贴图片)",
           type: "String",
-          value: ['originalRecordVO','targetDescription'],
+          value: ['currentRecordVO', 'targetDescription'],
         },
         {
           name: "协同比对结果",
           type: "Array",
-          value:['originalRecordVO','compareResult'],
+          value: ['currentRecordVO', 'compareResult'],
           options: [
             {
               value: 0,
@@ -155,30 +158,35 @@ export default {
         {
           name: "协同比对说明(可粘贴图片)",
           type: "String",
-          value: ['originalRecordVO','compareDescription'],
+          value: ['currentRecordVO', 'compareDescription'],
         },
       ]
       switch (this.isResult) {
         case '1':
-          this.columnList.forEach(item => {
+          // this.columnList.forEach(item => {
+          //   item.disabled = true
+          // })
+          confirmColumn.forEach(item => {
             item.disabled = true
           })
+          this.columnList = confirmColumn
           break;
         case '2':
           this.columnList = this.columnList.concat(confirmColumn)
           break;
-        case '3':
+        case '3'://finalVO
           this.columnList.forEach(item => {
             item.disabled = true
+            item.value[0] = 'finalRecordVO'
           })
           confirmColumn.push(
             {
               type: 'btn',
-              name:'操作',
+              name: '操作',
               btn: [
                 {
                   type: 'elButton',
-                  name:'确认结果',
+                  name: '同意协同人意见',
                 }
               ]
             }
@@ -187,8 +195,27 @@ export default {
           break;
       }
     },
-    changeResult(row) {
-      console.log(row)
+    // 全部同意
+    agree() {
+      this.tableData.forEach(item => {
+        for (let key in item) {
+          if (key == 'currentRecordVO') {
+            for (let k in item[key]) {
+              item.finalRecordVO[k] = item[key][k]
+            }
+          }
+        }
+      })
+    },
+    // 当前行数据同意
+    changeResult(row) {//协同后currentRecordVO,
+      for (let key in row) {
+        if (key == 'currentRecordVO') {
+          for (let k in row[key]) {
+            row.finalRecordVO[k] = row[key][k]
+          }
+        }
+      }
     },
     // 查看详情
     lookDetails() {
@@ -199,7 +226,7 @@ export default {
       this.$refs.teamwork.open()
     },
     // 返回
-    goBack() { 
+    goBack() {
       if (this.taskId) {
         this.$router.replace({
           path: '/myTask',
@@ -216,8 +243,31 @@ export default {
     },
     // 保存结果
     isSave(val) {
-      if (this.taskId) {//确认协同结果保存
-      } else if (this.taskId && this.isTaskLook) {//处理或查看协同结果保存
+      if (this.taskId && this.isResult == 3) {//确认协同结果保存
+        for (let i = 0; i < val.length; i++) {
+          if (val[i].finalRecordVO) {
+            for (let key in val[i].finalRecordVO) {
+              val[i][key] = val[i].finalRecordVO[key]
+            }
+          }
+        }
+        let params = {
+          taskId: this.taskId,
+          tortDTOS: val,
+        }
+        this.$api.addFinalTortResult(params).then(res => {
+          if (res.code == 200) {
+            this.$message.success('保存成功')
+          }
+        })
+      } else if (this.taskId && this.isResult == 1) {//处理或查看协同结果保存
+        for (let i = 0; i < val.length; i++) {
+          if (val[i].currentRecordVO) {
+            for (let key in val[i].currentRecordVO) {
+              val[i][key] = val[i].currentRecordVO[key]
+            }
+          }
+        }
         let params = {
           taskId: this.taskId,
           tortDTOS: val,
@@ -228,6 +278,13 @@ export default {
           }
         })
       } else {//侵权报告拆分保存
+        for (let i = 0; i < val.length; i++) {
+          if (val[i].originalRecordVO) {
+            for (let key in val[i].originalRecordVO) {
+              val[i][key] = val[i].originalRecordVO[key]
+            }
+          }
+        }
         let params = {
           projectId: this.projectId,
           tortDTOS: val,
@@ -246,7 +303,7 @@ export default {
     // 获取数据
     getList(split = { splitType: '1', splitBy: '2' }, ifReSplit = false) {
       let params = {}
-      if (this.taskId) {//确认协同结果,处理协同
+      if (this.taskId && this.isResult == 1) {//处理协同
         params = {
           taskId: this.taskId
         }
@@ -255,7 +312,16 @@ export default {
             this.getInterface(res)
           }
         })
-      }else {//侵权报告拆分
+      } else if (this.taskId && this.isResult == 3) {//确认协同结果,
+        params = {
+          taskId: this.taskId
+        }
+        this.$api.getTortFinalResult(params).then(res => {
+          if (res.code == 200) {
+            this.getInterface(res)
+          }
+        })
+      } else {//侵权报告拆分
         params = {
           ifReSplit: ifReSplit,
           projectId: Number(this.projectId),