Ver código fonte

侵权分析

zhuhao 1 ano atrás
pai
commit
490256b43b

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

@@ -31,6 +31,10 @@ export default {
   groupReportProject(data) {
     return axios.post("/xiaoshi/reportProject/groupReportProject", data);
   },
+
+  /**
+   * 回避设计报告部分
+   */
   /**
    * 查询回避设计报告 ?????
    */
@@ -62,6 +66,22 @@ export default {
     return axios.post("/xiaoshi/feature/getFeatrues", data);
   },
 
+  /**
+   * 侵权分析部分
+   */
+  /**
+   * 编辑或保存产品信息
+   */
+  addProductMessage(data) {
+    return axios.post("/xiaoshi/fto/addProductMessage", data);
+  },
+  /**
+   * 查询产品信息
+   */
+  getProductMessage(params) {
+    return axios.get("/xiaoshi/fto/getProductMessage", {params});
+  },
+
 
 
 };

+ 12 - 10
src/router/index.js

@@ -289,16 +289,18 @@ const routes = [
       //       },
       //       component:() => import('@/views/report/FTO/index.vue'),
       //     },
-      //     //侵权分析
-      //     {
-      //       path: '/tortIndex',
-      //       name:"tortIndex",
-      //       meta:{
-      //         aside: true,
-      //         showHeader:true,
-      //       },
-      //       component:() => import('@/views/report/tort/index.vue'),
-      //     },
+          //侵权分析
+          {
+            path: '/tortIndex',
+            name:"tortIndex",
+            meta:{
+              aside: true,
+              showHeader: true,
+              sign:'tortIndex',
+              belong:'AllReport'
+            },
+            component:() => import('@/views/report/tort/index.vue'),
+          },
           //回避设计
           {
             path: '/avoid',

+ 0 - 6
src/views/report/avoid/index.vue

@@ -23,12 +23,6 @@ export default {
     projectId() {
       return this.$route.query.reportId
     },
-    splitType() {
-      return this.$route.query.splitType
-    },
-    splitBy() {
-      return this.$route.query.splitBy
-    },
   },
   mounted() {
 

+ 14 - 11
src/views/report/components/index.vue

@@ -499,17 +499,8 @@ export default {
           this.handleDelete(row, isLast)
           break;
         case '8'://侵权分析技术特征对比
-          this.$s.setSession('reportMessage1', row)
-          var routerReport3 = this.$router.resolve({
-            path: "/tortIndex",
-            query: {
-              id: row.id,
-              patentNo: row.signPatentNo,
-              personId: row.personId,
-              type: 8
-            }
-          })
-          window.open(routerReport3.href, '_blank');
+          // this.$s.setSession('reportMessage1', row)
+          this.toTortIndex(row)
           break
         case '9'://回避设计
           this.handleDetails(row, '回避设计')
@@ -534,6 +525,18 @@ export default {
           break
       }
     },
+    // 跳转专利与产品关联比对
+    toTortIndex(row) {
+      var routerReport = this.$router.resolve({
+        path: "/tortIndex",
+        query: {
+          patentNo: row.signPatentNo,
+          reportId: row.id,
+          reportType:row.reportType
+        }
+      })
+      window.open(routerReport.href, '_blank');
+    },
     // 跳转回避设计或拆分特征
     handleDetails(row, type) {
       if (type == '回避设计') {

+ 24 - 30
src/views/report/components/splitPage/splitPage.vue

@@ -46,7 +46,7 @@
           <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 :'暂无数据'"
+                :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>
@@ -82,12 +82,28 @@
           <!-- 父组件传递栏位 -->
           <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 v-if="item.type == 'String'">
+                <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>
               </div>
-              <div v-else v-html="scope.row[item.value]"></div>
+
+              <div v-else>
+                <div v-if="isEdit">
+                  <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">
+                    </el-option>
+                  </el-select>
+                </div>
+                <div v-else v-html="scope.row[item.value]"></div>
+              </div>
+
             </template>
           </el-table-column>
 
@@ -173,28 +189,6 @@ export default {
     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() {
@@ -344,7 +338,7 @@ export default {
             merge[arr[m]] = merge[arr[m]] + rowItem[arr[m]]
           }
 
-          let Index1 = this.tableData.findIndex(item => { return rowItem.id == item.id })
+          let Index1 = this.tableData.findIndex(item => { return rowItem.featureId == item.featureId })
           if (Index1 != -1) {
             if (rowIndex < this.scopeRow.length - 1) {
               this.tableData.splice(Index1, 1)
@@ -379,7 +373,7 @@ export default {
         this.scopeRow.forEach((rowItem, rowIndex) => {
           // 将字段的值给到拆分新数据
           var splitAdd = JSON.parse(JSON.stringify(rowItem))
-          splitAdd.id = rowItem.id + rowId + "a"
+          splitAdd.featureId = rowItem.featureId + rowId + "a"
           // 将部分展示字段置为空
           for (let i = 0; i < arr.length; i++) {
             splitAdd[arr[i]] = ''
@@ -398,7 +392,7 @@ export default {
       var data = this.tableData2.filter(item => {
         return item.rightSort == rightSort
       })
-      for (var i = 0; i < data.length; i++){
+      for (var i = 0; i < data.length; i++) {
         data[i].sysOrder = i + 1
       }
     },

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

@@ -35,7 +35,8 @@
               <el-dropdown-item command="3" v-if="[1,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="([1].includes(scope.row.status) || (scope.row.reportType == 4 && [1,2].includes(scope.row.status))) && $reportPermission(scope.row.id,[0,1])">{{!([3,4].includes(scope.row.type))?'拆分特征':'产品信息录入'}}</el-dropdown-item>
-              <el-dropdown-item command="8" v-if="(scope.row.reportType == 4 && [1,2].includes(scope.row.status)) && $reportPermission(scope.row.id,[0,1])">专利与产品关联比对</el-dropdown-item>
+              <!-- <el-dropdown-item command="8" v-if="(scope.row.reportType == 4 && [1,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 && [1,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>

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

@@ -0,0 +1,281 @@
+<template>
+  <!-- 产品信息录入 -->
+  <div>
+    <!-- <div style="display: flex;justify-content: end;">
+      <el-button v-if="isFormEdit" type="primary" @click="isSave">保存</el-button>
+      <el-button v-if="!isFormEdit" type="primary" @click="handleEdit">编辑</el-button>
+    </div> -->
+    <div style="display: flex;justify-content: end;">
+      <slot name="save"></slot>
+      <slot name="edit"></slot>
+    </div>
+    <div style="width: 500px;margin: auto;">
+      <el-form v-if="isFormEdit" :model="form" status-icon :rules="rules" ref="form" label-width="120px"
+        class="demo-form">
+
+        <el-form-item label="标的产品:" prop="productName">
+          <el-input v-model="form.productName" placeholder="请输入标的产品"></el-input>
+        </el-form-item>
+        <el-form-item label="标的说明:" prop="productDescription">
+          <el-input v-model="form.productDescription" placeholder="请输入标的说明"></el-input>
+        </el-form-item>
+
+        <el-form-item v-if="reportType == 4" label="调查区域:" prop="surveyArea">
+          <el-input v-model="form.surveyArea" placeholder="请输入调查区域"></el-input>
+        </el-form-item>
+        <el-form-item label="产品图:">
+          <el-upload ref="upload" action="#" :auto-upload="false" multiple :on-change="handleChange" list-type="picture"
+            :show-file-list="false">
+            <span style="display:flex;flex-direction:row;flex-wrap:wrap;">
+              <span class="avatar" v-for="(item) in form.systemFileList" :key="item.guid || item.uid"
+                style="margin-left:10px">
+                <span class="deleteImg">
+                  <span>
+                    <i class="el-icon-zoom-in" @click.stop="handlePictureCardPreview(item)"></i>
+                    <i class="el-icon-delete" @click.stop="handleRemove(item)"></i>
+                  </span>
+                </span>
+                <el-image ref="image" class="img" :src="item.guid ? $commonJS.checkViewer(item.guid) : item.url"
+                  :preview-src-list="form.systemFileList ? form.systemFileList.map(item => { return item.guid ? $commonJS.checkViewer(item.guid) : item.url }) : []"></el-image>
+              </span>
+              <i class="el-icon-plus avatar-uploader-icon"></i>
+            </span>
+          </el-upload>
+        </el-form-item>
+        <el-form-item v-if="reportType == 4" label="检索策略:">
+          <el-input v-model="form.searchPolicy" placeholder="请输入检索策略"></el-input>
+        </el-form-item>
+        <el-form-item label="检索截止日期:">
+          <el-date-picker style="width:100%" v-model="form.deadLine" value-format="yyyy-MM-dd HH:mm:ss" type="datetime"
+            placeholder="请选择检索截止日期">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item v-if="reportType == 4" label="关注企业/发明人/技术方向:">
+          <el-input v-model="form.focusInformation" placeholder="请输入关注企业/发明人/技术方向"></el-input>
+        </el-form-item>
+        <el-form-item label="备注:">
+          <el-input type="textarea" :rows="3" placeholder="请输入内容" v-model="form.description"></el-input>
+        </el-form-item>
+      </el-form>
+
+      <el-form v-else :model="form" status-icon :rules="rules" ref="form" label-width="120px" class="demo-form">
+        <el-form-item label="标的产品:">
+          <span>{{ form.productName }}</span>
+        </el-form-item>
+        <el-form-item label="标的说明:">
+          <span>{{ form.productDescription }}</span>
+        </el-form-item>
+        <el-form-item v-if="reportType == 4" label="调查区域:" prop="surveyArea">
+          <span>{{ form.surveyArea }}</span>
+        </el-form-item>
+        <el-form-item label="产品图:">
+          <el-upload ref="upload" action="#" :auto-upload="false" multiple :on-change="handleChange" list-type="picture"
+            :show-file-list="false">
+            <span style="display:flex;flex-direction:row;flex-wrap:wrap;">
+              <span class="avatar" v-for="(item) in form.systemFileList" :key="item.guid || item.uid"
+                style="margin-left:10px">
+                <span class="deleteImg">
+                  <span>
+                    <i class="el-icon-zoom-in" @click.stop="handlePictureCardPreview(item)"></i>
+                    <i v-if="isFormEdit" class="el-icon-delete" @click.stop="handleRemove(item)"></i>
+                  </span>
+                </span>
+                <el-image ref="image" class="img" :src="item.guid ? $commonJS.checkViewer(item.guid) : item.url"
+                  :preview-src-list="form.systemFileList ? form.systemFileList.map(item => { return item.guid ? $commonJS.checkViewer(item.guid) : item.url }) : []"></el-image>
+              </span>
+              <i v-if="isFormEdit" class="el-icon-plus avatar-uploader-icon"></i>
+            </span>
+          </el-upload>
+        </el-form-item>
+        <el-form-item v-if="reportType == 4" label="检索策略:">
+          <span>{{ form.searchPolicy }}</span>
+        </el-form-item>
+        <el-form-item label="检索截止日期:">
+          <span>{{ form.deadLine }}</span>
+        </el-form-item>
+        <el-form-item v-if="reportType == 4" label="关注企业/发明人/技术方向:">
+          <span>{{ form.focusInformation }}</span>
+        </el-form-item>
+        <el-form-item label="备注:">
+          <span>{{ form.description }}</span>
+        </el-form-item>
+      </el-form>
+    </div>
+
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    // 信息(patentNo,reportId)
+    word: {
+      type: Object,
+      default: () => {
+        return {
+          patentNo: '',
+          projectId: ''
+        }
+      }
+    },
+    // 报告类型
+    reportType: '',
+    // 是否可以编辑
+    isFormEdit: {
+      type: Boolean,
+      default: true
+    }
+  },
+  data() {
+    return {
+      // 表单信息
+      form: {
+        systemFileList: []
+      },
+      // 表单校验
+      rules: {
+        productName: [{ required: true, message: '请输入标的产品', trigger: 'blur' },],
+        productDescription: [{ required: true, message: '请输入标的说明', trigger: 'blur' },],
+        surveyArea: [{ required: true, message: '请输入调查区域', trigger: 'blur' },],
+      },
+    }
+  },
+  mounted() {
+    this.getList()
+  },
+  methods: {
+    // 编辑
+    handleEdit() {
+      this.isFormEdit = !this.isFormEdit
+    },
+    // 获取数据
+    getList() {
+      let params = {
+        ...this.word,
+      }
+      this.$api.getProductMessage(params).then(res => {
+        if (res.code == 200) {
+          this.form = res.data.data
+          if (!this.form.systemFileList) {
+            this.$set(this.form, 'systemFileList', [])
+          }
+        }
+      }).catch(error => {
+        this.form = {
+          systemFileList: []
+        }
+      })
+    },
+    // 保存
+    isSave() {
+      this.form.fileGuids = this.form.systemFileList.map(item => {
+        return item.guid
+      })
+      let params = {
+        ...this.word,
+        ...this.form
+      }
+      this.$api.addProductMessage(params).then(res => {
+        if (res.code == 200) {
+          this.$message.success('保存成功')
+        }
+      })
+    },
+    // 图片变化的change事件
+    handleChange(file, fileList) {
+      file.raw.url = file.url
+      this.form.systemFileList.push(file.raw)
+      this.uploadFile(file)
+    },
+    // 点击已上传的文件//showViewer是图片显示查看器
+    handlePictureCardPreview(file) {
+      this.$refs.image.showViewer = true
+    },
+    // 文件列表移除文件
+    handleRemove(file) {
+      let index = this.form.systemFileList.findIndex(item => {
+        if (file.guid) {
+          return item.guid == file.guid
+        } else {
+          return item.uid == file.uid
+        }
+      })
+      if (index != -1) {
+        this.form.systemFileList.splice(index, 1)
+      }
+    },
+    //上传附件
+    uploadFile(file) {
+      let formData = new FormData()
+      formData.append('sourceId', this.$constants.sourceId)
+      formData.append('files', file.raw)
+      this.$api.uploadFile(formData).then(response => {
+        if (response.code == 200) {
+          file.guid = response.data[0]
+          file.raw.guid = response.data[0]
+        }
+      })
+    },
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+.avatar-uploader-icon {
+  background-color: #fbfdff;
+  border: 1px dashed #c0ccda;
+  font-size: 28px;
+  color: #8c939d;
+  width: 148px;
+  height: 148px;
+  line-height: 148px;
+  text-align: center;
+}
+
+.avatar {
+  position: relative;
+  width: 148px;
+  height: 148px;
+  display: block;
+}
+
+.avatar:hover .deleteImg {
+  display: block;
+}
+
+.deleteImg {
+  display: none;
+  font-size: 30px;
+  width: 148px;
+  height: 148px;
+  background-color: black;
+  opacity: 0.6;
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 0;
+  margin: auto;
+  z-index: 999;
+}
+
+.avatar .img {
+  width: 148px;
+  height: 148px;
+}
+
+.deleteImg span i {
+  margin-left: 10px;
+  color: #fff;
+}
+
+.deleteImg span {
+  display: flex;
+  align-items: center;
+  /*垂直居中*/
+  justify-content: center;
+  /*水平居中*/
+  width: 100%;
+  height: 100%;
+}
+</style>

+ 150 - 0
src/views/report/tort/components/tortContrast.vue

@@ -0,0 +1,150 @@
+<template>
+  <!-- 专利与产品关联比对 -->
+  <div class="height_100">
+
+    <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>
+          <div>
+            <el-link type="primary" @click="handleSwitch">{{viewType=='splitPage'?'切换产品信息':'切换产品特征'}}</el-link>
+          </div>
+        </div>
+      </el-header>
+      <el-main style="padding: 0px !important;">
+
+        <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>
+</template>
+
+<script>
+import { patentDetails } from '../../components/mixins/index2'
+import splitPage from '../../components/splitPage/splitPage.vue'
+import informationEntry from './informationEntry.vue'
+export default {
+  props: ['patentNo', 'projectId','reportType'],
+  mixins: [patentDetails],
+  components: {
+    splitPage,
+    informationEntry,
+  },
+  data() {
+    return {
+      viewType: 'splitPage',
+      
+      // 数据
+      tableData: [],
+      // 栏位
+      columnList: [
+        {
+          name: "标的说明(可粘贴图片)",
+          type: "String",
+          value: "direction",
+        },
+        {
+          name: "比对结果",
+          type: "Array",
+          value: "result",
+          options: [
+            {
+              value: 1,
+              label: '字面相同'
+            }, {
+              value: 3,
+              label: '等同'
+            }, {
+              value: 0,
+              label: '不相同'
+            }, {
+              value: 2,
+              label: '待确定'
+            }
+          ],
+        },
+        {
+          name: "比对说明(可粘贴图片)",
+          type: "String",
+          value: "directions",
+        },
+      ],
+    }
+  },
+  mounted() {
+    this.getList()
+  },
+  methods: {
+    // 切换产品信息
+    handleSwitch() {
+      this.viewType == 'splitPage' ? this.viewType ='informationEntry' : this.viewType ='splitPage'
+    },
+    // 保存
+    isSave(val) {
+      let params = {
+        projectId: this.projectId,
+        wholeContent: this.wholeContent,
+        avoidDesignDTOS: val,
+      }
+      this.$api.addAvoidDesign(params).then(res => {
+        if (res.code == 200) {
+          this.$message.success('保存成功')
+        }
+      })
+    },
+    // 拆分信息
+    splitSelect(split) {
+      this.getList(split, true)
+    },
+    getList(split = { splitType: '1', splitBy: '2' }, ifReSplit = false) {
+      let params = {
+        ifReSplit: ifReSplit,
+        // projectId: Number(this.projectId),
+        projectId: '87',
+        ...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 = ''
+      }
+    },
+  },
+}
+</script>
+
+<style lang="scss" scoped></style>

+ 38 - 0
src/views/report/tort/index.vue

@@ -0,0 +1,38 @@
+<template>
+  <div>
+    <tortContrast :patentNo="patentNo" :projectId="projectId" :reportType="reportType"></tortContrast>
+  </div>
+</template>
+
+<script>
+import tortContrast from './components/tortContrast.vue';
+export default {
+  components: {
+    tortContrast
+  },
+  data() {
+    return {
+
+    }
+  },
+  computed: {
+    patentNo() {
+      return this.$route.query.patentNo
+    },
+    projectId() {
+      return this.$route.query.reportId
+    },
+    reportType() {
+      return this.$route.query.reportId
+    }
+  },
+  mounted() {
+
+  },
+  methods: {
+
+  },
+}
+</script>
+
+<style lang="scss" scoped></style>