浏览代码

回避设计报告

zhuhao 1 年之前
父节点
当前提交
5b4267a0b6

+ 63 - 31
src/api/newApi/report.js

@@ -1,35 +1,67 @@
 import axios from "@/utils/axios";
 // 新系统专利数据库新接口
 export default {
-    /**
-     * 新增报告
-     */
-    addReportProject(data) {
-        return axios.post("/xiaoshi/reportProject/addReportProject", data);
-    },
-    /**
-     * 查询报告 
-     */
-    queryReportProject(data) {
-        return axios.post("/xiaoshi/reportProject/queryReportProject", data);
-    },
-    /**
-     * 删除报告 
-     */
-    deleteReportProject(data) {
-        return axios.post("/xiaoshi/reportProject/deleteReportProject", data);
-    },
-    /**
-     * 编辑报告 
-     */
-    updateReportProject(data) {
-        return axios.post("/xiaoshi/reportProject/updateReportProject", data);
-    },
-    /**
-     * 分组查询报告 
-     */
-    groupReportProject(data) {
-        return axios.post("/xiaoshi/reportProject/groupReportProject", data);
-    },
-   
+  /**
+   * 新增报告
+   */
+  addReportProject(data) {
+    return axios.post("/xiaoshi/reportProject/addReportProject", data);
+  },
+  /**
+   * 查询报告 
+   */
+  queryReportProject(data) {
+    return axios.post("/xiaoshi/reportProject/queryReportProject", data);
+  },
+  /**
+   * 删除报告 
+   */
+  deleteReportProject(data) {
+    return axios.post("/xiaoshi/reportProject/deleteReportProject", data);
+  },
+  /**
+   * 编辑报告 
+   */
+  updateReportProject(data) {
+    return axios.post("/xiaoshi/reportProject/updateReportProject", data);
+  },
+  /**
+   * 分组查询报告 
+   */
+  groupReportProject(data) {
+    return axios.post("/xiaoshi/reportProject/groupReportProject", data);
+  },
+  /**
+   * 查询回避设计报告 ?????
+   */
+  getAvoidDesign(data) {
+    return axios.post("/xiaoshi/avoidDesign/getAvoidDesign", data);
+  },
+  /**
+   * 保存回避设计方案
+   */
+  addAvoidDesign(data) {
+    return axios.post("/xiaoshi/avoidDesign/addAvoidDesign", data);
+  },
+  /**
+   * 查询权要
+   */
+  getPatentRight(params) {
+    return axios.get("/xiaoshi/feature/getPatentRight", { params });
+  },
+  /**
+   * 拆分特征
+   */
+  // spiltFeature(data) {
+  //   return axios.post("/xiaoshi/feature/spiltFeature", data);
+  // },
+  /**
+   * 查询拆分特征详情
+   */
+  getSpiltFeature(data) {
+    return axios.post("/xiaoshi/feature/getFeatrues", data);
+  },
+
+
+
 };

+ 1 - 5
src/views/patentMining/components/dialog/handleTask2.vue

@@ -31,7 +31,7 @@
         </el-form-item>
       </el-form>
 
-      <span slot="footer" class="dialog-footer">
+      <span slot="footer" class="dialog-footer" style="display: flex;justify-content: end;">
         <el-button @click="handleClose" size="small">取 消</el-button>
         <template>
           <div v-if="isLook" style="margin-left: 10px;">
@@ -206,9 +206,5 @@ export default {
     }
   }
 
-  .dialog-footer {
-    display: flex !important;
-    justify-content: end !important;
-  }
 }
 </style>

+ 1 - 1
src/views/patentMining/components/excavateTask/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="height_100">
-    <Table :type="1" :id="id" :processId="processId"></Table>
+    <Table :type="1" :projectId="id" :processId="processId"></Table>
   </div>
 </template>
 

+ 0 - 109
src/views/report/avoid/avoidAsid/index.vue

@@ -1,109 +0,0 @@
-<template>
-  <div>
-      <el-container>
-      <el-aside width="210px" style="overflow:hidden" class="patent-articles-menu">
-        <el-menu class="theme-dark" :default-active="activeMenu" @select="handleSelect">
-          <el-menu-item v-for="item in menuList" :key="item.path" :index="item.path" v-if="!item.show">
-            <i class="el-icon-film"></i>
-            <span slot="title">{{item.title}}</span>
-          </el-menu-item>
-        </el-menu>
-      </el-aside>
-      <el-container>
-        <el-main class="admin-main-box">
-          <component :row="row" :is="activeMenu" :reportId="reportId"  :reportId2="reportId" :patentNo="signPatentNo" :splitBy="splitBy" :splitType="splitType"></component>
-        </el-main>
-      </el-container>
-    </el-container>
-  </div>
-</template>
-
-<script>
-// import BasicInformation from '@/views/report/reportDetails/components/basicMessage.vue';
-// import SignPatent from '@/views/components/articles/components/features.vue';
-// import avoid from '@/views/report/avoid/avoidPage/avoidDirection.vue';
-// import direction from '@/views/report/avoid/avoidPage/direction.vue';
-// import ReportFile from '@/views/report/reportDetails/components/reportFile.vue';
-// import TaskDetails from '@/views/report/reportDetails/components/taskDetails.vue';
-// import remarryMatter from '@/views/report/components/matter/remarryMatter.vue';
-export default {
-  components:{
-    // BasicInformation,
-    // avoid,
-    // direction,
-    //   SignPatent,
-    //   ReportFile,
-    //   TaskDetails,
-    //   remarryMatter
-  },
-  data() {
-      return {
-          activeMenu: "BasicInformation",
-          menuList: [
-            { title: '基本信息', path: "BasicInformation" }, 
-            { title: '标的专利特征拆分详情', path:"SignPatent"}, 
-              { title: '回避设计方案', path:"avoid"}, 
-              { title: '回避设计结果', path:"direction"}, 
-              { title: '报告文档', path:"ReportFile"}, 
-              { title: '后续跟进事项', path:"remarryMatter",show:(this.row&&this.row.status==3 && this.$permission('/rms/matter'))?false:true}, 
-              { title: '任务清单', path:"TaskDetails",show:(this.$reportPermission(this.reportId,[0,1]))?false:true}, 
-          ],
-      }
-  },
-  watch: {
-    // show(){
-    //       this.setData()
-    //     }
-  },
-  computed:{
-    // show(){
-    //         return this.$permission('/rms/matter')
-    //     },
-      dictMessage() {
-          return this.$s.getSession('row').dictMessage.REPORT_TYPE
-      },
-      row(){
-          return this.$s.getSession('row')
-      },
-      reportId(){
-          return this.$s.getSession('row').id
-      },
-      splitBy(){
-          return this.$s.getSession('row').splitBy
-      },
-      splitType(){
-          return this.$s.getSession('row').splitType
-      },
-      signPatentNo(){
-          return this.$s.getSession('row').signPatentNo
-      }
-  },
-  created(){
-    this.setData()
-  },
-  mounted() {
-    this.changePageTitle()
-      // console.log(this.row);
-  },
-  methods: {
-    setData(){
-            this.menuList =[
-                  { title: '基本信息', path: "BasicInformation" }, 
-                  { title: '标的专利特征拆分详情', path:"SignPatent"}, 
-                  { title: '回避设计方案', path:"avoid"}, 
-                  { title: '回避设计结果', path:"direction"}, 
-                  { title: '报告文档', path:"ReportFile"}, 
-                  { title: '后续跟进事项', path:"remarryMatter",show:(this.row&&this.row.status==3 && this.$permission('/rms/matter'))?false:true}, 
-                  { title: '任务清单', path:"TaskDetails",show:(this.$reportPermission(this.reportId,[0,1]))?false:true}, 
-              ]
-        },
-      changePageTitle() {
-          document.title = `${this.row.name} ${'报告详情'}`
-      },
-      handleSelect(index, path) {
-          // console.log(index, path);
-          this.activeMenu = index
-      },
-  },
-}
-</script>

+ 58 - 98
src/views/report/avoid/components/avoidDirection.vue

@@ -2,196 +2,156 @@
   <div class="height_100">
     <el-container>
       <el-header>
-        <div>
+        <div style="padding: 20px;">
           <p> 标的专利号:<el-link type="primary" @click="toPatentDetails(patentNo)">{{ patentNo }}</el-link> </p>
         </div>
       </el-header>
-      <el-main class="height_100" style="padding:20px">
+      <el-main style="padding:20px;height: calc(100% - 100px);">
         <!-- 拆分特征公用组件 -->
-        <splitPage :tableData="tableData" :word="{ patentNo: patentNo, reportId: reportId }" :columnList="columnList"
-          @splitSelect="splitSelect" @isSave="isSave"></splitPage>
+        <splitPage style="height: calc(100% - 103px);overflow: auto;" :tableData="tableData"
+          :word="{ patentNo: patentNo, projectId: projectId }" :columnList="columnList" @splitSelect="splitSelect"
+          @isSave="isSave"></splitPage>
 
         <!-- 回避设计总体方向 -->
         <div style="margin-top: 20px;">
           <p>回避设计总体方向:</p>
           <div>
-
-            <myRichText v-model="textarea.wholeDirection" placeholder="请输入回避设计总体方向(可粘贴图片)"></myRichText>
-
+            <myRichText v-model="wholeContent" placeholder="请输入回避设计总体方向(可粘贴图片)"></myRichText>
           </div>
         </div>
       </el-main>
     </el-container>
 
-
-
-
   </div>
 </template>
 
 <script>
-import splitPage from './splitPage.vue';
+import { patentDetails } from '../../components/mixins/index2'
+import mixins from './mixins'
+import splitPage from '../../components/splitPage/splitPage.vue';
 export default {
-  props: ['patentNo', 'reportId', 'splitBy', 'splitType'],
+  props: ['patentNo', 'projectId',],
+  mixins:[patentDetails,mixins],
   components: {
     splitPage,
   },
   data() {
     return {
-      // 回避设计栏位
-      columnList: [
-        {
-          name: "回避设计方向(可粘贴图片)",
-          type: "String",
-          value: "littleDirection",
-        },
-      ],
-      // 数据源
-      tableData: [],
-      // 回避设计总体方案
-      textarea: {},
+     
     };
   },
   watch: {
   },
   mounted() {
-    // this.getList()
+
   },
   methods: {
     // 保存
     isSave(val) {
-      this.handleData(val)
-      // 回避设计总体方案
-      val.wholeDirection = this.textarea.wholeDirection
-      this.$api.save(val).then(res => {
+      // let params = this.handleData(val)
+      let params = {
+        projectId: this.projectId,
+        wholeContent: this.wholeContent,
+        avoidDesignDTOS: val,
+      }
+      this.$api.addAvoidDesign(params).then(res => {
         if (res.code == 200) {
           this.$message.success('保存成功')
         }
       })
     },
+    // 处理需要保存的数据()
     handleData(tableData) {
       let keepArr = [
         {
-          pRightName: tableData[0].pRightName,
-          RightName: tableData[0].pRightName,
+          rightName: tableData[0].pRightName,
           signPatentNo: tableData[0].pSignPatentNo,
-          // patentId: tableData[0].pPatentId,
-          content: tableData[0].content,
-          // type: tableData[0].pType,
-          // sort: tableData[0].pSort,
-          rightId: tableData[0].rightId,
-          reportId: tableData[0].pReportId,
+          patentNo: tableData[0].pPatentNo,
+          content: tableData[0].pContent,
           contentOut: tableData[0].pContentOut,
+          sort: tableData[0].pSort,
+          type: tableData[0].pType,
+          projectId: tableData[0].pReportId,
           features: [],
         }
       ]
       var j = 0
       for (let i = 0; i < tableData.length; i++) {
-        if (keepArr.findIndex(item => { return (item.pRightName || item.RightName) == tableData[i].rightName }) < 0) {
-          
+        if (keepArr.findIndex(item => { return item.rightName == tableData[i].pRightName }) < 0) {
+
           j += 1
           keepArr.push(
             {
-              RightName: tableData[i].pRightName,
+              rightName: tableData[i].pRightName,
               signPatentNo: tableData[i].pSignPatentNo,
-              // patentId: tableData[i].pPatentId,
+              patentNo: tableData[i].pPatentNo,
               content: tableData[i].pContent,
-              // type: tableData[i].pType,
-              // sort: tableData[i].pSort,
-              rightId: tableData[i].rightId,
-              reportId: tableData[i].pReportId,
               contentOut: tableData[i].pContentOut,
+              sort: tableData[i].pSort,
+              type: tableData[i].pType,
+              projectId: tableData[i].pReportId,
               features: [],
             }
           )
         }
         keepArr[j].features.push({
-          signPatentNo: tableData[i].signPatentNo,
-          patentId: tableData[i].patentId,
-          content: tableData[i].content.trim(),
-          type: tableData[i].type,
-          littleDirection: tableData[i].littleDirection ? tableData[i].littleDirection : '',
-          // littleDirection:
-          // reportId: tableData[i].pReportId,
-          reportId: tableData[i].reportId,
+          content: tableData[i].content,
+          direction: tableData[i].direction ? tableData[i].direction : '',
+          projectId: tableData[i].projectId,
           explainText: tableData[i].explainText ? tableData[i].explainText : '',
-          contentOut: tableData[i].contentOut.trim(),
-          splitBy: tableData[i].splitBy,
-          splitType: tableData[i].splitType,
-          featuresOrder: tableData[i].featuresOrder,
-          partnerId: tableData[i].partnerId,
-          rightId: tableData[i].rightId,
+          contentOut: tableData[i].contentOut ? tableData[i].contentOut : '',
+          rightSort: tableData[i].rightSort,
           rightType: tableData[i].rightType,
           id: tableData[i].id,
-          rightName: tableData[i].rightName,
-          pRightName: tableData[i].rightName,
-          isFinal: tableData[i].isFinal,
-          pContent: tableData[i].pContent,
-          pContentOut: tableData[i].pContentOut,
+          patentNo: tableData[i].patentNo,
         })
-        // console.log(tableData[i].littleDirection);
       }
       let keepStr = {
-        reportId: this.reportId,
-        avoidDesignLittleDirectionDTOs: keepArr,
-        wholeDirection: this.textarea1.wholeDirection ? this.textarea1.wholeDirection : ''
+        projectId: this.projectId,
+        avoidDesignDTOS: keepArr,
+        wholeContent: this.wholeContent ? this.wholeContent : ''
       }
+      return keepStr
     },
     // 改变拆分条件
     splitSelect(split) {
-      this.getList(split)
+      this.getList(split,true)
     },
-    // 获取数据
+    // 获取拆分数据(弃用)
     getSplitList(val) {
       let params = {
         patentNo: this.patentNo,
-        reportId: this.reportId,
+        projectId: Number(this.projectId),
         ...val,//拆分条件
       }
-      this.$api.query(params).then(res => {
+      this.$api.spiltFeature(params).then(res => {
         if (res.code == 200) {
-          this.textarea.wholeDirection = res.data.wholeDirection
-          if (res.data.patentRightVos.length > 0) {
-            res.data.patentRightVos.forEach(RightVosItem => {
+          // this.textarea.wholeDirection = res.data.wholeDirection
+          if (res.data.data.length > 0) {
+            var data = []
+            res.data.data.forEach(RightVosItem => {
               if (RightVosItem.features.length > 0) {
                 RightVosItem.features.forEach(FeaturesItem => {
-                  FeaturesItem.pRightName = RightVosItem.RightName
+                  FeaturesItem.pRightName = RightVosItem.rightName
                   FeaturesItem.pSignPatentNo = RightVosItem.signPatentNo
+                  FeaturesItem.pPatentNo = RightVosItem.patentNo
                   FeaturesItem.pContentOut = RightVosItem.contentOut
                   FeaturesItem.pContent = RightVosItem.content
-                  FeaturesItem.pReportId = RightVosItem.reportId
-                  FeaturesItem.pPatentId = RightVosItem.patentId
+                  FeaturesItem.pProjectId = RightVosItem.projectId
                   FeaturesItem.pType = RightVosItem.type
                   FeaturesItem.pSort = RightVosItem.sort
                   this.hasOwn(FeaturesItem)
-                  this.tableData.push(FeaturesItem)
+                  data.push(FeaturesItem)
                 })
               }
             })
+            this.tableData = data
           }
         }
       })
     },
-    hasOwn(item) {
-      if (!item.hasOwnProperty("explainText")) {
-        item.explainText = item.contentOut
-      } else {
-        if (item.explainText == "") {
-          item.explainText = item.contentOut
-        }
-      }
-      if (!item.hasOwnProperty("littleDirection")) {
-        item.littleDirection = ''
-      } else {
-        if (item.littleDirection == "") {
-          item.littleDirection = ''
-        }
-      }
-    },
-    // 跳转专利详情(放在公用js)
-    toPatentDetails(patentNo) {
+   
 
-    },
   }
 }
 </script>

+ 40 - 0
src/views/report/avoid/components/direction.vue

@@ -0,0 +1,40 @@
+<template>
+  <!-- 回避设计结果页面 -->
+  <div style="height: calc(100% - 20px);">
+    <splitPage style="height:calc(100% - 100px)" :tableData="tableData" :isEdit="false" :columnList="columnList">
+      <div slot="handleLeft"></div>
+      <div slot="handleRight"></div>
+    </splitPage>
+    <div>
+      <p>回避设计总体方向:</p>
+      <div>
+        <myRichText v-model="wholeContent" placeholder="请输入回避设计总体方向(可粘贴图片)"></myRichText>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import mixins from './mixins'
+import splitPage from '../../components/splitPage/splitPage.vue'
+export default {
+  mixins:[mixins],
+  props: ['patentNo', 'projectId',],
+  components: {
+    splitPage
+  },
+  data() {
+    return {
+      
+    }
+  },
+  mounted() {
+    
+  },
+  methods: {
+    
+  },
+}
+</script>
+
+<style lang="scss" scoped></style>

+ 63 - 0
src/views/report/avoid/components/mixins.js

@@ -0,0 +1,63 @@
+export default {
+  data() {
+    return {
+       // 回避设计栏位
+       columnList: [
+        {
+          name: "回避设计方向(可粘贴图片)",
+          type: "String",
+          value: "direction",
+        },
+      ],
+      // 数据源
+      tableData: [],
+      // 回避设计总体方案
+      wholeContent: '',
+    }
+  },
+  mounted() {
+    this.getList()
+  },
+  methods: {
+    getList(split={splitType:'1',splitBy:'2'},ifReSplit=false) {
+      let params = {
+        ifReSplit: ifReSplit,
+        projectId: Number(this.projectId),
+        ...split,//拆分条件
+      }
+      this.$api.getAvoidDesign(params).then(res => {
+        if (res.code == 200) { 
+          this.wholeContent=res.data.wholeContent
+          if (res.data.avoidDesignRightVOS.length > 0) {
+            var data = []
+            res.data.avoidDesignRightVOS.forEach(RightVosItem => {
+              if (RightVosItem.avoidDesignVOS.length > 0) {
+                RightVosItem.avoidDesignVOS.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 = ''
+      }
+      if (!item.hasOwnProperty("direction")) {
+        item.direction = ''
+      }
+    },
+  },
+}

+ 0 - 358
src/views/report/avoid/components/splitPage.vue

@@ -1,358 +0,0 @@
-<template>
-  <!-- 权要拆分类型等 -->
-  <div class="height_100">
-    <div style="display: flex; justify-content: space-between;margin:20px 0px 20px 0 ;">
-      <el-button-group>
-        <el-button @click="merge" :disabled="checkList.length > 1 ? false : true">合并</el-button>
-        <el-button @click="split" :disabled="checkList.length > 0 ? false : true">拆分</el-button>
-      </el-button-group>
-      <div>
-        <el-select placeholder="请选择拆分类型" v-model="splitType" style="margin-left: 50px;"
-          @change="splitSelect($event, 'type')">
-          <el-option label="仅拆主权要" value="0"></el-option>
-          <el-option label="全部拆分" value="1"></el-option>
-        </el-select>
-        <el-select placeholder="请选择拆分符号" v-model="splitBy" style="margin-left: 10px;" @change="splitSelect($event, 'by')">
-          <el-option label="逗号拆分" value="0"></el-option>
-          <el-option label="分号拆分" value="1"></el-option>
-          <el-option label="逗号和分号拆分" value="2"></el-option>
-        </el-select>
-        <el-select placeholder="请选择显示类型" v-model="showType" style="margin-left: 10px;" @change="typeSelect($event)">
-          <el-option label="全部显示" value="0"></el-option>
-          <el-option label="仅显示主权要" value="1"></el-option>
-        </el-select>
-      </div>
-      <div>
-        <el-button @click="save" type="primary">保存</el-button>
-      </div>
-    </div>
-
-    <template>
-      <el-table :data="tableData" border ref="table" :span-method="objectSpanMethod" 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" :content="scope.row.pContent" placement="top">
-              <span>{{ scope.row.pRightName }}</span>
-            </el-tooltip>
-          </template>
-        </el-table-column>
-
-        <el-table-column prop="content" label="特征" width="300" align="center">
-          <template  slot-scope="scope">
-            <div v-if="!isRead">
-              <el-checkbox-group v-model="checkList">
-                <el-checkbox :label="scope.row.id" @change="getRow(scope)" style="display: flex;align-items: center;">
-                  <el-input type="textarea" style="width:250px" autosize v-model="scope.row.content">
-                    {{ scope.row.content }}</el-input>
-                </el-checkbox>
-              </el-checkbox-group>
-            </div>
-            <div v-else v-html="scope.row.content"> </div>
-          </template>
-        </el-table-column>
-
-        <el-table-column prop="explainText" label="解释(可粘贴图片)" align="center">
-          <template slot-scope="scope">
-            <div v-if="!isRead">
-              <myRichText v-model="scope.row.explainText" placeholder="请输入解释"></myRichText>
-            </div>
-            <div v-else v-html="scope.row.explainText"></div>
-          </template>
-        </el-table-column>
-
-        <!-- 父组件传递栏位 -->
-        <el-table-column v-for="item in columnList" :key="item.value" :prop="item.value" :label="item.name"
-          align="center">
-          <template slot-scope="scope">
-            <div v-if="!isRead">
-              <myRichText v-model="scope.row[item.value]" placeholder="请输入"></myRichText>
-            </div>
-            <div v-else v-html="scope.row[item.value]"></div>
-          </template>
-        </el-table-column>
-
-      </el-table>
-    </template>
-
-  </div>
-</template>
-
-<script>
-export default {
-  props: {
-    // 信息(patentNo,reportId)
-    word: {
-      type: Object,
-      default: () => {
-        return {
-          patentNo: '',
-          reportId: ''
-        }
-      }
-    },
-    // 数据源
-    tableData: {
-      type: Array,
-      default: () => {
-        return []
-      }
-    },
-    // 是否可读
-    isRead: {
-      type: Boolean,
-      default: true
-    },
-    //拆分下拉框的数据
-    // splitSelect: {
-    //   type: Object,
-    //   default: () => {
-    //     return {
-    //       splitType: 0,
-    //       splitBy: 2,
-    //       showType: 0,
-    //     }
-    //   }
-    // },
-    // 栏位参数 
-    columnList: {
-      type: Array,
-      default: () => {
-        return []
-      }
-    }
-  },
-  data() {
-    return {
-      splitType: 1,//拆分类型0仅拆主权要,1全部拆分
-      splitBy: 2,//拆分符号0逗号拆分,1分号拆分,2逗号和分号拆分
-      showType: 0,//显示类型0全部显示1仅显示主权要
-      typeArr: [1],//显示权要还是全部显示
-      // 表格的loading
-      loading: false,
-      // 表格的高度
-      tableHeight: 0,
-      // 勾选中的特征数据
-      checkList: [],
-      // 计算表格合并行的数量
-      mergeObj: {},
-      // 表格合并行的栏位
-      mergeArr: ['pRightName'],
-      // 特征行数据
-      scopeRow: [],
-      //权要列表
-      rightList: []
-    }
-  },
-  async mounted() {
-    //获取拆分条件
-    await this.getSplit()
-    //获取权要
-    this.getRight()
-  },
-  methods: {
-    async getSplit() {
-      let params = {
-        ...this.word,
-      }
-      await this.$api.query(params).then(res => {
-        if (res.code == 200) {
-          this.splitType = res.data.splitType
-          this.splitBy = res.data.splitBy
-          this.showType = res.data.showType
-        }
-      }).catch(error => {
-        this.splitType = 0
-        this.splitBy = 2
-        this.showType = 0
-      })
-    },
-    //获取权要
-    getRight() {
-      let params = {
-        ...this.word,
-      }
-      this.$api.query(params).then(res => {
-        if (res.code == 200) {
-          this.getRight = []
-        }
-      }).catch(error => {
-        this.getRight = []
-      })
-    },
-    //获取每个元素所需合并的行数
-    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] !== 'evidence') {
-              this.mergeObj[key][count] += 1;
-              this.mergeObj[key].push(0);
-            } else {
-              count = index;
-              this.mergeObj[key].push(1);
-            }
-          }
-        })
-      })
-
-      this.mergeObj.court = this.mergeObj.id
-      this.mergeObj.argumentStr = this.mergeObj.id
-      return this.mergeObj
-    },
-    // 表格合并行
-    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];
-        }
-      }
-    },
-    // 保存
-    save() {
-      this.$emit('isSave', this.tableData)
-    },
-    // 选择拆分类型或拆分符号
-    splitSelect(val, type) {
-      var split = {}
-      if (type == 'type') {
-        split.splitType = val
-        split.splitBy=this.splitBy
-      } else {
-        split.splitType=this.splitType
-        split.splitBy=val
-      }
-      this.$emit('splitSelect', split)
-    },
-    // 选择显示类型
-    typeSelect(val) {
-      this.typeArr = []
-      if (val == 1) {
-        this.typeArr.push(1)
-      } else {
-        this.typeArr.push(1, 0)
-      }
-      this.tableData = this.tableData.filter(item => {
-        return this.typeArr.includes(item.pType)
-      })
-      this.getSpanArr(this.tableData)
-    },
-    // 获取当前行的数据
-    getRow(scope) {
-      let Index = this.scopeRow.findIndex(item => { return item.id == scope.row.id })
-      if (Index < 0) {
-        scope.row.$index = scope.$index
-        this.scopeRow.push(scope.row)
-      } else {
-        this.scopeRow.splice(Index, 1)
-      }
-    },
-    // 将栏位值合并
-    columnMerge() {
-      var arr = ['content', 'contentOut', 'explainText']
-      if (this.columnList && this.columnList.length > 0) {
-        this.columnList.forEach(item => {
-          arr.push(item.value)
-        })
-      }
-      return arr
-    },
-    // 特征等合并
-    merge() {
-      if (this.scopeRow.length > 1) {
-        var merge = {}
-        var arr = this.columnMerge()
-        // 判断是否可以合并
-        for (let i = 0; i < this.scopeRow.length - 1; i++) {
-          // 跨权要不能合并特征
-          if (this.scopeRow[i].rightId != this.scopeRow[i + 1].rightId) {
-            this.$alert("不能跨权要合并特征", "提示", {
-              type: 'warning',
-              confirmButtonText: '确定',
-            })
-            return false
-          } else {//不相邻特征不能合并
-            let Index_rowArr = this.scopeRow.sort((a, b) => {
-              return a.$index - b.$index
-            })
-            // console.log(this.Index_row,Index_rowArr);
-            if (Index_rowArr[i + 1].$index - Index_rowArr[i].$index != 1) {
-              this.$alert("非相邻不能合并特征", "提示", {
-                type: 'warning',
-                confirmButtonText: '确定',
-              })
-              return false
-            }
-          }
-        }
-        // 将内容合并起来
-        this.scopeRow.forEach((rowItem, rowIndex) => {
-          // console.log(rowItem,rowIndex);
-          for (let m = 0; m < arr.length - 1; m++) {
-            merge[arr[m]] = merge[arr[m]] + rowItem[arr[m]].trim()
-          }
-          let Index1 = this.tableData.findIndex(item => { return rowItem.id == item.id })
-          if (Index1 != -1) {
-            if (rowIndex < this.scopeRow.length - 1) {
-              // if (Index1 != -1) {
-              this.tableData.splice(Index1, 1)
-              // }
-            } else if (rowIndex == this.scopeRow.length - 1) {
-              for (let j = 0; j < arr.length - 1; j++) {
-                this.tableData[Index1][arr[j]] = merge[arr[j]]
-              }
-            }
-          }
-        })
-        this.TypeSelect(this.showType)
-        this.scopeRow = []
-        this.checkList = []
-      }
-    },
-    // 拆分
-    split() {
-      //不能同时拆分
-      if (this.scopeRow.length > 0) {
-        if (this.scopeRow.length > 1) {
-          this.$alert("不能同时拆分多个特征", "提示", {
-            type: 'warning',
-            confirmButtonText: '确定',
-          })
-          return false
-        }
-        var rowId = Math.floor((Math.random() * 9999) + 1000);
-        var arr = this.columnMerge()
-        this.scopeRow.forEach((rowItem, rowIndex) => {
-          var splitAdd = {}
-          // 将字段的值给到拆分新数据
-          for (let key in rowItem) {
-            if (key == 'id') {
-              splitAdd[key] = rowItem[key] + rowId + "a"
-            } else {
-              splitAdd[key] = rowItem[key]
-            }
-          }
-          // 将部分展示字段置为空
-          for (let i = 0; i < arr.length - 1; i++) {
-            splitAdd[arr[i]] = ''
-          }
-
-          let Index2 = this.tableData.findIndex(item => { return rowItem.id == item.id })
-          this.tableData.splice(Index2 + 1, 0, splitAdd)
-        })
-        this.TypeSelect(this.showType)
-        this.scopeRow = []
-        this.checkList = []
-      }
-    },
-  },
-}
-</script>
-
-<style lang="scss" scoped></style>

+ 8 - 2
src/views/report/avoid/index.vue

@@ -1,7 +1,7 @@
 <template>
   <!-- 回避设计 -->
   <div>
-    <avoidDirection :patentNo="patentNo" :reportId="reportId"></avoidDirection>
+    <avoidDirection :patentNo="patentNo" :projectId="projectId"></avoidDirection>
   </div>
 </template>
 
@@ -20,9 +20,15 @@ export default {
     patentNo() {
       return this.$route.query.patentNo
     },
-    reportId() {
+    projectId() {
       return this.$route.query.reportId
     },
+    splitType() {
+      return this.$route.query.splitType
+    },
+    splitBy() {
+      return this.$route.query.splitBy
+    },
   },
   mounted() {
 

+ 105 - 13
src/views/report/components/details/components/basicMessage.vue

@@ -1,21 +1,113 @@
 <template>
-  <div></div>
+  <div style="overflow-y:auto;overflow-x:hidden" :style="{ height: height }">
+    <!-- <el-button type="primary" @click="submit" style="float:right" v-if="!noEdit1">提交</el-button> -->
+    <div style="width:500px;margin:0 auto">
+      <el-form :model="form" ref="reportForm" label-width="140px">
+
+        <el-form-item :label="form.type == 3 ? '标的产品:' : '标的专利:'" prop="signPatentNo">
+          <el-link type="primary" v-if="form.type != 3"
+            @click="toPatentDetails(form.signPatentNo, form)">{{ form.signPatentNo }}</el-link>
+          <span v-else>{{ form.signPatentNo }}</span>
+        </el-form-item>
+        
+        <el-form-item label="核心结论:" prop="conclusions"
+          v-if="form.status == 3 && form.conclusions && form.conclusions.length > 0">
+          <span v-for="(item, index) in form.conclusions" :key="index" style="margin:0">{{ item }} <span
+              v-if="index < form.conclusions.length - 1">| </span></span>
+        </el-form-item>
+        <el-form-item label="核心结论论述:" prop="cronConclusion" v-if="form.status == 3 && form.cronConclusion">
+          <span>{{ form.cronConclusion }} </span>
+        </el-form-item>
+        <el-form-item label="报告名称:" prop="name">
+          <span>{{ form.name }}</span>
+        </el-form-item>
+        <el-form-item label="承担部门:" prop="departmentId">
+          <span>{{ form.departmentName }}</span>
+        </el-form-item>
+        <el-form-item label="负责人:" prop="personId">
+          <span>{{ form.personName }}</span>
+        </el-form-item>
+        <el-form-item label="委托方:" prop="clientId">
+          <span>{{ form.clientName }}</span>
+        </el-form-item>
+        <el-form-item label="产品/技术:" v-if="form.proTec">
+          <span>{{ form.proTec }}</span>
+        </el-form-item>
+        <el-form-item label="应用场景:" prop="easFlag" v-if="form.scenarioNames">
+          <div style="word-wrap:keep-all;">
+            <span v-for="item in form.scenarioNames">{{ item }}&nbsp;&nbsp;&nbsp;</span>
+          </div>
+        </el-form-item>
+        <el-form-item label="关联报告:" v-if="form.associateReportName">
+          <span>{{ form.associateReportName }}</span>
+        </el-form-item>
+        <template v-if="form.type == 7">
+          <el-form-item label="案件编号:" prop="caseNumber" v-if="form.caseNumber">
+            <span>{{ form.caseNumber }}</span>
+          </el-form-item>
+          <el-form-item label="发文序号:" prop="issueNumber" v-if="form.issueNumber">
+            <span>{{ form.issueNumber }}</span>
+          </el-form-item>
+          <el-form-item label="发明创造名称:" prop="inventionName" v-if="form.inventionName">
+            <span>{{ form.inventionName }}</span>
+          </el-form-item>
+          <el-form-item label="专利权人:" prop="currentApplication" v-if="form.currentApplication">
+            <span>{{ form.currentApplication }}</span>
+          </el-form-item>
+          <el-form-item label="无效宣告请求人:" prop="invalidApplication" v-if="form.invalidApplication">
+            <span>{{ form.invalidApplication }}</span>
+          </el-form-item>
+        </template>
+        <el-form-item label="卷号:" prop="volumeNumber" v-if="form.volumeNumber">
+          <span>{{ form.volumeNumber }}</span>
+        </el-form-item>
+        <el-form-item :label="noEdit1 ? '附件' : '上传附件:'">
+          <div v-if="form.reportFiles" class="upload-file">
+            <div v-for="item in form.reportFiles"
+              style="margin:0;display:flex;justify-content:space-around;align-items:center;">
+              <p style="margin:0;width:calc(100% - 40px);overflow: hidden;white-space: nowrap;text-overflow:ellipsis;cursor: pointer"
+                @click="checkFile(item)">{{ item.name ? item.name + '.' + item.suffix : item.fileName }}</p>
+              <Menu :data="item" :reportId="reportId" @delFile="delFile"></Menu>
+            </div>
+          </div>
+          <el-upload v-if="!noEdit1 && Object.keys(form).length > 1 && $reportPermission(reportId, [0, 1])" ref="upload"
+            class="upload-file" drag action="#" :auto-upload="false" :show-file-list="true" :on-change="onChange" multiple
+            :on-preview="handlePreview" :on-remove="handleRemove">
+            <i :class="!file ? 'el-icon-upload' : 'el-icon-refresh'"></i>
+            <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+            <div class="el-upload__tip" slot="tip"></div>
+          </el-upload>
+        </el-form-item>
+
+        <el-form-item label="备注:" prop="remark" v-if="form.remark">
+          <span>{{ form.remark }}</span>
+        </el-form-item>
+      </el-form>
+    </div>
+  </div>
 </template>
 
 <script>
+
 export default {
-  components: {},
-  props: {},
+  components: {
+
+  },
+  props: ['reportId'],
   data() {
     return {
-    };
+     
+    }
+  },
+  watch: {
+
+  },
+  mounted() {
+    this.getList()
+  },
+  methods: {
+    // 获取数据
+    getList(){},
   },
-  watch: {},
-  computed: {},
-  created() {},
-  mounted() {},
-  methods: {},
-};
-</script>
-<style lang="scss" scoped>
-</style>
+}
+</script>

+ 75 - 0
src/views/report/components/details/components/splitDetails.vue

@@ -0,0 +1,75 @@
+<template>
+  <!-- 标的专利特征拆分 -->
+  <div style="height: calc(100% - 20px);">
+    <splitPage :isEdit="false" :tableData="tableData">
+      <div slot="handleLeft">
+        <span>标的专利:</span><el-link type="primary" @click="toPatentDetails(patentNo)">{{ patentNo }}</el-link>
+      </div>
+      <div slot="handleRight"></div>
+    </splitPage>
+  </div>
+</template>
+
+<script>
+import { patentDetails } from '../../mixins/index2'
+import splitPage from '../../splitPage/splitPage.vue';
+export default {
+  props: ['patentNo', 'projectId'],
+  mixins: [patentDetails],
+  components: {
+    splitPage,
+  },
+  data() {
+    return {
+      // 数据源
+      tableData:[],
+    }
+  },
+  mounted() {
+    this.getSpiltFeature()
+  },
+  methods: {
+    getSpiltFeature() {
+      let params = {
+        patentNo:this.patentNo,
+        projectId: Number(this.projectId),
+        // ...split,//拆分条件
+      }
+      this.$api.getSpiltFeature(params).then(res => {
+        if (res.code == 200) {
+          if (res.data.data.length > 0) {
+            var data = []
+            res.data.data.forEach(RightVosItem => {
+              if (RightVosItem.features.length > 0) {
+                RightVosItem.features.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 = ''
+      }
+      if (!item.hasOwnProperty("direction")) {
+        item.direction = ''
+      }
+    },
+  },
+}
+</script>
+
+<style lang="scss" scoped></style>

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

@@ -10,7 +10,7 @@
         </el-menu>
       </el-aside>
       <el-main>
-        <component :is='componentName'></component>
+        <component :is='componentName' :projectId="projectId" :patentNo="patentNo"></component>
       </el-main>
     </el-container>
     
@@ -41,7 +41,14 @@ export default {
     };
   },
   watch: {},
-  computed: {},
+  computed: {
+    projectId() {
+      return this.$route.query.projectId
+    },
+    patentNo() {
+      return this.$route.query.patentNo
+    },
+  },
   created() {},
   mounted() {
     this.getMenu()
@@ -52,7 +59,7 @@ export default {
         {
           label:'标的专利特征拆分',
           name:'splitPatent',
-          path:'task/components/index.vue'
+          path:'report/components/details/components/splitDetails.vue'
         },
         { 
           label: '回避设计方案', 
@@ -62,7 +69,7 @@ export default {
         { 
           label: '回避设计结果', 
           name:"direction",
-          path:'report/avoid/components/avoidDirection.vue'
+          path:'report/avoid/components/direction.vue'
         },
         { 
           label: '报告文档', 

+ 69 - 79
src/views/report/components/dialog/addAndEditReport.vue

@@ -9,13 +9,11 @@
           <el-col :span="12">
             <template>
               <div>
-                <el-form-item v-if="form.reportType == 3" label="标的产品" prop="signProjectId">
-                  <el-select style="width:100%" v-model="form.signProjectId" placeholder="请选择产品" filterable remote
-                    :popper-append-to-body="false" :remote-method="remoteMethodProduct"
-                    v-SelectLazyLoading="lazyLoadingProduct" :loading="productList.loading" @change="getPatentNo">
-                    <el-option v-for="item in productList.data" :key="item.id" :label="item.name"
-                      :value="item.id"></el-option>
-                  </el-select>
+               <el-form-item v-if="form.reportType == 3" label="标的产品" prop="signProjectId">
+                   <el-autocomplete v-model="form.signProjectId" value-key="name" v-SelectLazyLoading="productLoad"
+                    :fetch-suggestions="querySearchProduct" placeholder="请输入标的产品" :trigger-on-focus="false"
+                    @select="handleSelectProduct" @change="handleChangeProduct"
+                    style="width: 100%;"></el-autocomplete>
                 </el-form-item>
                 <el-form-item v-else label="标的专利" prop="signPatentNo">
                   <el-input v-model="form.signPatentNo" autocomplete="off" placeholder="请输入标的专利"
@@ -83,13 +81,13 @@
               <div>
                 <el-form-item label="委托方" prop="entrustId" v-if="userinfo.tenantType == 1">
                   <mySelectButton size='large' style="width:100%" @click="handleSelect">
-                      <div style="width:100%">
-                        <el-autocomplete style="width:100%" v-model="form.entrustName" ref="client" value-key="name"
-                          :fetch-suggestions="querySearch" v-SelectLazyLoading="loadClient" @input="input"
-                          placeholder="请输入内容" :trigger-on-focus="false" @select="handleChange">
-                        </el-autocomplete>
-                      </div>
-                    </mySelectButton>
+                    <div style="width:100%">
+                      <el-autocomplete style="width:100%" v-model="form.entrustName" ref="client" value-key="name"
+                        :fetch-suggestions="querySearch" v-SelectLazyLoading="loadClient" @input="input"
+                        placeholder="请输入内容" :trigger-on-focus="false" @select="handleChange">
+                      </el-autocomplete>
+                    </div>
+                  </mySelectButton>
                 </el-form-item>
                 <el-form-item label="委托部门" prop="departmentId" v-else>
                   <mySelectTree style="width:100%" v-model="form.departmentId" :options="departmentList"></mySelectTree>
@@ -120,8 +118,7 @@
             <el-form-item label="需要复制的选项" v-show="form.track">
               <el-select v-model="form.copyIds" multiple clearable placeholder="请选择需要复制的选项" :popper-append-to-body="false"
                 @change="changeCopyIds">
-                <el-option v-for="item in copyList" :key="item.value" :label="item.label"
-                  :value="item.value"></el-option>
+                <el-option v-for="item in copyList" :key="item.value" :label="item.label" :value="item.value"></el-option>
               </el-select>
             </el-form-item>
           </el-col>
@@ -133,9 +130,9 @@
                 <el-form-item label="事件:">
                   <mySelectButton size='large' style="width:100%" @click="addEvent">
                     <div style="width:100%">
-                      <el-select style="width:100%" v-model="form.eventId" @change="changeEvent" filterable remote :disabled="eventList.disabled"
-                        clearable placeholder="请选择" :loading="eventList.loading" v-SelectLazyLoading="loadEvent"
-                        :remote-method="remoteEvent">
+                      <el-select style="width:100%" v-model="form.eventId" @change="changeEvent" filterable remote
+                        :disabled="eventList.disabled" clearable placeholder="请选择" :loading="eventList.loading"
+                        v-SelectLazyLoading="loadEvent" :remote-method="remoteEvent">
                         <el-option v-for="item in eventList.data" :key="item.id" :label="item.name" :value="item.id">
                         </el-option>
                       </el-select>
@@ -204,7 +201,8 @@
     </el-dialog>
 
     <!-- 审核弹窗,做公用组件 -->
-    <el-dialog title="添加审核任务" :visible.sync="showTask" width="500px" @close="handleCloseTask" :append-to-body="true" :close-on-click-modal="false">
+    <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="输入任务名称" />
@@ -238,8 +236,8 @@
     </el-dialog>
 
     <!-- 委托方弹窗 -->
-    <el-dialog title="选择委托方" :visible.sync="visible" width="800px" :append-to-body="true" :close-on-click-modal="false" destroy-on-close :before-close="close2"
-      top="10vh">
+    <el-dialog title="选择委托方" :visible.sync="visible" width="800px" :append-to-body="true" :close-on-click-modal="false"
+      destroy-on-close :before-close="close2" top="10vh">
       <ClientTable :choseClient="true" @getClient="getClient"></ClientTable>
     </el-dialog>
   </div>
@@ -300,7 +298,7 @@ export default {
       //表单规则
       rules: {
         name: [{ required: true, message: '请输入报告名称', trigger: 'blur' },],
-        signProjectId: [{ required: true, validator: isExist, trigger: 'blur' },],//产品
+        signProjectId: [{ required: true, validator: isExist, trigger: 'change' },],//产品
         signPatentNo: [{ required: true, validator: isExist, trigger: 'blur' },],//专利
         headId: [{ required: true, message: '请选择负责人', trigger: 'change' },],
         entrustId: [{ required: true, message: '请选择委托方', trigger: 'change' },],
@@ -364,8 +362,9 @@ export default {
           current: 1,
           size: 10
         },
-        isLazy: true,
-        data: []
+        loading: false,
+        name: '',
+        data: [],
       },
       matterType: null,
       //事件列表
@@ -417,9 +416,9 @@ export default {
     this.getDepartment()
   },
   methods: {
-     /**
-    * 人员
-    */
+    /**
+   * 人员
+   */
     // 人员列表远程搜索
     remoteMethodPerson(query) {
       this.personnelList.data = []
@@ -596,17 +595,17 @@ export default {
           a = '查看'
         }
       } else {
-        this.$set(this.form, 'matterIds',form.matterId)
+        this.$set(this.form, 'matterIds', form.matterId)
         this.form.scenarioIds = form.scenarioId
         this.$set(this.form, 'systemFileList', [])
         this.$set(this.form, 'fileGuids', [])
-        this.eventList.disabled  =false
-        if(this.form.eventId){
+        this.eventList.disabled = false
+        if (this.form.eventId) {
           this.eventList.disabled = true
           this.eventList.data.push(
             {
-              id:form.eventId,
-              name:form.eventName
+              id: form.eventId,
+              name: form.eventName
             }
           )
         }
@@ -630,54 +629,44 @@ export default {
      * 产品
      * @param {*} query 
      */
-    // 产品列表远程搜索
-    remoteMethodProduct(query) {
-      this.productList.isLazy = true
-      if (query !== '') {
-        this.productList.loading = true;
-        this.productList.queryParams = {
-          current: 1,
-          size: 10,
-          searchQuery: `name=${query}`
-        }
-        this.$api.queryProductCategory(this.productList.queryParams).then(response => {
-          if (response.code == 200) {
-            this.productList.loading = false;
-            this.productList.data = response.data.data
-          }
-        }).catch(error => {
-          this.productList.loading = false;
-        })
-      } else {
-        this.productList.queryParams.name = null
-        this.productList = [];
-        this.getAllProduct()
-      }
-    },
-    // 产品列表懒加载
-    lazyLoadingProduct() {
-      if (!this.productList.isLazy) {
+    // 懒加载产品方法
+    productLoad() {
+      if (this.productList.queryParams.current * this.productList.queryParams.size >= this.productList.queryParams.total) {
         return false
       }
-      this.productList.queryParams.current++;
-      this.getAllProduct();
+      this.productList.queryParams.current++
+      this.queryProduct()
     },
-    getAllProduct() {
-      if (!this.productList.isLazy) {
-        return false
+    // 查询产品
+    async queryProduct() {
+      let params = {
+        ...this.productList.queryParams,
+        name:this.productList.name
       }
-      this.$api.queryProductCategory(this.productList.queryParams).then(response => {
-        if (response.code == 200) {
-          if (response.data.data && response.data.data.length == 0) {
-            this.productList.isLazy = false
-          }
-          this.productList.data = [...this.productList.data, ...response.data.data];
+      await this.$api.queryProduct(params).then(res => {
+        if (res.code == 200) {
+          this.productList.data.push(...res.data)
+          this.productList.queryParams.total = res.pageColumn.total
+          this.productList.cb(this.productList.data);
         }
-      }).catch(error => {
       })
     },
-
-    
+    //获取下拉建议产品数据
+    async querySearchProduct(queryString, cb) {
+      this.productList.queryParams.current = 1
+      this.productList.name = queryString
+      this.productList.data = []
+      this.productList.cb = cb
+      await this.queryProduct()
+    },
+    // 产品输入框
+    handleChangeProduct(val) {
+      this.$set(this.form, 'name', val + 'FTO调查')
+    },
+    // 产品输入框选择
+    handleSelectProduct(val) {
+      this.$set(this.form, 'name', val.name + 'FTO调查')
+    },
 
     //获取所有部门列表
     getDepartment() {
@@ -719,14 +708,13 @@ export default {
       if (!this.form.name) {
         var a = this.dictMessage.REPORT_TYPE.filter(item => { return item.value == this.form.reportType })[0].label
         if (this.form.signProjectId) {
-          let name=this.productList.data.filter(item => {
+          let name = this.productList.data.filter(item => {
             return item.id == this.form.signProjectId
           })
-          this.$set(this.form,'name',name[0].name + a)
+          this.$set(this.form, 'name', name[0].name + a)
         } else {
           this.$set(this.form, 'name', this.form.signPatentNo + a)
         }
-       
       }
     },
 
@@ -857,6 +845,8 @@ export default {
               this.showTask = true
               this.$set(this.taskForm, 'taskName', this.form.name + '审核')
             }).catch(action => {//不审核直接创建报告
+              // 直接完成传true
+              formData.ifFinish = true
               // 调用创建报告公用,接口
               this.addReport(formData, scenarioIds)
             });
@@ -891,7 +881,7 @@ export default {
       this.showDialog = false
       this.clear()
     },
-     //清空组件缓存数据
+    //清空组件缓存数据
     clear() {
       // 清空事件相关
       this.form.eventId = []
@@ -988,7 +978,7 @@ export default {
     },
 
   },
- 
+
 };
 </script>
 <style lang="scss" scoped></style>

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

@@ -540,8 +540,8 @@ export default {
         var router = this.$router.resolve({
           path: "/avoid",
           query: {
-            patentNo: row.patentNo,
-            reportId: row.reportId,
+            patentNo: row.signPatentNo,
+            reportId: row.id,
           }
         })
         window.open(router.href, '_blank');

+ 27 - 17
src/views/report/components/mixins/index.js

@@ -22,34 +22,44 @@ export default {
 
   },
   methods: {
-    // 点击名称等事件
+    // 点击表格名称等事件
     handleItem(row, key) {
-      this.$router.push(
-        {
-          path:'/reportDetails'
-        }
-      )
+      switch (row.reportType) {
+        case 5:
+          this.$router.push({
+            path: '/reportDetails',
+            query: {
+              projectId: row.id,
+              patentNo:row.signPatentNo,
+            }
+          })
+          break;
+
+        default:
+          break;
+      }
+
     },
-    //操作列事件
+    //表格操作列事件
     handleCommand(option, row) {
       if (option == 'e') {//编辑
-        this.action={
-          type:'2',
-          id:row.id
-        } 
+        this.action = {
+          type: '2',
+          id: row.id
+        }
       }
       var isLast = false
       if (option == '7') {//删除
-        this.action={
-          type:'1',
-          id:row.id
-        } 
-        if(this.tableData.length == 1){
+        this.action = {
+          type: '1',
+          id: row.id
+        }
+        if (this.tableData.length == 1) {
           isLast = true
         }
       }
 
-      this.$emit('option', { option, row ,isLast:isLast})
+      this.$emit('option', { option, row, isLast: isLast })
     },
   },
 }

+ 8 - 0
src/views/report/components/mixins/index2.js

@@ -0,0 +1,8 @@
+export const patentDetails = {
+  methods: {
+    // 跳转专利详情(放在公用js)
+    toPatentDetails(patentNo) {
+    
+    },
+  },
+}   

+ 409 - 0
src/views/report/components/splitPage/splitPage.vue

@@ -0,0 +1,409 @@
+<template>
+  <!-- 权要拆分类型等 -->
+  <div class="height_100">
+    <el-container>
+      <el-header style="display: flex; justify-content: space-between;">
+        <div style="display:flex;align-items:center">
+          <div>
+            <slot name="handleLeft"></slot>
+          </div>
+          <div v-if="isEdit">
+            <el-button-group>
+              <el-button @click="merge" :disabled="checkList.length > 1 ? false : true">合并</el-button>
+              <el-button @click="split" :disabled="checkList.length > 0 ? false : true">拆分</el-button>
+            </el-button-group>
+          </div>
+        </div>
+        <div>
+          <el-select v-if="isEdit" placeholder="请选择拆分类型" :value="splitType" style="margin-left: 50px;"
+            @change="splitSelect($event, 'type')">
+            <el-option label="仅拆主权要" value="0"></el-option>
+            <el-option label="全部拆分" value="1"></el-option>
+          </el-select>
+          <el-select v-if="isEdit" placeholder="请选择拆分符号" :value="splitBy" style="margin-left: 10px;"
+            @change="splitSelect($event, 'by')">
+            <el-option label="逗号拆分" value="0"></el-option>
+            <el-option label="分号拆分" value="1"></el-option>
+            <el-option label="逗号和分号拆分" value="2"></el-option>
+          </el-select>
+          <el-select placeholder="请选择显示类型" v-model="showType" style="margin-left: 10px;" @change="typeSelect($event)">
+            <el-option label="全部显示" value="0"></el-option>
+            <el-option label="仅显示主权要" value="1"></el-option>
+          </el-select>
+        </div>
+        <div style="display:flex;align-items:center">
+          <div>
+            <slot name="handleRight"></slot>
+          </div>
+          <div v-if="isEdit">
+            <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%">
+          <el-table-column prop="pRightName" label="权要" width="180" align="center">
+            <template slot-scope="scope">
+              <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"> -->
+                <span>{{ scope.row.pRightName }}</span>
+              </el-tooltip>
+            </template>
+          </el-table-column>
+
+          <el-table-column prop="content" label="特征" width="300" align="center">
+            <template slot-scope="scope">
+              <div v-if="isEdit">
+                <el-checkbox-group v-model="checkList">
+                  <el-checkbox :label="scope.row.featureId" @change="getRow(scope)"
+                    style="display: flex;align-items: center;">
+                    <el-input type="textarea" style="width:250px" autosize v-model="scope.row.content">
+                      {{ scope.row.content }}</el-input>
+                  </el-checkbox>
+                </el-checkbox-group>
+              </div>
+              <div v-else v-html="scope.row.content"> </div>
+            </template>
+          </el-table-column>
+
+          <el-table-column prop="explainText" label="解释(可粘贴图片)" align="center">
+            <template slot-scope="scope">
+              <div v-if="isEdit">
+                <myRichText style="text-align:left" v-model="scope.row.explainText" placeholder="请输入解释(可粘贴图片)">
+                </myRichText>
+              </div>
+              <div v-else v-html="scope.row.explainText"></div>
+            </template>
+          </el-table-column>
+
+          <!-- 父组件传递栏位 -->
+          <el-table-column v-for="item in columnList" :key="item.value" :prop="item.value" :label="item.name"
+            align="center">
+            <template slot-scope="scope">
+              <div v-if="isEdit">
+                <myRichText style="text-align:left" v-model="scope.row[item.value]" :placeholder="'请输入' + item.name">
+                </myRichText>
+              </div>
+              <div v-else v-html="scope.row[item.value]"></div>
+            </template>
+          </el-table-column>
+
+        </el-table>
+      </el-main>
+    </el-container>
+
+
+
+
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    // 信息(patentNo,reportId)
+    word: {
+      type: Object,
+      default: () => {
+        return {
+          patentNo: '',
+          projectId: ''
+        }
+      }
+    },
+    // 数据源
+    tableData: {
+      type: Array,
+      default: () => {
+        return []
+      }
+    },
+    // 是否可读
+    isEdit: {
+      type: Boolean,
+      default: true
+    },
+    // 栏位参数 
+    columnList: {
+      type: Array,
+      default: () => {
+        return []
+      }
+    },
+
+  },
+  data() {
+    return {
+      tableData2: [],//显示数据
+      splitType: '1',//拆分类型0仅拆主权要,1全部拆分
+      splitBy: '2',//拆分符号0逗号拆分,1分号拆分,2逗号和分号拆分
+      showType: '0',//显示类型0全部显示1仅显示主权要
+      typeArr: [1],//显示权要还是全部显示
+      // 表格的loading
+      loading: false,
+      // 表格的高度
+      tableHeight: 0,
+      // 勾选中的特征数据
+      checkList: [],
+      // 计算表格合并行的数量
+      mergeObj: {},
+      // 表格合并行的栏位
+      mergeArr: ['id', 'pRightName'],
+      // 特征行数据
+      scopeRow: [],
+      //权要列表
+      rightList: [],
+
+    }
+  },
+  watch: {
+    tableData: {
+      handler(newVal, oldVal) {
+        this.typeSelect(this.showType)
+      },
+      deep: true
+    },
+  },
+
+  async mounted() {
+    //获取权要
+    this.getRight()
+  },
+  methods: {
+    // 查询拆分信息
+    // async getSplitMessage() {
+    //   let params = {
+    //     ...this.word,
+    //   }
+
+    //   await this.$api.getSplitMessage(params).then(res => {
+    //     if (res.code == 200) {
+    //       this.splitType = res.data.data.splitType.toString()
+    //       this.splitBy = res.data.data.splitBy.toString()
+    //       let obj = {
+    //         splitType: this.splitType,
+    //         splitBy: this.splitBy
+    //       }
+    //       this.$emit('splitSelect', obj)
+    //     }
+    //   }).catch(error => {
+    //     this.splitType = ''
+    //     this.splitBy = ''
+    //     this.showType = '0'
+    //   })
+    // },
+
+    //获取权要
+    getRight() {
+      let params = {
+        patentNo: this.word.patentNo,
+      }
+      this.$api.getPatentRight(params).then(res => {
+        if (res.code == 200) {
+          this.rightList = res.data.data
+        }
+      })
+    },
+    //获取每个元素所需合并的行数
+    getSpanArr(data) {
+
+      this.scopeRow = []
+      this.mergeArr.forEach((key, index1) => {
+        let count = 0;
+        this.mergeObj[key] = [];
+        data.forEach((item, index) => {
+          if (index === 0) {
+            this.mergeObj[key].push(1);
+          } else {
+            if (item[key] === data[index - 1][key] && 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 (!row) {
+        return false
+      }
+
+      if (this.mergeArr.indexOf(column.property) !== -1) {
+
+        if (this.mergeObj[column.property][rowIndex]) {
+          return [this.mergeObj[column.property][rowIndex], 1]
+        } else {
+          return [0, 0];
+        }
+
+      }
+    },
+    // 保存
+    save() {
+      this.$message.warning('正在保存中......')
+      this.$emit('isSave', this.tableData2)
+    },
+    // 选择拆分类型或拆分符号
+    splitSelect(val, type) {
+      this.$confirm('重新进行拆分将会清空所有的解释以及回避设计信息,此操作不可逆, 是否继续?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        if (type == 'type') {
+          this.splitType = val
+        } else {
+          this.splitBy = val
+        }
+        var split = {
+          splitBy: this.splitBy,
+          splitType: this.splitType
+        }
+        this.$emit('splitSelect', split)
+      }).catch(() => {
+        this.$message.info('已取消删除');
+      });
+
+    },
+    // 选择显示类型
+    typeSelect(val) {
+      this.typeArr = []
+      if (val == 1) {
+        this.typeArr.push(1)
+      } else {
+        this.typeArr.push(1, 0)
+      }
+
+      var data = this.tableData.filter(item => {
+        return this.typeArr.includes(item.pType)
+      })
+      this.tableData2 = JSON.parse(JSON.stringify(data))
+      this.getSpanArr(this.tableData2)
+    },
+    // 获取当前行的数据
+    getRow(scope) {
+      let Index = this.scopeRow.findIndex(item => { return item.featureId == scope.row.featureId })
+      if (Index < 0) {
+        scope.row.$index = scope.$index
+        this.scopeRow.push(scope.row)
+      } else {
+        this.scopeRow.splice(Index, 1)
+      }
+    },
+    // 将栏位值合并
+    columnMerge() {
+      var arr = ['content', 'explainText']
+      if (this.columnList && this.columnList.length > 0) {
+        this.columnList.forEach(item => {
+          arr.push(item.value)
+        })
+      }
+      return arr
+    },
+    // 特征等合并
+    merge() {
+      if (this.scopeRow.length > 1) {
+        // 判断是否可以合并
+        for (let i = 0; i < this.scopeRow.length - 1; i++) {
+          // 跨权要不能合并特征
+          if (this.scopeRow[i].rightSort != this.scopeRow[i + 1].rightSort) {
+            this.$alert("不能跨权要合并特征", "提示", {
+              type: 'warning',
+              confirmButtonText: '确定',
+            })
+            return false
+          } else {//不相邻特征不能合并
+            let Index_rowArr = this.scopeRow.sort((a, b) => {
+              return a.$index - b.$index
+            })
+            // console.log(this.Index_row,Index_rowArr);
+            if (Index_rowArr[i + 1].$index - Index_rowArr[i].$index != 1) {
+              this.$alert("非相邻不能合并特征", "提示", {
+                type: 'warning',
+                confirmButtonText: '确定',
+              })
+              return false
+            }
+          }
+        }
+        var merge = {}
+        var arr = this.columnMerge()
+        arr.forEach(item => {
+          merge[item] = ''
+        })
+        // 将内容合并起来
+        this.scopeRow.forEach((rowItem, rowIndex) => {
+          for (let m = 0; m < arr.length; m++) {
+            merge[arr[m]] = merge[arr[m]] + rowItem[arr[m]]
+          }
+
+          let Index1 = this.tableData.findIndex(item => { return rowItem.id == item.id })
+          if (Index1 != -1) {
+            if (rowIndex < this.scopeRow.length - 1) {
+              this.tableData.splice(Index1, 1)
+            } else if (rowIndex == this.scopeRow.length - 1) {
+              for (let j = 0; j < arr.length; j++) {
+                this.tableData[Index1][arr[j]] = merge[arr[j]]
+              }
+            }
+          }
+
+
+        })
+        this.handleSort()
+        this.typeSelect(this.showType)
+        this.scopeRow = []
+        this.checkList = []
+      }
+    },
+    // 拆分
+    split() {
+      //不能同时拆分
+      if (this.scopeRow.length > 0) {
+        if (this.scopeRow.length > 1) {
+          this.$alert("不能同时拆分多个特征", "提示", {
+            type: 'warning',
+            confirmButtonText: '确定',
+          })
+          return false
+        }
+        var rowId = Math.floor((Math.random() * 9999) + 1000);
+        var arr = this.columnMerge()
+        this.scopeRow.forEach((rowItem, rowIndex) => {
+          // 将字段的值给到拆分新数据
+          var splitAdd = JSON.parse(JSON.stringify(rowItem))
+          splitAdd.id = rowItem.id + rowId + "a"
+          // 将部分展示字段置为空
+          for (let i = 0; i < arr.length; i++) {
+            splitAdd[arr[i]] = ''
+          }
+
+          this.tableData.splice(this.scopeRow[0].$index + 1, 0, splitAdd)
+        })
+        this.handleSort(this.scopeRow[0].rightSort)
+        this.typeSelect(this.showType)
+        this.scopeRow = []
+        this.checkList = []
+      }
+    },
+    // 拆分或合并后重新排序
+    handleSort(rightSort) {
+      var data = this.tableData2.filter(item => {
+        return item.rightSort == rightSort
+      })
+      for (var i = 0; i < data.length; i++){
+        data[i].sysOrder = i + 1
+      }
+    },
+  },
+}
+</script>
+
+<style lang="scss" scoped></style>

+ 3 - 3
src/views/task/components/index.vue

@@ -10,7 +10,7 @@
         </div>
       </el-header>
       <el-main class="height_100">
-        <el-table :data="tableData" style="width: 100%;" border header-row-class-name="custom-table-header"
+        <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">
@@ -89,7 +89,7 @@ export default {
     type: {
       default: 1
     },
-    id: '',
+    projectId: '',
     processId: '',
     show: {
       type: Boolean,
@@ -113,7 +113,7 @@ export default {
         total: 0,
       },
       searchFiled2: {
-        projectId: this.id,
+        projectId: this.projectId,
         processId: this.processId
       },
       // 检索字段