@@ -56,7 +56,6 @@ export default {
},
computed:{
mark() {
- console.log( this.$store.state.patent.index);
return this.$store.state.patent.index || {
rangeType:[]
}
@@ -82,7 +81,7 @@ export default {
methods: {
//添加陈述意见
addStateOpinion() {
- console.log(this.mark)
+ // console.log(this.mark)
// {
// "color": "#ff0000",
// "scratchType": 2,
@@ -109,13 +108,15 @@ export default {
reportId: this.mark.rangeId,
scratchField: this.mark.scratchField,
position: this.mark.position,
+ rightPosition: this.mark.rightPosition,
proofId: this.mark.evidenceFlieId,//证据文献Id
signPatentNo: this.mark.signPatentNo,
rightId:this.mark.rightSort,
+ rightSort:this.mark.rightSort,
// reportType:this.mark.reportType,
// taskId:this.mark.taskId,
- this.$refs.addOpinion.open(form,form.patentNo==form.signPatentNo)
+ this.$refs.addOpinion.open(form,form.patentNo==form.signPatentNo,true)
@@ -90,23 +90,54 @@ export default {
return axios.get('/report/api/feature/getRights', {params})
/**
- * 添加证据
+ * 添加特征
*/
addSingleFeature(params) {
return axios.post('/report/api/feature/addSingleFeature', params)
- * 查询证据
+ * 删除单个特征
+ */
+ deleteSingleFeature(params) {
+ return axios.get('/report/api/feature/deleteSingleFeature', {params})
+ },
+ /**
+ * 查询特征
getFeatureList(params) {
return axios.get('/report/api/feature/getFeatureList', {params})
+ * 查询证据组合详情
+ queryDetailByInvalidId(params) {
+ return axios.get('/report/api/proofGroup/queryDetailByInvalidId', {params})
+ * 修改证据组合详情
+ updateProofGroup(params) {
+ return axios.post('/report/api/proofGroup/update', params)
- * 添加或更新
+ * 添加或更新无效证据
addOrUpdatePoofArguments(params) {
return axios.post('/report/api/arguments/addOrUpdatePoofArguments', params)
+
+ * 添加更新无效证据
+ addOrUpdateProofStr(params) {
+ return axios.post('/report/api/proof/addOrUpdateProofStr', params)
+ * 删除无效证据
+ deleteProofStr(params) {
+ return axios.post('/report/api/proof/deleteProofStr', params)
* 查询陈述意见列表
@@ -122,9 +153,15 @@ export default {
* 更新无效理由和证据
- updatelnvalidReason(params) {
+ updateInvalidReason(params) {
return axios.post('/report/api/invalidReason/updateInvalidReason', params)
+ * 更新无效理由和证据的陈述意见
+ updateArgumentStr(params) {
+ return axios.post('/report/api/invalidReason/updateArgumentStr', params)
* 删除无效理由和证据
@@ -193,4 +230,44 @@ export default {
return axios.post('/report/api/CompareFiles/order/addProodOrder', params)
+/**
+ * 添加自定义栏位
+addOrUpdateInvalidFields(params) {
+ return axios.post('/report/api/invalidReasonField/addOrUpdateFields', params)
+},
+ * 查询自定义栏位
+queryInvalidFields(params) {
+ return axios.get('/report/api/invalidReasonField/queryFields', {params})
+ * 删除自定义栏位
+deleteInvalidFields(params) {
+ return axios.post('/report/api/invalidReasonField/deleteFields', params)
+ * 更新自定义栏位排序和显示
+updateSort(params) {
+ return axios.post('/report/api/invalidReasonField/updateSort', params)
+ * 添加或更新无效理由自定义字段值
+addOrUpdateValue(params) {
+ return axios.post('/report/api/invalidReason/addOrUpdateValue', params)
+ * 导出无效理由列表
+exportInvalid(params) {
+ return axios.post('/report/api/invalidReason/exportInvalid', params)
@@ -8,6 +8,7 @@ import matters from './matters';
import task from './task';
import highlight from './highlight';
import InvalidResponse from './InvalidResponse';
+import quartz from "./quartz";
export default {
...report,
@@ -19,4 +20,5 @@ export default {
...task,
...highlight,
...InvalidResponse,
+ ...quartz
@@ -0,0 +1,97 @@
+import axios from '@/utils/axios'
+export default{
+ * 获取下载接口所有配置
+ getAllConfig(params) {
+ return axios.get('/v2/config/getAllConfig', { params })
+ * 根据配置类型获取配置元素
+ getConfigCell(params) {
+ return axios.get('/v2/config/getConfigCell', { params })
+ * 添加导入任务
+ addTask(data) {
+ return axios.post('/v2/task/addTask', data)
+ * 继续导入任务
+ resumeJobTask(params) {
+ return axios.get('/v2/task/continue', {params})
+ * 暂停导入任务
+ pauseJobTask(params) {
+ return axios.get('/v2/task/pause', {params})
+ * 取消导入任务
+ cancelTask(params) {
+ return axios.get('/v2/task/cancelTask', {params})
+ * 删除任务
+ // deleteTasks(data) {
+ // return axios.post('/v2/task/deleteTasks', data)
+ // },
+ deleteTask(data) {
+ return axios.get('/v2/task/deleteTask', {data})
+ * 更新定时任务
+ updateTasks(data) {
+ return axios.post('/v2/task/update', data)
+ * 查询导入任务
+ // getTasks(data) {
+ // return axios.post('/v2/task/getTasks', data)
+ getTasks(data) {
+ return axios.post('/v2/task/queryTasks', data)
+ * 查询实时进度或当前行数据的更新日志
+ // getTaskDetails(data) {
+ // return axios.post('/v2/task/getTaskDetails', data)
+ queryQrtzTaskLogs(data) {
+ return axios.post('/v2/task/queryQrtzTaskLogs', data)
+ * 更改任务状态
+ setDetailState(params) {
+ return axios.get('/v2/task/setDetailState', {params})
+ //添加网站账号配置
+ addLoginConfig(params){
+ return axios.post('/v2/config/addLoginConfig',params)
+ //查询网站账号配置
+ queryLoginConfig(params){
+ return axios.post('/v2/config/queryLoginConfig',params)
+ //删除网站账号配置
+ deleteConfig(params){
+ return axios.post('/v2/config/deleteConfig',params)
+ //专利号导入
+ importByNos(params){
+ return axios.post('/v2/project/import/importByNos',params)
+ }
+}
@@ -4,8 +4,8 @@
display: flex;
justify-content: space-around;
width: 100%;
- height: 100%;
- margin: 10px 0px;
+ // height: 100%;
+ // margin: 10px 0px;
overflow: auto;
box-shadow: -1px 9px 10px 3px rgba(0, 0, 0, 0.11);
@@ -45,13 +45,13 @@
.mid {
// float: left;
// width: 68%;
background: #fff;
box-shadow: -1px 4px 5px 3px rgba(0, 0, 0, 0.11);
.box1{
/*拖拽区div样式*/
@@ -0,0 +1,539 @@
+/* Logo 字体 */
+@font-face {
+ font-family: "iconfont logo";
+ src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
+ src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
+ url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
+ url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
+ url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
+.logo {
+ font-size: 160px;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+/* tabs */
+.nav-tabs {
+ position: relative;
+.nav-tabs .nav-more {
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ height: 42px;
+ line-height: 42px;
+ color: #666;
+#tabs {
+ border-bottom: 1px solid #eee;
+#tabs li {
+ cursor: pointer;
+ width: 100px;
+ height: 40px;
+ line-height: 40px;
+ text-align: center;
+ font-size: 16px;
+ border-bottom: 2px solid transparent;
+ z-index: 1;
+ margin-bottom: -1px;
+#tabs .active {
+ border-bottom-color: #f00;
+ color: #222;
+.tab-container .content {
+ display: none;
+/* 页面布局 */
+.main {
+ padding: 30px 100px;
+ width: 960px;
+ margin: 0 auto;
+.main .logo {
+ color: #333;
+ text-align: left;
+ margin-bottom: 30px;
+ line-height: 1;
+ height: 110px;
+ margin-top: -50px;
+ overflow: hidden;
+ *zoom: 1;
+.main .logo a {
+.helps {
+ margin-top: 40px;
+.helps pre {
+ padding: 20px;
+ margin: 10px 0;
+ border: solid 1px #e7e1cd;
+ background-color: #fffdef;
+ overflow: auto;
+.icon_lists {
+ width: 100% !important;
+.icon_lists li {
+ margin-bottom: 10px;
+ margin-right: 20px;
+ list-style: none !important;
+ cursor: default;
+.icon_lists li .code-name {
+ line-height: 1.2;
+.icon_lists .icon {
+ display: block;
+ height: 100px;
+ line-height: 100px;
+ font-size: 42px;
+ margin: 10px auto;
+ -webkit-transition: font-size 0.25s linear, width 0.25s linear;
+ -moz-transition: font-size 0.25s linear, width 0.25s linear;
+ transition: font-size 0.25s linear, width 0.25s linear;
+.icon_lists .icon:hover {
+ font-size: 100px;
+.icon_lists .svg-icon {
+ /* 通过设置 font-size 来改变图标大小 */
+ width: 1em;
+ /* 图标和文字相邻时,垂直对齐 */
+ vertical-align: -0.15em;
+ /* 通过设置 color 来改变 SVG 的颜色/fill */
+ fill: currentColor;
+ /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
+ normalize.css 中也包含这行 */
+.icon_lists li .name,
+/* markdown 样式 */
+.markdown {
+ font-size: 14px;
+ line-height: 1.8;
+.highlight {
+ line-height: 1.5;
+.markdown img {
+ vertical-align: middle;
+ max-width: 100%;
+.markdown h1 {
+ color: #404040;
+ font-weight: 500;
+ margin-bottom: 24px;
+.markdown h2,
+.markdown h3,
+.markdown h4,
+.markdown h5,
+.markdown h6 {
+ margin: 1.6em 0 0.6em 0;
+ clear: both;
+ font-size: 28px;
+.markdown h2 {
+ font-size: 22px;
+.markdown h3 {
+.markdown h4 {
+.markdown h5 {
+ font-size: 12px;
+.markdown hr {
+ height: 1px;
+ border: 0;
+ background: #e9e9e9;
+ margin: 16px 0;
+.markdown p {
+ margin: 1em 0;
+.markdown>p,
+.markdown>blockquote,
+.markdown>.highlight,
+.markdown>ol,
+.markdown>ul {
+ width: 80%;
+.markdown ul>li {
+ list-style: circle;
+.markdown>ul li,
+.markdown blockquote ul>li {
+ margin-left: 20px;
+ padding-left: 4px;
+.markdown>ul li p,
+.markdown>ol li p {
+ margin: 0.6em 0;
+.markdown ol>li {
+ list-style: decimal;
+.markdown>ol li,
+.markdown blockquote ol>li {
+.markdown code {
+ margin: 0 3px;
+ padding: 0 5px;
+ background: #eee;
+ border-radius: 3px;
+.markdown strong,
+.markdown b {
+ font-weight: 600;
+.markdown>table {
+ border-collapse: collapse;
+ border-spacing: 0px;
+ empty-cells: show;
+ border: 1px solid #e9e9e9;
+ width: 95%;
+.markdown>table th {
+ white-space: nowrap;
+.markdown>table th,
+.markdown>table td {
+ padding: 8px 16px;
+ background: #F7F7F7;
+.markdown blockquote {
+ font-size: 90%;
+ color: #999;
+ border-left: 4px solid #e9e9e9;
+ padding-left: 0.8em;
+.markdown blockquote p {
+ margin: 0;
+.markdown .anchor {
+ opacity: 0;
+ transition: opacity 0.3s ease;
+ margin-left: 8px;
+.markdown .waiting {
+ color: #ccc;
+.markdown h1:hover .anchor,
+.markdown h2:hover .anchor,
+.markdown h3:hover .anchor,
+.markdown h4:hover .anchor,
+.markdown h5:hover .anchor,
+.markdown h6:hover .anchor {
+ opacity: 1;
+ display: inline-block;
+.markdown>br,
+.markdown>p>br {
+.hljs {
+ background: white;
+ padding: 0.5em;
+ color: #333333;
+ overflow-x: auto;
+.hljs-comment,
+.hljs-meta {
+ color: #969896;
+.hljs-string,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-strong,
+.hljs-emphasis,
+.hljs-quote {
+ color: #df5000;
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-type {
+ color: #a71d5d;
+.hljs-literal,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-attribute {
+ color: #0086b3;
+.hljs-section,
+.hljs-name {
+ color: #63a35c;
+.hljs-tag {
+.hljs-title,
+.hljs-attr,
+.hljs-selector-id,
+.hljs-selector-class,
+.hljs-selector-attr,
+.hljs-selector-pseudo {
+ color: #795da3;
+.hljs-addition {
+ color: #55a532;
+ background-color: #eaffea;
+.hljs-deletion {
+ color: #bd2c00;
+ background-color: #ffecec;
+.hljs-link {
+ text-decoration: underline;
+/* 代码高亮 */
+/* PrismJS 1.15.0
+https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+code[class*="language-"],
+pre[class*="language-"] {
+ color: black;
+ background: none;
+ text-shadow: 0 1px white;
+ font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+ white-space: pre;
+ word-spacing: normal;
+ word-break: normal;
+ word-wrap: normal;
+ -moz-tab-size: 4;
+ -o-tab-size: 4;
+ tab-size: 4;
+ -webkit-hyphens: none;
+ -moz-hyphens: none;
+ -ms-hyphens: none;
+ hyphens: none;
+pre[class*="language-"]::-moz-selection,
+pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection,
+code[class*="language-"] ::-moz-selection {
+ text-shadow: none;
+ background: #b3d4fc;
+pre[class*="language-"]::selection,
+pre[class*="language-"] ::selection,
+code[class*="language-"]::selection,
+code[class*="language-"] ::selection {
+@media print {
+ code[class*="language-"],
+ pre[class*="language-"] {
+/* Code blocks */
+ padding: 1em;
+ margin: .5em 0;
+:not(pre)>code[class*="language-"],
+ background: #f5f2f0;
+/* Inline code */
+:not(pre)>code[class*="language-"] {
+ padding: .1em;
+ border-radius: .3em;
+ white-space: normal;
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+ color: slategray;
+.token.punctuation {
+.namespace {
+ opacity: .7;
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+ color: #905;
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+ color: #690;
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+ color: #9a6e3a;
+ background: hsla(0, 0%, 100%, .5);
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+ color: #07a;
+.token.function,
+.token.class-name {
+ color: #DD4A68;
+.token.regex,
+.token.important,
+.token.variable {
+ color: #e90;
+.token.bold {
+ font-weight: bold;
+.token.italic {
+ font-style: italic;
+.token.entity {
+ cursor: help;
@@ -0,0 +1,131 @@
+ font-family: "iconfont"; /* Project id 4121381 */
+ src: url('iconfont.woff2?t=1690508543387') format('woff2'),
+ url('iconfont.woff?t=1690508543387') format('woff'),
+ url('iconfont.ttf?t=1690508543387') format('truetype');
+.iconfont {
+ font-family: "iconfont" !important;
+.icon-yanjing_yincang:before {
+ content: "\eb45";
+.icon-yanjing_xianshi:before {
+ content: "\eb46";
+.icon-quxiaorenwu1:before {
+ content: "\100aa";
+.icon-banbengengxinjilu:before {
+ content: "\e6a2";
+.icon-xiazai:before {
+ content: "\e6b7";
+.icon-zanting:before {
+ content: "\e656";
+.icon-zanting1:before {
+ content: "\e629";
+.icon-quxiaorenwu:before {
+ content: "\e61d";
+.icon-bianji:before {
+ content: "\e622";
+.icon-zidongzhihang:before {
+ content: "\e6e3";
+.icon-baocun:before {
+ content: "\e65c";
+.icon-shanchu:before {
+ content: "\e670";
+.icon-shouye:before {
+ content: "\e621";
+.icon-renwujincheng:before {
+ content: "\ec35";
+.icon-fanhui:before {
+ content: "\e6ff";
+.icon-guding:before {
+ content: "\e626";
+.icon-xiahuaxian:before {
+ content: "\e701";
+.icon-arrow121112:before {
+ content: "\e90b";
+.icon-guanbi-:before {
+ content: "\e60b";
+.icon-fujian1:before {
+ content: "\e85a";
+.icon-zhixiang:before {
+ content: "\e601";
+.icon-wodegaoliang:before {
+ content: "\e6e5";
+.icon-zhixiang1:before {
+ content: "\e602";
+.icon-fix:before {
+ content: "\e9b9";
+.icon-tianjialiebiao:before {
+ content: "\e625";
+.icon-bumen:before {
+ content: "\e686";
+.icon-sousuo1:before {
+ content: "\e609";
+.icon-a-24_nor:before {
+ content: "\e611";
+.icon-caozuo:before {
+ content: "\e605";
@@ -0,0 +1,212 @@
+{
+ "id": "4121381",
+ "name": "xiaoshi",
+ "font_family": "iconfont",
+ "css_prefix_text": "icon-",
+ "description": "",
+ "glyphs": [
+ {
+ "icon_id": "5387735",
+ "name": "眼睛_隐藏",
+ "font_class": "yanjing_yincang",
+ "unicode": "eb45",
+ "unicode_decimal": 60229
+ "icon_id": "5387736",
+ "name": "眼睛_显示",
+ "font_class": "yanjing_xianshi",
+ "unicode": "eb46",
+ "unicode_decimal": 60230
+ "icon_id": "27804747",
+ "name": "取消任务",
+ "font_class": "quxiaorenwu1",
+ "unicode": "100aa",
+ "unicode_decimal": 65706
+ "icon_id": "707805",
+ "name": "版本更新记录",
+ "font_class": "banbengengxinjilu",
+ "unicode": "e6a2",
+ "unicode_decimal": 59042
+ "icon_id": "1057009",
+ "name": "下载",
+ "font_class": "xiazai",
+ "unicode": "e6b7",
+ "unicode_decimal": 59063
+ "icon_id": "1111470",
+ "name": "暂停",
+ "font_class": "zanting",
+ "unicode": "e656",
+ "unicode_decimal": 58966
+ "icon_id": "8353894",
+ "font_class": "zanting1",
+ "unicode": "e629",
+ "unicode_decimal": 58921
+ "icon_id": "33846828",
+ "font_class": "quxiaorenwu",
+ "unicode": "e61d",
+ "unicode_decimal": 58909
+ "icon_id": "33987167",
+ "name": "编辑",
+ "font_class": "bianji",
+ "unicode": "e622",
+ "unicode_decimal": 58914
+ "icon_id": "1790443",
+ "name": "自动执行",
+ "font_class": "zidongzhihang",
+ "unicode": "e6e3",
+ "unicode_decimal": 59107
+ "icon_id": "3978372",
+ "name": "保存",
+ "font_class": "baocun",
+ "unicode": "e65c",
+ "unicode_decimal": 58972
+ "icon_id": "6056159",
+ "name": "删除",
+ "font_class": "shanchu",
+ "unicode": "e670",
+ "unicode_decimal": 58992
+ "icon_id": "765433",
+ "name": "历史记录",
+ "font_class": "shouye",
+ "unicode": "e621",
+ "unicode_decimal": 58913
+ "icon_id": "5767874",
+ "name": "任务进程",
+ "font_class": "renwujincheng",
+ "unicode": "ec35",
+ "unicode_decimal": 60469
+ "icon_id": "687392",
+ "name": "返回",
+ "font_class": "fanhui",
+ "unicode": "e6ff",
+ "unicode_decimal": 59135
+ "icon_id": "755543",
+ "name": "固定",
+ "font_class": "guding",
+ "unicode": "e626",
+ "unicode_decimal": 58918
+ "icon_id": "1790513",
+ "name": "下划线",
+ "font_class": "xiahuaxian",
+ "unicode": "e701",
+ "unicode_decimal": 59137
+ "icon_id": "2387391",
+ "name": "上传",
+ "font_class": "arrow121112",
+ "unicode": "e90b",
+ "unicode_decimal": 59659
+ "icon_id": "7312822",
+ "name": "关闭",
+ "font_class": "guanbi-",
+ "unicode": "e60b",
+ "unicode_decimal": 58891
+ "icon_id": "8288905",
+ "name": "附件",
+ "font_class": "fujian1",
+ "unicode": "e85a",
+ "unicode_decimal": 59482
+ "icon_id": "8352735",
+ "name": "指向",
+ "font_class": "zhixiang",
+ "unicode": "e601",
+ "unicode_decimal": 58881
+ "icon_id": "13102581",
+ "name": "我的高亮",
+ "font_class": "wodegaoliang",
+ "unicode": "e6e5",
+ "unicode_decimal": 59109
+ "icon_id": "15855674",
+ "font_class": "zhixiang1",
+ "unicode": "e602",
+ "unicode_decimal": 58882
+ "icon_id": "18170419",
+ "name": "解除固定,图钉",
+ "font_class": "fix",
+ "unicode": "e9b9",
+ "unicode_decimal": 59833
+ "icon_id": "19378122",
+ "name": "添加列表",
+ "font_class": "tianjialiebiao",
+ "unicode": "e625",
+ "unicode_decimal": 58917
+ "icon_id": "21053809",
+ "name": "部门",
+ "font_class": "bumen",
+ "unicode": "e686",
+ "unicode_decimal": 59014
+ "icon_id": "21303015",
+ "name": "搜索",
+ "font_class": "sousuo1",
+ "unicode": "e609",
+ "unicode_decimal": 58889
+ "icon_id": "23008574",
+ "name": "批注",
+ "font_class": "a-24_nor",
+ "unicode": "e611",
+ "unicode_decimal": 58897
+ "icon_id": "13030066",
+ "name": "操作",
+ "font_class": "caozuo",
+ "unicode": "e605",
+ "unicode_decimal": 58885
+ ]
@@ -19,12 +19,24 @@ require('./assets/css/layout.less')
import './icons'
import lodash from 'lodash'
import "@/icons/icon/iconfont.css"
+import "@/icons/icon2/iconfont.css"
import {hasPermission} from './directives/permission';
Vue.prototype.$permission = hasPermission
import directive from './utils/directives'
Vue.use(directive)
+import myRichText from '@/views/components/common/RichText/index'
+Vue.use(myRichText);
+import VueQuillEditor from 'vue-quill-editor'
+import 'quill/dist/quill.core.css'
+import 'quill/dist/quill.snow.css'
+import 'quill/dist/quill.bubble.css'
+Vue.use(VueQuillEditor);
import {reportPermission} from '@/utils/reportPermission'
// import Directives from './directives/index'
// Vue.use(Directives)
@@ -242,6 +242,7 @@ const routes = [
component:() => import('@/views/report/components/addPatentList'),
+ //无效应对
{
path:'/InvalidResponse',
name:'InvalidResponse',
@@ -253,44 +254,44 @@ const routes = [
component:() => import('@/views/report/InvalidResponse/index'),
- path:'/evidenceAndRequest',
- name:'evidenceAndRequest',
+ path:'/invalidIdexRouter',
+ name:'invalidIdexRouter',
meta:{
- title:'无效证据',
+ title:'无效证据和理由',
aside:true,
showHeader:true,
- component:() => import('@/views/report/InvalidResponse/components/evidenceAndRequest'),
+ component:() => import('@/views/report/InvalidResponse/components/invalidIdexRouter.vue'),
- path:'/importPatent',
- name:'importPatent',
+ path:'/evidenceAndRequestIndex',
+ name:'evidenceAndRequestIndex',
- title:'Excel上传',
+ title:'证据详情',
- component:() => import('@/views/report/InvalidResponse/import/index.vue'),
+ component:() => import('@/views/report/InvalidResponse/components/evidenceAndRequestRouter.vue'),
- path:'/invalidIdexRouter',
- name:'invalidIdexRouter',
+ path:'/fileDetails/:id',
+ name:'fileDetails/:id',
- title:'无效证据和理由',
+ title:'证据文献详情',
- component:() => import('@/views/report/InvalidResponse/components/invalidIdexRouter.vue'),
+ component:() => import('@/views/report/InvalidResponse/components/FileDetails/index.vue'),
- path:'/evidenceAndRequestIndex',
- name:'evidenceAndRequestIndex',
+ path:'/RichText',
+ name:'RichText',
- title:'证据详情',
+ title:'富文本',
- component:() => import('@/views/report/InvalidResponse/components/evidenceAndRequestRouter.vue'),
+ component:() => import('@/views/components/common/RichText'),
//产品管理
@@ -8,16 +8,16 @@ export default {
form: {},
patentList: [],
contrastList:[],
- pizhucontrastList:[],
- opinioncontrastList:[],
+ piZhuContrastList:[],
+ opinionContrastList:[],
mutations: {
- SET_PATENT_OPINION_CONTRAST:(state, opinioncontrastList)=>{
- state.opinioncontrastList = opinioncontrastList
+ SET_PATENT_OPINION_CONTRAST:(state, opinionContrastList)=>{
+ state.opinionContrastList = opinionContrastList
- SET_PATENT_PIZHU_CONTRAST:(state, pizhucontrastList)=>{
- state.pizhucontrastList = pizhucontrastList
+ SET_PATENT_PIZHU_CONTRAST:(state, piZhuContrastList)=>{
+ state.piZhuContrastList = piZhuContrastList
SET_PATENT_CONTRAST:(state, contrastList)=>{
state.contrastList = contrastList
@@ -73,4 +73,155 @@ export default {
{ label: 'Courier New', value: 'Courier New' },
{ label: 'Microsoft YaHei', value: 'Microsoft YaHei' },
],
+ * 检索栏位type为1表示中国仅有,2表示世界仅有,3表示两者都包含
+ * dataType为数据格式:1为字符串,2为日期,3为数组
+ searchField:[
+ label:'文本',
+ value:'text',
+ children:[
+ {label: '发明名称/标题', value: 'TI',type:3,dataType:1,placeholder:'请输入发明名称/标题,例:计算机 OR "computer and phone"'},
+ {label: '主权利要求', value: 'CL',type:1,dataType:1,placeholder:'请输入主权利要求,例:加煤系统 OR "computer and phone"'},
+ {label: '关键词', value: 'TX',type:3,dataType:1,placeholder:'请输入关键词,例:石墨烯 OR "computer and phone"'},
+ {label: '摘要', value: 'AB',type:3,dataType:1,placeholder:'请输入摘要或简要说明,例:外喷放热气 OR "computer and phone"'},
+ label:'号码',
+ value:'number',
+ {label: '申请号', value: 'AN',type:3,dataType:1,placeholder:'请输入申请号,例:CN202330275114.7 OR CN202330275114.7'},
+ {label: '原始申请号', value: 'ANO',type:3,dataType:1,placeholder:'请输入原始申请号,例:CN202330275109.6 OR CN202330275109.6'},
+ {label: '公告号', value: 'GN',type:1,dataType:1,placeholder:'请输入公告号,例:CN102860161 OR CN1526554846'},
+ {label: '公开号', value: 'PN',type:3,dataType:1,placeholder:'请输入公开号,例:CN102860161 OR CN1526554846'},
+ {label: '原始公开号', value: 'PNO',type:2,dataType:1,placeholder:'请输入原始公开号,例:CN102860161 OR CN1526554846'},
+ label:'类型及状态',
+ value:'typeAndStatus',
+ {label: '专利类型', value: 'PT',type:1,dataType:3},
+ {label: '法律状态', value: 'LG',type:1,dataType:3},
+ label:'分类',
+ value:'typeNumber',
+ {label: '分类号', value: 'IC',type:3,dataType:1,placeholder:'请输入分类号,例:21-01 OR B61D47/00'},
+ {label: '主分类号', value: 'MC',type:3,dataType:1,placeholder:'请输入分类号,例:21-01 OR B61D47/00'},
+ {label: '优先权号', value: 'PR',type:3,dataType:1,placeholder:'请输入优先权号,例:DEP3833692.8'},
+ {label: '范畴分类', value: 'CT',type:1,dataType:1,placeholder:'请输入范畴分类,例:32D OR 40B'},
+ {label: '欧洲分类', value: 'EC',type:2,dataType:1,placeholder:'请输入欧洲分类号'},
+ label:'日期',
+ value:'date',
+ {label: '申请日', value: 'AD',type:3,dataType:2},
+ {label: '公告日', value: 'GD',type:1,dataType:2},
+ {label: '公开日', value: 'PD',type:3,dataType:2},
+ label:'公司/人',
+ value:'person',
+ {label: '发明人', value: 'IN',type:3,dataType:1,placeholder:'请输入发明人,例:钟丽红'},
+ {label: '第一发明人', value: 'FI',type:3,dataType:1,placeholder:'请输入第一发明人,例:钟丽红'},
+ {label: '申请人', value: 'PA',type:3,dataType:1,placeholder:'请输入申请人,例:钟丽红'},
+ {label: '第一申请人', value: 'FP',type:3,dataType:1,placeholder:'请输入第一申请人,例:钟丽红'},
+ {label: '当前权利人', value: 'PE',type:1,dataType:1,placeholder:'请输入当前权利人,例:钟丽红'},
+ {label: '代理机构代码', value: 'AG',type:1,dataType:1,placeholder:'请输入代理机构代码,例:11223'},
+ {label: '代理人', value: 'AT',type:1,dataType:1,placeholder:'请输入代理人,例:张三'},
+ {label: '代理机构名称', value: 'AGN',type:1,dataType:1,placeholder:'请输入代理机构名称,例:威士博'},
+ label:'地址',
+ {label: '国省代码', value: 'CO',type:3,dataType:1,placeholder:'请输入国省代码,例:94 OR CN'},
+ {label: '发明人国家', value: 'ICO',type:2,dataType:1,placeholder:'请输入发明人国家,例:94 OR CN'},
+ {label: '国家', value: 'GJ',type:3,dataType:3,placeholder:'请输入国家,例:CN'},
+ {label: '申请人地址', value: 'DZ',type:1,dataType:1,placeholder:'请输入申请人地址,例:深圳市南山区'},
+ label:'引用',
+ value:'excerpt',
+ {label: '引用专利', value: 'CC',type:3,dataType:1,placeholder:'请输入引用专利,例:US1743377A,1930.01.14'},
+ {label: '引用非专利', value: 'UCC',type:1,dataType:1,placeholder:'请输入引用非专利'},
+ ],
+ // searchField:[
+ // {label: '申请号', value: 'AN',type:3,dataType:1},
+ // {label: '原始申请号', value: 'ANO',type:3,dataType:1},
+ // {label: '公告号', value: 'GN',type:1,dataType:1},
+ // {label: '公开号', value: 'PN',type:3,dataType:1},
+ // {label: '原始公开号', value: 'PNO',type:2,dataType:1},
+ // {label: '分类号', value: 'IC',type:3,dataType:1},
+ // {label: '主分类号', value: 'MC',type:3,dataType:1},
+ // {label: '优先权号', value: 'PR',type:3,dataType:1},
+ // {label: '发明人', value: 'IN',type:3,dataType:1},
+ // {label: '第一发明人', value: 'FI',type:3,dataType:1},
+ // {label: '申请人', value: 'PA',type:3,dataType:1},
+ // {label: '第一申请人', value: 'FP',type:3,dataType:1},
+ // {label: '当前权利人', value: 'PE',type:1,dataType:1},
+ // {label: '代理机构代码', value: 'AG',type:1,dataType:1},
+ // {label: '代理人', value: 'AT',type:1,dataType:1},
+ // {label: '发明名称/标题', value: 'TI',type:3,dataType:1},
+ // {label: '主权利要求', value: 'CL',type:1,dataType:1},
+ // {label: '申请日', value: 'AD',type:3,dataType:2},
+ // {label: '公告日', value: 'GD',type:1,dataType:2},
+ // {label: '公开日', value: 'PD',type:3,dataType:2},
+ // {label: '范畴分类', value: 'CT',type:1,dataType:1},
+ // {label: '国省代码', value: 'CO',type:3,dataType:1},
+ // {label: '发明人国家', value: 'ICO',type:2,dataType:1},
+ // {label: '国家', value: 'GJ',type:3,dataType:3},
+ // {label: '申请人地址', value: 'DZ',type:1,dataType:1},
+ // {label: '关键词', value: 'TX',type:3,dataType:1},
+ // {label: '摘要', value: 'AB',type:3,dataType:1},
+ // {label: '专利类型', value: 'PT',type:1,dataType:3},
+ // {label: '法律状态', value: 'LG',type:1,dataType:3},
+ // {label: '引用专利', value: 'CC',type:3,dataType:1},
+ // {label: '引用非专利', value: 'UCC',type:1,dataType:1},
+ // {label: '代理机构名称', value: 'AGN',type:1,dataType:1},
+ // {label: '欧洲分类', value: 'EC',type:2,dataType:1},
+ // ],
+ LG:[//法律状态
+ label:'有效',
+ value:1
+ label:'无效',
+ value:2
+ label:'审中',
+ value:3
+ PT:[//专利类型
+ label:'发明',
+ label:'新型',
+ label:'外观',
@@ -11,7 +11,7 @@ const draggable = (el, binding) => {
// 绑定拖拽事件 [绑定拖拽触发元素为弹框头部、拖拽移动元素为整个弹框]
startDrag(el.querySelector('.el-dialog__header'), el.querySelector('.el-dialog'), binding.value);
};
-
+//左右拖动改变宽度大小
const dragControllerDiv=(el, binding)=>{
var resize = el.children[1];
var left =el.children[0];
@@ -135,6 +135,7 @@ const dragControllerDiv1=(el,binding)=>{
return false;
+//上下拖动改变高度大小
const dragControllerDiv2=(el,binding)=> {
var resize1 = el.children[1];
// var resize2 = el.children[1];
@@ -169,7 +170,6 @@ const dragControllerDiv2=(el,binding)=> {
// resize1[i].top = resize1[i].offsetTop;
// 鼠标拖动事件
document.onmousemove = function (e) {
var endX = e.clientY;
var moveLen = resize1.top + (endX - startX); // (endx-startx)=移动的距离。resize[i].left+移动的距离=左边区域最后的宽度
var maxT = boxClientHeight- resize1.offsetHeight; // 容器宽度 - 左边区域的宽度 = 右边区域的宽度
@@ -17,8 +17,8 @@
<el-header class="patent-articles-title">
<div class="patent-articles-title-box">
<div style="position:relative">
- <img src="@/assets/visual/fixed.png" width="20px" height="20px" v-if="fix===true" @click="qx" style="position:absolute;top:5px;left:5px"/>
- <img src="@/assets/visual/unfixed.png" width="20px" height="20px" v-if="fix===false" @click="gd" style="position:absolute;top:5px;left:5px"/>
+ <img src="@/assets/visual/fixed.png" width="20px" height="20px" v-if="fix===true && !showEvidence" @click="qx" style="position:absolute;top:5px;left:5px"/>
+ <img src="@/assets/visual/unfixed.png" width="20px" height="20px" v-if="fix===false && !showEvidence" @click="gd" style="position:absolute;top:5px;left:5px"/>
<!-- <div>
<patent-list :patent-id="patentId" :project-id="projectId" @on-change="onChange" />
</div> -->
@@ -151,7 +151,7 @@ export default {
PatentWorth,
PatentMark
- props:['patentMessage','publicNo','signPatentNo','reportId','type','isTrue',"taskId","patentStatus2A"],
+ props:['patentMessage','publicNo','signPatentNo','reportId','type','isTrue',"taskId","patentStatus2A",'showEvidence'],
// props: {
// 'patentMessage':String,
// 'publicNo':String,
@@ -266,7 +266,9 @@ export default {
publicNo(val) {
// console.log(val);
- this.getPatent(val)
+ if (this.fix != true) {
+ this.getPatent(val)
patentMessage(val, oldval) {
if (val) {
@@ -29,15 +29,15 @@ export default {
// contrastList() {
// return this.$store.state.report.contrastList
// },
- pizhucontrastList() {
- return this.$store.state.report.pizhucontrastList
+ piZhuContrastList() {
+ return this.$store.state.report.piZhuContrastList
watch: {
// 'contrastList'(val) {
// this.getPatentMark()
- 'pizhucontrastList'(val) {
+ 'piZhuContrastList'(val) {
this.getPatentMark()
patentNo(val) {
@@ -52,7 +52,7 @@ export default {
this.$nextTick(() => {
this.patentMark=[]
var a = ['摘要', '权利要求', '说明书']
- var b = this.pizhucontrastList.filter(item => {
+ var b = this.piZhuContrastList.filter(item => {
return item.patentNo == this.patentNo
})
/**方案一 */
@@ -97,7 +97,10 @@ export default {
runTo(val) {
- this.$emit('biaozhu',val)
+ var a = JSON.parse(JSON.stringify(val))
+ a.id = 'p'+a.id
+ this.$emit('biaozhu',a)
@@ -724,8 +724,8 @@ export const addContrast = {
contrastList() {
return this.$store.state.report.contrastList
- opinioncontrastList() {
- return this.$store.state.report.opinioncontrastList
+ opinionContrastList() {
+ return this.$store.state.report.opinionContrastList
@@ -743,7 +743,7 @@ export const addContrast = {
window.selectMark = this.selectMark
window.addDuiBi = this.addDuiBi
// window.addStateOpinion = this.addStateOpinion
- console.log(this.reportType,this.taskId);
+ // console.log(this.reportType,this.taskId);
// 划词点击添加陈述意见
@@ -763,9 +763,10 @@ export const addContrast = {
//点击图标回显数据
- selectMark(Id, selectType) {
- if (selectType==0) {
- var index = this.pizhucontrastList.findIndex(item => {
+ selectMark(id, selectType) {
+ var Id = id.substring(1,id.length)
+ if (selectType=='p') {
+ var index = this.piZhuContrastList.findIndex(item => {
if (item.id == Id) {
// 清空currentSelectObj,否则Id与id同时存在
this.currentSelectObj = {}
@@ -778,13 +779,13 @@ export const addContrast = {
if (index != -1) {
this.showPizhu()
- } else if (selectType == 1) {
+ } else if (selectType == 'c') {
let a=this.contrastList.find(item => {
return item.id==Id
this.$emit('openContrast', a)
- } else if (selectType == 2) {
- let a=this.opinioncontrastList.find(item => {
+ } else if (selectType == 'o') {
+ let a=this.opinionContrastList.find(item => {
this.$emit('openOpinioncontrast', a)
@@ -841,6 +842,7 @@ export const addContrast = {
a.signPatentNo = this.signPatentNo
a.reportType = this.reportType ?this.reportType:this.type
a.taskId = this.taskId
+ a.rightPosition = this.currentSelectObj.rightPosition
this.$store.commit("SET_PATENT_INDEX", a)
@@ -913,18 +915,21 @@ export const addContrast = {
var rightSort = null
if (this.reportType == 7 && temNode.getAttribute("data-type").includes('权利要求')) {
+ var node1 = null
getRightSort(a)
function getRightSort(node) {
if (node.getAttribute("right-sort") != null) {
rightSort = node.getAttribute("right-sort")
+ node1 = node
} else {
getAttribute(node.parentElement);
+ var rightPosition = this.getColumn(node1, selectObj)
this.getColumn(temNode, selectObj);
this.isFirst = true
- return { "Id": this.uuid(), "column": temNode.getAttribute("data-type"), "index": this.anchorOffset, "text": selectObj.toString(), 'temNode': temNode.innerHTML,'rightSort':rightSort };
+ return { "Id": this.uuid(), "column": temNode.getAttribute("data-type"), "index": this.anchorOffset, "text": selectObj.toString(), 'temNode': temNode.innerHTML,'rightSort':rightSort,'rightPosition':rightPosition };
getColumn(node, selectObj) {
var baseNode = this.getColumnNode(node);
@@ -932,7 +937,7 @@ export const addContrast = {
var focusNodePosition = this.getPosition(baseNode, selectObj.focusNode, selectObj.focusOffset);
var num = Math.min(anchorNodePosition, focusNodePosition)
this.anchorOffset = num
- return true;
+ return num;
getColumnNode(node) {
//获取节点所在的栏位节点
@@ -7,7 +7,7 @@
</el-tooltip>
</div>
<div style="background:white;display:flex; justify-content:flex-end;align-items: center;height: 50px;" >
- <el-button v-if="type==7" type="primary" size="small" @click="checkInvalid" style="margin-right:10px;height:32px;"> 查看无效请求书 </el-button>
+ <el-button v-if="type==7" type="primary" size="small" @click="checkInvalid" style="margin-right:10px;height:32px;"> 查看无效请求书/标的专利 </el-button>
<el-button v-if="type==7" type="primary" size="small" @click="addOpinion" style="margin-right:10px;height:32px;"> 添加陈述意见 </el-button>
<el-button type="primary" size="small" v-if="type!=3 && type!=7" @click="checkResult" style="margin-right:10px;height:32px;"> 查看结果 </el-button>
<!-- <el-popover placement="bottom" title="关键词高亮" width="320" trigger="click" >
@@ -34,8 +34,13 @@
<div class="box" ref="box" v-dragControllerDiv>
<div class="left" v-show="width!='100%'" :style="{width:width}"><!--左侧div内容-->
- <contrast-index v-if="signPatentNo" :evidenceFlieId="evidenceFlieId" :reportType="reportType" :publicNo="signPatentNo" :signPatentNo="signPatentNo" @getVisible="getVisible" :type="type" :reportId="reportId" :isTrue="isTrue" @openContrast='openContrast' :taskId="taskId" @patentStatusEmit="patentStatusEmit" :patentStatus2A="patentStatus2A"/>
- <contrast-index v-else :patentMessage="message" :reportType="reportType" :publicNo="pNo" @on-change='changefix' @getVisible="getVisible" :type="type" :reportId="reportId" :isTrue="isTrue" @openContrast='openContrast' :taskId="taskId" @patentStatusEmit="patentStatusEmit" :patentStatus2A="patentStatus2A"/>
+ <div v-if="type != 7">
+ <contrast-index v-if="signPatentNo" :evidenceFlieId="evidenceFlieId" :reportType="reportType" :publicNo="signPatentNo" :signPatentNo="signPatentNo" @getVisible="getVisible" :type="type" :reportId="reportId" :isTrue="isTrue" @openContrast='openContrast' :taskId="taskId" @patentStatusEmit="patentStatusEmit" :patentStatus2A="patentStatus2A"/>
+ <contrast-index v-else :patentMessage="message" :reportType="reportType" :publicNo="pNo" @on-change='changefix' @getVisible="getVisible" :type="type" :reportId="reportId" :isTrue="isTrue" @openContrast='openContrast' :taskId="taskId" @patentStatusEmit="patentStatusEmit" :patentStatus2A="patentStatus2A"/>
+ </div>
+ <div v-else>
+ <FileDetails :reportType="reportType" :evidenceFlieId="evidenceFlieId" @on-change='changefix'></FileDetails>
<div class="resize" title="收缩侧边栏" v-show="width!='100%'"><span>⋮</span></div>
<div class="mid" :style="{width:width}"><!--右侧div内容-->
@@ -141,9 +146,9 @@
<el-dialog :title="ruleForm.id?'编辑对比':'添加对比'" v-draggable :visible.sync="visible" width="1000px" :before-close="close">
<el-form :model="ruleForm" ref="ruleForm" label-width="100px" label-position="left">
- <el-form-item label="选择颜色" class="item">
+ <!-- <el-form-item label="选择颜色" class="item">
<el-input type="color" v-model="ruleForm.color" style="user-select:none;width: 100px;" @input="changeColor()"/>
- </el-form-item>
+ </el-form-item> -->
<el-form-item label="选中文本" class="item">
<el-input v-model="ruleForm.content" placeholder="请输入备注" type="textarea" show-word-limit></el-input>
</el-form-item>
@@ -237,6 +242,8 @@ import { splitScreen } from '../common/SplitScreen'
import checkFile from '@/views/report/InvalidResponse/components/checkFile.vue'
import AddOpinion from '@/views/report/InvalidResponse/components/addOpinion.vue'
+import FileDetails from '@/views/report/InvalidResponse/components/FileDetails/fileDetails.vue'
mixins: [patentKeywordsHighlight, changeTranslation,splitScreen],
props:['patentNo','taskId1','location','state'],
@@ -267,7 +274,7 @@ export default {
PatentMark,
checkFile,
AddOpinion,
+ FileDetails
data() {
return {
@@ -402,7 +409,7 @@ export default {
computed: {
piZhuContrastList() {
created() {
@@ -530,8 +537,11 @@ export default {
- //查看无效请求书
+ //查看无效请求书/标的专利
checkInvalid(){
+ return false
this.FileVisible = true
document.querySelectorAll('.checkFile')[0].parentNode.classList.add('checkFile1')
@@ -574,7 +584,6 @@ export default {
// 划词陈述意见
openOpinioncontrast(val) {
- console.log(val);
var form = {}
form=val
form.reportId=this.reportId
@@ -0,0 +1,8 @@
+import RichText from './index.vue'
+const myRichText = {
+ install: function(Vue) {
+ // 注册并获取组件,然后在main.js中引用,在Vue.use()就可以了
+ Vue.component('myRichText', RichText)
+export default myRichText
@@ -0,0 +1,207 @@
+<template>
+ <div class="boxs">
+ <!-- <el-upload
+ class="avatar-uploader"
+ name="file"
+ action=""
+ :show-file-list="false"
+ :data="uploadData"
+ :http-request="uploadHttpRequest"
+ >
+ </el-upload> -->
+ <quill-editor v-model="content" ref="myQuillEditor" :options="editorOption" @blur="saveHtml" @change="saveHtml1" @focus="getFocus"></quill-editor>
+ <!-- 富文本内容 -->
+</template>
+<script>
+ import { quillEditor } from "vue-quill-editor";
+ import ImageBlot from './reviewClass'
+ // 工具栏配置
+// const toolbarOptions = [
+// ["bold", "italic", "underline", "strike"], // 加粗 斜体 下划线 删除线
+// ["blockquote", "code-block"], // 引用 代码块
+// [{ header: 1 }, { header: 2 }], // 1、2 级标题
+// [{ list: "ordered" }, { list: "bullet" }], // 有序、无序列表
+// [{ script: "sub" }, { script: "super" }], // 上标/下标
+// [{ indent: "-1" }, { indent: "+1" }], // 缩进
+// // [{'direction': 'rtl'}], // 文本方向
+// [{ size: ["small", false, "large", "huge"] }], // 字体大小
+// [{ header: [1, 2, 3, 4, 5, 6, false] }], // 标题
+// [{ color: [] }, { background: [] }], // 字体颜色、字体背景颜色
+// [{ font: [] }], // 字体种类
+// [{ align: [] }], // 对齐方式
+// ["clean"], // 清除文本格式
+// ["link", "image", "video"], // 链接、图片、视频
+// ];
+ export default {
+ props:{
+ value:{
+ type:String,
+ default:(value)=>{
+ if(!value){
+ return ""
+ placeholder:{
+ default:()=>{
+ return "请输入"
+ filed:{
+ return ''
+ keys:{
+ const len = 6
+ const codeList = []
+ const chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz0123456789'
+ const charsLen = chars.length
+ for (let i = 0; i < len; i++) {
+ codeList.push(chars.charAt(Math.floor(Math.random() * charsLen)))
+ return codeList.join('')
+ data() {
+ return {
+ uploadData: {}, // 图片文件
+ content: this.value||"", // 内容
+ // content: null,
+ editorOption: {
+ placeholder: this.placeholder,
+ key:this.keys,
+ // modules: {
+ // toolbar: {
+ // container: toolbarOptions,
+ // handlers: {
+ // image: function (value) {
+ // if (value) {
+ // // 触发input框选择图片文件
+ // document.querySelector(".avatar-uploader input").click();
+ // } else {
+ // this.quill.format("image", false);
+ // }
+ };
+ watch:{
+ value(val){
+ var a = this.content.replace(/<p>|<\/p>/g,'')
+ if(a!=val){
+ this.content = val
+ computed:{
+ quill(){
+ return this.$refs.myQuillEditor.quill
+ mounted() {
+ // let quill = this.$refs.myQuillEditor.quill
+ // this.quill.enable(false)
+ // this.$nextTick(()=>{
+ this.quill.enable(true)
+ // })
+ this.$forceUpdate()
+ this.quill.root.addEventListener('paste', evt => {
+ if (evt.clipboardData && evt.clipboardData.files && evt.clipboardData.files.length) {
+ evt.preventDefault();
+ [].forEach.call(evt.clipboardData.files,async file => {
+ if (!file.type.match(/^image\/(gif|jpe?g|a?png|bmp)/i)) {
+ return
+ // 获取光标所在位置
+ let length = this.quill.selection.savedRange.index
+ var str = await this.fileToBase64(file)
+ this.quill.insertEmbed(length, 'image',{
+ url:str,
+ width:'',
+ height:'',
+ style:'width:80px;height: 80px;border: 1px solid #f9f6f675;vertical-align:middle'
+ })
+ this.quill.setSelection(length + 2)
+ }, false)
+ methods: {
+ // 将file文件上传转化为base64进行显示
+ fileToBase64(file) {
+ return new Promise((resolve, reject) => {
+ ///FileReader类就是专门用来读文件的
+ const reader = new FileReader()
+ //开始读文件
+ reader.readAsDataURL(file)
+ reader.onload = () => resolve(reader.result)
+ // 失败返回失败的信息
+ reader.onerror = error => reject(error)
+ //失去焦点
+ saveHtml(event) {
+ // console.log("this.content", this.content);
+ // this.content = this.content.replace(/<p>|<\/p>/g,'')
+ // this.$emit('input',this.content)
+ // this.quill.enable(true)
+ // this.$emit('value',{
+ // filed:this.filed,
+ // content:this.content
+ //值变化
+ saveHtml1(event) {
+ this.$emit('input',a)
+ getFocus(){
+</script>
+<style lang="scss">
+ .boxs {
+ /* line-height: normal !important;
+ height: 500px;
+ width: 700px;
+ margin: 20px auto; */
+ .ql-toolbar{
+ .quill-editor{
+ border:1px solid #dcdfe6;
+ border-radius: 5px;
+ .ql-container
+ border:0;
+ .ql-editor{
+ display: flex;
+ align-items: end;
+ .ql-editor.ql-blank::before {
+</style>
@@ -0,0 +1,6 @@
+export const RichText1 ={
+ components:{
+ RichText
@@ -0,0 +1,40 @@
+import {Quill} from 'vue-quill-editor'
+const BlockEmbed = Quill.import('blots/block/embed')
+// 添加插入图片
+class ImageBlot extends BlockEmbed {
+ static create(value) {
+ const node = super.create(value)
+ node.setAttribute('src', value.url)
+ // node.setAttribute('title', value.name)
+ // node.setAttribute('controls', value.controls)
+ // node.setAttribute('controlslist', value.controlslist)
+ node.setAttribute('width', value.width)
+ node.setAttribute('height', value.height)
+ node.setAttribute('webkit-playsinline', true)
+ node.setAttribute('playsinline', true)
+ node.setAttribute('x5-playsinline', true)
+ node.setAttribute('style', value.style)
+ // if (value.autoplay) {
+ // node.setAttribute('autoplay', value.autoplay)
+ return node
+ static value(node) {
+ url: node.getAttribute('src'), // 注意这里和上面的属性和值反过来相对
+ // name: node.getAttribute('title'),
+ // autoplay: node.getAttribute('autoplay'),
+ // controls: node.getAttribute('controls'),
+ // controlslist: node.getAttribute('controlslist'),
+ width: node.getAttribute('width'),
+ height: node.getAttribute('height'),
+ style: node.getAttribute('style')
+ImageBlot.blotName = 'image' //quill使用时的名称
+ImageBlot.tagName = 'img' //定义的html标签名
+Quill.register(ImageBlot) // 注册
@@ -37,7 +37,7 @@ export const splitScreen = {
mounted() {
this.$nextTick(()=>{
- this.$set(this,'height',document.getElementsByClassName('patent-articles-content-left')[0].offsetHeight +20 + 'px')
+ this.$set(this,'height',document.getElementsByClassName('el-main')[0].offsetHeight-200 + 'px')
this.height2 = this.height
@@ -56,7 +56,7 @@ export const splitScreen = {
switch(val){
case 1://tab展示
dom[0].style.flexDirection = ''
- this.height = (height) + 'px'
+ this.height = document.getElementsByClassName('el-main')[0].offsetHeight-200 + 'px'
left1[0].style.width = '100%'
@@ -129,10 +129,10 @@ export const splitScreen1 = {
if (document.getElementsByClassName('patent-articles-content-left').length>0) {
- this.$set(this,'height',document.getElementsByClassName('patent-articles-content-left')[0].offsetHeight+20 + 'px')
if(this.height == '20px'){
- this.$set(this,'height',document.getElementsByClassName('patent-articles-content-left1')[0].offsetHeight+20 + 'px')
@@ -152,7 +152,7 @@ export const splitScreen1 = {
// this.$nextTick(()=>{
// left1[0].style.width = '100%'
// })
@@ -0,0 +1,196 @@
+export const changeWidth={
+ // this.dragControllerDiv()
+ dragControllerDiv:function() {
+ var resize = document.getElementsByClassName('resize');
+ var left = document.getElementsByClassName('left');
+ var mid = document.getElementsByClassName('mid');
+ var box = document.getElementsByClassName('box');
+ for (let i = 0; i < resize.length; i++) {
+ // 鼠标按下事件
+ resize[i].onmousedown = function (e) {
+ //颜色改变提醒
+ resize[i].style.background = '#818181';
+ var startX = e.clientX;
+ resize[i].left = resize[i].offsetLeft;
+ // 鼠标拖动事件
+ document.onmousemove = function (e) {
+ var endX = e.clientX;
+ var moveLen = resize[i].left + (endX - startX); // (endx-startx)=移动的距离。resize[i].left+移动的距离=左边区域最后的宽度
+ var maxT = box[i].clientWidth - resize[i].offsetWidth; // 容器宽度 - 左边区域的宽度 = 右边区域的宽度
+ if (moveLen < 32) moveLen = 32; // 左边区域的最小宽度为32px
+ if (moveLen > maxT - 150) moveLen = maxT - 150; //右边区域最小宽度为150px
+ resize[i].style.left = moveLen; // 设置左侧区域的宽度
+ for (let j = 0; j < left.length; j++) {
+ left[j].style.width = moveLen + 'px';
+ if(mid[j]){
+ mid[j].style.width = (box[i].clientWidth - moveLen - 10) + 'px';
+ // 鼠标松开事件
+ document.onmouseup = function (evt) {
+ //颜色恢复
+ resize[i].style.background = '#d6d6d6';
+ document.onmousemove = null;
+ document.onmouseup = null;
+ resize[i].releaseCapture && resize[i].releaseCapture(); //当你不在需要继续获得鼠标消息就要应该调用ReleaseCapture()释放掉
+ resize[i].setCapture && resize[i].setCapture(); //该函数在属于当前线程的指定窗口里设置鼠标捕获
+ return false;
+ dragControllerDiv1:function() {
+ var resize1 = document.getElementsByClassName('resize1');
+ var left = document.getElementsByClassName('left1');
+ var mid = document.getElementsByClassName('mid1');
+ var box = document.getElementsByClassName('box1');
+ for (let i = 0; i < resize1.length; i++) {
+ resize1[i].onmousedown = function (e) {
+ resize1[i].style.background = '#818181';
+ resize1[i].left = resize1[i].offsetLeft-50;
+ var flex = box[i].style.flexDirection
+ var moveLen = resize1[i].left + (endX - startX); // (endx-startx)=移动的距离。resize[i].left+移动的距离=左边区域最后的宽度
+ var maxT = box[i].clientWidth - resize1[i].offsetWidth; // 容器宽度 - 左边区域的宽度 = 右边区域的宽度
+ resize1[i].style.left = moveLen; // 设置左侧区域的宽度
+ switch (flex) {
+ case 'row-reverse':
+ mid[j].style.width = moveLen + 'px';
+ if(left[j]){
+ left[j].style.width = (box[i].clientWidth - moveLen - 10) + 'px';
+ break;
+ case 'row':
+ case 'column-reverse':
+ case 'column':
+ default:
+ resize1[i].style.background = '#d6d6d6';
+ resize1[i].releaseCapture && resize1[i].releaseCapture(); //当你不在需要继续获得鼠标消息就要应该调用ReleaseCapture()释放掉
+ resize1[i].setCapture && resize1[i].setCapture(); //该函数在属于当前线程的指定窗口里设置鼠标捕获
+ dragControllerDiv2:function() {
+ var resize1 = document.getElementsByClassName('resize2');
+ resize1[i].top = mid[i].offsetHeight;
+ resize1[i].top = left[i].offsetHeight;
+ var startX = e.clientY;
+ // resize1[i].top = resize1[i].offsetTop;
+ var endX = e.clientY;
+ var moveLen = resize1[i].top + (endX - startX); // (endx-startx)=移动的距离。resize[i].left+移动的距离=左边区域最后的宽度
+ var maxT = box[i].clientHeight - resize1[i].offsetHeight; // 容器宽度 - 左边区域的宽度 = 右边区域的宽度
+ if (moveLen < 150) moveLen = 150; // 左边区域的最小宽度为32px
+ resize1[i].style.top = moveLen; // 设置左侧区域的宽度
+ mid[j].style.height = moveLen + 10 + 'px';
+ left[j].style.height = (box[i].clientHeight - moveLen ) + 'px';
+ left[j].style.height = moveLen + 10 + 'px';
+ mid[j].style.height = (box[i].clientHeight - moveLen ) + 'px';
@@ -0,0 +1,357 @@
+export const cron = {
+ //生成cron表达式
+ getCron(type) {
+ if(type){
+ var cron = ''
+ if(type == "day"){
+ let m = "";
+ let s = "";
+ let h = "";
+ let date = new Date();
+ if (date) {
+ h = date.getHours();
+ m = date.getMinutes();
+ s = date.getSeconds();
+ this.$set(this,'value',h+':'+m+':'+s)
+ cron = s + " " + m + " " + h + " * * ? *";
+ }else if (type == "week") { //星期
+ var value1 = ''
+ var week = new Date().getDay()
+ // 编辑回显后再次转义
+ switch (week) {
+ case 0:
+ value1 = "1";
+ case 1:
+ value1 = "2";
+ case 2:
+ value1 = "3";
+ case 3:
+ value1 = "4";
+ case 4:
+ value1 = "5";
+ case 5:
+ value1 = "6";
+ case 6:
+ value1 = "7";
+ var en2cnMap = {
+ 1: "周日",
+ 2: "周一",
+ 3: "周二",
+ 4: "周三",
+ 5: "周四",
+ 6: "周五",
+ 7: "周六",
+ this.$set(this,'day',en2cnMap[value1])
+ this.$set(this, 'time', (h < 10 ? ("0" + h) : h )+ ':' + (m < 10 ? ("0" + m) : m) + ':' + (s < 10 ? ("0" + s) : s))
+ this.$set(this, 'value', this.day + " " + this.time)
+ cron = s + " " + m + " " + h + " ? * " + value1 + " *";
+ //周cron表达式
+ } else if (type == "month") {//每月的几号
+ let mo = "";
+ var date = new Date();
+ mo = date.getDate()
+ this.$set(this,'day',mo+'日')
+ this.$set(this,'value',this.day+" "+this.time)
+ cron = s + " " + m + " " + h + " " + mo + " * ? *"
+ } else if (type == "year") {//指定年月日
+ let year = "";
+ let month = "";
+ let day = "";
+ //指定时间
+ year = date.getFullYear();
+ month =date.getMonth() + 1
+ day = date.getDate()
+ this.$set(this,'value',date)
+ cron =
+ s +
+ " " +
+ m +
+ h +
+ day +
+ month +
+ "?" +
+ "*";
+ return cron
+ if(this.type == "day"){//天
+ let date = this.value;
+ date= date.split(':')
+ h = date[0];
+ m = date[1];
+ s = date[2];
+ }else if (this.type == "week") { //星期
+ var day = this.day || "";
+ switch (day) {
+ case "周日":
+ day = "1";
+ case "周一":
+ day = "2";
+ case "周二":
+ day = "3";
+ case "周三":
+ day = "4";
+ case "周四":
+ day = "5";
+ case "周五":
+ day = "6";
+ case "周六":
+ day = "7";
+ let date = this.time;
+ cron = s + " " + m + " " + h + " ? * " + day + " *";
+ } else if (this.type == "month") {//每月的几号
+ let mo = this.day.match(/\d+/) || "";
+ cron = s + " " + m + " " + h + " " + mo + " * ? *";
+ } else if (this.type == "year") {//指定年月日
+ var date = this.value;
+ date = new Date(date);
+ month = date.getMonth() + 1
+ //反编译cron
+ cronChangeDate(str) {
+ var toDate = {};
+ if (!str) {
+ return;
+ } else {
+ var result = str.split(" ").join("");
+ var nArr = str.split(" ");
+ var countData = this.getPlaceholderCount(result);
+ var str1 = "";
+ str1 = result.split("").reverse().join("").substring(3, 4);
+ if (countData.count1 && str1 == "?") {
+ toDate.loopType = "周循环";
+ var keys = nArr[5];
+ var cnKeys = keys.split(",").map(function (key, idx) {
+ return en2cnMap[key];
+ });
+ toDate.loopValue = cnKeys.join(",");
+ } else if (countData.count1 + countData.count2 === 3) {
+ toDate.loopType = "月循环";
+ var mot = [];
+ var mkeys = nArr[3].split(",");
+ for (var i = 0; i < mkeys.length; i++) {
+ let mo = mkeys[i];
+ mot.push(mo);
+ toDate.loopValue = mot.join(",");
+ if (this.type == "year") {
+ toDate.loopTime =
+ nArr[6] +
+ "-" +
+ nArr[4] +
+ nArr[3] +
+ nArr[2] +
+ ":" +
+ nArr[1] +
+ nArr[0];
+ 2020 +
+ 10 +
+ var date = toDate.loopTime;
+ date = date.substring(0, 19);
+ date = date.replace(/-/g, "/");
+ var timestamp = new Date(date);
+ if (toDate.loopType == "周循环") {
+ // this.time = date;
+ // this.day = toDate.loopValue;
+ date = date.split(' ')[1].split(":")
+ var h = date[0];
+ var m = date[1];
+ var s = date[2];
+ this.$set(this, 'day', toDate.loopValue)
+ } else if (toDate.loopType == "月循环") {
+ // this.day = toDate.loopValue + '日';
+ // this.$set(this,'time',date)
+ this.$set(this, 'day', toDate.loopValue + '日')
+ // this.value = date;
+ return toDate;
+ // 根据cron表达式获取更新周期
+ getType(str){
+ if(!str){
+ return "";
+ var type = ''
+ type = 'week'
+ type = 'month'
+ } else if(countData.count1 && str1 == "*") {
+ type = 'day'
+ }else{
+ type = 'year'
+ return type
+ // 统计字符串中包含某个字符的个数
+ getPlaceholderCount(strSource) {
+ var count1 = 0;
+ var count2 = 0;
+ strSource.replace(/\*|\?/g, function (m, i) {
+ if (m === "?") {
+ count1++;
+ } else if (m === "*") {
+ count2++;
+ var obj = {};
+ obj.count1 = count1;
+ obj.count2 = count2;
+ return obj;
@@ -0,0 +1,421 @@
+ <div style="padding:10px">
+ <!-- 表单检索 -->
+ <div>
+ <div class="content_border">
+ <div v-for="(items,i) in list" :key="i" class="content">
+ <!-- <el-row :gutter="24"> -->
+ <!-- 逻辑符 -->
+ <!-- <el-col :span="5"> -->
+ <span style="width:150px">
+ <span v-if="i==0" style="opacity: 0;"> 内容 </span>
+ <el-select v-else v-model="list[i].logical" size='small' width='100%' >
+ <el-option
+ v-for="item in logical"
+ :key="item[logicalProps.value]"
+ :label="item[logicalProps.value]"
+ :value="item[logicalProps.value]">
+ </el-option>
+ </el-select>
+ </span>
+ <!-- </el-col> -->
+ <!-- 搜索条件 -->
+ <!-- <el-col :span="7"> -->
+ <!-- <el-select v-model="list[i].field" @change="change(list[i])" filterable size='small' style="width:250px" :title="getTitle(list[i].field)">
+ v-for="item in field"
+ :key="item[fieldProps.value]"
+ :label="item[fieldProps.label]+'('+item[fieldProps.value]+')'"
+ :value="item[fieldProps.value]">
+ </el-select> -->
+ <el-cascader :options="field" v-model="list[i].field" :props="deftProps" filterable size='small' @change="change(list[i])" style="width:250px" :title="getTitle(list[i].field)" :show-all-levels="false"></el-cascader>
+ <!-- 运算符 -->
+ <!-- <el-col :span="3" style="padding:0"> -->
+ <el-select v-model="list[i].operator" size='small' style="width:150px">
+ v-for="item in operator"
+ :key="item[operatorProps.value]"
+ :label="item[operatorProps.label]"
+ :value="item[operatorProps.value]">
+ <!-- 搜索值 -->
+ <!-- <el-col :span="9"> -->
+ <div style="width:100%">
+ <div v-if="list[i].dataType==2" style="display:flex;width:100%">
+ <el-date-picker
+ v-model="list[i].value[0]"
+ style="width:50%"
+ type="date"
+ size='small'
+ value-format="yyyyMMdd"
+ placeholder="开始,例:20000101">
+ </el-date-picker>
+ v-model="list[i].value[1]"
+ placeholder="结束,例:20001231">
+ <div v-else-if="list[i].dataType==3" style="width:100%">
+ <el-select v-model="list[i].value" size="small" multiple filterable collapse-tags placeholder="请选择,可多选" style="width:100%">
+ v-for="item in constants[list[i].field]"
+ :key="item.value"
+ :label="item.label"
+ :value="item.value">
+ <div v-else style="width:100%"><el-input size='small' style="width:100%" v-model="list[i].value" :placeholder="list[i].placeholder"></el-input> </div>
+ <!-- </el-row> -->
+ <div style="width:50px">
+ <span v-if="list.length==1" style="opacity: 0;"> 内容 </span>
+ <el-button v-else size="small" @click="deleteList(i)"><i class="el-icon-delete"></i></el-button>
+ <div class="button_group">
+ <el-button size="small" type="primary" @click="add">增加</el-button>
+ <el-button size="small" type="primary" @click="search2">检索</el-button>
+ <el-button size="small" @click="reset">重置</el-button>
+ <!-- <el-button size="small" @click="createSearch" v-if="searchValue">生成检索式</el-button> -->
+ <!-- 检索式检索 -->
+ <div v-if="searchValue">
+ <p><b>检索式检索</b><span style="margin-left:10px">[例: TI=(计算机) ]</span></p>
+ <el-input type="textarea" :rows="4" v-model="searchStr"></el-input>
+ <!-- <div class="button_group">
+ </div> -->
+export default {
+ //逻辑符
+ logical:{
+ type:Array,
+ default: ()=>{ return [
+ label:'并且',
+ value:'&&'
+ label:'或者',
+ value:'||'
+ ] }
+ //逻辑符配置
+ logicalProps:{
+ type:Object,
+ label:'label',
+ value:'value',
+ //运算符
+ operator:{
+ label:'=',
+ value:'='
+ label:'>',
+ value:'>'
+ label:'<',
+ value:'<'
+ //运算符配置
+ operatorProps:{
+ //搜索值
+ field:{
+ default: ()=>{ return [] }
+ //搜索值配置
+ fieldProps:{
+ //是否展示检索式
+ searchValue:{
+ type:Boolean,
+ return true
+ //默认值
+ list:{
+ return []
+ // list:[],
+ searchStr:'',
+ constants:this.$constants,
+ deftProps:{
+ emitPath:false
+ filedList:[]
+ // 'list'(){
+ // this.createSearch()
+ list: {
+ handler(val) {
+ this.createSearch()
+ deep: true,// 深度监听
+ this.filedList =[].concat(...this.field.map(item=>{return item.children}))
+ this.rule()
+ change(list){
+ var a = this.filedList.find(item=>{
+ return item.value == list.field
+ list.dataType = a.dataType
+ list.placeholder = a.placeholder
+ if(list.dataType==2 || list.dataType==3){
+ this.$set(list,'value', [])
+ this.$set(list,'value', '')
+ //校验
+ rule(){
+ if(this.list.length>=2 && this.list.length % 2 == 0){
+ this.list.push({
+ logical:this.logical.length>0?this.logical[0][this.logicalProps.value]:'',
+ // field:this.field.length>0?this.field[0][this.fieldProps.value]:'',
+ field:'PN',
+ placeholder:'请输入公开号,例:CN102860161 OR CN1526554846',
+ operator:this.operator.length>0?this.operator[0][this.operatorProps.value]:'',
+ // this.rule()
+ //增加
+ add(){
+ // {
+ // logical:this.logical.length>0?this.logical[0][this.logicalProps.value]:'',
+ // operator:this.operator.length>0?this.operator[0][this.operatorProps.value]:''
+ )
+ //鼠标悬浮文字提示
+ getTitle(val){
+ if(val){
+ return this.filedList.filter(item=>{
+ return item.value == val
+ })[0].label + '('+ val + ')'
+ //删除
+ deleteList(index){
+ this.list.splice(index,1)
+ //重置
+ reset(){
+ this.list = [
+ operator:this.operator.length>0?this.operator[0][this.operatorProps.value]:''
+ //生成检索式
+ createSearch(){
+ var str = ''
+ if(!this.list[0].field || !this.list[0].operator){
+ var a = false
+ this.list.forEach((item,index) => {
+ if(item.dataType == 3){
+ if(item.value.length>0){
+ a = true
+ if(index == 0){
+ if(item.value.length == 1){
+ str = str +' '+ item.field + item.operator + item.value[0]
+ str = str +' '+ item.field + item.operator +'(' + item.value.join(' OR ')+')'
+ str = str + " "+ item.logical + ' '+ item.field + item.operator + item.value[0]
+ str = str + " "+ item.logical + ' '+ item.field + item.operator + '(' + item.value.join(" OR ")+')'
+ }else if(item.dataType == 2){
+ if(!item.value[0] && !item.value[1]){
+ if( item.value[0] && item.value[1] ){
+ str = str + " "+ item.logical + ' '+ item.field + item.operator + '(' + item.value[0] +'~'+item.value[1]+')'
+ }else if(!item.value[0] || !item.value[1]){
+ str = str + " "+ item.logical + ' '+ item.field + item.operator + (item.value[0] || item.value[1])
+ if(item.value){
+ var a = item.value.replace(/("[^"]*"|'[^']*')/g,'')
+ var arr = a.match(/\s{1}and|AND|OR|or|NOT|not\s{1}/g)
+ if(arr&&arr.length>0){
+ str = str +' '+ item.field + item.operator +'(' + item.value+')'
+ str = str + " "+ item.logical + ' '+ item.field + item.operator +'(' + item.value+')'
+ str = str +' '+ item.field + item.operator + item.value
+ str = str + " "+ item.logical + ' '+ item.field + item.operator + item.value
+ // if(!a){
+ // this.$message.info('请输入要检索的内容')
+ // return false
+ this.searchStr = str
+ //表单检索
+ search1(){
+ str = str +'('+ item.field + item.operator + item.value+')'
+ str = str + item.logical + '('+ item.field + item.operator + item.value+')'
+ if(!a){
+ this.$message.info('请输入要检索的内容')
+ this.$emit('search',str)
+ //检索式检索
+ search2(){
+ this.$emit('search',this.searchStr.trim())
+<style lang="scss" scoped>
+ .content_border{
+ width:100%;
+ // min-width: 1500px;
+ align-items: center;
+ justify-content: flex-start;
+ flex-wrap:wrap;
+ .content_border .content{
+ // justify-content: space-between;
+ width: 100%;
+ padding-right:20px;
+ .content_border .content>*{
+ padding:10px
+ .button_group{
+ margin-top:20px;
+ margin-right:20px;
+ justify-content: flex-end;
+ .button_group .el-button{
+ width:92px
@@ -0,0 +1,74 @@
+ <search :logical="logical" :logicalProps="logicalProps" :operator="operator" :field="field" :searchValue="true" :list="list"></search>
+import search from './search.vue'
+ search
+ logical:[
+ name:'并且',
+ name:'或者',
+ label:'name',
+ value:'value'
+ operator:[
+ label:'<=',
+ value:'<='
+ field:[
+ label:'专利号',
+ value:'patentNo'
+ label:'标题',
+ value:'title'
+ label:'公开日',
+ value:'publicDate'
+ list:[
+ logical:'and',
+ field:'patentNo',
+ operator:'=',
+ value:'123'
@@ -0,0 +1,149 @@
+ <el-popover
+ v-if="!showTime && !showDate"
+ ref="popover"
+ placement="bottom"
+ width="400"
+ trigger="click">
+ <div style="display:flex;width:100%" >
+ <el-input v-model="day" placeholder="选择时间" style="margin-right:10px;width:100%"></el-input>
+ <el-time-picker
+ @change="changeTime"
+ @blur="changeTime"
+ v-model="time"
+ value-format="HH:mm:ss"
+ placeholder="选择时间">
+ </el-time-picker>
+ <div style="display:flex;flex-wrap:wrap;width:100% " >
+ <p style="min-width:50px;width:calc(100% / 7);text-align:center;cursor:pointer" v-for="(item,index) in list[type]" :key="index" @click="check(item)">{{ item }}</p>
+ <el-input slot="reference" v-model="value" placeholder="选择时间" style="width:100%"></el-input>
+ </el-popover>
+ v-if="showTime"
+ v-model="value"
+ style="width:100%"
+ popper-class="picker-date"
+ format="MM-dd HH:mm:ss"
+ v-if="showDate"
+ type="datetime"
+ placeholder="选择日期时间">
+import { cron } from "./mixins";
+ mixins:[cron],
+ type:{
+ default:'day'
+ cron:{}
+ value:'',
+ day:'',
+ time:'',
+ week:['周一','周二','周三','周四','周五','周六','周日'],
+ month:[]
+ showDate:false,
+ showTime:false,
+ watch: {
+ type(val) {
+ this.init()
+ init() {
+ this.value = ''
+ this.day = ''
+ this.time = ''
+ this.showTime =this.type=='day'? true:false
+ this.showDate = this.type == 'year' ? true : false
+ switch (this.type) {
+ case 'day':
+ case 'week':
+ case 'month':
+ for(let i = 1;i < 32;i++){
+ this.list.month.push(i+'日')
+ case 'year':
+ if (!this.cron && this.type) {
+ let cron = this.getCron(this.type)
+ this.$emit('value', cron)
+ } else if(this.cron && this.type){
+ this.cronChangeDate(this.cron)
+ check(item){
+ this.$set(this,'day',item)
+ if(!this.time){
+ this.$set(this,'time','18:30:00')
+ this.changeTime()
+ changeTime(){
+ if(!this.showDate && !this.showTime){
+ // console.log(this.value)
+ let cron=this.getCron()
+.el-time-panel{
+ z-index: 9999 !important;
+.el-picker-panel{
+.picker-date {
+ .el-date-picker__header {
+ span:nth-child(3) {
+ button:nth-child(1) {
+ button:nth-child(5) {
@@ -0,0 +1,19 @@
+ <timeChoose :type="type" style="width:200px"></timeChoose>
+import timeChoose from './timeChoose.vue'
+ timeChoose
+ width:'300px',
+ type:'week'
@@ -103,8 +103,8 @@ export default {
userinfo() {
return this.$store.state.admin.userinfo
@@ -140,6 +140,7 @@ export default {
this.$api.scratchWordsUpdate(this.mark).then(response => {
if (response.code == 200) {
this.getContrastList('update')
+ this.$message.success('更新成功')
this.cancelPizhu()
}).catch(error => {
@@ -149,6 +150,7 @@ export default {
this.$api.scratchWordsAdd(this.mark).then(response => {
this.getContrastList('add')
+ this.$message.success('添加成功')
@@ -183,6 +185,7 @@ export default {
this.$api.scratchWordsDelete(ids).then(response => {
this.getContrastList('delete')
+ this.$message.success('删除成功')
@@ -192,7 +195,7 @@ export default {
// 查询批注
getContrastList(type) {
if (type != 'add') {
return item.id == this.mark.id
@@ -205,8 +208,8 @@ export default {
this.$api.scratchWordsQuery(params).then(res => {
if (res.code == 200) {
- if (this.pizhucontrastList.length > 0) {
- var a = this.pizhucontrastList.filter(item => {
+ if (this.piZhuContrastList.length > 0) {
+ var a = this.piZhuContrastList.filter(item => {
return item.patentNo != params.patentNo
}).concat(res.data)
@@ -217,10 +220,10 @@ export default {
break;
case 'update':
- this.pizhucontrastList.splice(index,1,this.mark)
+ this.piZhuContrastList.splice(index,1,this.mark)
case "delete":
- this.pizhucontrastList.splice(index,1)
+ this.piZhuContrastList.splice(index,1)
@@ -0,0 +1,309 @@
+ <div style="background: white;padding: 20px;height: 100%;">
+ <div style="float:right" v-if="downloadId==9">
+ <el-button type="primary" @click="settingUser">账号配置</el-button>
+ <div style="width: 800px;margin: 0 auto;">
+ <div v-if="downloadId==9" >
+ <el-form :inline="true" :model="queryParams" :rules="rules" ref="from" class="demo-form-inline" style="display: flex;justify-content: space-between;">
+ <el-form-item label="来源网站" prop="configId">
+ <el-select v-model="queryParams.configId" placeholder="请选择网站" >
+ <el-option v-for="item in website"
+ :key="item.id"
+ :label="item.webName"
+ :value="item.id">
+ </el-form-item>
+ <el-form-item label="下载内容" prop="configCells">
+ <el-select v-model="queryParams.configCells" multiple collapse-tags placeholder="请选择下载内容" style="width: 100%;">
+ <el-option v-for="item in download"
+ :key="Number(item.cellValue)"
+ :label="item.cellName"
+ :value="Number(item.cellValue)">
+ <el-form-item label="是否更新" prop="taskType">
+ <el-switch v-model="queryParams.taskType" :active-value="1" :inactive-value="0" active-color="#13ce66" inactive-color="#ff4949" @change="change3"> </el-switch>
+ </el-form>
+ <div v-show="queryParams.taskType" >
+ <el-form :inline="true" ref="from" :model="queryParams" :rules="rules" class="demo-form-inline" style="display: flex;justify-content: space-between;">
+ <el-form-item label="更新间隔" prop="dateType">
+ <el-select v-model="queryParams.dateType" @change="getDateType" clearable placeholder="请选择更新时间间隔" style="margin-right: 20px;">
+ <el-option v-for="item in options"
+ <el-form-item label="选择更新具体时间" v-if="queryParams.dateType" >
+ <timeChoose :type="queryParams.dateType" @value="handleData" :cron="queryParams.crons" style="width:300px"></timeChoose>
+ <!-- <div style="display: flex;margin-bottom: 10px;" v-if="queryParams.configType==2">
+ <p style="width:150px;margin-right:10px;margin-bottom: 10px;">数据库:</p>
+ <el-checkbox-group v-model="queryParams.database">
+ <el-checkbox v-for="item in database" :key="item.value" :label="item.value" style="margin:5px">{{ item.label }}</el-checkbox>
+ </el-checkbox-group>
+ <!-- 搜索 -->
+ <div style="display: flex;justify-content: center;width: 100%;align-items:center">
+ <span style="width: 100%;">
+ <el-input v-model="queryParams.conditions" :placeholder="downloadId==9?'请输入检索信息':'请输入专利号(多个专利号同时添加中间请用符号“|”隔开)'" ></el-input>
+ <span style="margin-left:8px" v-if="queryParams.configType==2">
+ <el-tooltip class="item" effect="dark" content="检索说明" placement="top">
+ <i class="el-icon-question" style="font-size:28px" @click="checkConceal(3)" ></i>
+ </el-tooltip>
+ <el-button @click="imports" type="primary" icon="el-icon-upload el-icon--right" style="margin-left:20px"> 导入 </el-button>
+ <SystemTask :form="9" :reportId="reportId" ></SystemTask>
+import SystemTask from "@/views/components/task/index.vue";
+import { cron } from "@/views/components/common/components/mixins";
+import timeChoose from "@/views/components/common/components/timeChoose.vue";
+ props:['reportId','downloadId'],
+ components: {
+ SystemTask,
+ timeChoose,
+ const dateTypeRule = (rule, value, callback) => {
+ // console.log(value)
+ if (this.queryParams.taskType == 1) {
+ if (value) {
+ callback()
+ callback(new Error('请选择更新周期'))
+ database:[
+ label:'中国发明专利',
+ value:'FMZL'
+ label:'中国发明授权',
+ value:'FMSQ'
+ label:'中国实用新型',
+ value:'SYXX'
+ label:'中国外观专利',
+ value:'WGZL'
+ label:'美国',
+ value:'USPATENT'
+ label:'英国',
+ value:'GBPATENT'
+ label:'法国',
+ value:'FRPATENT'
+ label:'德国',
+ value:'DEPATENT'
+ label:'瑞士',
+ value:'CHPATENT'
+ label:'日本',
+ value:'JPPATENT'
+ label:'俄罗斯',
+ value:'RUPATENT'
+ label:'韩国',
+ value:'KRPATENT'
+ label:'欧洲专利局',
+ value:'EPPATENT'
+ label:'世界知识产权组织',
+ value:'WOPATENT'
+ website:[],//选择网站
+ download: [],//选择下载内容
+ options: [
+ {label:'每天',value:'day'},
+ {label:'每周',value:'week'},
+ {label:'每月',value:'month'},
+ {label:'每年',value:'year'},
+ queryParams: {
+ database:[],
+ reportId: this.reportId,
+ crons:'',
+ conditions:'',//搜索条件
+ configId: '',//网站
+ configType:'',
+ configCells: [],//下载内容
+ dateType:'',
+ dates: '',
+ taskType:0,//0普通任务1定时任务
+ taskState:0,//任务状态 0等待1进行2成功3失败
+ isGetList:false,
+ rules: {
+ configId: [{ required: true, message: '请选择来源网站', trigger: 'change' },],
+ configCells: [{ required: true, message: '请选择下载内容', trigger: 'change' },],
+ taskType: [{ required: true, message: '请选择', trigger: 'change' },],
+ dateType: [{ required: true, validator:dateTypeRule, trigger: 'change' },],
+ created() {
+ 'queryParams.configId'(val) {//更换网站
+ let a= this.website.filter(item => {
+ return item.id==val
+ this.queryParams.configType = a[0].webType
+ this.downloads()
+ // this.getList()
+ checkConceal(id) {
+ const router = this.$router.resolve({
+ path: '/agreeConceal',
+ query: {
+ id:id
+ window.open(router.href, '_blank')
+ // const router1 = this.$router.resolve({
+ // path: '/downPatentList',
+ // window.open(router1.href, '_blank')
+ //打开账号配置
+ settingUser(){
+ this.$refs.settingUser.open(this.website)
+ change3(val) {
+ // console.log(val);
+ getDateType(val) {
+ // console.log(val)
+ this.queryParams.crons = ''
+ // 获取时间
+ handleData(val) {
+ if (this.queryParams.dateType=='') {
+ this.$message.error('请先选择更新周期')
+ this.queryParams.crons=val
+ // 请求全部网站
+ getList() {
+ this.$api.getAllConfig({}).then(res => {
+ if (res.code==200) {
+ this.website = res.data
+ // 请求当前网站可下载项
+ async downloads() {
+ await this.$api.getConfigCell({type:this.queryParams.configType}).then(res => {
+ this.download = res.data
+ this.queryParams.configCells=this.download.map(item=>{ return Number(item.cellValue) })
+ // 导入
+ imports() {
+ if (this.queryParams.conditions == '') {
+ if (this.downloadId == 9) {
+ this.$message.error('请输入检索信息')
+ this.$message.error('请输入专利号')
+ if (this.downloadId == 8) {
+ this.queryParams.patentNo = this.queryParams.conditions
+ this.queryParams.conditions = ''
+ this.$api.importByNos(this.queryParams).then(res => {
+ // console.log(res.code);
+ if (res.code == 200) {
+ if (res.data && res.data.length > 0) {
+ // if (!res.data.includes('')) {
+ // this.alterMessage(res.data)
+ this.$message.success('创建任务完成,正在导入!')
+ this.queryParams.patentNo = ''
+ }).catch(error => {
+ this.$refs.from.validate((valid) => {
+ if (valid) {
+ this.$api.addTask(this.queryParams).then(res => {
+ this.$message.success('创建任务完成,正在导入!')
+ this.isGetList=!this.isGetList
@@ -0,0 +1,34 @@
+ <download :projectId="id" :downloadId="option"></download>
+import download from "./download.vue";
+ download
+ computed: {
+ id() {
+ return this.$route.query.id
+ option() {
+ return this.$route.query.option
@@ -0,0 +1,96 @@
+ <div class="advancedSearch">
+ <el-input type="textarea" v-model="condition" :rows="3" placeholder='高级检索语句,例:TI=(石墨烯 NOT 石墨烯薄膜 OR "graphene film") AND AD=2018 AND GD=20180205~20190101'></el-input>
+ <div style="display:flex;justify-content: flex-end;margin-top:20px">
+ <el-button type="danger" plain size="small" style="width:100px" @click="cancel">清空</el-button>
+ <el-button type="primary" size="small" style="width:100px" @click="search">检索</el-button>
+ <div><b>表达式与语法:</b></div>
+ 检索条件表达式,可支持AND、OR、NOT等逻辑运算符号(不区分大小写)和等于(=)比较符号,其中:<br>
+ 1、日期栏位的值支持yyyy. yyyyMM、 yyyyMMdd等格式;已知时间的连续范围为“2006-02-02”到“2009-01-01”,应输入:<span class="red">AD=20060202~20090101</span>;注意:日期的范围检索必须精确到日。<br>
+ 2、专利类型(PT)栏位的值包括:1、8 为发明 检索发明,2、9 为新型,3 为外观(注意:仅中国专利);例:<span class="red">PT=1</span><br>
+ 3、法律状态(LG)栏位的值包括:1:有效、2:失效、3:审中(注意:仅中国专利);例:<span class="red">LG=1</span><br>
+ 4、国家〔地区)相关栏位的值为国家地区代码,需要大写,例如:CN代表中国、US代表美国、JP代表日本等;<br>
+ 5、搜索条件中有空格把整个搜索条件前后加上英文双引号,例如:<span class="red">TI=(石墨烯 NOT 石墨烯薄膜 OR "graphene film") AND AD=2018 AND GD=20180205~20190101</span>;<br>
+ <div><b>检索栏位包括:</b></div>
+ <div class="field">
+ <p v-for="item in field.filter(item=>{return item.type != (this.DBType=='WD'?1:2)})" :key="item.label"><span style="color:red">{{ item.value }}</span>:{{ item.label }}</p>
+ <div><b>省市代码(仅中国专利):</b></div>
+ <div v-html="changeRed('province')">
+ <div><b>国别代码:</b></div>
+ <span v-for="(item) in countryList" :key="item.value"><span class="red">{{ item.value }}</span> {{ item.label }} </span>
+ components: {},
+ props:['countryList','DBType'],
+ condition:'',
+ field:this.$constants.searchField,
+ computed: {},
+ created() {},
+ this.field = [].concat(...this.field.map(item=>{return item.children}))
+ changeRed(val){
+ if(val == 'province'){
+ var str = ' 北京 12 天津 13 河北 14 山西 15 内蒙 21 辽宁 22 吉林 23 黑龙江 31 上海 32 江苏 33'
+ +'浙江 34 安徽 35 福建 36 江西 37 山东 41 河南 42 湖北 43 湖南 44 广东 45 广西 51 四'
+ +'川 52 贵州 53 云南 54 西藏 61 陕西 62 甘肃 63 青海 64 宁夏 65 新疆 66 海南 71 台'
+ +'湾 81 广州 83 武汉 85 重庆 87 西安 89 沈阳 91 大连 93 哈尔滨 94 深圳 95 青岛 97 宁'
+ +'波 HK 香港'
+ var regx = new RegExp("[0-9A-Z]+", "g")
+ return "<span style='color:red'>11 </span>"+str.replace(regx,"<span style='color:red'> $& </span>")
+ cancel(){
+ this.condition = ''
+ search(){
+ var a = this.condition
+ // if(a.trim().indexOf('(')!=0){
+ // a = `${a}`
+ this.$emit('search',a.trim())
+};
+.advancedSearch{
+ padding: 10px;
+.field{
+ p{
+ width:200px;
+ margin:5px;
+.red{
+ color:red
@@ -0,0 +1,513 @@
+ <div class="formSearch">
+ <el-form :model="form" label-width="120px" size="small" label-position="right">
+ <template v-for="item in constants.searchField" >
+ <div :key="item.label" v-if="(dbType ==2 && item.value!='typeAndStatus')||dbType !=2 ">
+ <span>{{item.label}}</span>
+ <el-divider></el-divider>
+ <el-row>
+ <el-col :span="24">
+ <div v-for="(i,index) in item.children" :key="i.value">
+ <div v-if="index%2==0">
+ <el-col :span="12" v-if="(item.children[index].type == dbType || item.children[index].type == 3)">
+ <el-form-item :label="item.children[index].label+':'">
+ <!-- <el-select v-model="form[item.children[index].value]" multiple filterable collapse-tags placeholder="请选择,可多选" style="width:100%">
+ v-for="item in constants[item.children[index].value]"
+ <div v-if="item.children[index].dataType==2" style="display:flex;width:100%">
+ v-model="form[item.children[index].value][0]"
+ v-model="form[item.children[index].value][1]"
+ <div v-else-if="item.children[index].dataType==3" style="width:100%">
+ <el-select v-model="form[item.children[index].value]" size="small" multiple filterable collapse-tags placeholder="请选择,可多选" style="width:100%">
+ v-for="item in item.children[index].value=='GJ'?countryList:constants[item.children[index].value]"
+ <div v-else style="width:100%"><el-input size='small' style="width:100%" v-model="form[item.children[index].value]" :placeholder="item.children[index].placeholder"></el-input> </div>
+ </el-col>
+ <el-col :span="12" v-if="(item.children[index+1]) && (item.children[index+1].type == dbType || item.children[index+1].type == 3)" >
+ <el-form-item :label="item.children[index+1].label+':'">
+ <!-- <el-select v-model="form[item.children[index+1]?.value]" multiple filterable collapse-tags placeholder="请选择,可多选" style="width:100%">
+ v-for="item in constants[item.children[index+1]?.value]"
+ <div v-if="item.children[index+1].dataType==2" style="display:flex;width:100%">
+ v-model="form[item.children[index+1].value][0]"
+ v-model="form[item.children[index+1].value][1]"
+ <div v-else-if="item.children[index+1].dataType==3" style="width:100%">
+ <el-select v-model="form[item.children[index+1].value]" size="small" multiple filterable collapse-tags placeholder="请选择,可多选" style="width:100%">
+ v-for="item in item.children[index+1].value=='GJ'?countryList:constants[item.children[index+1].value]"
+ <div v-else style="width:100%"><el-input size='small' style="width:100%" v-model="form[item.children[index+1].value]" :placeholder="item.children[index+1].placeholder"></el-input> </div>
+ </el-row>
+ </template>
+<!--
+ <template>
+ <span>类型及状态</span>
+ <el-col :span="12" style="padding-right:20px" v-if="DBType != 'WD'">
+ <el-form-item label="专利类型:">
+ <el-select v-model="form.PT" multiple filterable collapse-tags placeholder="请选择,可多选" style="width:100%">
+ v-for="item in option2"
+ <el-col :span="12">
+ <el-form-item label="法律状态:" v-if="DBType != 'WD'">
+ <el-select v-model="form.LG" multiple filterable collapse-tags placeholder="请选择,可多选" style="width:100%">
+ v-for="item in option1"
+ <el-col :span="12" style="padding-right:20px" >
+ <el-form-item label="IPC分类号:">
+ <el-input v-model="form.IC" placeholder="IPC分类号,例:A018 OR A024"></el-input>
+ <el-form-item label="国家地区:" v-if="DBType != 'CN'">
+ <el-select v-model="form.GJ" multiple filterable collapse-tags placeholder="请选择,可多选" style="width:100%">
+ :label="(form.GJ && form.GJ.length == countryList.length)?'全部取消':'全部选择'"
+ value="-1"
+ @click.native="selectAll"
+ v-for="item in countryList"
+ <span>申请信息</span>
+ <el-col :span="12" style="padding-right:20px">
+ <el-form-item label="申请号:">
+ <el-input v-model="form.AN" placeholder="申请号,例:CN20120304957.6 OR CN20120305264.1"></el-input>
+ <el-form-item label="申请日:">
+ v-model="form.AD[0]"
+ v-model="form.AD[1]"
+ <el-form-item label="发明/设计人:">
+ <el-input v-model="form.IN" placeholder="发明人,例:张三 OR 李四"></el-input>
+ <el-col :span="12" >
+ <el-form-item label="申请人:">
+ <el-input v-model="form.PA" placeholder="申请人,例:清华大学 OR 北京大学"></el-input>
+ <el-form-item label="地址:">
+ <el-input v-model="form.DZ" placeholder="申请人地址,例:北京 OR 上海"></el-input>
+ <span>公开公告</span>
+ <el-form-item label="公开号:" style="padding-right:20px">
+ <el-input v-model="form.PN" placeholder="公开号,例:CN102860161 OR CN1526554846"></el-input>
+ <el-form-item label="公开日:" >
+ v-model="form.PD[0]"
+ v-model="form.PD[1]"
+ <el-form-item label="公告号:" v-if="DBType != 'WD'">
+ <el-input v-model="form.GN" placeholder="公告号,例:CN102860161"></el-input>
+ <el-form-item label="公告日:" v-if="DBType != 'WD'">
+ v-model="form.GD[0]"
+ v-model="form.GD[1]"
+ <span>文本</span>
+ <el-form-item label="名称:">
+ <el-input v-model="form.TI" placeholder="专利名称,例:计算机 OR 手机"></el-input>
+ <el-form-item label="摘要:">
+ <el-input v-model="form.AB" placeholder="文摘或简要说明,例:外喷放热气 OR 手机壳"></el-input>
+ <el-form-item label="关键词:">
+ <el-input v-model="form.TX" placeholder="关键词,例:石墨烯 OR 壳"></el-input>
+ <el-col :span="12" v-if="DBType != 'WD'">
+ <el-form-item label="权利要求:">
+ <el-input v-model="form.CL" placeholder="主权利要求,例:加煤系统 OR 手机是由壳和屏幕构成"></el-input>
+ <template v-if="DBType != 'WD'">
+ <span>专利代理</span>
+ <el-form-item label="代理机构:">
+ <el-input v-model="form.AGN" placeholder="代理机构,例:威世博"></el-input>
+ <el-form-item label="代理人:">
+ <el-input v-model="form.AT" placeholder="代理人,例:王五"></el-input>
+ </template> -->
+ <div style="display:flex;justify-content: center;">
+ form:{
+ AD:[],
+ PD:[],
+ GD:[]
+ dbType:this.DBType=='WD'?'2':'1',
+ option1:[//法律状态
+ option2:[//专利类型
+ DBType(val){
+ this.dbType = val == 'WD'?'2':'1'
+ selectAll () {
+ if (this.form.GJ.length < this.countryList.length) { // 非全选时,点击选择全部
+ this.form.GJ = this.countryList.map((item) => {
+ return item.value
+ // this.form.GJ.unshift('-1')
+ } else { // 全选时,点击置空
+ this.form.GJ = []
+ this.form = {
+ var keys = Object.keys(this.form)
+ for(let i = 0;i<keys.length;i++){
+ var str1 = ''
+ if(typeof this.form[keys[i]] == 'object'){
+ if(this.form[keys[i]].length>0){
+ if(keys[i]=='PD' || keys[i]=='GD' || keys[i]=='AD'){
+ // if(this.form[keys[i]][0]){
+ // str1 = str1 + keys[i] + '>=' + this.form[keys[i]][0]
+ // console.log(this.form[keys[i]])
+ if(!this.form[keys[i]][0] && !this.form[keys[i]][1]){
+ if( this.form[keys[i]][0] && this.form[keys[i]][1] ){
+ // str1 = str1 + ' AND ' + keys[i] + '<=' + this.form[keys[i]][1]
+ str1 = str1 + keys[i] + '=' + this.form[keys[i]][0] +'~'+this.form[keys[i]][1]
+ }else if(!this.form[keys[i]][0] || !this.form[keys[i]][1]){
+ // str1 = str1 + keys[i] + '<=' + this.form[keys[i]][1]
+ str1 = str1 + keys[i] + '=' + (this.form[keys[i]][0] || this.form[keys[i]][1])
+ // this.form[keys[i]].forEach((item,index)=>{
+ // if(index<this.form[keys[i]].length-1){
+ // str1 = str1 + keys[i] + '=' + item + ' AND '
+ // }else{
+ // str1 = str1 + keys[i] + '=' + item
+ // if(keys[i] == 'GJ'){
+ // var index = this.form.GJ.findIndex(item=>{return item == '-1'})
+ // if(index!=-1){
+ // this.form.GJ.splice(index,1)
+ if(this.form[keys[i]].length>1){
+ str1 = str1 + keys[i] + '=(' + this.form[keys[i]].join(" OR ") +')'
+ str1 = str1 + keys[i] + '=' + this.form[keys[i]][0]
+ if(this.form[keys[i]]){
+ var a = this.form[keys[i]].replace(/("[^"]*"|'[^']*')/g,'')
+ str1 = str1 + keys[i] + '=(' + this.form[keys[i]]+')'
+ str1 = str1 + keys[i] + '=' + this.form[keys[i]]
+ if(str1!=''){
+ if(i<keys.length-1){
+ str = str + str1 + ' AND '
+ str = str + str1
+ if(str.charAt(str.length-1)==' '){
+ str=str.slice(0,str.length-5);
+.formSearch .el-divider{
+ margin-top:5px;
+ margin-bottom:24px;
+ .formSearch{
+ padding:10px;
@@ -0,0 +1,406 @@
+ <el-dialog title="导入到专题库" :visible.sync="dialogVisible" width="500px" :before-close="handleClose">
+ <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+ <!-- <el-form-item label="任务名称">
+ <el-input v-model="form.taskName" placeholder="请输入任务名称"></el-input>
+ <el-form-item label="选择报告" prop="projectId">
+ <div class="selectButton">
+ <el-select v-model="form.projectId" filterable clearable @change="changeProjectId" placeholder="请选择专题库" >
+ v-for="item in projectList"
+ :label="item.name"
+ :value="item.id"
+ <el-button @click="addProject"><i class="el-icon-plus"></i></el-button>
+ <template v-if="form.projectId" >
+ <div style="margin:10px 0;">
+ <p>选择需要关联的标引与分类</p>
+ <!-- <el-form-item label="选择需要关联的标引与分类"> -->
+ <el-table :data="tableData" :show-header="false">
+ <el-table-column type="expand">
+ <template slot-scope="props">
+ <el-form label-position="top" class="custom-field-form">
+ <template v-if="props.row.field === 'folder'">
+ <el-tree
+ ref="folderTree"
+ :data="customField.folder"
+ check-strictly
+ :default-checked-keys="form.json.field.folder"
+ show-checkbox
+ node-key="id"
+ :props="defaultProps"
+ @check-change="changeFolder"
+ ></el-tree>
+ <template v-else v-for="(item, index) in customField[props.row.field]">
+ <el-form-item :label="`${index + 1}. ${item.name}`">
+ <template v-if="item.type === 0 || item.type === 2">
+ <el-input v-model="form.json.field[item.id].value" placeholder="请输入内容" size="small"></el-input>
+ <template v-if="item.type === 1">
+ <el-date-picker v-model="form.json.field[item.id].value" value-format="yyyy-MM-dd" type="date" size="small" placeholder="选择日期" style="width: 100%;"></el-date-picker>
+ <template v-if="item.type === 3">
+ <el-select v-model="form.json.field[item.id].value" size="small" placeholder="请选择" class="width_100">
+ <el-option v-for="option in item.option" :value="option.id" :label="option.name"></el-option>
+ <template v-if="item.type === 4">
+ <el-radio-group v-model="form.json.field[item.id].value">
+ <el-radio v-for="option in item.option" :label="option.id">{{ option.name }}</el-radio>
+ </el-radio-group>
+ <template v-if="item.type === 5">
+ <el-checkbox-group v-model="form.json.field[item.id].value">
+ <el-checkbox v-for="option in item.option" :label="option.id">{{ option.name }}</el-checkbox>
+ <template v-if="item.type === 6">
+ :ref="item.id"
+ :data="item.option"
+ :default-checked-keys="form.json.field[item.id].value"
+ @check-change="changeField(item.id)"
+ </el-table-column>
+ <el-table-column prop="name" show-overflow-tooltip>
+ <template slot-scope="scope">
+ <div style="display:flex;justify-content: space-between;align-items:center">
+ <span>{{ scope.row.name }}</span>
+ <span v-if="scope.row.field === 'folder'"><el-button type="primary" size="small" @click="handleFolder(form.projectId)" :disabled="!($permission('/workspace/common/folder_manage') && $r(form.projectId,[1,2]))">文件夹管理</el-button></span>
+ <span v-else><el-button type="primary" size="small" @click="handleManage(form.projectId)" :disabled="!($permission('/workspace/common/customField') && $r(form.projectId,[1,2]))">自定义栏位管理</el-button></span>
+ </el-table>
+ <!-- </el-form-item> -->
+ <el-form-item label="下载内容">
+ <el-select v-model="form.configCells" multiple collapse-tags style="width:100%">
+ <el-option v-for="item in patentField"
+ <el-form-item label="定期更新" prop="taskType">
+ <el-switch v-model="form.taskType" :active-value="1" :inactive-value="0" active-color="#13ce66" inactive-color="#ff4949" @change="changeTaskType"></el-switch>
+ <div v-show="form.taskType">
+ <el-select v-model="form.dateType" @change="getDateType" clearable placeholder="请选择更新时间间隔" style="width:100%">
+ <el-form-item label="具体更新时间" v-if="form.dateType" style="width:100%">
+ <timeChoose :type="form.dateType" @value="handleData" :cron="form.crons"></timeChoose>
+ <div class="button">
+ <el-button type="primary" size="small" @click="onSubmit">导入</el-button>
+ <el-button size="small" @click="handleClose">取消</el-button>
+ </el-dialog>
+ <project-form-drawer @submit="submitProjectForm" :common-data="commonData" ref="projectFormDrawer"/>
+ <project-field-drawer @close="handleClose2" ref="projectFieldDrawer" />
+ <project-folder-dialog @close="updateFolder" ref="projectFolderDialog" />
+import ProjectFormDrawer from "@/views/workspace/components/drawer/Form.vue";
+import timeChoose from "@/views/workspace/components/common/timeChoose.vue";
+import ProjectFieldDrawer from "@/views/workspace/components/drawer/Field";
+import ProjectFolderDialog from "@/views/workspace/components/dialog/Folder";
+ ProjectFormDrawer,
+ ProjectFieldDrawer,
+ ProjectFolderDialog
+ props: [],
+ customField:{},
+ tableData:[
+ name: '标引',
+ field: 'index'
+ name: '分类',
+ field: 'classify'
+ name: '文件夹',
+ field: 'folder'
+ defaultProps: {
+ children: 'children',
+ label: 'name'
+ dialogVisible:false,
+ form: {},
+ projectList: [],
+ commonData:{},
+ // /1.著录项目 2.权要 3.说明书文本 4.说明书pdf 6.摘要附图
+ patentField:[
+ value:'1',
+ label:'著录项目'
+ value:'2',
+ label:'权利要求'
+ value:'3',
+ label:'说明书文本'
+ value:'4',
+ label:'说明书pdf'
+ value:'6',
+ label:'摘要附图'
+ projectId: [
+ { required: true, message: '请选择专题库', trigger: 'change' }
+ watch: {},
+ this.$api.getCommonData({ keys: 'QUERY_GROUP,ENTERPRISE_APPLICATION_SCENARIO,INVESTIGATION_TYPE' }).then(response => {
+ this.commonData = response.data
+ this.getProjectList();
+ open(form){
+ ...form,
+ configCells:['1','2','3','4','6'],
+ taskType2:4,
+ taskType:0,
+ configId:2,
+ json: {
+ projectId: 0,
+ field: [],
+ folder: {}
+ if(this.form.projectId){
+ this.$set(this.form,'projectId',Number(this.form.projectId))
+ this.dialogVisible=true
+ //关闭弹窗
+ handleClose(){
+ this.$refs.form.resetFields()
+ this.dialogVisible=false
+ //导入
+ onSubmit(){
+ this.$refs.form.validate((valid) => {
+ this.form.fieldList = []
+ this.form.folderIds = this.form.json.field.folder
+ for (let id in this.form.json.field) {
+ const field = this.form.json.field[id]
+ if (!field) {
+ continue;
+ const type = field.type
+ const value = field.value
+ if (type === 5 || type === 6) {
+ value.map(option => {
+ this.form.fieldList.push({
+ fieldId: parseInt(id),
+ type: type,
+ optionId: option
+ optionId: [0, 1, 2].indexOf(type) === -1 ? value : 0,
+ text: value
+ this.$api.addTask(this.form).then(response=>{
+ if(response.code == 200){
+ this.$message.success(response.data)
+ this.handleClose()
+ }).catch(error=>{
+ //切换专题库
+ changeProjectId(val){
+ this.getCustomField(val)
+ //获取标引类型
+ getCustomField(projectId) {
+ this.$api.getCustomField({ projectId: projectId }).then(response => {
+ this.customField = response.data;
+ ['index', 'classify'].map(key => {
+ this.customField[key].map(item => {
+ let value = null
+ if (item.type === 5 || item.type === 6) {
+ value = []
+ this.$set(this.form.json.field, item.id, { type: item.type, value })
+ //打开自定义栏位弹窗
+ handleManage(projectId) {
+ this.$refs.projectFieldDrawer.open(projectId)
+ //关闭自定义栏位弹窗并更新自定义栏位数据
+ handleClose2(projectId) {
+ this.getCustomField(projectId)
+ //获取选中的分类节点
+ changeField(id){
+ this.form.json.field[id].value = this.$refs[id][0].getCheckedKeys()
+ //打开文件夹管理弹窗
+ handleFolder(projectId) {
+ this.$refs.projectFolderDialog.open(projectId)
+ //关闭文件夹弹窗并更新数据
+ updateFolder(projectId) {
+ this.$api.getProjectFolderList({ projectId: projectId, patentTotal: false }).then(response => {
+ this.customField.folder = response.data
+ //获取选中的文件夹
+ changeFolder(data, checked, indeterminate){
+ this.form.json.field.folder = this.$refs.folderTree.getCheckedKeys()
+ //获取更新周期
+ this.form.crons = ''
+ //是否定期更新
+ changeTaskType(val){
+ if(!val){
+ this.form.dateType = ''
+ if (this.form.dateType=='') {
+ this.form.crons=val
+ //查询专题库列表
+ getProjectList() {
+ let params = {
+ current: 1,
+ size: 9999,
+ myself: true,
+ name: "",
+ sort: {
+ order: "desc",
+ prop: "create_time",
+ this.$api.getProjectListV2(params).then((response) => {
+ this.projectList = response.data.records;
+ //打开新增专题库弹窗
+ addProject() {
+ this.$refs.projectFormDrawer.open(
+ update: 0,
+ updateTime: "一天",
+ status: "0",
+ sort: 1,
+ typeList: [],
+ scenarioList: [],
+ "新增专题库"
+ );
+ //更新列表
+ submitProjectForm(type) {
+ this.getProjectList()
+@import "@/assets/css/selectButton.scss";
+.button{
+ justify-content: center;
@@ -0,0 +1,271 @@
+ <div style="background:white;padding:20px 20px 0;">
+ <el-button @click="deletes()"><i class="iconfont icon-shanchu"></i> 删除<span v-if="multipleSelection.length>0">{{ multipleSelection.length }}条</span><span v-else>所有</span>检索记录</el-button>
+ <el-table
+ ref="table"
+ :data="tableData"
+ style="width: 100%"
+ :maxHeight="height - 230"
+ v-loading="loading"
+ :row-key="getRowKeys"
+ @selection-change="handleSelectionChange">
+ <el-table-column type="selection" width="55" :reserve-selection="true">
+ <el-table-column prop="conditions" label="检索式"></el-table-column>
+ <el-table-column prop="dbType" label="检索范围" width="140">
+ {{ dbType[scope.row.dbType] }}
+ <el-table-column prop="time" label="创建/更新时间" width="240">
+ <div class="time">
+ <p>创建:{{ scope.row.retrieveTime }}</p>
+ <p>更新:{{ scope.row.updateTime }}</p>
+ <el-table-column prop="totalNum" label="检索结果" width="120">
+ {{ scope.row.totalNum }}件
+ <el-table-column label="操作" width="140">
+ <div class="icon">
+ <span @click="editSearch(scope.row)" class="margin-left_10">
+ <el-tooltip class="item" effect="dark" content="编辑" placement="top">
+ <i class="iconfont icon-bianji"></i>
+ <span @click="executeSearch(scope.row)" class="margin-left_10">
+ <el-tooltip class="item" effect="dark" content="再次执行" placement="top">
+ <i class="iconfont icon-zidongzhihang"></i>
+ <span @click="delSearch(scope.row)" class="margin-left_10">
+ <el-tooltip class="item" effect="dark" content="删除" placement="top">
+ <i class="iconfont icon-shanchu"></i>
+<div class="foot">
+ <el-pagination
+ background
+ layout="total, prev, pager, next, jumper"
+ :current-page.sync="queryParams.current"
+ :page-size.sync="queryParams.size"
+ @current-change="handleCurrentChange"
+ @size-change="getList"
+ :total="queryParams.total"
+ </el-pagination>
+</div>
+ <el-dialog title="编辑检索式" :visible.sync="dialogVisible" width="800px" :before-close="handleClose" :close-on-click-modal="false" append-to-body>
+ <el-form-item label="检索范围:">
+ <el-radio-group v-model="form.dbType">
+ <el-radio label="CN">中国专利检索</el-radio>
+ <el-radio label="WD">世界专利检索</el-radio>
+ <el-form-item label="检索式:">
+ <el-input type="textarea" v-model="form.conditions"></el-input>
+ <div slot="footer" class="dialog-footer">
+ <el-button @click="handleClose">取 消</el-button>
+ <el-button type="primary" @click="submit" :loading="btnLoading">检 索</el-button>
+ props:['reportId'],
+ height:document.documentElement.clientHeight,
+ tableData:[],
+ multipleSelection:[],
+ loading:false,
+ btnLoading:false,
+ queryParams:{
+ size:10,
+ current:1,
+ total:0
+ dbType:{
+ 'CN':'中国专利检索',
+ 'WD':'世界专利检索'
+ form:{},
+ this.getList()
+ getRowKeys(row) {
+ return row.id
+ open(){
+ handleSelectionChange(val){
+ this.multipleSelection = val
+ //切换页数
+ async handleCurrentChange(val) {
+ this.queryParams.current = val;
+ await this.getList();
+ //查询检索历史
+ getList(){
+ this.loading = true
+ this.$api.queryRetrieveRecord(this.queryParams).then(response=>{
+ this.tableData = response.data.records
+ this.queryParams.total = response.data.total
+ this.loading = false
+ this.tableData = []
+ //打开编辑检索历史弹窗
+ editSearch(row){
+ dbType:row.dbType,
+ id:row.id,
+ conditions:row.conditions,
+ this.dialogVisible = true
+ //关闭编辑检索历史弹窗
+ this.form = {}
+ this.dialogVisible = false
+ //提交编辑内容
+ submit(){
+ // this.btnLoading = true
+ // this.$api.updateRetrieveRecord(this.form).then(response=>{
+ // if(response.code == 200){
+ // this.$message.success('编辑成功')
+ // this.btnLoading = false
+ // this.handleClose()
+ // }).catch(error=>{
+ path: '/searchResult',
+ condition:this.form.conditions,
+ DBType:this.form.dbType,
+ reportId:this.reportId?this.reportId:null,
+ retrieveRecordId:null
+ // this.$s.setSession('retrieveRecordId',0)
+ window.open(router.href, '_blank');
+ //执行检索历史
+ executeSearch(row){
+ condition:row.conditions,
+ DBType:row.dbType,
+ // this.$s.setSession('retrieveRecordId',row.id)
+ //检索历史id加入到数组
+ delSearch(row){
+ var a = [row.id]
+ this.deletes(a)
+ //删除检索历史
+ deletes(val){
+ var arr = {
+ isAll:false
+ arr.ids = val
+ if(this.multipleSelection.length>0){
+ arr.ids = this.multipleSelection.map(item=>{return item.id})
+ arr.isAll = true
+ arr.ids = []
+ this.$confirm('确认删除吗?', '提示', {
+ confirmButtonText: '确定',
+ cancelButtonText: '取消',
+ type: 'warning'
+ }).then(() => {
+ this.$api.deleteRetrieveRecord(arr).then(response=>{
+ this.multipleSelection = []
+ this.$refs.table.clearSelection();
+.time{
+ margin:0;
+.icon{
+ i{
+ font-size:20px;
+.foot{
+ margin-top:10px;
@@ -0,0 +1,138 @@
+ <div class="customSearch">
+ <el-container style=" border: 1px solid #eee" :style="{height:height-70+'px'}">
+ <el-aside v-if="DBType == 'WD'">
+ <div class="clearfix">
+ <span><el-checkbox v-model="checked" @change="change">全部国家地区</el-checkbox></span>
+ <span style="float: right; padding: 3px 0" type="text">{{ checkList.length }}/{{countryList.length}}</span>
+ <div style="overflow-y:auto;overflow-x:hidden;" :style="{height:height-120+'px'}">
+ <el-checkbox-group v-model="checkList">
+ <div v-for="item in countryList" :key="item.value" class="item">
+ <el-checkbox :label="item.value">{{ item.label }}({{ item.value }})</el-checkbox>
+ </el-aside>
+ <el-main>
+ <search :logical="logical" :logicalProps="logicalProps" :operator="operator" :field="field" :searchValue="true" @search="search"></search>
+ </el-main>
+ </el-container>
+import search from '@/views/components/common/components/search.vue'
+ props: ['countryList','DBType'],
+ height:document.getElementsByClassName('el-main')[0].clientHeight,
+ checkList:[],
+ checked:false,
+ value:'AND'
+ value:'OR'
+ name:'非',
+ value:'NOT'
+ // label:'>',
+ // value:'>'
+ // label:'<',
+ // value:'<'
+ // label:'<=',
+ // value:'<='
+ field:JSON.parse(JSON.stringify(this.$constants.searchField)),
+ 'checkList'(val){
+ if(val.length == this.countryList.length){
+ this.checked = true
+ this.checked = false
+ DBType(){
+ this.getField()
+ getField(){
+ var a = JSON.parse(JSON.stringify(this.$constants.searchField))
+ this.field = a.map(item=>{
+ item.children = item.children.filter(item1 =>{return item1.value!='GJ' && item1.type != (this.DBType != 'WD'?'2':'1')})
+ return item
+ search(val){
+ if(this.DBType == 'WD' && this.checkList.length>0){
+ var str = `${val} AND (GJ=${this.checkList})`
+ this.$emit('search',`${val}`)
+ change(val){
+ this.checkList = this.countryList.map(item=>item.value)
+ this.checkList = []
+ .clearfix {
+ // padding-left:20px ;
+ padding:10px 20px ;
+ border-bottom: 1px solid #eeeeee;
+ .item{
+ padding:10px 20px;
@@ -0,0 +1,30 @@
+ <div style="background:white">
+ <search :reportId="reportId"></search>
+import search from './search.vue';
+ props: {},
+ reportId(){
+ return this.$route.query.reportId
+ mounted() {},
+ methods: {},
@@ -0,0 +1,159 @@
+ <div class="change-patent" style="background:white;display:flex; justify-content:flex-end" key="1">
+ <el-button type="" size="small" :disabled="prev==0||ban==1" @click="handleLink(records[index-1],'prev')" >
+ <span class="p"><i class="el-icon-arrow-up"></i>
+ <span>上一篇</span>
+ <span class="n" v-if="prev">
+ <span>{{ records[index-1].patentNo }}</span>
+ <span class="n" v-else>无数据</span>
+ </el-button>
+ <div style="width:120px;height:50px;border-radius:5px ;border:1px solid #DCDCDC;display:flex; justify-content:flex-start;margin:0 10px">
+ <div class="t" style="min-width:50px;text-align:center;line-height:50px;border-right:1px solid #DCDCDC;" v-if="prev>0">{{ prev }}</div>
+ <div class="t" style="min-width:50px;text-align:center;line-height:50px" v-if="next">{{ next }}</div>
+ <el-button type="" size="small" :disabled="next==0||ban==1" @click="handleLink(records[index+1],'next')" >
+ <span class="p">
+ <i class="el-icon-arrow-down"></i>
+ <span>下一篇</span>
+ <span class="n" v-if="next">
+ <span>{{ records[index+1].patentNo }}</span>
+ <script>
+ mixins: [],
+ props: ['ban'],
+ queryParams: {},
+ records: [],
+ total: 0,
+ loading: false,
+ index:0,
+ prev:0,
+ next:0,
+ async mounted() {
+ // console.log(this.$s.getSession('params'))
+ var index = this.$s.getSession('params').index
+ this.index = index%10
+ this.queryParams = this.$s.getSession('params').params
+ this.queryParams.PageNum = Math.floor(index/10)+1
+ this.queryParams.RowCount = 10
+ if(this.index == 9){
+ this.queryParams.RowCount = 20
+ await this.getPatentList()
+ async getPatentList(val) {
+ // this.loading = true
+ await this.$api.patentSelectImport(this.queryParams).then(response=>{
+ var params = this.$s.getSession('params')
+ this.total =response.data.total
+ this.$set(this,'prev',(this.queryParams.PageNum-1)*this.queryParams.RowCount + this.index)
+ this.$set(this,'next',this.total>2?((this.total - this.prev - 1)<0?0:(this.total - this.prev - 1)):0)
+ // this.prev = (this.queryParams.PageNum-1)*this.queryParams.RowCount + this.index
+ // this.next = this.total>2?((this.total - this.prev - 1)<0?0:(this.total - this.prev - 1)):0
+ this.$set(this,'records',response.data.records.concat(this.records))
+ this.$set(this,'records',this.records.concat(response.data.records))
+ // this.records = this.records.concat(response.data.records)
+ params.index = this.prev
+ this.$s.setSession('params',params)
+ // this.loading = false
+ handleLink(item,type) {
+ this.$emit('on-change', item)
+ if(type == 'prev'){
+ this.index =this.index - 1
+ this.prev -=1
+ this.next +=1
+ if(this.index <= 1){
+ if(this.queryParams.PageNum>1){
+ this.index += 10
+ this.queryParams.PageNum -= 1
+ this.getPatentList(type)
+ this.$nextTick(()=>{
+ this.records.splice(10,10)
+ if(this.prev>=9999){
+ this.$message.warning('系统不能查看10000条以后的数据!!!')
+ this.index =this.index + 1
+ this.prev +=1
+ this.next-=1
+ if(this.records.length==20 && this.index == 18){
+ this.index -= 10
+ this.queryParams.PageNum += 1
+ this.getPatentList()
+ this.$nextTick(this.records.splice(0,10))
+ }else if(this.records.length<=10 && this.index == 8){
+ <style lang="scss">
+ .change-patent {
+ .el-button {
+ height: 50px;
+ margin-left: 0 !important;
+ // margin-top: 10px;
+ .p {
+ margin-bottom: 5px;
+ .t {
+ border: 1px solid #797979;
+ padding-left: 10px;
+ color: #1e9fff;
+ .n {
+ margin-left: 18px;
+ color: #797979;
+ </style>
@@ -0,0 +1,276 @@
+ <div class="patent-articles" >
+ <el-container v-loading="loading">
+ <el-container >
+ <el-header class="patent-articles-title">
+ <div class="patent-articles-title-box">
+ <div style="position:relative">
+ <img src="@/assets/visual/fixed.png" width="20px" height="20px" v-if="fix===true" @click="qx" style="position:absolute;top:5px;left:5px"/>
+ <img src="@/assets/visual/unfixed.png" width="20px" height="20px" v-if="fix===false" @click="gd" style="position:absolute;top:5px;left:5px"/>
+ <span v-html="getViewDom(patent.publicNo)"></span>
+ <el-tag type="primary" effect="dark" size="mini" class="margin-left_10">{{ patent.simpleStatus }}</el-tag>
+ <div style="color: #6b6868; font-size: 15px;border-bottom: 1px solid #e6e6e6;padding-bottom: 5px;">
+ <span v-html="getViewDom2(patent, 'name')"></span>
+ <el-link v-if="projectId" type="primary" @click.native="handleChange(patent, 'name')" style="margin-left: 10px;margin-top: -3px;">
+ <span v-if="!patent.change">切换译文</span>
+ <span v-else>切换原文</span>
+ </el-link>
+ <div style=" position: relative;">
+ <el-link v-for="item in menuList" :type="activeMenu === item.value ? 'primary' : undefined" v-if="!item.show" @click.native="handleSelect(item.value)">
+ {{ item.label }}
+ <!-- <span v-if="item.value == 'PatentImage'|| item.value=='PatentPDF'" @click.stop="ending(item.value)">
+ placement="right"
+ <el-radio v-for="(item, index) in positionList" :key="index" v-model="radio" @input="changePosition" :label="item.value">{{item.label}}</el-radio>
+ <i class="el-icon-setting" slot="reference"></i>
+ </span> -->
+ </el-header>
+ <el-main class="patent-articles-content" style="padding-left:30px">
+ <div class="patent-articles-content-left">
+ <!-- <div class="dom1 box1" v-dragControllerDiv1 style="display:flex;width:100%">
+ <div class="component left1" style="width:100%;overflow-y:auto;overflow-x: hidden;" :style="{height:height}"> -->
+ <component style="width:100%;height:100%" :is="componentName" :patent="patent" :patentNo="[patent.patentNo]" :domId="patent.patentNo + '1'" :pdfType1="(patent.pdf && patent.pdf.length>0)?patent.pdf[0].type:2" @refresh="getPatent(applicationNo)"></component>
+ <!-- </div> -->
+ <!-- <div class="resize2" title="收缩侧边栏" v-show="(radio == 2 || radio == 3) && activeMenu != activeMenu2"><p><span>˙</span><span>˙</span><span>˙</span></p></div>
+ <div class="resize1" title="收缩侧边栏" v-show="(radio == 4 || radio == 5) && activeMenu != activeMenu2"><span>⋮</span></div>
+ <div v-show="radio != 1 && activeMenu != activeMenu2" class="mid1" :style="{height:(radio == 4 || radio == 5)?height:'280px'}" style="width:450px;height:280px;border:1px solid #E4E7ED;overflow-y:auto;overflow-x: hidden;">
+ <component :is="activeMenu2" :patent="patent" :patent-id="patentId" :pdfType1="(patent.pdf && patent.pdf.length>0)?patent.pdf[0].type:2" :sign="true"></component>
+ <div class="content-main" style="padding-left:40px"></div>
+import { changeTranslation, patentKeywordsHighlight } from '@/views/workspace/folder/components/mixins'
+import PatentField from '@/views/workspace/folder/articles/components/PatentField'
+import PatentAnnotation from '@/views/workspace/folder/articles/components/PatentAnnotation'
+import PatentBasic from "@/views/workspace/folder/articles/components/PatentBasic"
+import PatentPDF from "@/views/workspace/folder/articles/components/PatentPDF"
+import PatentImage from "@/views/workspace/folder/articles/components/PatentImage"
+import PatentRight from "@/views/workspace/folder/articles/components/PatentRight"
+import PatentInstruction from "@/views/workspace/folder/articles/components/PatentInstruction"
+import PatentFamily from "@/views/workspace/folder/articles/components/PatentFamily"
+import PatentStatus from "@/views/workspace/folder/articles/components/PatentStatus"
+ PatentField,
+ PatentAnnotation,
+ PatentBasic,
+ PatentPDF,
+ PatentImage,
+ PatentRight,
+ PatentFamily,
+ PatentStatus,
+ PatentInstruction,
+ props: ['applicationNo','projectId'],
+ mixins: [patentKeywordsHighlight, changeTranslation],
+ radio:1,
+ height:null,
+ fix:false,
+ activeMenu: 'PatentBasic',
+ activeMenu2:'',
+ componentName: 'PatentBasic',
+ menuList: [
+ value: 'PatentBasic',
+ label: '基础信息'
+ value: 'PatentRight',
+ label: '权利要求'
+ value: 'PatentImage' ,
+ label:'附图'
+ value: 'PatentInstruction',
+ label: '说明书文本'
+ value: 'PatentFamily',
+ label: '同族专利'
+ value: 'PatentStatus',
+ label: '事务数据'
+ value: 'PatentPDF',
+ label: '说明书'
+ positionList:[
+ label:'tab展示',
+ label:'上边展示',
+ label:'下边展示',
+ label:'左边展示',
+ value:4
+ label:'右边展示',
+ value:5
+ patent:{},
+ applicationNo(val){
+ if(this.fix!=true){
+ fix(val){
+ this.$emit('on-change',val)
+ await this.getPatent(this.applicationNo)
+ this.changePageTitle()
+ //修改title
+ changePageTitle() {
+ document.title = `${this.patent.publicNo} ${this.patent.name || ''}`
+ //解除定住,可以切换
+ qx(){
+ this.fix=false
+ //定住不能切换
+ gd(){
+ this.fix=true
+ //切换显示内容
+ handleSelect(index) {
+ // if(index == this.activeMenu2){
+ // this.activeMenu2 = ''
+ // this.radio = 1
+ // this.changePosition(this.radio)
+ this.activeMenu = index
+ this.componentName = index
+ //获取专利信息
+ async getPatent(applicationNo){
+ var params =this.$s.getSession('params').params
+ params.CurrentQuery = "(AN="+ applicationNo +")"
+ params.PageNum = 1
+ // params.retrieveRecordId = null
+ await this.$api.patentSelectImport(params).then(response=>{
+ this.patent = response.data.records[0]
+.patent-articles {
+ height: 100% !important;
+ padding: 0 !important;
+ .patent-articles-menu {
+ .el-menu-item.is-active {
+ background: #ecf5ff !important;
+ color: #409EFF!important;
+ .patent-articles-title {
+ height: 100px !important;
+ .el-link {
+ .patent-articles-title-box {
+ font-size: 20px;
+ .patent-articles-content {
+ background: #fff;
+ padding: 0;
+ height: 100%;
+ .patent-articles-content-left {
+ float: left;
+ overflow-y: auto;
+ overflow-x: hidden;
+ .patent-articles-content-right {
+ width: 300px;
+ border-left: 1px solid #e6e6e6;
+ float: right;
+ .el-header {
+ height: 50px !important;
+ position: relative !important;
+ .el-main {
+ padding: 0 12px !important;
+ .el-container, .el-main {
+ .patent-articles-option {
+ left: 50px;
+ .el-tabs {
+ margin-top: 9px;
+ .el-tabs__header {
+ margin-bottom: 0 !important;
@@ -0,0 +1,140 @@
+ <div style="height:calc(100% - 50px)">
+ <div style="background:white;display:flex; justify-content:flex-end;align-items: center;">
+ <el-button type="primary" class="margin-right_10" @click="importToProject">导入到专题库</el-button>
+ <el-switch
+ :disabled="!$permission('/workspace/details/comparison')"
+ inactive-text="对比"
+ active-color="#00BFFF"
+ inactive-color="#D3D3D3">
+ </el-switch>
+ <PatentList @on-change="onChange" :ban='ban'/>
+ <div class="box" ref="box" v-dragControllerDiv>
+ <div class="left" :style="{width:width}"><!--左侧div内容-->
+ <PatentDetail :applicationNo="applicationNo" @on-change='changefix' />
+ <div class="resize" title="收缩侧边栏" v-show="width!='100%'">⋮</div>
+ <div class="mid" v-show="width!='100%'" :style="{width:width}"><!--右侧div内容-->
+ <Project-List-Dialog ref="projectListDialog"></Project-List-Dialog>
+import PatentDetail from './patentDetail.vue';
+import PatentList from './PatentList.vue'
+import ProjectListDialog from '../components/projectListDialog.vue'
+ PatentDetail,
+ PatentList,
+ ProjectListDialog
+ ban:0,
+ value: false,
+ width:'100%',
+ applicationNo:this.$route.query.applicationNo || null,
+ patentNo:this.$route.query.patentNo || null,
+ if(val==true){
+ this.width='50%'
+ this.width='100%'
+ contrastList() {
+ return this.$store.state.report.contrastList
+ this.getContrastList(this.patentNo)
+ //导入到专题库
+ importToProject(){
+ var form = {
+ conditions:"(AN="+ this.applicationNo +")",
+ DBType:params.DBType,
+ orderBy:params.OrderBy,
+ orderByType:params.OrderByType,
+ startNumber:1,
+ endNumber:0,
+ isAddPatentNos:[this.applicationNo],
+ isDeletePatentNos:[],
+ projectId:this.$s.getSession('params').projectId
+ this.$refs.projectListDialog.open(form)
+ //修改定住
+ changefix(){
+ //切换专利
+ async onChange(val){
+ this.applicationNo = val.applicationNo
+ this.patentNo = val.patentNo
+ this.changePageTitle(val.publicNo,val.name)
+ this.getContrastList(val.patentNo)
+ await this.$router.push({
+ path: '/search/patentDetail',
+ applicationNo: val.applicationNo,
+ patentNo: val.patentNo,
+ // 查询批注
+ getContrastList(val) {
+ if (val) {
+ var index = this.contrastList.findIndex(item => {
+ item.patentNo == val
+ if (index != -1) {
+ patentNo: val?val:this.patentNo,
+ id: this.projectId,
+ createFrom:this.projectId?1:0
+ this.$api.scratchWordsQuery(params).then(response => {
+ if (response.code==200) {
+ if (this.contrastList.length > 0) {
+ var a = this.contrastList.filter(item => {
+ return item.patentNo != params.patentNo
+ }).concat(response.data)
+ var a = response.data
+ this.$store.commit('SET_PATENT_CONTRAST', a)
+ changePageTitle(publicNo,name) {
+ document.title = `${publicNo} ${name || ''}`
+@import '@/assets/css/activeDiv.scss';
@@ -0,0 +1,145 @@
+ <div class="head">
+ <div class="menu">
+ <span class="type">
+ <el-radio-group v-model="DBType">
+ <el-link :type="isComponent === 'FormSearch' ? 'primary' : undefined" @click="changeComponent('FormSearch')" >表格检索</el-link>
+ <el-link :type="isComponent === 'customSearch' ? 'primary' : undefined" @click="changeComponent('customSearch')">高级检索</el-link>
+ <el-link :type="isComponent === 'AdvancedSearch' ? 'primary' : undefined" @click="changeComponent('AdvancedSearch')">专家检索</el-link>
+ <span class="icon">
+ <i class="iconfont icon-shouye" @click="openHistory"></i>
+ <div style="width:70%;margin:0 auto;">
+ <component :is='isComponent' @search="search" :countryList="countryList" :DBType="DBType"></component>
+ <el-dialog title="检索历史" :visible.sync="dialogVisible" width="1200px" :close-on-click-modal="false">
+ <searchHistory ref="searchHistory" :reportId="reportId"></searchHistory>
+import FormSearch from './FormSearch.vue';
+import AdvancedSearch from './AdvancedSearch.vue';
+import customSearch from './customSearch.vue'
+import searchHistory from './components/search_history.vue';
+ FormSearch,
+ AdvancedSearch,
+ customSearch,
+ searchHistory
+ isComponent:'FormSearch',
+ countryList:[],
+ DBType:"CN",
+ this.getCountry()
+ //获取国家
+ getCountry(){
+ var str = 'AD 安道尔 AE 阿拉伯联合酋长国 AF 阿富汗 AG 安提瓜和巴布达 AI 安圭拉岛 AL 阿尔巴尼亚 AM 亚'
+ +'美尼亚 AN 荷属安的列斯群岛 AO 安哥拉 AP 非洲地区工业产权组织(ARIPO) AR 阿根廷 AT 奥地'
+ +'利 AU 澳大利亚 AW 阿鲁巴岛(荷) BA 波斯尼亚和黑塞哥维那(波黑) BB 巴巴多斯 BD 孟加拉 AZ'
+ +'阿塞拜疆 BE 比利时 BF 布基纳法索 BG 保加利亚 BH 巴林 BI 布隆迪 BJ 贝宁 BM 百慕大 BN 文'
+ +'莱 BO 玻利维亚 BR 巴西 BS 巴哈马 BT 不丹 BV 布韦岛 BW 博茨瓦那 BX 比、荷、卢经济联盟商'
+ +'标局及外观设计局 BY 白俄罗斯 BZ 伯利兹 CA 加拿大 CD 刚果民主共和国 CF 中非共和国 CG 刚'
+ +'果 CH 瑞士 CI 科特迪瓦 CK 库克群岛 CL 智利 CM 喀麦隆 CN 中国 CO 哥伦比亚 CR 哥斯达黎'
+ +'加 CU 古巴 CV 佛得角 CY 塞浦路斯 CZ 捷克共和国 DE 德国 DJ 吉布提 DK 丹麦 DM 多米尼克'
+ +'DO 多米尼加共和国 DZ 阿尔及利亚 EA 欧亚专利组织(EAPO) EC 厄瓜多尔 EE 爱沙尼亚 EG 埃'
+ +'及 EH 西撒哈拉 EM 内部市场协调局(OHIM) EP 欧洲专利局(EPO) ER 厄立特里亚 ES 西班牙 ET 埃'
+ +'塞俄比亚 FI 芬兰 FJ 斐济 FK 福克兰群岛(马尔维纳斯群岛) FO 法罗群岛 FR 法国 GA 加蓬 GB 英'
+ +'国 GD 格林纳达 GH 加纳 GC 海湾地区阿拉伯国家合作委员会专利局(GCC) GE 格鲁吉亚 GI 直布罗'
+ +'陀 GL 格陵兰 GM 冈比亚 GN 几内亚 GQ 赤道几内亚 GR 希腊 GS 南乔治亚和南三维治群岛 GT'
+ +'危地马拉 GW 几内亚比绍 GY 圭亚那 HK 中华人民共和国香港特别行政区 HN 洪都拉斯 HR 克罗地'
+ +'亚 HT 海地 HU 匈牙利 WO 世界知识产权组织国际局(WIPO) ID 印度尼西亚 IE 爱尔兰 IL 以色'
+ +'列 IN 印度 IQ 伊拉克 IR 伊朗,伊斯兰共和国'
+ var regx = new RegExp("[A-Z]{2} ", "g")
+ var a = str.split(regx)
+ a.splice(0,1)
+ var b = str.match(regx)
+ b.forEach((item,index)=>{
+ this.countryList.push({
+ label:a[index],
+ value:item
+ changeComponent(val){
+ this.isComponent = val
+ this.$router.push({
+ condition:val,
+ DBType:this.DBType,
+ // window.open(router.href, '_blank');
+ openHistory(){
+ // this.dialogVisible = true
+ // this.$refs.searchHistory.open()
+ path: '/searchHistory',
+.head{
+ background: rgb(223 223 223);
+ line-height: 50px;
+.menu{
+ width:70%;
+ margin:0 auto;
+ .el-link{
+ .type{
+ left:0;
+ top:0;
+ .icon{
+ right:0;
+ font-size:24px;
@@ -0,0 +1,504 @@
+ <div style="background: white; height: 100%">
+ <el-container style="padding: 0 20px">
+ <el-header
+ class="workspace-content-container-header"
+ style="display: flex; justify-content: space-between"
+ <el-button-group class="margin-left_10">
+ <el-tooltip v-for="item in viewList" class="item" effect="dark" :content="item.title" placement="top">
+ <el-button @click="handleChangeView(item)" size="small" :type="viewSelected === item.value ? 'primary' : ''" :icon="item.btn"></el-button>
+ </el-button-group>
+ <span v-if="selectedTotal>0" >
+ 已勾选 <b>{{ selectedTotal }}</b> 条
+ <div style="max-width:calc(100% - 620px)">
+ <p><span>条件:</span>{{ condition }}</p>
+ <el-button type="primary" size="small" @click="importToProject">导入到专题库</el-button>
+ <el-button size="small" type="warning" @click="handleFieldManage">显示栏位管理</el-button>
+ <el-popover placement="bottom" title="" width="220" trigger="click">
+ <el-main class="patent-fast-edit-popover" v-loading="selectNumberLoading">
+ <div class="btn" @click="handleSelectNumber(0)">本页选择</div>
+ <div class="btn" @click="handleSelectNumber(1)">全部选择</div>
+ <div class="select-number">
+ <span>从</span>
+ <el-input size="mini" v-model="queryParams.startNumber" @change="change1"></el-input>
+ <span>到</span>
+ <el-input size="mini" v-model="queryParams.endNumber" @change="change2"></el-input>
+ <el-button type="text" size="" @click="handleSelectNumber(2)">确定</el-button>
+ <el-button type="info" size="small" class="margin-left_10" slot="reference"> 选择专利<i class="el-icon-arrow-down el-icon--right"></i></el-button>
+ <el-button type="text" size="small" class="margin-left_10" @click="handleCancelSelectNumber">取消选择</el-button>
+ <el-main id="patent-list-container" v-loading="loading">
+ <component
+ ref="patentViewList"
+ :is="viewSelected"
+ @select-change="handleSelect"
+ :selected.sync="queryParams.selected"
+ :patentNoList.sync="patentNoList"
+ :view-field="patentViewField"
+ @on-sort="handleSort"
+ @addSelect="getChoosePatentNo"
+ ></component>
+ <el-footer class="workspace-content-patent-page foot-total">
+ <span class="total">共{{ total }}条</span>
+ layout="total, sizes, prev, pager, next, jumper"
+ :page-sizes="pageSizes"
+ :page-count="getPageCount()"
+ </el-footer>
+ <patent-view-field @reset="getPatentViewField(true)" @update="updatePatentViewField" ref="patentViewField"/>
+import PatentViewField from "../dialog/PatentViewField.vue";
+import PatentTableListView from "../view/Table";
+import PatentAbstractListView from "../view/Abstract";
+import PatentPictureListView from "../view/Picture";
+import ProjectListDialog from "./components/projectListDialog.vue";
+ PatentViewField,
+ PatentTableListView,
+ PatentAbstractListView,
+ PatentPictureListView,
+ ProjectListDialog,
+ props: ["condition", "DBType",'reportId','retrieveRecordId'],
+ pageSizes:[10, 20, 30, 40, 50],
+ viewSelected: "patent-table-list-view",
+ viewList: [
+ value: "patent-table-list-view",
+ title: "表格视图",
+ btn: "el-icon-tickets",
+ value: "patent-abstract-list-view",
+ title: "摘要视图",
+ btn: "el-icon-news",
+ value: "patent-picture-list-view",
+ title: "图片视图",
+ btn: "el-icon-picture-outline",
+ patentNoList: [],
+ selected: [],
+ size: 10,
+ isAdd: [],
+ isDelete: [],
+ OrderBy:"AD",
+ OrderByType:"DESC",
+ retrieveRecordId:this.retrieveRecordId
+ patentViewField: [],
+ selectNumberLoading: false,
+ selectedTotal:0,
+ startNumber: 1,
+ endNumber: 0,
+ quickSelect: false,
+ quickSelectArr:[],
+ records() {
+ return this.$store.state.patent.records;
+ // console.log(this.$s.getSession('queryParams'),this.queryParams)
+ if(this.$s.getSession('queryParams')&&this.$s.getSession('queryParams').params.retrieveRecordId){
+ this.queryParams.retrieveRecordId = this.$s.getSession('queryParams').params.retrieveRecordId
+ this.getPatentViewField();
+ importToProject() {
+ conditions:this.condition,
+ orderBy:this.queryParams.OrderBy,
+ orderByType:this.queryParams.OrderByType,
+ startNumber:this.selectedTotal>0?this.startNumber:1,
+ endNumber:this.selectedTotal>0?this.endNumber:this.total,
+ isAddPatentNos:this.queryParams.isAdd,
+ isDeletePatentNos:this.queryParams.isDelete,
+ reportId:this.reportId
+ this.$refs.projectListDialog.open(form);
+ this.patentNoList = []
+ if(this.quickSelect){
+ this.commonSwitch()
+ if(this.queryParams.isAdd.length>0){
+ this.getHaveChoose([])
+ //获取最大页数
+ getPageCount(){
+ var a = Math.ceil(Number(this.total)/Number(this.queryParams.size))
+ return a>200?200:a
+ //开始条数校验
+ change1(val) {
+ if (!isNaN(val)) {
+ if (!val || val <= 0) {
+ this.queryParams.startNumber=1
+ if (this.queryParams.startNumber>this.total) {
+ this.queryParams.startNumber=this.total
+ //结束条数校验
+ change2(val) {
+ this.queryParams.endNumber = this.total
+ if (this.queryParams.endNumber > this.total) {
+ }else {
+ this.queryParams.endNumber=this.total
+ //查询专利
+ async getList() {
+ let queryParams = JSON.parse(JSON.stringify(this.queryParams));
+ var params = {
+ CurrentQuery: this.condition, //检索式
+ DBType: this.DBType, //”CN”或”WD”,表示检索中文库或世界库
+ PageNum: this.queryParams.current, //页码(最多 200 页)
+ RowCount: this.queryParams.size, //每页返回条数(最多 50 条)
+ OrderBy: this.queryParams.OrderBy, //排序字段:“AD”,“PD”,“GD”, “ID”(检索引擎自生成字段,排序顺序固定)
+ OrderByType: this.queryParams.OrderByType, //排序方式:“ASC”,“DESC” 即正序倒序
+ retrieveRecordId:this.queryParams.retrieveRecordId
+ // console.log(this.$s.getSession('retrieveRecordId'),)
+ queryParams.params = params;
+ queryParams.reportId = this.reportId
+ this.$store.commit("SET_PATENT_PARAMS", queryParams);
+ this.$store.commit("SET_PATENT_RECORDS", []);
+ this.loading = true;
+ await this.$api.patentSelectImport(params).then((response) => {
+ if (response.code == 200) {
+ this.total = response.data.total;
+ this.$set(this.queryParams,'startNumber',this.endNumber > 0 ? this.startNumber : 1)
+ this.$set(this.queryParams,'endNumber',this.endNumber > 0 ? this.endNumber : this.total)
+ let records = response.data.records;
+ this.tableData = records
+ params.retrieveRecordId = response.data.retrieveRecordId
+ this.queryParams.retrieveRecordId = response.data.retrieveRecordId
+ this.$s.setSession('queryParams',queryParams)
+ this.$store.commit("SET_PATENT_RECORDS", records);
+ this.loading = false;
+ .catch((error) => {
+ handleSelect(data) {
+ // this.queryParams.selected = data
+ async handleChangeView(item) {
+ // console.log(item)
+ if(this.viewSelected==item.value){
+ if(this.viewSelected!="patent-picture-list-view" && item.value!="patent-picture-list-view"){
+ this.queryParams.size = 10;
+ this.viewSelected = item.value;
+ }else if(this.viewSelected=="patent-picture-list-view" || item.value=="patent-picture-list-view"){
+ if (item.value === "patent-picture-list-view") {
+ this.$set(this.queryParams, "size", 20);
+ this.getList();
+return
+ if (this.viewSelected === "patent-picture-list-view") {
+ // await this.getPatentViewField();
+ async handleFieldManage() {
+ // await this.getPatentViewField()
+ this.$refs.patentViewField.open(
+ this.patentViewField,
+ this.queryParams.retrieveRecordId,
+ this.viewSelected
+ async getPatentViewField(refresh) {
+ var arr = ['标签','简单同族','Inpadoc同族','扩展同族','[标]权利人','[标]申请人','引用专利数量','被引用数量','权利要求数']
+ project:this.queryParams.retrieveRecordId,
+ type: "list",
+ view: this.viewSelected,
+ refresh: refresh,
+ const { data } = await this.$api.getUserSettingField(params);
+ this.patentViewField = data.filter(item=>{ return arr.indexOf(item.name) == -1});
+ updatePatentViewField(data) {
+ this.patentViewField = data;
+ //快速选择
+ handleSelectNumber(type) {
+ switch (type) {
+ case 0: //本页选择
+ this.patentNoList = [...new Set(this.patentNoList.concat(this.$store.state.patent.records.map((item) => item.applicationNo))),];
+ this.queryParams.isAdd = [...new Set(this.queryParams.isAdd.concat(this.$store.state.patent.records.map((item) => item.applicationNo))),];
+ case 1: //全部选择
+ this.startNumber = 1;
+ this.endNumber = this.total;
+ this.$set(this.queryParams,'startNumber',1)
+ this.$set(this.queryParams,'endNumber',this.total)
+ case 2: //范围选择
+ this.queryParams.isDelete = [];
+ this.queryParams.isAdd = [];
+ this.patentNoList = [];
+ this.quickSelect = true;
+ if (type == 2) {
+ if (!Number(this.queryParams.startNumber) ||!Number(this.queryParams.endNumber)) {
+ this.startNumber = this.queryParams.startNumber;
+ this.endNumber = this.queryParams.endNumber;
+ this.commonSwitch();
+ this.getSelectedTotal()
+ //每页全部选择或范围选择的专利
+ commonSwitch() {
+ var arr = []
+ if (this.queryParams.size * this.queryParams.current >= this.startNumber) {
+ if (this.queryParams.size * this.queryParams.current >=this.endNumber) {
+ if (this.queryParams.size * (this.queryParams.current - 1) + 1 <=this.startNumber) {
+ var a =this.startNumber -(this.queryParams.size * (this.queryParams.current - 1) + 1);
+ var b =this.endNumber -(this.queryParams.size * (this.queryParams.current - 1) + 1);
+ for (var y = a; y <= b; y++) {
+ arr.push(this.tableData[y].applicationNo)
+ var a =this.queryParams.size * (this.queryParams.current - 1) +1 -(this.queryParams.size * (this.queryParams.current - 1) + 1);
+ var b = this.endNumber -(this.queryParams.size * (this.queryParams.current - 1) + 1);
+ var b =this.queryParams.size * this.queryParams.current -(this.queryParams.size * (this.queryParams.current - 1) + 1);
+ // this.patentNoList = JSON.parse(JSON.stringify(arr))
+ this.quickSelectArr = JSON.parse(JSON.stringify(arr))
+ this.getHaveChoose(arr)
+ //获取已选择的专利
+ getHaveChoose(arr){
+ var arr1 = [...new Set(arr.concat(this.queryParams.isAdd))]
+ this.patentNoList = arr1.filter((x) => this.queryParams.isDelete.indexOf(x)==-1)
+ //获取已选择的总条数
+ getSelectedTotal(){
+ this.selectedTotal = Number(this.endNumber) - Number(this.startNumber) + 1 + Number(this.queryParams.isAdd.length) - Number(this.queryParams.isDelete.length)
+ //获取手动选择的专利
+ getChoosePatentNo(patentNo){
+ var index = this.queryParams.isDelete.findIndex(item=>{
+ return item == patentNo
+ if(index == -1){
+ var index2 = this.quickSelectArr.findIndex(item=>{
+ if(index2==-1){
+ this.setIsAdd(patentNo)
+ this.queryParams.isDelete.push(patentNo)
+ this.queryParams.isDelete.splice(index,1)
+ //是否加入isAdd里面
+ setIsAdd(patentNo){
+ var index = this.queryParams.isAdd.findIndex(item=>{
+ if(index!=-1){
+ this.queryParams.isAdd.splice(index,1)
+ this.queryParams.isAdd.push(patentNo)
+ //取消选择
+ handleCancelSelectNumber() {
+ this.queryParams.isAdd = []
+ this.queryParams.isDelete = []
+ this.startNumber = 1
+ this.queryParams.startNumber = 1
+ this.endNumber = 0
+ this.quickSelect = false
+ this.selectedTotal = 0
+ //排序
+ handleSort(data) {
+ console.log(data);
+ const o = {
+ publicAccreditDate: "GD",
+ publicDate: "PD",
+ applicationDate: "AD",
+ this.queryParams.OrderBy = o[data.prop];
+ this.queryParams.OrderByType = data.order.toUpperCase();
+.total{
+ margin-right: 10px;
+ font-weight: 400;
+ color: #606266;
+ font-size: 13px;
+ min-width: 35.5px;
+ height: 28px;
+ line-height: 28px;
+ vertical-align: top;
+ box-sizing: border-box;
+.foot-total{
+.patent-fast-edit-popover {
+ .btn {
+ color: #000;
+ &:hover {
+ background: #adadad;
+ color: #fff;
+ .disabled {
+ cursor: not-allowed !important;
+ .bottom {
+ text-align: right;
+ font-size: 18px;
+ .el-divider--horizontal {
+ margin: 10px 0 !important;
+ .select-number {
+ .el-input {
+ width: 70px;
+ span {
+ padding: 0 3px;
@@ -0,0 +1,41 @@
+ <search-Result :condition="condition" :DBType="DBType" :reportId="reportId" :retrieveRecordId="retrieveRecordId"></search-Result>
+import searchResult from './searchResult.vue';
+ searchResult
+ condition(){
+ return this.$route.query.condition
+ return this.$route.query.DBType
+ retrieveRecordId(){
+ return this.$route.query.retrieveRecordId
@@ -1,18 +1,17 @@
<template>
<div class="import-patent">
<el-container class="import-patent">
- <el-main class="import-patent-main">
+ <el-aside class="import-patent-main" style="width:450px">
<el-container class="import-patent-action">
<el-main class="import-patent-action-main" v-loading="loading">
- <el-form :model="form">
+ <el-form :model="form" >
<el-form-item label="数据来源:">
- <select style="width:390px;border:0;outline:none" name="" id="" v-model="sourceId">
+ <select style="width:300px;border:0;outline:none" name="" id="" v-model="sourceId">
<option value="">请选择数据来源</option>
<option v-for="item in customField.dataType" :value="item.id">{{item.name}}</option>
</select>
<el-divider ></el-divider>
<el-form-item label="选择需要上传的专利信息导入文件">
<el-upload class="upload-file" drag action="#" :auto-upload="false" :show-file-list="false" :on-change="onChange">
<i :class="!form.file ? 'el-icon-upload' : 'el-icon-refresh'"></i>
@@ -24,6 +23,9 @@
</el-main>
</el-container>
<systemTask ref="systemTask" :form="1" :reportId="reportId"></systemTask>
@@ -31,7 +33,8 @@
</template>
<script>
-import systemTask from './systemTask.vue'
+// import systemTask from './systemTask.vue'
+import systemTask from '@/views/components/task/index.vue'
props:['reportId'],
components: {
@@ -48,7 +51,6 @@ export default {
computed: {},
this.getCustomField()
-console.log(this.reportId);
getCustomField() {
@@ -148,6 +150,7 @@ console.log(this.reportId);
.import-patent {
height: 100%;
.import-patent-main {
padding: 0;
@@ -5,7 +5,7 @@
-import importPatent from './components/importPatent.vue'
+import importPatent from './importPatent.vue'
importPatent
@@ -0,0 +1,92 @@
+import { downLoad2, getFileName } from "@/utils";
+import { mapGetters } from "vuex";
+export const common = {
+ props: ['form','reportId','tableHeight','review'],
+ // statusObj: {
+ // 0: '等待中',
+ // 1: '进行中',
+ // 2: '成功',
+ // 3: '失败',
+ // 4: '等待下一次执行',
+ // 5: '已取消',
+ // 6: '暂停',
+ // 7: '待取消',
+ // 8: '待暂停'
+ statusObj: {
+ 0: '等待中',
+ 1: '进行中',
+ 2: '已完成',
+ 4: '已暂停',
+ 5: '已取消',
+ taskType:{
+ 0: '普通任务',
+ 1: '定时任务',
+ taskType2:{
+ 1: 'Excel导入',
+ 2: '导出',
+ 3: '欧专局导入',
+ 4: '专利之星导入',
+ ...mapGetters(['webSocket']),
+ userinfo() {
+ return this.$store.state.admin.userinfo
+ reportId(val){
+ this.queryParams.reportId = val
+ review(val){
+ if(this.form == 1){
+ this.queryParams.taskType2 = '1'
+ }else if(this.form == 2){
+ this.queryParams.taskType2 = '2'
+ handleDownload(row) {
+ downLoad2(row.url)
+ // 实时进度取消
+ cancel(row) {
+ let task = {
+ taskId: row.id,
+ // state:7,//7为待取消
+ this.$api.cancelTask(task).then(res => {
+ this.$message.success('任务已取消')
+ if(this.taskData){
+ var index = this.taskData.findIndex(item=>{return item.id == row.id})
+ this.taskData.splice(i,1)
+ row.status = 5
+ // this.$message.error(error.message)
+ this.loadingCancel=false
@@ -0,0 +1,230 @@
+ <div style="padding:5px 10px;">
+ <el-table :data="taskData" border header-row-class-name="custom-table-header" :maxHeight="tableHeight - 150" v-loading="loadingCancel" element-loading-text = "请耐心等待,数据正在加载中...">
+ <el-table-column label="任务名称" prop="taskName" align="center" show-overflow-tooltip></el-table-column>
+ <!-- <el-table-column label="任务数量" prop="total" align="center" show-overflow-tooltip>
+ <span>{{ scope.row.total?scope.row.total:scope.row.allNum }}</span>
+ </el-table-column> -->
+ <!-- <el-table-column label="当前下标" prop="index" align="center" show-overflow-tooltip>
+ <span>{{ scope.row.index?scope.row.index:scope.row.successNum }}</span>
+ <el-table-column label="实时进度" align="center" min-width="200px" show-overflow-tooltip>
+ <div style="display:flex">
+ <span style="width:100%"><el-progress :text-inside="true" :stroke-width="20" :percentage="scope.row.percentage?scope.row.percentage:Math.floor(Number(scope.row.successNum)/Number(scope.row.total)*100)" :color="customColors"></el-progress></span>
+ <span ><span >{{ scope.row.successNum }}/</span><span>{{ scope.row.total }}</span></span>
+ <el-table-column label="当前状态" align="center" min-width="100px" show-overflow-tooltip>
+ <span>{{ statusObj[scope.row.status] }}</span>
+ <el-table-column label="操作" align="center" width="120" show-overflow-tooltip v-if="form === 2">
+ <div class="operate">
+ <span v-if="!scope.row.url">等待中</span>
+ <el-link v-else type="primary" @click.native="handleDownload(scope.row)">
+ <el-tooltip class="item" effect="dark" content="下载" placement="top">
+ <i class="iconfont icon-xiazai"></i>
+ <el-link class="margin-left_10" type="primary" @click="handleCancelZan(scope.row)" v-if="scope.row.status==4">
+ <el-tooltip class="item" effect="dark" content="继续" placement="top">
+ <i class="iconfont icon-zanting"></i>
+ <el-link class="margin-left_10" type="primary" @click="handleCancelZan(scope.row)" v-if="scope.row.status==1">
+ <el-tooltip class="item" effect="dark" content="暂停" placement="top">
+ <i class="iconfont icon-zanting1"></i>
+ <el-table-column label="操作" align="center" width="150" show-overflow-tooltip v-else>
+ <!-- <p v-if="scope.row.status!=5"> -->
+ <!-- <span class="loadCss" type="danger" @click="handleCancelZan(scope.row)" v-else-if="scope.row.taskDetailState==8" >暂停中</span> -->
+ <el-link class="margin-left_10" type="danger" @click="cancel(scope.row)" v-if="scope.row.status!=2">
+ <el-tooltip class="item" effect="dark" content="取消" placement="top">
+ <i class="iconfont icon-quxiaorenwu1"></i>
+ <!-- </p> -->
+ <!-- <p class="margin-left_10" type="danger" v-else>已取消</p> -->
+import { common } from './mixins';
+ mixins:[common],
+ taskData:[],
+ loadingCancel:false,
+ customColors: [
+ {color: '#f56c6c', percentage: 20},
+ {color: '#e6a23c', percentage: 40},
+ {color: '#5cb87a', percentage: 60},
+ {color: '#1989fa', percentage: 80},
+ {color: '#6f7ad3', percentage: 100}
+ taskStatus:[0,1,4],
+ reportId:this.reportId?this.reportId:null
+ this.initTask()
+ initTask() {
+ var webSocket = this.webSocket
+ webSocket.onmessage = (e) => {
+ const { code, data, message } = JSON.parse(e.data)
+ console.log({ code, data, message });
+ if (code === 903 || code === 904) {
+ const index = this.taskData.findIndex(item=>{return item.id == data.taskId})
+ // const index = this.taskData.findIndex(item=>{return item.id == data.id})
+ if (index === -1) {
+ if(data.reportId == this.reportId){
+ // this.taskData.unshift(data)
+ var arr = this.taskData[index]
+ arr.index = data.index
+ arr.percentage = data.percentage
+ arr.successNum = data.index
+ arr.status = data.taskStatus
+ this.$set(this.taskData, index, arr)
+ if (data.complete) {
+ if(data.taskType!=2){
+ this.$message.success(`导入任务完成`)
+ for(var i = 0;i<this.taskData.length;i++){
+ if(this.taskData[i].complete==true){
+ this.$message.success(`导出任务完成`)
+ // console.log(this.form)
+ } else if (code === 803 || code === 804) {
+ this.$message.error(message)
+ this.loadingCancel = true
+ this.$api.getTasks(this.queryParams).then(response=>{
+ this.taskData = response.data.records
+ this.loadingCancel = false
+ // 实时进度暂停继续
+ handleCancelZan(row) {
+ // state:0
+ if (row.status==4) {
+ // task.state = 0
+ this.$api.resumeJobTask(task).then(res => {
+ this.$message.success('继续执行')
+ row.status = res.data
+ this.$message.error(error.message)
+ } else if (row.status==1) {
+ // task.state = 8
+ this.$api.pauseJobTask(task).then(res => {
+ this.$message.success('已暂停')
+ row.status = 4
+.operate{
+ font-size: 24px;
+.pagination {
+ margin: 20px 0;
@@ -0,0 +1,370 @@
+ <el-form inline>
+ <el-form-item label="创建人">
+ <el-input v-model="queryParams.createName" size="small" placeholder="请输入创建人名称"></el-input>
+ <el-form-item label="任务类型" v-if="form != 1 && form != 2">
+ <!-- <el-input v-model.trim="queryParams.taskType" size="small" placeholder="请输入任务类型"></el-input> -->
+ <el-select v-model="queryParams.taskType" size="small" clearable placeholder="请选择任务类型">
+ v-for="item in Object.entries(taskType)"
+ :key="item[0]"
+ :label="item[1]"
+ :value="item[0]">
+ <el-form-item label="导入类型" v-if="form != 1 && form != 2">
+ <el-select v-model="queryParams.taskType2" size="small" clearable placeholder="请选择任务类型">
+ v-for="item in Object.entries(taskType2)"
+ <el-form-item>
+ <el-button size="small" type="" @click="getList2">搜索</el-button>
+ <el-table v-loading="loading" :data="tableData" border header-row-class-name="custom-table-header" @sort-change="sortChange" :maxHeight="tableHeight - 220">
+ <el-table-column label="#" type="index" align="center" width="55">
+ <span>{{ (scope.$index + 1) + ((queryParams.current - 1) * queryParams.size) }}</span>
+ <el-table-column label="创建时间" prop="createTime" align="center" sortable="custom" show-overflow-tooltip>
+ <span>{{ scope.row.createTime }}</span>
+ <!-- <el-table-column label="开始时间" align="center" show-overflow-tooltip>
+ <span >{{ $d(scope.row.startTime) }}</span>
+ <el-table-column label="结束时间" align="center" show-overflow-tooltip>
+ <span>{{ $d(scope.row.endTime) }}</span>
+ <el-table-column label="导入方式" align="center" show-overflow-tooltip>
+ <span>{{taskType2[ scope.row.type] }}</span>
+ <el-table-column label="任务类型" v-if="form !==1 && form !==2" align="center" show-overflow-tooltip>
+ <span v-if="scope.row.taskType">{{ taskType[ scope.row.taskType] }}</span>
+ <span v-else>普通任务</span>
+ <el-table-column label="任务状态" align="center" show-overflow-tooltip>
+ <span v-if="scope.row.taskType == 1 && scope.row.status==2">等待下一次执行</span>
+ <span v-else>{{ statusObj[scope.row.status] }}</span>
+ <!-- <span v-else>{{ statusObj[scope.row.taskState] }}</span> -->
+ <el-table-column prop="createName" label="创建人" align="center" width="120" show-overflow-tooltip></el-table-column>
+ <el-table-column v-if="form !=1 && form !=2" label="定时周期" prop="dateType" align="center" show-overflow-tooltip>
+ <span v-if="scope.row.taskType == 1">{{dateType.find(item=> item.value == getType(scope.row.crons)).label }}</span>
+ <span v-else></span>
+ <!-- <el-table-column v-if="form==9 || form==8" label="定时时间" prop="dates" align="center" show-overflow-tooltip></el-table-column> -->
+ <el-table-column v-if="form!=1 && form!=2" label="最近更新时间" prop="modifiedTime" align="center" sortable="custom" show-overflow-tooltip>
+ <span>{{ $d(scope.row.modifiedTime) }}</span>
+ <el-table-column label="导入情况" align="center" show-overflow-tooltip>
+ <div class="log">
+ <p>成功{{ scope.row.trueSuccessNum }}条</p>
+ <p>失败{{ scope.row.defaultNum }}条</p>
+ <el-table-column label="操作" align="center" width="150" show-overflow-tooltip>
+ <template slot-scope="scope" >
+ <el-link type="primary" @click.native="handleDownload(scope.row)" v-if="$permission('/workspace/common/taskDownload') && ((scope.row.type == 1 || scope.row.type == 2) && (scope.row.status !== 0 || scope.row.status !== 1))">
+ <el-link class="margin-left_10" type="primary" @click="handleSuspend(scope.row)" v-if="scope.row.status==1 || scope.row.status==4">
+ <i class="iconfont icon-zanting1" v-if="scope.row.status==1"></i>
+ <el-tooltip class="item" type="primary" effect="dark" content="继续" placement="top">
+ <i class="iconfont icon-zanting" v-if="scope.row.status==4"></i>
+ <el-link class="margin-left_10" type="primary" v-if="scope.row.taskType == 1" @click="updateLog(scope.row)">
+ <el-tooltip class="item" effect="dark" content="更新记录" placement="top">
+ <i class="iconfont icon-banbengengxinjilu" style="font-size:18px"></i>
+ <el-link class="margin-left_10" type="danger" @click.native="cancel(scope.row)" v-if="(scope.row.status!=2 && scope.row.status!=5) || scope.row.taskType == 1" >
+ <!-- <div v-else class="operate">
+ <el-link class="margin-left_10" type="danger" @click.native="handleDelete(scope.row)">
+ <i class="iconfont icon-banbengengxinjilu"></i>
+ <div class="pagination">
+ <el-pagination :current-page.sync="queryParams.current" :page-size="queryParams.size" :total="total" @current-change="handleCurrentChange" layout="total, prev, pager, next, jumper" background></el-pagination>
+ <updateLog ref="updateLog"></updateLog>
+import updateLog from "./updateLog.vue";
+ updateLog
+ createName:'',
+ taskStatus:[0,1,2,4,5],
+ orderBy:'createTime',
+ orderType:'desc',
+ total:0,
+ {label:'普通任务',value:0},
+ {label:'定时任务',value:1},
+ dateType: [
+ // computed: {
+ // ...mapGetters(['webSocket', 'userinfo'])
+ getList2(){
+ this.queryParams.current = 1
+ this.total = response.data.total
+ handleCurrentChange(val) {
+ sortChange({ column, prop, order }) {
+ if (!order) {
+ 'descending': 'desc',
+ 'ascending': 'asc',
+ this.queryParams.orderBy = prop
+ this.queryParams.orderType = o[order]
+ handleDelete(row) {
+ this.$confirm('确认删除本条数据吗?', '提示', {
+ this.$api.deleteTask({ id: row.id }).then(response => {
+ // 网站导入表格操作按钮组
+ handleCommand(command,row) {
+ switch (command) {
+ case '1'://暂停/继续
+ this.handleSuspend(row)
+ case '2'://删除
+ this.handleDelete(row)
+ case '3'://取消定时
+ // this.handleTime(row)
+ case '4'://更新日志
+ this.updateLog(row)
+ handleClick(row){
+ //更新日志
+ updateLog(row){
+ this.$refs.updateLog.open(row,this.webSocket)
+ // 网站导入暂停,继续任务操作
+ async handleSuspend(row) {
+ // console.log(this.pause);
+ if (row.status==1) {//暂停pauseJobTask
+ await this.$api.pauseJobTask({taskId: row.id}).then(res => {
+ row.status==4
+ this.$message.success('已成功暂停该任务')
+ } else if (row.status==4) {//继续
+ await this.$api.resumeJobTask({taskId: row.id}).then(res => {
+ row.status==res.data
+ this.$message.success('继续执行该任务')
+ // this.$nextTick(() => {
+ deletes(row) {
+ this.$api.deleteTasks([row.id]).then(res => {
+ if(res.data.length>0){
+ this.$message.error(`${res.data.length}条任务删除失败`)
+ this.$message.success('成功删除该任务')
+ }).catch(err => {
+ this.$message.info('取消删除该任务')
+.log{
+ margin-bottom: 0;
+.loadCss::after{
+ content:'暂停中';
+ color: #F56C6C;
+ left: 0;
+ top: 0;
+ animation: loadName 1s linear infinite;
+// .loadCss::before{
+// content: ' ';
+// position: absolute;
+// left: 0;
+// top: 0;
+// overflow: hidden;
+// }
+.loadCss{
+ color: #ebeef5;
+ margin-left: 10px;
+@keyframes loadName {
+ 0%{
+ width: 0;
+ 100%{
@@ -0,0 +1,133 @@
+ <el-dialog title="更新日志"
+ :visible.sync="visible"
+ width="1000px"
+ append-to-body
+ :before-close="close"
+ :close-on-click-modal="false">
+ <div style="height: 800px;overflow: auto;" infinite-scroll-immediate="false" v-infinite-scroll="load">
+ <el-timeline>
+ <el-timeline-item v-for="item in tableData" :timestamp="item.createTime" placement="top">
+ <el-card>
+ <p>状态:{{ statusObj[item.status] }}</p>
+ <p>总条数:{{ item.total }} </p>
+ <p>成功数量:{{ item.trueSuccessNum }}</p>
+ <p>失败条数:{{ item.defaultNum }}</p>
+ <p>完成时间:{{ $d(item.endTime) }}</p>
+ </el-card>
+ </el-timeline-item>
+ </el-timeline>
+ visible:false,
+ taskId: '',
+ current: 0,
+ orderType:'desc'
+ total: 1,
+ initTask(webSocket1) {
+ webSocket1.onmessage = (e) => {
+ if (this.tableData[0].id==data.id) {
+ var index=this.tableData[0]
+ // this.taskData.push(data)
+ this.tableData[index].status = data.taskStatus
+ // this.$set(this.tableData, index, data)
+ // const index = this.taskData.findIndex(item=>{return item.id == data.id || item.taskId==data.taskId})
+ // if (index === -1) {
+ // // this.taskData.push(data)
+ // this.tableData[index].status = data.taskStatus
+ // // this.$set(this.tableData, index, data)
+ this.tableData[0].status = 2
+ this.$api.queryQrtzTaskLogs(this.queryParams).then(res => {
+ this.total = res.data.total
+ if (res.data.records.length > 0) {
+ this.tableData= this.tableData.concat(res.data.records)
+ open(row, webSocket1) {
+ this.queryParams.taskId = row.id
+ this.initTask(webSocket1)
+ this.load()
+ this.visible = true
+ // 懒加载
+ load() {
+ if (this.total > this.queryParams.current * this.queryParams.size) {
+ this.queryParams.current += 1
+ close() {
+ this.total = 1
+ this.queryParams.current = 0
+ this.visible = false
@@ -1,266 +1,83 @@
- <div class="system-task">
- <el-container>
- <el-header class="position_relative">
+ <div class="system-task">
<div class="header-tabs">
- <el-tabs v-model="activeName" type="card">
- <el-tab-pane label="实时进度" name="0"></el-tab-pane>
- <el-tab-pane label="任务列表" name="1"></el-tab-pane>
+ <el-tabs v-model="activeName" type="card" @tab-click="handleClick">
+ <el-tab-pane label="实时进度" name="0">
+ <component :is='components' v-bind="$attrs" v-if="activeName == 0" :review="review" :tableHeight="height"></component>
+ </el-tab-pane>
+ <el-tab-pane label="任务列表" name="1">
+ <component :is='components' v-bind="$attrs" v-if="activeName == 1" :review="review" :tableHeight="height"></component>
</el-tabs>
- </el-header>
- <el-main class="system-task-main">
- <div v-if="activeName === '0'" key="task1">
- <el-table :data="taskData" border header-row-class-name="custom-table-header">
- <el-table-column v-if="form === 1" label="文件名称" prop="oldName" align="center" show-overflow-tooltip></el-table-column>
- <el-table-column label="任务数量" prop="total" align="center" show-overflow-tooltip></el-table-column>
- <el-table-column label="当前条数" prop="index" align="center" show-overflow-tooltip></el-table-column>
- <el-table-column label="实时进度" align="center" min-width="200px" show-overflow-tooltip>
- <template slot-scope="scope">
- <el-progress :text-inside="true" :stroke-width="20" :percentage="scope.row.percentage" :color="customColors"></el-progress>
- </template>
- </el-table-column>
- <el-table-column v-if="form === 2" label="操作" align="center" width="120" show-overflow-tooltip>
- <span v-if="!scope.row.url">等待中</span>
- <el-link v-else type="primary" @click.native="handleDownload(scope.row)">下载文件</el-link>
- </el-table>
- </div>
- <div v-else key="task2">
- <el-form inline>
- <el-form-item label="创建人">
- <el-input v-model="queryParams.createUserName" size="small" placeholder="请输入创建人名称"></el-input>
- <el-form-item>
- <el-button size="small" type="" @click="getList">搜索</el-button>
- </el-form>
- <el-table v-loading="loading" :data="tableData" border header-row-class-name="custom-table-header">
- <el-table-column v-if="form === 1" label="文件名称" prop="taskName" align="center" show-overflow-tooltip></el-table-column>
- <el-table-column v-else label="#" type="index" align="center" width="55"></el-table-column>
- <el-table-column label="开始时间" align="center" show-overflow-tooltip>
- <span>{{ scope.row.createDate }}</span>
- <el-table-column label="结束时间" align="center" show-overflow-tooltip>
- <span>{{ scope.row.finishTime }}</span>
- <el-table-column label="任务状态" align="center" show-overflow-tooltip>
- <span>{{ statusObj[scope.row.state] }}</span>
- <el-table-column prop="createUserName" label="创建人" align="center" width="120" show-overflow-tooltip></el-table-column>
- <el-table-column label="操作" align="center" width="120" show-overflow-tooltip>
- <template slot-scope="scope" v-if="scope.row.status !== 0">
- <el-link type="primary" @click.native="handleDownload(scope.row)">下载</el-link>
- <el-link class="margin-left_10" type="danger" @click.native="handleDelete(scope.row)" >删除</el-link>
- <div class="pagination">
- <el-pagination :current-page.sync="queryParams.current" :page-size="queryParams.size" :total="total" @current-change="handleCurrentChange" layout="total, prev, pager, next, jumper" background></el-pagination>
- </el-main>
- </el-container>
-import { mapGetters } from "vuex";
-import { downLoad2, getFileName } from "@/utils";
+import realTime from './components/realTime.vue';
+import taskList from './components/todoList.vue';
- // props: {
- // form: Number,
- // },
- props:['form','reportId'],
+ realTime,
+ taskList
- activeName: '0',
- taskData: [],
- loading: false,
- total: 0,
- tableData: [],
- queryParams: {
- // status: null,
- state:0,
- size: 10,
- current: 1,
- // projectName: '',
- // type: 0,
- // order: 'desc',
- // createName: '',
- reportId: 0
- },
- statusObj: {
- 0: '队列中',
- 1: '进行中',
- 2: '成功',
- 3: '失败',
- customColors: [
- {color: '#f56c6c', percentage: 20},
- {color: '#e6a23c', percentage: 40},
- {color: '#5cb87a', percentage: 60},
- {color: '#1989fa', percentage: 80},
- {color: '#6f7ad3', percentage: 100}
- ],
- taskType: {
- 1: '专利导入',
- 2: '专利导出',
- 3: '说明书导入',
- }
- computed: {
- ...mapGetters(['webSocket', 'userinfo'])
- watch:{
- activeName(val){
- if(val==1){
- this.getList()
- }else{
- this.getQueueList()
+ activeName:0,
+ components:'realTime',
+ review:false
- // this.queryParams.type = this.form
- // this.queryParams.reportId = this.reportId
- this.initTask()
+ this.getHeight()
- initTask() {
- if(this.webSocket){
- this.webSocket.onmessage = (e) => {
- // console.log(e)
- const { code, data, message } = JSON.parse(e.data)
- // console.log(JSON.parse(e.data))
- if (code === 903 || code === 904) {
- const index = this.taskData.map(item => item.taskId).indexOf(data.taskId)
- if (index === -1) {
- // this.taskData.push(data)
- } else {
- this.$set(this.taskData, index, data)
- if (data.complete) {
- if(this.form==1){
- this.$message.success(`导入任务完成`)
- for(var i = 0;i<this.taskData.length;i++){
- if(this.taskData[i].complete==true){
- this.taskData.splice(i,1)
- this.$message.success(`导出任务完成`)
- // console.log(this.form)
- } else if (code === 803 || code === 804) {
- this.$message.error(message)
- getQueueList() {
- this.taskData = []
- this.queryParams.reportId = this.reportId
- this.queryParams.state=0
- this.$api.reImportTask(this.queryParams).then(response => {
- response.data.records.map(item => {
- this.taskData.push({
- reportId: item.reportId,
- total: item.importCount,
- index: 0,
- taskId: item.id,
- oldName: item.taskName,
- complete: false,
- url: '',
- fileName: '',
- taskType: item.type,
- percentage: 0
- })
+ getQueueList(){
+ this.review = true
+ this.review = false
- handleDownload(row) {
- downLoad2(row.filePath)
+ getHeight(){
+ this.height = document.getElementsByClassName('el-main')[0].clientHeight
- handleDelete(row) {
- this.$confirm('确认删除本条数据吗?', '提示', {
- confirmButtonText: '确定',
- cancelButtonText: '取消',
- type: 'warning'
- }).then(() => {
- this.loading = true
- this.$api.deleteImportTask({ id: row.id }).then(response => {
- this.$message.success('删除成功')
- this.loading = false
- }).catch(error => {
- handleCurrentChange(val) {
- this.queryParams.current = val;
- this.getList();
- getList() {
- this.queryParams.state = 2
- this.tableData = response.data.records
- this.total = response.data.total
+ handleClick(){
+ var components= {
+ 0:'realTime',
+ 1:'taskList'
+ this.components = components[this.activeName]
+ // console.log(this.activeName)
-}
</script>
-<style lang="scss">
.system-task {
- .system-task-main {
- background: #fff;
- padding: 5px 20px;
- margin-top: 20px;
.header-tabs {
- position: absolute;
- bottom: 0;
+ // position: absolute;
+ // bottom: 0;
padding-right: 9px;
- left: 12px;
- .el-tabs {
- margin-top: 19px;
+ // left: 12px;
+ // .el-tabs {
+ // margin-top: 19px;
.el-tabs__header {
margin-bottom: 0 !important;
- .pagination {
- text-align: center;
- margin: 20px 0;
</style>
@@ -0,0 +1,775 @@
+ <el-container>
+ <el-header class="position_relative">
+ <div class="header-tabs">
+ <el-tabs v-model="activeName" type="card">
+ <el-tab-pane label="实时进度" name="0"></el-tab-pane>
+ <el-tab-pane label="任务列表" name="1"></el-tab-pane>
+ </el-tabs>
+ <el-main class="system-task-main">
+ <div v-if="activeName === '0'" key="task1">
+ <el-table :data="taskData" border header-row-class-name="custom-table-header" v-loading="loadingCancel" element-loading-text = "请耐心等待,数据正在加载中...">
+ <el-table-column v-if="form === 1" label="文件名称" prop="oldName" align="center" show-overflow-tooltip></el-table-column>
+ <el-table-column label="任务数量" prop="total" align="center" show-overflow-tooltip>
+ <el-table-column label="当前下标" prop="index" align="center" show-overflow-tooltip>
+ <el-progress :text-inside="true" :stroke-width="20" :percentage="scope.row.percentage?scope.row.percentage:scope.row.taskProcess" :color="customColors"></el-progress>
+ <el-table-column label="当前状态" align="center" v-if="form == 8" min-width="100px" show-overflow-tooltip>
+ <span>{{ statusObj[scope.row.taskDetailState] }}</span>
+ <!-- <span v-if="scope.row.taskDetailState!=5">{{ scope.row.taskType?'进行中':'等待中' }}</span>
+ <span v-else>已取消</span> -->
+ <el-table-column v-if="form === 2" label="操作" align="center" width="120" show-overflow-tooltip>
+ <el-link v-else type="primary" @click.native="handleDownload(scope.row)">下载文件</el-link>
+ <el-table-column v-if="form === 9 || form === 8" label="操作" align="center" width="150" show-overflow-tooltip>
+ <p v-if="scope.row.taskDetailState!=5">
+ <el-link class="margin-left_10" type="danger" @click="cancel(scope.row)">取消</el-link>
+ <el-link class="margin-left_10" type="danger" @click="handleCancelZan(scope.row)" v-if="scope.row.taskDetailState==6">继续</el-link>
+ <span class="loadCss" type="danger" @click="handleCancelZan(scope.row)" v-else-if="scope.row.taskDetailState==8" >暂停中</span>
+ <el-link class="margin-left_10" type="danger" @click="handleCancelZan(scope.row)" v-else>暂停</el-link>
+ </p>
+ <p class="margin-left_10" type="danger" v-else>已取消</p>
+ <div v-else key="task2">
+ <el-form inline v-if="form!=9">
+ <!-- <el-form-item v-else label="任务类型">
+ <el-input v-model.trim="queryParams.taskType" size="small" placeholder="请输入任务类型"></el-input>
+ v-for="item in options"
+ <el-table v-loading="loading" :data="tableData" border header-row-class-name="custom-table-header" @sort-change="sortChange">
+ <el-table-column v-else label="#" type="index" align="center" width="55">
+ <el-table-column v-if="form!=9 && form!=8" label="开始时间" align="center" show-overflow-tooltip>
+ <el-table-column v-if="form!=9 && form!=8" label="结束时间" align="center" show-overflow-tooltip>
+ <el-table-column v-else label="创建时间" prop="createTime" align="center" sortable="custom" show-overflow-tooltip>
+ <el-table-column v-if="form==9 || form==8" label="任务类型" align="center" show-overflow-tooltip>
+ <span>{{ scope.row.taskType==1?'定时任务':'普通任务' }}</span>
+ <span v-if="form!=9 && form!=8">{{ statusObj[scope.row.status] }}</span>
+ <span v-else>{{ statusObj[scope.row.taskState] }}</span>
+ <el-table-column v-if="form==9 || form==8" label="定时周期" prop="dateType" align="center" show-overflow-tooltip>
+ <el-table-column v-if="form==9 || form==8" label="最近更新时间" prop="modifiedTime" align="center" sortable="custom" show-overflow-tooltip></el-table-column>
+ <el-table-column v-if="form!=9 && form!=8" label="操作" align="center" width="120" show-overflow-tooltip>
+ <template slot-scope="scope" v-if="scope.row.status !== 0">
+ <el-link type="primary" @click.native="handleDownload(scope.row)" v-if="$permission('/workspace/common/taskDownload')">下载</el-link>
+ <el-link class="margin-left_10" type="danger" @click.native="handleDelete(scope.row)" v-if="$permission('/workspace/common/delete')">删除</el-link>
+ <el-table-column v-else label="操作" align="center" width="150" show-overflow-tooltip>
+ <el-dropdown v-if="scope.row.taskType == 1" split-button type="primary" size="small" @command="handleCommand($event,scope.row)" @click="handleClick(scope.row)">
+ <p>编辑</p>
+ <el-dropdown-menu slot="dropdown">
+ <el-dropdown-item command="1">{{ pause==0?'暂停任务':'继续任务' }} </el-dropdown-item>
+ <!-- <el-dropdown-item command="1">暂停任务 </el-dropdown-item> -->
+ <el-dropdown-item command="2">删除任务</el-dropdown-item>
+ <!-- <el-dropdown-item command="3">取消</el-dropdown-item> -->
+ <el-dropdown-item command="4">更新记录</el-dropdown-item>
+ </el-dropdown-menu>
+ </el-dropdown>
+ <el-dropdown v-else split-button type="primary" size="small" @command="handleCommand($event,scope.row)" @click="deletes(scope.row)">
+ <p>删除</p>
+ <!-- <el-link class="margin-left_10" type="danger" @click="deletes(scope.row)" v-if="scope.row.taskType!=1">删除</el-link> -->
+ <el-dialog title="编辑"
+ width="600px"
+ <el-form :model="forms" :rules="rules" ref="forms" label-width="100px">
+ <el-select v-model="forms.configId" placeholder="请选择网站" style="width: 100%;">
+ <el-select v-model="forms.configCells" multiple collapse-tags placeholder="请选择下载内容" style="width: 100%;">
+ <el-switch v-model="forms.taskType" @change="changeTaskType" :active-value="1" :inactive-value="0" active-color="#13ce66" inactive-color="#ff4949"> </el-switch>
+ <el-form-item label="更新间隔" v-if="forms.taskType==1" prop="dateType">
+ <el-select v-model="forms.dateType" @change="getDateType" clearable placeholder="请选择更新时间间隔" style="margin-right: 20px;width: 100%;">
+ <el-option v-for="item in dateType"
+ <el-form-item label="选择更新时间" v-show="forms.dateType">
+ <timeChoose :type="forms.dateType" @value="handleData" :cron="forms.crons" style="width:100%"></timeChoose>
+ <el-form-item label="检索信息">
+ <el-input v-model="forms.conditions" placeholder="请输入检索信息" type="textarea"></el-input>
+ <span slot="footer" class="dialog-footer">
+ <el-button @click="close">取 消</el-button>
+ <el-button type="primary" @click="sure">确 定</el-button>
+import updateLog from "./components/updateLog.vue";
+ props: {
+ form: Number,
+ downloadId:String,
+ isGetList:Boolean,
+ updateLog,
+ if (this.forms.taskType == 1) {
+ activeName: '0',
+ taskData: [],
+ tableData: [],
+ status: null,
+ projectName: '',
+ type: 0,
+ order: 'desc',
+ createName: '',
+ projectId: 0
+ 2: '成功',
+ 3: '失败',
+ 4: '等待下一次执行',
+ 6: '暂停',
+ 7: '待取消',
+ 8: '待暂停'
+ taskType: {
+ 1: '专利导入',
+ 2: '专利导出',
+ 3: '说明书导入',
+ website:[],
+ download:[],
+ forms:{},
+ pause:0,
+ webSocket1: '',
+ ...mapGetters(['webSocket', 'userinfo'])
+ isGetList(val) {
+ this.getList2()
+ this.queryParams.type = this.form
+ this.queryParams.projectId = this.$route.query.id
+ // console.log(this.downloadId);
+ if (this.form != 9) {
+ this.getQueueList()
+ this.connectWebSocket(this.userinfo.id)
+ this.getTasks()//网站导入查询
+ this.getTaskDetails()//传入状态查询实时进度
+ this.getAllConfig()//请求全部网站
+ connectWebSocket(userId) {
+ this.webSocket1 = new WebSocket(`ws://${this.$c.hostname}:8111/api/quartz/ws/` + userId)
+ // this.webSocket1 = new WebSocket(`ws://192.168.1.24:8111/api/quartz/ws/` + userId)
+ // Store.commit('SET_WEB_SOCKET', webSocket)
+ this.webSocket1.onopen = () => {
+ console.log('WebSocket连接成功')
+ // webSocket.onmessage = async (e) => {
+ // console.log(e)
+ this.webSocket1.onerror = () => {
+ console.log('WebSocket连接失败')
+ // var timer = setTimeout(() => {
+ // for (var i = 0; i < 3; i++){
+ // var state = this.connectWebSocket(this.userinfo.id)
+ // if (state) {
+ // clearTimeout(timer)
+ // if (i == 2) {
+ // },1000)
+ this.webSocket1.onclose = () => {
+ console.log('WebSocket连接关闭')
+ var webSocket = this.webSocket1?this.webSocket1:this.webSocket
+ // console.log({ code, data, message });
+ const index = this.taskData.findIndex(item=>{return item.id == data.id || item.taskId==data.taskId})
+ this.$set(this.taskData, index, data)
+ if(this.form==1){
+ }else if (this.form==9) {
+ switch (data.taskDetailState) {
+ case '3':
+ this.$message.error(`导入任务失败`)
+ case '2':
+ getQueueList() {
+ this.taskData = []
+ this.$api.getQueueList({ type: this.form, projectId: this.queryParams.projectId }).then(response => {
+ // console.log(response.data)
+ response.data.map(item => {
+ this.taskData.push({
+ projectId: item.projectId,
+ total: item.total,
+ index: 0,
+ taskId: item.id,
+ oldName: item.oldName,
+ complete: false,
+ url: '',
+ fileName: '',
+ taskType: item.type,
+ percentage: 0
+ this.getList2();
+ this.$api.getTaskList(this.queryParams).then(response => {
+ getList2() {
+ if (this.form!=9) {
+ // 网站导入查询按钮(当form为9网站导入,8为专利号导入)
+ this.getTasks()
+ if (this.pause==0) {//暂停pauseJobTask
+ this.pause=1
+ } else {//继续
+ this.pause=0
+ this.$nextTick(() => {
+ // 网站导入表格操作编辑按钮
+ handleClick(row) {
+ this.forms = JSON.parse(JSON.stringify(row))
+ this.forms.dateType = this.getType(JSON.parse(JSON.stringify(row.crons)))
+ this.forms.configCells=this.forms.configCells.split(',').map(Number)
+ // console.log(this.forms);
+ this.visible=true
+ this.deletes(row)
+ this.$refs.updateLog.open(row,this.userinfo.id,this.webSocket1)
+ getAllConfig() {
+ return item.id==this.forms.configId
+ this.forms.configType = a[0].webType
+ await this.$api.getConfigCell({type:this.forms.configType}).then(res => {
+ this.forms.configCells=this.download.map(item=>{ return item.id })
+ // console.log(row);
+ state:7,//7为待取消
+ // this.loadingCancel=true
+ this.$api.setDetailState(task).then(res => {
+ if (row.taskDetailState==6) {
+ task.state = 0
+ task.state = 8
+ // this.getList2()
+ changeTaskType(val) {
+ this.forms.dateType=''
+ this.forms.conditions=''
+ //网站下载任务查询
+ getTasks() {
+ // this.tableData = []
+ this.loading=true
+ this.$api.getTasks(this.queryParams).then(response => {
+ this.loading=false
+ getTaskDetails() {
+ let queryParams = {
+ taskDetailStates: [0,1,6,8]//等待,进行,取消,暂停
+ this.$api.getTaskDetails(queryParams).then(res => {
+ this.taskData=res.data.records
+ // this.total=res.data.total
+ if (this.forms.dateType=='') {
+ this.forms.crons=val
+ // 排序
+ sure() {
+ this.$refs.forms.validate((valid) => {
+ return item.webType==this.forms.configType
+ this.forms.configId = a[0].id
+ this.$api.updateTasks(this.forms).then(response => {
+ this.$message.success('已成功编辑该任务')
+ this.close()
+ this.visible=false
+ this.forms.crons = ''
+.system-task {
+ .system-task-main {
+ padding: 5px 20px;
+ margin-top: 20px;
+ .header-tabs {
+ padding-right: 9px;
+ left: 12px;
+ margin-top: 19px;
+ .pagination {
+ <taskIndex :reportId="reportId"></taskIndex>
+import taskIndex from './index.vue'
+ taskIndex
@@ -0,0 +1,318 @@
+ <div class="addOpinion">
+ <div >
+ <el-form ref="form" :model="form" inline label-width="100px">
+ <el-form-item label="无效理由:">
+ <el-select v-model="form.invalidName" placeholder="请选择" @change="changeInvalid" >
+ v-for="item in invalidList"
+ <el-form-item :label="form.invalidName==1?'说明书:':'权要:'" v-if="form.invalidName+''">
+ <div v-if="form.invalidName == 1">说明书</div>
+ <el-select v-model="form.content" placeholder="请选择" @change="changeContent" >
+ v-for="item in rightList"
+ :label="'权要'+(item.content+1)"
+ <span class="margin-left_10"><el-link type="primary" @click="show = !show">{{ show?'收起':'展开' }}</el-link></span>
+ <!-- <el-form-item label="证据组合:" v-if="form.content+''">
+ <el-select v-model="form.proofGroups" placeholder="请选择" @change="changeProofGroups">
+ v-for="item in proofGroups"
+ <el-form-item label="证据:" v-if="form.proofGroups+''">
+ <el-select v-model="form.proofs" placeholder="请选择" @change="changeProofs">
+ v-for="item in proofs"
+ :label="'D' + item.sort"
+ <el-form-item label="特征:" v-if="form.proofs+''">
+ <el-select v-model="form.features" placeholder="请选择">
+ v-for="item in features"
+ :key="item.featureId"
+ :label="item.featureName"
+ :value="item.featureId">
+ <el-form-item >
+ <el-button type="primary" @click="addInvalid">无效理由和证据</el-button>
+ <div v-if="show">
+ <InvalidDetails :invalidReasonId="form.content" :reportId="reportId" :rightSort="rightSort"></InvalidDetails>
+ <div style="margin-left:20px">
+ <div style="display:flex;justify-content:space-between;align-items:center">
+ <p style="margin-top:0">陈述意见:</p>
+ <el-button type="primary" size="small" @click="submit">保存</el-button>
+ <myRich-Text placeholder="请输入陈述意见" v-model="argumentStr"></myRich-Text>
+ <el-dialog title="无效理由和证据" :visible.sync="visible" width="1200px" :before-close="close">
+ <InvalidIndex :reportId="reportId" :signPatentNo="signPatentNo"></InvalidIndex>
+import InvalidIndex from '../InvalidIndex.vue'
+import InvalidDetails from '../InvalidDetails/InvalidDetails.vue';
+ InvalidIndex,
+ InvalidDetails
+ mixins:[],
+ props: ['reportId','signPatentNo'],
+ show:false,
+ rightSort:null,
+ invalidName:'',
+ content:'',
+ proofGroups:'',
+ proofs:'',
+ features:''
+ options:[],
+ argumentStr:'',
+ invalidList:[
+ id: 0,
+ label: '权利要求不清楚',
+ value: 0
+ id: 1,
+ label: '说明书公开不充分',
+ value: 1
+ id: 2,
+ label: '不具备创造性',
+ value: 2
+ id: 3,
+ label: '不具备新颖性',
+ value: 3
+ rightList:[],
+ proofGroups:[],
+ proofs:[],
+ features:[]
+ this.getInvalidReason()
+ if(this.reportId){
+ //更新陈述意见
+ var params={
+ id:this.form.content,
+ argumentStr:this.argumentStr
+ this.$api.updateArgumentStr(params).then(response=>{
+ this.$message.success('陈述意见添加成功')
+ this.$message.error('陈述意见添加失败')
+ //打开无效理由和证据弹窗
+ addInvalid(){
+ //关闭无效理由和证据弹窗
+ close(){
+ //修改无效理由选项
+ changeInvalid(val){
+ this.form.content = ''
+ this.form.proofGroups = ''
+ this.form.proofs = ''
+ this.form.features = ''
+ this.argumentStr = ''
+ if(val==1){
+ var rightList = this.options.filter(item=>{return item.invalidName == val})
+ this.rightList = rightList
+ this.rightSort = rightList[0].content
+ this.form.content = rightList[0].id
+ this.argumentStr = rightList[0].argumentStr || ''
+ // if(rightList.length>0){
+ // this.rightList = [...new Set(rightList.map(item1=>item1.content))].map(item1=>{
+ // return {
+ // label : item1!=-1?('权要'+(item1+1)):'说明书',
+ // value :item1
+ // item1.
+ // item1.value = item1
+ // return item1
+ //修改权要选项
+ changeContent(val){
+ var a = this.rightList.find(item=>{return item.id == val})
+ this.rightSort = a.content
+ this.argumentStr = a.argumentStr || ''
+ // this.form.proofGroups = ''
+ // this.form.proofs = ''
+ // this.form.features = ''
+ // if(val == -1 ){
+ // this.proofGroups = []
+ // var proofGroups = this.options.filter(item=>{return item.invalidName = this.form.invalidName && item.content == val})
+ // if(proofGroups.length>0){
+ // proofGroups.forEach(item=>{
+ // item.proofGroups.forEach(item1=>{
+ // item1.label = item1.proofs.map(i=>'D'+i.sort).join('+')
+ // item1.value = item1.proofs.map(i=>'D'+i.sort).join('+')
+ // this.proofGroups.push(item1)
+ //修改证据组合选项
+ changeProofGroups(val){
+ this.proofs = this.proofGroups.find(item=>{return item.value == val}).proofs
+ //修改证据选项
+ changeProofs(val){
+ rightSort:this.form.content
+ this.$api.getFeatureList(params).then((res) => {
+ this.$set(this,'features',res.data)
+ //获取无效理由和证据
+ async getInvalidReason() {
+ await this.$api.queryInvalidReason({reportId:this.reportId}).then((res) => {
+ if(res.data){
+ this.options = res.data
+ // this.arrangeData(res.data)
+ // var a = [...new Set(res.data.map(item => item.invalidName))]
+ // this.tableData=res.data.sort((x,y)=>{
+ // return a.indexOf(x.invalidName) - a.indexOf(y.invalidName)
+ this.options = []
+ //整理无效理由和证据数据
+ arrangeData(data){
+ var invalidList=[
+ invalidList.forEach(item=>{
+ var rightList = data.filter(item1=>{return item1.invalidName == item.value})
+ if(rightList.length>0){
+ item.children = [...new Set(rightList.map(item1=>item1.content))].map(item1=>{
+ label:item1 != -1?'权要'+item1:'说明书',
+ value:item1
+ if(item.children.length>0){
+ item.children.forEach(item1=>{
+ item1.children = rightList.filter(item2=>{return item2.content == item1.value}).map(item2=>{
+ if(item2.proofGroups>0){
+ item2.proofGroups.forEach(i=>{
+ item.children = []
+.addOpinion{
+ // display: flex;
@@ -0,0 +1,120 @@
+ <div v-if="!showEvidence">
+ <img src="@/assets/visual/fixed.png" width="20px" height="20px" @click="qx" v-if="fix===true" />
+ <img src="@/assets/visual/unfixed.png" width="20px" height="20px" @click="gd" v-if="fix===false" />
+ <el-tabs v-model="activeName" @tab-click="handleClick">
+ <el-tab-pane label="标的专利" name="patent">
+ <ContrastIndex v-bind="$attrs" v-on="$listeners" :reportId="reportId" :evidenceFlieId="evidence.id" :evidence="evidence" @on-change='changefix' :publicNo="signPatentNo" :signPatentNo="signPatentNo" :reportType="reportType" :showEvidence="!showEvidence"></ContrastIndex>
+ <el-tab-pane label="无效请求书" name="InvalidRequest">
+ <check-File ref="checkFile"></check-File>
+ <ContrastIndex v-if="type == 1" v-bind="$attrs" v-on="$listeners" :reportId="reportId" :evidenceFlieId="evidence.id" :evidence="evidence" @on-change='changefix' :publicNo="evidence.proofConditions" :signPatentNo="signPatentNo" :reportType="reportType"></ContrastIndex>
+ <check-File v-else ref="checkFile1"></check-File>
+import ContrastIndex from '@/views/components/articles/ContrastIndex.vue';
+import checkFile from '@/views/report/InvalidResponse/components/checkFile.vue'
+ ContrastIndex,
+ checkFile
+ props: ['isEvidence','evidence','reportId','signPatentNo','reportType'],
+ activeName:'patent',
+ showEvidence:this.isEvidence,
+ type:1,
+ url:'',
+ isEvidence(val){
+ if(!this.fix){
+ this.showEvidence = val
+ 'evidence'(val){
+ this.type = val.type
+ this.showEvidence = true
+ this.getDetails(val)
+ // if(this.evidence.id){
+ // this.getDetails(this.evidence)
+ qx() {
+ this.fix = false
+ gd() {
+ this.fix = true
+ //获取证据详情
+ getDetails(val){
+ // 1是文献2是非文献
+ if (val.type == 1) {
+ // this.getPatent(val.proofConditions)
+ // this.getPiZhuContrastList(val.proofConditions)
+ } else if (val.type == 2){
+ let url = `http://${this.$c.hostname}:8012/onlinePreview?url=` + btoa(encodeURIComponent(this.$p + val.proofConditions))
+ this.$refs.checkFile1.open(url)
+ //切换tab栏
+ if(this.activeName == 'InvalidRequest'){
+ if (this.url) {
+ let url = `http://${this.$c.hostname}:8012/onlinePreview?url=` + btoa(encodeURIComponent(this.url))
+ this.$refs.checkFile.open(url)
+ this.$api.queryInvalidProcess(params).then((res) => {
+ this.url = this.$p + res.data[0].reportFile.url
+ }).catch((error) => {
+ //是否定住
+ changefix(val){
+ this.fix = val
@@ -0,0 +1,258 @@
+ <!-- <el-button type="primary" size="small" @click="checkInvalid" style="margin-right:10px;height:32px;"> 查看无效请求书/标的专利 </el-button> -->
+ <el-button type="primary" size="small" @click="addOpinion" style="margin-right:10px;height:32px;"> 添加陈述意见 </el-button>
+ <div class="evidence" style="max-width: 300px;height: 50px;;overflow: auto;margin-left:10px">
+ <span style="margin-right:5px">
+ <el-tooltip class="item" effect="dark" content="无效请求书/标的专利" placement="top">
+ <el-link @click="checkInvalid" :type="evidence.id === -1 ? 'primary' : undefined">T</el-link>
+ <span v-for="item in EvidenceList" :key="item.sortStr" style="margin-right:5px">
+ <el-tooltip class="item" effect="dark" :content="item.proofName" placement="top">
+ <el-link @click="evidenceBtn(item)" :type="item.id === evidence.id ? 'primary' : undefined">{{ item.sortStr }}</el-link>
+ <div class="box1" v-dragControllerDiv1 style="display:flex;flex-direction:column;width:100%;">
+ <div class="left1 fileDetails" style="width:100%;padding-bottom:10px" :style="{height:height}">
+ <div class="box" ref="box" v-dragControllerDiv :style="{height:'100%'}">
+ <div class="left" :style="{width:width}" v-loading="loading" style="height:100%"><!--左侧div内容-->
+ <FileDetails :isEvidence="isEvidence" style="overflow-y:auto;overflow-x: hidden;" :style="{height:'100%'}" :evidence="evidence" :reportId="params.reportId" :height="height" :signPatentNo="params.signPatentNo" :reportType="params.reportType" :type="params.reportType"></FileDetails>
+ <div class="resize" title="收缩侧边栏" v-show="width!='100%'" style="height:100%">⋮</div>
+ <div class="mid" v-show="width!='100%'" :style="{width:width}" style="height:100%"><!--右侧div内容-->
+ <div class="resize2" title="收缩侧边栏" v-show="showPosition"><p><span>˙</span><span>˙</span><span>˙</span></p></div>
+ <div class="resize1" title="收缩侧边栏" v-show="false"><span>⋮</span></div>
+ <div class="mid1" v-show="showPosition" style="height:280px;border:1px solid #E4E7ED;margin:10px;overflow-y:auto;overflow-x: hidden;">
+ <addOpinion :reportId="params.reportId" :signPatentNo="params.signPatentNo"></addOpinion>
+import FileDetails from './fileDetails.vue';
+import addOpinion from './addOpinions.vue'
+ FileDetails,
+ addOpinion
+ FileVisible: false,
+ EvidenceList:[],
+ params:{},
+ evidence:{},//证据文献
+ // literatureType:1,//文献类型1是专利文献
+ isEvidence:true,
+ showPosition:false,
+ // var that = this
+ //监听指定DOM变化
+ // this.resizeObserver = new ResizeObserver(function( entries ) {
+ // entries.forEach((item, index) =>{
+ // that.$set(that,'height',item.target.clientHeight)
+ // // item.target.childNodes[0].style.height= item.target.clientHeight + 'px'
+ // // console.log(item.target.childNodes)
+ this.params = this.$s.getSession('params')
+ this.evidence.id = this.params.aid
+ if(!this.evidence.id ||this.evidence.id == -1){
+ this.isEvidence = false
+ this.queryScratchs()//获取陈述意见列表
+ this.getQueryProofList()//获取证据列表
+ this.$set(this,'height',document.getElementsByClassName('el-main')[0].offsetHeight-60 + 'px')
+ this.addOpinion()
+ //打开无效请求书/标的专利
+ async checkInvalid(){
+ this.evidence.id = -1
+ this.params.aid = -1
+ this.$s.setSession('params',this.params)
+ this.getPiZhuContrastList(this.params.signPatentNo)
+ path: '/fileDetails/' + -1,
+ //打开陈述意见
+ addOpinion(){
+ this.showPosition = !this.showPosition
+ if(this.showPosition){
+ // 监听dom
+ // this.resizeObserver.observe(document.getElementsByClassName('fileDetails')[0])
+ this.$set(this,'height',document.getElementsByClassName('el-main')[0].offsetHeight-260 + 'px')
+ // resizeObserver.disconnect()
+ // 查询划词陈述意见
+ queryScratchs() {
+ this.$api.queryScratchs({proofId:this.evidence.id}).then((res) => {
+ this.$store.commit('SET_PATENT_OPINION_CONTRAST', res.data)
+ // 文献点击事件
+ async evidenceBtn(val) {
+ this.isEvidence = true
+ this.evidence = val
+ // this.literatureType = val.type
+ // this.evidenceFlieId = val.id
+ this.params.aid = val.id
+ this.getPiZhuContrastList(val.proofConditions)
+ // let url = `http://${this.$c.hostname}:8012/onlinePreview?url=` + btoa(encodeURIComponent(this.$p + val.proofConditions))
+ // this.$refs.checkFile1.open(url)
+ path: '/fileDetails/' + val.id,
+ //查询证据文献
+ getQueryProofList() {
+ reportId:this.params.reportId,
+ signPatentNo:this.params.signPatentNo,
+ size: 99,
+ this.$api.queryProof(params).then((res) => {
+ this.EvidenceList = res.data
+ var index = this.EvidenceList.findIndex(item => {
+ return item.id == this.evidence.id
+ this.evidenceBtn(this.EvidenceList[index])
+ getPiZhuContrastList(val) {
+ patentNo: val,
+ id: this.params.reportId,
+ createFrom:2
+ this.$store.commit('SET_PATENT_PIZHU_CONTRAST', a)
+import { changeTranslation, patentKeywordsHighlight } from '@/views/components/common/mixins'
+import PatentField from '@/views/components/articles/components/PatentField'
+import PatentAnnotation from '@/views/components/articles/components/PatentAnnotation'
+import PatentBasic from "@/views/components/articles/components/PatentBasic"
+import PatentPDF from "@/views/components/articles/components/PatentPDF"
+import PatentImage from "@/views/components/articles/components/PatentImage"
+import PatentRight from "@/views/components/articles/components/PatentRight"
+import PatentInstruction from "@/views/components/articles/components/PatentInstruction"
+import PatentFamily from "@/views/components/articles/components/PatentFamily"
+import PatentStatus from "@/views/components/articles/components/PatentStatus"
@@ -0,0 +1,102 @@
+ <div v-for="(item,index2) in InvalidDetails" :key="item.id">
+ <p>
+ <span>证据组合{{ index2+1 }}:</span><span v-for="(i,index) in item.proofs" :key="i.id">D{{ i.sort }} <span v-if="index<item.proofs.length-1">+</span> </span>
+ <span >
+ <i v-if="!item.show" class="iconfont icon-yanjing_xianshi" @click="changeShow(item)" style="font-size:20px"></i>
+ <i class="iconfont icon-yanjing_yincang" v-else @click="changeShow(item)" style="font-size:20px"></i>
+ <div style="display:flex;align-items:center" v-if="!item.show">
+ <p style="width:80px">陈述意见:</p>
+ <div v-if="!item.editArgumentStr" >
+ <span v-html="item.argumentStr"></span><span @click="editArgumentStr(item)"><el-link type="primary"><i class="iconfont icon-bianji" style="font-size:28px"></i></el-link></span>
+ <div v-else style="width:100%;display:flex;align-items:center">
+ <myRich-Text style="width:100%" v-model="item.argumentStr" placeholder="请输入陈述意见"></myRich-Text>
+ <el-button type="primary" class="margin-left_10" icon="el-icon-check" circle style="font-size:15px" @click="saveArgumentStr(item)"></el-button>
+ <el-button type="primary" class="margin-left_10" icon="iconfont icon-fanhui" circle style="font-size:15px" @click="cancelArgumentStr(item)"></el-button>
+ <!-- <span class="margin-left_10" @click="saveArgumentStr(item)"><el-link type="primary"><i class="el-icon-check" style="font-size:28px"></i></el-link></span> -->
+ <div v-if="!item.show">
+ <Table :tableData="item.proofDetails" @submit="submitInvalid" v-bind="$attrs" v-on="$listeners" :proofs="item.proofs" :proofGroup="item"></Table>
+import Table from './table.vue';
+ Table
+ props: ['invalidReasonId'],
+ InvalidDetails:[],
+ invalidReasonId(){
+ this.queryDetailByInvalidId()
+ //根据无效理由Id查询证据组合详情
+ queryDetailByInvalidId(){
+ this.$api.queryDetailByInvalidId({invalidReasonId:this.invalidReasonId}).then(response=>{
+ this.InvalidDetails = response.data
+ //修改是否展示详情
+ changeShow(row){
+ this.$set(row,'show',!row.show)
+ //编辑组合陈述意见
+ editArgumentStr(row){
+ this.$set(row,'editArgumentStr',!row.editArgumentStr)
+ this.$set(row,'argumentStr1',row.argumentStr)
+ //保存证据组合陈述意见
+ saveArgumentStr(row){
+ ...row,
+ this.$api.updateProofGroup(params).then(response=>{
+ this.$message.success('陈述意见更新成功')
+ this.editArgumentStr(row)
+ this.$message.error('陈述意见更新失败')
+ //取消证据组合陈述意见
+ cancelArgumentStr(row){
+ this.$set(row,'argumentStr',row.argumentStr1)
+ //修改证据组合的无效证据
+ submitInvalid(){
@@ -0,0 +1,105 @@
+ <el-dialog title="添加特征" :visible.sync="visible" width="800px" :before-close="close" append-to-body>
+ <el-form :model="form" label-position="right" label-width="140px" >
+ <el-form-item label="所属权要:">
+ <span>权要{{ form.rightId+1 }}</span>
+ <el-form-item label="证据文献:">
+ <span>{{ form.proofSortStr }}</span>
+ <el-form-item label="所属特征:">
+ <el-select v-model="form.featureId" placeholder="请选择" style="width:100%" :popperAppendToBody="false" >
+ <el-option v-for="item in featureList" :key="item.featureId" :label="item.featureName" :value="item.featureId">
+ <el-tooltip class="item" effect="dark" :content="item.content" placement="top">
+ <span>{{ item.featureName }}</span>
+ <el-button @click.stop="addFeature( )" ><i class="el-icon-plus"></i></el-button>
+ <el-form-item label="无效请求书理由:">
+ <myRich-Text placeholder="请输入无效请求书理由" v-model="form.proofStr"></myRich-Text>
+ <el-form-item label="答辩意见:">
+ <myRich-Text placeholder="请输入答辩意见" v-model="form.argumentStr"></myRich-Text>
+ <el-button type="primary" @click="submit">确 定</el-button>
+ <el-dialog title="添加特征" :visible.sync="addFeatureVisible" width="800px" :before-close="closeFeature" append-to-body>
+ <rightContent :reportId="form.reportId" ref="rightContent"></rightContent>
+// import { RichText1 } from '@/views/components/common/RichText/mixins';
+import rightContent from '../addFeatures/rightContent.vue'
+ rightContent
+// mixins:[RichText1],
+ props: ['featureList'],
+ addFeatureVisible:false,
+ rightDetails:{}
+ open(form,right){
+ this.form = {...form,
+ proofStr:"",
+ argumentStr:"",
+ this.rightDetails = right
+ closeFeature() {
+ this.addFeatureVisible = false
+ this.$emit('addFeature')
+ this.$api.addArguments(this.form).then(response=>{
+ this.$emit('submit',true)
+ //添加特征
+ addFeature() {
+ this.addFeatureVisible=true
+ this.$refs.rightContent.open(this.rightDetails)
+ @import '@/assets/css/selectButton.scss';
+ <div style="margin-top: 20px; display: flex; justify-content: space-between">
+ <!-- <el-button @click="addInvalid" type="primary" size="small">添加/更新无效证据</el-button> -->
+ <el-dropdown @command="getProof">
+ <span class="el-dropdown-link">
+ <el-button type="primary" size="small">
+ 添加/更新无效证据<i class="el-icon-arrow-down el-icon--right"></i>
+ <el-dropdown-item v-for="item in proofs" :key="item.id" :command="item.id" >添加/更新<span style="color:#66b1ff">D{{item.sort}}</span>的无效证据</el-dropdown-item>
+ <el-table v-if="refreshData" :data="tableData" ref="table" border maxHeight="400" v-loading="loading" style="min-width: 100%; margin-top: 20px;overflow:auto">
+ <el-table-column prop="featureId" label="特征" align="center" width="300px">
+ <!-- <div class="selectButton" v-if="scope.row.edit">
+ <el-select v-model="scope.row.featureId" placeholder="请选择" style="width:100%">
+ <el-option v-for="feature in featureList" :key="feature.featureId" :label="feature.featureName" :value="feature.featureId" :disabled="tableData.findIndex(item1=>{return item1.featureId == feature.featureId})!=-1">
+ <el-button @click.stop="addFeature(scope.row)" ><i class="el-icon-plus"></i></el-button>
+ <el-tooltip class="item" effect="dark" :content="scope.row.featureContent" placement="top">
+ <span>特征{{ scope.row.featuresOrder }}</span>
+ <el-table-column prop="sort" align="center" label="证据文献">
+ D{{ scope.row.sort }}
+ <el-table-column prop="proofStr" align="center" label="无效请求书理由">
+ <!-- <myRich-Text placeholder="请输入无效请求书理由" v-model="scope.row.proofStr" v-if="scope.row.edit"></myRich-Text> -->
+ <div v-html="scope.row.proofStr" ></div>
+ <el-table-column prop="arguments" align="center" label="答辩意见">
+ <div class="innerTable" style="width:calc(100% + 20px);margin-left:-10px;word-wrap:break-word;">
+ <div class="item" v-for="(item1, index) in scope.row.arguments" :key="index+'p'">
+ <myRich-Text placeholder="请输入答辩意见" v-model="item1.argumentStr" style="width:100%" v-if="scope.row.edit"></myRich-Text>
+ <div v-else v-html="item1.argumentStr"></div>
+ <el-table-column align="center" label="操作">
+ <div v-if="!scope.row.edit">
+ <span class="margin-left_10"><el-link type="primary" @click="editInvalid(scope.row,scope.$index)">编辑</el-link></span>
+ <span class="margin-left_10"><el-link type="danger" @click="getProofId(scope.row)">删除</el-link></span>
+ <span class="margin-left_10"><el-link type="primary" @click="updateInvalid(scope.row,scope.$index)">保存</el-link></span>
+ <span class="margin-left_10"><el-link type="danger" @click="cancelEdit(scope.row,scope.$index)">取消</el-link></span>
+ <!-- <el-dialog title="选择证据文献" :visible.sync="visible" width="800px" append-to-body>
+ <el-radio-group v-model="proofId" @input="getProof">
+ <el-radio v-for="item in proofs" :key="item.id" :label="item.id">
+ D{{item.sort}}
+ </el-radio>
+ </el-dialog> -->
+ <!-- <addInvalidDialog ref="addInvalidDialog" :featureList="featureList" v-bind="$attrs" v-on="$listeners"></addInvalidDialog> -->
+ <el-dialog title="添加证据" :visible.sync="EvidenceVisible" width="1000px" :before-close="closeEvidence" custom-class="addInvalid" append-to-body>
+ <Invalid-Evidence ref="invalid" :reportId="reportId" :patentNo="patentNo" ></Invalid-Evidence>
+ <el-button @click="closeEvidence">取 消</el-button>
+ <el-button type="primary" @click="submitEvidence">确 定</el-button>
+import addInvalidDialog from "../InvalidDetails/addInvalidDialog.vue";
+import InvalidEvidence from '../InvalidEvidence.vue'
+ addInvalidDialog,
+ InvalidEvidence
+ props: ['reportId','rightSort','tableData','proofs','patentNo','proofGroup','right'],
+ row:[],
+ refreshData:true,
+ featureList: [],//选择特征数组
+ proofId:'',//证据id
+ EvidenceVisible:false,
+ evidence:null,
+ rightSort(){
+ this.getFeature()
+ //编辑无效证据
+ editInvalid(row,index){
+ if(row.arguments && row.arguments.length==0){
+ row.arguments.push({
+ argumentStr:''
+ this.tableData[index].oldData = JSON.parse(JSON.stringify(row))
+ this.$set(row,'edit',true)
+ this.refreshData = false
+ this.refreshData = true
+ // row.edit = true
+ //取消编辑
+ cancelEdit(row,index){
+ this.tableData[index] = JSON.parse(JSON.stringify(row.oldData))
+ // this.$set(row,'edit',false)
+ //更新无效证据
+ updateInvalid(row,index){
+ reportId:this.reportId,
+ rightId:this.rightSort,
+ featureId:row.featureId,
+ proofId:row.proofId,
+ proofStrId:row.proofStrId,
+ proofStr:row.proofStr
+ if(row.arguments.length>0){
+ params.argumentId = row.arguments[0].id
+ params.argumentStr = row.arguments[0].argumentStr
+ this.$api.addArguments(params).then(response=>{
+ row.oldData = null
+ this.$set(row,'edit',false)
+ this.tableData[index] = JSON.parse(JSON.stringify(row))
+ //获取需要删除的无效证据Id
+ getProofId(row){
+ this.$confirm('是否删除', '提示', {
+ var proofStrIds = this.tableData.map(item=>{
+ if(item.sort == row.sort){
+ return item.proofStrId
+ }).filter(item=>{
+ return item != row.proofStrId
+ ...this.proofGroup,
+ compareFileId:row.proofId,
+ proofStrIds:proofStrIds
+ var index = this.tableData.findIndex(item=>{
+ return item.proofStrId == row.proofStrId
+ this.tableData.splice(index,1)
+ this.$message.error('删除失败')
+ // this.deletes([id])
+ }).catch(() => {
+ //删除无效证据
+ deletes(ids){
+ this.$api.deleteProofStr(ids).then(response=>{
+ //关闭添加证据弹窗
+ closeEvidence() {
+ this.evidence.proofStrIds = []
+ this.EvidenceVisible = false
+ submitEvidence(){
+ compareFileId:this.evidence.id,
+ proofStrIds:this.evidence.proofStrIds
+ this.$message.error('更新失败')
+ //获取证据详情并打开无效证据弹窗
+ getProof(val){
+ this.evidence = this.proofs.find(item=>{return item.id == val})
+ this.evidence.sortStr = 'D'+this.evidence.sort
+ this.$set(this.evidence,'proofStrIds',this.tableData.map(item=>{
+ if(item.sort == this.evidence.sort){
+ }))
+ this.EvidenceVisible = true
+ this.$refs.invalid.open(this.evidence,this.right)
+ // 查已添加的特征
+ getFeature() {
+ rightSort:this.rightSort
+ this.featureList=res.data
+ //打开添加新特征弹框
+ // this.addFeatureVisibe=true
+ //添加无效证据
+ this.proofId = ''
+ // var form = {
+ // rightId:this.rightSort,
+ // reportId:this.reportId
+ // this.$refs.addInvalidDialog.open(form)
+.addInvalid .el-dialog__body{
+ padding-top:5px
+.innerTable .item {
+ /* min-width:200px; */
+ padding: 20px 0;
+ // height: 130px;
+ line-break: normal;
+ border-bottom: 1px solid #EBEEF5;
+.innerTable .item:last-child:first-child {
+ //item 即是最后一个元素 又是第一个元素
+.innerTable .item:nth-child(1) {
+.innerTable .item:last-child {
+ border-bottom: none;
@@ -1,28 +1,24 @@
<div>
<div class="demo-input-suffix">
- 标的专利:<el-link type="primary" @click="toPatentDetails(patentNo)">{{ patentNo }}</el-link>
+ <!-- <p>标的专利:<el-link type="primary" @click="toPatentDetails(patentNo)">{{ patentNo }}</el-link></p> -->
+ <p>所属证据:{{ evidence.sortStr }}</p>
+ <p>所属权要:权要{{ right+1 }}</p>
<div style="margin-top: 20px; display: flex; justify-content: space-between">
- <el-button-group>
- <el-button @click="addFeature1" :disabled="row.length > 0 ? false : true">添加特征</el-button>
- <!-- <el-button @click="addFeature">添加特征</el-button> -->
- <el-button @click="addOpinion" :disabled="row.length > 0 ? false : true">添加陈述意见</el-button>
- </el-button-group>
- <div>
- <el-button @click="keep" type="primary" :loading="btnLoading">保存</el-button>
+ <el-button @click="addInvalid" type="primary" size="small">添加无效证据</el-button>
<el-table v-if="refreshData" :data="tableData" ref="table" border height="300"
:span-method="objectSpanMethod" v-loading="loading" style="min-width: 100%; margin-top: 20px;overflow:auto">
- <el-table-column prop="pRightName" label="权要" align="center" width="200px">
+ <el-table-column prop="proofStrId" label="#" align="center" width="200px">
<template slot-scope="scope">
- <el-checkbox-group v-model="checkList">
- <el-checkbox :label="scope.row.pRightName" @change="getFunInfo(scope.row, scope, 1)">
- <el-tooltip class="item" effect="dark" :content="scope.row.pContent" placement="top">
- <span>{{ scope.row.pRightName }}</span>
- </el-tooltip>
+ <el-checkbox-group v-model="evidence.proofStrIds">
+ <el-checkbox :label="scope.row.proofStrId">
+ {{ scope.$index+1 }}
+ <!-- <el-tooltip class="item" effect="dark" :content="scope.row.rightContent" placement="top">
+ <span>{{ scope.row.rightName }}</span>
+ </el-tooltip> -->
</el-checkbox>
</el-checkbox-group>
@@ -30,198 +26,219 @@
</el-table-column>
<el-table-column prop="content" label="特征" align="center" width="300px">
- <el-checkbox-group v-model="checkList" v-if="scope.row.hasOwnProperty('content')">
- <!-- <el-checkbox-group v-model="checkList"> -->
- <el-checkbox :label="scope.row.id" @change="getFunInfo(scope.row, scope, 0)"
- style="display: flex; align-items: center;">
- <div class="selectButton">
- <el-select v-model="scope.row.content" placeholder="请选择" style="width:100%" @change="featureChange">
- <el-option v-for="item in featureList" :key="item.featureId" :label="item.featureName" :value="item.featureId" :disabled="tableData1.findIndex(item1=>{return item1.content == item.featureId})!=-1">
- </el-option>
- </el-select>
- <el-button @click.stop="addFeature(scope.row)" ><i class="el-icon-plus"></i></el-button>
- </el-checkbox>
- </el-checkbox-group>
- <!-- <el-input type="textarea" autosize v-model="scope.row.content" v-if="scope.row.hasOwnProperty('content')"> {{scope.row.content}}</el-input> -->
+ <div v-if="scope.row.edit">
+ <el-select v-model="scope.row.featureId" placeholder="请选择" style="width:100%" :popperAppendToBody="false" >
+ <el-option v-for="item in featureList" :key="item.featureId" :label="item.featureName" :value="item.featureId" :disabled="tableData.findIndex(item1=>{return item1.featureId == item.featureId})!=-1">
+ <span>{{ scope.row.featureName }}</span>
- <el-table-column prop="evidence" align="center" label="证据(无效请求人)">
- <!-- <div v-if="scope.row.hasOwnProperty('content')" -->
- <div
- style="width:100%;outline: #dcdfe6;border:1px solid #DCDFE6;border-radius:5px" id="preview" class="preview"
- contenteditable="true" v-html="scope.row.evidence" @blur="saveValue(scope.row,'evidence',$event.target.innerHTML)" v-on:paste="handlePaste($event, scope.row, 'evidence')"
- @input="getValue(scope.row,'evidence',$event.target.innerHTML)"
- >
+ <myRich-Text placeholder="请输入无效请求书理由" v-model="scope.row.proofStr" v-if="scope.row.edit"></myRich-Text>
+ <div v-html="scope.row.proofStr" v-else></div>
- <el-table-column prop="evidence2" align="center" label="证据(权利人)">
- <div class="innerTable" style="width:calc(100% + 20px);margin-left:-10px;word-wrap:break-word;">
- <div class="item" v-for="(item, index) in scope.row.evidence2">
- <div style="width:100%;outline: #dcdfe6;border:1px solid #DCDFE6;border-radius:5px" id="preview"
- contenteditable="true" v-html="item.argumentStr" @blur="saveValue(scope.row.evidence2[index],'argumentStr',$event.target.innerHTML)" v-on:paste="handlePaste($event, scope.row.evidence2[index], 'argumentStr',null)"
- @input="getValue(scope.row.evidence2[index],'argumentStr',$event.target.innerHTML)"
+ <div class="innerTable" style="width:calc(100% + 20px);margin-left:-10px;word-wrap:break-word;" >
+ <div class="item" v-for="(item, index) in scope.row.arguments">
+ <myRich-Text placeholder="请输入答辩意见" v-model="item.argumentStr" style="width:100%" v-if="scope.row.edit"></myRich-Text>
+ <div v-else v-html="item.argumentStr"></div>
- <el-table-column v-for="column in tableField.filter(item => !item.hidden)" :key="column.key" :prop="column.key"
- align="center" :label="column.name">
- <div v-if="scope.row.hasOwnProperty('content')">
- contenteditable="true" v-html="scope.row[column.key]" @input="saveValue($event.target.innerHTML)"
- @click="saveValue($event.target.innerHTML)">
+ <span class="margin-left_10"><el-link type="danger" @click="getProofId(scope.row.proofStrId)">删除</el-link></span>
</el-table>
- <!-- <Table-Field ref="tableField" @update="getTableField"></Table-Field> -->
- <el-dialog title="添加特征" :visible.sync="addFeatureVisibe" width="400px" :before-close="closeFeature" append-to-body>
- <div style="display:flex;">
- <el-input type="" v-model="featureName" style="margin-right: 10px;"></el-input>
- <el-button @click="submitFeature" type="primary">添加</el-button>
+ <rightContent :reportId="reportId" ref="rightContent"></rightContent>
</el-dialog>
+ <addInvalidDialog ref="addInvalidDialog" @submit="submitInvalid" :featureList="featureList" @addFeature="getFeature(right)"></addInvalidDialog>
import { explain1 } from "../../components/mixins";
import { PatentDetails } from "@/views/components/common/mixins";
-import TableField from './TableField.vue'
+import addInvalidDialog from "./InvalidDetails/addInvalidDialog.vue";
+import rightContent from './addFeatures/rightContent.vue'
mixins: [explain1, PatentDetails],
- props: ['patentNo','reportId','isOpinion','sign','evidence'],
+ props: ['patentNo','reportId'],
- TableField
- features: [],//特征数组
refreshData: true,
tableData: [],
- tableData1: [],
- splitType1: "1",
- splitBy1: "2",
- Type: "0",
btnLoading: false,
- tableHeight: null,
loading: false,
checkList: [],
- typeArr: [],
mergeObj: {},
- row: [],//选中特征push到row中
- mergeArr: ['id', 'pRightName'],//解释
- tableField: [
- {
- key: 'Review',
- name: '审委意见',
- hidden: true
- key: 'court',
- name: '法院意见',
- key: 'association',
- name: '关联案件的证据',
+ mergeArr: ['id', 'rightName'],//解释
featureList: [],//选择特征数组
featureName:'',
- addFeatureVisibe:false,
+ evidence:'',
+ right:null,
- tableData() {
- if (this.evidence) {
- this.$nextTick(() => {
- this.setHeight()
+ rightId:this.right,
+ proofId:this.evidence.id,
+ proofSortStr:this.evidence.sortStr,
+ this.$refs.addInvalidDialog.open(form,this.rightDetails)
+ this.getPoofArguments(this.evidence,this.right)
- sign(val) {
- if (val) {
- this.$emit('evidence', this.tableData)
- mounted() {
- // console.log(this.evidence);
- // this.$nextTick(() => {
- this.getPoofArguments(this.evidence.row, this.evidence.right)
- this.getFeature(this.evidence.row, this.evidence.right.sort)
- // })
- // this.getList();
- // this.getRight()
- methods: {
- featureChange(val) {
+ getProofId(id){
+ this.deletes([id])
// 查询陈述意见
getPoofArguments(row, right) {
- // console.log(row,right);
- this.tableData1=[]
+ this.tableData=[]
let params = {
reportId : this.reportId,
- rightSort: right.sort,
+ rightSort: right,
proofId : row.id,
this.$api.queryPoofArguments(params).then((res) => {
if (res.data.length > 0) {
- res.data.forEach(item => {
- let a = {
- pRightName: item.rightName,
- pContent: item.rightContent,
- content: item.featureId,
- featureName: item.featureName,
- evidence:item.proofStr,
- evidence2: item.arguments,
- rightSort: params.rightSort,
- proofId:item.proofId,
- this.tableData1.push(a)
- this.tableData1 = [
- pRightName: right.rightName,
- id: right.sort,
- pType: 0,
- pContent: right.content,
- // 文献ID
- proofId: row.id,
- ]
- this.TypeSelect(this.Type)
- // console.log(this.tableData)
+ // res.data.forEach(item => {
+ // let a = {
+ // pRightName: item.rightName,
+ // pContent: item.rightContent,
+ // content: item.featureId,
+ // featureName: item.featureName,
+ // evidence:item.proofStr,
+ // evidence2: item.arguments,
+ // rightSort: params.rightSort,
+ // proofId:item.proofId,
+ // this.tableData.push(a)
+ this.tableData = res.data
+ this.TypeSelect()
// 查已添加的特征
- getFeature(row,right) {
+ getFeature(right) {
reportId: this.reportId,
rightSort:right
@@ -229,183 +246,46 @@ export default {
this.$api.getFeatureList(params).then((res) => {
if (res.code==200) {
this.featureList=res.data
- // this.tableData =res.data
open(row, right) {
- // this.getList(row, right);
- row.evidence = this.tableData1
- this.getFeature(row, right.sort)
- this.getPoofArguments(row, right)
- //拆分权要
- getList(row, right) {
- // this.tableData1 = [
- // {
- // pRightName: right.rightName,
- // id: right.sort,
- // pType: 0,
- // pContent: right.content,
- // // 文献ID
- // proffId:row.id
- // ]
- // this.TypeSelect(this.Type)
- // console.log(this.tableData1,right);
- // this.tableData1 = localStorage.patent
- setHeight() {
- const offsetTop = window.innerHeight - this.$refs.table.$el.offsetTop - 40
- this.height = offsetTop
- const body = document.querySelector('.el-table__body')
- if (!body) {
- return false
- const offsetBodyHeight = body.offsetHeight
- //console.log( window.innerHeight,body,offsetBodyHeight,offsetTop)
- if (this.tableData.length && offsetBodyHeight < offsetTop) {
- this.tableHeight = offsetBodyHeight + 75
- } else if (!this.tableData.length) {
- this.tableHeight = null
- this.tableHeight = offsetTop
- this.tableHeight = this.tableHeight > 300 ? this.tableHeight : 300
- //选中特征
- getFunInfo(row, scope, type) {
- let Index = this.row.findIndex(item => { return item.id == row.id })
- if (Index < 0) {
- row.$index = scope.$index
- row.choseType = type
- this.row.push(row)
- this.row.splice(Index, 1)
- //添加陈述意见
- addOpinion() {
- if (this.row.length > 1) {
- this.$alert('不能同时给多条特征添加陈述意见', '提示', {
- type: 'warning',
- callback: action => {
- if (this.row[0].choseType != 0) {
- this.$alert('请选择特征添加陈述意见', '提示', {
- this.checkList = []
- var Index = this.tableData1.findIndex(item => {
- return item.id == this.row[0].id
- if (Index != -1) {
- if (this.tableData1[Index].hasOwnProperty('evidence2')) {
- this.tableData1[Index].evidence2.push({
- argumentStr: ''
- this.tableData1[Index].evidence2 = [
- this.TypeSelect(this.Type)//调用显示权要
- this.row = []
+ this.evidence = row
+ this.right=right.sort
+ // row.evidence = this.tableData
+ this.getFeature(this.right)
+ this.getPoofArguments(row, this.right)
//添加特征
addFeature() {
- this.addFeatureVisibe=true
closeFeature() {
- this.addFeatureVisibe = false
this.featureName=''
submitFeature() {
content:this.featureName,
- rightId:this.tableData1[0].rightSort,//权要的id
+ rightId:this.tableData[0].rightSort,//权要的id
reportId:this.reportId
this.$api.addSingleFeature(params).then((res) => {
- this.getFeature('',params.rightId)
+ this.getFeature(params.rightId)
this.$message.success('添加特征成功')
this.closeFeature()
- addFeature1() {
- // console.log(this.tableData1,this.tableData);
- this.$alert('不能同时给多个权要添加特征', '提示', {
- if (this.row[0].choseType != 1) {
- this.$alert('请选择权要添加特征', '提示', {
- var Index = this.tableData1.findLastIndex(item => {
- return item.pRightName == this.row[0].pRightName
- if (this.tableData1[Index].hasOwnProperty('content')) {
- let arr = JSON.parse(JSON.stringify(this.tableData1[Index]))
- arr.content = ''
- arr.evidence = ''
- arr.evidence2 = [
- // arr.proofId=
- this.tableData1.splice(Index + 1, 0, arr)
- this.$set(this.tableData1[Index], 'content', '')
- this.$set(this.tableData1[Index], 'evidence', '')
- var evidence2 = [
- this.$set(this.tableData1[Index], 'evidence2', evidence2)
- // console.log(this.tableData1)
//获取每个元素所需合并的行数
getSpanArr(data) {
this.mergeArr.forEach((key, index1) => {
let count = 0;
this.mergeObj[key] = [];
@@ -441,42 +321,9 @@ export default {
this.refreshData = true
- keep() {
- // console.log(this.tableData,this.tableData1);
- var params=[]
- for (let i = 0; i < this.tableData.length; i++){
- params[i] = {
- reportId: this.reportId,
- rightSort: this.tableData[i].rightSort,
- featureId: this.tableData[i].content,
- proofStr: this.tableData[i].evidence,
- proofStrId: 0,
- proofId: this.tableData[i].proofId,
- arguments: this.tableData[i].evidence2,
- // console.log(params);
- this.$api.addOrUpdatePoofArguments(params).then((res) => {
- if (res.code ==200) {
- this.$message.success('添加成功')
- this.getPoofArguments()
- // localStorage.patent = JSON.stringify(this.tableData1)
TypeSelect(event) {//显示
- // this.typeArr = [];
- // if (event == 1) {
- // this.typeArr.push(1);
- // } else {
- // this.typeArr.push(1, 0);
- // }
- // this.tableData = this.tableData1.filter(item => {
- // return this.typeArr.includes(item.pType)
- this.tableData = this.tableData1
+ this.tableData = this.tableData
this.getSpanArr(this.tableData)
@@ -1,632 +0,0 @@
-<template>
- <div class="demo-input-suffix">
- <div style="margin-top: 20px; display: flex; justify-content: space-between">
- <!-- <el-button @click="addFeature" :disabled="row.length > 0 ? false : true">添加特征</el-button> -->
- <el-button @click="addFeature">添加特征</el-button>
- <el-table v-if="refreshData" :data="tableData" ref="table" border :height="tableHeight"
- :span-method="objectSpanMethod" v-loading="loading" style="min-width: 100%; margin-top: 20px;overflow:auto">
- <el-table-column prop="content" label="特征" align="center" width="300px">
- <!-- <el-checkbox-group v-model="checkList" v-if="scope.row.hasOwnProperty('content')"> -->
- <!-- <el-input type="textarea" style="width:250px" autosize v-model="scope.row.content"> {{scope.row.content}}</el-input> -->
- <!-- <el-autocomplete class="inline-input" v-model="scope.row.content" :fetch-suggestions="querySearch"
- placeholder="请输入内容"></el-autocomplete> -->
- <el-select v-model="scope.row.content" placeholder="请选择" style="width:100%" >
- <el-option v-for="item in rightList" :key="item.featureId" :label="item.featureName" :value="item.featureId" :disabled="scope.row.content?true:false">
- @input="saveValue(scope.row,'evidence',$event.target.innerHTML)"
- @input="saveValue(scope.row.evidence2[index],'argumentStr',$event.target.innerHTML)"
- <el-input type="" v-model="rightName"></el-input>
- <el-button @click="addRight">添加</el-button>
- </el-dialog>
-</template>
-<script>
-// import { explain1 } from "../../components/mixins";
-import { PatentDetails } from "@/views/components/common/mixins";
-export default {
- mixins: [ PatentDetails],
- props: ['patentNo', 'reportId', 'isOpinion', 'sign', 'evidenceData',"showBtnRight",'proofGroups'],
- components: {
- data() {
- return {
- refreshData: true,
- btnLoading: false,
- checkList: [],
- mergeObj: {},
- rightList: [],//选择特征数组
- rightName:'',
- };
- watch: {
- evidenceData(val) {
- this.tableData1 = val
- if (this.evidenceData) {
- this.tableData1 = this.evidenceData
- console.log(this.evidenceData)
- if (this.showBtnRight) {
- this.getList(this.proofGroups,this.showBtnRight);
- this.proofGroups.evidence = this.tableData1
- // 查询陈述意见
- getPoofArguments() {
- console.log(this.tableData1);
- let params = {
- reportId : this.reportId,
- rightSort:this.tableData1[0].id,
- proofId : this.tableData1[0].proffId,
- this.$api.queryPoofArguments(params).then((res) => {
- if (res.code == 200) {
- evidence2:item.arguments,
- let b = {
- featureId: item.featureId,
- this.tableData
- // let index=this.tableData.findIndex(item1 => {
- // return item1.id==item.featureId
- // if (index!=-1) {
- // this.tableData.push(a)
- // this.rightList.push(b)
- // }else{
- // this.tableData.splice(index,1,a)
- // this.rightList.push(index,1,b)
- // 查已添加的特征
- getRight() {
- rightSort:this.tableData1[0].id
- this.$api.getFeatureList(params).then((res) => {
- if (res.code==200) {
- this.rightList=res.data
- querySearch(queryString, cb) {
- // var restaurants = this.restaurants;
- // var results = queryString ? restaurants.filter(this.createFilter(queryString)) : restaurants;
- // 调用 callback 返回建议列表的数据
- cb(this.features);
- open(row, right) {
- this.getList(row, right);
- this.getRight()
- //合并
- merge() {
- //console.log(this.row)
- var sign = this.row[0].rightId
- var allow = true
- this.row.forEach(item => {
- if (item.rightId != sign) {
- allow = false
- });
- if (!allow) {
- this.$alert('不能合并不同权要的特征', '提示', {
- return false;
- // this.keepSure=false
- var str = ''
- var strText = ""
- if (this.row != []) {
- let row = this.row.sort((aId, bId) => {
- return aId.$index - bId.$index;
- row.sort((aId, bId) => {
- if (aId.$index - bId.$index != 1) {
- this.$alert('只能合并相邻的特征', '提示', {
- for (var i = 0; i < this.row.length; i++) {
- if (i < row.length - 1) {
- str = str + row[i].content
- strText = strText + row[i].evidence
- let Index = this.tableData1.findIndex(item => { return item.id == row[i].id })
- this.tableData1.splice(Index, 1)
- } else if (i == row.length - 1) {
- var a = this.tableData1.findIndex(item => {
- return item.id == this.row[this.row.length - 1].id
- this.tableData1[a].content = str
- this.tableData1[a].evidence = strText
- //拆分
- split() {
- this.$alert('不能同时拆分多条特征', '提示', {
- //只对勾选的进行拆分
- this.row.forEach(ele => {
- return item.id == ele.id
- var a = Math.floor((Math.random() * 9999) + 1000);
- let tab = {
- pSignPatentNo: ele.pSignPatentNo,
- pPatentId: ele.pPatentId,
- pContent: ele.pContent,
- pRightName: ele.pRightName,
- pType: ele.pType,
- pSort: ele.pSort,
- pReportId: ele.pReportId,
- pContentOut: ele.pContentOut,
- id: ele.id + "a" + ele.$index + a,
- signPatentNo: ele.signPatentNo,
- contentOut: "",
- content: "",
- rightId: ele.rightId,
- isFinal: ele.isFinal,
- reportId: ele.reportId,
- evidence: "",
- evidence2: '',
- rightName: ele.rightName,
- rightType: ele.rightType,
- splitBy: ele.splitBy,
- // //console.log(tab)
- this.tableData1.splice(Index + 1, 0, tab)
- //添加特征
- addFeature() {
- closeFeature() {
- this.rightName=''
- addRight() {
- // this.rightList.push(this.rightName)
- content:this.rightName,
- rightId:this.tableData1[0].id,//权要的id
- reportId:this.reportId
- this.$api.addSingleFeature(params).then((res) => {
- this.$message.success('添加特征成功')
- this.closeFeature()
- content: ''
- console.log(this.tableData1)
- //获取每个元素所需合并的行数
- 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);
- if (item[key] === data[index - 1][key] && item[key] !== 'evidence') {
- this.mergeObj[key][count] += 1;
- this.mergeObj[key].push(0);
- count = index;
- //合并行
- 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]
- return [0, 0];
- openField() {
- this.$refs.tableField.open(this.tableField)
- getTableField(val) {
- this.tableField = val
- this.refreshTable()
- refreshTable() {
- this.refreshData = false
- this.refreshData = true
- console.log(row,right);
- proffId:row.id
- console.log(this.tableData1,right);
- rightSort: this.tableData[i].id,
- proofId: this.tableData[i].proffId,
- // 条件选择下拉框
- splitTypeSelect(event) {//拆主权要
- this.splitType1 = event;
- this.splitPatentRight()
- splitBySelect(event) {//按符号拆分
- //console.log(event);
- this.splitBy1 = event;
- this.splitPatentRight();
- TypeSelect(event) {//显示
- this.typeArr = [];
- if (event == 1) {
- this.typeArr.push(1);
- this.typeArr.push(1, 0);
- this.tableData = this.tableData1.filter(item => {
- return this.typeArr.includes(item.pType)
- this.getSpanArr(this.tableData)
-};
-</script>
-<style lang="scss" scoped>
-.innerTable .item {
- /* min-width:200px; */
- padding: 20px 0;
- margin: 0;
- display: flex;
- justify-content: flex-start;
- align-items: center;
- // height: 130px;
- line-break: normal;
- overflow: auto;
- border-bottom: 1px solid #EBEEF5;
-.innerTable .item:last-child:first-child {
- //item 即是最后一个元素 又是第一个元素
-.innerTable .item:nth-child(1) {
-.innerTable .item:last-child {
- border-bottom: none;
-</style>
@@ -1,38 +1,35 @@
<!-- 无效理由和证据 -->
- <div @click="clickBody">
<div style="display:flex;justify-content: flex-end;margin-bottom:10px">
<el-button type="primary" size="small" @click="addInvalid">添加无效证据</el-button>
+ <el-button type="primary" size="small" @click="addCourtOpinion">添加法院意见</el-button>
<el-button type="primary" size="small" @click="openField">显示栏位管理</el-button>
+ <el-button type="primary" size="small" @click="exportInvalid" :loading="btnLoading">导出无效理由</el-button>
- <el-table border v-if="refreshData" :data="tableData" :span-method="objectSpanMethod" :height="tableHeight" >
- <el-table-column prop="index" label="序号" align="center">
+ <el-table border ref="table" v-if="refreshData" :data="tableData" row-key="id" :expand-row-keys="expands" :span-method="objectSpanMethod" :maxHeight="tableHeight">
+ <el-table-column prop="index" label="序号" align="center" width="80px">
{{ scope.$index + 1 }}
- <el-table-column v-for="item in tableField.filter(item => !item.hidden)" :key="item.key" :label="item.name" :prop="item.key" align="center">
+ <el-table-column v-for="item in tableField.filter(item => !item.hidden)" :key="item.key" :label="item.name" :prop="item.key" align="center" type>
- <!-- <el-input v-model='scope.row[item.key]' type="textarea"
- v-if='(scope.row.index == tabRowIndex && scope.column.index == tabColumnIndex) && ["proofStr","argumentStr","comOptions","courtOptions"].includes(scope.column.property)'
- @blur='inputBlur(scope.row)' size="mini" ></el-input> -->
<div v-if="item.key == 'proofStr'">
- <span v-if="scope.row.proofGroups.length > 0">
+ <!-- <span v-if="scope.row.proofGroups.length > 0">
<p v-for="(i, index) in scope.row.proofGroups" :key="index">
<span v-for="(y, index1) in i.proofs" :key="y.label">
- <el-popover placement="top-start" width="800" trigger="hover" :close-delay="100000" ref="popoverHover">
+ <el-popover placement="top-start" width="800" trigger="hover" ref="popoverHover">
<p><span>描述:</span><span>{{ y.description }}</span></p>
- <Invalid-Evidence ref="invalid" :sign="sign" @evidence="getEvidence" :evidence="showPopover(y,scope.row.content)" :reportId="reportId" :patentNo="signPatentNo"></Invalid-Evidence>
+ <Invalid-Evidence ref="invalid" :sign="sign" @evidence="getEvidence" :evidence="showPopover(y,scope.row.content,index)" :reportId="reportId" :patentNo="signPatentNo"></Invalid-Evidence>
<el-link @click="check(item, y)" slot="reference">D{{ y.sort }}</el-link>
- <!-- <i class="el-icon-arrow-down el-icon--right"></i> -->
- <!-- <i class="el-icon-edit" @click.stop="visibleIcons"></i> -->
</el-popover>
<span v-if="index1 < i.proofs.length - 1"> + </span>
</span>
@@ -47,53 +44,58 @@
</p>
+ <span v-if="scope.row.proofGroups.length > 0">
+ <p v-for="(i, index) in scope.row.proofGroups" :key="index">
+ <span v-for="(y, index1) in i.proofs" :key="y.label">
+ <el-link @click="check(item, y)">D{{ y.sort }}</el-link>
+ <span v-if="index1 < i.proofs.length - 1"> + </span>
<span>
{{ scope.row[item.key] }}
- <div v-else>{{ getData(scope.row,item.key) }}</div>
- <!-- invalidName -->
- <!-- <div v-if="scope.row.invalidName == 1 || scope.row.invalidName == 2">
- <span v-if="item.key == 'invalidName'">{{ invalidList.find(item => item.value == scope.row.invalidName).label }}</span>
- <span v-else v-html="scope.row[item.key]"></span>
- <div v-else>
- <span v-if="item.key != 'proofStr' || scope.row.proofGroups.length == 0">
- </span>
- <span v-else-if="scope.row.proofGroups.length > 0">
- <p v-for="(i, index) in scope.row.proofGroups" :key="index">
- <span v-for="(y, index1) in i.proofGroups" :key="y.label">
- <el-popover placement="top-start" width="800" trigger="hover">
- <p><span>描述:</span><span>{{ y.description }}</span></p>
- <Invalid-Evidence ref="invalid" :sign="sign" @evidence="getEvidence"
- :evidenceData="y.evidence"></Invalid-Evidence>
- <el-link @click="check(item, y)" slot="reference">{{ y.label }}</el-link>
- </el-popover>
- <span v-if="index1 < i.proofGroups.length - 1"> + </span>
- <el-popover placement="top-start" width="200" trigger="hover">
- <p><span>描述:</span><span>{{ i.description }}</span></p>
- <p><span>陈述意见:</span><span>{{ i.argumentStr }}</span></p>
- <span class="check" slot="reference">
- <i class="el-icon-view chakan"></i>
- <i class="el-icon-circle-close guanbi" @click="delCompose(scope.row.proofGroups, index)"></i>
- </p>
+ <div v-else-if="item.key == 'court'">{{ getData(scope.row,item.key) }} <span style="margin-left:20px;float:right" v-if="scope.row.invalidName == 3 || scope.row.invalidName == 2"> <el-link type="primary" @click="toogleExpand(scope.row,scope.$index)">详情</el-link> </span></div>
+ <div v-else v-html="getData(scope.row,item.key)"></div>
+ <el-table-column v-for="item in tableField2.filter(item => item.fieldState)" :key="item.fieldKey" :label="item.fieldName" :prop="item.fieldKey" align="center" type>
+ <template slot="header">
+ <span>{{ item.fieldName }}</span>
+ <span class="margin-left_10">
+ <el-link type="primary" v-if="!item[('edit'+item.fieldKey)]" @click="edit('edit'+item.fieldKey,item)">
+ <span v-else>
+ <el-link type="primary" @click="save('edit'+item.fieldKey,item)">
+ <el-tooltip class="item" effect="dark" content="保存" placement="top">
+ <i class="iconfont icon-baocun"></i>
+ <el-link class="margin-left_10" type="primary" @click="cancelEdit('edit'+item.fieldKey,item)">
+ <el-tooltip class="item" effect="dark" content="取消编辑" placement="top">
+ <i class="iconfont icon-fanhui"></i>
- </div> -->
+ <div v-if="item[('edit'+item.fieldKey)]">
+ <myRich-Text v-model="scope.row[item.fieldKey]" :placeholder="'请输入'+item.fieldName"></myRich-Text>
+ <div v-else v-html="getData1(scope.row,item.fieldKey)"></div>
- <el-table-column label="操作" align="center" width="180px">
+ <el-table-column label="操作" align="center" width="180px" type>
<el-button @click.native.prevent="editRow(scope.row)" type="text" size="small"> 编辑 </el-button>
@@ -101,15 +103,16 @@
+ <el-table-column type="expand" width="1">
+ <InvalidDetails :invalidReasonId="scope.row.id" :reportId="reportId" :patentNo="signPatentNo" :rightSort="scope.row.content" :right="rightList.find(item => item.sort == scope.row.content)"></InvalidDetails>
- <!-- <div style="text-align: center;margin-top: 10px;">
- <el-pagination background layout="total, prev, pager, next, jumper" :current-page.sync="queryParams.current"
- :page-size.sync="queryParams.size" @current-change="handleCurrentChange" :total="queryParams.total">
- </el-pagination>
<Table-Field ref="tableField" :reportId="reportId" @update="getTableField"></Table-Field>
- <el-dialog :title="title" :visible.sync="visible" width="800px" :before-close="close">
+ <el-dialog :title="title" :visible.sync="visible" width="800px" :before-close="close" :append-to-body="true">
<el-form :model="form" ref="form" :rules='rules' label-width="100px" label-position="left">
<el-form-item label="无效理由:" prop="invalidName">
@@ -129,30 +132,22 @@
<template v-if="form.invalidName == 0 && (form.content == 0 || form.content) ">
<!-- features -->
<el-form-item label="选择特征:">
- <span v-for="item in form.features" :key="item.id" style="margin-right:10px">{{ item.features }}</span>
- <span v-if="rightFeaturesList && rightFeaturesList.length > 0"><el-link type="primary" @click="showFeatures = true">添加</el-link></span>
- <span >{{ rightList.find(item => item.sort == this.form.content).content }}</span>
- <div v-if="showFeatures">
- <InvalidFeatures :patentNo="signPatentNo" :rightFeaturesList="rightFeaturesList" @checkFeatures="checkFeatures" @closeFeatures="closeFeatures"></InvalidFeatures>
+ <rightContent :right="rightList.find(item => item.sort == this.form.content)" :reportId="reportId"></rightContent>
+ <!-- <span >{{ rightList.find(item => item.sort == this.form.content).content }}</span> -->
- <el-form-item label="相关证据:" v-if="form.content == 0 || form.content || form.invalidName">
+ <el-form-item label="相关证据:" v-if="form.content == 0 || form.content">
<span v-if="form.invalidName == 0 || form.invalidName == 1">
<el-input type="text" v-model="form.proofStr" placeholder="请输入相关证据" style="width:100%"></el-input>
<div v-else>
- <span v-for="(item, index) in form.proofGroups" :key="index" style="margin-right:10px">
+ <!-- <span v-for="(item, index) in form.proofGroups" :key="index" style="margin-right:10px">
<span v-for="(i, index1) in (item.proofs)" :key="i.label">
- <!-- {{ i }} -->
+ <el-popover placement="top-start" width="800" trigger="hover" ref="popoverHover" >
<p><span>描述:</span><span>{{ i.description }}</span></p>
- <!-- -->
- <Invalid-Evidence ref="invalid" :patentNo="signPatentNo" :evidence="showPopover(i)" :reportId="reportId" :sign="sign" @evidence="getEvidence"></Invalid-Evidence>
+ <Invalid-Evidence ref="invalid" :patentNo="signPatentNo" :evidence="showPopover(i,null,index)" :reportId="reportId" :sign="sign" @evidence="getEvidence"></Invalid-Evidence>
<el-link v-if="i.sort" slot="reference">D{{ i.sort }}</el-link>
@@ -170,8 +165,25 @@
<i class="el-icon-circle-close guanbi" @click="delCompose(form.proofGroups, index)"></i>
- </span><span><el-link type="primary" @click="showBtn()">添加</el-link></span>
+ <span v-for="(item, index) in form.proofGroups" :key="index" style="margin-right:10px">
+ <span v-for="(i, index1) in (item.proofs)" :key="i.label">
+ <el-link v-if="i.sort">D{{ i.sort }}</el-link>
+ <el-link v-else>{{ i.sortStr }}</el-link>
+ <span v-if="index1 < item.proofs.length - 1">+</span>
+ <el-popover placement="top-start" width="200" trigger="hover">
+ <p><span>描述:</span><span>{{ item.description }}</span></p>
+ <p><span>陈述意见:</span><span>{{ item.argumentStr }}</span></p>
+ <span class="check" slot="reference">
+ <i class="el-icon-view chakan"></i>
+ <i class="el-icon-circle-close guanbi" @click="delCompose(form.proofGroups, index)"></i>
+ <span v-if="!show"><el-link type="primary" @click="showBtn()">添加</el-link></span>
<template v-if="show" >
<el-table :data="EvidenceList" style="overflow: auto;" height='300'>
@@ -189,8 +201,10 @@
<!-- 打开证据弹窗,添加证据文献中的证据 -->
- {{ scope.row.sortStr }} <span style="float:right" @click="openEvidence(scope.row)"><el-link
- type="primary">详情</el-link></span>
+ {{ scope.row.sortStr }}
+ <span style="float:right" @click="openEvidence(scope.row)">
+ <el-link type="primary">选择无效证据</el-link>
@@ -223,23 +237,17 @@
<el-form-item label="陈述意见:">
- <el-input type="textarea" :rows="1" v-model="form.argumentStr"></el-input>
- <!-- <div style="width:100%;outline: #dcdfe6;border:1px solid #DCDFE6;border-radius:5px;min-height:50px;background:white" id="preview" contenteditable="true"
- v-html="form.argumentStr" @input="saveValue($event.target.innerHTML)" @click="saveValue($event.target.innerHTML)">
+ <myRich-Text v-model="form.argumentStr" placeholder="请输入陈述意见"></myRich-Text>
+ <el-form-item v-for="item in tableField2" :key="item.fieldKey" :label="item.fieldName+':'">
+ <myRich-Text v-model="form[item.fieldKey]" :placeholder="'请输入'+item.fieldName"></myRich-Text>
- <el-form-item label="复审委意见:">
+ <!-- <el-form-item label="复审委意见:">
<el-input type="textarea" :rows="1" v-model="form.comOptions"></el-input>
- v-html="form.comOptions" @input="saveValue($event.target.innerHTML)" @click="saveValue($event.target.innerHTML)">
<el-form-item label="法院意见:">
<el-input type="textarea" :rows="1" v-model="form.courtOptions"></el-input>
- v-html="form.courtOptions" @input="saveValue($event.target.innerHTML)" @click="saveValue($event.target.innerHTML)">
</el-form>
<div slot="footer" class="dialog-footer">
@@ -247,22 +255,35 @@
<el-button type="primary" @click="sure">确 定</el-button>
- <el-dialog title="添加证据" :visible.sync="EvidenceVisible" width="1000px" :before-close="closeEvidence" append-to-body>
- <Invalid-Evidence ref="invalid" :reportId="reportId" :patentNo="signPatentNo" :sign="sign" @evidence="getEvidence"></Invalid-Evidence>
+ <Invalid-Evidence ref="invalid" :reportId="reportId" :patentNo="signPatentNo" ></Invalid-Evidence>
+ <AddOrEditField ref="addOrEditField" :reportId="reportId" :tableFields="tableField2" @submit="queryInvalidFields()"></AddOrEditField>
import TableField from './TableField.vue'
import InvalidEvidence from './InvalidEvidence.vue'
import InvalidFeatures from './InvalidFeatures.vue'
+import InvalidDetails from './InvalidDetails/InvalidDetails.vue'
+import AddOrEditField from './addOrEditField.vue'
+import { downLoad2 } from "@/utils";
props: ['reportId','signPatentNo','reportType'],
TableField,
InvalidEvidence,
InvalidFeatures,
+ InvalidDetails,
+ rightContent,
+ AddOrEditField
const contentRule = (rule, value, callback) => {
if (this.form.invalidName == 1) {
@@ -277,7 +298,8 @@ export default {
- sign: false,
+ expands:[],
description: '',
argumentStr: '',
show: false,
@@ -312,17 +334,18 @@ export default {
name: '陈述意见',
hidden: false
- key: 'comOptions',
- name: '复审委意见',
- key: 'courtOptions',
+ // key: 'comOptions',
+ // name: '复审委意见',
+ // hidden: true
+ // key: 'courtOptions',
+ // name: '法院意见',
],//显示栏位管理
+ tableField2:[],
invalidList: [
id: 0,
@@ -356,62 +379,125 @@ export default {
rightFeaturesList: [],
mergeArr: ['invalidName'],//解释
- tableHeight: '',
+ tableHeight: document.getElementsByClassName('el-main')[0].clientHeight - 100,
// tabRowIndex:null,//行角标
// tabColumnIndex:null,//列角标
+ rowData:'',
async mounted() {
+ //获取自定义栏位
+ this.queryInvalidFields()
// 请求专利权要
await this.getPatentByPatentNo()
// 请求证据文献
this.getQueryProofList()
// 请求无效理由和证据
await this.getInvalidReason()
- // 请求划词特征
- // this.getFeaturesList()
- this.getHeight()
- clickBody(event) {
- if (event.target === document.body || document.body.contains(event.target)) {
- for (let i = 0; i < this.$refs.popoverHover.length; i++){
- this.$refs.popoverHover[i].doClose()
+ //导出无效理由和证据
+ exportInvalid(){
+ this.btnLoading = true
+ this.$api.exportInvalid({reportId:this.reportId}).then(response=>{
+ this.$message.success('导出成功')
+ downLoad2(response.data)
+ this.btnLoading = false
+ this.$message.error('导出失败,请重试')
+ //编辑列数据
+ edit(key,row){
+ this.$set(row,key,true)
+ this.tableData.forEach(item=>{
+ item[row.fieldKey] = this.getData1(item,row.fieldKey)
+ this.refreshTable()
+ //保存列数据
+ save(key,row){
+ var params = []
+ params.push(
+ "invalidReasonId": item.id,
+ "fieldId": row.id,
+ "fieldValue": item[row.fieldKey],
+ "fieldKey": row.fieldKey
+ this.$api.addOrUpdateValue(params).then(response=>{
+ this.$message.success('编辑成功')
+ this.$set(row,key,false)
+ //取消编辑列数据
+ cancelEdit(key,row){
+ item[row.fieldKey] =''
+ //添加法院意见
+ addCourtOpinion(){
+ var form = {}
+ this.$refs.addOrEditField.open(form)
+ queryInvalidFields(){
+ this.$api.queryInvalidFields({reportId:this.reportId}).then(response=>{
+ this.tableField2 = response.data
- // 获取点击的单元格位置
- // getCell(row, column, cell, event) {
- // this.tabRowIndex = row.index
- // this.tabColumnIndex = column.index
- // 把角标赋值给行和列,赋值后可以直接拿到点击位置的坐标
- // getRowColumn({ row, column, rowIndex, columnIndex }) {
- // row.index = rowIndex
- // column.index = columnIndex
- // inputBlur(val) {
- // // 把输入框隐藏
- // this.tabRowIndex = null
- // this.tabColumnIndex = null
- // val.reportId=this.reportId
- // this.$api.updatelnvalidReason(val).then((res) => {
- // if (res.code == 200) {
- // this.$message.success('更新成功')
- // this.getInvalidReason()
- // // 发请求把修改的数据发送给后台
- // // this.subForm()
// table高度
getHeight() {
- let a = document.body.clientHeight
- this.tableHeight=a-300
+ this.tableHeight = document.getElementsByClassName('el-main')[0].clientHeight - 100
+ //展开行
+ toogleExpand(row,index) {
+ var index1 = this.expands.findIndex(item=>{
+ return item == row.id
+ if(index1 == -1){
+ var a = []
+ a[0] = this.tableData.slice(0,index+1)
+ a[1]= this.tableData.slice(index+1,this.tableData.length)
+ var invalidName = []
+ a.forEach(item=>{
+ invalidName = invalidName.concat(this.getSpanArr(item))
+ this.mergeObj.invalidName = invalidName
+ this.getSpanArr(this.tableData)
+ if(index1!=-1){
+ this.expands = []
+ this.expands = [row.id]
// 回显
getData(row,key) {
if (key == 'invalidName') {
@@ -428,14 +514,28 @@ export default {
return row[key]
+ getData1(row,key){
+ var index = row.fields.findIndex(item=>item.fieldKey == key)
+ return row.fields[index].fieldValue
+ // 请求无效理由和证据
async getInvalidReason() {
await this.$api.queryInvalidReason({reportId:this.reportId}).then((res) => {
- var a = [...new Set(res.data.map(item => item.invalidName))]
- this.tableData=res.data.sort((x,y)=>{
- return a.indexOf(x.invalidName) - a.indexOf(y.invalidName)
- // this.tableData=res.data
+ var a = [...new Set(res.data.map(item => item.invalidName))]
+ this.tableData=res.data.sort((x,y)=>{
+ return a.indexOf(x.invalidName) - a.indexOf(y.invalidName)
@@ -459,6 +559,7 @@ export default {
+ return this.mergeObj.invalidName
//合并行
objectSpanMethod({ row, column, rowIndex, columnIndex }) {
@@ -470,22 +571,6 @@ export default {
- // 划词特征
- getFeaturesList() {
- this.rightFeaturesList = [
- // {features:'特征1',id:0},
- // {features:'特征2',id:1},
- // {features:'特征3',id:2},
- checkFeatures({proofGroups,close}) {
- this.form.features = proofGroups
- this.showFeatures=close
- console.log(proofGroups,close);
- closeFeatures(val) {
- this.showFeatures=val
// 证据组合hover
showBtn() {
@@ -500,6 +585,7 @@ export default {
+ //查询所有证据文献
getQueryProofList() {
reportId:this.reportId,
@@ -509,7 +595,10 @@ export default {
this.$api.queryProof(params).then((res) => {
- this.EvidenceList=res.data
+ this.EvidenceList=res.data.map(item=>{
+ item.proofStrIds = []
}).catch((error) => {
@@ -529,22 +618,19 @@ export default {
//打开添加证据弹窗
openEvidence(row) {
- // console.log(row, rightList, contentSort);
- let right = this.rightList.find(item => { return item.sort == this.form.content })
+ this.rowData = row
this.EvidenceVisible = true
- this.$refs.invalid.open(row,right)
+ this.$refs.invalid.open(row,this.rightList.find(item => item.sort == this.form.content))
//关闭添加证据弹窗
closeEvidence() {
+ this.rowData.proofStrIds = []
this.EvidenceVisible = false
- // console.log(this.form,this.proofGroups);
- //获取子组件传回来的证据、
- getEvidence(val) {
- // console.log(val);
- // this.proofGroups
//添加证据组合
submit() {
@@ -552,15 +638,20 @@ export default {
this.$message.error('请选择后再添加')
return false
- this.sign = true
var a = {
description: this.description,
argumentStr: this.argumentStr,
- proofs: this.proofGroups,
+ proofs: this.proofGroups.sort((a,b)=>{
+ return Number(a.sortStr.substring(1,a.sortStr.length)) - Number(b.sortStr.substring(1,b.sortStr.length))
+ }),
proofIds: this.selected,
+ groupDetails:this.proofGroups.map(item=>{
+ compareFileId:item.id,
+ proofStrIds:item.proofStrIds
- console.log(this.form,this.proofGroups);
this.form.proofGroups.push(a)
this.cancel()
@@ -577,7 +668,7 @@ export default {
contentChange() {
this.form.proofGroups = []
- localStorage.removeItem('patent')
+ // localStorage.removeItem('patent')
//选择证据
changeSelect(row) {
@@ -591,30 +682,10 @@ export default {
this.proofGroups.splice(index, 1)
- // popover
- showPopover(val,id) {
- // console.log(val,this.rightList,id);
- row: val,
- right:this.rightList.find(item => { return item.sort == id }) || this.rightList.find(item => { return item.sort == this.form.content })
- //下拉框隐藏时获取证据
- if (!val) {
- this.form.proofStr = this.form.proofGroups.join('+')
//查看证据文献
check(item,val) {
- // console.log('11', item, val);
var router = this.$router.resolve({
- path: '/ContrastIndex/' + val.id,
- // query: {
- // patentNo: val.patentNo,
let params = this.$s.getSession('params')
params.type=7
@@ -627,11 +698,16 @@ export default {
//打开显示栏位管理弹窗
openField() {
+ this.$refs.tableField.open(this.tableField2)
//获取表格最新显示栏位
+ getTableField({val,update}) {
+ this.tableField2 = val
+ if(update){
this.refreshTable()
//重置表格
@@ -657,25 +733,34 @@ export default {
//确认添加无效理由和证据
sure() {
- // this.form.features = this.rightList.find(item => { return item.id == this.form.content }).content
- // console.log(this.form);
// 为说明书时content为-1
this.form.content == -1
this.form.reportId = this.reportId
+ this.form.fields = []
+ for(let key in this.form){
+ var index = this.tableField2.findIndex(item=>{
+ return item.fieldKey == key
+ this.form.fields.push(
+ "invalidReasonId":this.form.id|| 0,
+ "fieldId": this.tableField2[index].id,
+ "fieldValue": this.form[key]
if (this.form.isEdit) {
this.sureEdit()
this.$refs.form.validate((valid) => {
if (valid) {
- // this.tableData.push(this.form)
- // this.tableData[0].reportId=this.reportId
if (!this.form.id) {
this.$api.addInvalidReason(this.form).then((res) => {
- // console.log(this.tableData,this.form);
this.getInvalidReason()
this.close()
@@ -692,8 +777,7 @@ export default {
sureEdit() {
- console.log(this.form);
- this.$api.updatelnvalidReason(this.form).then((res) => {
+ this.$api.updateInvalidReason(this.form).then((res) => {
this.$message.success('更新成功')
@@ -706,26 +790,41 @@ export default {
let id = [
row.id,
]
- this.$api.deleteInvalidReason(id).then((res) => {
- this.getInvalidReason()
+ this.$confirm('是否确定删除?', '提示', {
+ this.$api.deleteInvalidReason(id).then((res) => {
+ this.$message({
+ type: 'info',
+ message: '已取消删除'
editRow(row) {
this.title="编辑无效理由和证据"
- this.form=row
+ this.form=JSON.parse(JSON.stringify(row))
+ this.form.fields.forEach(item=>{
+ this.form[item.fieldKey] = item.fieldValue
this.visible = true
- console.log(row);
- this.queryParams.current = val
<style lang="scss" scoped>
// .check:hover::after{
// content:'X'
@@ -1,10 +1,14 @@
<div class="">
- <el-dialog title="显示栏位管理" :visible.sync="visible" width="650px" append-to-body destroy-on-close :before-close="close" top="10vh">
- <div class="project-table-field">
+ <el-dialog title="显示栏位管理" :visible.sync="visible" width="300px" append-to-body destroy-on-close :before-close="close" top="10vh">
+ <!-- <div class="project-table-field">
<el-transfer
class="transfer"
v-model="selected"
+ :props="{
+ key: 'fieldKey',
+ label: 'fieldName'
+ }"
filterable
:filter-method="filterMethod"
:titles="['未选择', '已选择']"
@@ -13,25 +17,68 @@
@right-check-change="rightCheckChange"
@change="handleChange2"
:data="dataList">
- <span slot-scope="{ option }">{{ option.name }}</span>
- <div slot="left-footer"></div>
+ <span slot-scope="{ option }">
+ <span>{{ option.fieldName }}</span>
+ <span style="float:right">
+ <i class="el-icon-delete" @click.stop.prevent="delField(option)"></i>
+ <i class="iconfont icon-bianji margin-left_10" @click.stop.prevent="editField(option)"></i>
+ <div class="transfer-footer" slot="left-footer">
+ <el-button @click="addField(0)" size="small" icon="el-icon-plus" circle></el-button>
<div class="transfer-footer" slot="right-footer">
<el-button @click="handleQueryOrder(-1)" type="primary" size="small" icon="el-icon-top" circle></el-button>
<el-button @click="handleQueryOrder(1)" size="small" icon="el-icon-bottom" circle></el-button>
+ <el-button @click="addField(1)" size="small" icon="el-icon-plus" circle></el-button>
</el-transfer>
+ <el-checkbox-group v-model="selected">
+ <p v-for="option in dataList" :key="option.fieldKey" style="margin:10px 0;">
+ <el-checkbox :label="option.fieldKey">
+ </el-checkbox>
+ <i class="el-icon-delete" @click.prevent="delField(option)" style="font-size:16px"></i>
+ <i class="iconfont icon-bianji margin-left_10" @click.prevent="editField(option)"></i>
<el-button @click="close">取 消</el-button>
<el-button type="primary" @click="submit" :loading="btnLoading">确 定</el-button>
+ <el-dialog :title="title" :visible.sync="addVisible" width="650px" append-to-body :before-close="cancel">
+ <el-form ref="form" :model="form" label-width="80px">
+ <el-form-item label="栏位名称">
+ <el-input v-model="form.fieldName" placeholder="请输入栏位名称"></el-input>
+ <el-form-item label="栏位字段">
+ <el-input v-model="form.fieldKey" placeholder="请输入栏位字段"></el-input>
+ <el-button @click="cancel">取 消</el-button>
+ <el-button type="primary" @click="submitField" :loading="btnLoading2">确 定</el-button>
+ <AddOrEditField ref="addOrEditField" :reportId="reportId" :tableFields="dataList" @submit="queryInvalidFields(1)"></AddOrEditField>
@@ -40,11 +87,91 @@ export default {
selected: [],
rightSelect: [],
+ addVisible:false,
+ btnLoading2: false,
+ title:''
+ //打开编辑显示栏位弹窗
+ editField(option){
+ this.title = '编辑显示栏位管理'
+ this.form = JSON.parse(JSON.stringify(option))
+ this.$refs.addOrEditField.open(this.form)
+ // this.addVisible = true
+ //删除显示栏位
+ delField(option){
+ this.deletes([option.id])
+ this.$api.deleteInvalidFields(ids).then(response=>{
+ //打开添加显示栏位弹窗
+ addField(val){
+ this.title = '添加显示栏位管理'
+ this.form.fieldState=val
+ this.addVisible = true
+ //关闭添加显示栏位弹窗
+ this.addVisible = false
+ //确认添加显示栏位
+ submitField(){
+ this.btnLoading2 = true
+ this.form.reportId = this.reportId
+ this.$api.addOrUpdateInvalidFields(this.form).then(response=>{
+ this.btnLoading2 = false
+ if(this.form.id){
+ this.cancel()
+ queryInvalidFields(val){
+ this.$emit('update',{val:response.data})
+ this.$emit('update',{val:response.data,update:true})
+ this.dataList = response.data
+ this.selected = this.dataList.filter(item => item.fieldState).map(item => item.fieldKey)
handleQueryOrder(order) {
this.rightSelect.map(item => {
const index = this.selected.indexOf(item)
@@ -52,12 +179,12 @@ export default {
if (cIndex < 0 || cIndex >= this.selected.length) {
- let current = this.dataList.find(item => item.key === this.selected[index])
- let exchange = this.dataList.find(item => item.key === this.selected[cIndex])
- current.order = current.order + order
- exchange.order = exchange.order + (order === -1 ? 1 : -1)
+ let current = this.dataList.find(item => item.fieldKey === this.selected[index])
+ let exchange = this.dataList.find(item => item.fieldKey === this.selected[cIndex])
+ current.fieldSort = current.fieldSort + order
+ exchange.fieldSort = exchange.fieldSort + (order === -1 ? 1 : -1)
this.dataList.sort((a, b) => {
- return a.order - b.order
+ return a.fieldSort - b.fieldSort
const temp = this.selected[index]
this.selected[index] = this.selected[cIndex]
@@ -67,20 +194,20 @@ export default {
handleChange2() {
let order = 1
for (let i = 0; i < this.selected.length; i++) {
- const index = this.dataList.map(item => item.key).indexOf(this.selected[i])
- this.dataList[index].order = order++
+ const index = this.dataList.map(item => item.fieldKey).indexOf(this.selected[i])
+ this.dataList[index].fieldSort = order++
filterMethod(query, item) {
- return item.name.indexOf(query) !== -1
+ return item.fieldName.indexOf(query) !== -1
rightCheckChange(data) {
this.rightSelect = data
open(dataList) {
- console.log(dataList)
+ // console.log(dataList)
this.dataList = JSON.parse(JSON.stringify(dataList))
- this.selected = this.dataList.filter(item => !item.hidden).map(item => item.key)
close() {
@@ -88,24 +215,25 @@ export default {
this.$emit('close')
- this.dataList.map(item => item.hidden = this.selected.indexOf(item.key) === -1)
- this.$emit('update', this.dataList)
- this.visible = false
+ // this.dataList.map(item => item.fieldState != this.selected.indexOf(item.fieldKey) === -1)
+ // this.$emit('update', this.dataList)
+ this.dataList.forEach(item => {
+ item.fieldState = 0
+ var index = this.selected.indexOf(item.fieldKey)
+ item.fieldState = 1
+ this.$api.updateSort(this.dataList).then(response => {
this.btnLoading = false
- // let data = {
- // data: this.dataList,
- // projectId: 0,
- // type: 'project',
- // this.btnLoading = true
- // this.$api.updateUserSettingField(data).then(response => {
- // this.$emit('update', response.data)
- // this.visible = false
- // this.btnLoading = false
- // this.$message.success('操作成功')
- // }).catch(error => {
+ this.$message.success('操作成功')
+ this.queryInvalidFields(1)
@@ -115,6 +243,9 @@ export default {
.project-table-field {
text-align: center;
.transfer {
+ .el-transfer-panel__item{
+ margin-right:0
text-align: left;
display: inline-block;
@@ -0,0 +1,122 @@
+ <div @mouseup="mouseup1" @mousemove="mousemove">
+ <div v-if="rightDetails" v-html="getDOMContent(rightDetails.content)" id="rightContent" data-type="权要"></div>
+ <addOpinion ref="addOpinion" @submit="submitFeature"></addOpinion>
+import {patentKeywordsHighlight} from '@/views/components/common/mixins'
+import {addContrast} from '@/views/components/articles/components/mixins'
+import addOpinion from '@/views/report/InvalidResponse/components/addOpinion.vue'
+ props: ['right','reportId'],
+ mixins:[patentKeywordsHighlight,addContrast],
+ rightDetails:this.right||null,
+ featureList:[],
+ rightContent:''
+ right(val){
+ this.rightDetails = val
+ showFeatures(){
+ return this.featureList
+ if(this.rightDetails){
+ window.deleteFeature = this.deleteFeature
+ deleteFeature(id,selectType){
+ this.$confirm('是否删除该特征?', '提示', {
+ this.$api.deleteSingleFeature({featureId:Id}).then(response=>{
+ open(right){
+ rightSort:this.rightDetails.sort
+ getDOMContent(text){
+ this.showFeatures.forEach(item=>{
+ var a = {
+ color: item.color || 'yellow',
+ Type: 1,//1是默认高亮
+ Id: item.featureId,
+ column:'',
+ index: Number(item.position),
+ text:item.content,
+ temNode: text,
+ selectType:'r',
+ text = this.AddClass1(a);
+ this.rightContent = text
+ return text
+ mouseup1(){
+ let selectObj = document.getSelection();
+ if(selectObj.toString().length==0){
+ var node = document.getElementById('rightContent')
+ if(selectObj.focusOffset - selectObj.anchorOffset != selectObj.toString().length){
+ this.$message.error('特征不能存在交叉部分')
+ this.getColumn(node, selectObj);
+ content: selectObj.toString(),
+ position: this.anchorOffset,
+ rightId:this.rightDetails.sort,
+ rightSort:this.rightDetails.sort + '',
+ this.$refs.addOpinion.open(form,true)
+ submitFeature(){
+#rightContent{
+ font-size:18px;
@@ -28,6 +28,9 @@
:key="item.id"
:label="item.sortStr"
:value="item.id">
+ <span>{{ item.sortStr }}</span>
</el-option>
</el-select>
@@ -79,12 +82,13 @@
</el-collapse>
<div v-if="dialogVisible">
- <p style="margin-bottom:0">无效证据:</p>
+ <p style="margin-bottom:0">无效请求书理由:</p>
- <div style="width:100%;outline: #dcdfe6;border:1px solid #DCDFE6;border-radius:5px;min-height:50px;" id="preview"
+ <!-- <div style="width:100%;outline: #dcdfe6;border:1px solid #DCDFE6;border-radius:5px;min-height:50px;" id="preview"
contenteditable="true" v-html="form.proofStr"
@blur="saveValue(form,'proofStr',$event.target.innerHTML)" v-on:paste="handlePaste($event, form, 'proofStr')">
+ <myRich-Text v-model="form.proofStr" placeholder="请输入无效请求书理由"></myRich-Text>
<!-- <div style="width:100%;outline: #dcdfe6;border:1px solid #DCDFE6;border-radius:5px;background:white" id="preview" contenteditable="true"
v-html="form.content2" @input="saveValue($event.target.innerHTML)" @click="saveValue($event.target.innerHTML)">
@@ -93,10 +97,11 @@
<p style="margin-bottom:0">陈述意见:</p>
contenteditable="true" v-html="form.argumentStr"
@blur="saveValue(form,'argumentStr',$event.target.innerHTML)" v-on:paste="handlePaste($event, form, 'argumentStr')">
<!-- <div style="width:100%;outline: #dcdfe6;border:1px solid #DCDFE6;border-radius:5px;min-height:50px;background:white" id="preview" contenteditable="true"
v-html="form.content1" @input="saveValue($event.target.innerHTML)" @click="saveValue($event.target.innerHTML)">
@@ -120,8 +125,8 @@
<span>{{ featureForm.scratchField }}</span>
<el-form-item label="特征内容:">
- <span v-if="show">{{ featureForm.content }}</span>
- <el-input v-else type="textarea" v-model="featureForm.content"></el-input>
+ <span>{{ featureForm.content }}</span>
+ <!-- <el-input v-else type="textarea" v-model="featureForm.content"></el-input> -->
<el-form-item label="对比文献:" v-if="show">
<el-select v-model="featureForm.proofId" placeholder="请选择" style="width:100%">
@@ -130,17 +135,21 @@
<div v-if="featureVisible && show" style="user-select:none;">
contenteditable="true" v-html="form.proofStr" @input="saveValue($event.target.innerHTML)"
@click="saveValue($event.target.innerHTML)">
<!-- <div style="width:100%;outline: #dcdfe6;border:1px solid #DCDFE6;border-radius:5px;min-height:50px;background:white;user-select:none;" id="preview" contenteditable="true"
v-html="featureForm.content2" @input="saveValue($event.target.innerHTML)" @click="saveValue($event.target.innerHTML)">
@@ -149,13 +158,11 @@
contenteditable="true" v-html="form.argumentStr" @input="saveValue($event.target.innerHTML)"
- <!-- <div style="width:100%;outline: #dcdfe6;border:1px solid #DCDFE6;border-radius:5px;min-height:50px;background:white;user-select:none;" id="preview" contenteditable="true"
- v-html="featureForm.content1" @input="saveValue($event.target.innerHTML)" @click="saveValue($event.target.innerHTML)">
@@ -164,14 +171,27 @@
<el-button type="primary" @click="submitFeature">确 定</el-button>
+ <el-dialog title="添加特征" :visible.sync="addFeatureVisible" width="800px" :before-close="closeFeature2" append-to-body>
import { explain1 } from "@/views/report/components/mixins";
+ name:'addOpinion',
+ rightContent: () => import('./addFeatures/rightContent.vue')
mixins:[explain1],
+ rightContent:false,
featureForm: {},
tableData1: [],
@@ -194,28 +214,29 @@ export default {
// 添加陈述意见确认按钮
AddOpinion() {
+ // console.log(this.form);
if (!this.form.featureId) {
this.$message.error('请选择特征')
- if (!this.form.id) {
+ this.form.rightSort = this.form.rightId
+ // if (!this.form.id) {
this.$api.addArguments(this.form).then((res) => {
- this.$message.success('添加陈述意见成功')
+ this.$message.success('添加或修改陈述意见成功')
this.queryScratchs()
this.closeDialog()
- this.$api.updateArguments(this.form).then((res) => {
- this.$message.success('修改陈述意见成功')
- this.queryScratchs()
- this.closeDialog()
+ // this.$api.updateArguments(this.form).then((res) => {
+ // if (res.code == 200) {
+ // this.$message.success('修改陈述意见成功')
+ // this.queryScratchs()
+ // this.closeDialog()
// 查询划词陈述意见
queryScratchs() {
@@ -227,7 +248,6 @@ export default {
// 特征选择
changeRadio(feature) {
- console.log(feature)
this.getFeatureZheng(feature)
treeCheck(node, list) {
@@ -236,16 +256,20 @@ export default {
// 打开
- async open(form, data) {
- console.log(form);
+ async open(form, data,show) {
if (form.scratchType) {
form.scratchType=Number(form.scratchType)
- this.form = form
+ // if(form.proofId == -1){
+ // form.proofId = null
+ this.form = JSON.parse(JSON.stringify(form))
+ if(this.form.proofId == -1){
+ this.form.proofId = null
if (!data) {
await this.getQueryProofList(this.form)
- await this.getFeatureRights(form.patentNo)
+ await this.getFeatureRights(form.signPatentNo)
if (this.form.id) {
this.witchRight = this.form.rightId
await this.getFeature()
@@ -257,9 +281,12 @@ export default {
this.dialogVisible = true
- this.featureForm=form
+ this.featureForm=this.form
this.featureVisible = true
- this.show = true
+ this.show = show
+ if(this.show){
+ this.getQueryProofList(form)
//查询证据文献列表
@@ -286,28 +313,53 @@ export default {
addFeature(val) {
- this.featureForm.rightName = val.rightName
- this.featureForm.rightId = val.sort
- this.featureForm.reportId = this.form.reportId
- this.featureVisible = true
+ // this.featureForm.rightName = val.rightName
+ // this.featureForm.rightId = val.sort
+ // this.featureForm.reportId = this.form.reportId
+ // this.featureVisible = true
+ this.$refs.rightContent.open(val)
this.featureVisible = false
this.show = false
this.featureForm = {}
+ closeFeature2(){
+ this.addFeatureVisible=false
- if (!this.featureForm.rightSort) {
+ if (!this.show) {
// 第二种方式弹窗中添加特征
this.$api.addSingleFeature(this.featureForm).then((res) => {
if (res.code== 200) {
- this.getFeature()
+ // this.getFeature()
+ reportId:this.featureForm.reportId,
+ rightId:this.featureForm.rightId,
+ proofId:this.featureForm.proofId,
+ proofStr:this.featureForm.proofStr,
+ argumentStr:this.featureForm.argumentStr,
+ featureContent:this.featureForm.content,
+ // position:this.featureContent.rightPosition
+ this.closeFeature()
// 请求权要特征
@@ -338,13 +390,19 @@ export default {
// 折叠面板
handleChange(val) {
+ if(!(val+'')){
this.form.rightId=val
this.getFeature()
// 查询已添加的特征
async getFeature() {
- console.log(this.form,this.witchRight);
+ // console.log(this.form,this.witchRight);
+ if(this.witchRight == null){
reportId: this.form.reportId,
rightSort:this.witchRight
@@ -357,7 +415,6 @@ export default {
// 根据特征查询证据
getFeatureZheng(val) {
proofId: this.form.proofId,
featureId:val.featureId,
@@ -365,7 +422,14 @@ export default {
this.$api.queryProofStr(params).then((res) => {
if (res.data.proofStr) {
- this.form.proofStr = res.data.proofStr
+ this.$set(this.form,'proofStr',res.data.proofStr)
+ this.$set(this.form,'proofStrId',res.data.proofStrId)
+ if(res.data.arguments && res.data.arguments.length>0){
+ this.$set(this.form,'argumentStr',res.data.arguments[0].argumentStr)
+ this.$set(this.form,'argumentId',res.data.arguments[0].id)
+ // this.form.proofStr = res.data.proofStr
@@ -377,6 +441,12 @@ export default {
+.el-divider--horizontal{
+ margin:5px 0 !important;
.avatar-uploader-icon {
background-color: #fbfdff;
+ <el-select v-model="form.fieldName" placeholder="请选择栏位名称" style="width:100%" @change="changeFieldName">
+ v-for="item in tableField"
+ :disabled="tableField2.findIndex(item1=>{return item1.fieldName == item.label})!=-1"
+ :value="item.label">
+ props: ['reportId','tableFields'],
+ title:'',
+ btnLoading2:false,
+ tableField:[
+ label:'法院二审',
+ label:'法院三审',
+ label:'法院四审',
+ value:'5',
+ label:'法院五审',
+ label:'法院六审',
+ value:'7',
+ label:'法院七审',
+ value:'8',
+ label:'法院八审',
+ value:'9',
+ label:'法院九审',
+ tableField2:this.tableFields||[]
+ tableFields(val){
+ if(form.id){
+ this.title = '编辑显示栏位'
+ this.title = '添加显示栏位'
+ var a = this.tableField.filter(item=>{
+ return this.tableField2.findIndex(item1=>{item1.fieldName == item.label})==-1
+ this.$set(this.form,'fieldName',a[0].label)
+ this.$set(this.form,'fieldKey','courtOptions'+a[0].value)
+ changeFieldName(val){
+ var i = this.tableField.find(item=>{
+ return item.label == val
+ }).value
+ this.form.fieldKey = 'courtOptions'+i
+ this.$emit('submit')
@@ -1,6 +1,5 @@
<iframe :src="FileUrl" frameborder="0" width="100%" :height="fullHeight"></iframe>
@@ -1,10 +1,31 @@
<div style="margin-bottom: 10px;float: right;">
- <el-button type="primary" size="small" v-if="examine" @click="andClick(1)">上传无效请求书</el-button>
+ <el-dropdown trigger="click" @command="andClick($event)" :hide-on-click="false" type="primary" size="small">
+ 上传文件<i class="el-icon-arrow-down el-icon--right"></i>
+ <el-dropdown-menu slot="dropdown" class="text-align_center">
+ <el-dropdown-item>
+ <el-dropdown @command="andClick($event)" placement="right-start">
+ <span class="el-dropdown-link"> 上传专利文件 </span>
+ <el-dropdown-menu class="children_item">
+ <el-dropdown-item command="3">专利号导入</el-dropdown-item>
+ <el-dropdown-item command="2">Excel导入</el-dropdown-item>
+ </el-dropdown-item>
+ <el-dropdown-item command="5">上传非专利文件</el-dropdown-item>
+ <el-dropdown-item command="1" v-if="examine">上传无效请求书</el-dropdown-item>
+ <!-- <el-button type="primary" size="small" v-if="examine" @click="andClick(1)">上传无效请求书</el-button>
<el-button type="primary" size="small" @click="andClick()">上传专利文件</el-button>
- <el-button type="primary" size="small" @click="andClick(5)">上传非专利文件</el-button>
- <el-button type="primary" size="small" v-if="examine" @click="isExamine">报告审核</el-button>
+ <el-button type="primary" size="small" @click="andClick(5)">上传非专利文件</el-button> -->
+ <el-button class="margin-left_10" type="primary" size="small" v-if="examine" @click="isExamine">报告审核</el-button>
<el-table :data="tableData" border style="width: 100%" v-if="show">
@@ -23,10 +44,8 @@
ref="tree"
:data="tableAll"
:props="{label:'sortStr',value:'id'}"
- @node-drop="handleDrop"
:allow-drop="allowDrop"
draggable
- @check-change="handleCheckChange"
style="height: 300px;overflow: auto;">
<span class="custom-tree-node" slot-scope="{ node, data }"><el-radio v-model="val" @input="changeRadio(scope.row,data)" :label="data.id">{{ data.sortStr }}</el-radio></span>
</el-tree>
@@ -80,24 +99,27 @@
- <el-dialog title="上传专利文件" :visible.sync="showFile" width="1200px" @close="handleFile" append-to-body :close-on-click-modal="false">
- <importPatent :reportId="this.queryParams.reportId || this.reportId"></importPatent>
- <span slot="footer" class="dialog-footer">
+ <el-dialog :title="title" :visible.sync="showFile" width="1200px" @close="handleFile" append-to-body :close-on-click-modal="false">
+ <!-- <importPatent :reportId="this.queryParams.reportId"></importPatent> -->
+ <component :is='isComponent' :reportId="this.queryParams.reportId"></component>
+ <!-- <span slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitFile" >确 定</el-button>
import responseDialog from "./responseDialog.vue"
-import importPatent from "../import/components/importPatent.vue"
+import ExcelImport from "@/views/components/import/excelImport/importPatent.vue"
+import PatentNoImport from "@/views/components/import/PatentNoImport/download.vue"
props:['reportId','signPatentNo','examine'],
responseDialog,
- importPatent,
+ ExcelImport,
+ PatentNoImport
const isTime = (rule, value, callback) => {
@@ -130,6 +152,8 @@ export default {
showTask: false,
showFile: false,
+ isComponent:'',
task: {},
TaskRules:{
taskName:[{ required: true, message: '请输入任务名称', trigger: 'blur' },],
@@ -139,78 +163,43 @@ export default {
personnelList: [],//全部人员
val: null,
show: true,
- reportForm:{}
- reportID() {
- return this.$route.query.reportId
- showFile(val) {
- this.getListTable()
this.getList()
this.getListTable()
- console.log(this.reportId,this.queryParams.reportId);
+ //创建报告时打开
+ if(this.examine){
+ this.getAllPersonnelList()
check(val) {
- console.log('11', val);
+ // var router = this.$router.resolve({
+ // path: '/ContrastIndex/' + val.id,
- console.log(params);
params.reportType=7
params.aid=val.id
params.signPatentNo=this.signPatentNo || val.proofConditions
- params.reportId=this.reportId ||this.queryParams.reportId
+ params.reportId=this.queryParams.reportId
this.$s.setSession('params', params)
window.open(router.href, '_blank');
- handleCheckChange(val1,val2,val3){
- // var getCheck = this.$refs.tree.getCheckedNodes()
- // //console.log(getCheck)
- //console.log(val1,val2,val3)
- // if(val2){
- // if(this.checked.length>1){
- // this.$alert('只能对2条特征进行交换','提示',{
- // confirmButtonText: '确定',
- // type:'warning',
- // callback: action => {
- // return false
- // this.checked.push(val1)
- // var a = this.checked.findIndex(item=>{
- // return item.id == val1.id
- // if(a!=-1){
- // this.checked.splice(a,1)
- //console.log(this.checked)
+ //获取当前文献id
getVal(val){
this.val = val.id
- handleDrop(before, after, inner, ev) { },
+ //上下拖动
allowDrop(draggingNode, dropNode, type){
if(draggingNode.level == dropNode.level){
return type === 'next' || type === 'prev'
@@ -218,8 +207,8 @@ export default {
return type === 'prev'
+ //交换文献
changeRadio(val1, node) {
- console.log(val1,node,this.tableAll)
var index1 = this.tableAll.findIndex(item=>{//获取当前专利位置
return item.id == val1.id
@@ -227,13 +216,12 @@ export default {
return item.id == node.id
this.tableAll[index1] = this.tableAll.splice(index2,1,this.tableAll[index1])[0]
- // this.recordData[index1] = this.recordData.splice(index2,1,this.recordData[index1])[0]
this.addOrder()
+ //证据文献排序
addOrder() {
var params ={
- "report": this.reportId || this.queryParams.reportId,
+ "report": this.queryParams.reportId,
"orders": this.tableAll.map((item,index) => {
id: item.id,
@@ -245,6 +233,7 @@ export default {
+ this.getListTable()
this.show = true
@@ -254,16 +243,9 @@ export default {
- open(val,id) {
- console.log(val.id);
- this.getAllPersonnelList()
- this.queryParams.reportId = id
- this.reportForm=val
- // 报告审核按钮
+ // 报告审核按钮,打开审核弹窗
isExamine() {
this.showTask=true
// 审核确认
submitTask() {
@@ -271,42 +253,40 @@ export default {
let formData = new FormData()
let a = this.task
- a.report=this.reportForm,
- a.reportId = this.queryParams.reportId || this.reportId
+ a.reportId = this.queryParams.reportId
a.personIds = [this.task.personnelId]
a.type = 0
formData.append('taskVO',JSON.stringify(a))
this.$api.AddTask(formData).then(response=>{
this.$message.success('报告创建成功并发送审核')
- // this.$emit('getList', true)
this.handleCloseTask()
+ this.$emit('show',false)
this.$message.error('报告创建失败')
- // this.handleCloseTask()
- // 审核取消
+ // 审核取消,关闭审核弹窗
handleCloseTask() {
this.$refs.TaskForm.resetFields()
this.task = {}
this.showTask = false
- this.$emit('show',false)
//获取全部人员
getAllPersonnelList(){
this.$api.getTenantPersonnel().then(response=>{
- // console.log(response)
this.personnelList = response.data
- // 子组件上传成功弹窗关闭
+ // 上传证据文献成功弹窗关闭
handleFinish(val) {
this.getList();
+ //分页查询证据文献
getList() {
this.$api.queryProof(this.queryParams).then((res) => {
@@ -319,12 +299,12 @@ export default {
getListTable() {
- // this.queryParams.size=999
var params = {
size: 999,
current: 1,
- reportId:this.reportId ||this.queryParams.reportId
+ reportId:this.queryParams.reportId
@@ -334,36 +314,33 @@ export default {
+ //打开上传文件弹窗
andClick(val) {
- this.form.reportId=this.reportId?this.reportId:this.reportID
- this.form.processType=val
- this.$refs.responseDialog.open(this.form)
- // 上传专利文件
- // this.toImport()
- this.showFile=true
+ switch(val){
+ case '1':
+ case '5':
+ this.form.reportId=this.queryParams.reportId
+ this.form.processType=val
+ this.$refs.responseDialog.open(this.form)
+ this.title='Excel导入'
+ this.isComponent = 'ExcelImport'
+ this.showFile=true
+ this.title='专利号导入'
+ this.isComponent = 'PatentNoImport'
// 上传文件弹窗关闭
handleFile() {
- this.showFile=false
- // 上传文件弹窗确认按钮
- submitFile() {
- this.handleFile()
+ this.showFile=false
- // toImport() {
- // let router=this.$router.push({
- // path: '/importPatent',
- // // patentNo:this.signPatentNo,
- // id: this.reportId?this.reportId:this.reportID,
- // window.open(router.href,'_blank')
// 分页
handleCurrentChange(val) {
this.queryParams.current = val;
@@ -27,6 +27,7 @@ export default {
@@ -2,6 +2,7 @@
<!-- 无效流程 -->
<div style="display: flex;justify-content: end;margin-bottom: 10px;">
+ <el-button type="primary" size="small" @click="addOption">添加陈述意见</el-button>
<el-dropdown @command="handleCommand">
<el-button type="primary" size="small">
添加无效请求书<i class="el-icon-arrow-down el-icon--right"></i>
@@ -15,7 +16,7 @@
</el-dropdown-menu>
</el-dropdown>
- <div :style="{height:tableHeight+'px'}">
<el-timeline>
<el-timeline-item v-for="item in timelineList" :timestamp="item.date" placement="top">
<el-card>
@@ -52,7 +53,7 @@ import Menu from '@/views/components/common/menu/index.vue'
import responseDialog from './responseDialog.vue'
- props:['reportId'],
+ props:['reportId','signPatentNo'],
Menu,
@@ -72,21 +73,49 @@ export default {
'4': '发起诉讼时间',
deleFile: false,
- tableHeight:0,
+ // tableHeight:0,
watch: {},
- this.getLise()
+ // this.getHeight()
- getHeight() {
+ //添加陈述意见
+ addOption(){
+ var queryParams = {
+ signPatentNo:this.signPatentNo,
+ size: 1,
+ this.$api.queryProof(queryParams).then((res) => {
+ // this.tableData=res.data[0].id
+ var router = this.$router.resolve({
+ path: '/fileDetails/' +res.data[0].id,
+ let params = this.$s.getSession('params')
+ params.type=7
+ params.reportType=7
+ params.aid=res.data[0].id
+ params.signPatentNo=this.signPatentNo
+ params.reportId=this.reportId
+ this.$s.setSession('params', params)
- getLise() {
+ // getHeight() {
+ // let a = document.body.clientHeight
+ // this.tableHeight=a
this.queryParams.reportId = this.reportId
// 1正序
this.queryParams.orderBy = 1
@@ -99,7 +128,7 @@ export default {
handleFinish() {
// 删除文件
delFile(item) {
@@ -127,7 +156,7 @@ export default {
this.$api.deleteInvalidProcess(a).then((res) => {
this.$message.success('删除成功')
@@ -1,159 +0,0 @@
- <!-- 添加无效理由和证据 -->
- <div style="margin-bottom: 10px;float: right;">
- <el-button type="primary" size="small" @click="andClick(0)">添加无效证据</el-button>
- <el-button type="primary" size="small" @click="andClick(1)">显示栏位管理</el-button>
- <el-table :data="tableData" border style="width: 100%">
- <el-table-column prop="sortStr" align="center" label="序号" min-width="180"> </el-table-column>
- <el-table-column prop="proofType" align="center" label="无效理由" min-width="180"> </el-table-column>
- <el-table-column prop="proofName" align="center" label="涉及内容" min-width="180"> </el-table-column>
- <el-table-column prop="proofType" align="center" label="相关证据" min-width="180"> </el-table-column>
- <el-table-column prop="proofType" align="center" label="陈述意见" min-width="180"> </el-table-column>
- <el-dialog title="添加无效证据和理由" :visible.sync="showDialog" width="500px" :close-on-click-modal="false" @close="handleClose" >
- <el-form :model="form" :rules="rules" ref="form" label-width="120px" label-position="left">
- <el-form-item label="无效理由:">
- <el-select style="width: 100%;" v-model="form.invalidity" placeholder="请选择无效理由" filterable :popper-append-to-body="false">
- <el-option v-for="item in invalidityList" :key="item.value" :label="item.lable" :value="item.value"></el-option>
- <el-form-item label="涉及内容:">
- <p v-if="form.invalidity==1">说明书</p>
- <!-- 是说明书显示说明书,是权利要求选择涉及内容 -->
- <el-select v-if="form.invalidity==0" style="width: 100%;" v-model="form.content" placeholder="请选择涉及内容" filterable :popper-append-to-body="false">
- <el-option v-for="item in invalidityList" :key="item.id" :label="item.invalidity" :value="item.id"></el-option>
- <!-- 只有权利要求才出现 -->
- <el-form-item v-if="form.invalidity==0" label="选择特证:">
- <p>{{ }}</p>
- <el-form-item label="相关证据:">
- <el-input v-if="form.invalidity!=2" v-model="form.evidence" autocomplete="off" placeholder="请输入相关证据"></el-input>
- <!-- 不具备创造型时相关证据需要自己添加 -->
- <el-button v-else type="text" @click="addEvidence">添加</el-button>
- <div v-show="showAddTable">
- <el-table :data="addTableData" style="width: 100%">
- <el-table-column slot-scope="scope" prop="date" label="序号" width="180" >
- <el-checkbox v-for="source in sourceData[item.id]" :label="source.value">
- <span>{{(scope.$index + 1) + ((queryParams.current - 1) * queryParams.size)}}</span>
- <el-table-column prop="zhnegju" label="证据" width="180"> </el-table-column>
- <el-table-column prop="miaoshu" label="描述" width="180">
- <el-button type="text">详情</el-button>
- <el-input type='textarea' v-model="form.miaoshu" autocomplete="off"></el-input>
- <span>总描述: <el-input type='textarea' v-model="form.miaoshu" autocomplete="off"></el-input></span>
- <span>总陈述意见: <el-input type='textarea' v-model="form.chenshu" autocomplete="off"></el-input></span>
- <el-button type="primary" size="small" @click="addTableSure">确认</el-button>
- <el-button type="primary" size="small" @click="addTableClose">取消</el-button>
- <el-form-item label="陈述意见:">
- <el-input type='textarea' v-model="form.opinions" autocomplete="off" placeholder="请输入陈述意见"></el-input>
- <el-input type='textarea' v-model="form.reviewCommittee" autocomplete="off" placeholder="请输入复审委意见"></el-input>
- <el-form-item label="法院意见:">
- <el-input type='textarea' v-model="form.court" autocomplete="off" placeholder="请输入法院意见"></el-input>
- <el-button @click="handleClose">取 消</el-button>
- <el-button type="primary" @click="finish" >确 定</el-button>
- showDialog: false,
- form: {},
- rules: {},
- invalidityList: [
- lable: '权利要求不清楚',
- value:0,
- lable: '说明书公开不充分',
- value:1,
- lable: '不具备创造性',
- value:2,
- lable: '不具备新颖性',
- value:3,
- ],//无效理由List
- addTableData: [],//相关证据table数据
- showAddTable:false,//控制相关证据table显示
- computed: {},
- watch: {},
- // 添加相关证据table
- addEvidence() {
- // 添加相关证据table确认按钮
- addTableSure() { },
- // 添加相关证据table取消按钮
- addTableClose(){},
- // 添加无效证据和显示栏位管理按钮
- andClick(val) {
- switch (val) {
- case 0:
- break;
- case 1:
- default:
- // 添加无效证据弹窗确认按钮
- finish() {
- // this.$api.addProofByFile(this.form).then(response => {
- // if (response.code==200) {
- // this.handleClose()
- // 关闭弹窗
- handleClose() {
- this.form={}
- this.showDialog=false
@@ -1,294 +0,0 @@
- <div class="header-tabs">
- </el-tabs>
- <el-table :data="taskData" border header-row-class-name="custom-table-header" v-loading="loadingCancel" element-loading-text = "请耐心等待,数据正在加载中...">
- <el-table-column label="任务数量" prop="total" align="center" show-overflow-tooltip>
- <span>{{ scope.row.total?scope.row.total:scope.row.allNum }}</span>
- <el-table-column label="当前下标" prop="index" align="center" show-overflow-tooltip>
- <span>{{ scope.row.index?scope.row.index:scope.row.successNum }}</span>
- <el-progress :text-inside="true" :stroke-width="20" :percentage="scope.row.percentage?scope.row.percentage:scope.row.taskProcess" :color="customColors"></el-progress>
- <el-table-column label="当前状态" align="center" v-if="form == 8" min-width="100px" show-overflow-tooltip>
- <span>{{ statusObj[scope.row.taskDetailState] }}</span>
- <!-- <span v-if="scope.row.taskDetailState!=5">{{ scope.row.taskType?'进行中':'等待中' }}</span>
- <span v-else>已取消</span> -->
- <el-table v-loading="loading" :data="tableData" border header-row-class-name="custom-table-header" @sort-change="sortChange">
- <el-table-column label="文件名称" prop="oldName" align="center" show-overflow-tooltip></el-table-column>
- <span >{{ $d(scope.row.startTime) }}</span>
- <span>{{ $d(scope.row.endTime) }}</span>
- <span >{{ statusObj[scope.row.status] }}</span>
- <el-table-column prop="createName" label="创建人" align="center" width="120" show-overflow-tooltip></el-table-column>
- loadingCancel:false,
- webSocket1:null,
- // ...mapGetters(['webSocket', 'userinfo'])
- userinfo() {
- return this.$store.state.admin.userinfo
- 'userinfo.id'() {
- this.connectWebSocket(this.userinfo.id)
- console.log(this.reportId);
- // this.initTask()
- if (this.userinfo.id) {
- connectWebSocket(userId) {
- this.webSocket1 = new WebSocket(`ws://${this.$c.hostname}:8877/api/v2/ws/` + userId)
- // this.webSocket1 = new WebSocket(`ws://192.168.1.24:8877/api/v2/ws/` + userId)
- // Store.commit('SET_WEB_SOCKET', webSocket)
- this.webSocket1.onopen = () => {
- console.log('WebSocket连接成功')
- return true
- // webSocket.onmessage = async (e) => {
- this.webSocket1.onerror = () => {
- console.log('WebSocket连接失败')
- this.webSocket1.onclose = () => {
- console.log('WebSocket连接关闭')
- if(this.webSocket1){
- this.webSocket1.onmessage = (e) => {
- this.$api.getQueueList(this.queryParams).then(response => {
- console.log(response);
- response.data.map(item => {
- this.$api.getTaskList(this.queryParams).then(response => {
- this.$api.deleteTask({ id: row.id }).then(response => {
- // 排序
- sortChange() { },
-.system-task {
- // height: 100%;
- height: 500px;
- .header-tabs {
- padding-right: 9px;
- .el-tabs__header {
- margin-bottom: 0 !important;
@@ -1,7 +1,7 @@
<el-container>
- <el-aside width="210px" style="overflow:hidden" class="patent-articles-menu">
+ <el-aside width="210px" style="overflow:hidden" class="patent-articles-menu" :style="{height:height}">
<el-menu class="theme-dark" :default-active="activeMenu" @select="handleSelect">
<el-menu-item v-for="item in menuList" :index="item.path" v-if="!item.show">
<i class="el-icon-film"></i>
@@ -10,8 +10,8 @@
</el-menu>
</el-aside>
- <el-main class="admin-main-box">
- <component :is="activeMenu" :reportId="reportId" :signPatentNo="signPatentNo" :reportType="reportType"></component>
+ <el-main class="admin-main-box" :style="{height:height}">
+ <component :is="activeMenu" :reportId="reportId" :signPatentNo="signPatentNo" :reportType="reportType" :patent="{publicNo:signPatentNo}"></component>
@@ -27,6 +27,7 @@ import OpinionPlan from "./components/opinionPlan.vue"
import FlowPath from "./components/flowPath.vue"
import RemarryMatter from '@/views/report/components/matter/remarryMatter.vue';
import TaskDetails from '@/views/report/reportDetails/components/taskDetails.vue';
+import Invalid from '@/views/components/articles/components/history/invalid.vue'
BasicInformation,
@@ -37,22 +38,25 @@ export default {
FlowPath,
RemarryMatter,
TaskDetails,
+ Invalid
activeMenu:'BasicInformation',
menuList: [
{title: '基本信息', path:"BasicInformation"},
+ {title: '标的专利无效历史', path:"Invalid"},
+ // {title: '无效应对流程', path:"FlowPath"},
{title: '无效理由和证据', path:"InvalidIndex"},
{title: '证据文献', path:"EvidenceAndRequest"},
- {title: '生成陈述意见方案', path:"ChoseOpinion"},
- {title: '导出陈述意见方案', path:"OpinionPlan"},
- {title: '无效应对流程', path:"FlowPath"},
+ // {title: '生成陈述意见方案', path:"ChoseOpinion"},
+ // {title: '导出陈述意见方案', path:"OpinionPlan"},
{title: '后续跟进事项', path:"RemarryMatter",show:(this.row && this.row.status==3 && this.$permission('/rms/matter'))?true:false},
// {title: '后续跟进事项', path:"RemarryMatter",},
{title: '任务清单', path:"TaskDetails"},
@@ -70,10 +74,36 @@ export default {
+ created(){
+ this.setData()
- console.log(this.row);
+ this.height = document.getElementsByClassName('el-main')[0].clientHeight - 20 + 'px'
+ setData(){
+ this.menuList =[
+ {title: '基本信息', path:"BasicInformation"},
+ {title: '无效理由和证据', path:"InvalidIndex"},
+ {title: '证据文献', path:"EvidenceAndRequest"},
+ {title: '后续跟进事项', path:"RemarryMatter",show:(this.row && this.row.status==3 && this.$permission('/rms/matter'))?true:false},
+ // {title: '后续跟进事项', path:"RemarryMatter",},
+ {title: '任务清单', path:"TaskDetails"},
+ document.title = `${this.row.name} ${'报告详情'}`
handleSelect(index, path) {
this.activeMenu = index
@@ -106,8 +106,6 @@
<el-form-item :label="(!form.id &&form.status==3)?'上传报告文档':'上传附件'">
<div v-if="form.reportFiles" class="upload-file">
<div v-for="item in form.reportFiles" style="margin:0;display:flex;justify-content:space-around;">
- <!-- <p style="margin:0;width:calc(100% - 40px);overflow: hidden;white-space: nowrap;text-overflow:ellipsis" @click="showFile1(item.url)">{{item.name?item.name:item.fileName}}</p>
- <p style="margin:0;" @click="delFile(item.id)"><i class="el-icon-close"></i></p> -->
<p style="margin:0;width:calc(100% - 40px);overflow: hidden;white-space: nowrap;text-overflow:ellipsis;cursor: pointer">{{item.name?item.name+'.'+item.suffix:item.fileName}}</p>
<Menu :data="item" @delFile="delFile"></Menu>
@@ -151,21 +149,15 @@
<el-button type="primary" @click="submitTask" >确 定</el-button>
- <!-- <el-dialog title="选择审核人" :visible.sync="showPerson" width="1000px" @close="handleClose2">
- <Personnel-List @checked="getPerson"></Personnel-List>
- </el-dialog> -->
<el-dialog :visible.sync="showFile">
<div width="1200px">
- <!-- <img width="100%" :src="imageUrl" alt=""> -->
<iframe :src="imageUrl" frameborder="0" width="900px" height="500px"></iframe>
- <!-- <div v-html="imageUrl"></div> -->
<el-dialog :visible.sync="showEvidenceAndRequest" width="1000px" :close-on-click-modal="false">
- <evidenceAndRequest ref="evidence" :examine="true" @show="showEvidenceAndRequest = false"></evidenceAndRequest>
+ <evidenceAndRequest ref="evidence" :examine="true" :reportId="reportId" @show="showEvidenceAndRequest = false"></evidenceAndRequest>
@@ -328,6 +320,7 @@ export default {
newReportId: null,
formCopy: {},
showEvidenceAndRequest:false,
+ reportId:null,
@@ -345,7 +338,6 @@ export default {
this.getAllClientList()
this.getAllDepartmentList()
this.getDictsFromPAS()
- console.log(this.$refs.evidence);
//隐藏popover
@@ -356,7 +348,7 @@ export default {
showPopover(){
this.matterSign = false
- //切换状态
+ //切换是否完成状态
changeStatus(val){
if(val == 3){
this.rules.personId[0].required = false
@@ -372,6 +364,7 @@ export default {
this.matterType = null
+ //关闭审核弹窗
handleCloseTask(){
@@ -379,6 +372,7 @@ export default {
this.isEndTime=true
+ //提交审核任务
this.isEndTime=false
this.$refs.TaskForm.validate((valid) => {
@@ -416,6 +410,7 @@ export default {
+ //删除已上传的附件
delFile(id){
var index = this.form.reportFiles.findIndex(item=>{
return item.id == id
@@ -424,6 +419,7 @@ export default {
this.form.reportFiles.splice(index,1)
+ //切换上传附件
onChange(file, fileList) {
if(this.form.reportFiles){
var index3 = this.form.reportFiles.findIndex(item=>{
@@ -459,6 +455,7 @@ export default {
+ //整理重复上传的文件
inFile(file, fileList){
var index = this.file.findIndex(item=>{
return item.name == file.raw.name
@@ -473,6 +470,7 @@ export default {
this.file.push(file.raw)
+ //上传专利文件
onChange1(file, fileList){
formData.append('file', file.raw)
@@ -486,47 +484,24 @@ export default {
+ //websocket 后端发送信息
initTask() {
if(this.webSocket){
this.webSocket.onmessage = (e) => {
// console.log(e)
const { code, data, message } = JSON.parse(e.data)
if (code === 903 || code === 904) {
this.loading = false
this.$message.success('专利导入成功')
this.$refs['reportForm'].validateField('signPatentNo');
- // const index = this.taskData.map(item => item.taskId).indexOf(data.taskId)
- // console.log(index,this.taskData)
- // if (index === -1) {
- // // this.taskData.push(data)
- // this.$set(this.taskData, index, data)
- // if (data.complete) {
- // if(this.form==1){
- // this.$message.success(`导入任务完成`)
- // for(var i = 0;i<this.taskData.length;i++){
- // if(this.taskData[i].complete==true){
- // this.taskData.splice(i,1)
- // this.$message.success(`导出任务完成`)
- // // console.log(this.form)
- // this.getList()
} else if (code === 803 || code === 804) {
this.$message.error('专利导入失败')
isExist(rule, value, callback)
+ //删除未提交的附件
handleRemove(file, fileList) {
return item.uid == file.raw.uid
@@ -534,8 +509,8 @@ export default {
if(index!=-1){
this.file.splice(index,1)
- // console.log(this.file, fileList);
+ //上传附件时查看附件内容
handlePreview(file) {
var item={
name:file.name,
@@ -546,15 +521,11 @@ export default {
var type = file.raw.type.substring(index+1,file.raw.type.length)
var arr = ['png','jpeg','bmp','jpg']
if(arr.includes(type)){
- // this.FileVisible = true
var FileUrl = URL.createObjectURL(file.raw)
var isPicture = 1
- // this.srcList = [URL.createObjectURL(file.raw)]
}else if(type == 'pdf'){
var isPicture = 0
- // this.srcList = []
}else{
@@ -568,30 +539,6 @@ export default {
- showFile1(url){
- // this.showFile = true
- // this.imageUrl = this.$p + url
- // var b = this.$p + url
- // var a = window.URL.createObjectURL(b)
- // this.imageUrl ='https://view.xdocin.com/view?src=' +encodeURIComponent( b)
- // window.open(this.imageUrl,'_blank')
- // console.log(a)
- // this.$api.seeFile({url:url}).then(response=>{
- //获取审核人
- // getPerson(val){
- // if(val){
- // this.person = val
- // console.log(val)
- // this.handleClose2()
- // //提交审核
- // submitPerson(){},
//导入
imports(){},
//获取选择的部门ID
@@ -601,7 +548,6 @@ export default {
@@ -650,13 +596,6 @@ export default {
- // var index = this.copyList.findIndex(item=>{
- // return item.dictChildLabel == '标引信息'
- // if(index!=-1){
- // this.copyIndex = this.copyList[index]
- // this.copyList.splice(index,1)
//接收创建报告类型
open(row, dictMessage) {
@@ -720,8 +659,6 @@ export default {
var a = this.dictMessage.REPORT_TYPE.filter(item=>{return item.dictChildValue == this.form.type})[0].dictChildLabel
this.$set(this.form,'name',this.form.signPatentNo + a)
- // this.form.name = this.form.signPatentNo + a
//获取后续事项
getMatter(val){
@@ -805,34 +742,7 @@ export default {
// });
}).catch(action => {
if(action == 'cancel'){
- let formData = new FormData()
- if(this.file){
- for (var i = 0; i < this.file.length; i++) {
- formData.append("files", this.file[i]);
- // for(let key in this.form){
- // formData.append(key, this.form[key])
- this.form.status = 1
- formData.append('report',JSON.stringify(this.form))
- // formData.append('status', 1)
- this.$api.AddReport(formData).then(response=>{
- if(response.code == 200){
- this.file = []
- // this.$refs.upload.clearFiles()
- this.$message.success('报告创建成功')
- this.$emit('getList', true)
- // if (this.form.type == 7) {
- // this.formCopy=JSON.parse(JSON.stringify(this.form))
- // this.getQueryReport()
- // setTimeout(() => {
- // this.toInvalidResponset()
- // },1000)
- this.handleClose()
+ this.submitReport()
@@ -876,69 +786,57 @@ export default {
});
+ //请求创建报告接口
+ submitReport(){
+ let formData = new FormData()
+ if(this.file){
+ for (var i = 0; i < this.file.length; i++) {
+ formData.append("files", this.file[i]);
+ this.form.status = 1
+ formData.append('report',JSON.stringify(this.form))
+ this.$api.AddReport(formData).then(response=>{
+ this.file = []
+ if(this.form.type!=7){
+ this.$message.success('报告创建成功')
+ this.$emit('getList', true)
+ this.handleClose(response.data)
// 无效应对报告下一步
ifNext() {
this.$refs.reportForm.validate((valid) => {
- if (this.file) {
- formData.append('report', JSON.stringify(this.form))
- this.$api.AddReport(formData).then(response => {
- if (response.code == 200) {
- this.formCopy = JSON.parse(JSON.stringify(this.form))
- // this.$message.success('报告创建成功')
- this.openDialog(response.data)
+ this.$alert('校验未通过,请按照要求创建报告', '提示', {
+ type:'warning',
+ callback: action => {
// this.ifDialog()
- async openDialog(id) {
- await this.getQueryReport()
- this.showEvidenceAndRequest = true
- // this.$refs.evidence.open(id)
- this.$s.setSession('params', this.newReportId)
- this.$refs.evidence.open(this.newReportId,id)
- async getQueryReport() {
- current:1,
- size:10
- await this.$api.QueryReport(a).then(response=>{
- this.newReportId=response.data[0]
- }).catch(error=>{
- // toInvalidResponset() {
- // this.$router.push({
- // path: '/evidenceAndRequest',
- // patentNo: this.form.patentNo,
- // reportId: this.newReportId.id,
// 弹出框关闭
+ handleClose(val) {
this.getPermissions()
+ if(this.form.type == 7 && val){
+ this.showEvidenceAndRequest = true
+ this.$s.setSession('params', {})
+ this.reportId=val
this.copyIndex = {}
if (this.$refs.uploads) {
@@ -951,13 +849,11 @@ export default {
this.show = 0
this.form = {}
+ //获取报告由权限的人员
async getPermissions(){
const response = await this.$api.getPermission()
this.$store.commit('SET_PERMISSIONS', response.data)
- handleClose2(){
- this.showPerson = false
@@ -187,7 +187,6 @@ export default {
dictMessage() {
var a = this.$store.state.dictMessage.dictMessage
- console.log(111,this.$store.state.dictMessage.dictMessage);
if(a.REPORT_TYPE){
a.REPORT_TYPE.forEach(item=>{
if(['0','1','2'].includes(item.dictChildValue)){
@@ -1,5 +1,5 @@
+ <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="120px">
@@ -61,7 +61,8 @@
<span>{{form.remark}}</span>
+ <FlowPath v-if="reportType == 7" :reportId="reportId" :signPatentNo="form.signPatentNo"></FlowPath>
<el-dialog title="查看文件" :visible.sync="FileVisible" width="1200px">
<el-image v-if="srcList.length>0" :src="FileUrl" ref="image" :preview-src-list="srcList"></el-image>
<iframe v-else :src="FileUrl" frameborder="0" width="1150px" :height="height"></iframe>
@@ -72,13 +73,15 @@
import Menu from '@/views/components/common/menu/index.vue'
+import FlowPath from "@/views/report/InvalidResponse/components/flowPath.vue"
import { downLoad2 } from "@/utils";
mixins:[PatentDetails],
components:{
- Menu
+ Menu,
+ FlowPath
- props:['reportId','noEdit'],
+ props:['reportId','noEdit','reportType'],
FileVisible:false,