patentDetails.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504
  1. <template>
  2. <div class="height_100">
  3. <el-container v-loading="loading">
  4. <el-header style="min-height: 100px !important;height: auto;">
  5. <div style="width:100%">
  6. <div style="display: flex;justify-content: space-between;align-items: center;height:50px">
  7. <div style="text-align: start;padding-left: 10px;position: relative;">
  8. <!-- <div style="width: 260px;"> -->
  9. <img src="@/assets/visual/fixed.png" width="20px" height="20px"
  10. v-if="fix === true && value == true && !lock" @click="fix = false" style="" />
  11. <img src="@/assets/visual/unfixed.png" width="20px" height="20px"
  12. v-if="fix === false && value == true && !lock" @click="fix = true" style="" />
  13. <!-- </div> -->
  14. </div>
  15. <div>
  16. <div>
  17. <span v-html="getViewDom(patent.patentNo)"></span>
  18. <el-tag type="primary" effect="dark" size="mini" class="margin-left_10" v-if="patent.simpleStatus">{{
  19. simpleStatus[patent.simpleStatus] }}</el-tag>
  20. </div>
  21. <div style="color: #6b6868; font-size: 15px;padding-bottom: 5px;">
  22. <span v-html="getView(patent, 'title')"></span>
  23. <el-link v-if="projectId" type="primary" @click.native="handleChange(patent, 'title')"
  24. style="margin-left: 10px;margin-top: -3px;">
  25. <span v-if="!patent.change">切换译文</span>
  26. <span v-else>切换原文</span>
  27. </el-link>
  28. </div>
  29. </div>
  30. <!-- <PatentMark :patentNo="patent.patentNo" @biaozhu="getBiaoZhu"></PatentMark> -->
  31. <div v-if="outside">
  32. <el-button type="primary" size="small" @click="importToProject">导入专利</el-button>
  33. </div>
  34. <div style="display: flex;justify-content: space-between;margin-right: 10px;align-items: center;" v-else>
  35. <el-dropdown size="medium" style="margin-right:10px">
  36. <el-button type="primary" size="small">
  37. 创建报告<i class="el-icon-arrow-down el-icon--right"></i>
  38. </el-button>
  39. <el-dropdown-menu slot="dropdown" style="margin-top:0px">
  40. <!-- 遍历按钮 -->
  41. <el-dropdown-item @click.native="handleAnalyse(1)">第三方意见</el-dropdown-item>
  42. <el-dropdown-item @click.native="handleAnalyse(2)">稳定性分析</el-dropdown-item>
  43. <el-dropdown-item @click.native="handleAnalyse(4)">侵权分析</el-dropdown-item>
  44. <el-dropdown-item @click.native="handleAnalyse(5)">回避设计</el-dropdown-item>
  45. <el-dropdown-item @click.native="handleAnalyse(7)">官方无效</el-dropdown-item>
  46. </el-dropdown-menu>
  47. </el-dropdown>
  48. <el-button type="primary" size="small" @click="handleSelect('PatentExport')">导出文档</el-button>
  49. </div>
  50. </div>
  51. <div style=" position: relative; border-top: 1px solid #e6e6e6;text-align: center;" class="menu">
  52. <el-link v-for="item in menuList" :type="activeMenu === item.value ? 'primary' : undefined" :key="item.value"
  53. v-if="!item.show" @click.native="handleSelect(item.value)">
  54. {{ item.label }}
  55. <span v-if="item.value == 'PatentImage' || item.value == 'PatentPDF'" @click.stop="ending(item.value)">
  56. <el-popover placement="right" width="400" trigger="click">
  57. <el-radio v-for="(item, index) in positionList" :key="index" v-model="radio" @input="changePosition"
  58. :label="item.value">{{ item.label }}</el-radio>
  59. <i class="el-icon-setting" slot="reference"></i>
  60. </el-popover>
  61. </span>
  62. </el-link>
  63. <el-link v-for="item in menuList2" :type="activeMenu === item.value ? 'primary' : undefined" :key="item.value"
  64. v-if="!outside" @click.native="handleSelect(item.value)">{{ item.label }}</el-link>
  65. <template v-if="!outside">
  66. <el-tooltip class="item" effect="dark" :content="(showRight ? '隐藏' : '显示') + '右侧菜单'" placement="top">
  67. <i :class="showRight ? 'el-icon-s-unfold' : 'el-icon-s-fold'"
  68. style="font-size: 25px;position: absolute; right: 10px; margin-top: 5px;color: #2f2f2f; cursor: pointer"
  69. @click="showRight = !showRight"></i>
  70. </el-tooltip>
  71. </template>
  72. </div>
  73. </div>
  74. </el-header>
  75. <el-main>
  76. <div class="height_100" style="display: flex;">
  77. <div class="height_100" :style="{ width: showRight ? 'calc(100% - 321px)' : 'calc(100% - 21px)' }">
  78. <my-view :position="this.positionList.find(item => item.value == radio).position"
  79. :showView="radio != 1 && activeMenu != activeMenu2">
  80. <div slot="left">
  81. <component :activeName="activeMenu" style="width:100%;padding-right: 10px;" :is="activeMenu"
  82. :evidence="evidence" :signPatentNo="signPatentNo" :reportType="reportType" :project-id="projectId"
  83. :outside="outside" :projectType="projectType" :patent="patent" :patentNo="patent.patentNo"
  84. :domId="$commonJS.uuid(36)" @refresh="getPatent()"></component>
  85. </div>
  86. <div slot="right">
  87. <component :is="activeMenu2" :project-id="projectId" :outside="outside" :projectType="projectType"
  88. :patent="patent" :signPatentNo="signPatentNo" :reportType="reportType" :sign="true"
  89. :evidence="evidence"></component>
  90. </div>
  91. </my-view>
  92. </div>
  93. <div class="height_100" v-if="showRight" style="width: 300px;margin: auto;">
  94. <el-container>
  95. <el-header>
  96. <div class="patent-articles-option">
  97. <el-tabs v-model="activeOption" type="card">
  98. <el-tab-pane label="标引" name="PatentField"></el-tab-pane>
  99. <!-- <el-tab-pane label="注释" name="PatentAnnotation"
  100. :disabled="!($permission('/workspace/details/notes') && $r(projectId, [1, 2]))"></el-tab-pane> -->
  101. </el-tabs>
  102. </div>
  103. </el-header>
  104. <el-main>
  105. <keep-alive>
  106. <component :is="activeOption" :project-id="projectId" :patentNo="patent.patentNo" :taskId="taskId">
  107. </component>
  108. </keep-alive>
  109. </el-main>
  110. </el-container>
  111. </div>
  112. </div>
  113. </el-main>
  114. </el-container>
  115. <!-- 创建报告 -->
  116. <addAndEditReport ref="addAndEditReport"></addAndEditReport>
  117. <projectListDialog ref="projectListDialog" :importData="condition"></projectListDialog>
  118. </div>
  119. </template>
  120. <script>
  121. import PatentBasic from './patentMessage/PatentBasic.vue'
  122. import PatentRight from './patentMessage/PatentRight.vue'
  123. import PatentImage from './patentMessage/PatentImage.vue'
  124. import PatentInstruction from './patentMessage/PatentInstruction.vue'
  125. import PatentFamily from './patentMessage/PatentFamily.vue'
  126. import PatentStatus from './patentMessage/PatentStatus.vue'
  127. import PatentPDF from './patentMessage/PatentPDF.vue'
  128. import pageProduct from './patentMessage/pageProduct.vue'
  129. import licenseHistory from './patentMessage/history/licenseHistory.vue'
  130. import litigationHistory from './patentMessage/history/litigationHistory.vue'
  131. import reviewHistory from './patentMessage/history/reviewHistory.vue'
  132. import otherReferences from './patentMessage/history/otherReferences.vue'
  133. import InvalidHistory from './patentMessage/history/InvalidHistory.vue'
  134. import HistoryOfInvalidEvidence from './patentMessage/history/HistoryOfInvalidEvidence.vue'
  135. import PatentWorth from './patentMessage/history/echarts/components/echarts.vue'
  136. import { projectData, handleData } from '../../patentCollection/components/mixins/index'
  137. import PatentField from './PatentField.vue'
  138. import addAndEditReport from '@/views/report/components/dialog/addAndEditReport.vue'
  139. import projectListDialog from "@/views/components/import/conditionImport/components/projectListDialog.vue";
  140. export default {
  141. components: {
  142. PatentBasic,
  143. PatentRight,
  144. PatentImage,
  145. PatentInstruction,
  146. PatentFamily,
  147. PatentStatus,
  148. PatentPDF,
  149. pageProduct,
  150. licenseHistory,
  151. litigationHistory,
  152. reviewHistory,
  153. otherReferences,
  154. InvalidHistory,
  155. HistoryOfInvalidEvidence,
  156. PatentWorth,
  157. PatentField,
  158. addAndEditReport,
  159. projectListDialog
  160. },
  161. mixins: [projectData, handleData],
  162. props: {
  163. projectId: {
  164. default: 0
  165. },
  166. patentNo: {
  167. type: String
  168. },
  169. taskId: {
  170. default: null,
  171. },
  172. evidence: {
  173. },
  174. signPatentNo: {
  175. },
  176. reportType: {
  177. },
  178. outside: {
  179. default: false
  180. },
  181. projectType: {
  182. type: String,
  183. default: '2'//判断是不是从专题库进入专利详情1为专题库(专题库已传1)2为报告(报告未传2)3为产品(产品已传3)
  184. },
  185. value: {
  186. default: false
  187. },
  188. lock: {
  189. default: false
  190. }
  191. },
  192. data() {
  193. return {
  194. loading: false,
  195. radio: 1,
  196. positionList: [
  197. {
  198. label: 'tab展示',
  199. value: 1,
  200. position: 'row'
  201. },
  202. {
  203. label: '上边展示',
  204. value: 2,
  205. position: 'column-reverse'
  206. },
  207. {
  208. label: '下边展示',
  209. value: 3,
  210. position: 'column'
  211. },
  212. {
  213. label: '左边展示',
  214. value: 4,
  215. position: 'row-reverse'
  216. },
  217. {
  218. label: '右边展示',
  219. value: 5,
  220. position: 'row'
  221. },
  222. ],
  223. menuList: [
  224. {
  225. value: 'PatentBasic',
  226. label: '基础信息'
  227. },
  228. {
  229. value: 'PatentRight',
  230. label: '权利要求'
  231. },
  232. {
  233. value: 'PatentImage',
  234. label: '附图'
  235. },
  236. {
  237. value: 'PatentInstruction',
  238. label: '说明书文本'
  239. },
  240. {
  241. value: 'PatentFamily',
  242. label: '同族专利'
  243. },
  244. {
  245. value: 'PatentStatus',
  246. label: '法律事务'
  247. },
  248. {
  249. value: 'PatentPDF',
  250. label: '说明书'
  251. },
  252. ],
  253. menuList2: [
  254. {
  255. value: 'licenseHistory',
  256. // show: this.$permission('/workspace/patent/worth') ? false : true,
  257. label: '许可历史'
  258. },
  259. {
  260. value: 'pageProduct',
  261. // show: this.$permission('/workspace/product') ? false : true,
  262. label: '商品化'
  263. },
  264. {
  265. value: 'PatentWorth',
  266. // show: this.$permission('/workspace/patent/worth') ? false : true,
  267. label: '价值曲线'
  268. },
  269. {
  270. value: 'reviewHistory',
  271. label: '审查历史'
  272. },
  273. {
  274. value: 'InvalidHistory',
  275. label: '被无效历史'
  276. },
  277. {
  278. value: 'HistoryOfInvalidEvidence',
  279. label: '作为无效证据使用历史'
  280. },
  281. // {
  282. // value: 'InvalidEvidencePush',
  283. // label: '无效证据推荐'
  284. // },
  285. {
  286. value: 'litigationHistory',
  287. label: '诉讼历史'
  288. },
  289. {
  290. value: 'otherReferences',
  291. label: '其他参考资料'
  292. },
  293. ],
  294. fix: false,
  295. showRight: false,
  296. activeOption: 'PatentField',
  297. activeMenu: 'PatentBasic',
  298. activeMenu2: '',
  299. patent: {},
  300. };
  301. },
  302. watch: {
  303. patentNo(val) {
  304. if (val && !this.fix) {
  305. this.getPatent()
  306. this.getPiZhuData(val)
  307. }
  308. }
  309. },
  310. computed: {
  311. condition() {
  312. return this.$s.getSession('import') || {}
  313. },
  314. },
  315. created() { },
  316. mounted() {
  317. this.getPatent()
  318. this.getPiZhuData()
  319. },
  320. methods: {
  321. // 获取批注
  322. getPiZhuData(val) {
  323. let params = {
  324. patentNo: val ? val : this.patentNo,
  325. projectId: this.projectId,
  326. }
  327. this.$api.queryScratchWords(params).then(response => {
  328. if (response.code == 200) {
  329. if (this.highlight.piZhuContrastList.length > 0) {
  330. var a = this.highlight.piZhuContrastList.filter(item => {
  331. return item.patentNo != params.patentNo
  332. }).concat(response.data.data)
  333. } else {
  334. var a = response.data.data
  335. }
  336. this.$store.commit('SET_PATENT_PIZHU_CONTRAST', a)
  337. }
  338. })
  339. },
  340. // 获取外部摘要附图的guid,获取外部的法律状态
  341. getData() {
  342. var params = {
  343. appNo: this.patent.rowApplicationNo,
  344. }
  345. this.$api.getPictureGuid(params).then(response => {
  346. if (response.code == 200) {
  347. this.$set(this.patent, 'pictureGuid', response.data)
  348. }
  349. })
  350. this.$api.getLegalStatus(params).then(response => {
  351. if (response.code == 200) {
  352. this.$set(this.patent, 'legalEvents', response.data.legalEvents)
  353. }
  354. })
  355. },
  356. //导入到专题库
  357. importToProject() {
  358. var form = {
  359. ...this.condition,
  360. patentNos: [this.patent.patentNo],
  361. // isDeletePatentNos: [],
  362. }
  363. this.$refs.projectListDialog.open(form);
  364. },
  365. getBiaoZhu() {
  366. },
  367. //获取专利信息
  368. getPatent() {
  369. var params = {
  370. patentNo: this.patentNo
  371. }
  372. var api = 'selectPatentDetail'
  373. if (this.outside) {
  374. api = 'queryExternalDetail'
  375. }
  376. this.loading = true
  377. this.$api[api](params).then(response => {
  378. if (response.code == 200) {
  379. this.patent = response.data
  380. this.loading = false
  381. if (this.outside) {
  382. this.getData()
  383. }
  384. this.getPatentField()
  385. }
  386. }).catch(error => {
  387. this.loading = false
  388. })
  389. },
  390. getPatentField(){
  391. var params = {
  392. projectId : this.projectId,
  393. patentNos:[this.patent.patentNo],
  394. innerFields:[
  395. {
  396. fieldType:10,
  397. fieldId:0
  398. }
  399. ]
  400. }
  401. this.$api.getPatentFields(params).then(response=>{
  402. if(response.code == 200){
  403. var data = response.data.data
  404. if(data && data.length>0){
  405. var inner = data[0].innerClassFields
  406. if(inner && inner.length>0){
  407. this.$set(this.patent,'label',inner[0].fieldValueVOS)
  408. }else{
  409. this.$set(this.patent,'label',[])
  410. }
  411. }else{
  412. this.$set(this.patent,'label',[])
  413. }
  414. }
  415. })
  416. },
  417. // 创建报告:无效分析等点击事件
  418. handleAnalyse(id) {
  419. var permission = {
  420. 1:'analysisAndOpinion',
  421. 2:'analysisAndOpinion',
  422. 4:'tort',
  423. 5:'avoidDesign',
  424. 7:'officiallyInvalid'
  425. }
  426. if(!this.$permission.FunPermissions('xiaoshi/report/'+permission[id])){
  427. this.$showPermissionDialog()
  428. return false
  429. }
  430. var form = {
  431. reportType: id,
  432. signPatentNo: this.patent.patentNo,
  433. projectId: this.projectId,
  434. // departmentId: response.data[0].departmentId,
  435. // personId: response.data[0].personnelId,
  436. // clientId: response.data[0].clientId,
  437. matterId: [],
  438. scenarioId: [],
  439. inventionName: this.getView(this.patent, 'title')
  440. }
  441. this.$refs.addAndEditReport.open(form)
  442. },
  443. handleSelect(index) {
  444. // 导出文档
  445. if (index === 'PatentExport') {
  446. let obj = {
  447. isAdd: [this.patentNo],
  448. isDelete: [],
  449. startNumber: 1,
  450. endNumber: 0,
  451. searchQuery: '',
  452. customFields: [],
  453. orderDTOList: [],
  454. }
  455. const router = this.$router.resolve({
  456. path: '/exportPatent',
  457. query: {
  458. projectId: this.projectId,
  459. condition: JSON.stringify(obj)
  460. }
  461. })
  462. window.open(router.href, '_blank');
  463. return false
  464. }
  465. if (index == this.activeMenu2) {
  466. this.activeMenu2 = ''
  467. this.radio = 1
  468. this.changePosition(this.radio)
  469. }
  470. this.activeMenu = index
  471. },
  472. ending(val) {
  473. this.activeMenu2 = val
  474. return false
  475. },
  476. changePosition(val) {
  477. }
  478. },
  479. };
  480. </script>
  481. <style lang="scss" scoped>
  482. .menu {
  483. .el-link {
  484. margin-right: 20px;
  485. }
  486. }
  487. </style>