Explorar o código

侵权分析的对比结果保存查询,协同任务的添加,协同结果的查询

zhuhao hai 1 ano
pai
achega
44dc9877bd

+ 32 - 2
src/api/newApi/report.js

@@ -73,13 +73,43 @@ export default {
    * 编辑或保存产品信息
    */
   addProductMessage(data) {
-    return axios.post("/xiaoshi/fto/addProductMessage", data);
+    return axios.post("/xiaoshi/tort/addProductMessage", data);
   },
   /**
    * 查询产品信息
    */
   getProductMessage(params) {
-    return axios.get("/xiaoshi/fto/getProductMessage", {params});
+    return axios.get("/xiaoshi/tort/getProductMessage", {params});
+  },
+  /**
+   * 保存侵权对比结果
+   */
+  addTortCompareRecord(data) {
+    return axios.post("/xiaoshi/tort/addTortCompareRecord", data);
+  },
+  /**
+   * 查询侵权对比结果
+   */
+  getTortCompareRecord(data) {
+    return axios.post("/xiaoshi/tort/getTortCompareRecord", data);
+  },
+  /**
+   * 添加侵权报告协同任务
+   */
+  addTortTask(data) {
+    return axios.post("/xiaoshi/tort/addTortTask", data);
+  },
+  /**
+   * 查詢侵权报告协同任务对比结果
+   */
+  getTortTaskResult(params) {
+    return axios.get("/xiaoshi/tort/getTortTaskResult", {params});
+  },
+  /**
+   * 根据任务id查专利号
+   */
+  getPatentNoByTaskId(params) {
+    return axios.get("/xiaoshi/projectTask/getPatentNoByTaskId", {params});
   },
 
 

+ 24 - 0
src/router/index.js

@@ -301,6 +301,30 @@ const routes = [
             },
             component:() => import('@/views/report/tort/index.vue'),
           },
+          // 产品信息录入
+          {
+            path: '/informationEntry',
+            name:"informationEntry",
+            meta:{
+              aside: true,
+              showHeader: true,
+              sign:'informationEntry',
+              belong:'AllReport'
+            },
+            component:() => import('@/views/report/tort/components/informationEntry/index.vue'),
+          },
+          // 产品信息录入
+          {
+            path: '/tortTeamWork',
+            name:"tortTeamWork",
+            meta:{
+              aside: true,
+              showHeader: true,
+              sign:'tortTeamWork',
+              belong:'AllReport'
+            },
+            component:() => import('@/views/report/tort/components/tortTeamWork/index.vue'),
+          },
           //回避设计
           {
             path: '/avoid',

+ 253 - 0
src/views/report/components/dialog/teamwork.vue

@@ -0,0 +1,253 @@
+<template>
+  <div>
+    <el-dialog title="请求协同" :visible.sync="visibleCollaboration" :close-on-click-modal="false" :before-close="close"
+      class="sendCollaboration" width="600px" append-to-body>
+      <div>
+        <el-form :model="form" :rules="clientRules" ref="clientForm">
+
+          <el-form-item label="协同人:" prop="headId">
+            <el-select v-model="form.handler" placeholder="请选择协同人(只能选一名协同人)" style="width: 100%;" filterable remote
+              :remote-method="remoteMethodPerson" v-SelectLazyLoading="lazyLoadingPerson"
+              :loading="personnelList.loading">
+              <el-option v-for="item in personnelList.data" :key="item.id" :label="item.name + '<' + item.email + '>'"
+                :value="item.id" :disabled="item.id ? false : true">
+                <span style="float: left">{{ item.name }}</span>
+                <span style="float: left">
+                  <{{ item.email }}>
+                </span>
+                <!-- <span style="float: right; color: #8492a6; font-size: 13px" v-if="!item.id">
+                  <el-button size="small" @click="create(0)">创建</el-button>
+                </span> -->
+              </el-option>
+            </el-select>
+            <p style="position: absolute; right: 10px;top: 28px;width:20px"><i class="el-icon-circle-plus-outline"
+                style="font-size:20px" @click="create(0)"></i></p>
+          </el-form-item>
+
+          <el-form-item label="抄送人:" prop="people">
+            <el-select v-model="form.people" placeholder="请选择抄送人(可选择多名抄送人)" style="width: 100%;" filterable remote multiple
+              :remote-method="remoteMethodPerson" v-SelectLazyLoading="lazyLoadingPerson"
+              :loading="personnelList.loading">
+              <el-option v-for="item in personnelList.data" :key="item.id" :label="item.name + '<' + item.email + '>'"
+                :value="item.id">
+                <span style="float: left">{{ item.name }}</span>
+                <span style="float: left">
+                  <{{ item.email }}>
+                </span>
+                <!-- <span style="float: right; color: #8492a6; font-size: 13px" v-if="!item.id"><el-button size="small"
+                    @click="create(1)">创建</el-button></span> -->
+              </el-option>
+            </el-select>
+            <p style="position: absolute; right: 10px;top: 28px;width:20px"><i class="el-icon-circle-plus-outline"
+                style="font-size:20px" @click="create(1)"></i></p>
+          </el-form-item>
+
+          <el-form-item label="主题:" prop="name">
+            <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"
+              type="datetime" placeholder="选择日期">
+            </el-date-picker>
+          </el-form-item>
+          <el-form-item label="备注:" prop="description">
+            <el-input v-model="form.description" type="textarea" placeholder="输入备注" />
+          </el-form-item>
+        </el-form>
+      </div>
+      <div slot="footer" class="dialog-footer" style="display: flex;justify-content: flex-end;">
+        <el-button @click="close">取 消</el-button>
+        <el-button type="primary" @click="submit">发送</el-button>
+      </div>
+    </el-dialog>
+
+
+    <el-dialog title="创建人员" :visible.sync="visiblePerson" :close-on-click-modal="false" width="500px" append-to-body>
+      <el-form :model="createdPerson" :rules="createdPersonRules" ref="createdPerson">
+        <el-form-item label="姓名 :" prop="name">
+          <el-input v-model="createdPerson.name" placeholder="请输入姓名" />
+        </el-form-item>
+        <el-form-item label="邮箱 :" prop="email">
+          <el-input v-model="createdPerson.email" placeholder=" 请输入邮箱" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="closeCreated">取 消</el-button>
+        <el-button type="primary" @click="submitCreated">确定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { personnelLoading } from '@/views/patentMining/components/mixins/index2'
+export default {
+  mixins: [personnelLoading],
+  props: {
+    // 信息(patentNo,reportId)
+    word: {
+      type: Object,
+      default: () => {
+        return {
+          patentNo: '',
+          projectId: ''
+        }
+      }
+    },
+  },
+  data() {
+    //校验协同人是否为空
+    const isCollaborator = (rule, value, callback) => {
+      if (!this.form.handler) {
+        callback(new Error('请选择协同人'))
+      } else {
+        callback()
+      }
+    }
+    const isEmail = (rule, value, callback) => {
+      const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/;
+      if (!this.createdPersonRules.email) {
+        return callback(new Error("邮箱不能为空"));
+      }
+      setTimeout(() => {
+        if (mailReg.test(value)) {
+          callback();
+        } else {
+          callback(new Error("请输入正确的邮箱格式"));
+        }
+      }, 100);
+    };
+    const isTime = (rule, value, callback) => {
+      if (this.isEndTime) {
+        this.isEndTimes = Date.parse(new Date)
+      }
+      let b = Date.parse(value)
+      if (value) {
+        if (b <= this.isEndTimes) {
+          callback(new Error('禁止选择现在及以前时间,请重新选择'))
+        } else {
+          callback()
+        }
+      } else {
+        callback()
+      }
+    }
+    return {
+      // 控制协同弹窗
+      visibleCollaboration: false,
+      // 协同表单
+      form: {},
+      // 协同弹窗的校验
+      clientRules: {
+        headId: [{ required: true, validator: isCollaborator, trigger: 'change' },],
+        name: [{ required: true, message: "请输入主题", trigger: "blur" },],
+        deadlineTime: [
+          { required: false, validator: isTime, trigger: 'change' }
+        ],
+      },
+      // 人员loading
+      loading: false,
+      // 创建外来人员的信息
+      createdPerson: {},
+      // 控制创建人员弹窗
+      visiblePerson: false,
+      // 创建人员弹窗的校验
+      createdPersonRules: {
+        name: [{ required: true, message: "请输入姓名", trigger: "blur" },],
+        email: [{ required: true, validator: isEmail, trigger: "change" },],
+      },
+      isEndTime:true,
+      isEndTimes:null,
+      // 记录从哪里进入创建人员弹窗
+      witchOne: null,
+      isIf: false
+    }
+  },
+  mounted() {
+
+  },
+  methods: {
+    // 打开协同弹窗
+    open() {
+      this.visibleCollaboration = true
+    },
+    // 协同弹窗的关闭
+    close() {
+      this.isEndTime=true
+      this.$refs.clientForm.resetFields()
+      this.form = {}
+      this.visibleCollaboration = false
+    },
+    // 协同弹窗的确定
+    submit() {
+      this.isEndTime=false
+      this.$refs.clientForm.validate((valid) => {
+        if (valid) {
+          this.form.projectId=this.word.projectId//项目id
+          // 判断是否为外部人员
+          if (this.form.handler.includes('@')) {//是邮箱为1
+            this.form.handlerType = 1
+          } else {//是id为0
+            this.form.handlerType = 0
+          }
+          this.people()
+          console.log(this.form);
+          this.$api.addTortTask(this.form).then(res => {
+            if (res.code == 200) {
+              this.$message.success('发送协同任务成功')
+            }
+          })
+        }
+      })
+    },
+    // 处理协同人数据
+    people() {
+      if (this.form.people && this.form.people.length > 0) {
+        this.form.ccPeople = []
+        var ifInner = ''
+        this.form.people.forEach(item => {
+          if (item.includes('@')) {//是邮箱为1
+            ifInner = 1
+          } else {//是id为0
+            ifInner = 0
+          }
+          let obj = {
+            personId: item,
+            ifInner: ifInner
+          }
+          this.form.ccPeople.push(obj)
+        })
+      } else {
+        this.form.ccPeople=[]
+      }
+    },
+    // 创建人员弹窗的关闭
+    closeCreated() {
+      this.$refs.createdPerson.resetFields()
+      this.createdPerson = {}
+      this.visiblePerson = false
+    },
+    // 创建人员弹窗的确定
+    submitCreated() {//handler
+      this.$refs.createdPerson.validate((valid) => {
+        if (valid) {
+          let name = this.createdPerson.name + '<' + this.createdPerson.email + '>'
+          if (this.witchOne == 1) {
+            this.form.people.push(name)
+          } else {
+            this.form.handler = name
+          }
+          this.closeCreated()
+        }
+      })
+    },
+    create(key) {
+      this.witchOne = key
+      this.visiblePerson = true
+    },
+  },
+}
+</script>
+
+<style lang="scss" scoped></style>

+ 16 - 3
src/views/report/components/index.vue

@@ -520,14 +520,27 @@ export default {
         case '14'://导入无效证据
           this.toInvalidResponset(row)
           break;
-        case '14'://录入产品信息
-          this.toInvalidResponset(row)
+        case '15'://录入产品信息
+          this.toInformationEntry(row)
           break;
         case 'e'://编辑
           this.handleEdit(row)
           break
       }
     },
+    // 跳转录入产品信息页面
+    toInformationEntry(row) {
+      var routerReport = this.$router.resolve({
+        path: "/informationEntry",
+        query: {
+          patentNo: row.signPatentNo,
+          reportId: row.id,
+          reportType: row.reportType
+        }
+      })
+      window.open(routerReport.href, '_blank');
+    },
+
     // 跳转专利与产品关联比对
     toTortIndex(row) {
       var routerReport = this.$router.resolve({
@@ -535,7 +548,7 @@ export default {
         query: {
           patentNo: row.signPatentNo,
           reportId: row.id,
-          reportType:row.reportType
+          reportType: row.reportType
         }
       })
       window.open(routerReport.href, '_blank');

+ 39 - 9
src/views/report/components/splitPage/splitPage.vue

@@ -35,7 +35,7 @@
           <div>
             <slot name="handleRight"></slot>
           </div>
-          <div v-if="isEdit">
+          <div v-if="isEdit || isPartEdit">
             <el-button @click="save" type="primary">保存</el-button>
           </div>
         </div>
@@ -45,10 +45,10 @@
           v-loading="loading" style="width: 100%">
           <el-table-column prop="pRightName" label="权要" width="180" align="center">
             <template slot-scope="scope">
-              <el-tooltip class="item" effect="dark"
+              <!-- <el-tooltip class="item" effect="dark"
                 :content="rightList.length > 0 ? rightList.filter(item => { return item.sort == scope.row.rightSort })[0].content : '暂无数据'"
-                placement="top">
-                <!-- <el-tooltip class="item" effect="dark" :content="scope.row.pContent" placement="top"> -->
+                placement="top"> -->
+                <el-tooltip class="item" effect="dark" :content="scope.row.pContent" placement="top">
                 <span>{{ scope.row.pRightName }}</span>
               </el-tooltip>
             </template>
@@ -86,7 +86,7 @@
             <template slot-scope="scope">
 
               <div v-if="item.type == 'String'">
-                <div v-if="isEdit">
+                <div v-if="isEdit || isPartEdit">
                   <myRichText style="text-align:left" v-model="scope.row[item.value]" :placeholder="'请输入' + item.name">
                   </myRichText>
                 </div>
@@ -94,7 +94,7 @@
               </div>
 
               <div v-else>
-                <div v-if="isEdit">
+                <div v-if="isEdit || isPartEdit">
                   <el-select v-model="scope.row[item.value]" placeholder="请选择">
                     <el-option v-for="optionItem in item.options" :key="optionItem.value" :label="optionItem.label"
                       :value="optionItem.value">
@@ -149,7 +149,10 @@ export default {
         return []
       }
     },
-
+    isPartEdit: {
+      type: Boolean,
+      default: true
+    }
   },
   data() {
     return {
@@ -189,7 +192,6 @@ export default {
     this.getRight()
   },
   methods: {
-
     //获取权要
     getRight() {
       let params = {
@@ -246,7 +248,7 @@ export default {
     },
     // 选择拆分类型或拆分符号
     splitSelect(val, type) {
-      this.$confirm('重新进行拆分将会清空所有的解释以及回避设计信息,此操作不可逆, 是否继续?', '提示', {
+      this.$confirm('重新进行拆分将会清空所有的解释以及其他栏位信息,此操作不可逆, 是否继续?', '提示', {
         confirmButtonText: '确定',
         cancelButtonText: '取消',
         type: 'warning'
@@ -332,6 +334,11 @@ export default {
         arr.forEach(item => {
           merge[item] = ''
         })
+        let splitDisable = this.splitDisable()
+        if (!splitDisable) {
+          this.$message.error('您勾选的特征已填写对比结果信息,无法对勾选的特征进行合并、拆分等操作')
+          return false
+        }
         // 将内容合并起来
         this.scopeRow.forEach((rowItem, rowIndex) => {
           for (let m = 0; m < arr.length; m++) {
@@ -368,6 +375,11 @@ export default {
           })
           return false
         }
+        let splitDisable = this.splitDisable()
+        if (!splitDisable) {
+          this.$message.error('您勾选的特征已填写对比结果信息,无法对勾选的特征进行合并、拆分等操作')
+          return false
+        }
         var rowId = Math.floor((Math.random() * 9999) + 1000);
         var arr = this.columnMerge()
         this.scopeRow.forEach((rowItem, rowIndex) => {
@@ -387,6 +399,24 @@ export default {
         this.checkList = []
       }
     },
+    splitDisable() {
+      var arr = this.columnMerge()
+      for (let a = 0; a < this.scopeRow.length; a++) {
+        var b = true
+        for (let c = 0; c < arr.length; c++) {
+          if (this.scopeRow[a].hasOwnProperty(arr[c])) {
+            b = false
+          } else {
+            b = true
+          }
+        }
+        if (!b) {
+          return false
+        } else {
+          return true
+        }
+      }
+    },
     // 拆分或合并后重新排序
     handleSort(rightSort) {
       var data = this.tableData2.filter(item => {

+ 4 - 2
src/views/report/components/view/table.vue

@@ -35,8 +35,10 @@
               <el-dropdown-item command="3" v-if="[2].includes(scope.row.status)&&[0,1,2,3].includes(scope.row.reportType) && $reportPermission(scope.row.id,[0,1])">自定义字段</el-dropdown-item>
               <el-dropdown-item command="4" v-if="[2].includes(scope.row.status)&& [0,1,2,3].includes(scope.row.reportType) && $reportPermission(scope.row.id,[0,1])">任务分配</el-dropdown-item>
               <el-dropdown-item command="5" v-if="[2].includes(scope.row.status) && [0,1,2].includes(scope.row.reportType) && $reportPermission(scope.row.id,[0,1])">拆分特征</el-dropdown-item>
-              <el-dropdown-item command="15" v-if="[2].includes(scope.row.status) && [3,4].includes(scope.row.reportType) && $reportPermission(scope.row.id,[0,1])">产品信息录入</el-dropdown-item>
-              <el-dropdown-item command="8" v-if="(scope.row.reportType == 4 && [2].includes(scope.row.status)) && $reportPermission(scope.row.id,[0,1])">专利与产品关联比对</el-dropdown-item>
+              <!-- <el-dropdown-item command="15" v-if="[2].includes(scope.row.status) && [3,4].includes(scope.row.reportType) && $reportPermission(scope.row.id,[0,1])">产品信息录入</el-dropdown-item> -->
+              <el-dropdown-item command="15" >产品信息录入</el-dropdown-item>
+              <!-- <el-dropdown-item command="8" v-if="(scope.row.reportType == 4 && [2].includes(scope.row.status)) && $reportPermission(scope.row.id,[0,1])">专利与产品关联比对</el-dropdown-item> -->
+              <el-dropdown-item command="8">专利与产品关联比对</el-dropdown-item>
               <!-- <el-dropdown-item command="9" v-if="(scope.row.reportType == 5 && [2].includes(scope.row.status)) && $reportPermission(scope.row.id,[0,1])"> 规避方案填写</el-dropdown-item> -->
               <el-dropdown-item command="9" > 规避方案填写</el-dropdown-item>
               <el-dropdown-item command="10" v-if="[0,1,2,3].includes(scope.row.reportType)&&[2].includes(scope.row.status) && $reportPermission(scope.row.id,[0,1])"> 相关对比文件</el-dropdown-item>

+ 44 - 0
src/views/report/tort/components/informationEntry/index.vue

@@ -0,0 +1,44 @@
+<template>
+  <div>
+    <informationEntry :word="{ patentNo: patentNo, projectId: projectId }" :reportType="reportType" :isSave="isSave">
+      <div slot="save">
+        <el-button type="primary" @click="isSave">保存</el-button>
+      </div>
+    </informationEntry>
+  </div>
+</template>
+
+<script>
+import informationEntry from './informationEntry.vue';
+export default {
+  components: {
+    informationEntry
+  },
+  data() {
+    return {
+      isSave:false
+    }
+  },
+  computed: {
+    patentNo() {
+      return this.$route.query.patentNo
+    },
+    projectId() {
+      return this.$route.query.reportId
+    },
+    reportType() {
+      return this.$route.query.reportId
+    }
+  },
+  mounted() {
+
+  },
+  methods: {
+    isSave() {
+      this.isSave = !this.isSave
+    },
+  },
+}
+</script>
+
+<style lang="scss" scoped></style>

+ 11 - 4
src/views/report/tort/components/informationEntry.vue

@@ -1,5 +1,5 @@
 <template>
-  <!-- 产品信息录入 -->
+  <!-- 产品信息录入/产品信息 -->
   <div>
     <!-- <div style="display: flex;justify-content: end;">
       <el-button v-if="isFormEdit" type="primary" @click="isSave">保存</el-button>
@@ -124,6 +124,9 @@ export default {
     isFormEdit: {
       type: Boolean,
       default: true
+    },
+    isSave: {
+      type:Boolean
     }
   },
   data() {
@@ -140,6 +143,11 @@ export default {
       },
     }
   },
+  watch: {
+    isSave(val) {
+      this.isSave()
+    },
+  },
   mounted() {
     this.getList()
   },
@@ -168,9 +176,8 @@ export default {
     },
     // 保存
     isSave() {
-      this.form.fileGuids = this.form.systemFileList.map(item => {
-        return item.guid
-      })
+      // 判断文件是否都上传完毕
+      this.$commonJS.allUploadFile(this.form)
       let params = {
         ...this.word,
         ...this.form

+ 108 - 43
src/views/report/tort/components/tortContrast.vue

@@ -1,45 +1,73 @@
 <template>
   <!-- 专利与产品关联比对 -->
-  <div class="height_100">
+  <div class="height_100 tortContrast">
 
-    <el-container>
-      <el-header>
-        <div style="width: 100%;padding: 10px;display:flex;justify-content: space-between;align-items: center;">
-          <div>
-            <p v-if="viewType == 'splitPage'"> 标的专利号:<el-link type="primary" @click="toPatentDetails(patentNo)">{{ patentNo }}</el-link> </p>
+    <div class="height_100" style="display: flex;">
+      <div class="iconBtnList">
+        <el-tooltip content="返回" placement="right">
+          <div @click="goBack" class="iconBtn">
+            <i class="el-icon-back"></i>
           </div>
-          <div>
-            <el-link type="primary" @click="handleSwitch">{{viewType=='splitPage'?'切换产品信息':'切换产品特征'}}</el-link>
+        </el-tooltip>
+        <el-tooltip content="协同办公" placement="right">
+          <div @click="coordination" class="iconBtn">
+            <i class="el-icon-s-custom"></i>
           </div>
-        </div>
-      </el-header>
-      <el-main style="padding: 0px !important;">
+        </el-tooltip>
+        <el-tooltip content="查看详情" placement="right">
+          <div @click="lookDetails" class="iconBtn">
+            <i class="el-icon-c-scale-to-original"></i>
+          </div>
+        </el-tooltip>
+      </div>
+      <myView style="height: 100%;width: calc(100% - 50px);" position="row" :showView="look">
+        <el-container slot="left">
+          <el-header class="headerBtn">
+            <div style="width: 100%;display:flex;justify-content: space-between;align-items: center;">
+              <div>
+                <p v-if="viewType == 'splitPage'"> 标的专利号:<el-link type="primary" @click="toPatentDetails(patentNo)">{{
+                  patentNo }}</el-link> </p>
+              </div>
+              <div>
+                <el-link type="primary" @click="handleSwitch">{{ viewType == 'splitPage' ? '切换产品信息' : '切换产品特征'
+                }}</el-link>
+              </div>
+            </div>
+          </el-header>
+          <el-main style="padding-top: 0px !important">
+
+            <component :is="viewType" style="height: calc(100% - 0px);overflow: auto;" :tableData="tableData"
+              :word="{ patentNo: patentNo, projectId: projectId }" :reportType="reportType" :columnList="columnList"
+              @splitSelect="splitSelect" @isSave="isSave"></component>
+
+          </el-main>
+        </el-container>
 
-        <component :is="viewType" style="height: calc(100% - 103px);overflow: auto;" :tableData="tableData"
-          :word="{ patentNo: patentNo, projectId: projectId }" :reportType="reportType" :columnList="columnList" @splitSelect="splitSelect"
-          @isSave="isSave"></component>
-          
-      </el-main>
-    </el-container>
+        <div v-show="look" slot="right"></div>
+      </myView>
+    </div>
 
+    <teamwork ref="teamwork" :word="{ patentNo: patentNo, projectId: projectId }"></teamwork>
   </div>
 </template>
 
 <script>
 import { patentDetails } from '../../components/mixins/index2'
 import splitPage from '../../components/splitPage/splitPage.vue'
-import informationEntry from './informationEntry.vue'
+import informationEntry from './informationEntry/informationEntry.vue'
+import teamwork from '../../components/dialog/teamwork.vue'
 export default {
-  props: ['patentNo', 'projectId','reportType'],
+  props: ['patentNo', 'projectId', 'reportType'],
   mixins: [patentDetails],
   components: {
     splitPage,
     informationEntry,
+    teamwork,
   },
   data() {
     return {
+      // 视图
       viewType: 'splitPage',
-      
       // 数据
       tableData: [],
       // 栏位
@@ -47,24 +75,24 @@ export default {
         {
           name: "标的说明(可粘贴图片)",
           type: "String",
-          value: "direction",
+          value: "targetDescription",
         },
         {
           name: "比对结果",
           type: "Array",
-          value: "result",
+          value: "compareResult",
           options: [
             {
-              value: 1,
+              value: 0,
               label: '字面相同'
             }, {
-              value: 3,
+              value: 1,
               label: '等同'
             }, {
-              value: 0,
+              value: 2,
               label: '不相同'
             }, {
-              value: 2,
+              value: 3,
               label: '待确定'
             }
           ],
@@ -72,27 +100,38 @@ export default {
         {
           name: "比对说明(可粘贴图片)",
           type: "String",
-          value: "directions",
+          value: "compareDescription",
         },
       ],
+      // 查看详情
+      look: false
     }
   },
   mounted() {
     this.getList()
   },
   methods: {
+    // 查看详情
+    lookDetails() {
+      this.look = !this.look
+    },
+    // 协同办公
+    coordination() { 
+      this.$refs.teamwork.open()
+    },
+    // 返回
+    goBack() { },
     // 切换产品信息
     handleSwitch() {
-      this.viewType == 'splitPage' ? this.viewType ='informationEntry' : this.viewType ='splitPage'
+      this.viewType == 'splitPage' ? this.viewType = 'informationEntry' : this.viewType = 'splitPage'
     },
-    // 保存
+    // 保存结果
     isSave(val) {
       let params = {
         projectId: this.projectId,
-        wholeContent: this.wholeContent,
-        avoidDesignDTOS: val,
+        tortDTOS: val,
       }
-      this.$api.addAvoidDesign(params).then(res => {
+      this.$api.addTortCompareRecord(params).then(res => {
         if (res.code == 200) {
           this.$message.success('保存成功')
         }
@@ -105,18 +144,17 @@ export default {
     getList(split = { splitType: '1', splitBy: '2' }, ifReSplit = false) {
       let params = {
         ifReSplit: ifReSplit,
-        // projectId: Number(this.projectId),
-        projectId: '87',
+        projectId: Number(this.projectId),
         ...split,//拆分条件
       }
-      this.$api.getAvoidDesign(params).then(res => {
+      this.$api.getTortCompareRecord(params).then(res => {
         if (res.code == 200) {
           this.wholeContent = res.data.wholeContent
-          if (res.data.avoidDesignRightVOS.length > 0) {
+          if (res.data.tortRightVOS.length > 0) {
             var data = []
-            res.data.avoidDesignRightVOS.forEach(RightVosItem => {
-              if (RightVosItem.avoidDesignVOS.length > 0) {
-                RightVosItem.avoidDesignVOS.forEach(FeaturesItem => {
+            res.data.tortRightVOS.forEach(RightVosItem => {
+              if (RightVosItem.tortVOS.length > 0) {
+                RightVosItem.tortVOS.forEach(FeaturesItem => {
                   FeaturesItem.pRightName = RightVosItem.rightName
                   FeaturesItem.pSignPatentNo = RightVosItem.signPatentNo
                   FeaturesItem.pPatentNo = RightVosItem.patentNo
@@ -139,12 +177,39 @@ export default {
       if (!item.hasOwnProperty("explainText")) {
         item.explainText = ''
       }
-      if (!item.hasOwnProperty("direction")) {
-        item.direction = ''
-      }
     },
   },
 }
 </script>
 
-<style lang="scss" scoped></style>
+<style lang="scss">
+.tortContrast {
+  .headerBtn {
+    height: 35px !important;
+    border: none;
+    padding: 15px !important;
+  }
+}
+</style>
+<style lang="scss" scoped>
+.tortContrast {
+  .iconBtnList {
+    width: 50px;
+    border-right: 1px solid #ccc;
+
+    .iconBtn {
+      width: 100%;
+      height: 50px;
+      text-align: center;
+      line-height: 50px;
+      font-size: 22px;
+      background: #ccc;
+      border-bottom: 1px solid #ffffff;
+    }
+
+    .iconBtn:hover {
+      background: #316192;
+    }
+  }
+}
+</style>

+ 47 - 0
src/views/report/tort/components/tortTeamWork/index.vue

@@ -0,0 +1,47 @@
+<template>
+  <div>
+    <tortTeamWork :patentNo="patentNo" :projectId="projectId" :taskId="taskId"></tortTeamWork>
+  </div>
+</template>
+
+<script>
+import tortTeamWork from './tortTeamWork.vue'
+export default {
+  components: {
+    tortTeamWork
+  },
+  data() {
+    return {
+      patentNo:'',
+    }
+  },
+  computed: {
+    // patentNo() {
+    //   return this.$route.query.patentNo
+    // },
+    projectId() {
+      return this.$route.query.projectId
+    },
+    taskId() {
+      return this.$route.query.taskId
+    },
+  },
+  mounted() {
+    this.getPatentNo()
+  },
+  methods: {
+    getPatentNo() {
+      let params = {
+        taskId:this.taskId
+      }
+      this.$api.getPatentNoByTaskId(params).then(res => {
+        if (res.code == 200) {
+          this.patentNo = res.data
+        }
+      })
+    },
+  },
+}
+</script>
+
+<style lang="scss" scoped></style>

+ 192 - 0
src/views/report/tort/components/tortTeamWork/tortTeamWork.vue

@@ -0,0 +1,192 @@
+<template>
+  <div class="tortTeamWork height_100">
+    <div class="height_100" style="display: flex;">
+      <div class="iconBtnList">
+        <el-tooltip content="返回" placement="right">
+          <div @click="goBack" class="iconBtn">
+            <i class="el-icon-back"></i>
+          </div>
+        </el-tooltip>
+        <el-tooltip content="查看详情" placement="right">
+          <div @click="lookDetails" class="iconBtn">
+            <i class="el-icon-c-scale-to-original"></i>
+          </div>
+        </el-tooltip>
+      </div>
+      <myView style="height: 100%;width: calc(100% - 50px);" position="row" :showView="look">
+        <el-container slot="left">
+          <el-header class="headerBtn">
+            <div style="width: 100%;display:flex;justify-content: space-between;align-items: center;">
+              <div>
+                <p v-if="viewType == 'splitPage'"> 标的专利号:<el-link type="primary" @click="toPatentDetails(patentNo)">{{
+                  patentNo }}</el-link> </p>
+              </div>
+              <div>
+                <el-link type="primary" @click="handleSwitch">{{ viewType == 'splitPage' ? '切换产品信息' : '切换产品特征'
+                }}</el-link>
+              </div>
+            </div>
+          </el-header>
+          <el-main style="padding-top: 0px !important">
+
+            <component :is="viewType" style="height: calc(100% - 0px);overflow: auto;" :tableData="tableData" :isEdit="false"
+              :word="{ patentNo: patentNo,projectId:projectId }" :columnList="columnList"
+              @isSave="isSave"></component>
+
+          </el-main>
+        </el-container>
+
+        <div v-show="look" slot="right"></div>
+      </myView>
+    </div>
+  </div>
+</template>
+
+<script>
+import splitPage from '../../../components/splitPage/splitPage.vue'
+import informationEntry from '../informationEntry/informationEntry.vue'
+export default {
+  props: ['patentNo','projectId','taskId'],
+  components: {
+    splitPage,
+    informationEntry,
+  },
+  data() {
+    return {
+      // 视图
+      viewType: 'splitPage',
+      // 数据
+      tableData: [],
+      // 栏位
+      columnList: [
+        {
+          name: "标的说明(可粘贴图片)",
+          type: "String",
+          value: "targetDescription",
+        },
+        {
+          name: "比对结果",
+          type: "Array",
+          value: "compareResult",
+          options: [
+            {
+              value: 0,
+              label: '字面相同'
+            }, {
+              value: 1,
+              label: '等同'
+            }, {
+              value: 2,
+              label: '不相同'
+            }, {
+              value: 3,
+              label: '待确定'
+            }
+          ],
+        },
+        {
+          name: "比对说明(可粘贴图片)",
+          type: "String",
+          value: "compareDescription",
+        },
+      ],
+      // 查看详情
+      look: false
+    }
+  },
+  computed: {},
+  mounted() {
+    this.getList()
+  },
+  methods: {
+    // 查看详情
+    lookDetails() {
+      this.look = !this.look
+    },
+    // 返回
+    goBack() { },
+    // 切换产品信息
+    handleSwitch() {
+      this.viewType == 'splitPage' ? this.viewType = 'informationEntry' : this.viewType = 'splitPage'
+    },
+    // 保存对比结果
+    isSave(val) {
+      let params = {
+        projectId: this.projectId,
+        tortDTOS: val,
+      }
+      this.$api.addTortCompareRecord(params).then(res => {
+        if (res.code == 200) {
+          this.$message.success('保存成功')
+        }
+      })
+    },
+    getList(split = { splitType: '1', splitBy: '2' }, ifReSplit = false) {
+      let params = {
+        taskId:this.taskId
+      }
+      this.$api.getTortTaskResult(params).then(res => {
+        if (res.code == 200) {
+          this.wholeContent = res.data.wholeContent
+          if (res.data.tortRightVOS.length > 0) {
+            var data = []
+            res.data.tortRightVOS.forEach(RightVosItem => {
+              if (RightVosItem.tortVOS.length > 0) {
+                RightVosItem.tortVOS.forEach(FeaturesItem => {
+                  FeaturesItem.pRightName = RightVosItem.rightName
+                  FeaturesItem.pSignPatentNo = RightVosItem.signPatentNo
+                  FeaturesItem.pPatentNo = RightVosItem.patentNo
+                  FeaturesItem.pContentOut = RightVosItem.contentOut
+                  FeaturesItem.pContent = RightVosItem.content
+                  FeaturesItem.pProjectId = RightVosItem.projectId
+                  FeaturesItem.pType = RightVosItem.type
+                  FeaturesItem.pSort = RightVosItem.sort
+                  this.hasOwn(FeaturesItem)
+                  data.push(FeaturesItem)
+                })
+              }
+            })
+            this.tableData = data
+          }
+        }
+      })
+    },
+    hasOwn(item) {
+      if (!item.hasOwnProperty("explainText")) {
+        item.explainText = ''
+      }
+    },
+  },
+}
+</script>
+<style lang="scss">
+.tortTeamWork {
+  .headerBtn {
+    height: 35px !important;
+    border: none;
+    padding: 15px !important;
+  }
+}
+</style>
+<style lang="scss" scoped>
+.tortTeamWork {
+  .iconBtnList {
+    width: 50px;
+    border-right: 1px solid #ccc;
+
+    .iconBtn {
+      width: 100%;
+      height: 50px;
+      text-align: center;
+      line-height: 50px;
+      font-size: 22px;
+      background: #ccc;
+      border-bottom: 1px solid #ffffff;
+    }
+
+    .iconBtn:hover {
+      background: #316192;
+    }
+  }
+}
+</style>

+ 32 - 63
src/views/task/components/index.vue

@@ -10,8 +10,8 @@
         </div>
       </el-header>
       <el-main class="height_100">
-        <el-table :data="tableData" height="calc(100% - 1px)" style="width: 100%;" border header-row-class-name="custom-table-header"
-          @sort-change="sortChange">
+        <el-table :data="tableData" height="calc(100% - 1px)" style="width: 100%;" border
+          header-row-class-name="custom-table-header" @sort-change="sortChange">
           <el-table-column label="#" align="center" width="80px">
             <template slot-scope="scope">
               <div>
@@ -82,6 +82,7 @@ import auditRecords from '@/views/patentMining/components/dialog/auditRecords.vu
 import createTask from '@/views/patentMining/components/dialog/createTask.vue'
 import handleTask1 from '@/views/patentMining/components/dialog/handleTask1.vue'
 import handleTask2 from '@/views/patentMining/components/dialog/handleTask2.vue'
+import file from '@/api/newApi/file'
 export default {
   mixins: [column, optionsData, taskPatentMining],
   // type区分是从哪里进入
@@ -93,7 +94,7 @@ export default {
     processId: '',
     show: {
       type: Boolean,
-      default:false
+      default: false
     },
   },
   components: {
@@ -278,77 +279,45 @@ export default {
 
       switch (row.type) {
         case 1://项目开卷审核任务
-          this.getPatentMining(row, str == '查看'?1:2)
+          this.getPatentMining(row, str == '查看' ? 1 : 2)
+          break;
+        case 4://协同任务
+          this.teamworkTask(row, str == '查看' ? 1 : 2)
           break;
         case 5://任务审核任务
         case 7://文件审核任务
-          row.disabled = str == '查看'?true:false
-          let router = this.$router.resolve({
-            path: '/handleExamine',
-            query: {
-              row: JSON.stringify(row)
-            }
-          })
-          window.open(router.href, '_blank')
+          this.fileExamine(row)
           break;
         case 6://文件分配任务
-          this.$refs.handleTask2Dialog.open(row, str == '查看'?false:true)
+          this.$refs.handleTask2Dialog.open(row, str == '查看' ? false : true)
           break;
 
         default:
           break;
       }
     },
-    // 处理人和负责人相同是处理流程
-    // handleTypeTask(row) {
-    //   switch (row.type) {
-    //     case 1://项目开卷审核任务
-    //       this.getPatentMining(row,2)
-    //       break;
-    //     case 5://任务审核任务
-    //     case 7://文件审核任务
-    //       row.disabled = false
-    //       let router = this.$router.resolve({
-    //         path: '/handleExamine',
-    //         query: {
-    //           row: JSON.stringify(row)
-    //         }
-    //       })
-    //       window.open(router.href, '_blank')
-    //       break;
-    //     case 6://文件分配任务
-    //       row.projectId = this.id//项目id
-    //       this.$refs.handleTask2Dialog.open(row, true)
-    //       break;
-
-    //     default:
-    //       break;
-    //   }
-    // },
-    // // 处理人和负责人不相同时处理流程
-    // handleTypeTask2(row) {
-    //   switch (row.type) {
-    //     case 1://项目开卷审核任务
-    //       this.getPatentMining(row,1)
-    //       break;
-    //     case 5://任务审核任务
-    //       row.disabled = true
-    //       let router = this.$router.resolve({
-    //         path: '/handleExamine',
-    //         query: {
-    //           row: JSON.stringify(row)
-    //         }
-    //       })
-    //       window.open(router.href, '_blank')
-    //       break;
-    //     case 6://文件分配任务
-    //       this.$refs.handleTask2Dialog.open(row, false)
-    //       break;
-
-    //     default:
-    //       break;
-    //   }
-    // },
+    //协同任务
+    teamworkTask(row, val) {
+      let router = this.$router.resolve({
+        path: '/tortTeamWork',
+        query: {
+          taskId: row.id,
+          projectId:row.projectId,
+        }
+      })
+      window.open(router.href, '_blank')
+    },
+    //文件及任务审核任务(专利挖掘)
+    fileExamine(row) {
+      row.disabled = str == '查看' ? true : false
+      let router = this.$router.resolve({
+        path: '/handleExamine',
+        query: {
+          row: JSON.stringify(row)
+        }
+      })
+      window.open(router.href, '_blank')
+    },
     // 获取挖掘项目
     getPatentMining(row, val) {
       let params = {